1 //------------------------------------------------------------------------------
2 // <copyright file="IXmlSerializable.cs" company="Microsoft">
3 // Copyright (c) Microsoft Corporation. All rights reserved.
5 // <owner current="true" primary="true">Microsoft</owner>
6 //------------------------------------------------------------------------------
8 namespace System.Xml.Serialization.Advanced {
10 using System.Xml.Schema;
12 using System.Collections;
13 using System.Collections.Specialized;
15 using System.CodeDom.Compiler;
16 using System.Xml.Serialization;
18 /// <include file='doc\SchemaImporterExtension.uex' path='docs/doc[@for="SchemaImporterExtension"]/*' />
21 /// <para>[To be supplied.]</para>
23 public abstract class SchemaImporterExtension {
24 /// <include file='doc\SchemaImporterExtension.uex' path='docs/doc[@for="SchemaImporterExtension.ImportSchemaType"]/*' />
25 public virtual string ImportSchemaType(string name, string ns, XmlSchemaObject context, XmlSchemas schemas, XmlSchemaImporter importer,
26 CodeCompileUnit compileUnit, CodeNamespace mainNamespace, CodeGenerationOptions options, CodeDomProvider codeProvider) {
30 /// <include file='doc\SchemaImporterExtension.uex' path='docs/doc[@for="SchemaImporterExtension.ImportSchemaType1"]/*' />
31 public virtual string ImportSchemaType(XmlSchemaType type, XmlSchemaObject context, XmlSchemas schemas, XmlSchemaImporter importer,
32 CodeCompileUnit compileUnit, CodeNamespace mainNamespace, CodeGenerationOptions options, CodeDomProvider codeProvider) {
36 /// <include file='doc\SchemaImporterExtension.uex' path='docs/doc[@for="SchemaImporterExtension.ImportSchemaType1"]/*' />
37 public virtual string ImportAnyElement(XmlSchemaAny any, bool mixed, XmlSchemas schemas, XmlSchemaImporter importer,
38 CodeCompileUnit compileUnit, CodeNamespace mainNamespace, CodeGenerationOptions options, CodeDomProvider codeProvider) {
42 /// <include file='doc\SchemaImporterExtension.uex' path='docs/doc[@for="SchemaImporterExtension.ImportDefaultValue"]/*' />
43 public virtual CodeExpression ImportDefaultValue(string value, string type) {
48 public class SchemaImporterExtensionCollection : CollectionBase {
51 internal Hashtable Names {
54 exNames = new Hashtable();
59 public int Add(SchemaImporterExtension extension) {
60 return Add(extension.GetType().FullName, extension);
63 public int Add(string name, Type type) {
64 if (type.IsSubclassOf(typeof(SchemaImporterExtension))) {
65 return Add(name, (SchemaImporterExtension)Activator.CreateInstance(type));
68 throw new ArgumentException(Res.GetString(Res.XmlInvalidSchemaExtension, type));
72 public void Remove(string name) {
73 if (Names[name] != null) {
74 List.Remove(Names[name]);
79 public new void Clear() {
84 internal SchemaImporterExtensionCollection Clone() {
85 SchemaImporterExtensionCollection clone = new SchemaImporterExtensionCollection();
86 clone.exNames = (Hashtable)this.Names.Clone();
87 foreach (object o in this.List) {
93 public SchemaImporterExtension this[int index] {
94 get { return (SchemaImporterExtension)List[index]; }
95 set { List[index] = value; }
98 internal int Add(string name, SchemaImporterExtension extension) {
99 if (Names[name] != null) {
100 if (Names[name].GetType() != extension.GetType()) {
101 throw new InvalidOperationException(Res.GetString(Res.XmlConfigurationDuplicateExtension, name));
105 Names[name] = extension;
106 return List.Add(extension);
109 public void Insert(int index, SchemaImporterExtension extension) {
110 List.Insert(index, extension);
113 public int IndexOf(SchemaImporterExtension extension) {
114 return List.IndexOf(extension);
117 public bool Contains(SchemaImporterExtension extension) {
118 return List.Contains(extension);
121 public void Remove(SchemaImporterExtension extension) {
122 List.Remove(extension);
125 public void CopyTo(SchemaImporterExtension[] array, int index) {
126 List.CopyTo(array, index);
130 internal class MappedTypeDesc {
133 XmlSchemaType xsdType;
134 XmlSchemaObject context;
136 SchemaImporterExtension extension;
138 bool exported = false;
139 StringCollection references;
141 internal MappedTypeDesc(string clrType, string name, string ns, XmlSchemaType xsdType, XmlSchemaObject context, SchemaImporterExtension extension, CodeNamespace code, StringCollection references) {
142 this.clrType = clrType.Replace('+', '.');
145 this.xsdType = xsdType;
146 this.context = context;
148 this.references = references;
149 this.extension = extension;
152 internal SchemaImporterExtension Extension { get { return extension; } }
153 internal string Name { get { return clrType; } }
155 internal StringCollection ReferencedAssemblies {
157 if (references == null)
158 references = new StringCollection();
163 internal CodeTypeDeclaration ExportTypeDefinition(CodeNamespace codeNamespace, CodeCompileUnit codeCompileUnit) {
168 foreach(CodeNamespaceImport import in code.Imports) {
169 codeNamespace.Imports.Add(import);
171 CodeTypeDeclaration codeClass = null;
172 string comment = Res.GetString(Res.XmlExtensionComment, extension.GetType().FullName);
173 foreach(CodeTypeDeclaration type in code.Types) {
174 if (clrType == type.Name) {
175 if (codeClass != null)
176 throw new InvalidOperationException(Res.GetString(Res.XmlExtensionDuplicateDefinition, extension.GetType().FullName, clrType));
179 type.Comments.Add(new CodeCommentStatement(comment, false));
180 codeNamespace.Types.Add(type);
182 if (codeCompileUnit != null) {
183 foreach(string reference in ReferencedAssemblies) {
184 if (codeCompileUnit.ReferencedAssemblies.Contains(reference))
186 codeCompileUnit.ReferencedAssemblies.Add(reference);