xref: /aosp_15_r20/external/lzma/CPP/7zip/UI/GUI/ExtractGUI.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // ExtractGUI.cpp
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #include "StdAfx.h"
4*f6dc9357SAndroid Build Coastguard Worker 
5*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/IntToString.h"
6*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/StringConvert.h"
7*f6dc9357SAndroid Build Coastguard Worker 
8*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/FileDir.h"
9*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/FileFind.h"
10*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/FileName.h"
11*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/Thread.h"
12*f6dc9357SAndroid Build Coastguard Worker 
13*f6dc9357SAndroid Build Coastguard Worker #include "../FileManager/ExtractCallback.h"
14*f6dc9357SAndroid Build Coastguard Worker #include "../FileManager/FormatUtils.h"
15*f6dc9357SAndroid Build Coastguard Worker #include "../FileManager/LangUtils.h"
16*f6dc9357SAndroid Build Coastguard Worker #include "../FileManager/resourceGui.h"
17*f6dc9357SAndroid Build Coastguard Worker #include "../FileManager/OverwriteDialogRes.h"
18*f6dc9357SAndroid Build Coastguard Worker 
19*f6dc9357SAndroid Build Coastguard Worker #include "../Common/ArchiveExtractCallback.h"
20*f6dc9357SAndroid Build Coastguard Worker #include "../Common/PropIDUtils.h"
21*f6dc9357SAndroid Build Coastguard Worker 
22*f6dc9357SAndroid Build Coastguard Worker #include "../Explorer/MyMessages.h"
23*f6dc9357SAndroid Build Coastguard Worker 
24*f6dc9357SAndroid Build Coastguard Worker #include "resource2.h"
25*f6dc9357SAndroid Build Coastguard Worker #include "ExtractRes.h"
26*f6dc9357SAndroid Build Coastguard Worker 
27*f6dc9357SAndroid Build Coastguard Worker #include "ExtractDialog.h"
28*f6dc9357SAndroid Build Coastguard Worker #include "ExtractGUI.h"
29*f6dc9357SAndroid Build Coastguard Worker #include "HashGUI.h"
30*f6dc9357SAndroid Build Coastguard Worker 
31*f6dc9357SAndroid Build Coastguard Worker #include "../FileManager/PropertyNameRes.h"
32*f6dc9357SAndroid Build Coastguard Worker 
33*f6dc9357SAndroid Build Coastguard Worker using namespace NWindows;
34*f6dc9357SAndroid Build Coastguard Worker using namespace NFile;
35*f6dc9357SAndroid Build Coastguard Worker using namespace NDir;
36*f6dc9357SAndroid Build Coastguard Worker 
37*f6dc9357SAndroid Build Coastguard Worker static const wchar_t * const kIncorrectOutDir = L"Incorrect output directory path";
38*f6dc9357SAndroid Build Coastguard Worker 
39*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_SFX
40*f6dc9357SAndroid Build Coastguard Worker 
AddValuePair(UString & s,UINT resourceID,UInt64 value,bool addColon=true)41*f6dc9357SAndroid Build Coastguard Worker static void AddValuePair(UString &s, UINT resourceID, UInt64 value, bool addColon = true)
42*f6dc9357SAndroid Build Coastguard Worker {
43*f6dc9357SAndroid Build Coastguard Worker   AddLangString(s, resourceID);
44*f6dc9357SAndroid Build Coastguard Worker   if (addColon)
45*f6dc9357SAndroid Build Coastguard Worker     s.Add_Colon();
46*f6dc9357SAndroid Build Coastguard Worker   s.Add_Space();
47*f6dc9357SAndroid Build Coastguard Worker   s.Add_UInt64(value);
48*f6dc9357SAndroid Build Coastguard Worker   s.Add_LF();
49*f6dc9357SAndroid Build Coastguard Worker }
50*f6dc9357SAndroid Build Coastguard Worker 
AddSizePair(UString & s,UINT resourceID,UInt64 value)51*f6dc9357SAndroid Build Coastguard Worker static void AddSizePair(UString &s, UINT resourceID, UInt64 value)
52*f6dc9357SAndroid Build Coastguard Worker {
53*f6dc9357SAndroid Build Coastguard Worker   AddLangString(s, resourceID);
54*f6dc9357SAndroid Build Coastguard Worker   s += ": ";
55*f6dc9357SAndroid Build Coastguard Worker   AddSizeValue(s, value);
56*f6dc9357SAndroid Build Coastguard Worker   s.Add_LF();
57*f6dc9357SAndroid Build Coastguard Worker }
58*f6dc9357SAndroid Build Coastguard Worker 
59*f6dc9357SAndroid Build Coastguard Worker #endif
60*f6dc9357SAndroid Build Coastguard Worker 
61*f6dc9357SAndroid Build Coastguard Worker class CThreadExtracting: public CProgressThreadVirt
62*f6dc9357SAndroid Build Coastguard Worker {
63*f6dc9357SAndroid Build Coastguard Worker   HRESULT ProcessVirt() Z7_override;
64*f6dc9357SAndroid Build Coastguard Worker public:
65*f6dc9357SAndroid Build Coastguard Worker   /*
66*f6dc9357SAndroid Build Coastguard Worker   #ifdef Z7_EXTERNAL_CODECS
67*f6dc9357SAndroid Build Coastguard Worker   const CExternalCodecs *externalCodecs;
68*f6dc9357SAndroid Build Coastguard Worker   #endif
69*f6dc9357SAndroid Build Coastguard Worker   */
70*f6dc9357SAndroid Build Coastguard Worker 
71*f6dc9357SAndroid Build Coastguard Worker   CCodecs *codecs;
72*f6dc9357SAndroid Build Coastguard Worker   CExtractCallbackImp *ExtractCallbackSpec;
73*f6dc9357SAndroid Build Coastguard Worker   const CObjectVector<COpenType> *FormatIndices;
74*f6dc9357SAndroid Build Coastguard Worker   const CIntVector *ExcludedFormatIndices;
75*f6dc9357SAndroid Build Coastguard Worker 
76*f6dc9357SAndroid Build Coastguard Worker   UStringVector *ArchivePaths;
77*f6dc9357SAndroid Build Coastguard Worker   UStringVector *ArchivePathsFull;
78*f6dc9357SAndroid Build Coastguard Worker   const NWildcard::CCensorNode *WildcardCensor;
79*f6dc9357SAndroid Build Coastguard Worker   const CExtractOptions *Options;
80*f6dc9357SAndroid Build Coastguard Worker 
81*f6dc9357SAndroid Build Coastguard Worker   #ifndef Z7_SFX
82*f6dc9357SAndroid Build Coastguard Worker   CHashBundle *HashBundle;
83*f6dc9357SAndroid Build Coastguard Worker   virtual void ProcessWasFinished_GuiVirt() Z7_override;
84*f6dc9357SAndroid Build Coastguard Worker   #endif
85*f6dc9357SAndroid Build Coastguard Worker 
86*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr<IFolderArchiveExtractCallback> FolderArchiveExtractCallback;
87*f6dc9357SAndroid Build Coastguard Worker   UString Title;
88*f6dc9357SAndroid Build Coastguard Worker 
89*f6dc9357SAndroid Build Coastguard Worker   CPropNameValPairs Pairs;
90*f6dc9357SAndroid Build Coastguard Worker };
91*f6dc9357SAndroid Build Coastguard Worker 
92*f6dc9357SAndroid Build Coastguard Worker 
93*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_SFX
ProcessWasFinished_GuiVirt()94*f6dc9357SAndroid Build Coastguard Worker void CThreadExtracting::ProcessWasFinished_GuiVirt()
95*f6dc9357SAndroid Build Coastguard Worker {
96*f6dc9357SAndroid Build Coastguard Worker   if (HashBundle && !Pairs.IsEmpty())
97*f6dc9357SAndroid Build Coastguard Worker     ShowHashResults(Pairs, *this);
98*f6dc9357SAndroid Build Coastguard Worker }
99*f6dc9357SAndroid Build Coastguard Worker #endif
100*f6dc9357SAndroid Build Coastguard Worker 
ProcessVirt()101*f6dc9357SAndroid Build Coastguard Worker HRESULT CThreadExtracting::ProcessVirt()
102*f6dc9357SAndroid Build Coastguard Worker {
103*f6dc9357SAndroid Build Coastguard Worker   CDecompressStat Stat;
104*f6dc9357SAndroid Build Coastguard Worker 
105*f6dc9357SAndroid Build Coastguard Worker   #ifndef Z7_SFX
106*f6dc9357SAndroid Build Coastguard Worker   /*
107*f6dc9357SAndroid Build Coastguard Worker   if (HashBundle)
108*f6dc9357SAndroid Build Coastguard Worker     HashBundle->Init();
109*f6dc9357SAndroid Build Coastguard Worker   */
110*f6dc9357SAndroid Build Coastguard Worker   #endif
111*f6dc9357SAndroid Build Coastguard Worker 
112*f6dc9357SAndroid Build Coastguard Worker   HRESULT res = Extract(
113*f6dc9357SAndroid Build Coastguard Worker       /*
114*f6dc9357SAndroid Build Coastguard Worker       #ifdef Z7_EXTERNAL_CODECS
115*f6dc9357SAndroid Build Coastguard Worker       externalCodecs,
116*f6dc9357SAndroid Build Coastguard Worker       #endif
117*f6dc9357SAndroid Build Coastguard Worker       */
118*f6dc9357SAndroid Build Coastguard Worker       codecs,
119*f6dc9357SAndroid Build Coastguard Worker       *FormatIndices, *ExcludedFormatIndices,
120*f6dc9357SAndroid Build Coastguard Worker       *ArchivePaths, *ArchivePathsFull,
121*f6dc9357SAndroid Build Coastguard Worker       *WildcardCensor, *Options,
122*f6dc9357SAndroid Build Coastguard Worker       ExtractCallbackSpec, ExtractCallbackSpec, FolderArchiveExtractCallback,
123*f6dc9357SAndroid Build Coastguard Worker       #ifndef Z7_SFX
124*f6dc9357SAndroid Build Coastguard Worker         HashBundle,
125*f6dc9357SAndroid Build Coastguard Worker       #endif
126*f6dc9357SAndroid Build Coastguard Worker       FinalMessage.ErrorMessage.Message, Stat);
127*f6dc9357SAndroid Build Coastguard Worker 
128*f6dc9357SAndroid Build Coastguard Worker   #ifndef Z7_SFX
129*f6dc9357SAndroid Build Coastguard Worker   if (res == S_OK && ExtractCallbackSpec->IsOK())
130*f6dc9357SAndroid Build Coastguard Worker   {
131*f6dc9357SAndroid Build Coastguard Worker     if (HashBundle)
132*f6dc9357SAndroid Build Coastguard Worker     {
133*f6dc9357SAndroid Build Coastguard Worker       AddValuePair(Pairs, IDS_ARCHIVES_COLON, Stat.NumArchives);
134*f6dc9357SAndroid Build Coastguard Worker       AddSizeValuePair(Pairs, IDS_PROP_PACKED_SIZE, Stat.PackSize);
135*f6dc9357SAndroid Build Coastguard Worker       AddHashBundleRes(Pairs, *HashBundle);
136*f6dc9357SAndroid Build Coastguard Worker     }
137*f6dc9357SAndroid Build Coastguard Worker     else if (Options->TestMode)
138*f6dc9357SAndroid Build Coastguard Worker     {
139*f6dc9357SAndroid Build Coastguard Worker       UString s;
140*f6dc9357SAndroid Build Coastguard Worker 
141*f6dc9357SAndroid Build Coastguard Worker       AddValuePair(s, IDS_ARCHIVES_COLON, Stat.NumArchives, false);
142*f6dc9357SAndroid Build Coastguard Worker       AddSizePair(s, IDS_PROP_PACKED_SIZE, Stat.PackSize);
143*f6dc9357SAndroid Build Coastguard Worker 
144*f6dc9357SAndroid Build Coastguard Worker       if (Stat.NumFolders != 0)
145*f6dc9357SAndroid Build Coastguard Worker         AddValuePair(s, IDS_PROP_FOLDERS, Stat.NumFolders);
146*f6dc9357SAndroid Build Coastguard Worker       AddValuePair(s, IDS_PROP_FILES, Stat.NumFiles);
147*f6dc9357SAndroid Build Coastguard Worker       AddSizePair(s, IDS_PROP_SIZE, Stat.UnpackSize);
148*f6dc9357SAndroid Build Coastguard Worker       if (Stat.NumAltStreams != 0)
149*f6dc9357SAndroid Build Coastguard Worker       {
150*f6dc9357SAndroid Build Coastguard Worker         s.Add_LF();
151*f6dc9357SAndroid Build Coastguard Worker         AddValuePair(s, IDS_PROP_NUM_ALT_STREAMS, Stat.NumAltStreams);
152*f6dc9357SAndroid Build Coastguard Worker         AddSizePair(s, IDS_PROP_ALT_STREAMS_SIZE, Stat.AltStreams_UnpackSize);
153*f6dc9357SAndroid Build Coastguard Worker       }
154*f6dc9357SAndroid Build Coastguard Worker       s.Add_LF();
155*f6dc9357SAndroid Build Coastguard Worker       AddLangString(s, IDS_MESSAGE_NO_ERRORS);
156*f6dc9357SAndroid Build Coastguard Worker       FinalMessage.OkMessage.Title = Title;
157*f6dc9357SAndroid Build Coastguard Worker       FinalMessage.OkMessage.Message = s;
158*f6dc9357SAndroid Build Coastguard Worker     }
159*f6dc9357SAndroid Build Coastguard Worker   }
160*f6dc9357SAndroid Build Coastguard Worker   #endif
161*f6dc9357SAndroid Build Coastguard Worker 
162*f6dc9357SAndroid Build Coastguard Worker   return res;
163*f6dc9357SAndroid Build Coastguard Worker }
164*f6dc9357SAndroid Build Coastguard Worker 
165*f6dc9357SAndroid Build Coastguard Worker 
166*f6dc9357SAndroid Build Coastguard Worker 
ExtractGUI(CCodecs * codecs,const CObjectVector<COpenType> & formatIndices,const CIntVector & excludedFormatIndices,UStringVector & archivePaths,UStringVector & archivePathsFull,const NWildcard::CCensorNode & wildcardCensor,CExtractOptions & options,CHashBundle * hb,bool showDialog,bool & messageWasDisplayed,CExtractCallbackImp * extractCallback,HWND hwndParent)167*f6dc9357SAndroid Build Coastguard Worker HRESULT ExtractGUI(
168*f6dc9357SAndroid Build Coastguard Worker     // DECL_EXTERNAL_CODECS_LOC_VARS
169*f6dc9357SAndroid Build Coastguard Worker     CCodecs *codecs,
170*f6dc9357SAndroid Build Coastguard Worker     const CObjectVector<COpenType> &formatIndices,
171*f6dc9357SAndroid Build Coastguard Worker     const CIntVector &excludedFormatIndices,
172*f6dc9357SAndroid Build Coastguard Worker     UStringVector &archivePaths,
173*f6dc9357SAndroid Build Coastguard Worker     UStringVector &archivePathsFull,
174*f6dc9357SAndroid Build Coastguard Worker     const NWildcard::CCensorNode &wildcardCensor,
175*f6dc9357SAndroid Build Coastguard Worker     CExtractOptions &options,
176*f6dc9357SAndroid Build Coastguard Worker     #ifndef Z7_SFX
177*f6dc9357SAndroid Build Coastguard Worker     CHashBundle *hb,
178*f6dc9357SAndroid Build Coastguard Worker     #endif
179*f6dc9357SAndroid Build Coastguard Worker     bool showDialog,
180*f6dc9357SAndroid Build Coastguard Worker     bool &messageWasDisplayed,
181*f6dc9357SAndroid Build Coastguard Worker     CExtractCallbackImp *extractCallback,
182*f6dc9357SAndroid Build Coastguard Worker     HWND hwndParent)
183*f6dc9357SAndroid Build Coastguard Worker {
184*f6dc9357SAndroid Build Coastguard Worker   messageWasDisplayed = false;
185*f6dc9357SAndroid Build Coastguard Worker 
186*f6dc9357SAndroid Build Coastguard Worker   CThreadExtracting extracter;
187*f6dc9357SAndroid Build Coastguard Worker   /*
188*f6dc9357SAndroid Build Coastguard Worker   #ifdef Z7_EXTERNAL_CODECS
189*f6dc9357SAndroid Build Coastguard Worker   extracter.externalCodecs = _externalCodecs;
190*f6dc9357SAndroid Build Coastguard Worker   #endif
191*f6dc9357SAndroid Build Coastguard Worker   */
192*f6dc9357SAndroid Build Coastguard Worker   extracter.codecs = codecs;
193*f6dc9357SAndroid Build Coastguard Worker   extracter.FormatIndices = &formatIndices;
194*f6dc9357SAndroid Build Coastguard Worker   extracter.ExcludedFormatIndices = &excludedFormatIndices;
195*f6dc9357SAndroid Build Coastguard Worker 
196*f6dc9357SAndroid Build Coastguard Worker   if (!options.TestMode)
197*f6dc9357SAndroid Build Coastguard Worker   {
198*f6dc9357SAndroid Build Coastguard Worker     FString outputDir = options.OutputDir;
199*f6dc9357SAndroid Build Coastguard Worker     #ifndef UNDER_CE
200*f6dc9357SAndroid Build Coastguard Worker     if (outputDir.IsEmpty())
201*f6dc9357SAndroid Build Coastguard Worker       GetCurrentDir(outputDir);
202*f6dc9357SAndroid Build Coastguard Worker     #endif
203*f6dc9357SAndroid Build Coastguard Worker     if (showDialog)
204*f6dc9357SAndroid Build Coastguard Worker     {
205*f6dc9357SAndroid Build Coastguard Worker       CExtractDialog dialog;
206*f6dc9357SAndroid Build Coastguard Worker       FString outputDirFull;
207*f6dc9357SAndroid Build Coastguard Worker       if (!MyGetFullPathName(outputDir, outputDirFull))
208*f6dc9357SAndroid Build Coastguard Worker       {
209*f6dc9357SAndroid Build Coastguard Worker         ShowErrorMessage(kIncorrectOutDir);
210*f6dc9357SAndroid Build Coastguard Worker         messageWasDisplayed = true;
211*f6dc9357SAndroid Build Coastguard Worker         return E_FAIL;
212*f6dc9357SAndroid Build Coastguard Worker       }
213*f6dc9357SAndroid Build Coastguard Worker       NName::NormalizeDirPathPrefix(outputDirFull);
214*f6dc9357SAndroid Build Coastguard Worker 
215*f6dc9357SAndroid Build Coastguard Worker       dialog.DirPath = fs2us(outputDirFull);
216*f6dc9357SAndroid Build Coastguard Worker 
217*f6dc9357SAndroid Build Coastguard Worker       dialog.OverwriteMode = options.OverwriteMode;
218*f6dc9357SAndroid Build Coastguard Worker       dialog.OverwriteMode_Force = options.OverwriteMode_Force;
219*f6dc9357SAndroid Build Coastguard Worker       dialog.PathMode = options.PathMode;
220*f6dc9357SAndroid Build Coastguard Worker       dialog.PathMode_Force = options.PathMode_Force;
221*f6dc9357SAndroid Build Coastguard Worker       dialog.ElimDup = options.ElimDup;
222*f6dc9357SAndroid Build Coastguard Worker 
223*f6dc9357SAndroid Build Coastguard Worker       if (archivePathsFull.Size() == 1)
224*f6dc9357SAndroid Build Coastguard Worker         dialog.ArcPath = archivePathsFull[0];
225*f6dc9357SAndroid Build Coastguard Worker 
226*f6dc9357SAndroid Build Coastguard Worker       #ifndef Z7_SFX
227*f6dc9357SAndroid Build Coastguard Worker       // dialog.AltStreams = options.NtOptions.AltStreams;
228*f6dc9357SAndroid Build Coastguard Worker       dialog.NtSecurity = options.NtOptions.NtSecurity;
229*f6dc9357SAndroid Build Coastguard Worker       if (extractCallback->PasswordIsDefined)
230*f6dc9357SAndroid Build Coastguard Worker         dialog.Password = extractCallback->Password;
231*f6dc9357SAndroid Build Coastguard Worker       #endif
232*f6dc9357SAndroid Build Coastguard Worker 
233*f6dc9357SAndroid Build Coastguard Worker       if (dialog.Create(hwndParent) != IDOK)
234*f6dc9357SAndroid Build Coastguard Worker         return E_ABORT;
235*f6dc9357SAndroid Build Coastguard Worker 
236*f6dc9357SAndroid Build Coastguard Worker       outputDir = us2fs(dialog.DirPath);
237*f6dc9357SAndroid Build Coastguard Worker 
238*f6dc9357SAndroid Build Coastguard Worker       options.OverwriteMode = dialog.OverwriteMode;
239*f6dc9357SAndroid Build Coastguard Worker       options.PathMode = dialog.PathMode;
240*f6dc9357SAndroid Build Coastguard Worker       options.ElimDup = dialog.ElimDup;
241*f6dc9357SAndroid Build Coastguard Worker 
242*f6dc9357SAndroid Build Coastguard Worker       #ifndef Z7_SFX
243*f6dc9357SAndroid Build Coastguard Worker       // options.NtOptions.AltStreams = dialog.AltStreams;
244*f6dc9357SAndroid Build Coastguard Worker       options.NtOptions.NtSecurity = dialog.NtSecurity;
245*f6dc9357SAndroid Build Coastguard Worker       extractCallback->Password = dialog.Password;
246*f6dc9357SAndroid Build Coastguard Worker       extractCallback->PasswordIsDefined = !dialog.Password.IsEmpty();
247*f6dc9357SAndroid Build Coastguard Worker       #endif
248*f6dc9357SAndroid Build Coastguard Worker     }
249*f6dc9357SAndroid Build Coastguard Worker     if (!MyGetFullPathName(outputDir, options.OutputDir))
250*f6dc9357SAndroid Build Coastguard Worker     {
251*f6dc9357SAndroid Build Coastguard Worker       ShowErrorMessage(kIncorrectOutDir);
252*f6dc9357SAndroid Build Coastguard Worker       messageWasDisplayed = true;
253*f6dc9357SAndroid Build Coastguard Worker       return E_FAIL;
254*f6dc9357SAndroid Build Coastguard Worker     }
255*f6dc9357SAndroid Build Coastguard Worker     NName::NormalizeDirPathPrefix(options.OutputDir);
256*f6dc9357SAndroid Build Coastguard Worker 
257*f6dc9357SAndroid Build Coastguard Worker     /*
258*f6dc9357SAndroid Build Coastguard Worker     if (!CreateComplexDirectory(options.OutputDir))
259*f6dc9357SAndroid Build Coastguard Worker     {
260*f6dc9357SAndroid Build Coastguard Worker       UString s = GetUnicodeString(NError::MyFormatMessage(GetLastError()));
261*f6dc9357SAndroid Build Coastguard Worker       UString s2 = MyFormatNew(IDS_CANNOT_CREATE_FOLDER,
262*f6dc9357SAndroid Build Coastguard Worker       #ifdef Z7_LANG
263*f6dc9357SAndroid Build Coastguard Worker       0x02000603,
264*f6dc9357SAndroid Build Coastguard Worker       #endif
265*f6dc9357SAndroid Build Coastguard Worker       options.OutputDir);
266*f6dc9357SAndroid Build Coastguard Worker       s2.Add_LF();
267*f6dc9357SAndroid Build Coastguard Worker       s2 += s;
268*f6dc9357SAndroid Build Coastguard Worker       MyMessageBox(s2);
269*f6dc9357SAndroid Build Coastguard Worker       return E_FAIL;
270*f6dc9357SAndroid Build Coastguard Worker     }
271*f6dc9357SAndroid Build Coastguard Worker     */
272*f6dc9357SAndroid Build Coastguard Worker   }
273*f6dc9357SAndroid Build Coastguard Worker 
274*f6dc9357SAndroid Build Coastguard Worker   UString title = LangString(options.TestMode ? IDS_PROGRESS_TESTING : IDS_PROGRESS_EXTRACTING);
275*f6dc9357SAndroid Build Coastguard Worker 
276*f6dc9357SAndroid Build Coastguard Worker   extracter.Title = title;
277*f6dc9357SAndroid Build Coastguard Worker   extracter.ExtractCallbackSpec = extractCallback;
278*f6dc9357SAndroid Build Coastguard Worker   extracter.ExtractCallbackSpec->ProgressDialog = &extracter;
279*f6dc9357SAndroid Build Coastguard Worker   extracter.FolderArchiveExtractCallback = extractCallback;
280*f6dc9357SAndroid Build Coastguard Worker   extracter.ExtractCallbackSpec->Init();
281*f6dc9357SAndroid Build Coastguard Worker 
282*f6dc9357SAndroid Build Coastguard Worker   extracter.CompressingMode = false;
283*f6dc9357SAndroid Build Coastguard Worker 
284*f6dc9357SAndroid Build Coastguard Worker   extracter.ArchivePaths = &archivePaths;
285*f6dc9357SAndroid Build Coastguard Worker   extracter.ArchivePathsFull = &archivePathsFull;
286*f6dc9357SAndroid Build Coastguard Worker   extracter.WildcardCensor = &wildcardCensor;
287*f6dc9357SAndroid Build Coastguard Worker   extracter.Options = &options;
288*f6dc9357SAndroid Build Coastguard Worker   #ifndef Z7_SFX
289*f6dc9357SAndroid Build Coastguard Worker   extracter.HashBundle = hb;
290*f6dc9357SAndroid Build Coastguard Worker   #endif
291*f6dc9357SAndroid Build Coastguard Worker 
292*f6dc9357SAndroid Build Coastguard Worker   extracter.IconID = IDI_ICON;
293*f6dc9357SAndroid Build Coastguard Worker 
294*f6dc9357SAndroid Build Coastguard Worker   RINOK(extracter.Create(title, hwndParent))
295*f6dc9357SAndroid Build Coastguard Worker   messageWasDisplayed = extracter.ThreadFinishedOK && extracter.MessagesDisplayed;
296*f6dc9357SAndroid Build Coastguard Worker   return extracter.Result;
297*f6dc9357SAndroid Build Coastguard Worker }
298