File: Base\MS\Internal\IO\Packaging\CompoundFile\StreamWithDictionary.cs
Project: wpf\src\WindowsBase.csproj (WindowsBase)
//-----------------------------------------------------------------------------
//
// <copyright file="StreamWithDictionary.cs" company="Microsoft">
//    Copyright (C) Microsoft Corporation.  All rights reserved.
// </copyright>
//
// Description:
//   The object for wrapping a data stream and its associated context
//   information dictionary.
//
// History:
//  07/05/2002: RogerCh: Initial implementation.
//  05/20/2003: RogerCh: Ported to WCP tree.
//
//-----------------------------------------------------------------------------
 
using System;
using System.Collections;
using System.IO;
 
namespace MS.Internal.IO.Packaging.CompoundFile
{
    internal class StreamWithDictionary : Stream, IDictionary
    {
        Stream baseStream;
        IDictionary baseDictionary;
        private bool _disposed;         // keep track of if we are disposed
 
        internal StreamWithDictionary( Stream wrappedStream, IDictionary wrappedDictionary )
        {
            baseStream = wrappedStream;
            baseDictionary = wrappedDictionary;
        }
 
        /*************************************************************************/
        // Stream members
        public override bool CanRead { get{ return !_disposed && baseStream.CanRead; }}
        public override bool CanSeek { get { return !_disposed && baseStream.CanSeek; } }
        public override bool CanWrite { get { return !_disposed && baseStream.CanWrite; } }
        public override long Length  
        {
            get
            {
                CheckDisposed();
                return baseStream.Length;
            }
        }
 
        public override long Position
        {
            get
            {
                CheckDisposed();
                return baseStream.Position;
            } 
            set
            {
                CheckDisposed();
                baseStream.Position = value;
            }
        }
 
        public override void Flush() 
        {
            CheckDisposed();
            baseStream.Flush(); 
        }
 
        public override long Seek( long offset, SeekOrigin origin )
        {
            CheckDisposed();
            return baseStream.Seek(offset, origin);
        }
 
        public override void SetLength( long newLength ) 
        {
            CheckDisposed();
            baseStream.SetLength(newLength);
        }
 
        public override int Read( byte[] buffer, int offset, int count )
        {
            CheckDisposed();
            return baseStream.Read(buffer, offset, count);
        }
 
        public override void Write( byte[] buffer, int offset, int count )
        {
            CheckDisposed();
            baseStream.Write(buffer, offset, count);
        }
 
        //------------------------------------------------------
        //
        //  Protected Methods
        //
        //------------------------------------------------------
        /// <summary>
        /// Dispose(bool)
        /// </summary>
        /// <param name="disposing"></param>
        protected override void Dispose(bool disposing)
        {
            try
            {
                if (disposing && !_disposed)
                {
                    _disposed = true;
                    baseStream.Close();
                }
            }
            finally
            {
                base.Dispose(disposing);
            }
        }
 
        /*************************************************************************/
        // IDictionary members
        bool IDictionary.Contains( object key )
        {
            CheckDisposed();
            return baseDictionary.Contains(key);
        }
 
        void IDictionary.Add( object key, object val )
        {
            CheckDisposed();
            baseDictionary.Add(key, val);
        }
 
        void IDictionary.Clear()
        {
            CheckDisposed();
            baseDictionary.Clear();
        }
 
        IDictionaryEnumerator IDictionary.GetEnumerator()
        {
            CheckDisposed();
            // IDictionary.GetEnumerator vs. IEnumerable.GetEnumerator?
            return ((IDictionary)baseDictionary).GetEnumerator();
        }
 
        void IDictionary.Remove( object key )
        {
            CheckDisposed();
            baseDictionary.Remove(key);
        }
 
        object IDictionary.this[ object index ]
        {
            get
            {
                CheckDisposed();
                return baseDictionary[index];
            }
            set
            {
                CheckDisposed();
                baseDictionary[index] = value;
            }
        }
 
        ICollection IDictionary.Keys
        {
            get
            {
                CheckDisposed();
                return baseDictionary.Keys;
            }
        }
 
        ICollection IDictionary.Values
        {
            get
            {
                CheckDisposed();
                return baseDictionary.Values;
            }
        }
 
        bool IDictionary.IsReadOnly
        {
            get
            {
                CheckDisposed();
                return baseDictionary.IsReadOnly;
            }
        }
 
        bool IDictionary.IsFixedSize
        {
            get
            {
                CheckDisposed();
                return baseDictionary.IsFixedSize;
            }
        }
 
        /*************************************************************************/
        // ICollection methods
 
        void ICollection.CopyTo( Array array, int index )
        {
            CheckDisposed();
            ((ICollection)baseDictionary).CopyTo(array, index);
        }
 
        int ICollection.Count
        {
            get
            {
                CheckDisposed();
                return ((ICollection)baseDictionary).Count;
            }
        }
 
        object ICollection.SyncRoot
        {
            get
            {
                CheckDisposed();
                return ((ICollection)baseDictionary).SyncRoot;
            }
        }
 
        bool ICollection.IsSynchronized
        {
            get
            {
                CheckDisposed();
                return ((ICollection)baseDictionary).IsSynchronized;
            }
        }
 
        /*************************************************************************/
        // IEnumerable method
 
        IEnumerator IEnumerable.GetEnumerator()
        {
            CheckDisposed();
            return ((IEnumerable)baseDictionary).GetEnumerator();
        }
 
        /// <summary>
        /// Disposed - were we disposed? Offer this to DataSpaceManager so it can do smart flushing
        /// </summary>
        /// <returns></returns>
        internal bool Disposed
        {
            get
            {
                return _disposed;
            }
        }
 
        //------------------------------------------------------
        //
        //  Private Methods
        //
        //------------------------------------------------------
        private void CheckDisposed()
        {
            if (_disposed)
                throw new ObjectDisposedException("Stream");
        }
    }
}