rlm@1: // 7z/FolderInStream.h rlm@1: rlm@1: #ifndef __7Z_FOLDERINSTREAM_H rlm@1: #define __7Z_FOLDERINSTREAM_H rlm@1: rlm@1: #include "7zItem.h" rlm@1: #include "7zHeader.h" rlm@1: rlm@1: #include "../IArchive.h" rlm@1: #include "../Common/InStreamWithCRC.h" rlm@1: #include "../../IStream.h" rlm@1: #include "../../ICoder.h" rlm@1: rlm@1: namespace NArchive { rlm@1: namespace N7z { rlm@1: rlm@1: class CFolderInStream: rlm@1: public ISequentialInStream, rlm@1: public ICompressGetSubStreamSize, rlm@1: public CMyUnknownImp rlm@1: { rlm@1: public: rlm@1: rlm@1: MY_UNKNOWN_IMP1(ICompressGetSubStreamSize) rlm@1: rlm@1: CFolderInStream(); rlm@1: rlm@1: STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); rlm@1: rlm@1: STDMETHOD(GetSubStreamSize)(UInt64 subStream, UInt64 *value); rlm@1: private: rlm@1: CSequentialInStreamWithCRC *_inStreamWithHashSpec; rlm@1: CMyComPtr _inStreamWithHash; rlm@1: CMyComPtr _updateCallback; rlm@1: rlm@1: bool _currentSizeIsDefined; rlm@1: UInt64 _currentSize; rlm@1: rlm@1: bool _fileIsOpen; rlm@1: UInt64 _filePos; rlm@1: rlm@1: const UInt32 *_fileIndices; rlm@1: UInt32 _numFiles; rlm@1: UInt32 _fileIndex; rlm@1: rlm@1: HRESULT OpenStream(); rlm@1: HRESULT CloseStream(); rlm@1: void AddDigest(); rlm@1: public: rlm@1: void Init(IArchiveUpdateCallback *updateCallback, rlm@1: const UInt32 *fileIndices, UInt32 numFiles); rlm@1: CRecordVector Processed; rlm@1: CRecordVector CRCs; rlm@1: CRecordVector Sizes; rlm@1: UInt64 GetFullSize() const rlm@1: { rlm@1: UInt64 size = 0; rlm@1: for (int i = 0; i < Sizes.Size(); i++) rlm@1: size += Sizes[i]; rlm@1: return size; rlm@1: } rlm@1: }; rlm@1: rlm@1: }} rlm@1: rlm@1: #endif