XmlNodeWriter.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. //------------------------------------------------------------
  2. // Copyright (c) Microsoft Corporation. All rights reserved.
  3. //------------------------------------------------------------
  4. namespace System.Xml
  5. {
  6. using System.IO;
  7. using System.Collections;
  8. using System.Text;
  9. using System.Diagnostics;
  10. using System.Globalization;
  11. using System.Runtime.Serialization;
  12. using System.Runtime;
  13. using System.Threading;
  14. using System.Collections.Generic;
  15. abstract class XmlNodeWriter
  16. {
  17. static XmlNodeWriter nullNodeWriter;
  18. static public XmlNodeWriter Null
  19. {
  20. get
  21. {
  22. if (nullNodeWriter == null)
  23. nullNodeWriter = new XmlNullNodeWriter();
  24. return nullNodeWriter;
  25. }
  26. }
  27. internal virtual AsyncCompletionResult WriteBase64TextAsync(AsyncEventArgs<XmlNodeWriterWriteBase64TextArgs> state)
  28. {
  29. // We do not guard this invocation. The caller of the NodeWriter should ensure that that
  30. // they override the FastAsync guard clause for the XmlDictionaryWriter and that the
  31. // nodeWriter has an implemenation for WriteBase64TextAsync.
  32. throw Fx.AssertAndThrow("WriteBase64TextAsync not implemented.");
  33. }
  34. public virtual IAsyncResult BeginWriteBase64Text(byte[] trailBuffer, int trailCount, byte[] buffer, int offset, int count, AsyncCallback callback, object state)
  35. {
  36. return new WriteBase64TextAsyncResult(trailBuffer, trailCount, buffer, offset, count, this, callback, state);
  37. }
  38. public virtual void EndWriteBase64Text(IAsyncResult result)
  39. {
  40. WriteBase64TextAsyncResult.End(result);
  41. }
  42. public abstract void Flush();
  43. public abstract void Close();
  44. public abstract void WriteDeclaration();
  45. public abstract void WriteComment(string text);
  46. public abstract void WriteCData(string text);
  47. public abstract void WriteStartElement(string prefix, string localName);
  48. public virtual void WriteStartElement(byte[] prefixBuffer, int prefixOffset, int prefixLength, byte[] localNameBuffer, int localNameOffset, int localNameLength)
  49. {
  50. WriteStartElement(Encoding.UTF8.GetString(prefixBuffer, prefixOffset, prefixLength), Encoding.UTF8.GetString(localNameBuffer, localNameOffset, localNameLength));
  51. }
  52. public abstract void WriteStartElement(string prefix, XmlDictionaryString localName);
  53. public abstract void WriteEndStartElement(bool isEmpty);
  54. public abstract void WriteEndElement(string prefix, string localName);
  55. public virtual void WriteEndElement(byte[] prefixBuffer, int prefixOffset, int prefixLength, byte[] localNameBuffer, int localNameOffset, int localNameLength)
  56. {
  57. WriteEndElement(Encoding.UTF8.GetString(prefixBuffer, prefixOffset, prefixLength), Encoding.UTF8.GetString(localNameBuffer, localNameOffset, localNameLength));
  58. }
  59. public abstract void WriteXmlnsAttribute(string prefix, string ns);
  60. public virtual void WriteXmlnsAttribute(byte[] prefixBuffer, int prefixOffset, int prefixLength, byte[] nsBuffer, int nsOffset, int nsLength)
  61. {
  62. WriteXmlnsAttribute(Encoding.UTF8.GetString(prefixBuffer, prefixOffset, prefixLength), Encoding.UTF8.GetString(nsBuffer, nsOffset, nsLength));
  63. }
  64. public abstract void WriteXmlnsAttribute(string prefix, XmlDictionaryString ns);
  65. public abstract void WriteStartAttribute(string prefix, string localName);
  66. public virtual void WriteStartAttribute(byte[] prefixBuffer, int prefixOffset, int prefixLength, byte[] localNameBuffer, int localNameOffset, int localNameLength)
  67. {
  68. WriteStartAttribute(Encoding.UTF8.GetString(prefixBuffer, prefixOffset, prefixLength), Encoding.UTF8.GetString(localNameBuffer, localNameOffset, localNameLength));
  69. }
  70. public abstract void WriteStartAttribute(string prefix, XmlDictionaryString localName);
  71. public abstract void WriteEndAttribute();
  72. public abstract void WriteCharEntity(int ch);
  73. public abstract void WriteEscapedText(string value);
  74. public abstract void WriteEscapedText(XmlDictionaryString value);
  75. public abstract void WriteEscapedText(char[] chars, int offset, int count);
  76. public abstract void WriteEscapedText(byte[] buffer, int offset, int count);
  77. public abstract void WriteText(string value);
  78. public abstract void WriteText(XmlDictionaryString value);
  79. public abstract void WriteText(char[] chars, int offset, int count);
  80. public abstract void WriteText(byte[] buffer, int offset, int count);
  81. public abstract void WriteInt32Text(int value);
  82. public abstract void WriteInt64Text(Int64 value);
  83. public abstract void WriteBoolText(bool value);
  84. public abstract void WriteUInt64Text(UInt64 value);
  85. public abstract void WriteFloatText(float value);
  86. public abstract void WriteDoubleText(double value);
  87. public abstract void WriteDecimalText(decimal value);
  88. public abstract void WriteDateTimeText(DateTime value);
  89. public abstract void WriteUniqueIdText(UniqueId value);
  90. public abstract void WriteTimeSpanText(TimeSpan value);
  91. public abstract void WriteGuidText(Guid value);
  92. public abstract void WriteStartListText();
  93. public abstract void WriteListSeparator();
  94. public abstract void WriteEndListText();
  95. public abstract void WriteBase64Text(byte[] trailBuffer, int trailCount, byte[] buffer, int offset, int count);
  96. public abstract void WriteQualifiedName(string prefix, XmlDictionaryString localName);
  97. class XmlNullNodeWriter : XmlNodeWriter
  98. {
  99. public override void Flush() { }
  100. public override void Close() { }
  101. public override void WriteDeclaration() { }
  102. public override void WriteComment(string text) { }
  103. public override void WriteCData(string text) { }
  104. public override void WriteStartElement(string prefix, string localName) { }
  105. public override void WriteStartElement(byte[] prefixBuffer, int prefixOffset, int prefixLength, byte[] localNameBuffer, int localNameOffset, int localNameLength) { }
  106. public override void WriteStartElement(string prefix, XmlDictionaryString localName) { }
  107. public override void WriteEndStartElement(bool isEmpty) { }
  108. public override void WriteEndElement(string prefix, string localName) { }
  109. public override void WriteEndElement(byte[] prefixBuffer, int prefixOffset, int prefixLength, byte[] localNameBuffer, int localNameOffset, int localNameLength) { }
  110. public override void WriteXmlnsAttribute(string prefix, string ns) { }
  111. public override void WriteXmlnsAttribute(byte[] prefixBuffer, int prefixOffset, int prefixLength, byte[] nsBuffer, int nsOffset, int nsLength) { }
  112. public override void WriteXmlnsAttribute(string prefix, XmlDictionaryString ns) { }
  113. public override void WriteStartAttribute(string prefix, string localName) { }
  114. public override void WriteStartAttribute(byte[] prefixBuffer, int prefixOffset, int prefixLength, byte[] localNameBuffer, int localNameOffset, int localNameLength) { }
  115. public override void WriteStartAttribute(string prefix, XmlDictionaryString localName) { }
  116. public override void WriteEndAttribute() { }
  117. public override void WriteCharEntity(int ch) { }
  118. public override void WriteEscapedText(string value) { }
  119. public override void WriteEscapedText(XmlDictionaryString value) { }
  120. public override void WriteEscapedText(char[] chars, int offset, int count) { }
  121. public override void WriteEscapedText(byte[] buffer, int offset, int count) { }
  122. public override void WriteText(string value) { }
  123. public override void WriteText(XmlDictionaryString value) { }
  124. public override void WriteText(char[] chars, int offset, int count) { }
  125. public override void WriteText(byte[] buffer, int offset, int count) { }
  126. public override void WriteInt32Text(int value) { }
  127. public override void WriteInt64Text(Int64 value) { }
  128. public override void WriteBoolText(bool value) { }
  129. public override void WriteUInt64Text(UInt64 value) { }
  130. public override void WriteFloatText(float value) { }
  131. public override void WriteDoubleText(double value) { }
  132. public override void WriteDecimalText(decimal value) { }
  133. public override void WriteDateTimeText(DateTime value) { }
  134. public override void WriteUniqueIdText(UniqueId value) { }
  135. public override void WriteTimeSpanText(TimeSpan value) { }
  136. public override void WriteGuidText(Guid value) { }
  137. public override void WriteStartListText() { }
  138. public override void WriteListSeparator() { }
  139. public override void WriteEndListText() { }
  140. public override void WriteBase64Text(byte[] trailBuffer, int trailCount, byte[] buffer, int offset, int count) { }
  141. public override void WriteQualifiedName(string prefix, XmlDictionaryString localName) { }
  142. }
  143. class WriteBase64TextAsyncResult : ScheduleActionItemAsyncResult
  144. {
  145. byte[] trailBuffer;
  146. int trailCount;
  147. byte[] buffer;
  148. int offset;
  149. int count;
  150. XmlNodeWriter nodeWriter;
  151. public WriteBase64TextAsyncResult(byte[] trailBuffer, int trailCount, byte[] buffer, int offset, int count, XmlNodeWriter nodeWriter, AsyncCallback callback, object state)
  152. : base(callback, state)
  153. {
  154. Fx.Assert(nodeWriter != null, "nodeWriter should never be null");
  155. this.trailBuffer = trailBuffer;
  156. this.trailCount = trailCount;
  157. this.buffer = buffer;
  158. this.offset = offset;
  159. this.count = count;
  160. this.nodeWriter = nodeWriter;
  161. Schedule();
  162. }
  163. protected override void OnDoWork()
  164. {
  165. this.nodeWriter.WriteBase64Text(this.trailBuffer, this.trailCount, this.buffer, this.offset, this.count);
  166. }
  167. }
  168. }
  169. }