rlm@1
|
1 // RarVolumeInStream.cpp
|
rlm@1
|
2
|
rlm@1
|
3 #include "StdAfx.h"
|
rlm@1
|
4
|
rlm@1
|
5 #include "RarVolumeInStream.h"
|
rlm@1
|
6
|
rlm@1
|
7 #include "Windows/Defs.h"
|
rlm@1
|
8 #include "Common/Defs.h"
|
rlm@1
|
9
|
rlm@1
|
10 extern "C"
|
rlm@1
|
11 {
|
rlm@1
|
12 #include "../../../../C/7zCrc.h"
|
rlm@1
|
13 }
|
rlm@1
|
14
|
rlm@1
|
15 namespace NArchive {
|
rlm@1
|
16 namespace NRar {
|
rlm@1
|
17
|
rlm@1
|
18 void CFolderInStream::Init(
|
rlm@1
|
19 CObjectVector<CInArchive> *archives,
|
rlm@1
|
20 const CObjectVector<CItemEx> *items,
|
rlm@1
|
21 const CRefItem &refItem)
|
rlm@1
|
22 {
|
rlm@1
|
23 _archives = archives;
|
rlm@1
|
24 _items = items;
|
rlm@1
|
25 _refItem = refItem;
|
rlm@1
|
26 _curIndex = 0;
|
rlm@1
|
27 CRCs.Clear();
|
rlm@1
|
28 _fileIsOpen = false;
|
rlm@1
|
29 }
|
rlm@1
|
30
|
rlm@1
|
31 HRESULT CFolderInStream::OpenStream()
|
rlm@1
|
32 {
|
rlm@1
|
33 while (_curIndex < _refItem.NumItems)
|
rlm@1
|
34 {
|
rlm@1
|
35 const CItemEx &item = (*_items)[_refItem.ItemIndex + _curIndex];
|
rlm@1
|
36 _stream.Attach((*_archives)[_refItem.VolumeIndex + _curIndex].
|
rlm@1
|
37 CreateLimitedStream(item.GetDataPosition(), item.PackSize));
|
rlm@1
|
38 _curIndex++;
|
rlm@1
|
39 _fileIsOpen = true;
|
rlm@1
|
40 _crc = CRC_INIT_VAL;
|
rlm@1
|
41 return S_OK;
|
rlm@1
|
42 }
|
rlm@1
|
43 return S_OK;
|
rlm@1
|
44 }
|
rlm@1
|
45
|
rlm@1
|
46 HRESULT CFolderInStream::CloseStream()
|
rlm@1
|
47 {
|
rlm@1
|
48 CRCs.Add(CRC_GET_DIGEST(_crc));
|
rlm@1
|
49 _stream.Release();
|
rlm@1
|
50 _fileIsOpen = false;
|
rlm@1
|
51 return S_OK;
|
rlm@1
|
52 }
|
rlm@1
|
53
|
rlm@1
|
54 STDMETHODIMP CFolderInStream::Read(void *data, UInt32 size, UInt32 *processedSize)
|
rlm@1
|
55 {
|
rlm@1
|
56 UInt32 realProcessedSize = 0;
|
rlm@1
|
57 while ((_curIndex < _refItem.NumItems || _fileIsOpen) && size > 0)
|
rlm@1
|
58 {
|
rlm@1
|
59 if (_fileIsOpen)
|
rlm@1
|
60 {
|
rlm@1
|
61 UInt32 localProcessedSize;
|
rlm@1
|
62 RINOK(_stream->Read(
|
rlm@1
|
63 ((Byte *)data) + realProcessedSize, size, &localProcessedSize));
|
rlm@1
|
64 _crc = CrcUpdate(_crc, ((Byte *)data) + realProcessedSize, localProcessedSize);
|
rlm@1
|
65 if (localProcessedSize == 0)
|
rlm@1
|
66 {
|
rlm@1
|
67 RINOK(CloseStream());
|
rlm@1
|
68 continue;
|
rlm@1
|
69 }
|
rlm@1
|
70 realProcessedSize += localProcessedSize;
|
rlm@1
|
71 size -= localProcessedSize;
|
rlm@1
|
72 break;
|
rlm@1
|
73 }
|
rlm@1
|
74 else
|
rlm@1
|
75 {
|
rlm@1
|
76 RINOK(OpenStream());
|
rlm@1
|
77 }
|
rlm@1
|
78 }
|
rlm@1
|
79 if (processedSize != 0)
|
rlm@1
|
80 *processedSize = realProcessedSize;
|
rlm@1
|
81 return S_OK;
|
rlm@1
|
82 }
|
rlm@1
|
83
|
rlm@1
|
84 }}
|