2 using System
.Collections
.Generic
;
3 using System
.Diagnostics
;
4 using System
.Threading
.Tasks
;
5 using System
.Xml
.Schema
;
9 internal class XmlAsyncCheckReader
: XmlReader
{
11 private readonly XmlReader coreReader
= null;
12 private Task lastTask
= AsyncHelper
.DoneTask
;
14 internal XmlReader CoreReader
{
20 public static XmlAsyncCheckReader
CreateAsyncCheckWrapper(XmlReader reader
)
22 if (reader
is IXmlLineInfo
) {
23 if (reader
is IXmlNamespaceResolver
) {
25 if (reader
is IXmlSchemaInfo
) {
26 return new XmlAsyncCheckReaderWithLineInfoNSSchema(reader
);
28 #endif // !FEATURE_NETCORE
29 return new XmlAsyncCheckReaderWithLineInfoNS(reader
);
32 Debug
.Assert(!(reader
is IXmlSchemaInfo
));
33 #endif // !FEATURE_NETCORE
34 return new XmlAsyncCheckReaderWithLineInfo(reader
);
36 else if (reader
is IXmlNamespaceResolver
) {
38 Debug
.Assert(!(reader
is IXmlSchemaInfo
));
39 #endif // !FEATURE_NETCORE
40 return new XmlAsyncCheckReaderWithNS(reader
);
43 Debug
.Assert(!(reader
is IXmlSchemaInfo
));
44 #endif // !FEATURE_NETCORE
45 return new XmlAsyncCheckReader(reader
);
48 public XmlAsyncCheckReader(XmlReader reader
) {
52 private void CheckAsync() {
53 if (!lastTask
.IsCompleted
) {
54 throw new InvalidOperationException(Res
.GetString(Res
.Xml_AsyncIsRunningException
));
58 #region Sync Methods, Properties Check
60 public override XmlReaderSettings Settings
{
62 XmlReaderSettings settings
= coreReader
.Settings
;
63 if (null != settings
) {
64 settings
= settings
.Clone();
67 settings
= new XmlReaderSettings();
69 settings
.Async
= true;
70 settings
.ReadOnly
= true;
75 public override XmlNodeType NodeType
{
78 return coreReader
.NodeType
;
82 public override string Name
{
85 return coreReader
.Name
;
89 public override string LocalName
{
92 return coreReader
.LocalName
;
96 public override string NamespaceURI
{
99 return coreReader
.NamespaceURI
;
103 public override string Prefix
{
106 return coreReader
.Prefix
;
110 public override bool HasValue
{
113 return coreReader
.HasValue
;
117 public override string Value
{
120 return coreReader
.Value
;
124 public override int Depth
{
127 return coreReader
.Depth
;
131 public override string BaseURI
{
134 return coreReader
.BaseURI
;
138 public override bool IsEmptyElement
{
141 return coreReader
.IsEmptyElement
;
145 public override bool IsDefault
{
148 return coreReader
.IsDefault
;
153 public override char QuoteChar
{
156 return coreReader
.QuoteChar
;
159 #endif // !SILVERLIGHT
161 public override XmlSpace XmlSpace
{
164 return coreReader
.XmlSpace
;
168 public override string XmlLang
{
171 return coreReader
.XmlLang
;
176 public override IXmlSchemaInfo SchemaInfo
{
179 return coreReader
.SchemaInfo
;
182 #endif // !FEATURE_NETCORE
184 public override System
.Type ValueType
{
187 return coreReader
.ValueType
;
191 public override object ReadContentAsObject() {
193 return coreReader
.ReadContentAsObject();
196 public override bool ReadContentAsBoolean() {
198 return coreReader
.ReadContentAsBoolean();
201 public override DateTime
ReadContentAsDateTime() {
203 return coreReader
.ReadContentAsDateTime();
206 public override double ReadContentAsDouble() {
208 return coreReader
.ReadContentAsDouble();
211 public override float ReadContentAsFloat() {
213 return coreReader
.ReadContentAsFloat();
216 public override decimal ReadContentAsDecimal() {
218 return coreReader
.ReadContentAsDecimal();
221 public override int ReadContentAsInt() {
223 return coreReader
.ReadContentAsInt();
226 public override long ReadContentAsLong() {
228 return coreReader
.ReadContentAsLong();
231 public override string ReadContentAsString() {
233 return coreReader
.ReadContentAsString();
236 public override object ReadContentAs(Type returnType
, IXmlNamespaceResolver namespaceResolver
) {
238 return coreReader
.ReadContentAs(returnType
, namespaceResolver
);
241 public override object ReadElementContentAsObject() {
243 return coreReader
.ReadElementContentAsObject();
246 public override object ReadElementContentAsObject(string localName
, string namespaceURI
) {
248 return coreReader
.ReadElementContentAsObject(localName
, namespaceURI
);
251 public override bool ReadElementContentAsBoolean() {
253 return coreReader
.ReadElementContentAsBoolean();
256 public override bool ReadElementContentAsBoolean(string localName
, string namespaceURI
) {
258 return coreReader
.ReadElementContentAsBoolean(localName
, namespaceURI
);
261 public override DateTime
ReadElementContentAsDateTime() {
263 return coreReader
.ReadElementContentAsDateTime();
266 public override DateTime
ReadElementContentAsDateTime(string localName
, string namespaceURI
) {
268 return coreReader
.ReadElementContentAsDateTime(localName
, namespaceURI
);
271 public override DateTimeOffset
ReadContentAsDateTimeOffset() {
273 return coreReader
.ReadContentAsDateTimeOffset();
276 public override double ReadElementContentAsDouble() {
278 return coreReader
.ReadElementContentAsDouble();
281 public override double ReadElementContentAsDouble(string localName
, string namespaceURI
) {
283 return coreReader
.ReadElementContentAsDouble(localName
, namespaceURI
);
286 public override float ReadElementContentAsFloat() {
288 return coreReader
.ReadElementContentAsFloat();
291 public override float ReadElementContentAsFloat(string localName
, string namespaceURI
) {
293 return coreReader
.ReadElementContentAsFloat(localName
, namespaceURI
);
296 public override decimal ReadElementContentAsDecimal() {
298 return coreReader
.ReadElementContentAsDecimal();
301 public override decimal ReadElementContentAsDecimal(string localName
, string namespaceURI
) {
303 return coreReader
.ReadElementContentAsDecimal(localName
, namespaceURI
);
306 public override int ReadElementContentAsInt() {
308 return coreReader
.ReadElementContentAsInt();
311 public override int ReadElementContentAsInt(string localName
, string namespaceURI
) {
313 return coreReader
.ReadElementContentAsInt(localName
, namespaceURI
);
316 public override long ReadElementContentAsLong() {
318 return coreReader
.ReadElementContentAsLong();
321 public override long ReadElementContentAsLong(string localName
, string namespaceURI
) {
323 return coreReader
.ReadElementContentAsLong(localName
, namespaceURI
);
326 public override string ReadElementContentAsString() {
328 return coreReader
.ReadElementContentAsString();
331 public override string ReadElementContentAsString(string localName
, string namespaceURI
) {
333 return coreReader
.ReadElementContentAsString(localName
, namespaceURI
);
336 public override object ReadElementContentAs(Type returnType
, IXmlNamespaceResolver namespaceResolver
) {
338 return coreReader
.ReadElementContentAs(returnType
, namespaceResolver
);
341 public override object ReadElementContentAs(Type returnType
, IXmlNamespaceResolver namespaceResolver
, string localName
, string namespaceURI
) {
343 return coreReader
.ReadElementContentAs(returnType
, namespaceResolver
, localName
, namespaceURI
);
346 public override int AttributeCount
{
349 return coreReader
.AttributeCount
;
353 public override string GetAttribute(string name
) {
355 return coreReader
.GetAttribute(name
);
358 public override string GetAttribute(string name
, string namespaceURI
) {
360 return coreReader
.GetAttribute(name
, namespaceURI
);
363 public override string GetAttribute(int i
) {
365 return coreReader
.GetAttribute(i
);
368 public override string this[int i
] {
371 return coreReader
[i
];
375 public override string this[string name
] {
378 return coreReader
[name
];
382 public override string this[string name
, string namespaceURI
] {
385 return coreReader
[name
, namespaceURI
];
389 public override bool MoveToAttribute(string name
) {
391 return coreReader
.MoveToAttribute(name
);
394 public override bool MoveToAttribute(string name
, string ns
) {
396 return coreReader
.MoveToAttribute(name
, ns
);
399 public override void MoveToAttribute(int i
) {
401 coreReader
.MoveToAttribute(i
);
404 public override bool MoveToFirstAttribute() {
406 return coreReader
.MoveToFirstAttribute();
409 public override bool MoveToNextAttribute() {
411 return coreReader
.MoveToNextAttribute();
414 public override bool MoveToElement() {
416 return coreReader
.MoveToElement();
419 public override bool ReadAttributeValue() {
421 return coreReader
.ReadAttributeValue();
424 public override bool Read() {
426 return coreReader
.Read();
429 public override bool EOF
{
432 return coreReader
.EOF
;
436 public override void Close() {
441 public override ReadState ReadState
{
444 return coreReader
.ReadState
;
448 public override void Skip() {
453 public override XmlNameTable NameTable
{
456 return coreReader
.NameTable
;
460 public override string LookupNamespace(string prefix
) {
462 return coreReader
.LookupNamespace(prefix
);
465 public override bool CanResolveEntity
{
468 return coreReader
.CanResolveEntity
;
472 public override void ResolveEntity() {
474 coreReader
.ResolveEntity();
477 public override bool CanReadBinaryContent
{
480 return coreReader
.CanReadBinaryContent
;
484 public override int ReadContentAsBase64(byte[] buffer
, int index
, int count
) {
486 return coreReader
.ReadContentAsBase64(buffer
, index
, count
);
489 public override int ReadElementContentAsBase64(byte[] buffer
, int index
, int count
) {
491 return coreReader
.ReadElementContentAsBase64(buffer
, index
, count
);
494 public override int ReadContentAsBinHex(byte[] buffer
, int index
, int count
) {
496 return coreReader
.ReadContentAsBinHex(buffer
, index
, count
);
499 public override int ReadElementContentAsBinHex(byte[] buffer
, int index
, int count
) {
501 return coreReader
.ReadElementContentAsBinHex(buffer
, index
, count
);
504 public override bool CanReadValueChunk
{
507 return coreReader
.CanReadValueChunk
;
511 public override int ReadValueChunk(char[] buffer
, int index
, int count
) {
513 return coreReader
.ReadValueChunk(buffer
, index
, count
);
517 public override string ReadString() {
519 return coreReader
.ReadString();
521 #endif // !SILVERLIGHT
523 public override XmlNodeType
MoveToContent() {
525 return coreReader
.MoveToContent();
528 public override void ReadStartElement() {
530 coreReader
.ReadStartElement();
533 public override void ReadStartElement(string name
) {
535 coreReader
.ReadStartElement(name
);
538 public override void ReadStartElement(string localname
, string ns
) {
540 coreReader
.ReadStartElement(localname
, ns
);
544 public override string ReadElementString() {
546 return coreReader
.ReadElementString();
549 public override string ReadElementString(string name
) {
551 return coreReader
.ReadElementString(name
);
554 public override string ReadElementString(string localname
, string ns
) {
556 return coreReader
.ReadElementString(localname
, ns
);
558 #endif // !SILVERLIGHT
560 public override void ReadEndElement() {
562 coreReader
.ReadEndElement();
565 public override bool IsStartElement() {
567 return coreReader
.IsStartElement();
570 public override bool IsStartElement(string name
) {
572 return coreReader
.IsStartElement(name
);
575 public override bool IsStartElement(string localname
, string ns
) {
577 return coreReader
.IsStartElement(localname
, ns
);
580 public override bool ReadToFollowing(string name
) {
582 return coreReader
.ReadToFollowing(name
);
585 public override bool ReadToFollowing(string localName
, string namespaceURI
) {
587 return coreReader
.ReadToFollowing(localName
, namespaceURI
);
590 public override bool ReadToDescendant(string name
) {
592 return coreReader
.ReadToDescendant(name
);
595 public override bool ReadToDescendant(string localName
, string namespaceURI
) {
597 return coreReader
.ReadToDescendant(localName
, namespaceURI
);
600 public override bool ReadToNextSibling(string name
) {
602 return coreReader
.ReadToNextSibling(name
);
605 public override bool ReadToNextSibling(string localName
, string namespaceURI
) {
607 return coreReader
.ReadToNextSibling(localName
, namespaceURI
);
610 public override string ReadInnerXml() {
612 return coreReader
.ReadInnerXml();
615 public override string ReadOuterXml() {
617 return coreReader
.ReadOuterXml();
620 public override XmlReader
ReadSubtree() {
622 XmlReader subtreeReader
= coreReader
.ReadSubtree();
623 return CreateAsyncCheckWrapper(subtreeReader
);
626 public override bool HasAttributes
{
629 return coreReader
.HasAttributes
;
633 protected override void Dispose(bool disposing
) {
635 //since it is protected method, we can't call coreReader.Dispose(disposing).
636 //Internal, it is always called to Dipose(true). So call coreReader.Dispose() is OK.
637 coreReader
.Dispose();
641 internal override XmlNamespaceManager NamespaceManager
{
644 return coreReader
.NamespaceManager
;
648 internal override IDtdInfo DtdInfo
{
651 return coreReader
.DtdInfo
;
658 #region Async Methods
660 public override Task
<string> GetValueAsync() {
662 var task
= coreReader
.GetValueAsync();
667 public override Task
<object> ReadContentAsObjectAsync() {
669 var task
= coreReader
.ReadContentAsObjectAsync();
674 public override Task
<string> ReadContentAsStringAsync() {
676 var task
= coreReader
.ReadContentAsStringAsync();
681 public override Task
<object> ReadContentAsAsync(Type returnType
, IXmlNamespaceResolver namespaceResolver
) {
683 var task
= coreReader
.ReadContentAsAsync(returnType
, namespaceResolver
);
688 public override Task
<object> ReadElementContentAsObjectAsync() {
690 var task
= coreReader
.ReadElementContentAsObjectAsync();
695 public override Task
<string> ReadElementContentAsStringAsync() {
697 var task
= coreReader
.ReadElementContentAsStringAsync();
702 public override Task
<object> ReadElementContentAsAsync(Type returnType
, IXmlNamespaceResolver namespaceResolver
) {
704 var task
= coreReader
.ReadElementContentAsAsync(returnType
, namespaceResolver
);
709 public override Task
<bool> ReadAsync() {
711 var task
= coreReader
.ReadAsync();
716 public override Task
SkipAsync() {
718 var task
= coreReader
.SkipAsync();
723 public override Task
<int> ReadContentAsBase64Async(byte[] buffer
, int index
, int count
) {
725 var task
= coreReader
.ReadContentAsBase64Async(buffer
, index
, count
);
730 public override Task
<int> ReadElementContentAsBase64Async(byte[] buffer
, int index
, int count
) {
732 var task
= coreReader
.ReadElementContentAsBase64Async(buffer
, index
, count
);
737 public override Task
<int> ReadContentAsBinHexAsync(byte[] buffer
, int index
, int count
) {
739 var task
= coreReader
.ReadContentAsBinHexAsync(buffer
, index
, count
);
744 public override Task
<int> ReadElementContentAsBinHexAsync(byte[] buffer
, int index
, int count
) {
746 var task
= coreReader
.ReadElementContentAsBinHexAsync(buffer
, index
, count
);
751 public override Task
<int> ReadValueChunkAsync(char[] buffer
, int index
, int count
) {
753 var task
= coreReader
.ReadValueChunkAsync(buffer
, index
, count
);
758 public override Task
<XmlNodeType
> MoveToContentAsync() {
760 var task
= coreReader
.MoveToContentAsync();
765 public override Task
<string> ReadInnerXmlAsync() {
767 var task
= coreReader
.ReadInnerXmlAsync();
772 public override Task
<string> ReadOuterXmlAsync() {
774 var task
= coreReader
.ReadOuterXmlAsync();
783 internal class XmlAsyncCheckReaderWithNS
: XmlAsyncCheckReader
, IXmlNamespaceResolver
{
784 private readonly IXmlNamespaceResolver readerAsIXmlNamespaceResolver
;
786 public XmlAsyncCheckReaderWithNS(XmlReader reader
)
789 readerAsIXmlNamespaceResolver
= (IXmlNamespaceResolver
)reader
;
792 #region IXmlNamespaceResolver members
793 IDictionary
<string, string> IXmlNamespaceResolver
.GetNamespacesInScope(XmlNamespaceScope scope
)
795 return readerAsIXmlNamespaceResolver
.GetNamespacesInScope(scope
);
798 string IXmlNamespaceResolver
.LookupNamespace(string prefix
)
800 return readerAsIXmlNamespaceResolver
.LookupNamespace(prefix
);
803 string IXmlNamespaceResolver
.LookupPrefix(string namespaceName
)
805 return readerAsIXmlNamespaceResolver
.LookupPrefix(namespaceName
);
810 internal class XmlAsyncCheckReaderWithLineInfo
: XmlAsyncCheckReader
, IXmlLineInfo
{
812 private readonly IXmlLineInfo readerAsIXmlLineInfo
;
814 public XmlAsyncCheckReaderWithLineInfo(XmlReader reader
)
817 readerAsIXmlLineInfo
= (IXmlLineInfo
)reader
;
820 #region IXmlLineInfo members
821 public virtual bool HasLineInfo() {
822 return readerAsIXmlLineInfo
.HasLineInfo();
825 public virtual int LineNumber
{
827 return readerAsIXmlLineInfo
.LineNumber
;
831 public virtual int LinePosition
{
833 return readerAsIXmlLineInfo
.LinePosition
;
839 internal class XmlAsyncCheckReaderWithLineInfoNS
: XmlAsyncCheckReaderWithLineInfo
, IXmlNamespaceResolver
{
841 private readonly IXmlNamespaceResolver readerAsIXmlNamespaceResolver
;
843 public XmlAsyncCheckReaderWithLineInfoNS(XmlReader reader
)
846 readerAsIXmlNamespaceResolver
= (IXmlNamespaceResolver
)reader
;
849 #region IXmlNamespaceResolver members
850 IDictionary
<string, string> IXmlNamespaceResolver
.GetNamespacesInScope(XmlNamespaceScope scope
) {
851 return readerAsIXmlNamespaceResolver
.GetNamespacesInScope(scope
);
854 string IXmlNamespaceResolver
.LookupNamespace(string prefix
) {
855 return readerAsIXmlNamespaceResolver
.LookupNamespace(prefix
);
858 string IXmlNamespaceResolver
.LookupPrefix(string namespaceName
) {
859 return readerAsIXmlNamespaceResolver
.LookupPrefix(namespaceName
);
865 internal class XmlAsyncCheckReaderWithLineInfoNSSchema
: XmlAsyncCheckReaderWithLineInfoNS
, IXmlSchemaInfo
{
867 private readonly IXmlSchemaInfo readerAsIXmlSchemaInfo
;
869 public XmlAsyncCheckReaderWithLineInfoNSSchema(XmlReader reader
)
872 readerAsIXmlSchemaInfo
= (IXmlSchemaInfo
)reader
;
876 #region IXmlSchemaInfo members
878 XmlSchemaValidity IXmlSchemaInfo
.Validity
{
880 return readerAsIXmlSchemaInfo
.Validity
;
884 bool IXmlSchemaInfo
.IsDefault
{
886 return readerAsIXmlSchemaInfo
.IsDefault
;
890 bool IXmlSchemaInfo
.IsNil
{
892 return readerAsIXmlSchemaInfo
.IsNil
;
896 XmlSchemaSimpleType IXmlSchemaInfo
.MemberType
{
898 return readerAsIXmlSchemaInfo
.MemberType
;
902 XmlSchemaType IXmlSchemaInfo
.SchemaType
{
904 return readerAsIXmlSchemaInfo
.SchemaType
;
908 XmlSchemaElement IXmlSchemaInfo
.SchemaElement
{
910 return readerAsIXmlSchemaInfo
.SchemaElement
;
914 XmlSchemaAttribute IXmlSchemaInfo
.SchemaAttribute
{
916 return readerAsIXmlSchemaInfo
.SchemaAttribute
;
921 #endif // !FEATURE_NETCORE