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