WrappingBsonWriter.cs 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361
  1. /* Copyright 2017-present MongoDB Inc.
  2. *
  3. * Licensed under the Apache License, Version 2.0 (the "License");
  4. * you may not use this file except in compliance with the License.
  5. * You may obtain a copy of the License at
  6. *
  7. * http://www.apache.org/licenses/LICENSE-2.0
  8. *
  9. * Unless required by applicable law or agreed to in writing, software
  10. * distributed under the License is distributed on an "AS IS" BASIS,
  11. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. * See the License for the specific language governing permissions and
  13. * limitations under the License.
  14. */
  15. using System;
  16. namespace MongoDB.Bson.IO
  17. {
  18. /// <summary>
  19. /// An abstract base class for an IBsonWriter that wraps another IBsonWriter.
  20. /// </summary>
  21. /// <seealso cref="MongoDB.Bson.IO.IBsonWriter" />
  22. public abstract class WrappingBsonWriter : IBsonWriter
  23. {
  24. // private fields
  25. private bool _disposed;
  26. private readonly IBsonWriter _wrapped;
  27. // constructors
  28. /// <summary>
  29. /// Initializes a new instance of the <see cref="WrappingBsonWriter"/> class.
  30. /// </summary>
  31. /// <param name="wrapped">The wrapped writer.</param>
  32. public WrappingBsonWriter(IBsonWriter wrapped)
  33. {
  34. if (wrapped == null)
  35. {
  36. throw new ArgumentNullException(nameof(wrapped));
  37. }
  38. _wrapped = wrapped;
  39. }
  40. // public properties
  41. /// <inheritdoc />
  42. public virtual long Position
  43. {
  44. get
  45. {
  46. ThrowIfDisposed();
  47. return _wrapped.Position;
  48. }
  49. }
  50. /// <inheritdoc />
  51. public virtual int SerializationDepth
  52. {
  53. get
  54. {
  55. ThrowIfDisposed();
  56. return _wrapped.SerializationDepth;
  57. }
  58. }
  59. /// <inheritdoc />
  60. public virtual BsonWriterSettings Settings
  61. {
  62. get
  63. {
  64. ThrowIfDisposed();
  65. return _wrapped.Settings;
  66. }
  67. }
  68. /// <inheritdoc />
  69. public virtual BsonWriterState State
  70. {
  71. get
  72. {
  73. ThrowIfDisposed();
  74. return _wrapped.State;
  75. }
  76. }
  77. /// <summary>
  78. /// Gets the wrapped writer.
  79. /// </summary>
  80. /// <value>
  81. /// The wrapped writer.
  82. /// </value>
  83. public IBsonWriter Wrapped
  84. {
  85. get
  86. {
  87. ThrowIfDisposed();
  88. return _wrapped;
  89. }
  90. }
  91. // public methods
  92. /// <inheritdoc />
  93. public virtual void Close()
  94. {
  95. // let subclass decide whether to throw or not if Dispose has been called
  96. _wrapped.Close();
  97. }
  98. /// <inheritdoc />
  99. public void Dispose()
  100. {
  101. Dispose(true);
  102. GC.SuppressFinalize(this);
  103. }
  104. /// <inheritdoc />
  105. public virtual void Flush()
  106. {
  107. ThrowIfDisposed();
  108. _wrapped.Flush();
  109. }
  110. /// <inheritdoc />
  111. public virtual void PopElementNameValidator()
  112. {
  113. ThrowIfDisposed();
  114. _wrapped.PopElementNameValidator();
  115. }
  116. /// <inheritdoc />
  117. public virtual void PopSettings()
  118. {
  119. ThrowIfDisposed();
  120. _wrapped.PopSettings();
  121. }
  122. /// <inheritdoc />
  123. public virtual void PushElementNameValidator(IElementNameValidator validator)
  124. {
  125. ThrowIfDisposed();
  126. _wrapped.PushElementNameValidator(validator);
  127. }
  128. /// <inheritdoc />
  129. public virtual void PushSettings(Action<BsonWriterSettings> configurator)
  130. {
  131. ThrowIfDisposed();
  132. _wrapped.PushSettings(configurator);
  133. }
  134. /// <inheritdoc />
  135. public virtual void WriteBinaryData(BsonBinaryData binaryData)
  136. {
  137. ThrowIfDisposed();
  138. _wrapped.WriteBinaryData(binaryData);
  139. }
  140. /// <inheritdoc />
  141. public virtual void WriteBoolean(bool value)
  142. {
  143. ThrowIfDisposed();
  144. _wrapped.WriteBoolean(value);
  145. }
  146. /// <inheritdoc />
  147. public virtual void WriteBytes(byte[] bytes)
  148. {
  149. ThrowIfDisposed();
  150. _wrapped.WriteBytes(bytes);
  151. }
  152. /// <inheritdoc />
  153. public virtual void WriteDateTime(long value)
  154. {
  155. ThrowIfDisposed();
  156. _wrapped.WriteDateTime(value);
  157. }
  158. /// <inheritdoc />
  159. public virtual void WriteDecimal128(Decimal128 value)
  160. {
  161. ThrowIfDisposed();
  162. _wrapped.WriteDecimal128(value);
  163. }
  164. /// <inheritdoc />
  165. public virtual void WriteDouble(double value)
  166. {
  167. ThrowIfDisposed();
  168. _wrapped.WriteDouble(value);
  169. }
  170. /// <inheritdoc />
  171. public virtual void WriteEndArray()
  172. {
  173. ThrowIfDisposed();
  174. _wrapped.WriteEndArray();
  175. }
  176. /// <inheritdoc />
  177. public virtual void WriteEndDocument()
  178. {
  179. ThrowIfDisposed();
  180. _wrapped.WriteEndDocument();
  181. }
  182. /// <inheritdoc />
  183. public virtual void WriteInt32(int value)
  184. {
  185. ThrowIfDisposed();
  186. _wrapped.WriteInt32(value);
  187. }
  188. /// <inheritdoc />
  189. public virtual void WriteInt64(long value)
  190. {
  191. ThrowIfDisposed();
  192. _wrapped.WriteInt64(value);
  193. }
  194. /// <inheritdoc />
  195. public virtual void WriteJavaScript(string code)
  196. {
  197. ThrowIfDisposed();
  198. _wrapped.WriteJavaScript(code);
  199. }
  200. /// <inheritdoc />
  201. public virtual void WriteJavaScriptWithScope(string code)
  202. {
  203. ThrowIfDisposed();
  204. _wrapped.WriteJavaScriptWithScope(code);
  205. }
  206. /// <inheritdoc />
  207. public virtual void WriteMaxKey()
  208. {
  209. ThrowIfDisposed();
  210. _wrapped.WriteMaxKey();
  211. }
  212. /// <inheritdoc />
  213. public virtual void WriteMinKey()
  214. {
  215. ThrowIfDisposed();
  216. _wrapped.WriteMinKey();
  217. }
  218. /// <inheritdoc />
  219. public virtual void WriteName(string name)
  220. {
  221. ThrowIfDisposed();
  222. _wrapped.WriteName(name);
  223. }
  224. /// <inheritdoc />
  225. public virtual void WriteNull()
  226. {
  227. ThrowIfDisposed();
  228. _wrapped.WriteNull();
  229. }
  230. /// <inheritdoc />
  231. public virtual void WriteObjectId(ObjectId objectId)
  232. {
  233. ThrowIfDisposed();
  234. _wrapped.WriteObjectId(objectId);
  235. }
  236. /// <inheritdoc />
  237. public virtual void WriteRawBsonArray(IByteBuffer slice)
  238. {
  239. ThrowIfDisposed();
  240. _wrapped.WriteRawBsonArray(slice);
  241. }
  242. /// <inheritdoc />
  243. public virtual void WriteRawBsonDocument(IByteBuffer slice)
  244. {
  245. ThrowIfDisposed();
  246. _wrapped.WriteRawBsonDocument(slice);
  247. }
  248. /// <inheritdoc />
  249. public virtual void WriteRegularExpression(BsonRegularExpression regex)
  250. {
  251. ThrowIfDisposed();
  252. _wrapped.WriteRegularExpression(regex);
  253. }
  254. /// <inheritdoc />
  255. public virtual void WriteStartArray()
  256. {
  257. ThrowIfDisposed();
  258. _wrapped.WriteStartArray();
  259. }
  260. /// <inheritdoc />
  261. public virtual void WriteStartDocument()
  262. {
  263. ThrowIfDisposed();
  264. _wrapped.WriteStartDocument();
  265. }
  266. /// <inheritdoc />
  267. public virtual void WriteString(string value)
  268. {
  269. ThrowIfDisposed();
  270. _wrapped.WriteString(value);
  271. }
  272. /// <inheritdoc />
  273. public virtual void WriteSymbol(string value)
  274. {
  275. ThrowIfDisposed();
  276. _wrapped.WriteSymbol(value);
  277. }
  278. /// <inheritdoc />
  279. public virtual void WriteTimestamp(long value)
  280. {
  281. ThrowIfDisposed();
  282. _wrapped.WriteTimestamp(value);
  283. }
  284. /// <inheritdoc />
  285. public virtual void WriteUndefined()
  286. {
  287. ThrowIfDisposed();
  288. _wrapped.WriteUndefined();
  289. }
  290. // protected methods
  291. /// <summary>
  292. /// Releases unmanaged and - optionally - managed resources.
  293. /// </summary>
  294. /// <param name="disposing"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param>
  295. protected virtual void Dispose(bool disposing)
  296. {
  297. if (!_disposed)
  298. {
  299. if (disposing)
  300. {
  301. _wrapped.Dispose();
  302. }
  303. _disposed = true;
  304. }
  305. }
  306. /// <summary>
  307. /// Throws if disposed.
  308. /// </summary>
  309. /// <exception cref="ObjectDisposedException"></exception>
  310. protected void ThrowIfDisposed()
  311. {
  312. if (_disposed)
  313. {
  314. throw new ObjectDisposedException(GetType().FullName);
  315. }
  316. }
  317. }
  318. }