7zFolderInStream.h 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. // 7z/FolderInStream.h
  2. #ifndef __7Z_FOLDERINSTREAM_H
  3. #define __7Z_FOLDERINSTREAM_H
  4. #include "7zItem.h"
  5. #include "7zHeader.h"
  6. #include "../IArchive.h"
  7. #include "../Common/InStreamWithCRC.h"
  8. #include "../../IStream.h"
  9. #include "../../ICoder.h"
  10. namespace NArchive {
  11. namespace N7z {
  12. class CFolderInStream:
  13. public ISequentialInStream,
  14. public ICompressGetSubStreamSize,
  15. public CMyUnknownImp
  16. {
  17. public:
  18. MY_UNKNOWN_IMP1(ICompressGetSubStreamSize)
  19. CFolderInStream();
  20. STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
  21. STDMETHOD(GetSubStreamSize)(UInt64 subStream, UInt64 *value);
  22. private:
  23. CSequentialInStreamWithCRC *_inStreamWithHashSpec;
  24. CMyComPtr<ISequentialInStream> _inStreamWithHash;
  25. CMyComPtr<IArchiveUpdateCallback> _updateCallback;
  26. bool _currentSizeIsDefined;
  27. UInt64 _currentSize;
  28. bool _fileIsOpen;
  29. UInt64 _filePos;
  30. const UInt32 *_fileIndices;
  31. UInt32 _numFiles;
  32. UInt32 _fileIndex;
  33. HRESULT OpenStream();
  34. HRESULT CloseStream();
  35. void AddDigest();
  36. public:
  37. void Init(IArchiveUpdateCallback *updateCallback,
  38. const UInt32 *fileIndices, UInt32 numFiles);
  39. CRecordVector<bool> Processed;
  40. CRecordVector<UInt32> CRCs;
  41. CRecordVector<UInt64> Sizes;
  42. UInt64 GetFullSize() const
  43. {
  44. UInt64 size = 0;
  45. for (int i = 0; i < Sizes.Size(); i++)
  46. size += Sizes[i];
  47. return size;
  48. }
  49. };
  50. }}
  51. #endif