1 // Licensed to the .NET Foundation under one or more agreements.
2 // The .NET Foundation licenses this file to you under the MIT license.
3 // See the LICENSE file in the project root for more information.
4 
5 using System.Collections.Generic;
6 using System.Diagnostics;
7 using System.Threading.Tasks;
8 using System.Xml.Schema;
9 
10 namespace System.Xml
11 {
12     internal class XmlAsyncCheckReader : XmlReader
13     {
14         private readonly XmlReader _coreReader = null;
15         private Task _lastTask = Task.CompletedTask;
16 
17         internal XmlReader CoreReader
18         {
19             get
20             {
21                 return _coreReader;
22             }
23         }
24 
CreateAsyncCheckWrapper(XmlReader reader)25         public static XmlAsyncCheckReader CreateAsyncCheckWrapper(XmlReader reader)
26         {
27             if (reader is IXmlLineInfo)
28             {
29                 if (reader is IXmlNamespaceResolver)
30                 {
31                     if (reader is IXmlSchemaInfo)
32                     {
33                         return new XmlAsyncCheckReaderWithLineInfoNSSchema(reader);
34                     }
35                     return new XmlAsyncCheckReaderWithLineInfoNS(reader);
36                 }
37                 Debug.Assert(!(reader is IXmlSchemaInfo));
38                 return new XmlAsyncCheckReaderWithLineInfo(reader);
39             }
40             else if (reader is IXmlNamespaceResolver)
41             {
42                 Debug.Assert(!(reader is IXmlSchemaInfo));
43                 return new XmlAsyncCheckReaderWithNS(reader);
44             }
45             Debug.Assert(!(reader is IXmlSchemaInfo));
46             return new XmlAsyncCheckReader(reader);
47         }
48 
XmlAsyncCheckReader(XmlReader reader)49         public XmlAsyncCheckReader(XmlReader reader)
50         {
51             _coreReader = reader;
52         }
53 
CheckAsync()54         private void CheckAsync()
55         {
56             if (!_lastTask.IsCompleted)
57             {
58                 throw new InvalidOperationException(SR.Xml_AsyncIsRunningException);
59             }
60         }
61 
62         #region Sync Methods, Properties Check
63 
64         public override XmlReaderSettings Settings
65         {
66             get
67             {
68                 XmlReaderSettings settings = _coreReader.Settings;
69                 if (null != settings)
70                 {
71                     settings = settings.Clone();
72                 }
73                 else
74                 {
75                     settings = new XmlReaderSettings();
76                 }
77                 settings.Async = true;
78                 settings.ReadOnly = true;
79                 return settings;
80             }
81         }
82 
83         public override XmlNodeType NodeType
84         {
85             get
86             {
87                 CheckAsync();
88                 return _coreReader.NodeType;
89             }
90         }
91 
92         public override string Name
93         {
94             get
95             {
96                 CheckAsync();
97                 return _coreReader.Name;
98             }
99         }
100 
101         public override string LocalName
102         {
103             get
104             {
105                 CheckAsync();
106                 return _coreReader.LocalName;
107             }
108         }
109 
110         public override string NamespaceURI
111         {
112             get
113             {
114                 CheckAsync();
115                 return _coreReader.NamespaceURI;
116             }
117         }
118 
119         public override string Prefix
120         {
121             get
122             {
123                 CheckAsync();
124                 return _coreReader.Prefix;
125             }
126         }
127 
128         public override bool HasValue
129         {
130             get
131             {
132                 CheckAsync();
133                 return _coreReader.HasValue;
134             }
135         }
136 
137         public override string Value
138         {
139             get
140             {
141                 CheckAsync();
142                 return _coreReader.Value;
143             }
144         }
145 
146         public override int Depth
147         {
148             get
149             {
150                 CheckAsync();
151                 return _coreReader.Depth;
152             }
153         }
154 
155         public override string BaseURI
156         {
157             get
158             {
159                 CheckAsync();
160                 return _coreReader.BaseURI;
161             }
162         }
163 
164         public override bool IsEmptyElement
165         {
166             get
167             {
168                 CheckAsync();
169                 return _coreReader.IsEmptyElement;
170             }
171         }
172 
173         public override bool IsDefault
174         {
175             get
176             {
177                 CheckAsync();
178                 return _coreReader.IsDefault;
179             }
180         }
181 
182         public override char QuoteChar
183         {
184             get
185             {
186                 CheckAsync();
187                 return _coreReader.QuoteChar;
188             }
189         }
190 
191         public override XmlSpace XmlSpace
192         {
193             get
194             {
195                 CheckAsync();
196                 return _coreReader.XmlSpace;
197             }
198         }
199 
200         public override string XmlLang
201         {
202             get
203             {
204                 CheckAsync();
205                 return _coreReader.XmlLang;
206             }
207         }
208 
209         public override IXmlSchemaInfo SchemaInfo
210         {
211             get
212             {
213                 CheckAsync();
214                 return _coreReader.SchemaInfo;
215             }
216         }
217 
218         public override System.Type ValueType
219         {
220             get
221             {
222                 CheckAsync();
223                 return _coreReader.ValueType;
224             }
225         }
226 
ReadContentAsObject()227         public override object ReadContentAsObject()
228         {
229             CheckAsync();
230             return _coreReader.ReadContentAsObject();
231         }
232 
ReadContentAsBoolean()233         public override bool ReadContentAsBoolean()
234         {
235             CheckAsync();
236             return _coreReader.ReadContentAsBoolean();
237         }
238 
ReadContentAsDateTime()239         public override DateTime ReadContentAsDateTime()
240         {
241             CheckAsync();
242             return _coreReader.ReadContentAsDateTime();
243         }
244 
ReadContentAsDouble()245         public override double ReadContentAsDouble()
246         {
247             CheckAsync();
248             return _coreReader.ReadContentAsDouble();
249         }
250 
ReadContentAsFloat()251         public override float ReadContentAsFloat()
252         {
253             CheckAsync();
254             return _coreReader.ReadContentAsFloat();
255         }
256 
ReadContentAsDecimal()257         public override decimal ReadContentAsDecimal()
258         {
259             CheckAsync();
260             return _coreReader.ReadContentAsDecimal();
261         }
262 
ReadContentAsInt()263         public override int ReadContentAsInt()
264         {
265             CheckAsync();
266             return _coreReader.ReadContentAsInt();
267         }
268 
ReadContentAsLong()269         public override long ReadContentAsLong()
270         {
271             CheckAsync();
272             return _coreReader.ReadContentAsLong();
273         }
274 
ReadContentAsString()275         public override string ReadContentAsString()
276         {
277             CheckAsync();
278             return _coreReader.ReadContentAsString();
279         }
280 
ReadContentAs(Type returnType, IXmlNamespaceResolver namespaceResolver)281         public override object ReadContentAs(Type returnType, IXmlNamespaceResolver namespaceResolver)
282         {
283             CheckAsync();
284             return _coreReader.ReadContentAs(returnType, namespaceResolver);
285         }
286 
ReadElementContentAsObject()287         public override object ReadElementContentAsObject()
288         {
289             CheckAsync();
290             return _coreReader.ReadElementContentAsObject();
291         }
292 
ReadElementContentAsObject(string localName, string namespaceURI)293         public override object ReadElementContentAsObject(string localName, string namespaceURI)
294         {
295             CheckAsync();
296             return _coreReader.ReadElementContentAsObject(localName, namespaceURI);
297         }
298 
ReadElementContentAsBoolean()299         public override bool ReadElementContentAsBoolean()
300         {
301             CheckAsync();
302             return _coreReader.ReadElementContentAsBoolean();
303         }
304 
ReadElementContentAsBoolean(string localName, string namespaceURI)305         public override bool ReadElementContentAsBoolean(string localName, string namespaceURI)
306         {
307             CheckAsync();
308             return _coreReader.ReadElementContentAsBoolean(localName, namespaceURI);
309         }
310 
ReadElementContentAsDateTime()311         public override DateTime ReadElementContentAsDateTime()
312         {
313             CheckAsync();
314             return _coreReader.ReadElementContentAsDateTime();
315         }
316 
ReadElementContentAsDateTime(string localName, string namespaceURI)317         public override DateTime ReadElementContentAsDateTime(string localName, string namespaceURI)
318         {
319             CheckAsync();
320             return _coreReader.ReadElementContentAsDateTime(localName, namespaceURI);
321         }
322 
ReadContentAsDateTimeOffset()323         public override DateTimeOffset ReadContentAsDateTimeOffset()
324         {
325             CheckAsync();
326             return _coreReader.ReadContentAsDateTimeOffset();
327         }
328 
ReadElementContentAsDouble()329         public override double ReadElementContentAsDouble()
330         {
331             CheckAsync();
332             return _coreReader.ReadElementContentAsDouble();
333         }
334 
ReadElementContentAsDouble(string localName, string namespaceURI)335         public override double ReadElementContentAsDouble(string localName, string namespaceURI)
336         {
337             CheckAsync();
338             return _coreReader.ReadElementContentAsDouble(localName, namespaceURI);
339         }
340 
ReadElementContentAsFloat()341         public override float ReadElementContentAsFloat()
342         {
343             CheckAsync();
344             return _coreReader.ReadElementContentAsFloat();
345         }
346 
ReadElementContentAsFloat(string localName, string namespaceURI)347         public override float ReadElementContentAsFloat(string localName, string namespaceURI)
348         {
349             CheckAsync();
350             return _coreReader.ReadElementContentAsFloat(localName, namespaceURI);
351         }
352 
ReadElementContentAsDecimal()353         public override decimal ReadElementContentAsDecimal()
354         {
355             CheckAsync();
356             return _coreReader.ReadElementContentAsDecimal();
357         }
358 
ReadElementContentAsDecimal(string localName, string namespaceURI)359         public override decimal ReadElementContentAsDecimal(string localName, string namespaceURI)
360         {
361             CheckAsync();
362             return _coreReader.ReadElementContentAsDecimal(localName, namespaceURI);
363         }
364 
ReadElementContentAsInt()365         public override int ReadElementContentAsInt()
366         {
367             CheckAsync();
368             return _coreReader.ReadElementContentAsInt();
369         }
370 
ReadElementContentAsInt(string localName, string namespaceURI)371         public override int ReadElementContentAsInt(string localName, string namespaceURI)
372         {
373             CheckAsync();
374             return _coreReader.ReadElementContentAsInt(localName, namespaceURI);
375         }
376 
ReadElementContentAsLong()377         public override long ReadElementContentAsLong()
378         {
379             CheckAsync();
380             return _coreReader.ReadElementContentAsLong();
381         }
382 
ReadElementContentAsLong(string localName, string namespaceURI)383         public override long ReadElementContentAsLong(string localName, string namespaceURI)
384         {
385             CheckAsync();
386             return _coreReader.ReadElementContentAsLong(localName, namespaceURI);
387         }
388 
ReadElementContentAsString()389         public override string ReadElementContentAsString()
390         {
391             CheckAsync();
392             return _coreReader.ReadElementContentAsString();
393         }
394 
ReadElementContentAsString(string localName, string namespaceURI)395         public override string ReadElementContentAsString(string localName, string namespaceURI)
396         {
397             CheckAsync();
398             return _coreReader.ReadElementContentAsString(localName, namespaceURI);
399         }
400 
ReadElementContentAs(Type returnType, IXmlNamespaceResolver namespaceResolver)401         public override object ReadElementContentAs(Type returnType, IXmlNamespaceResolver namespaceResolver)
402         {
403             CheckAsync();
404             return _coreReader.ReadElementContentAs(returnType, namespaceResolver);
405         }
406 
ReadElementContentAs(Type returnType, IXmlNamespaceResolver namespaceResolver, string localName, string namespaceURI)407         public override object ReadElementContentAs(Type returnType, IXmlNamespaceResolver namespaceResolver, string localName, string namespaceURI)
408         {
409             CheckAsync();
410             return _coreReader.ReadElementContentAs(returnType, namespaceResolver, localName, namespaceURI);
411         }
412 
413         public override int AttributeCount
414         {
415             get
416             {
417                 CheckAsync();
418                 return _coreReader.AttributeCount;
419             }
420         }
421 
GetAttribute(string name)422         public override string GetAttribute(string name)
423         {
424             CheckAsync();
425             return _coreReader.GetAttribute(name);
426         }
427 
GetAttribute(string name, string namespaceURI)428         public override string GetAttribute(string name, string namespaceURI)
429         {
430             CheckAsync();
431             return _coreReader.GetAttribute(name, namespaceURI);
432         }
433 
GetAttribute(int i)434         public override string GetAttribute(int i)
435         {
436             CheckAsync();
437             return _coreReader.GetAttribute(i);
438         }
439 
440         public override string this[int i]
441         {
442             get
443             {
444                 CheckAsync();
445                 return _coreReader[i];
446             }
447         }
448 
449         public override string this[string name]
450         {
451             get
452             {
453                 CheckAsync();
454                 return _coreReader[name];
455             }
456         }
457 
MoveToAttribute(string name)458         public override bool MoveToAttribute(string name)
459         {
460             CheckAsync();
461             return _coreReader.MoveToAttribute(name);
462         }
463 
MoveToAttribute(string name, string ns)464         public override bool MoveToAttribute(string name, string ns)
465         {
466             CheckAsync();
467             return _coreReader.MoveToAttribute(name, ns);
468         }
469 
MoveToAttribute(int i)470         public override void MoveToAttribute(int i)
471         {
472             CheckAsync();
473             _coreReader.MoveToAttribute(i);
474         }
475 
MoveToFirstAttribute()476         public override bool MoveToFirstAttribute()
477         {
478             CheckAsync();
479             return _coreReader.MoveToFirstAttribute();
480         }
481 
MoveToNextAttribute()482         public override bool MoveToNextAttribute()
483         {
484             CheckAsync();
485             return _coreReader.MoveToNextAttribute();
486         }
487 
MoveToElement()488         public override bool MoveToElement()
489         {
490             CheckAsync();
491             return _coreReader.MoveToElement();
492         }
493 
ReadAttributeValue()494         public override bool ReadAttributeValue()
495         {
496             CheckAsync();
497             return _coreReader.ReadAttributeValue();
498         }
499 
Read()500         public override bool Read()
501         {
502             CheckAsync();
503             return _coreReader.Read();
504         }
505 
506         public override bool EOF
507         {
508             get
509             {
510                 CheckAsync();
511                 return _coreReader.EOF;
512             }
513         }
514 
Close()515         public override void Close()
516         {
517             CheckAsync();
518             _coreReader.Close();
519         }
520 
521         public override ReadState ReadState
522         {
523             get
524             {
525                 CheckAsync();
526                 return _coreReader.ReadState;
527             }
528         }
529 
Skip()530         public override void Skip()
531         {
532             CheckAsync();
533             _coreReader.Skip();
534         }
535 
536         public override XmlNameTable NameTable
537         {
538             get
539             {
540                 CheckAsync();
541                 return _coreReader.NameTable;
542             }
543         }
544 
LookupNamespace(string prefix)545         public override string LookupNamespace(string prefix)
546         {
547             CheckAsync();
548             return _coreReader.LookupNamespace(prefix);
549         }
550 
551         public override bool CanResolveEntity
552         {
553             get
554             {
555                 CheckAsync();
556                 return _coreReader.CanResolveEntity;
557             }
558         }
559 
ResolveEntity()560         public override void ResolveEntity()
561         {
562             CheckAsync();
563             _coreReader.ResolveEntity();
564         }
565 
566         public override bool CanReadBinaryContent
567         {
568             get
569             {
570                 CheckAsync();
571                 return _coreReader.CanReadBinaryContent;
572             }
573         }
574 
ReadContentAsBase64(byte[] buffer, int index, int count)575         public override int ReadContentAsBase64(byte[] buffer, int index, int count)
576         {
577             CheckAsync();
578             return _coreReader.ReadContentAsBase64(buffer, index, count);
579         }
580 
ReadElementContentAsBase64(byte[] buffer, int index, int count)581         public override int ReadElementContentAsBase64(byte[] buffer, int index, int count)
582         {
583             CheckAsync();
584             return _coreReader.ReadElementContentAsBase64(buffer, index, count);
585         }
586 
ReadContentAsBinHex(byte[] buffer, int index, int count)587         public override int ReadContentAsBinHex(byte[] buffer, int index, int count)
588         {
589             CheckAsync();
590             return _coreReader.ReadContentAsBinHex(buffer, index, count);
591         }
592 
ReadElementContentAsBinHex(byte[] buffer, int index, int count)593         public override int ReadElementContentAsBinHex(byte[] buffer, int index, int count)
594         {
595             CheckAsync();
596             return _coreReader.ReadElementContentAsBinHex(buffer, index, count);
597         }
598 
599         public override bool CanReadValueChunk
600         {
601             get
602             {
603                 CheckAsync();
604                 return _coreReader.CanReadValueChunk;
605             }
606         }
607 
ReadValueChunk(char[] buffer, int index, int count)608         public override int ReadValueChunk(char[] buffer, int index, int count)
609         {
610             CheckAsync();
611             return _coreReader.ReadValueChunk(buffer, index, count);
612         }
613 
ReadString()614         public override string ReadString()
615         {
616             CheckAsync();
617             return _coreReader.ReadString();
618         }
619 
MoveToContent()620         public override XmlNodeType MoveToContent()
621         {
622             CheckAsync();
623             return _coreReader.MoveToContent();
624         }
625 
ReadStartElement()626         public override void ReadStartElement()
627         {
628             CheckAsync();
629             _coreReader.ReadStartElement();
630         }
631 
ReadStartElement(string name)632         public override void ReadStartElement(string name)
633         {
634             CheckAsync();
635             _coreReader.ReadStartElement(name);
636         }
637 
ReadStartElement(string localname, string ns)638         public override void ReadStartElement(string localname, string ns)
639         {
640             CheckAsync();
641             _coreReader.ReadStartElement(localname, ns);
642         }
643 
ReadElementString()644         public override string ReadElementString()
645         {
646             CheckAsync();
647             return _coreReader.ReadElementString();
648         }
649 
ReadElementString(string name)650         public override string ReadElementString(string name)
651         {
652             CheckAsync();
653             return _coreReader.ReadElementString(name);
654         }
655 
ReadElementString(string localname, string ns)656         public override string ReadElementString(string localname, string ns)
657         {
658             CheckAsync();
659             return _coreReader.ReadElementString(localname, ns);
660         }
661 
ReadEndElement()662         public override void ReadEndElement()
663         {
664             CheckAsync();
665             _coreReader.ReadEndElement();
666         }
667 
IsStartElement()668         public override bool IsStartElement()
669         {
670             CheckAsync();
671             return _coreReader.IsStartElement();
672         }
673 
IsStartElement(string name)674         public override bool IsStartElement(string name)
675         {
676             CheckAsync();
677             return _coreReader.IsStartElement(name);
678         }
679 
IsStartElement(string localname, string ns)680         public override bool IsStartElement(string localname, string ns)
681         {
682             CheckAsync();
683             return _coreReader.IsStartElement(localname, ns);
684         }
685 
ReadToFollowing(string name)686         public override bool ReadToFollowing(string name)
687         {
688             CheckAsync();
689             return _coreReader.ReadToFollowing(name);
690         }
691 
ReadToFollowing(string localName, string namespaceURI)692         public override bool ReadToFollowing(string localName, string namespaceURI)
693         {
694             CheckAsync();
695             return _coreReader.ReadToFollowing(localName, namespaceURI);
696         }
697 
ReadToDescendant(string name)698         public override bool ReadToDescendant(string name)
699         {
700             CheckAsync();
701             return _coreReader.ReadToDescendant(name);
702         }
703 
ReadToDescendant(string localName, string namespaceURI)704         public override bool ReadToDescendant(string localName, string namespaceURI)
705         {
706             CheckAsync();
707             return _coreReader.ReadToDescendant(localName, namespaceURI);
708         }
709 
ReadToNextSibling(string name)710         public override bool ReadToNextSibling(string name)
711         {
712             CheckAsync();
713             return _coreReader.ReadToNextSibling(name);
714         }
715 
ReadToNextSibling(string localName, string namespaceURI)716         public override bool ReadToNextSibling(string localName, string namespaceURI)
717         {
718             CheckAsync();
719             return _coreReader.ReadToNextSibling(localName, namespaceURI);
720         }
721 
ReadInnerXml()722         public override string ReadInnerXml()
723         {
724             CheckAsync();
725             return _coreReader.ReadInnerXml();
726         }
727 
ReadOuterXml()728         public override string ReadOuterXml()
729         {
730             CheckAsync();
731             return _coreReader.ReadOuterXml();
732         }
733 
ReadSubtree()734         public override XmlReader ReadSubtree()
735         {
736             CheckAsync();
737             XmlReader subtreeReader = _coreReader.ReadSubtree();
738             return CreateAsyncCheckWrapper(subtreeReader);
739         }
740 
741         public override bool HasAttributes
742         {
743             get
744             {
745                 CheckAsync();
746                 return _coreReader.HasAttributes;
747             }
748         }
749 
Dispose(bool disposing)750         protected override void Dispose(bool disposing)
751         {
752             CheckAsync();
753             //since it is protected method, we can't call coreReader.Dispose(disposing).
754             //Internal, it is always called to Dispose(true). So call coreReader.Dispose() is OK.
755             _coreReader.Dispose();
756         }
757 
758         internal override XmlNamespaceManager NamespaceManager
759         {
760             get
761             {
762                 CheckAsync();
763                 return _coreReader.NamespaceManager;
764             }
765         }
766 
767         internal override IDtdInfo DtdInfo
768         {
769             get
770             {
771                 CheckAsync();
772                 return _coreReader.DtdInfo;
773             }
774         }
775 
776         #endregion
777 
778         #region Async Methods
779 
GetValueAsync()780         public override Task<string> GetValueAsync()
781         {
782             CheckAsync();
783             var task = _coreReader.GetValueAsync();
784             _lastTask = task;
785             return task;
786         }
787 
ReadContentAsObjectAsync()788         public override Task<object> ReadContentAsObjectAsync()
789         {
790             CheckAsync();
791             var task = _coreReader.ReadContentAsObjectAsync();
792             _lastTask = task;
793             return task;
794         }
795 
ReadContentAsStringAsync()796         public override Task<string> ReadContentAsStringAsync()
797         {
798             CheckAsync();
799             var task = _coreReader.ReadContentAsStringAsync();
800             _lastTask = task;
801             return task;
802         }
803 
ReadContentAsAsync(Type returnType, IXmlNamespaceResolver namespaceResolver)804         public override Task<object> ReadContentAsAsync(Type returnType, IXmlNamespaceResolver namespaceResolver)
805         {
806             CheckAsync();
807             var task = _coreReader.ReadContentAsAsync(returnType, namespaceResolver);
808             _lastTask = task;
809             return task;
810         }
811 
ReadElementContentAsObjectAsync()812         public override Task<object> ReadElementContentAsObjectAsync()
813         {
814             CheckAsync();
815             var task = _coreReader.ReadElementContentAsObjectAsync();
816             _lastTask = task;
817             return task;
818         }
819 
ReadElementContentAsStringAsync()820         public override Task<string> ReadElementContentAsStringAsync()
821         {
822             CheckAsync();
823             var task = _coreReader.ReadElementContentAsStringAsync();
824             _lastTask = task;
825             return task;
826         }
827 
ReadElementContentAsAsync(Type returnType, IXmlNamespaceResolver namespaceResolver)828         public override Task<object> ReadElementContentAsAsync(Type returnType, IXmlNamespaceResolver namespaceResolver)
829         {
830             CheckAsync();
831             var task = _coreReader.ReadElementContentAsAsync(returnType, namespaceResolver);
832             _lastTask = task;
833             return task;
834         }
835 
ReadAsync()836         public override Task<bool> ReadAsync()
837         {
838             CheckAsync();
839             var task = _coreReader.ReadAsync();
840             _lastTask = task;
841             return task;
842         }
843 
SkipAsync()844         public override Task SkipAsync()
845         {
846             CheckAsync();
847             var task = _coreReader.SkipAsync();
848             _lastTask = task;
849             return task;
850         }
851 
ReadContentAsBase64Async(byte[] buffer, int index, int count)852         public override Task<int> ReadContentAsBase64Async(byte[] buffer, int index, int count)
853         {
854             CheckAsync();
855             var task = _coreReader.ReadContentAsBase64Async(buffer, index, count);
856             _lastTask = task;
857             return task;
858         }
859 
ReadElementContentAsBase64Async(byte[] buffer, int index, int count)860         public override Task<int> ReadElementContentAsBase64Async(byte[] buffer, int index, int count)
861         {
862             CheckAsync();
863             var task = _coreReader.ReadElementContentAsBase64Async(buffer, index, count);
864             _lastTask = task;
865             return task;
866         }
867 
ReadContentAsBinHexAsync(byte[] buffer, int index, int count)868         public override Task<int> ReadContentAsBinHexAsync(byte[] buffer, int index, int count)
869         {
870             CheckAsync();
871             var task = _coreReader.ReadContentAsBinHexAsync(buffer, index, count);
872             _lastTask = task;
873             return task;
874         }
875 
ReadElementContentAsBinHexAsync(byte[] buffer, int index, int count)876         public override Task<int> ReadElementContentAsBinHexAsync(byte[] buffer, int index, int count)
877         {
878             CheckAsync();
879             var task = _coreReader.ReadElementContentAsBinHexAsync(buffer, index, count);
880             _lastTask = task;
881             return task;
882         }
883 
ReadValueChunkAsync(char[] buffer, int index, int count)884         public override Task<int> ReadValueChunkAsync(char[] buffer, int index, int count)
885         {
886             CheckAsync();
887             var task = _coreReader.ReadValueChunkAsync(buffer, index, count);
888             _lastTask = task;
889             return task;
890         }
891 
MoveToContentAsync()892         public override Task<XmlNodeType> MoveToContentAsync()
893         {
894             CheckAsync();
895             var task = _coreReader.MoveToContentAsync();
896             _lastTask = task;
897             return task;
898         }
899 
ReadInnerXmlAsync()900         public override Task<string> ReadInnerXmlAsync()
901         {
902             CheckAsync();
903             var task = _coreReader.ReadInnerXmlAsync();
904             _lastTask = task;
905             return task;
906         }
907 
ReadOuterXmlAsync()908         public override Task<string> ReadOuterXmlAsync()
909         {
910             CheckAsync();
911             var task = _coreReader.ReadOuterXmlAsync();
912             _lastTask = task;
913             return task;
914         }
915         #endregion
916     }
917 
918     internal class XmlAsyncCheckReaderWithNS : XmlAsyncCheckReader, IXmlNamespaceResolver
919     {
920         private readonly IXmlNamespaceResolver _readerAsIXmlNamespaceResolver;
921 
XmlAsyncCheckReaderWithNS(XmlReader reader)922         public XmlAsyncCheckReaderWithNS(XmlReader reader)
923             : base(reader)
924         {
925             _readerAsIXmlNamespaceResolver = (IXmlNamespaceResolver)reader;
926         }
927 
928         #region IXmlNamespaceResolver members
IXmlNamespaceResolver.GetNamespacesInScope(XmlNamespaceScope scope)929         IDictionary<string, string> IXmlNamespaceResolver.GetNamespacesInScope(XmlNamespaceScope scope)
930         {
931             return _readerAsIXmlNamespaceResolver.GetNamespacesInScope(scope);
932         }
933 
IXmlNamespaceResolver.LookupNamespace(string prefix)934         string IXmlNamespaceResolver.LookupNamespace(string prefix)
935         {
936             return _readerAsIXmlNamespaceResolver.LookupNamespace(prefix);
937         }
938 
IXmlNamespaceResolver.LookupPrefix(string namespaceName)939         string IXmlNamespaceResolver.LookupPrefix(string namespaceName)
940         {
941             return _readerAsIXmlNamespaceResolver.LookupPrefix(namespaceName);
942         }
943         #endregion
944     }
945 
946     internal class XmlAsyncCheckReaderWithLineInfo : XmlAsyncCheckReader, IXmlLineInfo
947     {
948         private readonly IXmlLineInfo _readerAsIXmlLineInfo;
949 
XmlAsyncCheckReaderWithLineInfo(XmlReader reader)950         public XmlAsyncCheckReaderWithLineInfo(XmlReader reader)
951             : base(reader)
952         {
953             _readerAsIXmlLineInfo = (IXmlLineInfo)reader;
954         }
955 
956         #region IXmlLineInfo members
HasLineInfo()957         public virtual bool HasLineInfo()
958         {
959             return _readerAsIXmlLineInfo.HasLineInfo();
960         }
961 
962         public virtual int LineNumber
963         {
964             get
965             {
966                 return _readerAsIXmlLineInfo.LineNumber;
967             }
968         }
969 
970         public virtual int LinePosition
971         {
972             get
973             {
974                 return _readerAsIXmlLineInfo.LinePosition;
975             }
976         }
977         #endregion
978     }
979 
980     internal class XmlAsyncCheckReaderWithLineInfoNS : XmlAsyncCheckReaderWithLineInfo, IXmlNamespaceResolver
981     {
982         private readonly IXmlNamespaceResolver _readerAsIXmlNamespaceResolver;
983 
XmlAsyncCheckReaderWithLineInfoNS(XmlReader reader)984         public XmlAsyncCheckReaderWithLineInfoNS(XmlReader reader)
985             : base(reader)
986         {
987             _readerAsIXmlNamespaceResolver = (IXmlNamespaceResolver)reader;
988         }
989 
990         #region IXmlNamespaceResolver members
IXmlNamespaceResolver.GetNamespacesInScope(XmlNamespaceScope scope)991         IDictionary<string, string> IXmlNamespaceResolver.GetNamespacesInScope(XmlNamespaceScope scope)
992         {
993             return _readerAsIXmlNamespaceResolver.GetNamespacesInScope(scope);
994         }
995 
IXmlNamespaceResolver.LookupNamespace(string prefix)996         string IXmlNamespaceResolver.LookupNamespace(string prefix)
997         {
998             return _readerAsIXmlNamespaceResolver.LookupNamespace(prefix);
999         }
1000 
IXmlNamespaceResolver.LookupPrefix(string namespaceName)1001         string IXmlNamespaceResolver.LookupPrefix(string namespaceName)
1002         {
1003             return _readerAsIXmlNamespaceResolver.LookupPrefix(namespaceName);
1004         }
1005         #endregion
1006     }
1007 
1008     internal class XmlAsyncCheckReaderWithLineInfoNSSchema : XmlAsyncCheckReaderWithLineInfoNS, IXmlSchemaInfo
1009     {
1010         private readonly IXmlSchemaInfo _readerAsIXmlSchemaInfo;
1011 
XmlAsyncCheckReaderWithLineInfoNSSchema(XmlReader reader)1012         public XmlAsyncCheckReaderWithLineInfoNSSchema(XmlReader reader)
1013             : base(reader)
1014         {
1015             _readerAsIXmlSchemaInfo = (IXmlSchemaInfo)reader;
1016         }
1017 
1018 
1019         #region IXmlSchemaInfo members
1020 
1021         XmlSchemaValidity IXmlSchemaInfo.Validity
1022         {
1023             get
1024             {
1025                 return _readerAsIXmlSchemaInfo.Validity;
1026             }
1027         }
1028 
1029         bool IXmlSchemaInfo.IsDefault
1030         {
1031             get
1032             {
1033                 return _readerAsIXmlSchemaInfo.IsDefault;
1034             }
1035         }
1036 
1037         bool IXmlSchemaInfo.IsNil
1038         {
1039             get
1040             {
1041                 return _readerAsIXmlSchemaInfo.IsNil;
1042             }
1043         }
1044 
1045         XmlSchemaSimpleType IXmlSchemaInfo.MemberType
1046         {
1047             get
1048             {
1049                 return _readerAsIXmlSchemaInfo.MemberType;
1050             }
1051         }
1052 
1053         XmlSchemaType IXmlSchemaInfo.SchemaType
1054         {
1055             get
1056             {
1057                 return _readerAsIXmlSchemaInfo.SchemaType;
1058             }
1059         }
1060 
1061         XmlSchemaElement IXmlSchemaInfo.SchemaElement
1062         {
1063             get
1064             {
1065                 return _readerAsIXmlSchemaInfo.SchemaElement;
1066             }
1067         }
1068 
1069         XmlSchemaAttribute IXmlSchemaInfo.SchemaAttribute
1070         {
1071             get
1072             {
1073                 return _readerAsIXmlSchemaInfo.SchemaAttribute;
1074             }
1075         }
1076         #endregion
1077     }
1078 }
1079