Advertisement
Guest User

Untitled

a guest
Feb 24th, 2017
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.31 KB | None | 0 0
  1. using System;
  2. using System.Diagnostics.Contracts;
  3. using System.Text;
  4. using Windows.Storage.Streams;
  5.  
  6. namespace IO
  7. {
  8. /// <summary>
  9. /// Indicates whether an <see cref="IDataStream"/> is reading or writing.
  10. /// </summary>
  11. public enum DataStreamMode
  12. {
  13. /// <summary>
  14. /// The <see cref="IDataStream"/> is reading from an underlying stream.
  15. /// </summary>
  16. Read,
  17.  
  18. /// <summary>
  19. /// The <see cref="IDataStream"/> is writing to the underlying stream.
  20. /// </summary>
  21. Write,
  22. }
  23.  
  24. /// <summary>
  25. /// Provides an implementation of the <see cref="IDataStream"/> interface that streams to and from
  26. /// binary data.
  27. ///
  28. /// This class cannot be inherited.
  29. /// </summary>
  30. public sealed class BinaryDataStream
  31. : IDataStream, IDisposable
  32. {
  33. private readonly DataStreamMode mode;
  34. private readonly DataReader reader;
  35. private readonly DataWriter writer;
  36. private readonly bool leaveOpen;
  37. private bool isDisposed;
  38.  
  39. /// <summary>
  40. /// Initializes a new instance of the <see cref="BinaryDataStream"/> class based on the given
  41. /// <see cref="DataReader"/>, and sets <see cref="StreamMode"/> to <see cref="DataStreamMode.Read"/>.
  42. /// </summary>
  43. /// <param name="reader">
  44. /// The <see cref="DataReader"/> to use as the underlying stream.
  45. /// </param>
  46. /// <param name="leaveOpen">
  47. /// <c>true</c> to not dispose <paramref name="reader"/> when this instance is disposed;
  48. /// otherwise, <c>false</c>.
  49. /// </param>
  50. public BinaryDataStream(DataReader reader, bool leaveOpen = false)
  51. {
  52. Contract.Requires<ArgumentNullException>(reader != null);
  53.  
  54. this.reader = reader;
  55. this.mode = DataStreamMode.Read;
  56. this.leaveOpen = leaveOpen;
  57. }
  58.  
  59. /// <summary>
  60. /// Initializes a new instance of the <see cref="BinaryDataStream"/> class based on the given
  61. /// <see cref="DataWriter"/>, and sets <see cref="StreamMode"/> to <see cref="DataStreamMode.Write"/>.
  62. /// </summary>
  63. /// <param name="writer">
  64. /// The <see cref="DataWriter"/> to use as the underlying stream.
  65. /// </param>
  66. /// <param name="leaveOpen">
  67. /// <c>true</c> to not dispose <paramref name="writer"/> when this instance is disposed;
  68. /// otherwise, <c>false</c>.
  69. /// </param>
  70. public BinaryDataStream(DataWriter writer, bool leaveOpen = false)
  71. {
  72. Contract.Requires<ArgumentNullException>(writer != null);
  73.  
  74. this.writer = writer;
  75. this.mode = DataStreamMode.Write;
  76. this.leaveOpen = leaveOpen;
  77. }
  78.  
  79. /// <inheritdoc cref="IDataStream.StreamMode"/>
  80. public DataStreamMode StreamMode
  81. {
  82. get { return this.mode; }
  83. }
  84.  
  85. public bool IsReading
  86. {
  87. get { return this.mode == DataStreamMode.Read; }
  88. }
  89.  
  90. public bool IsWriting
  91. {
  92. get { return this.mode == DataStreamMode.Write; }
  93. }
  94.  
  95. /// <inheritdoc cref="IDataStream.Stream(ref bool)"/>
  96. public void Stream(ref bool value)
  97. {
  98. switch (this.mode)
  99. {
  100. case DataStreamMode.Read: { value = this.reader.ReadBoolean(); } break;
  101. case DataStreamMode.Write: { this.writer.WriteBoolean(value); } break;
  102. }
  103. }
  104.  
  105. /// <inheritdoc cref="IDataStream.Stream(ref byte)"/>
  106. public void Stream(ref byte value)
  107. {
  108. switch (this.mode)
  109. {
  110. case DataStreamMode.Read: { value = this.reader.ReadByte(); } break;
  111. case DataStreamMode.Write: { this.writer.WriteByte(value); } break;
  112. }
  113. }
  114.  
  115. /// <inheritdoc cref="IDataStream.Stream(ref sbyte)"/>
  116. public void Stream(ref sbyte value)
  117. {
  118. switch (this.mode)
  119. {
  120. case DataStreamMode.Read: { value = unchecked((sbyte) this.reader.ReadByte()); } break;
  121. case DataStreamMode.Write: { this.writer.WriteByte(unchecked((byte) this.reader.ReadByte())); } break;
  122. }
  123. }
  124.  
  125. /// <inheritdoc cref="IDataStream.Stream(ref short)"/>
  126. public void Stream(ref short value)
  127. {
  128. switch (this.mode)
  129. {
  130. case DataStreamMode.Read: { value = this.reader.ReadInt16(); } break;
  131. case DataStreamMode.Write: { this.writer.WriteInt16(value); } break;
  132. }
  133. }
  134.  
  135. /// <inheritdoc cref="IDataStream.Stream(ref ushort)"/>
  136. public void Stream(ref ushort value)
  137. {
  138. switch (this.mode)
  139. {
  140. case DataStreamMode.Read: { value = this.reader.ReadUInt16(); } break;
  141. case DataStreamMode.Write: { this.writer.WriteUInt16(value); } break;
  142. }
  143. }
  144.  
  145. /// <inheritdoc cref="IDataStream.Stream(ref int)"/>
  146. public void Stream(ref int value)
  147. {
  148. switch (this.mode)
  149. {
  150. case DataStreamMode.Read: { value = this.reader.ReadInt32(); } break;
  151. case DataStreamMode.Write: { this.writer.WriteInt32(value); } break;
  152. }
  153. }
  154.  
  155. /// <inheritdoc cref="IDataStream.Stream(ref uint)"/>
  156. public void Stream(ref uint value)
  157. {
  158. switch (this.mode)
  159. {
  160. case DataStreamMode.Read: { value = this.reader.ReadUInt32(); } break;
  161. case DataStreamMode.Write: { this.writer.WriteUInt32(value); } break;
  162. }
  163. }
  164.  
  165. /// <inheritdoc cref="IDataStream.Stream(ref long)"/>
  166. public void Stream(ref long value)
  167. {
  168. switch (this.mode)
  169. {
  170. case DataStreamMode.Read: { value = this.reader.ReadInt64(); } break;
  171. case DataStreamMode.Write: { this.writer.WriteInt64(value); } break;
  172. }
  173. }
  174.  
  175. /// <inheritdoc cref="IDataStream.Stream(ref ulong)"/>
  176. public void Stream(ref ulong value)
  177. {
  178. switch (this.mode)
  179. {
  180. case DataStreamMode.Read: { value = this.reader.ReadUInt64(); } break;
  181. case DataStreamMode.Write: { this.writer.WriteUInt64(value); } break;
  182. }
  183. }
  184.  
  185. /// <inheritdoc cref="IDataStream.Stream(ref float)"/>
  186. public void Stream(ref float value)
  187. {
  188. switch (this.mode)
  189. {
  190. case DataStreamMode.Read: { value = this.reader.ReadSingle(); } break;
  191. case DataStreamMode.Write: { this.writer.WriteSingle(value); } break;
  192. }
  193. }
  194.  
  195. /// <inheritdoc cref="IDataStream.Stream(ref double)"/>
  196. public void Stream(ref double value)
  197. {
  198. switch (this.mode)
  199. {
  200. case DataStreamMode.Read: { value = this.reader.ReadDouble(); } break;
  201. case DataStreamMode.Write: { this.writer.WriteDouble(value); } break;
  202. }
  203. }
  204.  
  205. /// <inheritdoc cref="IDataStream.Stream(ref Guid)"/>
  206. public void Stream(ref Guid value)
  207. {
  208. switch (this.mode)
  209. {
  210. case DataStreamMode.Read: { value = this.reader.ReadGuid(); } break;
  211. case DataStreamMode.Write: { this.writer.WriteGuid(value); } break;
  212. }
  213. }
  214.  
  215. /// <inheritdoc cref="IDataStream.Stream(ref DateTimeOffset)"/>
  216. public void Stream(ref DateTimeOffset value)
  217. {
  218. switch (this.mode)
  219. {
  220. case DataStreamMode.Read: { value = this.reader.ReadDateTime(); } break;
  221. case DataStreamMode.Write: { this.writer.WriteDateTime(value); } break;
  222. }
  223. }
  224.  
  225. /// <inheritdoc cref="IDataStream.Stream(ref TimeSpan)"/>
  226. public void Stream(ref TimeSpan value)
  227. {
  228. switch (this.mode)
  229. {
  230. case DataStreamMode.Read: { value = this.reader.ReadTimeSpan(); } break;
  231. case DataStreamMode.Write: { this.writer.WriteTimeSpan(value); } break;
  232. }
  233. }
  234.  
  235. /// <inheritdoc cref="IDataStream.Stream(ref string)"/>
  236. public void Stream(ref string value)
  237. {
  238. // NOTE: null string = (value.charAt(0) == '\0x00' AND strlen(value) == 1)
  239. switch (this.mode)
  240. {
  241. case DataStreamMode.Read:
  242. {
  243. byte[] buffer = new byte[this.reader.ReadUInt32()];
  244. this.reader.ReadBytes(buffer);
  245. if (buffer.Length == 1 && buffer[0] == 0x00) // read null string
  246. {
  247. value = null;
  248. }
  249. else
  250. {
  251. value = Encoding.Unicode.GetString(buffer);
  252. }
  253. }
  254. break;
  255.  
  256. case DataStreamMode.Write:
  257. {
  258. if (value == null) // write null string
  259. {
  260. this.writer.WriteUInt32(1);
  261. this.writer.WriteBytes(new[] { (byte) 0x00 });
  262. }
  263. else
  264. {
  265. uint stringSize = (uint) Encoding.Unicode.GetByteCount(value);
  266. this.writer.WriteUInt32(stringSize);
  267. this.writer.WriteBytes(Encoding.Unicode.GetBytes(value));
  268. }
  269. }
  270. break;
  271. }
  272. }
  273.  
  274. /// <inheritdoc cref="IDataStream.Stream(ref IBuffer)"/>
  275. public void Stream(ref IBuffer buffer)
  276. {
  277. switch (this.mode)
  278. {
  279. case DataStreamMode.Read:
  280. {
  281. uint length = this.reader.ReadUInt32();
  282. buffer = this.reader.ReadBuffer(length);
  283. }
  284. break;
  285.  
  286. case DataStreamMode.Write:
  287. {
  288. this.writer.WriteUInt32(buffer.Length);
  289. this.writer.WriteBuffer(buffer);
  290. }
  291. break;
  292. }
  293. }
  294.  
  295. /// <inheritdoc cref="IDataStream.StreamBytes(byte[], uint, uint)"/>
  296. public void StreamBytes(byte[] value, int offset, int length)
  297. {
  298. switch (this.mode)
  299. {
  300. case DataStreamMode.Read:
  301. {
  302. byte[] buffer = new byte[length];
  303. this.reader.ReadBytes(buffer);
  304. Array.Copy(buffer, 0, value, offset, length);
  305. }
  306. break;
  307.  
  308. case DataStreamMode.Write:
  309. {
  310. byte[] buffer = new byte[length];
  311. Array.Copy(value, offset, buffer, 0, length);
  312. this.writer.WriteBytes(buffer);
  313. }
  314. break;
  315. }
  316. }
  317.  
  318. /// <inheritdoc cref="IDisposable.Dispose"/>
  319. public void Dispose()
  320. {
  321. if (!this.isDisposed)
  322. {
  323. if (!this.leaveOpen)
  324. {
  325. if (this.mode == DataStreamMode.Read) this.reader.Dispose();
  326. if (this.mode == DataStreamMode.Write) this.writer.Dispose();
  327. }
  328. this.isDisposed = true;
  329. }
  330. }
  331. }
  332. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement