// OffsetStream.cs // ------------------------------------------------------------------ // // Copyright (c) 2009 Dino Chiesa // All rights reserved. // // This code module is part of DotNetZip, a zipfile class library. // // ------------------------------------------------------------------ // // This code is licensed under the Microsoft Public License. // See the file License.txt for the license details. // More info on: http://dotnetzip.codeplex.com // // ------------------------------------------------------------------ // // last saved (in emacs): // Time-stamp: <2009-August-27 12:50:35> // // ------------------------------------------------------------------ // // This module defines logic for handling reading of zip archives embedded // into larger streams. The initial position of the stream serves as // the base offset for all future Seek() operations. // // ------------------------------------------------------------------ using System; using System.IO; namespace OfficeOpenXml.Packaging.Ionic.Zip { internal class OffsetStream : System.IO.Stream, System.IDisposable { private Int64 _originalPosition; private Stream _innerStream; public OffsetStream(Stream s) : base() { _originalPosition = s.Position; _innerStream = s; } public override int Read(byte[] buffer, int offset, int count) { return _innerStream.Read(buffer, offset, count); } public override void Write(byte[] buffer, int offset, int count) { throw new NotImplementedException(); } public override bool CanRead { get { return _innerStream.CanRead; } } public override bool CanSeek { get { return _innerStream.CanSeek; } } public override bool CanWrite { get { return false; } } public override void Flush() { _innerStream.Flush(); } public override long Length { get { return _innerStream.Length; } } public override long Position { get { return _innerStream.Position - _originalPosition; } set { _innerStream.Position = _originalPosition + value; } } public override long Seek(long offset, System.IO.SeekOrigin origin) { return _innerStream.Seek(_originalPosition + offset, origin) - _originalPosition; } public override void SetLength(long value) { throw new NotImplementedException(); } void IDisposable.Dispose() { Close(); } public override void Close() { base.Close(); } } }