We need you! We're working hard on the next version of Developer Fusion -
Let us know what you think we should be up to!
- namespace System.Xml.Serialization
- {
-
- using System.Reflection;
- using System.Collections;
- using System.Xml.Schema;
- using System;
- using System.Text;
- using System.ComponentModel;
- using System.Xml;
- using System.CodeDom.Compiler;
-
-
-
-
-
- internal abstract class Accessor
- {
- string name;
- object defaultValue = null;
- string ns;
- TypeMapping mapping;
- bool any;
- string anyNs;
- bool topLevelInSchema;
- bool isFixed;
- bool isOptional;
- XmlSchemaForm form = XmlSchemaForm.None;
-
- internal Accessor()
- {
- }
-
- internal TypeMapping Mapping {
- get { return mapping; }
- set { mapping = value; }
- }
-
- internal object Default {
- get { return defaultValue; }
- set { defaultValue = value; }
- }
-
- internal bool HasDefault {
- get { return defaultValue != null && defaultValue != DBNull.Value; }
- }
-
- internal virtual string Name {
- get { return name == null ? string.Empty : name; }
- set { name = value; }
- }
-
- internal bool Any {
- get { return any; }
- set { any = value; }
- }
-
- internal string AnyNamespaces {
- get { return anyNs; }
- set { anyNs = value; }
- }
-
- internal string Namespace {
- get { return ns; }
- set { ns = value; }
- }
-
- internal XmlSchemaForm Form {
- get { return form; }
- set { form = value; }
- }
-
- internal bool IsFixed {
- get { return isFixed; }
- set { isFixed = value; }
- }
-
- internal bool IsOptional {
- get { return isOptional; }
- set { isOptional = value; }
- }
-
- internal bool IsTopLevelInSchema {
- get { return topLevelInSchema; }
- set { topLevelInSchema = value; }
- }
-
- static internal string EscapeName(string name)
- {
- if (name == null || name.Length == 0)
- return name;
- return XmlConvert.EncodeLocalName(name);
- }
-
- static internal string EscapeQName(string name)
- {
- if (name == null || name.Length == 0)
- return name;
- int colon = name.LastIndexOf(':');
- if (colon < 0)
- return XmlConvert.EncodeLocalName(name);
- else {
- if (colon == 0 || colon == name.Length - 1)
- throw new ArgumentException(Res.GetString(Res.Xml_InvalidNameChars, name), "name");
- return new XmlQualifiedName(XmlConvert.EncodeLocalName(name.Substring(colon + 1)), XmlConvert.EncodeLocalName(name.Substring(0, colon))).ToString();
- }
- }
-
- static internal string UnescapeName(string name)
- {
- return XmlConvert.DecodeName(name);
- }
-
- internal string ToString(string defaultNs)
- {
- if (Any) {
- return (Namespace == null ? "##any" : Namespace) + ":" + Name;
- }
- else {
- return Namespace == defaultNs ? Name : Namespace + ":" + Name;
- }
- }
- }
-
- internal class ElementAccessor : Accessor
- {
- bool nullable;
- bool isSoap;
- bool unbounded = false;
-
- internal bool IsSoap {
- get { return isSoap; }
- set { isSoap = value; }
- }
-
- internal bool IsNullable {
- get { return nullable; }
- set { nullable = value; }
- }
-
- internal bool IsUnbounded {
- get { return unbounded; }
- set { unbounded = value; }
- }
-
- internal ElementAccessor Clone()
- {
- ElementAccessor newAccessor = new ElementAccessor();
- newAccessor.nullable = this.nullable;
- newAccessor.IsTopLevelInSchema = this.IsTopLevelInSchema;
- newAccessor.Form = this.Form;
- newAccessor.isSoap = this.isSoap;
- newAccessor.Name = this.Name;
- newAccessor.Default = this.Default;
- newAccessor.Namespace = this.Namespace;
- newAccessor.Mapping = this.Mapping;
- newAccessor.Any = this.Any;
-
- return newAccessor;
- }
- }
-
- internal class ChoiceIdentifierAccessor : Accessor
- {
- string memberName;
- string[] memberIds;
-
- internal string MemberName {
- get { return memberName; }
- set { memberName = value; }
- }
-
- internal string[] MemberIds {
- get { return memberIds; }
- set { memberIds = value; }
- }
-
- }
-
- internal class TextAccessor : Accessor
- {
- }
-
- internal class XmlnsAccessor : Accessor
- {
- }
-
- internal class AttributeAccessor : Accessor
- {
- bool isSpecial;
- bool isList;
-
- internal bool IsSpecialXmlNamespace {
- get { return isSpecial; }
- }
-
- internal bool IsList {
- get { return isList; }
- set { isList = value; }
- }
-
- internal void CheckSpecial()
- {
- int colon = Name.LastIndexOf(':');
-
- if (colon >= 0) {
- if (!Name.StartsWith("xml:", StringComparison.Ordinal)) {
- throw new InvalidOperationException(Res.GetString(Res.Xml_InvalidNameChars, Name));
- }
- Name = Name.Substring("xml:".Length);
- Namespace = XmlReservedNs.NsXml;
- isSpecial = true;
- }
- else {
- if (Namespace == XmlReservedNs.NsXml) {
- isSpecial = true;
- }
- else {
- isSpecial = false;
- }
- }
- if (isSpecial) {
- Form = XmlSchemaForm.Qualified;
- }
- }
- }
-
- internal abstract class Mapping
- {
- bool isSoap;
-
- internal Mapping()
- {
- }
-
- internal bool IsSoap {
- get { return isSoap; }
- set { isSoap = value; }
- }
- }
-
- internal abstract class TypeMapping : Mapping
- {
- TypeDesc typeDesc;
- string typeNs;
- string typeName;
- bool referencedByElement;
- bool referencedByTopLevelElement;
- bool includeInSchema = true;
- bool reference = false;
-
- internal bool ReferencedByTopLevelElement {
- get { return referencedByTopLevelElement; }
- set { referencedByTopLevelElement = value; }
- }
-
- internal bool ReferencedByElement {
- get { return referencedByElement || referencedByTopLevelElement; }
- set { referencedByElement = value; }
- }
- internal string Namespace {
- get { return typeNs; }
- set { typeNs = value; }
- }
-
- internal string TypeName {
- get { return typeName; }
- set { typeName = value; }
- }
-
- internal TypeDesc TypeDesc {
- get { return typeDesc; }
- set { typeDesc = value; }
- }
-
- internal bool IncludeInSchema {
- get { return includeInSchema; }
- set { includeInSchema = value; }
- }
-
- internal virtual bool IsList {
- get { return false; }
- set { }
- }
-
- internal bool IsReference {
- get { return reference; }
- set { reference = value; }
- }
-
- internal bool IsAnonymousType {
- get { return typeName == null || typeName.Length == 0; }
- }
-
- internal virtual string DefaultElementName {
- get { return IsAnonymousType ? XmlConvert.EncodeLocalName(typeDesc.Name) : typeName; }
- }
- }
-
- internal class PrimitiveMapping : TypeMapping
- {
- bool isList;
-
- internal override bool IsList {
- get { return isList; }
- set { isList = value; }
- }
- }
-
- internal class NullableMapping : TypeMapping
- {
- TypeMapping baseMapping;
-
- internal TypeMapping BaseMapping {
- get { return baseMapping; }
- set { baseMapping = value; }
- }
-
- internal override string DefaultElementName {
- get { return BaseMapping.DefaultElementName; }
- }
- }
-
- internal class ArrayMapping : TypeMapping
- {
- ElementAccessor[] elements;
- ElementAccessor[] sortedElements;
- ArrayMapping next;
- StructMapping topLevelMapping;
-
- internal ElementAccessor[] Elements {
- get { return elements; }
- set {
- elements = value;
- sortedElements = null;
- }
- }
-
- internal ElementAccessor[] ElementsSortedByDerivation {
- get {
- if (sortedElements != null)
- return sortedElements;
- if (elements == null)
- return null;
- sortedElements = new ElementAccessor[elements.Length];
- Array.Copy(elements, 0, sortedElements, 0, elements.Length);
- AccessorMapping.SortMostToLeastDerived(sortedElements);
- return sortedElements;
- }
- }
-
-
- internal ArrayMapping Next {
- get { return next; }
- set { next = value; }
- }
-
- internal StructMapping TopLevelMapping {
- get { return topLevelMapping; }
- set { topLevelMapping = value; }
- }
- }
-
- internal class EnumMapping : PrimitiveMapping
- {
- ConstantMapping[] constants;
- bool isFlags;
-
- internal bool IsFlags {
- get { return isFlags; }
- set { isFlags = value; }
- }
-
- internal ConstantMapping[] Constants {
- get { return constants; }
- set { constants = value; }
- }
- }
-
- internal class ConstantMapping : Mapping
- {
- string xmlName;
- string name;
- long value;
-
- internal string XmlName {
- get { return xmlName == null ? string.Empty : xmlName; }
- set { xmlName = value; }
- }
-
- internal string Name {
- get { return name == null ? string.Empty : name; }
- set { this.name = value; }
- }
-
- internal long Value {
- get { return value; }
- set { this.value = value; }
- }
- }
-
- internal class StructMapping : TypeMapping, INameScope
- {
- MemberMapping[] members;
- StructMapping baseMapping;
- StructMapping derivedMappings;
- StructMapping nextDerivedMapping;
- MemberMapping xmlnsMember = null;
- bool hasSimpleContent;
- bool openModel;
- NameTable elements;
- NameTable attributes;
- CodeIdentifiers scope;
-
- internal StructMapping BaseMapping {
- get { return baseMapping; }
- set {
- baseMapping = value;
- if (!IsAnonymousType && baseMapping != null) {
- nextDerivedMapping = baseMapping.derivedMappings;
- baseMapping.derivedMappings = this;
- }
- }
- }
-
- internal StructMapping DerivedMappings {
- get { return derivedMappings; }
- }
-
- internal NameTable LocalElements {
- get {
- if (elements == null)
- elements = new NameTable();
- return elements;
- }
- }
- internal NameTable LocalAttributes {
- get {
- if (attributes == null)
- attributes = new NameTable();
- return attributes;
- }
- }
- object INameScope.this[string name, string ns]
- {
- get {
- object named = LocalElements[name, ns];
- if (named != null)
- return named;
- if (baseMapping != null)
- return ((INameScope)baseMapping)[name, ns];
- return null;
- }
- set { LocalElements[name, ns] = value; }
- }
- internal StructMapping NextDerivedMapping {
- get { return nextDerivedMapping; }
- }
-
- internal bool HasSimpleContent {
- get { return hasSimpleContent; }
- }
-
- internal bool HasXmlnsMember {
- get {
- StructMapping mapping = this;
- while (mapping != null) {
- if (mapping.XmlnsMember != null)
- return true;
- mapping = mapping.BaseMapping;
- }
- return false;
- }
- }
-
- internal MemberMapping[] Members {
- get { return members; }
- set { members = value; }
- }
-
- internal MemberMapping XmlnsMember {
- get { return xmlnsMember; }
- set { xmlnsMember = value; }
- }
-
- internal bool IsOpenModel {
- get { return openModel; }
- set { openModel = value; }
- }
-
- internal CodeIdentifiers Scope {
- get {
- if (scope == null)
- scope = new CodeIdentifiers();
- return scope;
- }
- set { scope = value; }
- }
-
- internal MemberMapping FindDeclaringMapping(MemberMapping member, out StructMapping declaringMapping, string parent)
- {
- declaringMapping = null;
- if (BaseMapping != null) {
- MemberMapping baseMember = BaseMapping.FindDeclaringMapping(member, out declaringMapping, parent);
- if (baseMember != null)
- return baseMember;
- }
- if (members == null)
- return null;
-
- for (int i = 0; i < members.Length; i++) {
- if (members[i].Name == member.Name) {
- if (members[i].TypeDesc != member.TypeDesc)
- throw new InvalidOperationException(Res.GetString(Res.XmlHiddenMember, parent, member.Name, member.TypeDesc.FullName, this.TypeName, members[i].Name, members[i].TypeDesc.FullName));
- else if (!members[i].Match(member)) {
- throw new InvalidOperationException(Res.GetString(Res.XmlInvalidXmlOverride, parent, member.Name, this.TypeName, members[i].Name));
- }
- declaringMapping = this;
- return members[i];
- }
- }
- return null;
- }
- internal bool Declares(MemberMapping member, string parent)
- {
- StructMapping m;
- return (FindDeclaringMapping(member, out m, parent) != null);
- }
-
- internal void SetContentModel(TextAccessor text, bool hasElements)
- {
- if (BaseMapping == null || BaseMapping.TypeDesc.IsRoot) {
- hasSimpleContent = !hasElements && text != null && !text.Mapping.IsList;
- }
- else if (BaseMapping.HasSimpleContent) {
- if (text != null || hasElements) {
-
- throw new InvalidOperationException(Res.GetString(Res.XmlIllegalSimpleContentExtension, TypeDesc.FullName, BaseMapping.TypeDesc.FullName));
- }
- else {
- hasSimpleContent = true;
- }
- }
- else {
- hasSimpleContent = false;
- }
- if (!hasSimpleContent && text != null && !text.Mapping.TypeDesc.CanBeTextValue) {
- throw new InvalidOperationException(Res.GetString(Res.XmlIllegalTypedTextAttribute, TypeDesc.FullName, text.Name, text.Mapping.TypeDesc.FullName));
- }
- }
-
- internal bool HasElements {
- get { return elements != null && elements.Values.Count > 0; }
- }
-
- internal bool HasExplicitSequence()
- {
- if (members != null) {
- for (int i = 0; i < members.Length; i++) {
- if (members[i].IsParticle && members[i].IsSequence) {
- return true;
- }
- }
- }
- return (baseMapping != null && baseMapping.HasExplicitSequence());
- }
-
- internal void SetSequence()
- {
- for (int i = 0; i < members.Length; i++) {
- if (members[i].IsParticle) {
- members[i].SequenceId = i;
- }
- }
- if (baseMapping != null) {
- baseMapping.SetSequence();
- }
- }
- }
-
- internal abstract class AccessorMapping : Mapping
- {
- TypeDesc typeDesc;
- AttributeAccessor attribute;
- ElementAccessor[] elements;
- ElementAccessor[] sortedElements;
- TextAccessor text;
- ChoiceIdentifierAccessor choiceIdentifier;
- XmlnsAccessor xmlns;
- bool ignore;
-
- internal bool IsAttribute {
- get { return attribute != null; }
- }
-
- internal bool IsText {
- get { return text != null && (elements == null || elements.Length == 0); }
- }
-
- internal bool IsParticle {
- get { return (elements != null && elements.Length > 0); }
- }
-
- internal TypeDesc TypeDesc {
- get { return typeDesc; }
- set { typeDesc = value; }
- }
-
- internal AttributeAccessor Attribute {
- get { return attribute; }
- set { attribute = value; }
- }
-
- internal ElementAccessor[] Elements {
- get { return elements; }
- set {
- elements = value;
- sortedElements = null;
- }
- }
-
- static internal void SortMostToLeastDerived(ElementAccessor[] elements)
- {
- Array.Sort(elements, new AccessorComparer());
- }
-
- internal class AccessorComparer : IComparer
- {
- public int Compare(object o1, object o2)
- {
- if (o1 == o2)
- return 0;
- Accessor a1 = (Accessor)o1;
- Accessor a2 = (Accessor)o2;
- int w1 = a1.Mapping.TypeDesc.Weight;
- int w2 = a2.Mapping.TypeDesc.Weight;
- if (w1 == w2)
- return 0;
- if (w1 < w2)
- return 1;
- return -1;
- }
- }
-
- internal ElementAccessor[] ElementsSortedByDerivation {
- get {
- if (sortedElements != null)
- return sortedElements;
- if (elements == null)
- return null;
- sortedElements = new ElementAccessor[elements.Length];
- Array.Copy(elements, 0, sortedElements, 0, elements.Length);
- SortMostToLeastDerived(sortedElements);
- return sortedElements;
- }
- }
-
- internal TextAccessor Text {
- get { return text; }
- set { text = value; }
- }
-
- internal ChoiceIdentifierAccessor ChoiceIdentifier {
- get { return choiceIdentifier; }
- set { choiceIdentifier = value; }
- }
-
- internal XmlnsAccessor Xmlns {
- get { return xmlns; }
- set { xmlns = value; }
- }
-
- internal bool Ignore {
- get { return ignore; }
- set { ignore = value; }
- }
-
- internal Accessor Accessor {
- get {
- if (xmlns != null)
- return xmlns;
- if (attribute != null)
- return attribute;
- if (elements != null && elements.Length > 0)
- return elements[0];
- return text;
- }
- }
-
- static bool IsNeedNullableMember(ElementAccessor element)
- {
- if (element.Mapping is ArrayMapping) {
- ArrayMapping arrayMapping = (ArrayMapping)element.Mapping;
- if (arrayMapping.Elements != null && arrayMapping.Elements.Length == 1) {
- return IsNeedNullableMember(arrayMapping.Elements[0]);
- }
- return false;
- }
- else {
- return element.IsNullable && element.Mapping.TypeDesc.IsValueType;
- }
- }
-
- internal bool IsNeedNullable {
- get {
- if (xmlns != null)
- return false;
- if (attribute != null)
- return false;
- if (elements != null && elements.Length == 1) {
- return IsNeedNullableMember(elements[0]);
- }
- return false;
- }
- }
-
- static internal bool ElementsMatch(ElementAccessor[] a, ElementAccessor[] b)
- {
- if (a == null) {
- if (b == null)
- return true;
- return false;
- }
- if (b == null)
- return false;
- if (a.Length != b.Length)
- return false;
- for (int i = 0; i < a.Length; i++) {
- if (a[i].Name != b[i].Name || a[i].Namespace != b[i].Namespace || a[i].Form != b[i].Form || a[i].IsNullable != b[i].IsNullable)
- return false;
- }
- return true;
- }
-
- internal bool Match(AccessorMapping mapping)
- {
- if (Elements != null && Elements.Length > 0) {
- if (!ElementsMatch(Elements, mapping.Elements)) {
- return false;
- }
- if (Text == null) {
- return (mapping.Text == null);
- }
- }
- &