/* 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);
}
}
}
}