//------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All rights reserved. //------------------------------------------------------------ namespace System.ServiceModel.Channels { using System; using System.IO; using System.Runtime; class ByteStreamBufferedMessageData { ArraySegment buffer; BufferManager bufferManager; int refCount; public ByteStreamBufferedMessageData(ArraySegment buffer) : this(buffer, null) { } public ByteStreamBufferedMessageData(ArraySegment buffer, BufferManager bufferManager) { if (buffer.Array == null) { throw FxTrace.Exception.ArgumentNull(SR.ArgumentPropertyShouldNotBeNullError("buffer.Array")); } this.buffer = buffer; this.bufferManager = bufferManager; this.refCount = 0; } bool IsClosed { get { return this.refCount < 0; } } public ArraySegment Buffer { get { ThrowIfClosed(); return this.buffer; } } public void Open() { ThrowIfClosed(); this.refCount++; } public void Close() { if (!this.IsClosed) { if (--this.refCount <= 0) { if (this.bufferManager != null && this.buffer.Array != null) { this.bufferManager.ReturnBuffer(this.buffer.Array); } this.bufferManager = null; this.buffer = default(ArraySegment); this.refCount = int.MinValue; } } } public Stream ToStream() { return new ByteStreamBufferedMessageDataStream(this); } void ThrowIfClosed() { if (this.IsClosed) { throw FxTrace.Exception.ObjectDisposed(SR.ObjectDisposed(this)); } } class ByteStreamBufferedMessageDataStream : MemoryStream { ByteStreamBufferedMessageData byteStreamBufferedMessageData; public ByteStreamBufferedMessageDataStream(ByteStreamBufferedMessageData byteStreamBufferedMessageData) : base(byteStreamBufferedMessageData.Buffer.Array, byteStreamBufferedMessageData.Buffer.Offset, byteStreamBufferedMessageData.Buffer.Count, false) { this.byteStreamBufferedMessageData = byteStreamBufferedMessageData; this.byteStreamBufferedMessageData.Open(); //increment the refCount } public override void Close() { this.byteStreamBufferedMessageData.Close(); base.Close(); } } } }