1 // ArchiveExtractCallback.h 2 3 #ifndef __ARCHIVE_EXTRACT_CALLBACK_H 4 #define __ARCHIVE_EXTRACT_CALLBACK_H 5 6 #include "Common/MyCom.h" 7 #include "Common/Wildcard.h" 8 9 #include "../../IPassword.h" 10 11 #include "../../Common/FileStreams.h" 12 #include "../../Common/ProgressUtils.h" 13 14 #include "../../Archive/IArchive.h" 15 16 #include "../../Archive/Common/OutStreamWithCRC.h" 17 18 #include "ExtractMode.h" 19 #include "IFileExtractCallback.h" 20 #include "OpenArchive.h" 21 22 class CArchiveExtractCallback: 23 public IArchiveExtractCallback, 24 // public IArchiveVolumeExtractCallback, 25 public ICryptoGetTextPassword, 26 public ICompressProgressInfo, 27 public CMyUnknownImp 28 { 29 const CArc *_arc; 30 const NWildcard::CCensorNode *_wildcardCensor; 31 CMyComPtr<IFolderArchiveExtractCallback> _extractCallback2; 32 CMyComPtr<ICompressProgressInfo> _compressProgress; 33 CMyComPtr<ICryptoGetTextPassword> _cryptoGetTextPassword; 34 UString _directoryPath; 35 NExtract::NPathMode::EEnum _pathMode; 36 NExtract::NOverwriteMode::EEnum _overwriteMode; 37 38 UString _diskFilePath; 39 UString _filePath; 40 UInt64 _position; 41 bool _isSplit; 42 43 bool _extractMode; 44 45 bool WriteCTime; 46 bool WriteATime; 47 bool WriteMTime; 48 49 bool _encrypted; 50 51 struct CProcessedFileInfo 52 { 53 FILETIME CTime; 54 FILETIME ATime; 55 FILETIME MTime; 56 UInt32 Attrib; 57 58 bool CTimeDefined; 59 bool ATimeDefined; 60 bool MTimeDefined; 61 bool AttribDefined; 62 63 bool IsDir; 64 } _fi; 65 66 UInt32 _index; 67 UInt64 _curSize; 68 bool _curSizeDefined; 69 COutFileStream *_outFileStreamSpec; 70 CMyComPtr<ISequentialOutStream> _outFileStream; 71 72 COutStreamWithCRC *_crcStreamSpec; 73 CMyComPtr<ISequentialOutStream> _crcStream; 74 75 UStringVector _removePathParts; 76 77 bool _stdOutMode; 78 bool _testMode; 79 bool _crcMode; 80 bool _multiArchives; 81 82 CMyComPtr<ICompressProgressInfo> _localProgress; 83 UInt64 _packTotal; 84 UInt64 _unpTotal; 85 86 void CreateComplexDirectory(const UStringVector &dirPathParts, UString &fullPath); 87 HRESULT GetTime(int index, PROPID propID, FILETIME &filetime, bool &filetimeIsDefined); 88 HRESULT GetUnpackSize(); 89 90 public: 91 92 CLocalProgress *LocalProgressSpec; 93 94 UInt64 NumFolders; 95 UInt64 NumFiles; 96 UInt64 UnpackSize; 97 UInt32 CrcSum; 98 99 MY_UNKNOWN_IMP2(ICryptoGetTextPassword, ICompressProgressInfo) 100 // COM_INTERFACE_ENTRY(IArchiveVolumeExtractCallback) 101 102 INTERFACE_IArchiveExtractCallback(;) 103 104 STDMETHOD(SetRatioInfo)(const UInt64 *inSize, const UInt64 *outSize); 105 106 // IArchiveVolumeExtractCallback 107 // STDMETHOD(GetInStream)(const wchar_t *name, ISequentialInStream **inStream); 108 109 STDMETHOD(CryptoGetTextPassword)(BSTR *password); 110 111 CArchiveExtractCallback(): 112 WriteCTime(true), 113 WriteATime(true), 114 WriteMTime(true), 115 _multiArchives(false) 116 { 117 LocalProgressSpec = new CLocalProgress(); 118 _localProgress = LocalProgressSpec; 119 } 120 121 void InitForMulti(bool multiArchives, 122 NExtract::NPathMode::EEnum pathMode, 123 NExtract::NOverwriteMode::EEnum overwriteMode) 124 { 125 _multiArchives = multiArchives; 126 _pathMode = pathMode; 127 _overwriteMode = overwriteMode; 128 NumFolders = NumFiles = UnpackSize = 0; 129 CrcSum = 0; 130 } 131 132 void Init( 133 const NWildcard::CCensorNode *wildcardCensor, 134 const CArc *arc, 135 IFolderArchiveExtractCallback *extractCallback2, 136 bool stdOutMode, bool testMode, bool crcMode, 137 const UString &directoryPath, 138 const UStringVector &removePathParts, 139 UInt64 packSize); 140 141 }; 142 143 #endif 144