File: FrameworkFork\Microsoft.Xml\Xml\Serialization\Advanced\SchemaImporterExtension.cs
Web Access
Project: src\src\dotnet-svcutil\lib\src\dotnet-svcutil-lib.csproj (dotnet-svcutil-lib)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
 
namespace Microsoft.Xml.Serialization.Advanced
{
    using System;
    using Microsoft.Xml.Schema;
    using Microsoft.Xml;
    using System.Collections;
    using System.Collections.Specialized;
    using Microsoft.CodeDom;
    using Microsoft.CodeDom.Compiler;
    using Microsoft.Xml.Serialization;
    using System.Reflection;
 
    /// <include file='doc\SchemaImporterExtension.uex' path='docs/doc[@for="SchemaImporterExtension"]/*' />
    ///<internalonly/>
    /// <devdoc>
    ///    <para>[To be supplied.]</para>
    /// </devdoc>
    public abstract class SchemaImporterExtension
    {
        /// <include file='doc\SchemaImporterExtension.uex' path='docs/doc[@for="SchemaImporterExtension.ImportSchemaType"]/*' />
        public virtual string ImportSchemaType(string name, string ns, XmlSchemaObject context, XmlSchemas schemas, XmlSchemaImporter importer,
            CodeCompileUnit compileUnit, CodeNamespace mainNamespace, CodeGenerationOptions options, CodeDomProvider codeProvider)
        {
            return null;
        }
 
        /// <include file='doc\SchemaImporterExtension.uex' path='docs/doc[@for="SchemaImporterExtension.ImportSchemaType1"]/*' />
        public virtual string ImportSchemaType(XmlSchemaType type, XmlSchemaObject context, XmlSchemas schemas, XmlSchemaImporter importer,
            CodeCompileUnit compileUnit, CodeNamespace mainNamespace, CodeGenerationOptions options, CodeDomProvider codeProvider)
        {
            return null;
        }
 
        /// <include file='doc\SchemaImporterExtension.uex' path='docs/doc[@for="SchemaImporterExtension.ImportSchemaType1"]/*' />
        public virtual string ImportAnyElement(XmlSchemaAny any, bool mixed, XmlSchemas schemas, XmlSchemaImporter importer,
            CodeCompileUnit compileUnit, CodeNamespace mainNamespace, CodeGenerationOptions options, CodeDomProvider codeProvider)
        {
            return null;
        }
 
        /// <include file='doc\SchemaImporterExtension.uex' path='docs/doc[@for="SchemaImporterExtension.ImportDefaultValue"]/*' />
        public virtual CodeExpression ImportDefaultValue(string value, string type)
        {
            return null;
        }
    }
 
    public class SchemaImporterExtensionCollection : CollectionBase
    {
        private Hashtable _exNames;
 
        internal Hashtable Names
        {
            get
            {
                if (_exNames == null)
                    _exNames = new Hashtable();
                return _exNames;
            }
        }
 
        public int Add(SchemaImporterExtension extension)
        {
            return Add(extension.GetType().FullName, extension);
        }
 
        public int Add(string name, Type type)
        {
            if (type.GetTypeInfo().IsSubclassOf(typeof(SchemaImporterExtension)))
            {
                return Add(name, (SchemaImporterExtension)Activator.CreateInstance(type));
            }
            else
            {
                throw new ArgumentException(string.Format(ResXml.XmlInvalidSchemaExtension, type));
            }
        }
 
        public void Remove(string name)
        {
            if (Names[name] != null)
            {
                List.Remove(Names[name]);
                Names[name] = null;
            }
        }
 
        public new void Clear()
        {
            Names.Clear();
            List.Clear();
        }
 
        internal SchemaImporterExtensionCollection Clone()
        {
            SchemaImporterExtensionCollection clone = new SchemaImporterExtensionCollection();
            clone._exNames = (Hashtable)this.Names.Clone();
            foreach (object o in this.List)
            {
                clone.List.Add(o);
            }
            return clone;
        }
 
        public SchemaImporterExtension this[int index]
        {
            get { return (SchemaImporterExtension)List[index]; }
            set { List[index] = value; }
        }
 
        internal int Add(string name, SchemaImporterExtension extension)
        {
            if (Names[name] != null)
            {
                if (Names[name].GetType() != extension.GetType())
                {
                    throw new InvalidOperationException(string.Format(ResXml.XmlConfigurationDuplicateExtension, name));
                }
                return -1;
            }
            Names[name] = extension;
            return List.Add(extension);
        }
 
        public void Insert(int index, SchemaImporterExtension extension)
        {
            List.Insert(index, extension);
        }
 
        public int IndexOf(SchemaImporterExtension extension)
        {
            return List.IndexOf(extension);
        }
 
        public bool Contains(SchemaImporterExtension extension)
        {
            return List.Contains(extension);
        }
 
        public void Remove(SchemaImporterExtension extension)
        {
            List.Remove(extension);
        }
 
        public void CopyTo(SchemaImporterExtension[] array, int index)
        {
            List.CopyTo(array, index);
        }
    }
 
    internal class MappedTypeDesc
    {
        private string _name;
        private string _ns;
        private XmlSchemaType _xsdType;
        private XmlSchemaObject _context;
        private string _clrType;
        private SchemaImporterExtension _extension;
        private CodeNamespace _code;
        private bool _exported = false;
        private StringCollection _references;
 
        internal MappedTypeDesc(string clrType, string name, string ns, XmlSchemaType xsdType, XmlSchemaObject context, SchemaImporterExtension extension, CodeNamespace code, StringCollection references)
        {
            _clrType = clrType.Replace('+', '.');
            _name = name;
            _ns = ns;
            _xsdType = xsdType;
            _context = context;
            _code = code;
            _references = references;
            _extension = extension;
        }
 
        internal SchemaImporterExtension Extension { get { return _extension; } }
        internal string Name { get { return _clrType; } }
 
        internal StringCollection ReferencedAssemblies
        {
            get
            {
                if (_references == null)
                    _references = new StringCollection();
                return _references;
            }
        }
 
        internal CodeTypeDeclaration ExportTypeDefinition(CodeNamespace codeNamespace, CodeCompileUnit codeCompileUnit)
        {
            if (_exported)
                return null;
            _exported = true;
 
            foreach (CodeNamespaceImport import in _code.Imports)
            {
                codeNamespace.Imports.Add(import);
            }
            CodeTypeDeclaration codeClass = null;
            string comment = string.Format(ResXml.XmlExtensionComment, _extension.GetType().FullName);
            foreach (CodeTypeDeclaration type in _code.Types)
            {
                if (_clrType == type.Name)
                {
                    if (codeClass != null)
                        throw new InvalidOperationException(string.Format(ResXml.XmlExtensionDuplicateDefinition, _extension.GetType().FullName, _clrType));
                    codeClass = type;
                }
                type.Comments.Add(new CodeCommentStatement(comment, false));
                codeNamespace.Types.Add(type);
            }
            if (codeCompileUnit != null)
            {
                foreach (string reference in ReferencedAssemblies)
                {
                    if (codeCompileUnit.ReferencedAssemblies.Contains(reference))
                        continue;
                    codeCompileUnit.ReferencedAssemblies.Add(reference);
                }
            }
            return codeClass;
        }
    }
}