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