XmlSerializableReader.cs 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. //-----------------------------------------------------------------------------
  2. // Copyright (c) Microsoft Corporation. All rights reserved.
  3. //-----------------------------------------------------------------------------
  4. namespace System.Runtime.Serialization
  5. {
  6. using System.IO;
  7. using System.Xml;
  8. using System.Xml.Schema;
  9. using System.Xml.Serialization;
  10. using System.Diagnostics;
  11. internal class XmlSerializableReader : XmlReader, IXmlLineInfo, IXmlTextParser
  12. {
  13. XmlReaderDelegator xmlReader;
  14. int startDepth;
  15. bool isRootEmptyElement;
  16. XmlReader innerReader;
  17. XmlReader InnerReader
  18. {
  19. get { return innerReader; }
  20. }
  21. internal void BeginRead(XmlReaderDelegator xmlReader)
  22. {
  23. if (xmlReader.NodeType != XmlNodeType.Element)
  24. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(XmlObjectSerializerReadContext.CreateUnexpectedStateException(XmlNodeType.Element, xmlReader));
  25. this.xmlReader = xmlReader;
  26. this.startDepth = xmlReader.Depth;
  27. this.innerReader = xmlReader.UnderlyingReader;
  28. this.isRootEmptyElement = InnerReader.IsEmptyElement;
  29. }
  30. internal void EndRead()
  31. {
  32. if (isRootEmptyElement)
  33. xmlReader.Read();
  34. else
  35. {
  36. if (xmlReader.IsStartElement() && xmlReader.Depth == startDepth)
  37. xmlReader.Read();
  38. while (xmlReader.Depth > startDepth)
  39. {
  40. if (!xmlReader.Read())
  41. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(XmlObjectSerializerReadContext.CreateUnexpectedStateException(XmlNodeType.EndElement, xmlReader));
  42. }
  43. }
  44. }
  45. public override bool Read()
  46. {
  47. XmlReader reader = this.InnerReader;
  48. if (reader.Depth == startDepth)
  49. {
  50. if (reader.NodeType == XmlNodeType.EndElement ||
  51. (reader.NodeType == XmlNodeType.Element && reader.IsEmptyElement))
  52. {
  53. return false;
  54. }
  55. }
  56. return reader.Read();
  57. }
  58. public override void Close()
  59. {
  60. throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(XmlObjectSerializer.CreateSerializationException(SR.GetString(SR.IXmlSerializableIllegalOperation)));
  61. }
  62. public override XmlReaderSettings Settings { get { return InnerReader.Settings; } }
  63. public override XmlNodeType NodeType { get { return InnerReader.NodeType; } }
  64. public override string Name { get { return InnerReader.Name; } }
  65. public override string LocalName { get { return InnerReader.LocalName; } }
  66. public override string NamespaceURI { get { return InnerReader.NamespaceURI; } }
  67. public override string Prefix { get { return InnerReader.Prefix; } }
  68. public override bool HasValue { get { return InnerReader.HasValue; } }
  69. public override string Value { get { return InnerReader.Value; } }
  70. public override int Depth { get { return InnerReader.Depth; } }
  71. public override string BaseURI { get { return InnerReader.BaseURI; } }
  72. public override bool IsEmptyElement { get { return InnerReader.IsEmptyElement; } }
  73. public override bool IsDefault { get { return InnerReader.IsDefault; } }
  74. public override char QuoteChar { get { return InnerReader.QuoteChar; } }
  75. public override XmlSpace XmlSpace { get { return InnerReader.XmlSpace; } }
  76. public override string XmlLang { get { return InnerReader.XmlLang; } }
  77. public override IXmlSchemaInfo SchemaInfo { get { return InnerReader.SchemaInfo; } }
  78. public override Type ValueType { get { return InnerReader.ValueType; } }
  79. public override int AttributeCount { get { return InnerReader.AttributeCount; } }
  80. public override string this[int i] { get { return InnerReader[i]; } }
  81. public override string this[string name] { get { return InnerReader[name]; } }
  82. public override string this[string name, string namespaceURI] { get { return InnerReader[name, namespaceURI]; } }
  83. public override bool EOF { get { return InnerReader.EOF; } }
  84. public override ReadState ReadState { get { return InnerReader.ReadState; } }
  85. public override XmlNameTable NameTable { get { return InnerReader.NameTable; } }
  86. public override bool CanResolveEntity { get { return InnerReader.CanResolveEntity; } }
  87. public override bool CanReadBinaryContent { get { return InnerReader.CanReadBinaryContent; } }
  88. public override bool CanReadValueChunk { get { return InnerReader.CanReadValueChunk; } }
  89. public override bool HasAttributes { get { return InnerReader.HasAttributes; } }
  90. public override string GetAttribute(string name) { return InnerReader.GetAttribute(name); }
  91. public override string GetAttribute(string name, string namespaceURI) { return InnerReader.GetAttribute(name, namespaceURI); }
  92. public override string GetAttribute(int i) { return InnerReader.GetAttribute(i); }
  93. public override bool MoveToAttribute(string name) { return InnerReader.MoveToAttribute(name); }
  94. public override bool MoveToAttribute(string name, string ns) { return InnerReader.MoveToAttribute(name, ns); }
  95. public override void MoveToAttribute(int i) { InnerReader.MoveToAttribute(i); }
  96. public override bool MoveToFirstAttribute() { return InnerReader.MoveToFirstAttribute(); }
  97. public override bool MoveToNextAttribute() { return InnerReader.MoveToNextAttribute(); }
  98. public override bool MoveToElement() { return InnerReader.MoveToElement(); }
  99. public override string LookupNamespace(string prefix) { return InnerReader.LookupNamespace(prefix); }
  100. public override bool ReadAttributeValue() { return InnerReader.ReadAttributeValue(); }
  101. public override void ResolveEntity() { InnerReader.ResolveEntity(); }
  102. public override bool IsStartElement() { return InnerReader.IsStartElement(); }
  103. public override bool IsStartElement(string name) { return InnerReader.IsStartElement(name); }
  104. public override bool IsStartElement(string localname, string ns) { return InnerReader.IsStartElement(localname, ns); }
  105. public override XmlNodeType MoveToContent() { return InnerReader.MoveToContent(); }
  106. public override object ReadContentAsObject() { return InnerReader.ReadContentAsObject(); }
  107. public override bool ReadContentAsBoolean() { return InnerReader.ReadContentAsBoolean(); }
  108. public override DateTime ReadContentAsDateTime() { return InnerReader.ReadContentAsDateTime(); }
  109. public override double ReadContentAsDouble() { return InnerReader.ReadContentAsDouble(); }
  110. public override int ReadContentAsInt() { return InnerReader.ReadContentAsInt(); }
  111. public override long ReadContentAsLong() { return InnerReader.ReadContentAsLong(); }
  112. public override string ReadContentAsString() { return InnerReader.ReadContentAsString(); }
  113. public override object ReadContentAs(Type returnType, IXmlNamespaceResolver namespaceResolver) { return InnerReader.ReadContentAs(returnType, namespaceResolver); }
  114. public override int ReadContentAsBase64(byte[] buffer, int index, int count) { return InnerReader.ReadContentAsBase64(buffer, index, count); }
  115. public override int ReadContentAsBinHex(byte[] buffer, int index, int count) { return InnerReader.ReadContentAsBinHex(buffer, index, count); }
  116. public override int ReadValueChunk(char[] buffer, int index, int count) { return InnerReader.ReadValueChunk(buffer, index, count); }
  117. public override string ReadString() { return InnerReader.ReadString(); }
  118. // IXmlTextParser members
  119. bool IXmlTextParser.Normalized
  120. {
  121. get
  122. {
  123. IXmlTextParser xmlTextParser = InnerReader as IXmlTextParser;
  124. return (xmlTextParser == null) ? xmlReader.Normalized : xmlTextParser.Normalized;
  125. }
  126. set
  127. {
  128. IXmlTextParser xmlTextParser = InnerReader as IXmlTextParser;
  129. if (xmlTextParser == null)
  130. xmlReader.Normalized = value;
  131. else
  132. xmlTextParser.Normalized = value;
  133. }
  134. }
  135. WhitespaceHandling IXmlTextParser.WhitespaceHandling
  136. {
  137. get
  138. {
  139. IXmlTextParser xmlTextParser = InnerReader as IXmlTextParser;
  140. return (xmlTextParser == null) ? xmlReader.WhitespaceHandling : xmlTextParser.WhitespaceHandling;
  141. }
  142. set
  143. {
  144. IXmlTextParser xmlTextParser = InnerReader as IXmlTextParser;
  145. if (xmlTextParser == null)
  146. xmlReader.WhitespaceHandling = value;
  147. else
  148. xmlTextParser.WhitespaceHandling = value;
  149. }
  150. }
  151. // IXmlLineInfo members
  152. bool IXmlLineInfo.HasLineInfo()
  153. {
  154. IXmlLineInfo xmlLineInfo = InnerReader as IXmlLineInfo;
  155. return (xmlLineInfo == null) ? xmlReader.HasLineInfo() : xmlLineInfo.HasLineInfo();
  156. }
  157. int IXmlLineInfo.LineNumber
  158. {
  159. get
  160. {
  161. IXmlLineInfo xmlLineInfo = InnerReader as IXmlLineInfo;
  162. return (xmlLineInfo == null) ? xmlReader.LineNumber : xmlLineInfo.LineNumber;
  163. }
  164. }
  165. int IXmlLineInfo.LinePosition
  166. {
  167. get
  168. {
  169. IXmlLineInfo xmlLineInfo = InnerReader as IXmlLineInfo;
  170. return (xmlLineInfo == null) ? xmlReader.LinePosition : xmlLineInfo.LinePosition;
  171. }
  172. }
  173. }
  174. }