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   unsigned _streamIndex;
     18 
     19 public:
     20 
     21   struct CSubStreamInfo
     22   {
     23     CMyComPtr<IInStream> Stream;
     24     UInt64 Size;
     25     UInt64 GlobalOffset;
     26     UInt64 LocalPos;
     27 
     28     CSubStreamInfo(): Size(0), GlobalOffset(0), LocalPos(0) {}
     29   };
     30 
     31   CObjectVector<CSubStreamInfo> Streams;
     32 
     33   HRESULT Init()
     34   {
     35     UInt64 total = 0;
     36     FOR_VECTOR (i, Streams)
     37     {
     38       CSubStreamInfo &s = Streams[i];
     39       s.GlobalOffset = total;
     40       total += Streams[i].Size;
     41       RINOK(s.Stream->Seek(0, STREAM_SEEK_CUR, &s.LocalPos));
     42     }
     43     _totalLength = total;
     44     _pos = 0;
     45     _streamIndex = 0;
     46     return S_OK;
     47   }
     48 
     49   MY_UNKNOWN_IMP1(IInStream)
     50 
     51   STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
     52   STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition);
     53 };
     54 
     55 /*
     56 class COutMultiStream:
     57   public IOutStream,
     58   public CMyUnknownImp
     59 {
     60   unsigned _streamIndex; // required stream
     61   UInt64 _offsetPos; // offset from start of _streamIndex index
     62   UInt64 _absPos;
     63   UInt64 _length;
     64 
     65   struct CSubStreamInfo
     66   {
     67     CMyComPtr<ISequentialOutStream> Stream;
     68     UInt64 Size;
     69     UInt64 Pos;
     70  };
     71   CObjectVector<CSubStreamInfo> Streams;
     72 public:
     73   CMyComPtr<IArchiveUpdateCallback2> VolumeCallback;
     74   void Init()
     75   {
     76     _streamIndex = 0;
     77     _offsetPos = 0;
     78     _absPos = 0;
     79     _length = 0;
     80   }
     81 
     82   MY_UNKNOWN_IMP1(IOutStream)
     83 
     84   STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);
     85   STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition);
     86 };
     87 */
     88 
     89 #endif
     90