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