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