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