Imported Upstream version 9.20
[platform/upstream/7zip.git] / CPP / 7zip / UI / GUI / ExtractGUI.cpp
1 // ExtractGUI.cpp\r
2 \r
3 #include "StdAfx.h"\r
4 \r
5 #include "Common/IntToString.h"\r
6 #include "Common/StringConvert.h"\r
7 \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
12 \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
17 \r
18 #include "../Common/ArchiveExtractCallback.h"\r
19 #include "../Common/PropIDUtils.h"\r
20 \r
21 #include "../Explorer/MyMessages.h"\r
22 \r
23 #include "resource2.h"\r
24 #include "ExtractRes.h"\r
25 \r
26 #include "ExtractDialog.h"\r
27 #include "ExtractGUI.h"\r
28 \r
29 using namespace NWindows;\r
30 \r
31 static const wchar_t *kIncorrectOutDir = L"Incorrect output directory path";\r
32 \r
33 #ifndef _SFX\r
34 \r
35 static void AddValuePair(UINT resourceID, UInt32 langID, UInt64 value, UString &s)\r
36 {\r
37   wchar_t sz[32];\r
38   s += LangString(resourceID, langID);\r
39   s += L' ';\r
40   ConvertUInt64ToString(value, sz);\r
41   s += sz;\r
42   s += L'\n';\r
43 }\r
44 \r
45 static void AddSizePair(UINT resourceID, UInt32 langID, UInt64 value, UString &s)\r
46 {\r
47   wchar_t sz[32];\r
48   s += LangString(resourceID, langID);\r
49   s += L' ';\r
50   ConvertUInt64ToString(value, sz);\r
51   s += sz;\r
52   ConvertUInt64ToString(value >> 20, sz);\r
53   s += L" (";\r
54   s += sz;\r
55   s += L" MB)";\r
56   s += L'\n';\r
57 }\r
58 \r
59 #endif\r
60 \r
61 class CThreadExtracting: public CProgressThreadVirt\r
62 {\r
63   HRESULT ProcessVirt();\r
64 public:\r
65   CCodecs *codecs;\r
66   CExtractCallbackImp *ExtractCallbackSpec;\r
67   CIntVector FormatIndices;\r
68 \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
74   UString Title;\r
75 };\r
76 \r
77 HRESULT CThreadExtracting::ProcessVirt()\r
78 {\r
79   CDecompressStat Stat;\r
80   HRESULT res = DecompressArchives(codecs, FormatIndices, *ArchivePaths, *ArchivePathsFull,\r
81       *WildcardCensor, *Options, ExtractCallbackSpec, ExtractCallback, ErrorMessage, Stat);\r
82   #ifndef _SFX\r
83   if (Options->TestMode && ExtractCallbackSpec->IsOK())\r
84   {\r
85     UString s;\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
91     \r
92     if (Options->CalcCrc)\r
93     {\r
94       wchar_t temp[16];\r
95       ConvertUInt32ToHex(Stat.CrcSum, temp);\r
96       s += L"CRC: ";\r
97       s += temp;\r
98       s += L'\n';\r
99     }\r
100     \r
101     s += L'\n';\r
102     s += LangString(IDS_MESSAGE_NO_ERRORS, 0x02000608);\r
103     \r
104     OkMessageTitle = Title;\r
105     OkMessage = s;\r
106   }\r
107   #endif\r
108   return res;\r
109 }\r
110 \r
111 HRESULT ExtractGUI(\r
112     CCodecs *codecs,\r
113     const CIntVector &formatIndices,\r
114     UStringVector &archivePaths,\r
115     UStringVector &archivePathsFull,\r
116     const NWildcard::CCensorNode &wildcardCensor,\r
117     CExtractOptions &options,\r
118     bool showDialog,\r
119     bool &messageWasDisplayed,\r
120     CExtractCallbackImp *extractCallback,\r
121     HWND hwndParent)\r
122 {\r
123   messageWasDisplayed = false;\r
124 \r
125   CThreadExtracting extracter;\r
126   extracter.codecs = codecs;\r
127   extracter.FormatIndices = formatIndices;\r
128 \r
129   if (!options.TestMode)\r
130   {\r
131     UString outputDir = options.OutputDir;\r
132     #ifndef UNDER_CE\r
133     if (outputDir.IsEmpty())\r
134       NFile::NDirectory::MyGetCurrentDirectory(outputDir);\r
135     #endif\r
136     if (showDialog)\r
137     {\r
138       CExtractDialog dialog;\r
139       if (!NFile::NDirectory::MyGetFullPathName(outputDir, dialog.DirectoryPath))\r
140       {\r
141         ShowErrorMessage(kIncorrectOutDir);\r
142         messageWasDisplayed = true;\r
143         return E_FAIL;\r
144       }\r
145       NFile::NName::NormalizeDirPathPrefix(dialog.DirectoryPath);\r
146 \r
147       // dialog.OverwriteMode = options.OverwriteMode;\r
148       // dialog.PathMode = options.PathMode;\r
149 \r
150       if (dialog.Create(hwndParent) != IDOK)\r
151         return E_ABORT;\r
152       outputDir = dialog.DirectoryPath;\r
153       options.OverwriteMode = dialog.OverwriteMode;\r
154       options.PathMode = dialog.PathMode;\r
155       #ifndef _SFX\r
156       extractCallback->Password = dialog.Password;\r
157       extractCallback->PasswordIsDefined = !dialog.Password.IsEmpty();\r
158       #endif\r
159     }\r
160     if (!NFile::NDirectory::MyGetFullPathName(outputDir, options.OutputDir))\r
161     {\r
162       ShowErrorMessage(kIncorrectOutDir);\r
163       messageWasDisplayed = true;\r
164       return E_FAIL;\r
165     }\r
166     NFile::NName::NormalizeDirPathPrefix(options.OutputDir);\r
167     \r
168     /*\r
169     if(!NFile::NDirectory::CreateComplexDirectory(options.OutputDir))\r
170     {\r
171       UString s = GetUnicodeString(NError::MyFormatMessage(GetLastError()));\r
172       UString s2 = MyFormatNew(IDS_CANNOT_CREATE_FOLDER,\r
173       #ifdef LANG\r
174       0x02000603,\r
175       #endif\r
176       options.OutputDir);\r
177       MyMessageBox(s2 + UString(L'\n') + s);\r
178       return E_FAIL;\r
179     }\r
180     */\r
181   }\r
182   \r
183   UString title = LangStringSpec(options.TestMode ? IDS_PROGRESS_TESTING : IDS_PROGRESS_EXTRACTING,\r
184       options.TestMode ? 0x02000F90: 0x02000890);\r
185 \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
191 \r
192   extracter.ProgressDialog.CompressingMode = false;\r
193 \r
194   extracter.ArchivePaths = &archivePaths;\r
195   extracter.ArchivePathsFull = &archivePathsFull;\r
196   extracter.WildcardCensor = &wildcardCensor;\r
197   extracter.Options = &options;\r
198 \r
199   extracter.ProgressDialog.IconID = IDI_ICON;\r
200 \r
201   RINOK(extracter.Create(title, hwndParent));\r
202   messageWasDisplayed = extracter.ThreadFinishedOK &\r
203       extracter.ProgressDialog.MessagesDisplayed;\r
204   return extracter.Result;\r
205 }\r