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