/* Copyright 2017-present MongoDB Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ using System; namespace MongoDB.Bson.IO { /// /// An abstract base class for an IBsonWriter that wraps another IBsonWriter. /// /// public abstract class WrappingBsonWriter : IBsonWriter { // private fields private bool _disposed; private readonly IBsonWriter _wrapped; // constructors /// /// Initializes a new instance of the class. /// /// The wrapped writer. public WrappingBsonWriter(IBsonWriter wrapped) { if (wrapped == null) { throw new ArgumentNullException(nameof(wrapped)); } _wrapped = wrapped; } // public properties /// public virtual long Position { get { ThrowIfDisposed(); return _wrapped.Position; } } /// public virtual int SerializationDepth { get { ThrowIfDisposed(); return _wrapped.SerializationDepth; } } /// public virtual BsonWriterSettings Settings { get { ThrowIfDisposed(); return _wrapped.Settings; } } /// public virtual BsonWriterState State { get { ThrowIfDisposed(); return _wrapped.State; } } /// /// Gets the wrapped writer. /// /// /// The wrapped writer. /// public IBsonWriter Wrapped { get { ThrowIfDisposed(); return _wrapped; } } // public methods /// public virtual void Close() { // let subclass decide whether to throw or not if Dispose has been called _wrapped.Close(); } /// public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } /// public virtual void Flush() { ThrowIfDisposed(); _wrapped.Flush(); } /// public virtual void PopElementNameValidator() { ThrowIfDisposed(); _wrapped.PopElementNameValidator(); } /// public virtual void PopSettings() { ThrowIfDisposed(); _wrapped.PopSettings(); } /// public virtual void PushElementNameValidator(IElementNameValidator validator) { ThrowIfDisposed(); _wrapped.PushElementNameValidator(validator); } /// public virtual void PushSettings(Action configurator) { ThrowIfDisposed(); _wrapped.PushSettings(configurator); } /// public virtual void WriteBinaryData(BsonBinaryData binaryData) { ThrowIfDisposed(); _wrapped.WriteBinaryData(binaryData); } /// public virtual void WriteBoolean(bool value) { ThrowIfDisposed(); _wrapped.WriteBoolean(value); } /// public virtual void WriteBytes(byte[] bytes) { ThrowIfDisposed(); _wrapped.WriteBytes(bytes); } /// public virtual void WriteDateTime(long value) { ThrowIfDisposed(); _wrapped.WriteDateTime(value); } /// public virtual void WriteDecimal128(Decimal128 value) { ThrowIfDisposed(); _wrapped.WriteDecimal128(value); } /// public virtual void WriteDouble(double value) { ThrowIfDisposed(); _wrapped.WriteDouble(value); } /// public virtual void WriteEndArray() { ThrowIfDisposed(); _wrapped.WriteEndArray(); } /// public virtual void WriteEndDocument() { ThrowIfDisposed(); _wrapped.WriteEndDocument(); } /// public virtual void WriteInt32(int value) { ThrowIfDisposed(); _wrapped.WriteInt32(value); } /// public virtual void WriteInt64(long value) { ThrowIfDisposed(); _wrapped.WriteInt64(value); } /// public virtual void WriteJavaScript(string code) { ThrowIfDisposed(); _wrapped.WriteJavaScript(code); } /// public virtual void WriteJavaScriptWithScope(string code) { ThrowIfDisposed(); _wrapped.WriteJavaScriptWithScope(code); } /// public virtual void WriteMaxKey() { ThrowIfDisposed(); _wrapped.WriteMaxKey(); } /// public virtual void WriteMinKey() { ThrowIfDisposed(); _wrapped.WriteMinKey(); } /// public virtual void WriteName(string name) { ThrowIfDisposed(); _wrapped.WriteName(name); } /// public virtual void WriteNull() { ThrowIfDisposed(); _wrapped.WriteNull(); } /// public virtual void WriteObjectId(ObjectId objectId) { ThrowIfDisposed(); _wrapped.WriteObjectId(objectId); } /// public virtual void WriteRawBsonArray(IByteBuffer slice) { ThrowIfDisposed(); _wrapped.WriteRawBsonArray(slice); } /// public virtual void WriteRawBsonDocument(IByteBuffer slice) { ThrowIfDisposed(); _wrapped.WriteRawBsonDocument(slice); } /// public virtual void WriteRegularExpression(BsonRegularExpression regex) { ThrowIfDisposed(); _wrapped.WriteRegularExpression(regex); } /// public virtual void WriteStartArray() { ThrowIfDisposed(); _wrapped.WriteStartArray(); } /// public virtual void WriteStartDocument() { ThrowIfDisposed(); _wrapped.WriteStartDocument(); } /// public virtual void WriteString(string value) { ThrowIfDisposed(); _wrapped.WriteString(value); } /// public virtual void WriteSymbol(string value) { ThrowIfDisposed(); _wrapped.WriteSymbol(value); } /// public virtual void WriteTimestamp(long value) { ThrowIfDisposed(); _wrapped.WriteTimestamp(value); } /// public virtual void WriteUndefined() { ThrowIfDisposed(); _wrapped.WriteUndefined(); } // protected methods /// /// Releases unmanaged and - optionally - managed resources. /// /// true to release both managed and unmanaged resources; false to release only unmanaged resources. protected virtual void Dispose(bool disposing) { if (!_disposed) { if (disposing) { _wrapped.Dispose(); } _disposed = true; } } /// /// Throws if disposed. /// /// protected void ThrowIfDisposed() { if (_disposed) { throw new ObjectDisposedException(GetType().FullName); } } } }