15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MultiStream.h
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef __MULTI_STREAM_H
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define __MULTI_STREAM_H
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "../../../Common/MyCom.h"
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "../../../Common/MyVector.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "../../IStream.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CMultiStream:
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  public IInStream,
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  public CMyUnknownImp
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UInt64 _pos;
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UInt64 _totalLength;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int _streamIndex;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public:
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct CSubStreamInfo
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CMyComPtr<IInStream> Stream;
2290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    UInt64 Size;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UInt64 GlobalOffset;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UInt64 LocalPos;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CObjectVector<CSubStreamInfo> Streams;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT Init()
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UInt64 total = 0;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (int i = 0; i < Streams.Size(); i++)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CSubStreamInfo &s = Streams[i];
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      s.GlobalOffset = total;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      total += Streams[i].Size;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      RINOK(s.Stream->Seek(0, STREAM_SEEK_CUR, &s.LocalPos));
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _totalLength = total;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _pos = 0;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _streamIndex = 0;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return S_OK;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MY_UNKNOWN_IMP1(IInStream)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class COutMultiStream:
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  public IOutStream,
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  public CMyUnknownImp
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int _streamIndex; // required stream
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UInt64 _offsetPos; // offset from start of _streamIndex index
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UInt64 _absPos;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UInt64 _length;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct CSubStreamInfo
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CMyComPtr<ISequentialOutStream> Stream;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UInt64 Size;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UInt64 Pos;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) };
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CObjectVector<CSubStreamInfo> Streams;
6723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)public:
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CMyComPtr<IArchiveUpdateCallback2> VolumeCallback;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Init()
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _streamIndex = 0;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _offsetPos = 0;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _absPos = 0;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _length = 0;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MY_UNKNOWN_IMP1(IOutStream)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);
805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition);
815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)};
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)