xref: /aosp_15_r20/external/lzma/CPP/7zip/UI/FileManager/ExtractCallback.h (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // ExtractCallback.h
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_EXTRACT_CALLBACK_H
4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_EXTRACT_CALLBACK_H
5*f6dc9357SAndroid Build Coastguard Worker 
6*f6dc9357SAndroid Build Coastguard Worker #include "../../../../C/Alloc.h"
7*f6dc9357SAndroid Build Coastguard Worker 
8*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/MyCom.h"
9*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/StringConvert.h"
10*f6dc9357SAndroid Build Coastguard Worker 
11*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_SFX
12*f6dc9357SAndroid Build Coastguard Worker #include "../Agent/IFolderArchive.h"
13*f6dc9357SAndroid Build Coastguard Worker #endif
14*f6dc9357SAndroid Build Coastguard Worker 
15*f6dc9357SAndroid Build Coastguard Worker #include "../Common/ArchiveExtractCallback.h"
16*f6dc9357SAndroid Build Coastguard Worker #include "../Common/ArchiveOpenCallback.h"
17*f6dc9357SAndroid Build Coastguard Worker 
18*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_NO_CRYPTO
19*f6dc9357SAndroid Build Coastguard Worker #include "../../IPassword.h"
20*f6dc9357SAndroid Build Coastguard Worker #endif
21*f6dc9357SAndroid Build Coastguard Worker 
22*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_SFX
23*f6dc9357SAndroid Build Coastguard Worker #include "IFolder.h"
24*f6dc9357SAndroid Build Coastguard Worker #endif
25*f6dc9357SAndroid Build Coastguard Worker 
26*f6dc9357SAndroid Build Coastguard Worker #include "ProgressDialog2.h"
27*f6dc9357SAndroid Build Coastguard Worker 
28*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_SFX
29*f6dc9357SAndroid Build Coastguard Worker 
30*f6dc9357SAndroid Build Coastguard Worker class CGrowBuf
31*f6dc9357SAndroid Build Coastguard Worker {
32*f6dc9357SAndroid Build Coastguard Worker   Byte *_items;
33*f6dc9357SAndroid Build Coastguard Worker   size_t _size;
34*f6dc9357SAndroid Build Coastguard Worker 
Z7_CLASS_NO_COPY(CGrowBuf)35*f6dc9357SAndroid Build Coastguard Worker   Z7_CLASS_NO_COPY(CGrowBuf)
36*f6dc9357SAndroid Build Coastguard Worker 
37*f6dc9357SAndroid Build Coastguard Worker public:
38*f6dc9357SAndroid Build Coastguard Worker   void Free()
39*f6dc9357SAndroid Build Coastguard Worker   {
40*f6dc9357SAndroid Build Coastguard Worker     MyFree(_items);
41*f6dc9357SAndroid Build Coastguard Worker     _items = NULL;
42*f6dc9357SAndroid Build Coastguard Worker     _size = 0;
43*f6dc9357SAndroid Build Coastguard Worker   }
44*f6dc9357SAndroid Build Coastguard Worker 
45*f6dc9357SAndroid Build Coastguard Worker   // newSize >= keepSize
ReAlloc_KeepData(size_t newSize,size_t keepSize)46*f6dc9357SAndroid Build Coastguard Worker   bool ReAlloc_KeepData(size_t newSize, size_t keepSize)
47*f6dc9357SAndroid Build Coastguard Worker   {
48*f6dc9357SAndroid Build Coastguard Worker     void *buf = NULL;
49*f6dc9357SAndroid Build Coastguard Worker     if (newSize)
50*f6dc9357SAndroid Build Coastguard Worker     {
51*f6dc9357SAndroid Build Coastguard Worker       buf = MyAlloc(newSize);
52*f6dc9357SAndroid Build Coastguard Worker       if (!buf)
53*f6dc9357SAndroid Build Coastguard Worker         return false;
54*f6dc9357SAndroid Build Coastguard Worker     }
55*f6dc9357SAndroid Build Coastguard Worker     if (keepSize)
56*f6dc9357SAndroid Build Coastguard Worker       memcpy(buf, _items, keepSize);
57*f6dc9357SAndroid Build Coastguard Worker     MyFree(_items);
58*f6dc9357SAndroid Build Coastguard Worker     _items = (Byte *)buf;
59*f6dc9357SAndroid Build Coastguard Worker     _size = newSize;
60*f6dc9357SAndroid Build Coastguard Worker     return true;
61*f6dc9357SAndroid Build Coastguard Worker   }
62*f6dc9357SAndroid Build Coastguard Worker 
CGrowBuf()63*f6dc9357SAndroid Build Coastguard Worker   CGrowBuf(): _items(NULL), _size(0) {}
~CGrowBuf()64*f6dc9357SAndroid Build Coastguard Worker   ~CGrowBuf() { MyFree(_items); }
65*f6dc9357SAndroid Build Coastguard Worker 
66*f6dc9357SAndroid Build Coastguard Worker   operator Byte *() { return _items; }
67*f6dc9357SAndroid Build Coastguard Worker   operator const Byte *() const { return _items; }
Size()68*f6dc9357SAndroid Build Coastguard Worker   size_t Size() const { return _size; }
69*f6dc9357SAndroid Build Coastguard Worker };
70*f6dc9357SAndroid Build Coastguard Worker 
71*f6dc9357SAndroid Build Coastguard Worker 
72*f6dc9357SAndroid Build Coastguard Worker struct CVirtFile
73*f6dc9357SAndroid Build Coastguard Worker {
74*f6dc9357SAndroid Build Coastguard Worker   CGrowBuf Data;
75*f6dc9357SAndroid Build Coastguard Worker 
76*f6dc9357SAndroid Build Coastguard Worker   UInt64 ExpectedSize; // size from props request. 0 if unknown
77*f6dc9357SAndroid Build Coastguard Worker   size_t WrittenSize;  // size of written data in (Data) buffer
78*f6dc9357SAndroid Build Coastguard Worker                        //   use (WrittenSize) only if (CVirtFileSystem::_newVirtFileStream_IsReadyToWrite == false)
79*f6dc9357SAndroid Build Coastguard Worker   UString BaseName;    // original name of file inside archive,
80*f6dc9357SAndroid Build Coastguard Worker                        // It's not path. So any path separators
81*f6dc9357SAndroid Build Coastguard Worker                        // should be treated as part of name (or as incorrect chars)
82*f6dc9357SAndroid Build Coastguard Worker   UString AltStreamName;
83*f6dc9357SAndroid Build Coastguard Worker 
84*f6dc9357SAndroid Build Coastguard Worker   bool CTime_Defined;
85*f6dc9357SAndroid Build Coastguard Worker   bool ATime_Defined;
86*f6dc9357SAndroid Build Coastguard Worker   bool MTime_Defined;
87*f6dc9357SAndroid Build Coastguard Worker   bool Attrib_Defined;
88*f6dc9357SAndroid Build Coastguard Worker 
89*f6dc9357SAndroid Build Coastguard Worker   // bool IsDir;
90*f6dc9357SAndroid Build Coastguard Worker   bool IsAltStream;
91*f6dc9357SAndroid Build Coastguard Worker   bool ColonWasUsed;
92*f6dc9357SAndroid Build Coastguard Worker   DWORD Attrib;
93*f6dc9357SAndroid Build Coastguard Worker 
94*f6dc9357SAndroid Build Coastguard Worker   FILETIME CTime;
95*f6dc9357SAndroid Build Coastguard Worker   FILETIME ATime;
96*f6dc9357SAndroid Build Coastguard Worker   FILETIME MTime;
97*f6dc9357SAndroid Build Coastguard Worker 
CVirtFileCVirtFile98*f6dc9357SAndroid Build Coastguard Worker   CVirtFile():
99*f6dc9357SAndroid Build Coastguard Worker     CTime_Defined(false),
100*f6dc9357SAndroid Build Coastguard Worker     ATime_Defined(false),
101*f6dc9357SAndroid Build Coastguard Worker     MTime_Defined(false),
102*f6dc9357SAndroid Build Coastguard Worker     Attrib_Defined(false),
103*f6dc9357SAndroid Build Coastguard Worker     // IsDir(false),
104*f6dc9357SAndroid Build Coastguard Worker     IsAltStream(false),
105*f6dc9357SAndroid Build Coastguard Worker     ColonWasUsed(false)
106*f6dc9357SAndroid Build Coastguard Worker     {}
107*f6dc9357SAndroid Build Coastguard Worker };
108*f6dc9357SAndroid Build Coastguard Worker 
109*f6dc9357SAndroid Build Coastguard Worker 
110*f6dc9357SAndroid Build Coastguard Worker /*
111*f6dc9357SAndroid Build Coastguard Worker   We use CVirtFileSystem only for single file extraction:
112*f6dc9357SAndroid Build Coastguard Worker   It supports the following cases and names:
113*f6dc9357SAndroid Build Coastguard Worker      - "fileName" : single file
114*f6dc9357SAndroid Build Coastguard Worker      - "fileName" item (main base file) and additional "fileName:altStream" items
115*f6dc9357SAndroid Build Coastguard Worker      - "altStream" : single item without "fileName:" prefix.
116*f6dc9357SAndroid Build Coastguard Worker   If file is flushed to disk, it uses Get_Correct_FsFile_Name(name).
117*f6dc9357SAndroid Build Coastguard Worker */
118*f6dc9357SAndroid Build Coastguard Worker 
119*f6dc9357SAndroid Build Coastguard Worker Z7_CLASS_IMP_NOQIB_1(
120*f6dc9357SAndroid Build Coastguard Worker   CVirtFileSystem,
121*f6dc9357SAndroid Build Coastguard Worker   ISequentialOutStream
122*f6dc9357SAndroid Build Coastguard Worker )
123*f6dc9357SAndroid Build Coastguard Worker   unsigned _numFlushed;
124*f6dc9357SAndroid Build Coastguard Worker public:
125*f6dc9357SAndroid Build Coastguard Worker   bool IsAltStreamFile; // in:
126*f6dc9357SAndroid Build Coastguard Worker       // = true,  if extracting file is alt stream without "fileName:" prefix.
127*f6dc9357SAndroid Build Coastguard Worker       // = false, if extracting file is normal file, but additional
128*f6dc9357SAndroid Build Coastguard Worker       //          alt streams "fileName:altStream" items are possible.
129*f6dc9357SAndroid Build Coastguard Worker private:
130*f6dc9357SAndroid Build Coastguard Worker   bool _newVirtFileStream_IsReadyToWrite;    // it can non real file (if can't open alt stream)
131*f6dc9357SAndroid Build Coastguard Worker   bool _needWriteToRealFile;  // we need real writing to open file.
132*f6dc9357SAndroid Build Coastguard Worker   bool _wasSwitchedToFsMode;
133*f6dc9357SAndroid Build Coastguard Worker   bool _altStream_NeedRestore_Attrib_bool;
134*f6dc9357SAndroid Build Coastguard Worker   DWORD _altStream_NeedRestore_AttribVal;
135*f6dc9357SAndroid Build Coastguard Worker 
136*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr2<ISequentialOutStream, COutFileStream> _outFileStream;
137*f6dc9357SAndroid Build Coastguard Worker public:
138*f6dc9357SAndroid Build Coastguard Worker   CObjectVector<CVirtFile> Files;
139*f6dc9357SAndroid Build Coastguard Worker   size_t MaxTotalAllocSize; // remain size, including Files.Back()
140*f6dc9357SAndroid Build Coastguard Worker   FString DirPrefix; // files will be flushed to this FS directory.
141*f6dc9357SAndroid Build Coastguard Worker   UString FileName; // name of file that will be extracted.
142*f6dc9357SAndroid Build Coastguard Worker                     // it can be name of alt stream without "fileName:" prefix, if (IsAltStreamFile == trye).
143*f6dc9357SAndroid Build Coastguard Worker                     // we use that name to detect altStream part in "FileName:altStream".
144*f6dc9357SAndroid Build Coastguard Worker   CByteBuffer ZoneBuf;
145*f6dc9357SAndroid Build Coastguard Worker   int Index_of_MainExtractedFile_in_Files; // out: index in Files. == -1, if expected file was not extracted
146*f6dc9357SAndroid Build Coastguard Worker   int Index_of_ZoneBuf_AltStream_in_Files; // out: index in Files. == -1, if no zonbuf alt stream
147*f6dc9357SAndroid Build Coastguard Worker 
148*f6dc9357SAndroid Build Coastguard Worker 
CVirtFileSystem()149*f6dc9357SAndroid Build Coastguard Worker   CVirtFileSystem()
150*f6dc9357SAndroid Build Coastguard Worker   {
151*f6dc9357SAndroid Build Coastguard Worker     _numFlushed = 0;
152*f6dc9357SAndroid Build Coastguard Worker     IsAltStreamFile = false;
153*f6dc9357SAndroid Build Coastguard Worker     _newVirtFileStream_IsReadyToWrite = false;
154*f6dc9357SAndroid Build Coastguard Worker     _needWriteToRealFile = false;
155*f6dc9357SAndroid Build Coastguard Worker     _wasSwitchedToFsMode = false;
156*f6dc9357SAndroid Build Coastguard Worker     _altStream_NeedRestore_Attrib_bool = false;
157*f6dc9357SAndroid Build Coastguard Worker     MaxTotalAllocSize = (size_t)0 - 1;
158*f6dc9357SAndroid Build Coastguard Worker     Index_of_MainExtractedFile_in_Files = -1;
159*f6dc9357SAndroid Build Coastguard Worker     Index_of_ZoneBuf_AltStream_in_Files = -1;
160*f6dc9357SAndroid Build Coastguard Worker   }
161*f6dc9357SAndroid Build Coastguard Worker 
WasStreamFlushedToFS()162*f6dc9357SAndroid Build Coastguard Worker   bool WasStreamFlushedToFS() const { return _wasSwitchedToFsMode; }
163*f6dc9357SAndroid Build Coastguard Worker 
CloseMemFile()164*f6dc9357SAndroid Build Coastguard Worker   HRESULT CloseMemFile()
165*f6dc9357SAndroid Build Coastguard Worker   {
166*f6dc9357SAndroid Build Coastguard Worker     if (_wasSwitchedToFsMode)
167*f6dc9357SAndroid Build Coastguard Worker       return FlushToDisk(true); // closeLast
168*f6dc9357SAndroid Build Coastguard Worker     CVirtFile &file = Files.Back();
169*f6dc9357SAndroid Build Coastguard Worker     if (file.Data.Size() != file.WrittenSize)
170*f6dc9357SAndroid Build Coastguard Worker       file.Data.ReAlloc_KeepData(file.WrittenSize, file.WrittenSize);
171*f6dc9357SAndroid Build Coastguard Worker     return S_OK;
172*f6dc9357SAndroid Build Coastguard Worker   }
173*f6dc9357SAndroid Build Coastguard Worker 
174*f6dc9357SAndroid Build Coastguard Worker   HRESULT FlushToDisk(bool closeLast);
175*f6dc9357SAndroid Build Coastguard Worker };
176*f6dc9357SAndroid Build Coastguard Worker 
177*f6dc9357SAndroid Build Coastguard Worker #endif
178*f6dc9357SAndroid Build Coastguard Worker 
179*f6dc9357SAndroid Build Coastguard Worker 
180*f6dc9357SAndroid Build Coastguard Worker 
181*f6dc9357SAndroid Build Coastguard Worker class CExtractCallbackImp Z7_final:
182*f6dc9357SAndroid Build Coastguard Worker   public IFolderArchiveExtractCallback,
183*f6dc9357SAndroid Build Coastguard Worker   /* IExtractCallbackUI:
184*f6dc9357SAndroid Build Coastguard Worker        before v23.00 : it         included IFolderArchiveExtractCallback
185*f6dc9357SAndroid Build Coastguard Worker        since  v23.00 : it doesn't include  IFolderArchiveExtractCallback
186*f6dc9357SAndroid Build Coastguard Worker   */
187*f6dc9357SAndroid Build Coastguard Worker   public IExtractCallbackUI, // NON-COM interface since 23.00
188*f6dc9357SAndroid Build Coastguard Worker   public IOpenCallbackUI,    // NON-COM interface
189*f6dc9357SAndroid Build Coastguard Worker   public IFolderArchiveExtractCallback2,
190*f6dc9357SAndroid Build Coastguard Worker  #ifndef Z7_SFX
191*f6dc9357SAndroid Build Coastguard Worker   public IFolderOperationsExtractCallback,
192*f6dc9357SAndroid Build Coastguard Worker   public IFolderExtractToStreamCallback,
193*f6dc9357SAndroid Build Coastguard Worker   public ICompressProgressInfo,
194*f6dc9357SAndroid Build Coastguard Worker   public IArchiveRequestMemoryUseCallback,
195*f6dc9357SAndroid Build Coastguard Worker  #endif
196*f6dc9357SAndroid Build Coastguard Worker  #ifndef Z7_NO_CRYPTO
197*f6dc9357SAndroid Build Coastguard Worker   public ICryptoGetTextPassword,
198*f6dc9357SAndroid Build Coastguard Worker  #endif
199*f6dc9357SAndroid Build Coastguard Worker   public CMyUnknownImp
200*f6dc9357SAndroid Build Coastguard Worker {
201*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_BEGIN2(IFolderArchiveExtractCallback)
202*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_ENTRY(IFolderArchiveExtractCallback2)
203*f6dc9357SAndroid Build Coastguard Worker  #ifndef Z7_SFX
204*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_ENTRY(IFolderOperationsExtractCallback)
205*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_ENTRY(IFolderExtractToStreamCallback)
206*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_ENTRY(ICompressProgressInfo)
207*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_ENTRY(IArchiveRequestMemoryUseCallback)
208*f6dc9357SAndroid Build Coastguard Worker  #endif
209*f6dc9357SAndroid Build Coastguard Worker  #ifndef Z7_NO_CRYPTO
210*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_ENTRY(ICryptoGetTextPassword)
211*f6dc9357SAndroid Build Coastguard Worker  #endif
212*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_END
213*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_ADDREF_RELEASE
214*f6dc9357SAndroid Build Coastguard Worker 
215*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_IMP(IExtractCallbackUI)
216*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_IMP(IOpenCallbackUI)
217*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(IProgress)
218*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(IFolderArchiveExtractCallback)
219*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(IFolderArchiveExtractCallback2)
220*f6dc9357SAndroid Build Coastguard Worker  #ifndef Z7_SFX
221*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(IFolderOperationsExtractCallback)
222*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(IFolderExtractToStreamCallback)
223*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(ICompressProgressInfo)
224*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(IArchiveRequestMemoryUseCallback)
225*f6dc9357SAndroid Build Coastguard Worker  #endif
226*f6dc9357SAndroid Build Coastguard Worker  #ifndef Z7_NO_CRYPTO
227*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(ICryptoGetTextPassword)
228*f6dc9357SAndroid Build Coastguard Worker  #endif
229*f6dc9357SAndroid Build Coastguard Worker 
230*f6dc9357SAndroid Build Coastguard Worker   bool _needWriteArchivePath;
231*f6dc9357SAndroid Build Coastguard Worker   bool _isFolder;
232*f6dc9357SAndroid Build Coastguard Worker   bool _totalFiles_Defined;
233*f6dc9357SAndroid Build Coastguard Worker   bool _totalBytes_Defined;
234*f6dc9357SAndroid Build Coastguard Worker public:
235*f6dc9357SAndroid Build Coastguard Worker   bool MultiArcMode;
236*f6dc9357SAndroid Build Coastguard Worker   bool ProcessAltStreams;
237*f6dc9357SAndroid Build Coastguard Worker   bool StreamMode; // set to true, if you want the callee to call GetStream7()
238*f6dc9357SAndroid Build Coastguard Worker   bool ThereAreMessageErrors;
239*f6dc9357SAndroid Build Coastguard Worker   bool Src_Is_IO_FS_Folder;
240*f6dc9357SAndroid Build Coastguard Worker 
241*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_NO_CRYPTO
242*f6dc9357SAndroid Build Coastguard Worker   bool PasswordIsDefined;
243*f6dc9357SAndroid Build Coastguard Worker   bool PasswordWasAsked;
244*f6dc9357SAndroid Build Coastguard Worker #endif
245*f6dc9357SAndroid Build Coastguard Worker 
246*f6dc9357SAndroid Build Coastguard Worker private:
247*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_SFX
248*f6dc9357SAndroid Build Coastguard Worker   bool _needUpdateStat;
249*f6dc9357SAndroid Build Coastguard Worker   bool _newVirtFileWasAdded;
250*f6dc9357SAndroid Build Coastguard Worker   bool _isAltStream;
251*f6dc9357SAndroid Build Coastguard Worker   // bool _extractMode;
252*f6dc9357SAndroid Build Coastguard Worker   // bool _testMode;
253*f6dc9357SAndroid Build Coastguard Worker   bool _hashStream_WasUsed;
254*f6dc9357SAndroid Build Coastguard Worker   bool _curSize_Defined;
255*f6dc9357SAndroid Build Coastguard Worker   bool NeedAddFile;
256*f6dc9357SAndroid Build Coastguard Worker 
257*f6dc9357SAndroid Build Coastguard Worker   bool _remember;
258*f6dc9357SAndroid Build Coastguard Worker   bool _skipArc;
259*f6dc9357SAndroid Build Coastguard Worker #endif
260*f6dc9357SAndroid Build Coastguard Worker 
261*f6dc9357SAndroid Build Coastguard Worker public:
262*f6dc9357SAndroid Build Coastguard Worker   bool YesToAll;
263*f6dc9357SAndroid Build Coastguard Worker   bool TestMode;
264*f6dc9357SAndroid Build Coastguard Worker 
265*f6dc9357SAndroid Build Coastguard Worker   UInt32 NumArchiveErrors;
266*f6dc9357SAndroid Build Coastguard Worker   NExtract::NOverwriteMode::EEnum OverwriteMode;
267*f6dc9357SAndroid Build Coastguard Worker 
268*f6dc9357SAndroid Build Coastguard Worker private:
269*f6dc9357SAndroid Build Coastguard Worker   UString _currentArchivePath;
270*f6dc9357SAndroid Build Coastguard Worker   UString _currentFilePath;
271*f6dc9357SAndroid Build Coastguard Worker   UString _filePath;  // virtual path than will be sent via IFolderExtractToStreamCallback
272*f6dc9357SAndroid Build Coastguard Worker 
273*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_SFX
274*f6dc9357SAndroid Build Coastguard Worker   UInt64 _curSize;
275*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr2<ISequentialOutStream, COutStreamWithHash> _hashStream;
276*f6dc9357SAndroid Build Coastguard Worker   IHashCalc *_hashCalc; // it's for stat in Test operation
277*f6dc9357SAndroid Build Coastguard Worker #endif
278*f6dc9357SAndroid Build Coastguard Worker 
279*f6dc9357SAndroid Build Coastguard Worker public:
280*f6dc9357SAndroid Build Coastguard Worker   CProgressDialog *ProgressDialog;
281*f6dc9357SAndroid Build Coastguard Worker 
282*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_SFX
283*f6dc9357SAndroid Build Coastguard Worker   CVirtFileSystem *VirtFileSystemSpec;
284*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr<ISequentialOutStream> VirtFileSystem;
285*f6dc9357SAndroid Build Coastguard Worker   UInt64 NumFolders;
286*f6dc9357SAndroid Build Coastguard Worker   UInt64 NumFiles;
287*f6dc9357SAndroid Build Coastguard Worker #endif
288*f6dc9357SAndroid Build Coastguard Worker 
289*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_NO_CRYPTO
290*f6dc9357SAndroid Build Coastguard Worker   UString Password;
291*f6dc9357SAndroid Build Coastguard Worker #endif
292*f6dc9357SAndroid Build Coastguard Worker 
293*f6dc9357SAndroid Build Coastguard Worker   UString _lang_Extracting;
294*f6dc9357SAndroid Build Coastguard Worker   UString _lang_Testing;
295*f6dc9357SAndroid Build Coastguard Worker   UString _lang_Skipping;
296*f6dc9357SAndroid Build Coastguard Worker   UString _lang_Reading;
297*f6dc9357SAndroid Build Coastguard Worker   UString _lang_Empty;
298*f6dc9357SAndroid Build Coastguard Worker 
299*f6dc9357SAndroid Build Coastguard Worker   CExtractCallbackImp():
300*f6dc9357SAndroid Build Coastguard Worker       _totalFiles_Defined(false)
301*f6dc9357SAndroid Build Coastguard Worker     , _totalBytes_Defined(false)
302*f6dc9357SAndroid Build Coastguard Worker     , MultiArcMode(false)
303*f6dc9357SAndroid Build Coastguard Worker     , ProcessAltStreams(true)
304*f6dc9357SAndroid Build Coastguard Worker     , StreamMode(false)
305*f6dc9357SAndroid Build Coastguard Worker     , ThereAreMessageErrors(false)
306*f6dc9357SAndroid Build Coastguard Worker     , Src_Is_IO_FS_Folder(false)
307*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_NO_CRYPTO
308*f6dc9357SAndroid Build Coastguard Worker     , PasswordIsDefined(false)
309*f6dc9357SAndroid Build Coastguard Worker     , PasswordWasAsked(false)
310*f6dc9357SAndroid Build Coastguard Worker #endif
311*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_SFX
312*f6dc9357SAndroid Build Coastguard Worker     , _remember(false)
313*f6dc9357SAndroid Build Coastguard Worker     , _skipArc(false)
314*f6dc9357SAndroid Build Coastguard Worker #endif
315*f6dc9357SAndroid Build Coastguard Worker     , YesToAll(false)
316*f6dc9357SAndroid Build Coastguard Worker     , TestMode(false)
317*f6dc9357SAndroid Build Coastguard Worker     , OverwriteMode(NExtract::NOverwriteMode::kAsk)
318*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_SFX
319*f6dc9357SAndroid Build Coastguard Worker     , _hashCalc(NULL)
320*f6dc9357SAndroid Build Coastguard Worker #endif
321*f6dc9357SAndroid Build Coastguard Worker     {}
322*f6dc9357SAndroid Build Coastguard Worker 
323*f6dc9357SAndroid Build Coastguard Worker   ~CExtractCallbackImp();
324*f6dc9357SAndroid Build Coastguard Worker   void Init();
325*f6dc9357SAndroid Build Coastguard Worker 
326*f6dc9357SAndroid Build Coastguard Worker   HRESULT SetCurrentFilePath2(const wchar_t *filePath);
327*f6dc9357SAndroid Build Coastguard Worker   void AddError_Message(LPCWSTR message);
328*f6dc9357SAndroid Build Coastguard Worker   void AddError_Message_ShowArcPath(LPCWSTR message);
329*f6dc9357SAndroid Build Coastguard Worker   HRESULT MessageError(const char *message, const FString &path);
330*f6dc9357SAndroid Build Coastguard Worker   void Add_ArchiveName_Error();
331*f6dc9357SAndroid Build Coastguard Worker 
332*f6dc9357SAndroid Build Coastguard Worker   #ifndef Z7_SFX
333*f6dc9357SAndroid Build Coastguard Worker   void SetHashCalc(IHashCalc *hashCalc) { _hashCalc = hashCalc; }
334*f6dc9357SAndroid Build Coastguard Worker 
335*f6dc9357SAndroid Build Coastguard Worker   void SetHashMethods(IHashCalc *hash)
336*f6dc9357SAndroid Build Coastguard Worker   {
337*f6dc9357SAndroid Build Coastguard Worker     if (!hash)
338*f6dc9357SAndroid Build Coastguard Worker       return;
339*f6dc9357SAndroid Build Coastguard Worker     _hashStream.Create_if_Empty();
340*f6dc9357SAndroid Build Coastguard Worker     _hashStream->_hash = hash;
341*f6dc9357SAndroid Build Coastguard Worker   }
342*f6dc9357SAndroid Build Coastguard Worker   #endif
343*f6dc9357SAndroid Build Coastguard Worker 
344*f6dc9357SAndroid Build Coastguard Worker   bool IsOK() const { return NumArchiveErrors == 0 && !ThereAreMessageErrors; }
345*f6dc9357SAndroid Build Coastguard Worker };
346*f6dc9357SAndroid Build Coastguard Worker 
347*f6dc9357SAndroid Build Coastguard Worker #endif
348