5 #include "Common/IntToString.h"
\r
6 #include "Common/StringConvert.h"
\r
8 #include "Windows/Error.h"
\r
9 #include "Windows/FileDir.h"
\r
10 #include "Windows/FileFind.h"
\r
11 #include "Windows/Thread.h"
\r
13 #include "../FileManager/ExtractCallback.h"
\r
14 #include "../FileManager/FormatUtils.h"
\r
15 #include "../FileManager/LangUtils.h"
\r
16 #include "../FileManager/resourceGui.h"
\r
18 #include "../Common/ArchiveExtractCallback.h"
\r
19 #include "../Common/PropIDUtils.h"
\r
21 #include "../Explorer/MyMessages.h"
\r
23 #include "resource2.h"
\r
24 #include "ExtractRes.h"
\r
26 #include "ExtractDialog.h"
\r
27 #include "ExtractGUI.h"
\r
29 using namespace NWindows;
\r
31 static const wchar_t *kIncorrectOutDir = L"Incorrect output directory path";
\r
35 static void AddValuePair(UINT resourceID, UInt32 langID, UInt64 value, UString &s)
\r
38 s += LangString(resourceID, langID);
\r
40 ConvertUInt64ToString(value, sz);
\r
45 static void AddSizePair(UINT resourceID, UInt32 langID, UInt64 value, UString &s)
\r
48 s += LangString(resourceID, langID);
\r
50 ConvertUInt64ToString(value, sz);
\r
52 ConvertUInt64ToString(value >> 20, sz);
\r
61 class CThreadExtracting: public CProgressThreadVirt
\r
63 HRESULT ProcessVirt();
\r
66 CExtractCallbackImp *ExtractCallbackSpec;
\r
67 CIntVector FormatIndices;
\r
69 UStringVector *ArchivePaths;
\r
70 UStringVector *ArchivePathsFull;
\r
71 const NWildcard::CCensorNode *WildcardCensor;
\r
72 const CExtractOptions *Options;
\r
73 CMyComPtr<IExtractCallbackUI> ExtractCallback;
\r
77 HRESULT CThreadExtracting::ProcessVirt()
\r
79 CDecompressStat Stat;
\r
80 HRESULT res = DecompressArchives(codecs, FormatIndices, *ArchivePaths, *ArchivePathsFull,
\r
81 *WildcardCensor, *Options, ExtractCallbackSpec, ExtractCallback, ErrorMessage, Stat);
\r
83 if (Options->TestMode && ExtractCallbackSpec->IsOK())
\r
86 AddValuePair(IDS_ARCHIVES_COLON, 0x02000324, Stat.NumArchives, s);
\r
87 AddValuePair(IDS_FOLDERS_COLON, 0x02000321, Stat.NumFolders, s);
\r
88 AddValuePair(IDS_FILES_COLON, 0x02000320, Stat.NumFiles, s);
\r
89 AddSizePair(IDS_SIZE_COLON, 0x02000322, Stat.UnpackSize, s);
\r
90 AddSizePair(IDS_COMPRESSED_COLON, 0x02000323, Stat.PackSize, s);
\r
92 if (Options->CalcCrc)
\r
95 ConvertUInt32ToHex(Stat.CrcSum, temp);
\r
102 s += LangString(IDS_MESSAGE_NO_ERRORS, 0x02000608);
\r
104 OkMessageTitle = Title;
\r
111 HRESULT ExtractGUI(
\r
113 const CIntVector &formatIndices,
\r
114 UStringVector &archivePaths,
\r
115 UStringVector &archivePathsFull,
\r
116 const NWildcard::CCensorNode &wildcardCensor,
\r
117 CExtractOptions &options,
\r
119 bool &messageWasDisplayed,
\r
120 CExtractCallbackImp *extractCallback,
\r
123 messageWasDisplayed = false;
\r
125 CThreadExtracting extracter;
\r
126 extracter.codecs = codecs;
\r
127 extracter.FormatIndices = formatIndices;
\r
129 if (!options.TestMode)
\r
131 UString outputDir = options.OutputDir;
\r
133 if (outputDir.IsEmpty())
\r
134 NFile::NDirectory::MyGetCurrentDirectory(outputDir);
\r
138 CExtractDialog dialog;
\r
139 if (!NFile::NDirectory::MyGetFullPathName(outputDir, dialog.DirectoryPath))
\r
141 ShowErrorMessage(kIncorrectOutDir);
\r
142 messageWasDisplayed = true;
\r
145 NFile::NName::NormalizeDirPathPrefix(dialog.DirectoryPath);
\r
147 // dialog.OverwriteMode = options.OverwriteMode;
\r
148 // dialog.PathMode = options.PathMode;
\r
150 if (dialog.Create(hwndParent) != IDOK)
\r
152 outputDir = dialog.DirectoryPath;
\r
153 options.OverwriteMode = dialog.OverwriteMode;
\r
154 options.PathMode = dialog.PathMode;
\r
156 extractCallback->Password = dialog.Password;
\r
157 extractCallback->PasswordIsDefined = !dialog.Password.IsEmpty();
\r
160 if (!NFile::NDirectory::MyGetFullPathName(outputDir, options.OutputDir))
\r
162 ShowErrorMessage(kIncorrectOutDir);
\r
163 messageWasDisplayed = true;
\r
166 NFile::NName::NormalizeDirPathPrefix(options.OutputDir);
\r
169 if(!NFile::NDirectory::CreateComplexDirectory(options.OutputDir))
\r
171 UString s = GetUnicodeString(NError::MyFormatMessage(GetLastError()));
\r
172 UString s2 = MyFormatNew(IDS_CANNOT_CREATE_FOLDER,
\r
176 options.OutputDir);
\r
177 MyMessageBox(s2 + UString(L'\n') + s);
\r
183 UString title = LangStringSpec(options.TestMode ? IDS_PROGRESS_TESTING : IDS_PROGRESS_EXTRACTING,
\r
184 options.TestMode ? 0x02000F90: 0x02000890);
\r
186 extracter.Title = title;
\r
187 extracter.ExtractCallbackSpec = extractCallback;
\r
188 extracter.ExtractCallbackSpec->ProgressDialog = &extracter.ProgressDialog;
\r
189 extracter.ExtractCallback = extractCallback;
\r
190 extracter.ExtractCallbackSpec->Init();
\r
192 extracter.ProgressDialog.CompressingMode = false;
\r
194 extracter.ArchivePaths = &archivePaths;
\r
195 extracter.ArchivePathsFull = &archivePathsFull;
\r
196 extracter.WildcardCensor = &wildcardCensor;
\r
197 extracter.Options = &options;
\r
199 extracter.ProgressDialog.IconID = IDI_ICON;
\r
201 RINOK(extracter.Create(title, hwndParent));
\r
202 messageWasDisplayed = extracter.ThreadFinishedOK &
\r
203 extracter.ProgressDialog.MessagesDisplayed;
\r
204 return extracter.Result;
\r