Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / WCF / Serialization / System / Runtime / Serialization / SchemaImporter.cs / 1305376 / SchemaImporter.cs
//------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All rights reserved. //----------------------------------------------------------- namespace System.Runtime.Serialization { using System; using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Diagnostics; using System.Globalization; using System.IO; using System.Security; using System.Runtime.Diagnostics; using System.Xml; using System.Xml.Schema; using DataContractDictionary = System.Collections.Generic.Dictionary; using SchemaObjectDictionary = System.Collections.Generic.Dictionary ; using System.Runtime.Serialization.Diagnostics; class SchemaImporter { DataContractSet dataContractSet; XmlSchemaSet schemaSet; ICollection typeNames; ICollection elements; XmlQualifiedName[] elementTypeNames; bool importXmlDataType; SchemaObjectDictionary schemaObjects; List redefineList; bool needToImportKnownTypesForObject; [Fx.Tag.SecurityNote(Critical = "Static field used to store serialization schema elements from future versions." + " Static fields are marked SecurityCritical or readonly to prevent data from being modified or leaked to other components in appdomain.")] [SecurityCritical] static Hashtable serializationSchemaElements; internal SchemaImporter(XmlSchemaSet schemas, ICollection typeNames, ICollection elements, XmlQualifiedName[] elementTypeNames, DataContractSet dataContractSet, bool importXmlDataType) { this.dataContractSet = dataContractSet; this.schemaSet = schemas; this.typeNames = typeNames; this.elements = elements; this.elementTypeNames = elementTypeNames; this.importXmlDataType = importXmlDataType; } internal void Import() { if (!schemaSet.Contains(Globals.SerializationNamespace)) { StringReader reader = new StringReader(Globals.SerializationSchema); XmlSchema schema = XmlSchema.Read(reader, null); if (schema == null) throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.CouldNotReadSerializationSchema, Globals.SerializationNamespace))); schemaSet.Add(schema); } try { CompileSchemaSet(schemaSet); } #pragma warning suppress 56500 // covered by FxCOP catch (Exception ex) { if (Fx.IsFatal(ex)) { throw; } throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentException(SR.GetString(SR.CannotImportInvalidSchemas), ex)); } if (typeNames == null) { ICollection schemaList = schemaSet.Schemas(); foreach (object schemaObj in schemaList) { if (schemaObj == null) throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentException(SR.GetString(SR.CannotImportNullSchema))); XmlSchema schema = (XmlSchema)schemaObj; if (schema.TargetNamespace != Globals.SerializationNamespace && schema.TargetNamespace != Globals.SchemaNamespace) { foreach (XmlSchemaObject typeObj in schema.SchemaTypes.Values) { ImportType((XmlSchemaType)typeObj); } foreach (XmlSchemaElement element in schema.Elements.Values) { if (element.SchemaType != null) ImportAnonymousGlobalElement(element, element.QualifiedName, schema.TargetNamespace); } } } } else { foreach (XmlQualifiedName typeName in typeNames) { if (typeName == null) throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentException(SR.GetString(SR.CannotImportNullDataContractName))); ImportType(typeName); } if (elements != null) { int i = 0; foreach (XmlSchemaElement element in elements) { XmlQualifiedName typeName = element.SchemaTypeName; if (typeName != null && typeName.Name.Length > 0) { elementTypeNames[i++] = ImportType(typeName).StableName; } else { XmlSchema schema = SchemaHelper.GetSchemaWithGlobalElementDeclaration(element, schemaSet); if (schema == null) { elementTypeNames[i++] = ImportAnonymousElement(element, element.QualifiedName).StableName; } else { elementTypeNames[i++] = ImportAnonymousGlobalElement(element, element.QualifiedName, schema.TargetNamespace).StableName; } } } } } ImportKnownTypesForObject(); } internal static void CompileSchemaSet(XmlSchemaSet schemaSet) { if (schemaSet.Contains(XmlSchema.Namespace)) schemaSet.Compile(); else { // Add base XSD schema with top level element named "schema" XmlSchema xsdSchema = new XmlSchema(); xsdSchema.TargetNamespace = XmlSchema.Namespace; XmlSchemaElement element = new XmlSchemaElement(); element.Name = Globals.SchemaLocalName; element.SchemaType = new XmlSchemaComplexType(); xsdSchema.Items.Add(element); schemaSet.Add(xsdSchema); schemaSet.Compile(); } } SchemaObjectDictionary SchemaObjects { get { if (schemaObjects == null) schemaObjects = CreateSchemaObjects(); return schemaObjects; } } List RedefineList { get { if (redefineList == null) redefineList = CreateRedefineList(); return redefineList; } } void ImportKnownTypes(XmlQualifiedName typeName) { SchemaObjectInfo schemaObjectInfo; if (SchemaObjects.TryGetValue(typeName, out schemaObjectInfo)) { List knownTypes = schemaObjectInfo.knownTypes; if (knownTypes != null) { foreach (XmlSchemaType knownType in knownTypes) ImportType(knownType); } } } internal static bool IsObjectContract(DataContract dataContract) { HashSet previousCollectionTypes = new HashSet (); while (dataContract is CollectionDataContract && !previousCollectionTypes.Contains(dataContract.OriginalUnderlyingType)) { previousCollectionTypes.Add(dataContract.OriginalUnderlyingType); dataContract = ((CollectionDataContract)dataContract).ItemContract; } return dataContract is PrimitiveDataContract && ((PrimitiveDataContract)dataContract).UnderlyingType == Globals.TypeOfObject; } void ImportKnownTypesForObject() { if (!needToImportKnownTypesForObject) return; needToImportKnownTypesForObject = false; if (dataContractSet.KnownTypesForObject == null) { SchemaObjectInfo schemaObjectInfo; if (SchemaObjects.TryGetValue(SchemaExporter.AnytypeQualifiedName, out schemaObjectInfo)) { List knownTypes = schemaObjectInfo.knownTypes; if (knownTypes != null) { DataContractDictionary knownDataContracts = new DataContractDictionary(); foreach (XmlSchemaType knownType in knownTypes) { // Expected: will throw exception if schema set contains types that are not supported DataContract dataContract = ImportType(knownType); DataContract existingContract; if (!knownDataContracts.TryGetValue(dataContract.StableName, out existingContract)) { knownDataContracts.Add(dataContract.StableName, dataContract); } } dataContractSet.KnownTypesForObject = knownDataContracts; } } } } internal SchemaObjectDictionary CreateSchemaObjects() { SchemaObjectDictionary schemaObjects = new SchemaObjectDictionary(); ICollection schemaList = schemaSet.Schemas(); List knownTypesForObject = new List (); schemaObjects.Add(SchemaExporter.AnytypeQualifiedName, new SchemaObjectInfo(null, null, null, knownTypesForObject)); foreach (XmlSchema schema in schemaList) { if (schema.TargetNamespace != Globals.SerializationNamespace) { foreach (XmlSchemaObject schemaObj in schema.SchemaTypes.Values) { XmlSchemaType schemaType = schemaObj as XmlSchemaType; if (schemaType != null) { knownTypesForObject.Add(schemaType); XmlQualifiedName currentTypeName = new XmlQualifiedName(schemaType.Name, schema.TargetNamespace); SchemaObjectInfo schemaObjectInfo; if (schemaObjects.TryGetValue(currentTypeName, out schemaObjectInfo)) { schemaObjectInfo.type = schemaType; schemaObjectInfo.schema = schema; } else { schemaObjects.Add(currentTypeName, new SchemaObjectInfo(schemaType, null, schema, null)); } XmlQualifiedName baseTypeName = GetBaseTypeName(schemaType); if (baseTypeName != null) { SchemaObjectInfo baseTypeInfo; if (schemaObjects.TryGetValue(baseTypeName, out baseTypeInfo)) { if (baseTypeInfo.knownTypes == null) { baseTypeInfo.knownTypes = new List (); } } else { baseTypeInfo = new SchemaObjectInfo(null, null, null, new List ()); schemaObjects.Add(baseTypeName, baseTypeInfo); } baseTypeInfo.knownTypes.Add(schemaType); } } } foreach (XmlSchemaObject schemaObj in schema.Elements.Values) { XmlSchemaElement schemaElement = schemaObj as XmlSchemaElement; if (schemaElement != null) { XmlQualifiedName currentElementName = new XmlQualifiedName(schemaElement.Name, schema.TargetNamespace); SchemaObjectInfo schemaObjectInfo; if (schemaObjects.TryGetValue(currentElementName, out schemaObjectInfo)) { schemaObjectInfo.element = schemaElement; schemaObjectInfo.schema = schema; } else { schemaObjects.Add(currentElementName, new SchemaObjectInfo(null, schemaElement, schema, null)); } } } } } return schemaObjects; } XmlQualifiedName GetBaseTypeName(XmlSchemaType type) { XmlQualifiedName baseTypeName = null; XmlSchemaComplexType complexType = type as XmlSchemaComplexType; if (complexType != null) { if (complexType.ContentModel != null) { XmlSchemaComplexContent complexContent = complexType.ContentModel as XmlSchemaComplexContent; if (complexContent != null) { XmlSchemaComplexContentExtension extension = complexContent.Content as XmlSchemaComplexContentExtension; if (extension != null) baseTypeName = extension.BaseTypeName; } } } return baseTypeName; } List CreateRedefineList() { List list = new List (); ICollection schemaList = schemaSet.Schemas(); foreach (object schemaObj in schemaList) { XmlSchema schema = schemaObj as XmlSchema; if (schema == null) continue; foreach (XmlSchemaExternal ext in schema.Includes) { XmlSchemaRedefine redefine = ext as XmlSchemaRedefine; if (redefine != null) list.Add(redefine); } } return list; } [Fx.Tag.SecurityNote(Critical = "Sets critical properties on XmlDataContract.", Safe = "Called during schema import/code generation.")] [SecuritySafeCritical] DataContract ImportAnonymousGlobalElement(XmlSchemaElement element, XmlQualifiedName typeQName, string ns) { DataContract contract = ImportAnonymousElement(element, typeQName); XmlDataContract xmlDataContract = contract as XmlDataContract; if (xmlDataContract != null) { xmlDataContract.SetTopLevelElementName(new XmlQualifiedName(element.Name, ns)); xmlDataContract.IsTopLevelElementNullable = element.IsNillable; } return contract; } DataContract ImportAnonymousElement(XmlSchemaElement element, XmlQualifiedName typeQName) { if (SchemaHelper.GetSchemaType(SchemaObjects, typeQName) != null) { for (int i = 1; ; i++) { typeQName = new XmlQualifiedName(typeQName.Name + i.ToString(NumberFormatInfo.InvariantInfo), typeQName.Namespace); if (SchemaHelper.GetSchemaType(SchemaObjects, typeQName) == null) break; if (i == Int32.MaxValue) throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidDataContractException(SR.GetString(SR.CannotComputeUniqueName, element.Name))); } } if (element.SchemaType == null) return ImportType(SchemaExporter.AnytypeQualifiedName); else return ImportType(element.SchemaType, typeQName, true/*isAnonymous*/); } DataContract ImportType(XmlQualifiedName typeName) { DataContract dataContract = DataContract.GetBuiltInDataContract(typeName.Name, typeName.Namespace); if (dataContract == null) { XmlSchemaType type = SchemaHelper.GetSchemaType(SchemaObjects, typeName); if (type == null) throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidDataContractException(SR.GetString(SR.SpecifiedTypeNotFoundInSchema, typeName.Name, typeName.Namespace))); dataContract = ImportType(type); } if (IsObjectContract(dataContract)) needToImportKnownTypesForObject = true; return dataContract; } DataContract ImportType(XmlSchemaType type) { return ImportType(type, type.QualifiedName, false/*isAnonymous*/); } DataContract ImportType(XmlSchemaType type, XmlQualifiedName typeName, bool isAnonymous) { DataContract dataContract = dataContractSet[typeName]; if (dataContract != null) return dataContract; InvalidDataContractException invalidContractException; try { foreach (XmlSchemaRedefine redefine in RedefineList) { if (redefine.SchemaTypes[typeName] != null) ThrowTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.RedefineNotSupported)); } if (type is XmlSchemaSimpleType) { XmlSchemaSimpleType simpleType = (XmlSchemaSimpleType)type; XmlSchemaSimpleTypeContent content = simpleType.Content; if (content is XmlSchemaSimpleTypeUnion) ThrowTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.SimpleTypeUnionNotSupported)); else if (content is XmlSchemaSimpleTypeList) dataContract = ImportFlagsEnum(typeName, (XmlSchemaSimpleTypeList)content, simpleType.Annotation); else if (content is XmlSchemaSimpleTypeRestriction) { XmlSchemaSimpleTypeRestriction restriction = (XmlSchemaSimpleTypeRestriction)content; if (CheckIfEnum(restriction)) dataContract = ImportEnum(typeName, restriction, false /*isFlags*/, simpleType.Annotation); else dataContract = ImportSimpleTypeRestriction(typeName, restriction); } } else if (type is XmlSchemaComplexType) { XmlSchemaComplexType complexType = (XmlSchemaComplexType)type; if (complexType.ContentModel == null) { CheckComplexType(typeName, complexType); dataContract = ImportType(typeName, complexType.Particle, complexType.Attributes, complexType.AnyAttribute, null /* baseTypeName */, complexType.Annotation); } else { XmlSchemaContentModel contentModel = complexType.ContentModel; if (contentModel is XmlSchemaSimpleContent) ThrowTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.SimpleContentNotSupported)); else if (contentModel is XmlSchemaComplexContent) { XmlSchemaComplexContent complexContent = (XmlSchemaComplexContent)contentModel; if (complexContent.IsMixed) ThrowTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.MixedContentNotSupported)); if (complexContent.Content is XmlSchemaComplexContentExtension) { XmlSchemaComplexContentExtension extension = (XmlSchemaComplexContentExtension)complexContent.Content; dataContract = ImportType(typeName, extension.Particle, extension.Attributes, extension.AnyAttribute, extension.BaseTypeName, complexType.Annotation); } else if (complexContent.Content is XmlSchemaComplexContentRestriction) { XmlSchemaComplexContentRestriction restriction = (XmlSchemaComplexContentRestriction)complexContent.Content; XmlQualifiedName baseTypeName = restriction.BaseTypeName; if (baseTypeName == SchemaExporter.AnytypeQualifiedName) dataContract = ImportType(typeName, restriction.Particle, restriction.Attributes, restriction.AnyAttribute, null /* baseTypeName */, complexType.Annotation); else ThrowTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.ComplexTypeRestrictionNotSupported)); } } } } if (dataContract == null) ThrowTypeCannotBeImportedException(typeName.Name, typeName.Namespace, String.Empty); if (type.QualifiedName != XmlQualifiedName.Empty) ImportTopLevelElement(typeName); ImportDataContractExtension(type, dataContract); ImportGenericInfo(type, dataContract); ImportKnownTypes(typeName); return dataContract; } catch (InvalidDataContractException e) { invalidContractException = e; } // Execution gets to this point if InvalidDataContractException was thrown if (importXmlDataType) { RemoveFailedContract(typeName); return ImportXmlDataType(typeName, type, isAnonymous); } Type referencedType; if (dataContractSet.TryGetReferencedType(typeName, dataContract, out referencedType) || (string.IsNullOrEmpty(type.Name) && dataContractSet.TryGetReferencedType(ImportActualType(type.Annotation, typeName, typeName), dataContract, out referencedType))) { if (Globals.TypeOfIXmlSerializable.IsAssignableFrom(referencedType)) { RemoveFailedContract(typeName); return ImportXmlDataType(typeName, type, isAnonymous); } } XmlDataContract specialContract = ImportSpecialXmlDataType(type, isAnonymous); if (specialContract != null) { this.dataContractSet.Remove(typeName); return specialContract; } throw invalidContractException; } private void RemoveFailedContract(XmlQualifiedName typeName) { ClassDataContract oldContract = this.dataContractSet[typeName] as ClassDataContract; this.dataContractSet.Remove(typeName); if (oldContract != null) { ClassDataContract ancestorDataContract = oldContract.BaseContract; while (ancestorDataContract != null) { ancestorDataContract.KnownDataContracts.Remove(typeName); ancestorDataContract = ancestorDataContract.BaseContract; } if (dataContractSet.KnownTypesForObject != null) dataContractSet.KnownTypesForObject.Remove(typeName); } } bool CheckIfEnum(XmlSchemaSimpleTypeRestriction restriction) { foreach (XmlSchemaFacet facet in restriction.Facets) { if (!(facet is XmlSchemaEnumerationFacet)) return false; } XmlQualifiedName expectedBase = SchemaExporter.StringQualifiedName; if (restriction.BaseTypeName != XmlQualifiedName.Empty) { return ((restriction.BaseTypeName == expectedBase && restriction.Facets.Count > 0) || ImportType(restriction.BaseTypeName) is EnumDataContract); } else if (restriction.BaseType != null) { DataContract baseContract = ImportType(restriction.BaseType); return (baseContract.StableName == expectedBase || baseContract is EnumDataContract); } return false; } bool CheckIfCollection(XmlSchemaSequence rootSequence) { if (rootSequence.Items == null || rootSequence.Items.Count == 0) return false; RemoveOptionalUnknownSerializationElements(rootSequence.Items); if (rootSequence.Items.Count != 1) return false; XmlSchemaObject o = rootSequence.Items[0]; if (!(o is XmlSchemaElement)) return false; XmlSchemaElement localElement = (XmlSchemaElement)o; return (localElement.MaxOccursString == Globals.OccursUnbounded || localElement.MaxOccurs > 1); } bool CheckIfISerializable(XmlSchemaSequence rootSequence, XmlSchemaObjectCollection attributes) { if (rootSequence.Items == null || rootSequence.Items.Count == 0) return false; RemoveOptionalUnknownSerializationElements(rootSequence.Items); if (attributes == null || attributes.Count == 0) return false; return (rootSequence.Items.Count == 1 && rootSequence.Items[0] is XmlSchemaAny); } [Fx.Tag.SecurityNote(Critical = "Initializes critical static fields.", Safe = "Doesn't leak anything.")] [SecuritySafeCritical] void RemoveOptionalUnknownSerializationElements(XmlSchemaObjectCollection items) { for (int i = 0; i < items.Count; i++) { XmlSchemaElement element = items[i] as XmlSchemaElement; if (element != null && element.RefName != null && element.RefName.Namespace == Globals.SerializationNamespace && element.MinOccurs == 0) { if (serializationSchemaElements == null) { XmlSchema serializationSchema = XmlSchema.Read(XmlReader.Create(new StringReader(Globals.SerializationSchema)), null); serializationSchemaElements = new Hashtable(); foreach (XmlSchemaObject schemaObject in serializationSchema.Items) { XmlSchemaElement schemaElement = schemaObject as XmlSchemaElement; if (schemaElement != null) serializationSchemaElements.Add(schemaElement.Name, schemaElement); } } if (!serializationSchemaElements.ContainsKey(element.RefName.Name)) { items.RemoveAt(i); i--; } } } } DataContract ImportType(XmlQualifiedName typeName, XmlSchemaParticle rootParticle, XmlSchemaObjectCollection attributes, XmlSchemaAnyAttribute anyAttribute, XmlQualifiedName baseTypeName, XmlSchemaAnnotation annotation) { DataContract dataContract = null; bool isDerived = (baseTypeName != null); bool isReference; ImportAttributes(typeName, attributes, anyAttribute, out isReference); if (rootParticle == null) dataContract = ImportClass(typeName, new XmlSchemaSequence(), baseTypeName, annotation, isReference); else if (!(rootParticle is XmlSchemaSequence)) ThrowTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.RootParticleMustBeSequence)); else { XmlSchemaSequence rootSequence = (XmlSchemaSequence)rootParticle; if (rootSequence.MinOccurs != 1) ThrowTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.RootSequenceMustBeRequired)); if (rootSequence.MaxOccurs != 1) ThrowTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.RootSequenceMaxOccursMustBe)); if (!isDerived && CheckIfCollection(rootSequence)) dataContract = ImportCollection(typeName, rootSequence, attributes, annotation, isReference); else if (CheckIfISerializable(rootSequence, attributes)) dataContract = ImportISerializable(typeName, rootSequence, baseTypeName, attributes, annotation); else dataContract = ImportClass(typeName, rootSequence, baseTypeName, annotation, isReference); } return dataContract; } [Fx.Tag.SecurityNote(Critical = "Sets critical properties on ClassDataContract.", Safe = "Called during schema import/code generation.")] [SecuritySafeCritical] ClassDataContract ImportClass(XmlQualifiedName typeName, XmlSchemaSequence rootSequence, XmlQualifiedName baseTypeName, XmlSchemaAnnotation annotation, bool isReference) { ClassDataContract dataContract = new ClassDataContract(); dataContract.StableName = typeName; AddDataContract(dataContract); dataContract.IsValueType = IsValueType(typeName, annotation); dataContract.IsReference = isReference; if (baseTypeName != null) { ImportBaseContract(baseTypeName, dataContract); if (dataContract.BaseContract.IsISerializable) { if (IsISerializableDerived(typeName, rootSequence)) dataContract.IsISerializable = true; else ThrowTypeCannotBeImportedException(dataContract.StableName.Name, dataContract.StableName.Namespace, SR.GetString(SR.DerivedTypeNotISerializable, baseTypeName.Name, baseTypeName.Namespace)); } if (dataContract.BaseContract.IsReference) { dataContract.IsReference = true; } } if (!dataContract.IsISerializable) { dataContract.Members = new List (); RemoveOptionalUnknownSerializationElements(rootSequence.Items); for (int memberIndex = 0; memberIndex < rootSequence.Items.Count; memberIndex++) { XmlSchemaElement element = rootSequence.Items[memberIndex] as XmlSchemaElement; if (element == null) ThrowTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.MustContainOnlyLocalElements)); ImportClassMember(element, dataContract); } } return dataContract; } [Fx.Tag.SecurityNote(Critical = "Sets critical properties on XmlDataContract.", Safe = "Called during schema import/code generation.")] [SecuritySafeCritical] DataContract ImportXmlDataType(XmlQualifiedName typeName, XmlSchemaType xsdType, bool isAnonymous) { DataContract dataContract = dataContractSet[typeName]; if (dataContract != null) return dataContract; XmlDataContract xmlDataContract = ImportSpecialXmlDataType(xsdType, isAnonymous); if (xmlDataContract != null) return xmlDataContract; xmlDataContract = new XmlDataContract(); xmlDataContract.StableName = typeName; xmlDataContract.IsValueType = false; AddDataContract(xmlDataContract); if (xsdType != null) { ImportDataContractExtension(xsdType, xmlDataContract); xmlDataContract.IsValueType = IsValueType(typeName, xsdType.Annotation); xmlDataContract.IsTypeDefinedOnImport = true; xmlDataContract.XsdType = isAnonymous ? xsdType : null; xmlDataContract.HasRoot = !IsXmlAnyElementType(xsdType as XmlSchemaComplexType); } else { //Value type can be used by both nillable and non-nillable elements but reference type cannot be used by non nillable elements xmlDataContract.IsValueType = true; xmlDataContract.IsTypeDefinedOnImport = false; xmlDataContract.HasRoot = true; if (DiagnosticUtility.ShouldTraceVerbose) { TraceUtility.Trace(TraceEventType.Verbose, TraceCode.XsdImportAnnotationFailed, SR.GetString(SR.TraceCodeXsdImportAnnotationFailed), new StringTraceRecord("Type", typeName.Namespace + ":" + typeName.Name)); } } if (!isAnonymous) { bool isNullable; xmlDataContract.SetTopLevelElementName(SchemaHelper.GetGlobalElementDeclaration(schemaSet, typeName, out isNullable)); xmlDataContract.IsTopLevelElementNullable = isNullable; } return xmlDataContract; } private XmlDataContract ImportSpecialXmlDataType(XmlSchemaType xsdType, bool isAnonymous) { if (!isAnonymous) return null; XmlSchemaComplexType complexType = xsdType as XmlSchemaComplexType; if (complexType == null) return null; if (IsXmlAnyElementType(complexType)) { //check if the type is XElement XmlQualifiedName xlinqTypeName = new XmlQualifiedName("XElement", "http://schemas.datacontract.org/2004/07/System.Xml.Linq"); Type referencedType; if (dataContractSet.TryGetReferencedType(xlinqTypeName, null, out referencedType) && Globals.TypeOfIXmlSerializable.IsAssignableFrom(referencedType)) { XmlDataContract xmlDataContract = new XmlDataContract(referencedType); AddDataContract(xmlDataContract); return xmlDataContract; } //otherwise, assume XmlElement return (XmlDataContract)DataContract.GetBuiltInDataContract(Globals.TypeOfXmlElement); } if (IsXmlAnyType(complexType)) return (XmlDataContract)DataContract.GetBuiltInDataContract(Globals.TypeOfXmlNodeArray); return null; } bool IsXmlAnyElementType(XmlSchemaComplexType xsdType) { if (xsdType == null) return false; XmlSchemaSequence sequence = xsdType.Particle as XmlSchemaSequence; if (sequence == null) return false; if (sequence.Items == null || sequence.Items.Count != 1) return false; XmlSchemaAny any = sequence.Items[0] as XmlSchemaAny; if (any == null || any.Namespace != null) return false; if (xsdType.AnyAttribute != null || (xsdType.Attributes != null && xsdType.Attributes.Count > 0)) return false; return true; } bool IsXmlAnyType(XmlSchemaComplexType xsdType) { if (xsdType == null) return false; XmlSchemaSequence sequence = xsdType.Particle as XmlSchemaSequence; if (sequence == null) return false; if (sequence.Items == null || sequence.Items.Count != 1) return false; XmlSchemaAny any = sequence.Items[0] as XmlSchemaAny; if (any == null || any.Namespace != null) return false; if (any.MaxOccurs != Decimal.MaxValue) return false; if (xsdType.AnyAttribute == null || xsdType.Attributes.Count > 0) return false; return true; } bool IsValueType(XmlQualifiedName typeName, XmlSchemaAnnotation annotation) { string isValueTypeInnerText = GetInnerText(typeName, ImportAnnotation(annotation, SchemaExporter.IsValueTypeName)); if (isValueTypeInnerText != null) { try { return XmlConvert.ToBoolean(isValueTypeInnerText); } catch (FormatException fe) { ThrowTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.IsValueTypeFormattedIncorrectly, isValueTypeInnerText, fe.Message)); } } return false; } [Fx.Tag.SecurityNote(Critical = "Sets critical properties on ClassDataContract.", Safe = "Called during schema import/code generation.")] [SecuritySafeCritical] ClassDataContract ImportISerializable(XmlQualifiedName typeName, XmlSchemaSequence rootSequence, XmlQualifiedName baseTypeName, XmlSchemaObjectCollection attributes, XmlSchemaAnnotation annotation) { ClassDataContract dataContract = new ClassDataContract(); dataContract.StableName = typeName; dataContract.IsISerializable = true; AddDataContract(dataContract); dataContract.IsValueType = IsValueType(typeName, annotation); if (baseTypeName == null) CheckISerializableBase(typeName, rootSequence, attributes); else { ImportBaseContract(baseTypeName, dataContract); if (!dataContract.BaseContract.IsISerializable) ThrowISerializableTypeCannotBeImportedException(dataContract.StableName.Name, dataContract.StableName.Namespace, SR.GetString(SR.BaseTypeNotISerializable, baseTypeName.Name, baseTypeName.Namespace)); if (!IsISerializableDerived(typeName, rootSequence)) ThrowISerializableTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.ISerializableDerivedContainsOneOrMoreItems)); } return dataContract; } void CheckISerializableBase(XmlQualifiedName typeName, XmlSchemaSequence rootSequence, XmlSchemaObjectCollection attributes) { if (rootSequence == null) ThrowISerializableTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.ISerializableDoesNotContainAny)); if (rootSequence.Items == null || rootSequence.Items.Count < 1) ThrowISerializableTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.ISerializableDoesNotContainAny)); else if (rootSequence.Items.Count > 1) ThrowISerializableTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.ISerializableContainsMoreThanOneItems)); XmlSchemaObject o = rootSequence.Items[0]; if (!(o is XmlSchemaAny)) ThrowISerializableTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.ISerializableDoesNotContainAny)); XmlSchemaAny wildcard = (XmlSchemaAny)o; XmlSchemaAny iSerializableWildcardElement = SchemaExporter.ISerializableWildcardElement; if (wildcard.MinOccurs != iSerializableWildcardElement.MinOccurs) ThrowISerializableTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.ISerializableWildcardMinOccursMustBe, iSerializableWildcardElement.MinOccurs)); if (wildcard.MaxOccursString != iSerializableWildcardElement.MaxOccursString) ThrowISerializableTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.ISerializableWildcardMaxOccursMustBe, iSerializableWildcardElement.MaxOccursString)); if (wildcard.Namespace != iSerializableWildcardElement.Namespace) ThrowISerializableTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.ISerializableWildcardNamespaceInvalid, iSerializableWildcardElement.Namespace)); if (wildcard.ProcessContents != iSerializableWildcardElement.ProcessContents) ThrowISerializableTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.ISerializableWildcardProcessContentsInvalid, iSerializableWildcardElement.ProcessContents)); XmlQualifiedName factoryTypeAttributeRefName = SchemaExporter.ISerializableFactoryTypeAttribute.RefName; bool containsFactoryTypeAttribute = false; if (attributes != null) { for (int i = 0; i < attributes.Count; i++) { o = attributes[i]; if (o is XmlSchemaAttribute) { if (((XmlSchemaAttribute)o).RefName == factoryTypeAttributeRefName) { containsFactoryTypeAttribute = true; break; } } } } if (!containsFactoryTypeAttribute) ThrowISerializableTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.ISerializableMustRefFactoryTypeAttribute, factoryTypeAttributeRefName.Name, factoryTypeAttributeRefName.Namespace)); } bool IsISerializableDerived(XmlQualifiedName typeName, XmlSchemaSequence rootSequence) { return (rootSequence == null || rootSequence.Items == null || rootSequence.Items.Count == 0); } [Fx.Tag.SecurityNote(Critical = "Sets critical BaseContract property on ClassDataContract.", Safe = "Called during schema import/code generation.")] [SecuritySafeCritical] void ImportBaseContract(XmlQualifiedName baseTypeName, ClassDataContract dataContract) { ClassDataContract baseContract = ImportType(baseTypeName) as ClassDataContract; if (baseContract == null) ThrowTypeCannotBeImportedException(dataContract.StableName.Name, dataContract.StableName.Namespace, SR.GetString(dataContract.IsISerializable ? SR.InvalidISerializableDerivation : SR.InvalidClassDerivation, baseTypeName.Name, baseTypeName.Namespace)); // Note: code ignores IsValueType annotation if derived type exists if (baseContract.IsValueType) baseContract.IsValueType = false; ClassDataContract ancestorDataContract = baseContract; while (ancestorDataContract != null) { DataContractDictionary knownDataContracts = ancestorDataContract.KnownDataContracts; if (knownDataContracts == null) { knownDataContracts = new DataContractDictionary(); ancestorDataContract.KnownDataContracts = knownDataContracts; } knownDataContracts.Add(dataContract.StableName, dataContract); ancestorDataContract = ancestorDataContract.BaseContract; } dataContract.BaseContract = baseContract; } void ImportTopLevelElement(XmlQualifiedName typeName) { XmlSchemaElement topLevelElement = SchemaHelper.GetSchemaElement(SchemaObjects, typeName); // Top level element of same name is not required, but is validated if it is present if (topLevelElement == null) return; else { XmlQualifiedName elementTypeName = topLevelElement.SchemaTypeName; if (elementTypeName.IsEmpty) { if (topLevelElement.SchemaType != null) ThrowTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.AnonymousTypeNotSupported, typeName.Name, typeName.Namespace)); else elementTypeName = SchemaExporter.AnytypeQualifiedName; } if (elementTypeName != typeName) ThrowTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.TopLevelElementRepresentsDifferentType, topLevelElement.SchemaTypeName.Name, topLevelElement.SchemaTypeName.Namespace)); CheckIfElementUsesUnsupportedConstructs(typeName, topLevelElement); } } void ImportClassMember(XmlSchemaElement element, ClassDataContract dataContract) { XmlQualifiedName typeName = dataContract.StableName; if (element.MinOccurs > 1) ThrowTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.ElementMinOccursMustBe, element.Name)); if (element.MaxOccurs != 1) ThrowTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.ElementMaxOccursMustBe, element.Name)); DataContract memberTypeContract = null; string memberName = element.Name; bool memberIsRequired = (element.MinOccurs > 0); bool memberIsNullable = element.IsNillable; bool memberEmitDefaultValue; int memberOrder = 0; XmlSchemaForm elementForm = (element.Form == XmlSchemaForm.None) ? SchemaHelper.GetSchemaWithType(SchemaObjects, schemaSet, typeName).ElementFormDefault : element.Form; if (elementForm != XmlSchemaForm.Qualified) ThrowTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.FormMustBeQualified, element.Name)); CheckIfElementUsesUnsupportedConstructs(typeName, element); if (element.SchemaTypeName.IsEmpty) { if (element.SchemaType != null) memberTypeContract = ImportAnonymousElement(element, new XmlQualifiedName(String.Format(CultureInfo.InvariantCulture, "{0}.{1}Type", typeName.Name, element.Name), typeName.Namespace)); else if (!element.RefName.IsEmpty) ThrowTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.ElementRefOnLocalElementNotSupported, element.RefName.Name, element.RefName.Namespace)); else memberTypeContract = ImportType(SchemaExporter.AnytypeQualifiedName); } else { XmlQualifiedName memberTypeName = ImportActualType(element.Annotation, element.SchemaTypeName, typeName); memberTypeContract = ImportType(memberTypeName); if (IsObjectContract(memberTypeContract)) needToImportKnownTypesForObject = true; } bool? emitDefaultValueFromAnnotation = ImportEmitDefaultValue(element.Annotation, typeName); if (!memberTypeContract.IsValueType && !memberIsNullable) { if (emitDefaultValueFromAnnotation != null && emitDefaultValueFromAnnotation.Value) throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidDataContractException(SR.GetString(SR.InvalidEmitDefaultAnnotation, memberName, typeName.Name, typeName.Namespace))); memberEmitDefaultValue = false; } else memberEmitDefaultValue = emitDefaultValueFromAnnotation != null ? emitDefaultValueFromAnnotation.Value : Globals.DefaultEmitDefaultValue; int prevMemberIndex = dataContract.Members.Count - 1; if (prevMemberIndex >= 0) { DataMember prevMember = dataContract.Members[prevMemberIndex]; if (prevMember.Order > Globals.DefaultOrder) memberOrder = dataContract.Members.Count; DataMember currentMember = new DataMember(memberTypeContract, memberName, memberIsNullable, memberIsRequired, memberEmitDefaultValue, memberOrder); int compare = ClassDataContract.DataMemberComparer.Singleton.Compare(prevMember, currentMember); if (compare == 0) ThrowTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.CannotHaveDuplicateElementNames, memberName)); else if (compare > 0) memberOrder = dataContract.Members.Count; } DataMember dataMember = new DataMember(memberTypeContract, memberName, memberIsNullable, memberIsRequired, memberEmitDefaultValue, memberOrder); XmlQualifiedName surrogateDataAnnotationName = SchemaExporter.SurrogateDataAnnotationName; dataContractSet.SetSurrogateData(dataMember, ImportSurrogateData(ImportAnnotation(element.Annotation, surrogateDataAnnotationName), surrogateDataAnnotationName.Name, surrogateDataAnnotationName.Namespace)); dataContract.Members.Add(dataMember); } private bool? ImportEmitDefaultValue(XmlSchemaAnnotation annotation, XmlQualifiedName typeName) { XmlElement defaultValueElement = ImportAnnotation(annotation, SchemaExporter.DefaultValueAnnotation); if (defaultValueElement == null) return null; XmlNode emitDefaultValueAttribute = defaultValueElement.Attributes.GetNamedItem(Globals.EmitDefaultValueAttribute); string emitDefaultValueString = (emitDefaultValueAttribute == null) ? null : emitDefaultValueAttribute.Value; if (emitDefaultValueString == null) throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidDataContractException(SR.GetString(SR.AnnotationAttributeNotFound, SchemaExporter.DefaultValueAnnotation.Name, typeName.Name, typeName.Namespace, Globals.EmitDefaultValueAttribute))); return XmlConvert.ToBoolean(emitDefaultValueString); } internal static XmlQualifiedName ImportActualType(XmlSchemaAnnotation annotation, XmlQualifiedName defaultTypeName, XmlQualifiedName typeName) { XmlElement actualTypeElement = ImportAnnotation(annotation, SchemaExporter.ActualTypeAnnotationName); if (actualTypeElement == null) return defaultTypeName; XmlNode nameAttribute = actualTypeElement.Attributes.GetNamedItem(Globals.ActualTypeNameAttribute); string name = (nameAttribute == null) ? null : nameAttribute.Value; if (name == null) throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidDataContractException(SR.GetString(SR.AnnotationAttributeNotFound, SchemaExporter.ActualTypeAnnotationName.Name, typeName.Name, typeName.Namespace, Globals.ActualTypeNameAttribute))); XmlNode nsAttribute = actualTypeElement.Attributes.GetNamedItem(Globals.ActualTypeNamespaceAttribute); string ns = (nsAttribute == null) ? null : nsAttribute.Value; if (ns == null) throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidDataContractException(SR.GetString(SR.AnnotationAttributeNotFound, SchemaExporter.ActualTypeAnnotationName.Name, typeName.Name, typeName.Namespace, Globals.ActualTypeNamespaceAttribute))); return new XmlQualifiedName(name, ns); } [Fx.Tag.SecurityNote(Critical = "Sets critical properties on CollectionDataContract.", Safe = "Called during schema import/code generation.")] [SecuritySafeCritical] CollectionDataContract ImportCollection(XmlQualifiedName typeName, XmlSchemaSequence rootSequence, XmlSchemaObjectCollection attributes, XmlSchemaAnnotation annotation, bool isReference) { CollectionDataContract dataContract = new CollectionDataContract(CollectionKind.Array); dataContract.StableName = typeName; AddDataContract(dataContract); dataContract.IsReference = isReference; // CheckIfCollection has already checked if sequence contains exactly one item with maxOccurs="unbounded" or maxOccurs > 1 XmlSchemaElement element = (XmlSchemaElement)rootSequence.Items[0]; dataContract.IsItemTypeNullable = element.IsNillable; dataContract.ItemName = element.Name; XmlSchemaForm elementForm = (element.Form == XmlSchemaForm.None) ? SchemaHelper.GetSchemaWithType(SchemaObjects, schemaSet, typeName).ElementFormDefault : element.Form; if (elementForm != XmlSchemaForm.Qualified) ThrowArrayTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.ArrayItemFormMustBe, element.Name)); CheckIfElementUsesUnsupportedConstructs(typeName, element); if (element.SchemaTypeName.IsEmpty) { if (element.SchemaType != null) { XmlQualifiedName shortName = new XmlQualifiedName(element.Name, typeName.Namespace); DataContract contract = dataContractSet[shortName]; if (contract == null) { dataContract.ItemContract = ImportAnonymousElement(element, shortName); } else { XmlQualifiedName fullName = new XmlQualifiedName(String.Format(CultureInfo.InvariantCulture, "{0}.{1}Type", typeName.Name, element.Name), typeName.Namespace); dataContract.ItemContract = ImportAnonymousElement(element, fullName); } } else if (!element.RefName.IsEmpty) ThrowArrayTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.ElementRefOnLocalElementNotSupported, element.RefName.Name, element.RefName.Namespace)); else dataContract.ItemContract = ImportType(SchemaExporter.AnytypeQualifiedName); } else { dataContract.ItemContract = ImportType(element.SchemaTypeName); } if (IsDictionary(typeName, annotation)) { ClassDataContract keyValueContract = dataContract.ItemContract as ClassDataContract; DataMember key = null, value = null; if (keyValueContract == null || keyValueContract.Members == null || keyValueContract.Members.Count != 2 || !(key = keyValueContract.Members[0]).IsRequired || !(value = keyValueContract.Members[1]).IsRequired) { ThrowArrayTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.InvalidKeyValueType, element.Name)); } if (keyValueContract.Namespace != dataContract.Namespace) { ThrowArrayTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.InvalidKeyValueTypeNamespace, element.Name, keyValueContract.Namespace)); } keyValueContract.IsValueType = true; dataContract.KeyName = key.Name; dataContract.ValueName = value.Name; if (element.SchemaType != null) { dataContractSet.Remove(keyValueContract.StableName); GenericInfo genericInfo = new GenericInfo(DataContract.GetStableName(Globals.TypeOfKeyValue), Globals.TypeOfKeyValue.FullName); genericInfo.Add(GetGenericInfoForDataMember(key)); genericInfo.Add(GetGenericInfoForDataMember(value)); genericInfo.AddToLevel(0, 2); dataContract.ItemContract.StableName = new XmlQualifiedName(genericInfo.GetExpandedStableName().Name, typeName.Namespace); } } return dataContract; } GenericInfo GetGenericInfoForDataMember(DataMember dataMember) { GenericInfo genericInfo = null; if (dataMember.MemberTypeContract.IsValueType && dataMember.IsNullable) { genericInfo = new GenericInfo(DataContract.GetStableName(Globals.TypeOfNullable), Globals.TypeOfNullable.FullName); genericInfo.Add(new GenericInfo(dataMember.MemberTypeContract.StableName, null)); } else { genericInfo = new GenericInfo(dataMember.MemberTypeContract.StableName, null); } return genericInfo; } bool IsDictionary(XmlQualifiedName typeName, XmlSchemaAnnotation annotation) { string isDictionaryInnerText = GetInnerText(typeName, ImportAnnotation(annotation, SchemaExporter.IsDictionaryAnnotationName)); if (isDictionaryInnerText != null) { try { return XmlConvert.ToBoolean(isDictionaryInnerText); } catch (FormatException fe) { ThrowTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.IsDictionaryFormattedIncorrectly, isDictionaryInnerText, fe.Message)); } } return false; } EnumDataContract ImportFlagsEnum(XmlQualifiedName typeName, XmlSchemaSimpleTypeList list, XmlSchemaAnnotation annotation) { XmlSchemaSimpleType anonymousType = list.ItemType; if (anonymousType == null) ThrowEnumTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.EnumListMustContainAnonymousType)); XmlSchemaSimpleTypeContent content = anonymousType.Content; if (content is XmlSchemaSimpleTypeUnion) ThrowEnumTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.EnumUnionInAnonymousTypeNotSupported)); else if (content is XmlSchemaSimpleTypeList) ThrowEnumTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.EnumListInAnonymousTypeNotSupported)); else if (content is XmlSchemaSimpleTypeRestriction) { XmlSchemaSimpleTypeRestriction restriction = (XmlSchemaSimpleTypeRestriction)content; if (CheckIfEnum(restriction)) return ImportEnum(typeName, restriction, true /*isFlags*/, annotation); else ThrowEnumTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.EnumRestrictionInvalid)); } return null; } [Fx.Tag.SecurityNote(Critical = "Sets critical properties on EnumDataContract.", Safe = "Called during schema import/code generation.")] [SecuritySafeCritical] EnumDataContract ImportEnum(XmlQualifiedName typeName, XmlSchemaSimpleTypeRestriction restriction, bool isFlags, XmlSchemaAnnotation annotation) { EnumDataContract dataContract = new EnumDataContract(); dataContract.StableName = typeName; dataContract.BaseContractName = ImportActualType(annotation, SchemaExporter.DefaultEnumBaseTypeName, typeName); dataContract.IsFlags = isFlags; AddDataContract(dataContract); // CheckIfEnum has already checked if baseType of restriction is string dataContract.Values = new List (); dataContract.Members = new List (); foreach (XmlSchemaFacet facet in restriction.Facets) { XmlSchemaEnumerationFacet enumFacet = facet as XmlSchemaEnumerationFacet; if (enumFacet == null) ThrowEnumTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.EnumOnlyEnumerationFacetsSupported)); if (enumFacet.Value == null) ThrowEnumTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.EnumEnumerationFacetsMustHaveValue)); string valueInnerText = GetInnerText(typeName, ImportAnnotation(enumFacet.Annotation, SchemaExporter.EnumerationValueAnnotationName)); if (valueInnerText == null) dataContract.Values.Add(SchemaExporter.GetDefaultEnumValue(isFlags, dataContract.Members.Count)); else dataContract.Values.Add(dataContract.GetEnumValueFromString(valueInnerText)); DataMember dataMember = new DataMember(enumFacet.Value); dataContract.Members.Add(dataMember); } return dataContract; } DataContract ImportSimpleTypeRestriction(XmlQualifiedName typeName, XmlSchemaSimpleTypeRestriction restriction) { DataContract dataContract = null; if (!restriction.BaseTypeName.IsEmpty) dataContract = ImportType(restriction.BaseTypeName); else if (restriction.BaseType != null) dataContract = ImportType(restriction.BaseType); else ThrowTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.SimpleTypeRestrictionDoesNotSpecifyBase)); if (dataContract.IsBuiltInDataContract) { dataContractSet.InternalAdd(typeName, dataContract); } return dataContract; } void ImportDataContractExtension(XmlSchemaType type, DataContract dataContract) { if (type.Annotation == null || type.Annotation.Items == null) return; foreach (XmlSchemaObject schemaObject in type.Annotation.Items) { XmlSchemaAppInfo appInfo = schemaObject as XmlSchemaAppInfo; if (appInfo == null) continue; if (appInfo.Markup != null) { foreach (XmlNode xmlNode in appInfo.Markup) { XmlElement typeElement = xmlNode as XmlElement; XmlQualifiedName surrogateDataAnnotationName = SchemaExporter.SurrogateDataAnnotationName; if (typeElement != null && typeElement.NamespaceURI == surrogateDataAnnotationName.Namespace && typeElement.LocalName == surrogateDataAnnotationName.Name) { object surrogateData = ImportSurrogateData(typeElement, surrogateDataAnnotationName.Name, surrogateDataAnnotationName.Namespace); dataContractSet.SetSurrogateData(dataContract, surrogateData); } } } } } [Fx.Tag.SecurityNote(Critical = "Sets critical properties on DataContract.", Safe = "Called during schema import/code generation.")] [SecuritySafeCritical] void ImportGenericInfo(XmlSchemaType type, DataContract dataContract) { if (type.Annotation == null || type.Annotation.Items == null) return; foreach (XmlSchemaObject schemaObject in type.Annotation.Items) { XmlSchemaAppInfo appInfo = schemaObject as XmlSchemaAppInfo; if (appInfo == null) continue; if (appInfo.Markup != null) { foreach (XmlNode xmlNode in appInfo.Markup) { XmlElement typeElement = xmlNode as XmlElement; if (typeElement != null && typeElement.NamespaceURI == Globals.SerializationNamespace) { if (typeElement.LocalName == Globals.GenericTypeLocalName) dataContract.GenericInfo = ImportGenericInfo(typeElement, type); } } } } } GenericInfo ImportGenericInfo(XmlElement typeElement, XmlSchemaType type) { XmlNode nameAttribute = typeElement.Attributes.GetNamedItem(Globals.GenericNameAttribute); string name = (nameAttribute == null) ? null : nameAttribute.Value; if (name == null) throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidDataContractException(SR.GetString(SR.GenericAnnotationAttributeNotFound, type.Name, Globals.GenericNameAttribute))); XmlNode nsAttribute = typeElement.Attributes.GetNamedItem(Globals.GenericNamespaceAttribute); string ns = (nsAttribute == null) ? null : nsAttribute.Value; if (ns == null) throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidDataContractException(SR.GetString(SR.GenericAnnotationAttributeNotFound, type.Name, Globals.GenericNamespaceAttribute))); if (typeElement.ChildNodes.Count > 0) //Generic Type name = DataContract.EncodeLocalName(name); int currentLevel = 0; GenericInfo genInfo = new GenericInfo(new XmlQualifiedName(name, ns), type.Name); foreach (XmlNode childNode in typeElement.ChildNodes) { XmlElement argumentElement = childNode as XmlElement; if (argumentElement == null) continue; if (argumentElement.LocalName != Globals.GenericParameterLocalName || argumentElement.NamespaceURI != Globals.SerializationNamespace) throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidDataContractException(SR.GetString(SR.GenericAnnotationHasInvalidElement, argumentElement.LocalName, argumentElement.NamespaceURI, type.Name))); XmlNode nestedLevelAttribute = argumentElement.Attributes.GetNamedItem(Globals.GenericParameterNestedLevelAttribute); int argumentLevel = 0; if (nestedLevelAttribute != null) { if (!Int32.TryParse(nestedLevelAttribute.Value, out argumentLevel)) throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidDataContractException(SR.GetString(SR.GenericAnnotationHasInvalidAttributeValue, argumentElement.LocalName, argumentElement.NamespaceURI, type.Name, nestedLevelAttribute.Value, nestedLevelAttribute.LocalName, Globals.TypeOfInt.Name))); } if (argumentLevel < currentLevel) throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidDataContractException(SR.GetString(SR.GenericAnnotationForNestedLevelMustBeIncreasing, argumentElement.LocalName, argumentElement.NamespaceURI, type.Name))); genInfo.Add(ImportGenericInfo(argumentElement, type)); genInfo.AddToLevel(argumentLevel, 1); currentLevel = argumentLevel; } XmlNode typeNestedLevelsAttribute = typeElement.Attributes.GetNamedItem(Globals.GenericParameterNestedLevelAttribute); if (typeNestedLevelsAttribute != null) { int nestedLevels = 0; if (!Int32.TryParse(typeNestedLevelsAttribute.Value, out nestedLevels)) throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidDataContractException(SR.GetString(SR.GenericAnnotationHasInvalidAttributeValue, typeElement.LocalName, typeElement.NamespaceURI, type.Name, typeNestedLevelsAttribute.Value, typeNestedLevelsAttribute.LocalName, Globals.TypeOfInt.Name))); if ((nestedLevels - 1) > currentLevel) genInfo.AddToLevel(nestedLevels - 1, 0); } return genInfo; } object ImportSurrogateData(XmlElement typeElement, string name, string ns) { if (dataContractSet.DataContractSurrogate != null && typeElement != null) { Collection knownTypes = new Collection (); DataContractSurrogateCaller.GetKnownCustomDataTypes(dataContractSet.DataContractSurrogate, knownTypes); DataContractSerializer serializer = new DataContractSerializer(Globals.TypeOfObject, name, ns, knownTypes, Int32.MaxValue, false /*ignoreExtensionDataObject*/, true /*preserveObjectReferences*/, null /*dataContractSurrogate*/); return serializer.ReadObject(new XmlNodeReader(typeElement)); } return null; } void CheckComplexType(XmlQualifiedName typeName, XmlSchemaComplexType type) { if (type.IsAbstract) ThrowTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.AbstractTypeNotSupported)); if (type.IsMixed) ThrowTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.MixedContentNotSupported)); } void CheckIfElementUsesUnsupportedConstructs(XmlQualifiedName typeName, XmlSchemaElement element) { if (element.IsAbstract) ThrowTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.AbstractElementNotSupported, element.Name)); if (element.DefaultValue != null) ThrowTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.DefaultOnElementNotSupported, element.Name)); if (element.FixedValue != null) ThrowTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.FixedOnElementNotSupported, element.Name)); if (!element.SubstitutionGroup.IsEmpty) ThrowTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.SubstitutionGroupOnElementNotSupported, element.Name)); } void ImportAttributes(XmlQualifiedName typeName, XmlSchemaObjectCollection attributes, XmlSchemaAnyAttribute anyAttribute, out bool isReference) { if (anyAttribute != null) ThrowTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.AnyAttributeNotSupported)); isReference = false; if (attributes != null) { bool foundId = false, foundRef = false; for (int i = 0; i < attributes.Count; i++) { XmlSchemaObject o = attributes[i]; if (o is XmlSchemaAttribute) { XmlSchemaAttribute attribute = (XmlSchemaAttribute)o; if (attribute.Use == XmlSchemaUse.Prohibited) continue; if (TryCheckIfAttribute(typeName, attribute, Globals.IdQualifiedName, ref foundId)) continue; if (TryCheckIfAttribute(typeName, attribute, Globals.RefQualifiedName, ref foundRef)) continue; if (attribute.RefName.IsEmpty || attribute.RefName.Namespace != Globals.SerializationNamespace || attribute.Use == XmlSchemaUse.Required) ThrowTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.TypeShouldNotContainAttributes, Globals.SerializationNamespace)); } } isReference = (foundId && foundRef); } } bool TryCheckIfAttribute(XmlQualifiedName typeName, XmlSchemaAttribute attribute, XmlQualifiedName refName, ref bool foundAttribute) { if (attribute.RefName != refName) return false; if (foundAttribute) ThrowTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.CannotHaveDuplicateAttributeNames, refName.Name)); foundAttribute = true; return true; } void AddDataContract(DataContract dataContract) { dataContractSet.Add(dataContract.StableName, dataContract); } string GetInnerText(XmlQualifiedName typeName, XmlElement xmlElement) { if (xmlElement != null) { XmlNode child = xmlElement.FirstChild; while (child != null) { if (child.NodeType == XmlNodeType.Element) ThrowTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.InvalidAnnotationExpectingText, xmlElement.LocalName, xmlElement.NamespaceURI, child.LocalName, child.NamespaceURI)); child = child.NextSibling; } return xmlElement.InnerText; } return null; } static XmlElement ImportAnnotation(XmlSchemaAnnotation annotation, XmlQualifiedName annotationQualifiedName) { if (annotation != null && annotation.Items != null && annotation.Items.Count > 0 && annotation.Items[0] is XmlSchemaAppInfo) { XmlSchemaAppInfo appInfo = (XmlSchemaAppInfo)annotation.Items[0]; XmlNode[] markup = appInfo.Markup; if (markup != null) { for (int i = 0; i < markup.Length; i++) { XmlElement annotationElement = markup[i] as XmlElement; if (annotationElement != null && annotationElement.LocalName == annotationQualifiedName.Name && annotationElement.NamespaceURI == annotationQualifiedName.Namespace) return annotationElement; } } } return null; } static void ThrowTypeCannotBeImportedException(string name, string ns, string message) { ThrowTypeCannotBeImportedException(SR.GetString(SR.TypeCannotBeImported, name, ns, message)); } static void ThrowArrayTypeCannotBeImportedException(string name, string ns, string message) { ThrowTypeCannotBeImportedException(SR.GetString(SR.ArrayTypeCannotBeImported, name, ns, message)); } static void ThrowEnumTypeCannotBeImportedException(string name, string ns, string message) { ThrowTypeCannotBeImportedException(SR.GetString(SR.EnumTypeCannotBeImported, name, ns, message)); } static void ThrowISerializableTypeCannotBeImportedException(string name, string ns, string message) { ThrowTypeCannotBeImportedException(SR.GetString(SR.ISerializableTypeCannotBeImported, name, ns, message)); } static void ThrowTypeCannotBeImportedException(string message) { throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidDataContractException(SR.GetString(SR.TypeCannotBeImportedHowToFix, message))); } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. //------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All rights reserved. //----------------------------------------------------------- namespace System.Runtime.Serialization { using System; using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Diagnostics; using System.Globalization; using System.IO; using System.Security; using System.Runtime.Diagnostics; using System.Xml; using System.Xml.Schema; using DataContractDictionary = System.Collections.Generic.Dictionary ; using SchemaObjectDictionary = System.Collections.Generic.Dictionary ; using System.Runtime.Serialization.Diagnostics; class SchemaImporter { DataContractSet dataContractSet; XmlSchemaSet schemaSet; ICollection typeNames; ICollection elements; XmlQualifiedName[] elementTypeNames; bool importXmlDataType; SchemaObjectDictionary schemaObjects; List redefineList; bool needToImportKnownTypesForObject; [Fx.Tag.SecurityNote(Critical = "Static field used to store serialization schema elements from future versions." + " Static fields are marked SecurityCritical or readonly to prevent data from being modified or leaked to other components in appdomain.")] [SecurityCritical] static Hashtable serializationSchemaElements; internal SchemaImporter(XmlSchemaSet schemas, ICollection typeNames, ICollection elements, XmlQualifiedName[] elementTypeNames, DataContractSet dataContractSet, bool importXmlDataType) { this.dataContractSet = dataContractSet; this.schemaSet = schemas; this.typeNames = typeNames; this.elements = elements; this.elementTypeNames = elementTypeNames; this.importXmlDataType = importXmlDataType; } internal void Import() { if (!schemaSet.Contains(Globals.SerializationNamespace)) { StringReader reader = new StringReader(Globals.SerializationSchema); XmlSchema schema = XmlSchema.Read(reader, null); if (schema == null) throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.CouldNotReadSerializationSchema, Globals.SerializationNamespace))); schemaSet.Add(schema); } try { CompileSchemaSet(schemaSet); } #pragma warning suppress 56500 // covered by FxCOP catch (Exception ex) { if (Fx.IsFatal(ex)) { throw; } throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentException(SR.GetString(SR.CannotImportInvalidSchemas), ex)); } if (typeNames == null) { ICollection schemaList = schemaSet.Schemas(); foreach (object schemaObj in schemaList) { if (schemaObj == null) throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentException(SR.GetString(SR.CannotImportNullSchema))); XmlSchema schema = (XmlSchema)schemaObj; if (schema.TargetNamespace != Globals.SerializationNamespace && schema.TargetNamespace != Globals.SchemaNamespace) { foreach (XmlSchemaObject typeObj in schema.SchemaTypes.Values) { ImportType((XmlSchemaType)typeObj); } foreach (XmlSchemaElement element in schema.Elements.Values) { if (element.SchemaType != null) ImportAnonymousGlobalElement(element, element.QualifiedName, schema.TargetNamespace); } } } } else { foreach (XmlQualifiedName typeName in typeNames) { if (typeName == null) throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentException(SR.GetString(SR.CannotImportNullDataContractName))); ImportType(typeName); } if (elements != null) { int i = 0; foreach (XmlSchemaElement element in elements) { XmlQualifiedName typeName = element.SchemaTypeName; if (typeName != null && typeName.Name.Length > 0) { elementTypeNames[i++] = ImportType(typeName).StableName; } else { XmlSchema schema = SchemaHelper.GetSchemaWithGlobalElementDeclaration(element, schemaSet); if (schema == null) { elementTypeNames[i++] = ImportAnonymousElement(element, element.QualifiedName).StableName; } else { elementTypeNames[i++] = ImportAnonymousGlobalElement(element, element.QualifiedName, schema.TargetNamespace).StableName; } } } } } ImportKnownTypesForObject(); } internal static void CompileSchemaSet(XmlSchemaSet schemaSet) { if (schemaSet.Contains(XmlSchema.Namespace)) schemaSet.Compile(); else { // Add base XSD schema with top level element named "schema" XmlSchema xsdSchema = new XmlSchema(); xsdSchema.TargetNamespace = XmlSchema.Namespace; XmlSchemaElement element = new XmlSchemaElement(); element.Name = Globals.SchemaLocalName; element.SchemaType = new XmlSchemaComplexType(); xsdSchema.Items.Add(element); schemaSet.Add(xsdSchema); schemaSet.Compile(); } } SchemaObjectDictionary SchemaObjects { get { if (schemaObjects == null) schemaObjects = CreateSchemaObjects(); return schemaObjects; } } List RedefineList { get { if (redefineList == null) redefineList = CreateRedefineList(); return redefineList; } } void ImportKnownTypes(XmlQualifiedName typeName) { SchemaObjectInfo schemaObjectInfo; if (SchemaObjects.TryGetValue(typeName, out schemaObjectInfo)) { List knownTypes = schemaObjectInfo.knownTypes; if (knownTypes != null) { foreach (XmlSchemaType knownType in knownTypes) ImportType(knownType); } } } internal static bool IsObjectContract(DataContract dataContract) { HashSet previousCollectionTypes = new HashSet (); while (dataContract is CollectionDataContract && !previousCollectionTypes.Contains(dataContract.OriginalUnderlyingType)) { previousCollectionTypes.Add(dataContract.OriginalUnderlyingType); dataContract = ((CollectionDataContract)dataContract).ItemContract; } return dataContract is PrimitiveDataContract && ((PrimitiveDataContract)dataContract).UnderlyingType == Globals.TypeOfObject; } void ImportKnownTypesForObject() { if (!needToImportKnownTypesForObject) return; needToImportKnownTypesForObject = false; if (dataContractSet.KnownTypesForObject == null) { SchemaObjectInfo schemaObjectInfo; if (SchemaObjects.TryGetValue(SchemaExporter.AnytypeQualifiedName, out schemaObjectInfo)) { List knownTypes = schemaObjectInfo.knownTypes; if (knownTypes != null) { DataContractDictionary knownDataContracts = new DataContractDictionary(); foreach (XmlSchemaType knownType in knownTypes) { // Expected: will throw exception if schema set contains types that are not supported DataContract dataContract = ImportType(knownType); DataContract existingContract; if (!knownDataContracts.TryGetValue(dataContract.StableName, out existingContract)) { knownDataContracts.Add(dataContract.StableName, dataContract); } } dataContractSet.KnownTypesForObject = knownDataContracts; } } } } internal SchemaObjectDictionary CreateSchemaObjects() { SchemaObjectDictionary schemaObjects = new SchemaObjectDictionary(); ICollection schemaList = schemaSet.Schemas(); List knownTypesForObject = new List (); schemaObjects.Add(SchemaExporter.AnytypeQualifiedName, new SchemaObjectInfo(null, null, null, knownTypesForObject)); foreach (XmlSchema schema in schemaList) { if (schema.TargetNamespace != Globals.SerializationNamespace) { foreach (XmlSchemaObject schemaObj in schema.SchemaTypes.Values) { XmlSchemaType schemaType = schemaObj as XmlSchemaType; if (schemaType != null) { knownTypesForObject.Add(schemaType); XmlQualifiedName currentTypeName = new XmlQualifiedName(schemaType.Name, schema.TargetNamespace); SchemaObjectInfo schemaObjectInfo; if (schemaObjects.TryGetValue(currentTypeName, out schemaObjectInfo)) { schemaObjectInfo.type = schemaType; schemaObjectInfo.schema = schema; } else { schemaObjects.Add(currentTypeName, new SchemaObjectInfo(schemaType, null, schema, null)); } XmlQualifiedName baseTypeName = GetBaseTypeName(schemaType); if (baseTypeName != null) { SchemaObjectInfo baseTypeInfo; if (schemaObjects.TryGetValue(baseTypeName, out baseTypeInfo)) { if (baseTypeInfo.knownTypes == null) { baseTypeInfo.knownTypes = new List (); } } else { baseTypeInfo = new SchemaObjectInfo(null, null, null, new List ()); schemaObjects.Add(baseTypeName, baseTypeInfo); } baseTypeInfo.knownTypes.Add(schemaType); } } } foreach (XmlSchemaObject schemaObj in schema.Elements.Values) { XmlSchemaElement schemaElement = schemaObj as XmlSchemaElement; if (schemaElement != null) { XmlQualifiedName currentElementName = new XmlQualifiedName(schemaElement.Name, schema.TargetNamespace); SchemaObjectInfo schemaObjectInfo; if (schemaObjects.TryGetValue(currentElementName, out schemaObjectInfo)) { schemaObjectInfo.element = schemaElement; schemaObjectInfo.schema = schema; } else { schemaObjects.Add(currentElementName, new SchemaObjectInfo(null, schemaElement, schema, null)); } } } } } return schemaObjects; } XmlQualifiedName GetBaseTypeName(XmlSchemaType type) { XmlQualifiedName baseTypeName = null; XmlSchemaComplexType complexType = type as XmlSchemaComplexType; if (complexType != null) { if (complexType.ContentModel != null) { XmlSchemaComplexContent complexContent = complexType.ContentModel as XmlSchemaComplexContent; if (complexContent != null) { XmlSchemaComplexContentExtension extension = complexContent.Content as XmlSchemaComplexContentExtension; if (extension != null) baseTypeName = extension.BaseTypeName; } } } return baseTypeName; } List CreateRedefineList() { List list = new List (); ICollection schemaList = schemaSet.Schemas(); foreach (object schemaObj in schemaList) { XmlSchema schema = schemaObj as XmlSchema; if (schema == null) continue; foreach (XmlSchemaExternal ext in schema.Includes) { XmlSchemaRedefine redefine = ext as XmlSchemaRedefine; if (redefine != null) list.Add(redefine); } } return list; } [Fx.Tag.SecurityNote(Critical = "Sets critical properties on XmlDataContract.", Safe = "Called during schema import/code generation.")] [SecuritySafeCritical] DataContract ImportAnonymousGlobalElement(XmlSchemaElement element, XmlQualifiedName typeQName, string ns) { DataContract contract = ImportAnonymousElement(element, typeQName); XmlDataContract xmlDataContract = contract as XmlDataContract; if (xmlDataContract != null) { xmlDataContract.SetTopLevelElementName(new XmlQualifiedName(element.Name, ns)); xmlDataContract.IsTopLevelElementNullable = element.IsNillable; } return contract; } DataContract ImportAnonymousElement(XmlSchemaElement element, XmlQualifiedName typeQName) { if (SchemaHelper.GetSchemaType(SchemaObjects, typeQName) != null) { for (int i = 1; ; i++) { typeQName = new XmlQualifiedName(typeQName.Name + i.ToString(NumberFormatInfo.InvariantInfo), typeQName.Namespace); if (SchemaHelper.GetSchemaType(SchemaObjects, typeQName) == null) break; if (i == Int32.MaxValue) throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidDataContractException(SR.GetString(SR.CannotComputeUniqueName, element.Name))); } } if (element.SchemaType == null) return ImportType(SchemaExporter.AnytypeQualifiedName); else return ImportType(element.SchemaType, typeQName, true/*isAnonymous*/); } DataContract ImportType(XmlQualifiedName typeName) { DataContract dataContract = DataContract.GetBuiltInDataContract(typeName.Name, typeName.Namespace); if (dataContract == null) { XmlSchemaType type = SchemaHelper.GetSchemaType(SchemaObjects, typeName); if (type == null) throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidDataContractException(SR.GetString(SR.SpecifiedTypeNotFoundInSchema, typeName.Name, typeName.Namespace))); dataContract = ImportType(type); } if (IsObjectContract(dataContract)) needToImportKnownTypesForObject = true; return dataContract; } DataContract ImportType(XmlSchemaType type) { return ImportType(type, type.QualifiedName, false/*isAnonymous*/); } DataContract ImportType(XmlSchemaType type, XmlQualifiedName typeName, bool isAnonymous) { DataContract dataContract = dataContractSet[typeName]; if (dataContract != null) return dataContract; InvalidDataContractException invalidContractException; try { foreach (XmlSchemaRedefine redefine in RedefineList) { if (redefine.SchemaTypes[typeName] != null) ThrowTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.RedefineNotSupported)); } if (type is XmlSchemaSimpleType) { XmlSchemaSimpleType simpleType = (XmlSchemaSimpleType)type; XmlSchemaSimpleTypeContent content = simpleType.Content; if (content is XmlSchemaSimpleTypeUnion) ThrowTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.SimpleTypeUnionNotSupported)); else if (content is XmlSchemaSimpleTypeList) dataContract = ImportFlagsEnum(typeName, (XmlSchemaSimpleTypeList)content, simpleType.Annotation); else if (content is XmlSchemaSimpleTypeRestriction) { XmlSchemaSimpleTypeRestriction restriction = (XmlSchemaSimpleTypeRestriction)content; if (CheckIfEnum(restriction)) dataContract = ImportEnum(typeName, restriction, false /*isFlags*/, simpleType.Annotation); else dataContract = ImportSimpleTypeRestriction(typeName, restriction); } } else if (type is XmlSchemaComplexType) { XmlSchemaComplexType complexType = (XmlSchemaComplexType)type; if (complexType.ContentModel == null) { CheckComplexType(typeName, complexType); dataContract = ImportType(typeName, complexType.Particle, complexType.Attributes, complexType.AnyAttribute, null /* baseTypeName */, complexType.Annotation); } else { XmlSchemaContentModel contentModel = complexType.ContentModel; if (contentModel is XmlSchemaSimpleContent) ThrowTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.SimpleContentNotSupported)); else if (contentModel is XmlSchemaComplexContent) { XmlSchemaComplexContent complexContent = (XmlSchemaComplexContent)contentModel; if (complexContent.IsMixed) ThrowTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.MixedContentNotSupported)); if (complexContent.Content is XmlSchemaComplexContentExtension) { XmlSchemaComplexContentExtension extension = (XmlSchemaComplexContentExtension)complexContent.Content; dataContract = ImportType(typeName, extension.Particle, extension.Attributes, extension.AnyAttribute, extension.BaseTypeName, complexType.Annotation); } else if (complexContent.Content is XmlSchemaComplexContentRestriction) { XmlSchemaComplexContentRestriction restriction = (XmlSchemaComplexContentRestriction)complexContent.Content; XmlQualifiedName baseTypeName = restriction.BaseTypeName; if (baseTypeName == SchemaExporter.AnytypeQualifiedName) dataContract = ImportType(typeName, restriction.Particle, restriction.Attributes, restriction.AnyAttribute, null /* baseTypeName */, complexType.Annotation); else ThrowTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.ComplexTypeRestrictionNotSupported)); } } } } if (dataContract == null) ThrowTypeCannotBeImportedException(typeName.Name, typeName.Namespace, String.Empty); if (type.QualifiedName != XmlQualifiedName.Empty) ImportTopLevelElement(typeName); ImportDataContractExtension(type, dataContract); ImportGenericInfo(type, dataContract); ImportKnownTypes(typeName); return dataContract; } catch (InvalidDataContractException e) { invalidContractException = e; } // Execution gets to this point if InvalidDataContractException was thrown if (importXmlDataType) { RemoveFailedContract(typeName); return ImportXmlDataType(typeName, type, isAnonymous); } Type referencedType; if (dataContractSet.TryGetReferencedType(typeName, dataContract, out referencedType) || (string.IsNullOrEmpty(type.Name) && dataContractSet.TryGetReferencedType(ImportActualType(type.Annotation, typeName, typeName), dataContract, out referencedType))) { if (Globals.TypeOfIXmlSerializable.IsAssignableFrom(referencedType)) { RemoveFailedContract(typeName); return ImportXmlDataType(typeName, type, isAnonymous); } } XmlDataContract specialContract = ImportSpecialXmlDataType(type, isAnonymous); if (specialContract != null) { this.dataContractSet.Remove(typeName); return specialContract; } throw invalidContractException; } private void RemoveFailedContract(XmlQualifiedName typeName) { ClassDataContract oldContract = this.dataContractSet[typeName] as ClassDataContract; this.dataContractSet.Remove(typeName); if (oldContract != null) { ClassDataContract ancestorDataContract = oldContract.BaseContract; while (ancestorDataContract != null) { ancestorDataContract.KnownDataContracts.Remove(typeName); ancestorDataContract = ancestorDataContract.BaseContract; } if (dataContractSet.KnownTypesForObject != null) dataContractSet.KnownTypesForObject.Remove(typeName); } } bool CheckIfEnum(XmlSchemaSimpleTypeRestriction restriction) { foreach (XmlSchemaFacet facet in restriction.Facets) { if (!(facet is XmlSchemaEnumerationFacet)) return false; } XmlQualifiedName expectedBase = SchemaExporter.StringQualifiedName; if (restriction.BaseTypeName != XmlQualifiedName.Empty) { return ((restriction.BaseTypeName == expectedBase && restriction.Facets.Count > 0) || ImportType(restriction.BaseTypeName) is EnumDataContract); } else if (restriction.BaseType != null) { DataContract baseContract = ImportType(restriction.BaseType); return (baseContract.StableName == expectedBase || baseContract is EnumDataContract); } return false; } bool CheckIfCollection(XmlSchemaSequence rootSequence) { if (rootSequence.Items == null || rootSequence.Items.Count == 0) return false; RemoveOptionalUnknownSerializationElements(rootSequence.Items); if (rootSequence.Items.Count != 1) return false; XmlSchemaObject o = rootSequence.Items[0]; if (!(o is XmlSchemaElement)) return false; XmlSchemaElement localElement = (XmlSchemaElement)o; return (localElement.MaxOccursString == Globals.OccursUnbounded || localElement.MaxOccurs > 1); } bool CheckIfISerializable(XmlSchemaSequence rootSequence, XmlSchemaObjectCollection attributes) { if (rootSequence.Items == null || rootSequence.Items.Count == 0) return false; RemoveOptionalUnknownSerializationElements(rootSequence.Items); if (attributes == null || attributes.Count == 0) return false; return (rootSequence.Items.Count == 1 && rootSequence.Items[0] is XmlSchemaAny); } [Fx.Tag.SecurityNote(Critical = "Initializes critical static fields.", Safe = "Doesn't leak anything.")] [SecuritySafeCritical] void RemoveOptionalUnknownSerializationElements(XmlSchemaObjectCollection items) { for (int i = 0; i < items.Count; i++) { XmlSchemaElement element = items[i] as XmlSchemaElement; if (element != null && element.RefName != null && element.RefName.Namespace == Globals.SerializationNamespace && element.MinOccurs == 0) { if (serializationSchemaElements == null) { XmlSchema serializationSchema = XmlSchema.Read(XmlReader.Create(new StringReader(Globals.SerializationSchema)), null); serializationSchemaElements = new Hashtable(); foreach (XmlSchemaObject schemaObject in serializationSchema.Items) { XmlSchemaElement schemaElement = schemaObject as XmlSchemaElement; if (schemaElement != null) serializationSchemaElements.Add(schemaElement.Name, schemaElement); } } if (!serializationSchemaElements.ContainsKey(element.RefName.Name)) { items.RemoveAt(i); i--; } } } } DataContract ImportType(XmlQualifiedName typeName, XmlSchemaParticle rootParticle, XmlSchemaObjectCollection attributes, XmlSchemaAnyAttribute anyAttribute, XmlQualifiedName baseTypeName, XmlSchemaAnnotation annotation) { DataContract dataContract = null; bool isDerived = (baseTypeName != null); bool isReference; ImportAttributes(typeName, attributes, anyAttribute, out isReference); if (rootParticle == null) dataContract = ImportClass(typeName, new XmlSchemaSequence(), baseTypeName, annotation, isReference); else if (!(rootParticle is XmlSchemaSequence)) ThrowTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.RootParticleMustBeSequence)); else { XmlSchemaSequence rootSequence = (XmlSchemaSequence)rootParticle; if (rootSequence.MinOccurs != 1) ThrowTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.RootSequenceMustBeRequired)); if (rootSequence.MaxOccurs != 1) ThrowTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.RootSequenceMaxOccursMustBe)); if (!isDerived && CheckIfCollection(rootSequence)) dataContract = ImportCollection(typeName, rootSequence, attributes, annotation, isReference); else if (CheckIfISerializable(rootSequence, attributes)) dataContract = ImportISerializable(typeName, rootSequence, baseTypeName, attributes, annotation); else dataContract = ImportClass(typeName, rootSequence, baseTypeName, annotation, isReference); } return dataContract; } [Fx.Tag.SecurityNote(Critical = "Sets critical properties on ClassDataContract.", Safe = "Called during schema import/code generation.")] [SecuritySafeCritical] ClassDataContract ImportClass(XmlQualifiedName typeName, XmlSchemaSequence rootSequence, XmlQualifiedName baseTypeName, XmlSchemaAnnotation annotation, bool isReference) { ClassDataContract dataContract = new ClassDataContract(); dataContract.StableName = typeName; AddDataContract(dataContract); dataContract.IsValueType = IsValueType(typeName, annotation); dataContract.IsReference = isReference; if (baseTypeName != null) { ImportBaseContract(baseTypeName, dataContract); if (dataContract.BaseContract.IsISerializable) { if (IsISerializableDerived(typeName, rootSequence)) dataContract.IsISerializable = true; else ThrowTypeCannotBeImportedException(dataContract.StableName.Name, dataContract.StableName.Namespace, SR.GetString(SR.DerivedTypeNotISerializable, baseTypeName.Name, baseTypeName.Namespace)); } if (dataContract.BaseContract.IsReference) { dataContract.IsReference = true; } } if (!dataContract.IsISerializable) { dataContract.Members = new List (); RemoveOptionalUnknownSerializationElements(rootSequence.Items); for (int memberIndex = 0; memberIndex < rootSequence.Items.Count; memberIndex++) { XmlSchemaElement element = rootSequence.Items[memberIndex] as XmlSchemaElement; if (element == null) ThrowTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.MustContainOnlyLocalElements)); ImportClassMember(element, dataContract); } } return dataContract; } [Fx.Tag.SecurityNote(Critical = "Sets critical properties on XmlDataContract.", Safe = "Called during schema import/code generation.")] [SecuritySafeCritical] DataContract ImportXmlDataType(XmlQualifiedName typeName, XmlSchemaType xsdType, bool isAnonymous) { DataContract dataContract = dataContractSet[typeName]; if (dataContract != null) return dataContract; XmlDataContract xmlDataContract = ImportSpecialXmlDataType(xsdType, isAnonymous); if (xmlDataContract != null) return xmlDataContract; xmlDataContract = new XmlDataContract(); xmlDataContract.StableName = typeName; xmlDataContract.IsValueType = false; AddDataContract(xmlDataContract); if (xsdType != null) { ImportDataContractExtension(xsdType, xmlDataContract); xmlDataContract.IsValueType = IsValueType(typeName, xsdType.Annotation); xmlDataContract.IsTypeDefinedOnImport = true; xmlDataContract.XsdType = isAnonymous ? xsdType : null; xmlDataContract.HasRoot = !IsXmlAnyElementType(xsdType as XmlSchemaComplexType); } else { //Value type can be used by both nillable and non-nillable elements but reference type cannot be used by non nillable elements xmlDataContract.IsValueType = true; xmlDataContract.IsTypeDefinedOnImport = false; xmlDataContract.HasRoot = true; if (DiagnosticUtility.ShouldTraceVerbose) { TraceUtility.Trace(TraceEventType.Verbose, TraceCode.XsdImportAnnotationFailed, SR.GetString(SR.TraceCodeXsdImportAnnotationFailed), new StringTraceRecord("Type", typeName.Namespace + ":" + typeName.Name)); } } if (!isAnonymous) { bool isNullable; xmlDataContract.SetTopLevelElementName(SchemaHelper.GetGlobalElementDeclaration(schemaSet, typeName, out isNullable)); xmlDataContract.IsTopLevelElementNullable = isNullable; } return xmlDataContract; } private XmlDataContract ImportSpecialXmlDataType(XmlSchemaType xsdType, bool isAnonymous) { if (!isAnonymous) return null; XmlSchemaComplexType complexType = xsdType as XmlSchemaComplexType; if (complexType == null) return null; if (IsXmlAnyElementType(complexType)) { //check if the type is XElement XmlQualifiedName xlinqTypeName = new XmlQualifiedName("XElement", "http://schemas.datacontract.org/2004/07/System.Xml.Linq"); Type referencedType; if (dataContractSet.TryGetReferencedType(xlinqTypeName, null, out referencedType) && Globals.TypeOfIXmlSerializable.IsAssignableFrom(referencedType)) { XmlDataContract xmlDataContract = new XmlDataContract(referencedType); AddDataContract(xmlDataContract); return xmlDataContract; } //otherwise, assume XmlElement return (XmlDataContract)DataContract.GetBuiltInDataContract(Globals.TypeOfXmlElement); } if (IsXmlAnyType(complexType)) return (XmlDataContract)DataContract.GetBuiltInDataContract(Globals.TypeOfXmlNodeArray); return null; } bool IsXmlAnyElementType(XmlSchemaComplexType xsdType) { if (xsdType == null) return false; XmlSchemaSequence sequence = xsdType.Particle as XmlSchemaSequence; if (sequence == null) return false; if (sequence.Items == null || sequence.Items.Count != 1) return false; XmlSchemaAny any = sequence.Items[0] as XmlSchemaAny; if (any == null || any.Namespace != null) return false; if (xsdType.AnyAttribute != null || (xsdType.Attributes != null && xsdType.Attributes.Count > 0)) return false; return true; } bool IsXmlAnyType(XmlSchemaComplexType xsdType) { if (xsdType == null) return false; XmlSchemaSequence sequence = xsdType.Particle as XmlSchemaSequence; if (sequence == null) return false; if (sequence.Items == null || sequence.Items.Count != 1) return false; XmlSchemaAny any = sequence.Items[0] as XmlSchemaAny; if (any == null || any.Namespace != null) return false; if (any.MaxOccurs != Decimal.MaxValue) return false; if (xsdType.AnyAttribute == null || xsdType.Attributes.Count > 0) return false; return true; } bool IsValueType(XmlQualifiedName typeName, XmlSchemaAnnotation annotation) { string isValueTypeInnerText = GetInnerText(typeName, ImportAnnotation(annotation, SchemaExporter.IsValueTypeName)); if (isValueTypeInnerText != null) { try { return XmlConvert.ToBoolean(isValueTypeInnerText); } catch (FormatException fe) { ThrowTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.IsValueTypeFormattedIncorrectly, isValueTypeInnerText, fe.Message)); } } return false; } [Fx.Tag.SecurityNote(Critical = "Sets critical properties on ClassDataContract.", Safe = "Called during schema import/code generation.")] [SecuritySafeCritical] ClassDataContract ImportISerializable(XmlQualifiedName typeName, XmlSchemaSequence rootSequence, XmlQualifiedName baseTypeName, XmlSchemaObjectCollection attributes, XmlSchemaAnnotation annotation) { ClassDataContract dataContract = new ClassDataContract(); dataContract.StableName = typeName; dataContract.IsISerializable = true; AddDataContract(dataContract); dataContract.IsValueType = IsValueType(typeName, annotation); if (baseTypeName == null) CheckISerializableBase(typeName, rootSequence, attributes); else { ImportBaseContract(baseTypeName, dataContract); if (!dataContract.BaseContract.IsISerializable) ThrowISerializableTypeCannotBeImportedException(dataContract.StableName.Name, dataContract.StableName.Namespace, SR.GetString(SR.BaseTypeNotISerializable, baseTypeName.Name, baseTypeName.Namespace)); if (!IsISerializableDerived(typeName, rootSequence)) ThrowISerializableTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.ISerializableDerivedContainsOneOrMoreItems)); } return dataContract; } void CheckISerializableBase(XmlQualifiedName typeName, XmlSchemaSequence rootSequence, XmlSchemaObjectCollection attributes) { if (rootSequence == null) ThrowISerializableTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.ISerializableDoesNotContainAny)); if (rootSequence.Items == null || rootSequence.Items.Count < 1) ThrowISerializableTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.ISerializableDoesNotContainAny)); else if (rootSequence.Items.Count > 1) ThrowISerializableTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.ISerializableContainsMoreThanOneItems)); XmlSchemaObject o = rootSequence.Items[0]; if (!(o is XmlSchemaAny)) ThrowISerializableTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.ISerializableDoesNotContainAny)); XmlSchemaAny wildcard = (XmlSchemaAny)o; XmlSchemaAny iSerializableWildcardElement = SchemaExporter.ISerializableWildcardElement; if (wildcard.MinOccurs != iSerializableWildcardElement.MinOccurs) ThrowISerializableTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.ISerializableWildcardMinOccursMustBe, iSerializableWildcardElement.MinOccurs)); if (wildcard.MaxOccursString != iSerializableWildcardElement.MaxOccursString) ThrowISerializableTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.ISerializableWildcardMaxOccursMustBe, iSerializableWildcardElement.MaxOccursString)); if (wildcard.Namespace != iSerializableWildcardElement.Namespace) ThrowISerializableTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.ISerializableWildcardNamespaceInvalid, iSerializableWildcardElement.Namespace)); if (wildcard.ProcessContents != iSerializableWildcardElement.ProcessContents) ThrowISerializableTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.ISerializableWildcardProcessContentsInvalid, iSerializableWildcardElement.ProcessContents)); XmlQualifiedName factoryTypeAttributeRefName = SchemaExporter.ISerializableFactoryTypeAttribute.RefName; bool containsFactoryTypeAttribute = false; if (attributes != null) { for (int i = 0; i < attributes.Count; i++) { o = attributes[i]; if (o is XmlSchemaAttribute) { if (((XmlSchemaAttribute)o).RefName == factoryTypeAttributeRefName) { containsFactoryTypeAttribute = true; break; } } } } if (!containsFactoryTypeAttribute) ThrowISerializableTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.ISerializableMustRefFactoryTypeAttribute, factoryTypeAttributeRefName.Name, factoryTypeAttributeRefName.Namespace)); } bool IsISerializableDerived(XmlQualifiedName typeName, XmlSchemaSequence rootSequence) { return (rootSequence == null || rootSequence.Items == null || rootSequence.Items.Count == 0); } [Fx.Tag.SecurityNote(Critical = "Sets critical BaseContract property on ClassDataContract.", Safe = "Called during schema import/code generation.")] [SecuritySafeCritical] void ImportBaseContract(XmlQualifiedName baseTypeName, ClassDataContract dataContract) { ClassDataContract baseContract = ImportType(baseTypeName) as ClassDataContract; if (baseContract == null) ThrowTypeCannotBeImportedException(dataContract.StableName.Name, dataContract.StableName.Namespace, SR.GetString(dataContract.IsISerializable ? SR.InvalidISerializableDerivation : SR.InvalidClassDerivation, baseTypeName.Name, baseTypeName.Namespace)); // Note: code ignores IsValueType annotation if derived type exists if (baseContract.IsValueType) baseContract.IsValueType = false; ClassDataContract ancestorDataContract = baseContract; while (ancestorDataContract != null) { DataContractDictionary knownDataContracts = ancestorDataContract.KnownDataContracts; if (knownDataContracts == null) { knownDataContracts = new DataContractDictionary(); ancestorDataContract.KnownDataContracts = knownDataContracts; } knownDataContracts.Add(dataContract.StableName, dataContract); ancestorDataContract = ancestorDataContract.BaseContract; } dataContract.BaseContract = baseContract; } void ImportTopLevelElement(XmlQualifiedName typeName) { XmlSchemaElement topLevelElement = SchemaHelper.GetSchemaElement(SchemaObjects, typeName); // Top level element of same name is not required, but is validated if it is present if (topLevelElement == null) return; else { XmlQualifiedName elementTypeName = topLevelElement.SchemaTypeName; if (elementTypeName.IsEmpty) { if (topLevelElement.SchemaType != null) ThrowTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.AnonymousTypeNotSupported, typeName.Name, typeName.Namespace)); else elementTypeName = SchemaExporter.AnytypeQualifiedName; } if (elementTypeName != typeName) ThrowTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.TopLevelElementRepresentsDifferentType, topLevelElement.SchemaTypeName.Name, topLevelElement.SchemaTypeName.Namespace)); CheckIfElementUsesUnsupportedConstructs(typeName, topLevelElement); } } void ImportClassMember(XmlSchemaElement element, ClassDataContract dataContract) { XmlQualifiedName typeName = dataContract.StableName; if (element.MinOccurs > 1) ThrowTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.ElementMinOccursMustBe, element.Name)); if (element.MaxOccurs != 1) ThrowTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.ElementMaxOccursMustBe, element.Name)); DataContract memberTypeContract = null; string memberName = element.Name; bool memberIsRequired = (element.MinOccurs > 0); bool memberIsNullable = element.IsNillable; bool memberEmitDefaultValue; int memberOrder = 0; XmlSchemaForm elementForm = (element.Form == XmlSchemaForm.None) ? SchemaHelper.GetSchemaWithType(SchemaObjects, schemaSet, typeName).ElementFormDefault : element.Form; if (elementForm != XmlSchemaForm.Qualified) ThrowTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.FormMustBeQualified, element.Name)); CheckIfElementUsesUnsupportedConstructs(typeName, element); if (element.SchemaTypeName.IsEmpty) { if (element.SchemaType != null) memberTypeContract = ImportAnonymousElement(element, new XmlQualifiedName(String.Format(CultureInfo.InvariantCulture, "{0}.{1}Type", typeName.Name, element.Name), typeName.Namespace)); else if (!element.RefName.IsEmpty) ThrowTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.ElementRefOnLocalElementNotSupported, element.RefName.Name, element.RefName.Namespace)); else memberTypeContract = ImportType(SchemaExporter.AnytypeQualifiedName); } else { XmlQualifiedName memberTypeName = ImportActualType(element.Annotation, element.SchemaTypeName, typeName); memberTypeContract = ImportType(memberTypeName); if (IsObjectContract(memberTypeContract)) needToImportKnownTypesForObject = true; } bool? emitDefaultValueFromAnnotation = ImportEmitDefaultValue(element.Annotation, typeName); if (!memberTypeContract.IsValueType && !memberIsNullable) { if (emitDefaultValueFromAnnotation != null && emitDefaultValueFromAnnotation.Value) throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidDataContractException(SR.GetString(SR.InvalidEmitDefaultAnnotation, memberName, typeName.Name, typeName.Namespace))); memberEmitDefaultValue = false; } else memberEmitDefaultValue = emitDefaultValueFromAnnotation != null ? emitDefaultValueFromAnnotation.Value : Globals.DefaultEmitDefaultValue; int prevMemberIndex = dataContract.Members.Count - 1; if (prevMemberIndex >= 0) { DataMember prevMember = dataContract.Members[prevMemberIndex]; if (prevMember.Order > Globals.DefaultOrder) memberOrder = dataContract.Members.Count; DataMember currentMember = new DataMember(memberTypeContract, memberName, memberIsNullable, memberIsRequired, memberEmitDefaultValue, memberOrder); int compare = ClassDataContract.DataMemberComparer.Singleton.Compare(prevMember, currentMember); if (compare == 0) ThrowTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.CannotHaveDuplicateElementNames, memberName)); else if (compare > 0) memberOrder = dataContract.Members.Count; } DataMember dataMember = new DataMember(memberTypeContract, memberName, memberIsNullable, memberIsRequired, memberEmitDefaultValue, memberOrder); XmlQualifiedName surrogateDataAnnotationName = SchemaExporter.SurrogateDataAnnotationName; dataContractSet.SetSurrogateData(dataMember, ImportSurrogateData(ImportAnnotation(element.Annotation, surrogateDataAnnotationName), surrogateDataAnnotationName.Name, surrogateDataAnnotationName.Namespace)); dataContract.Members.Add(dataMember); } private bool? ImportEmitDefaultValue(XmlSchemaAnnotation annotation, XmlQualifiedName typeName) { XmlElement defaultValueElement = ImportAnnotation(annotation, SchemaExporter.DefaultValueAnnotation); if (defaultValueElement == null) return null; XmlNode emitDefaultValueAttribute = defaultValueElement.Attributes.GetNamedItem(Globals.EmitDefaultValueAttribute); string emitDefaultValueString = (emitDefaultValueAttribute == null) ? null : emitDefaultValueAttribute.Value; if (emitDefaultValueString == null) throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidDataContractException(SR.GetString(SR.AnnotationAttributeNotFound, SchemaExporter.DefaultValueAnnotation.Name, typeName.Name, typeName.Namespace, Globals.EmitDefaultValueAttribute))); return XmlConvert.ToBoolean(emitDefaultValueString); } internal static XmlQualifiedName ImportActualType(XmlSchemaAnnotation annotation, XmlQualifiedName defaultTypeName, XmlQualifiedName typeName) { XmlElement actualTypeElement = ImportAnnotation(annotation, SchemaExporter.ActualTypeAnnotationName); if (actualTypeElement == null) return defaultTypeName; XmlNode nameAttribute = actualTypeElement.Attributes.GetNamedItem(Globals.ActualTypeNameAttribute); string name = (nameAttribute == null) ? null : nameAttribute.Value; if (name == null) throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidDataContractException(SR.GetString(SR.AnnotationAttributeNotFound, SchemaExporter.ActualTypeAnnotationName.Name, typeName.Name, typeName.Namespace, Globals.ActualTypeNameAttribute))); XmlNode nsAttribute = actualTypeElement.Attributes.GetNamedItem(Globals.ActualTypeNamespaceAttribute); string ns = (nsAttribute == null) ? null : nsAttribute.Value; if (ns == null) throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidDataContractException(SR.GetString(SR.AnnotationAttributeNotFound, SchemaExporter.ActualTypeAnnotationName.Name, typeName.Name, typeName.Namespace, Globals.ActualTypeNamespaceAttribute))); return new XmlQualifiedName(name, ns); } [Fx.Tag.SecurityNote(Critical = "Sets critical properties on CollectionDataContract.", Safe = "Called during schema import/code generation.")] [SecuritySafeCritical] CollectionDataContract ImportCollection(XmlQualifiedName typeName, XmlSchemaSequence rootSequence, XmlSchemaObjectCollection attributes, XmlSchemaAnnotation annotation, bool isReference) { CollectionDataContract dataContract = new CollectionDataContract(CollectionKind.Array); dataContract.StableName = typeName; AddDataContract(dataContract); dataContract.IsReference = isReference; // CheckIfCollection has already checked if sequence contains exactly one item with maxOccurs="unbounded" or maxOccurs > 1 XmlSchemaElement element = (XmlSchemaElement)rootSequence.Items[0]; dataContract.IsItemTypeNullable = element.IsNillable; dataContract.ItemName = element.Name; XmlSchemaForm elementForm = (element.Form == XmlSchemaForm.None) ? SchemaHelper.GetSchemaWithType(SchemaObjects, schemaSet, typeName).ElementFormDefault : element.Form; if (elementForm != XmlSchemaForm.Qualified) ThrowArrayTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.ArrayItemFormMustBe, element.Name)); CheckIfElementUsesUnsupportedConstructs(typeName, element); if (element.SchemaTypeName.IsEmpty) { if (element.SchemaType != null) { XmlQualifiedName shortName = new XmlQualifiedName(element.Name, typeName.Namespace); DataContract contract = dataContractSet[shortName]; if (contract == null) { dataContract.ItemContract = ImportAnonymousElement(element, shortName); } else { XmlQualifiedName fullName = new XmlQualifiedName(String.Format(CultureInfo.InvariantCulture, "{0}.{1}Type", typeName.Name, element.Name), typeName.Namespace); dataContract.ItemContract = ImportAnonymousElement(element, fullName); } } else if (!element.RefName.IsEmpty) ThrowArrayTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.ElementRefOnLocalElementNotSupported, element.RefName.Name, element.RefName.Namespace)); else dataContract.ItemContract = ImportType(SchemaExporter.AnytypeQualifiedName); } else { dataContract.ItemContract = ImportType(element.SchemaTypeName); } if (IsDictionary(typeName, annotation)) { ClassDataContract keyValueContract = dataContract.ItemContract as ClassDataContract; DataMember key = null, value = null; if (keyValueContract == null || keyValueContract.Members == null || keyValueContract.Members.Count != 2 || !(key = keyValueContract.Members[0]).IsRequired || !(value = keyValueContract.Members[1]).IsRequired) { ThrowArrayTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.InvalidKeyValueType, element.Name)); } if (keyValueContract.Namespace != dataContract.Namespace) { ThrowArrayTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.InvalidKeyValueTypeNamespace, element.Name, keyValueContract.Namespace)); } keyValueContract.IsValueType = true; dataContract.KeyName = key.Name; dataContract.ValueName = value.Name; if (element.SchemaType != null) { dataContractSet.Remove(keyValueContract.StableName); GenericInfo genericInfo = new GenericInfo(DataContract.GetStableName(Globals.TypeOfKeyValue), Globals.TypeOfKeyValue.FullName); genericInfo.Add(GetGenericInfoForDataMember(key)); genericInfo.Add(GetGenericInfoForDataMember(value)); genericInfo.AddToLevel(0, 2); dataContract.ItemContract.StableName = new XmlQualifiedName(genericInfo.GetExpandedStableName().Name, typeName.Namespace); } } return dataContract; } GenericInfo GetGenericInfoForDataMember(DataMember dataMember) { GenericInfo genericInfo = null; if (dataMember.MemberTypeContract.IsValueType && dataMember.IsNullable) { genericInfo = new GenericInfo(DataContract.GetStableName(Globals.TypeOfNullable), Globals.TypeOfNullable.FullName); genericInfo.Add(new GenericInfo(dataMember.MemberTypeContract.StableName, null)); } else { genericInfo = new GenericInfo(dataMember.MemberTypeContract.StableName, null); } return genericInfo; } bool IsDictionary(XmlQualifiedName typeName, XmlSchemaAnnotation annotation) { string isDictionaryInnerText = GetInnerText(typeName, ImportAnnotation(annotation, SchemaExporter.IsDictionaryAnnotationName)); if (isDictionaryInnerText != null) { try { return XmlConvert.ToBoolean(isDictionaryInnerText); } catch (FormatException fe) { ThrowTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.IsDictionaryFormattedIncorrectly, isDictionaryInnerText, fe.Message)); } } return false; } EnumDataContract ImportFlagsEnum(XmlQualifiedName typeName, XmlSchemaSimpleTypeList list, XmlSchemaAnnotation annotation) { XmlSchemaSimpleType anonymousType = list.ItemType; if (anonymousType == null) ThrowEnumTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.EnumListMustContainAnonymousType)); XmlSchemaSimpleTypeContent content = anonymousType.Content; if (content is XmlSchemaSimpleTypeUnion) ThrowEnumTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.EnumUnionInAnonymousTypeNotSupported)); else if (content is XmlSchemaSimpleTypeList) ThrowEnumTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.EnumListInAnonymousTypeNotSupported)); else if (content is XmlSchemaSimpleTypeRestriction) { XmlSchemaSimpleTypeRestriction restriction = (XmlSchemaSimpleTypeRestriction)content; if (CheckIfEnum(restriction)) return ImportEnum(typeName, restriction, true /*isFlags*/, annotation); else ThrowEnumTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.EnumRestrictionInvalid)); } return null; } [Fx.Tag.SecurityNote(Critical = "Sets critical properties on EnumDataContract.", Safe = "Called during schema import/code generation.")] [SecuritySafeCritical] EnumDataContract ImportEnum(XmlQualifiedName typeName, XmlSchemaSimpleTypeRestriction restriction, bool isFlags, XmlSchemaAnnotation annotation) { EnumDataContract dataContract = new EnumDataContract(); dataContract.StableName = typeName; dataContract.BaseContractName = ImportActualType(annotation, SchemaExporter.DefaultEnumBaseTypeName, typeName); dataContract.IsFlags = isFlags; AddDataContract(dataContract); // CheckIfEnum has already checked if baseType of restriction is string dataContract.Values = new List (); dataContract.Members = new List (); foreach (XmlSchemaFacet facet in restriction.Facets) { XmlSchemaEnumerationFacet enumFacet = facet as XmlSchemaEnumerationFacet; if (enumFacet == null) ThrowEnumTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.EnumOnlyEnumerationFacetsSupported)); if (enumFacet.Value == null) ThrowEnumTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.EnumEnumerationFacetsMustHaveValue)); string valueInnerText = GetInnerText(typeName, ImportAnnotation(enumFacet.Annotation, SchemaExporter.EnumerationValueAnnotationName)); if (valueInnerText == null) dataContract.Values.Add(SchemaExporter.GetDefaultEnumValue(isFlags, dataContract.Members.Count)); else dataContract.Values.Add(dataContract.GetEnumValueFromString(valueInnerText)); DataMember dataMember = new DataMember(enumFacet.Value); dataContract.Members.Add(dataMember); } return dataContract; } DataContract ImportSimpleTypeRestriction(XmlQualifiedName typeName, XmlSchemaSimpleTypeRestriction restriction) { DataContract dataContract = null; if (!restriction.BaseTypeName.IsEmpty) dataContract = ImportType(restriction.BaseTypeName); else if (restriction.BaseType != null) dataContract = ImportType(restriction.BaseType); else ThrowTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.SimpleTypeRestrictionDoesNotSpecifyBase)); if (dataContract.IsBuiltInDataContract) { dataContractSet.InternalAdd(typeName, dataContract); } return dataContract; } void ImportDataContractExtension(XmlSchemaType type, DataContract dataContract) { if (type.Annotation == null || type.Annotation.Items == null) return; foreach (XmlSchemaObject schemaObject in type.Annotation.Items) { XmlSchemaAppInfo appInfo = schemaObject as XmlSchemaAppInfo; if (appInfo == null) continue; if (appInfo.Markup != null) { foreach (XmlNode xmlNode in appInfo.Markup) { XmlElement typeElement = xmlNode as XmlElement; XmlQualifiedName surrogateDataAnnotationName = SchemaExporter.SurrogateDataAnnotationName; if (typeElement != null && typeElement.NamespaceURI == surrogateDataAnnotationName.Namespace && typeElement.LocalName == surrogateDataAnnotationName.Name) { object surrogateData = ImportSurrogateData(typeElement, surrogateDataAnnotationName.Name, surrogateDataAnnotationName.Namespace); dataContractSet.SetSurrogateData(dataContract, surrogateData); } } } } } [Fx.Tag.SecurityNote(Critical = "Sets critical properties on DataContract.", Safe = "Called during schema import/code generation.")] [SecuritySafeCritical] void ImportGenericInfo(XmlSchemaType type, DataContract dataContract) { if (type.Annotation == null || type.Annotation.Items == null) return; foreach (XmlSchemaObject schemaObject in type.Annotation.Items) { XmlSchemaAppInfo appInfo = schemaObject as XmlSchemaAppInfo; if (appInfo == null) continue; if (appInfo.Markup != null) { foreach (XmlNode xmlNode in appInfo.Markup) { XmlElement typeElement = xmlNode as XmlElement; if (typeElement != null && typeElement.NamespaceURI == Globals.SerializationNamespace) { if (typeElement.LocalName == Globals.GenericTypeLocalName) dataContract.GenericInfo = ImportGenericInfo(typeElement, type); } } } } } GenericInfo ImportGenericInfo(XmlElement typeElement, XmlSchemaType type) { XmlNode nameAttribute = typeElement.Attributes.GetNamedItem(Globals.GenericNameAttribute); string name = (nameAttribute == null) ? null : nameAttribute.Value; if (name == null) throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidDataContractException(SR.GetString(SR.GenericAnnotationAttributeNotFound, type.Name, Globals.GenericNameAttribute))); XmlNode nsAttribute = typeElement.Attributes.GetNamedItem(Globals.GenericNamespaceAttribute); string ns = (nsAttribute == null) ? null : nsAttribute.Value; if (ns == null) throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidDataContractException(SR.GetString(SR.GenericAnnotationAttributeNotFound, type.Name, Globals.GenericNamespaceAttribute))); if (typeElement.ChildNodes.Count > 0) //Generic Type name = DataContract.EncodeLocalName(name); int currentLevel = 0; GenericInfo genInfo = new GenericInfo(new XmlQualifiedName(name, ns), type.Name); foreach (XmlNode childNode in typeElement.ChildNodes) { XmlElement argumentElement = childNode as XmlElement; if (argumentElement == null) continue; if (argumentElement.LocalName != Globals.GenericParameterLocalName || argumentElement.NamespaceURI != Globals.SerializationNamespace) throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidDataContractException(SR.GetString(SR.GenericAnnotationHasInvalidElement, argumentElement.LocalName, argumentElement.NamespaceURI, type.Name))); XmlNode nestedLevelAttribute = argumentElement.Attributes.GetNamedItem(Globals.GenericParameterNestedLevelAttribute); int argumentLevel = 0; if (nestedLevelAttribute != null) { if (!Int32.TryParse(nestedLevelAttribute.Value, out argumentLevel)) throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidDataContractException(SR.GetString(SR.GenericAnnotationHasInvalidAttributeValue, argumentElement.LocalName, argumentElement.NamespaceURI, type.Name, nestedLevelAttribute.Value, nestedLevelAttribute.LocalName, Globals.TypeOfInt.Name))); } if (argumentLevel < currentLevel) throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidDataContractException(SR.GetString(SR.GenericAnnotationForNestedLevelMustBeIncreasing, argumentElement.LocalName, argumentElement.NamespaceURI, type.Name))); genInfo.Add(ImportGenericInfo(argumentElement, type)); genInfo.AddToLevel(argumentLevel, 1); currentLevel = argumentLevel; } XmlNode typeNestedLevelsAttribute = typeElement.Attributes.GetNamedItem(Globals.GenericParameterNestedLevelAttribute); if (typeNestedLevelsAttribute != null) { int nestedLevels = 0; if (!Int32.TryParse(typeNestedLevelsAttribute.Value, out nestedLevels)) throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidDataContractException(SR.GetString(SR.GenericAnnotationHasInvalidAttributeValue, typeElement.LocalName, typeElement.NamespaceURI, type.Name, typeNestedLevelsAttribute.Value, typeNestedLevelsAttribute.LocalName, Globals.TypeOfInt.Name))); if ((nestedLevels - 1) > currentLevel) genInfo.AddToLevel(nestedLevels - 1, 0); } return genInfo; } object ImportSurrogateData(XmlElement typeElement, string name, string ns) { if (dataContractSet.DataContractSurrogate != null && typeElement != null) { Collection knownTypes = new Collection (); DataContractSurrogateCaller.GetKnownCustomDataTypes(dataContractSet.DataContractSurrogate, knownTypes); DataContractSerializer serializer = new DataContractSerializer(Globals.TypeOfObject, name, ns, knownTypes, Int32.MaxValue, false /*ignoreExtensionDataObject*/, true /*preserveObjectReferences*/, null /*dataContractSurrogate*/); return serializer.ReadObject(new XmlNodeReader(typeElement)); } return null; } void CheckComplexType(XmlQualifiedName typeName, XmlSchemaComplexType type) { if (type.IsAbstract) ThrowTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.AbstractTypeNotSupported)); if (type.IsMixed) ThrowTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.MixedContentNotSupported)); } void CheckIfElementUsesUnsupportedConstructs(XmlQualifiedName typeName, XmlSchemaElement element) { if (element.IsAbstract) ThrowTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.AbstractElementNotSupported, element.Name)); if (element.DefaultValue != null) ThrowTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.DefaultOnElementNotSupported, element.Name)); if (element.FixedValue != null) ThrowTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.FixedOnElementNotSupported, element.Name)); if (!element.SubstitutionGroup.IsEmpty) ThrowTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.SubstitutionGroupOnElementNotSupported, element.Name)); } void ImportAttributes(XmlQualifiedName typeName, XmlSchemaObjectCollection attributes, XmlSchemaAnyAttribute anyAttribute, out bool isReference) { if (anyAttribute != null) ThrowTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.AnyAttributeNotSupported)); isReference = false; if (attributes != null) { bool foundId = false, foundRef = false; for (int i = 0; i < attributes.Count; i++) { XmlSchemaObject o = attributes[i]; if (o is XmlSchemaAttribute) { XmlSchemaAttribute attribute = (XmlSchemaAttribute)o; if (attribute.Use == XmlSchemaUse.Prohibited) continue; if (TryCheckIfAttribute(typeName, attribute, Globals.IdQualifiedName, ref foundId)) continue; if (TryCheckIfAttribute(typeName, attribute, Globals.RefQualifiedName, ref foundRef)) continue; if (attribute.RefName.IsEmpty || attribute.RefName.Namespace != Globals.SerializationNamespace || attribute.Use == XmlSchemaUse.Required) ThrowTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.TypeShouldNotContainAttributes, Globals.SerializationNamespace)); } } isReference = (foundId && foundRef); } } bool TryCheckIfAttribute(XmlQualifiedName typeName, XmlSchemaAttribute attribute, XmlQualifiedName refName, ref bool foundAttribute) { if (attribute.RefName != refName) return false; if (foundAttribute) ThrowTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.CannotHaveDuplicateAttributeNames, refName.Name)); foundAttribute = true; return true; } void AddDataContract(DataContract dataContract) { dataContractSet.Add(dataContract.StableName, dataContract); } string GetInnerText(XmlQualifiedName typeName, XmlElement xmlElement) { if (xmlElement != null) { XmlNode child = xmlElement.FirstChild; while (child != null) { if (child.NodeType == XmlNodeType.Element) ThrowTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.InvalidAnnotationExpectingText, xmlElement.LocalName, xmlElement.NamespaceURI, child.LocalName, child.NamespaceURI)); child = child.NextSibling; } return xmlElement.InnerText; } return null; } static XmlElement ImportAnnotation(XmlSchemaAnnotation annotation, XmlQualifiedName annotationQualifiedName) { if (annotation != null && annotation.Items != null && annotation.Items.Count > 0 && annotation.Items[0] is XmlSchemaAppInfo) { XmlSchemaAppInfo appInfo = (XmlSchemaAppInfo)annotation.Items[0]; XmlNode[] markup = appInfo.Markup; if (markup != null) { for (int i = 0; i < markup.Length; i++) { XmlElement annotationElement = markup[i] as XmlElement; if (annotationElement != null && annotationElement.LocalName == annotationQualifiedName.Name && annotationElement.NamespaceURI == annotationQualifiedName.Namespace) return annotationElement; } } } return null; } static void ThrowTypeCannotBeImportedException(string name, string ns, string message) { ThrowTypeCannotBeImportedException(SR.GetString(SR.TypeCannotBeImported, name, ns, message)); } static void ThrowArrayTypeCannotBeImportedException(string name, string ns, string message) { ThrowTypeCannotBeImportedException(SR.GetString(SR.ArrayTypeCannotBeImported, name, ns, message)); } static void ThrowEnumTypeCannotBeImportedException(string name, string ns, string message) { ThrowTypeCannotBeImportedException(SR.GetString(SR.EnumTypeCannotBeImported, name, ns, message)); } static void ThrowISerializableTypeCannotBeImportedException(string name, string ns, string message) { ThrowTypeCannotBeImportedException(SR.GetString(SR.ISerializableTypeCannotBeImported, name, ns, message)); } static void ThrowTypeCannotBeImportedException(string message) { throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidDataContractException(SR.GetString(SR.TypeCannotBeImportedHowToFix, message))); } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- AddIn.cs
- PDBReader.cs
- GridViewSortEventArgs.cs
- KeyboardNavigation.cs
- log.cs
- CodeLabeledStatement.cs
- Avt.cs
- DesignerProperties.cs
- FieldAccessException.cs
- EditorPartChrome.cs
- WmlPhoneCallAdapter.cs
- FormClosedEvent.cs
- Constraint.cs
- DoubleAnimationClockResource.cs
- _ListenerAsyncResult.cs
- GridViewUpdateEventArgs.cs
- SevenBitStream.cs
- DataServiceProcessingPipelineEventArgs.cs
- Pair.cs
- XsdDataContractImporter.cs
- FormsAuthenticationModule.cs
- LinkLabel.cs
- SemanticAnalyzer.cs
- PathSegment.cs
- ExtensibleSyndicationObject.cs
- TextTreeTextBlock.cs
- EntityParameterCollection.cs
- LinearKeyFrames.cs
- ListChangedEventArgs.cs
- CodeDomDesignerLoader.cs
- ZoneButton.cs
- Tuple.cs
- UInt16Storage.cs
- XmlCDATASection.cs
- SpeakProgressEventArgs.cs
- SecurityTokenProvider.cs
- XmlSchemaExporter.cs
- BigInt.cs
- AssemblyBuilder.cs
- CalendarDataBindingHandler.cs
- _SslSessionsCache.cs
- SafeMILHandle.cs
- PolyLineSegmentFigureLogic.cs
- BindingExpressionUncommonField.cs
- SignatureToken.cs
- CodeAttributeArgumentCollection.cs
- SmtpCommands.cs
- OdbcInfoMessageEvent.cs
- X509CertificateChain.cs
- QueryContinueDragEventArgs.cs
- SettingsAttributeDictionary.cs
- CngProvider.cs
- AssemblyUtil.cs
- AliasGenerator.cs
- PerformanceCounterPermissionEntry.cs
- InputDevice.cs
- ChannelManager.cs
- BidPrivateBase.cs
- TextEditorParagraphs.cs
- HtmlInputImage.cs
- XsltQilFactory.cs
- SourceSwitch.cs
- DataBindingCollectionEditor.cs
- QilReference.cs
- XmlQueryType.cs
- AuthenticationService.cs
- XamlSerializer.cs
- PolyLineSegment.cs
- ViewGenResults.cs
- ProxyElement.cs
- SequenceDesigner.xaml.cs
- HttpCapabilitiesSectionHandler.cs
- ProcessModuleDesigner.cs
- ReflectionTypeLoadException.cs
- StrongBox.cs
- SqlXml.cs
- SecurityException.cs
- CryptoConfig.cs
- __Error.cs
- PeerContact.cs
- StylusPointPropertyInfo.cs
- PropertyGridEditorPart.cs
- basevalidator.cs
- IResourceProvider.cs
- BitmapDownload.cs
- InternalCache.cs
- DataGridViewCellContextMenuStripNeededEventArgs.cs
- RelationalExpressions.cs
- XmlExceptionHelper.cs
- WebPartConnectionsConfigureVerb.cs
- SystemWebSectionGroup.cs
- DataGridPageChangedEventArgs.cs
- TemplateDefinition.cs
- Bitmap.cs
- PixelShader.cs
- DataTableClearEvent.cs
- URLMembershipCondition.cs
- MessageBox.cs
- WinInet.cs
- DateTimePicker.cs