Home | History | Annotate | Download | only in Common
      1 // MultiStream.h
      2 
      3 #ifndef __MULTI_STREAM_H
      4 #define __MULTI_STREAM_H
      5 
      6 #include "../../../Common/MyCom.h"
      7 #include "../../../Common/MyVector.h"
      8 
      9 #include "../../IStream.h"
     10 
     11 class CMultiStream:
     12   public IInStream,
     13   public CMyUnknownImp
     14 {
     15   UInt64 _pos;
     16   UInt64 _totalLength;
     17   int _streamIndex;
     18 public:
     19   struct CSubStreamInfo
     20   {
     21     CMyComPtr<IInStream> Stream;
     22     UInt64 Size;
     23     UInt64 GlobalOffset;
     24     UInt64 LocalPos;
     25   };
     26   CObjectVector<CSubStreamInfo> Streams;
     27 
     28   HRESULT Init()
     29   {
     30     UInt64 total = 0;
     31     for (int i = 0; i < Streams.Size(); i++)
     32     {
     33       CSubStreamInfo &s = Streams[i];
     34       s.GlobalOffset = total;
     35       total += Streams[i].Size;
     36       RINOK(s.Stream->Seek(0, STREAM_SEEK_CUR, &s.LocalPos));
     37     }
     38     _totalLength = total;
     39     _pos = 0;
     40     _streamIndex = 0;
     41     return S_OK;
     42   }
     43 
     44   MY_UNKNOWN_IMP1(IInStream)
     45 
     46   STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
     47   STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition);
     48 };
     49 
     50 /*
     51 class COutMultiStream:
     52   public IOutStream,
     53   public CMyUnknownImp
     54 {
     55   int _streamIndex; // required stream
     56   UInt64 _offsetPos; // offset from start of _streamIndex index
     57   UInt64 _absPos;
     58   UInt64 _length;
     59 
     60   struct CSubStreamInfo
     61   {
     62     CMyComPtr<ISequentialOutStream> Stream;
     63     UInt64 Size;
     64     UInt64 Pos;
     65  };
     66   CObjectVector<CSubStreamInfo> Streams;
     67 public:
     68   CMyComPtr<IArchiveUpdateCallback2> VolumeCallback;
     69   void Init()
     70   {
     71     _streamIndex = 0;
     72     _offsetPos = 0;
     73     _absPos = 0;
     74     _length = 0;
     75   }
     76 
     77   MY_UNKNOWN_IMP1(IOutStream)
     78 
     79   STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);
     80   STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition);
     81 };
     82 */
     83 
     84 #endif
     85