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