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