1*f6dc9357SAndroid Build Coastguard Worker // PluginRead.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 "Plugin.h"
6*f6dc9357SAndroid Build Coastguard Worker
7*f6dc9357SAndroid Build Coastguard Worker #include "Messages.h"
8*f6dc9357SAndroid Build Coastguard Worker
9*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/StringConvert.h"
10*f6dc9357SAndroid Build Coastguard Worker
11*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/FileName.h"
12*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/FileFind.h"
13*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/FileDir.h"
14*f6dc9357SAndroid Build Coastguard Worker
15*f6dc9357SAndroid Build Coastguard Worker #include "../Common/ZipRegistry.h"
16*f6dc9357SAndroid Build Coastguard Worker
17*f6dc9357SAndroid Build Coastguard Worker #include "ExtractEngine.h"
18*f6dc9357SAndroid Build Coastguard Worker
19*f6dc9357SAndroid Build Coastguard Worker using namespace NWindows;
20*f6dc9357SAndroid Build Coastguard Worker using namespace NFile;
21*f6dc9357SAndroid Build Coastguard Worker using namespace NDir;
22*f6dc9357SAndroid Build Coastguard Worker using namespace NFar;
23*f6dc9357SAndroid Build Coastguard Worker
24*f6dc9357SAndroid Build Coastguard Worker static const char * const kHelpTopicExtrFromSevenZip = "Extract";
25*f6dc9357SAndroid Build Coastguard Worker
26*f6dc9357SAndroid Build Coastguard Worker static const char kDirDelimiter = CHAR_PATH_SEPARATOR;
27*f6dc9357SAndroid Build Coastguard Worker
28*f6dc9357SAndroid Build Coastguard Worker static const char * const kExractPathHistoryName = "7-ZipExtractPath";
29*f6dc9357SAndroid Build Coastguard Worker
ExtractFiles(bool decompressAllItems,const UInt32 * indices,UInt32 numIndices,bool silent,NExtract::NPathMode::EEnum pathMode,NExtract::NOverwriteMode::EEnum overwriteMode,const UString & destPath,bool passwordIsDefined,const UString & password)30*f6dc9357SAndroid Build Coastguard Worker HRESULT CPlugin::ExtractFiles(
31*f6dc9357SAndroid Build Coastguard Worker bool decompressAllItems,
32*f6dc9357SAndroid Build Coastguard Worker const UInt32 *indices,
33*f6dc9357SAndroid Build Coastguard Worker UInt32 numIndices,
34*f6dc9357SAndroid Build Coastguard Worker bool silent,
35*f6dc9357SAndroid Build Coastguard Worker NExtract::NPathMode::EEnum pathMode,
36*f6dc9357SAndroid Build Coastguard Worker NExtract::NOverwriteMode::EEnum overwriteMode,
37*f6dc9357SAndroid Build Coastguard Worker const UString &destPath,
38*f6dc9357SAndroid Build Coastguard Worker bool passwordIsDefined, const UString &password)
39*f6dc9357SAndroid Build Coastguard Worker {
40*f6dc9357SAndroid Build Coastguard Worker if (_agent->_isHashHandler)
41*f6dc9357SAndroid Build Coastguard Worker {
42*f6dc9357SAndroid Build Coastguard Worker g_StartupInfo.ShowMessage(NMessageID::kMoveIsNotSupported);
43*f6dc9357SAndroid Build Coastguard Worker return NFileOperationReturnCode::kError;
44*f6dc9357SAndroid Build Coastguard Worker }
45*f6dc9357SAndroid Build Coastguard Worker
46*f6dc9357SAndroid Build Coastguard Worker CScreenRestorer screenRestorer;
47*f6dc9357SAndroid Build Coastguard Worker CProgressBox progressBox;
48*f6dc9357SAndroid Build Coastguard Worker CProgressBox *progressBoxPointer = NULL;
49*f6dc9357SAndroid Build Coastguard Worker if (!silent)
50*f6dc9357SAndroid Build Coastguard Worker {
51*f6dc9357SAndroid Build Coastguard Worker screenRestorer.Save();
52*f6dc9357SAndroid Build Coastguard Worker
53*f6dc9357SAndroid Build Coastguard Worker progressBoxPointer = &progressBox;
54*f6dc9357SAndroid Build Coastguard Worker progressBox.Init(
55*f6dc9357SAndroid Build Coastguard Worker // g_StartupInfo.GetMsgString(NMessageID::kWaitTitle),
56*f6dc9357SAndroid Build Coastguard Worker g_StartupInfo.GetMsgString(NMessageID::kExtracting));
57*f6dc9357SAndroid Build Coastguard Worker }
58*f6dc9357SAndroid Build Coastguard Worker
59*f6dc9357SAndroid Build Coastguard Worker
60*f6dc9357SAndroid Build Coastguard Worker CExtractCallbackImp *extractCallbackSpec = new CExtractCallbackImp;
61*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IFolderArchiveExtractCallback> extractCallback(extractCallbackSpec);
62*f6dc9357SAndroid Build Coastguard Worker
63*f6dc9357SAndroid Build Coastguard Worker extractCallbackSpec->Init(
64*f6dc9357SAndroid Build Coastguard Worker CP_OEMCP,
65*f6dc9357SAndroid Build Coastguard Worker progressBoxPointer,
66*f6dc9357SAndroid Build Coastguard Worker /*
67*f6dc9357SAndroid Build Coastguard Worker GetDefaultName(m_FileName, m_ArchiverInfo.Extension),
68*f6dc9357SAndroid Build Coastguard Worker m_FileInfo.MTime, m_FileInfo.Attributes,
69*f6dc9357SAndroid Build Coastguard Worker */
70*f6dc9357SAndroid Build Coastguard Worker passwordIsDefined, password);
71*f6dc9357SAndroid Build Coastguard Worker
72*f6dc9357SAndroid Build Coastguard Worker if (decompressAllItems)
73*f6dc9357SAndroid Build Coastguard Worker return m_ArchiveHandler->Extract(pathMode, overwriteMode,
74*f6dc9357SAndroid Build Coastguard Worker destPath, BoolToInt(false), extractCallback);
75*f6dc9357SAndroid Build Coastguard Worker else
76*f6dc9357SAndroid Build Coastguard Worker {
77*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IArchiveFolder> archiveFolder;
78*f6dc9357SAndroid Build Coastguard Worker _folder.QueryInterface(IID_IArchiveFolder, &archiveFolder);
79*f6dc9357SAndroid Build Coastguard Worker
80*f6dc9357SAndroid Build Coastguard Worker return archiveFolder->Extract(indices, numIndices,
81*f6dc9357SAndroid Build Coastguard Worker BoolToInt(true), // includeAltStreams
82*f6dc9357SAndroid Build Coastguard Worker BoolToInt(false), // replaceAltStreamChars
83*f6dc9357SAndroid Build Coastguard Worker pathMode, overwriteMode,
84*f6dc9357SAndroid Build Coastguard Worker destPath, BoolToInt(false), extractCallback);
85*f6dc9357SAndroid Build Coastguard Worker }
86*f6dc9357SAndroid Build Coastguard Worker }
87*f6dc9357SAndroid Build Coastguard Worker
GetFiles(struct PluginPanelItem * panelItems,unsigned itemsNumber,int move,char * destPath,int opMode)88*f6dc9357SAndroid Build Coastguard Worker NFileOperationReturnCode::EEnum CPlugin::GetFiles(struct PluginPanelItem *panelItems,
89*f6dc9357SAndroid Build Coastguard Worker unsigned itemsNumber, int move, char *destPath, int opMode)
90*f6dc9357SAndroid Build Coastguard Worker {
91*f6dc9357SAndroid Build Coastguard Worker return GetFilesReal(panelItems, itemsNumber, move,
92*f6dc9357SAndroid Build Coastguard Worker destPath, opMode, (opMode & OPM_SILENT) == 0);
93*f6dc9357SAndroid Build Coastguard Worker }
94*f6dc9357SAndroid Build Coastguard Worker
GetFilesReal(struct PluginPanelItem * panelItems,unsigned itemsNumber,int move,const char * destPathLoc,int opMode,bool showBox)95*f6dc9357SAndroid Build Coastguard Worker NFileOperationReturnCode::EEnum CPlugin::GetFilesReal(struct PluginPanelItem *panelItems,
96*f6dc9357SAndroid Build Coastguard Worker unsigned itemsNumber, int move, const char *destPathLoc, int opMode, bool showBox)
97*f6dc9357SAndroid Build Coastguard Worker {
98*f6dc9357SAndroid Build Coastguard Worker if (move != 0)
99*f6dc9357SAndroid Build Coastguard Worker {
100*f6dc9357SAndroid Build Coastguard Worker g_StartupInfo.ShowMessage(NMessageID::kMoveIsNotSupported);
101*f6dc9357SAndroid Build Coastguard Worker return NFileOperationReturnCode::kError;
102*f6dc9357SAndroid Build Coastguard Worker }
103*f6dc9357SAndroid Build Coastguard Worker
104*f6dc9357SAndroid Build Coastguard Worker AString destPath (destPathLoc);
105*f6dc9357SAndroid Build Coastguard Worker UString destPathU = GetUnicodeString(destPath, CP_OEMCP);
106*f6dc9357SAndroid Build Coastguard Worker NName::NormalizeDirPathPrefix(destPathU);
107*f6dc9357SAndroid Build Coastguard Worker destPath = UnicodeStringToMultiByte(destPathU, CP_OEMCP);
108*f6dc9357SAndroid Build Coastguard Worker
109*f6dc9357SAndroid Build Coastguard Worker // bool extractSelectedFiles = true;
110*f6dc9357SAndroid Build Coastguard Worker
111*f6dc9357SAndroid Build Coastguard Worker NExtract::CInfo extractionInfo;
112*f6dc9357SAndroid Build Coastguard Worker extractionInfo.PathMode = NExtract::NPathMode::kCurPaths;
113*f6dc9357SAndroid Build Coastguard Worker extractionInfo.OverwriteMode = NExtract::NOverwriteMode::kOverwrite;
114*f6dc9357SAndroid Build Coastguard Worker
115*f6dc9357SAndroid Build Coastguard Worker const bool silent = (opMode & OPM_SILENT) != 0;
116*f6dc9357SAndroid Build Coastguard Worker bool decompressAllItems = false;
117*f6dc9357SAndroid Build Coastguard Worker UString password = Password;
118*f6dc9357SAndroid Build Coastguard Worker bool passwordIsDefined = PasswordIsDefined;
119*f6dc9357SAndroid Build Coastguard Worker
120*f6dc9357SAndroid Build Coastguard Worker if (!silent)
121*f6dc9357SAndroid Build Coastguard Worker {
122*f6dc9357SAndroid Build Coastguard Worker const int kPathIndex = 2;
123*f6dc9357SAndroid Build Coastguard Worker
124*f6dc9357SAndroid Build Coastguard Worker extractionInfo.Load();
125*f6dc9357SAndroid Build Coastguard Worker
126*f6dc9357SAndroid Build Coastguard Worker const int kPathModeRadioIndex = 4;
127*f6dc9357SAndroid Build Coastguard Worker const int kOverwriteModeRadioIndex = kPathModeRadioIndex + 4;
128*f6dc9357SAndroid Build Coastguard Worker const int kNumOverwriteOptions = 6;
129*f6dc9357SAndroid Build Coastguard Worker const int kFilesModeIndex = kOverwriteModeRadioIndex + kNumOverwriteOptions;
130*f6dc9357SAndroid Build Coastguard Worker const int kXSize = 76;
131*f6dc9357SAndroid Build Coastguard Worker const int kYSize = 19;
132*f6dc9357SAndroid Build Coastguard Worker const int kPasswordYPos = 12;
133*f6dc9357SAndroid Build Coastguard Worker
134*f6dc9357SAndroid Build Coastguard Worker const int kXMid = kXSize / 2;
135*f6dc9357SAndroid Build Coastguard Worker
136*f6dc9357SAndroid Build Coastguard Worker AString oemPassword (UnicodeStringToMultiByte(password, CP_OEMCP));
137*f6dc9357SAndroid Build Coastguard Worker
138*f6dc9357SAndroid Build Coastguard Worker struct CInitDialogItem initItems[]={
139*f6dc9357SAndroid Build Coastguard Worker { DI_DOUBLEBOX, 3, 1, kXSize - 4, kYSize - 2, false, false, 0, false, NMessageID::kExtractTitle, NULL, NULL },
140*f6dc9357SAndroid Build Coastguard Worker { DI_TEXT, 5, 2, 0, 0, false, false, 0, false, NMessageID::kExtractTo, NULL, NULL },
141*f6dc9357SAndroid Build Coastguard Worker
142*f6dc9357SAndroid Build Coastguard Worker { DI_EDIT, 5, 3, kXSize - 6, 3, true, false, DIF_HISTORY, false, -1, destPath, kExractPathHistoryName},
143*f6dc9357SAndroid Build Coastguard Worker // { DI_EDIT, 5, 3, kXSize - 6, 3, true, false, 0, false, -1, destPath, NULL},
144*f6dc9357SAndroid Build Coastguard Worker
145*f6dc9357SAndroid Build Coastguard Worker { DI_SINGLEBOX, 4, 5, kXMid - 2, 5 + 4, false, false, 0, false, NMessageID::kExtractPathMode, NULL, NULL },
146*f6dc9357SAndroid Build Coastguard Worker { DI_RADIOBUTTON, 6, 6, 0, 0, false,
147*f6dc9357SAndroid Build Coastguard Worker extractionInfo.PathMode == NExtract::NPathMode::kFullPaths,
148*f6dc9357SAndroid Build Coastguard Worker DIF_GROUP, false, NMessageID::kExtractPathFull, NULL, NULL },
149*f6dc9357SAndroid Build Coastguard Worker { DI_RADIOBUTTON, 6, 7, 0, 0, false,
150*f6dc9357SAndroid Build Coastguard Worker extractionInfo.PathMode == NExtract::NPathMode::kCurPaths,
151*f6dc9357SAndroid Build Coastguard Worker 0, false, NMessageID::kExtractPathCurrent, NULL, NULL },
152*f6dc9357SAndroid Build Coastguard Worker { DI_RADIOBUTTON, 6, 8, 0, 0, false,
153*f6dc9357SAndroid Build Coastguard Worker extractionInfo.PathMode == NExtract::NPathMode::kNoPaths,
154*f6dc9357SAndroid Build Coastguard Worker false, 0, NMessageID::kExtractPathNo, NULL, NULL },
155*f6dc9357SAndroid Build Coastguard Worker
156*f6dc9357SAndroid Build Coastguard Worker { DI_SINGLEBOX, kXMid, 5, kXSize - 6, 5 + kNumOverwriteOptions, false, false, 0, false, NMessageID::kExtractOwerwriteMode, NULL, NULL },
157*f6dc9357SAndroid Build Coastguard Worker { DI_RADIOBUTTON, kXMid + 2, 6, 0, 0, false,
158*f6dc9357SAndroid Build Coastguard Worker extractionInfo.OverwriteMode == NExtract::NOverwriteMode::kAsk,
159*f6dc9357SAndroid Build Coastguard Worker DIF_GROUP, false, NMessageID::kExtractOwerwriteAsk, NULL, NULL },
160*f6dc9357SAndroid Build Coastguard Worker { DI_RADIOBUTTON, kXMid + 2, 7, 0, 0, false,
161*f6dc9357SAndroid Build Coastguard Worker extractionInfo.OverwriteMode == NExtract::NOverwriteMode::kOverwrite,
162*f6dc9357SAndroid Build Coastguard Worker 0, false, NMessageID::kExtractOwerwritePrompt, NULL, NULL },
163*f6dc9357SAndroid Build Coastguard Worker { DI_RADIOBUTTON, kXMid + 2, 8, 0, 0, false,
164*f6dc9357SAndroid Build Coastguard Worker extractionInfo.OverwriteMode == NExtract::NOverwriteMode::kSkip,
165*f6dc9357SAndroid Build Coastguard Worker 0, false, NMessageID::kExtractOwerwriteSkip, NULL, NULL },
166*f6dc9357SAndroid Build Coastguard Worker { DI_RADIOBUTTON, kXMid + 2, 9, 0, 0, false,
167*f6dc9357SAndroid Build Coastguard Worker extractionInfo.OverwriteMode == NExtract::NOverwriteMode::kRename,
168*f6dc9357SAndroid Build Coastguard Worker 0, false, NMessageID::kExtractOwerwriteAutoRename, NULL, NULL },
169*f6dc9357SAndroid Build Coastguard Worker { DI_RADIOBUTTON, kXMid + 2, 10, 0, 0, false,
170*f6dc9357SAndroid Build Coastguard Worker extractionInfo.OverwriteMode == NExtract::NOverwriteMode::kRenameExisting,
171*f6dc9357SAndroid Build Coastguard Worker 0, false, NMessageID::kExtractOwerwriteAutoRenameExisting, NULL, NULL },
172*f6dc9357SAndroid Build Coastguard Worker
173*f6dc9357SAndroid Build Coastguard Worker { DI_SINGLEBOX, 4, 10, kXMid- 2, 10 + 3, false, false, 0, false, NMessageID::kExtractFilesMode, NULL, NULL },
174*f6dc9357SAndroid Build Coastguard Worker { DI_RADIOBUTTON, 6, 11, 0, 0, false, true, DIF_GROUP, false, NMessageID::kExtractFilesSelected, NULL, NULL },
175*f6dc9357SAndroid Build Coastguard Worker { DI_RADIOBUTTON, 6, 12, 0, 0, false, false, 0, false, NMessageID::kExtractFilesAll, NULL, NULL },
176*f6dc9357SAndroid Build Coastguard Worker
177*f6dc9357SAndroid Build Coastguard Worker { DI_SINGLEBOX, kXMid, kPasswordYPos, kXSize - 6, kPasswordYPos + 2, false, false, 0, false, NMessageID::kExtractPassword, NULL, NULL },
178*f6dc9357SAndroid Build Coastguard Worker { DI_PSWEDIT, kXMid + 2, kPasswordYPos + 1, kXSize - 8, 12, false, false, 0, false, -1, oemPassword, NULL},
179*f6dc9357SAndroid Build Coastguard Worker
180*f6dc9357SAndroid Build Coastguard Worker { DI_TEXT, 3, kYSize - 4, 0, 0, false, false, DIF_BOXCOLOR|DIF_SEPARATOR, false, -1, "", NULL },
181*f6dc9357SAndroid Build Coastguard Worker
182*f6dc9357SAndroid Build Coastguard Worker
183*f6dc9357SAndroid Build Coastguard Worker { DI_BUTTON, 0, kYSize - 3, 0, 0, false, false, DIF_CENTERGROUP, true, NMessageID::kExtractExtract, NULL, NULL },
184*f6dc9357SAndroid Build Coastguard Worker { DI_BUTTON, 0, kYSize - 3, 0, 0, false, false, DIF_CENTERGROUP, false, NMessageID::kExtractCancel, NULL, NULL }
185*f6dc9357SAndroid Build Coastguard Worker };
186*f6dc9357SAndroid Build Coastguard Worker
187*f6dc9357SAndroid Build Coastguard Worker const unsigned kNumDialogItems = Z7_ARRAY_SIZE(initItems);
188*f6dc9357SAndroid Build Coastguard Worker const unsigned kOkButtonIndex = kNumDialogItems - 2;
189*f6dc9357SAndroid Build Coastguard Worker const unsigned kPasswordIndex = kNumDialogItems - 4;
190*f6dc9357SAndroid Build Coastguard Worker
191*f6dc9357SAndroid Build Coastguard Worker FarDialogItem dialogItems[kNumDialogItems];
192*f6dc9357SAndroid Build Coastguard Worker g_StartupInfo.InitDialogItems(initItems, dialogItems, kNumDialogItems);
193*f6dc9357SAndroid Build Coastguard Worker for (;;)
194*f6dc9357SAndroid Build Coastguard Worker {
195*f6dc9357SAndroid Build Coastguard Worker int askCode = g_StartupInfo.ShowDialog(kXSize, kYSize,
196*f6dc9357SAndroid Build Coastguard Worker kHelpTopicExtrFromSevenZip, dialogItems, kNumDialogItems);
197*f6dc9357SAndroid Build Coastguard Worker if (askCode != kOkButtonIndex)
198*f6dc9357SAndroid Build Coastguard Worker return NFileOperationReturnCode::kInterruptedByUser;
199*f6dc9357SAndroid Build Coastguard Worker destPath = dialogItems[kPathIndex].Data;
200*f6dc9357SAndroid Build Coastguard Worker destPathU = GetUnicodeString(destPath, CP_OEMCP);
201*f6dc9357SAndroid Build Coastguard Worker destPathU.Trim();
202*f6dc9357SAndroid Build Coastguard Worker if (destPathU.IsEmpty())
203*f6dc9357SAndroid Build Coastguard Worker {
204*f6dc9357SAndroid Build Coastguard Worker #ifdef UNDER_CE
205*f6dc9357SAndroid Build Coastguard Worker destPathU = "\\";
206*f6dc9357SAndroid Build Coastguard Worker #else
207*f6dc9357SAndroid Build Coastguard Worker FString destPathF = us2fs(destPathU);
208*f6dc9357SAndroid Build Coastguard Worker if (!GetCurrentDir(destPathF))
209*f6dc9357SAndroid Build Coastguard Worker throw 318016;
210*f6dc9357SAndroid Build Coastguard Worker NName::NormalizeDirPathPrefix(destPathF);
211*f6dc9357SAndroid Build Coastguard Worker destPathU = fs2us(destPathF);
212*f6dc9357SAndroid Build Coastguard Worker #endif
213*f6dc9357SAndroid Build Coastguard Worker break;
214*f6dc9357SAndroid Build Coastguard Worker }
215*f6dc9357SAndroid Build Coastguard Worker else
216*f6dc9357SAndroid Build Coastguard Worker {
217*f6dc9357SAndroid Build Coastguard Worker if (destPathU.Back() == kDirDelimiter)
218*f6dc9357SAndroid Build Coastguard Worker break;
219*f6dc9357SAndroid Build Coastguard Worker }
220*f6dc9357SAndroid Build Coastguard Worker g_StartupInfo.ShowErrorMessage("You must specify directory path");
221*f6dc9357SAndroid Build Coastguard Worker }
222*f6dc9357SAndroid Build Coastguard Worker
223*f6dc9357SAndroid Build Coastguard Worker if (dialogItems[kPathModeRadioIndex].Selected)
224*f6dc9357SAndroid Build Coastguard Worker extractionInfo.PathMode = NExtract::NPathMode::kFullPaths;
225*f6dc9357SAndroid Build Coastguard Worker else if (dialogItems[kPathModeRadioIndex + 1].Selected)
226*f6dc9357SAndroid Build Coastguard Worker extractionInfo.PathMode = NExtract::NPathMode::kCurPaths;
227*f6dc9357SAndroid Build Coastguard Worker else if (dialogItems[kPathModeRadioIndex + 2].Selected)
228*f6dc9357SAndroid Build Coastguard Worker extractionInfo.PathMode = NExtract::NPathMode::kNoPaths;
229*f6dc9357SAndroid Build Coastguard Worker else
230*f6dc9357SAndroid Build Coastguard Worker throw 31806;
231*f6dc9357SAndroid Build Coastguard Worker
232*f6dc9357SAndroid Build Coastguard Worker if (dialogItems[kOverwriteModeRadioIndex].Selected)
233*f6dc9357SAndroid Build Coastguard Worker extractionInfo.OverwriteMode = NExtract::NOverwriteMode::kAsk;
234*f6dc9357SAndroid Build Coastguard Worker else if (dialogItems[kOverwriteModeRadioIndex + 1].Selected)
235*f6dc9357SAndroid Build Coastguard Worker extractionInfo.OverwriteMode = NExtract::NOverwriteMode::kOverwrite;
236*f6dc9357SAndroid Build Coastguard Worker else if (dialogItems[kOverwriteModeRadioIndex + 2].Selected)
237*f6dc9357SAndroid Build Coastguard Worker extractionInfo.OverwriteMode = NExtract::NOverwriteMode::kSkip;
238*f6dc9357SAndroid Build Coastguard Worker else if (dialogItems[kOverwriteModeRadioIndex + 3].Selected)
239*f6dc9357SAndroid Build Coastguard Worker extractionInfo.OverwriteMode = NExtract::NOverwriteMode::kRename;
240*f6dc9357SAndroid Build Coastguard Worker else if (dialogItems[kOverwriteModeRadioIndex + 4].Selected)
241*f6dc9357SAndroid Build Coastguard Worker extractionInfo.OverwriteMode = NExtract::NOverwriteMode::kRenameExisting;
242*f6dc9357SAndroid Build Coastguard Worker else
243*f6dc9357SAndroid Build Coastguard Worker throw 31806;
244*f6dc9357SAndroid Build Coastguard Worker
245*f6dc9357SAndroid Build Coastguard Worker if (dialogItems[kFilesModeIndex].Selected)
246*f6dc9357SAndroid Build Coastguard Worker decompressAllItems = false;
247*f6dc9357SAndroid Build Coastguard Worker else if (dialogItems[kFilesModeIndex + 1].Selected)
248*f6dc9357SAndroid Build Coastguard Worker decompressAllItems = true;
249*f6dc9357SAndroid Build Coastguard Worker else
250*f6dc9357SAndroid Build Coastguard Worker throw 31806;
251*f6dc9357SAndroid Build Coastguard Worker
252*f6dc9357SAndroid Build Coastguard Worker extractionInfo.Save();
253*f6dc9357SAndroid Build Coastguard Worker
254*f6dc9357SAndroid Build Coastguard Worker if (dialogItems[kFilesModeIndex].Selected)
255*f6dc9357SAndroid Build Coastguard Worker {
256*f6dc9357SAndroid Build Coastguard Worker // extractSelectedFiles = true;
257*f6dc9357SAndroid Build Coastguard Worker }
258*f6dc9357SAndroid Build Coastguard Worker else if (dialogItems[kFilesModeIndex + 1].Selected)
259*f6dc9357SAndroid Build Coastguard Worker {
260*f6dc9357SAndroid Build Coastguard Worker // extractSelectedFiles = false;
261*f6dc9357SAndroid Build Coastguard Worker }
262*f6dc9357SAndroid Build Coastguard Worker else
263*f6dc9357SAndroid Build Coastguard Worker throw 31806;
264*f6dc9357SAndroid Build Coastguard Worker
265*f6dc9357SAndroid Build Coastguard Worker oemPassword = dialogItems[kPasswordIndex].Data;
266*f6dc9357SAndroid Build Coastguard Worker password = MultiByteToUnicodeString(oemPassword, CP_OEMCP);
267*f6dc9357SAndroid Build Coastguard Worker passwordIsDefined = !password.IsEmpty();
268*f6dc9357SAndroid Build Coastguard Worker }
269*f6dc9357SAndroid Build Coastguard Worker
270*f6dc9357SAndroid Build Coastguard Worker CreateComplexDir(us2fs(destPathU));
271*f6dc9357SAndroid Build Coastguard Worker
272*f6dc9357SAndroid Build Coastguard Worker /*
273*f6dc9357SAndroid Build Coastguard Worker vector<int> realIndices;
274*f6dc9357SAndroid Build Coastguard Worker if (!decompressAllItems)
275*f6dc9357SAndroid Build Coastguard Worker GetRealIndexes(panelItems, itemsNumber, realIndices);
276*f6dc9357SAndroid Build Coastguard Worker */
277*f6dc9357SAndroid Build Coastguard Worker CObjArray<UInt32> indices(itemsNumber);
278*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 0; i < itemsNumber; i++)
279*f6dc9357SAndroid Build Coastguard Worker indices[i] = (UInt32)panelItems[i].UserData;
280*f6dc9357SAndroid Build Coastguard Worker
281*f6dc9357SAndroid Build Coastguard Worker const HRESULT result = ExtractFiles(decompressAllItems, indices, itemsNumber,
282*f6dc9357SAndroid Build Coastguard Worker !showBox, extractionInfo.PathMode, extractionInfo.OverwriteMode,
283*f6dc9357SAndroid Build Coastguard Worker destPathU,
284*f6dc9357SAndroid Build Coastguard Worker passwordIsDefined, password);
285*f6dc9357SAndroid Build Coastguard Worker // HRESULT result = ExtractFiles(decompressAllItems, realIndices, !showBox,
286*f6dc9357SAndroid Build Coastguard Worker // extractionInfo, destPath, passwordIsDefined, password);
287*f6dc9357SAndroid Build Coastguard Worker if (result != S_OK)
288*f6dc9357SAndroid Build Coastguard Worker {
289*f6dc9357SAndroid Build Coastguard Worker if (result == E_ABORT)
290*f6dc9357SAndroid Build Coastguard Worker return NFileOperationReturnCode::kInterruptedByUser;
291*f6dc9357SAndroid Build Coastguard Worker ShowSysErrorMessage(result);
292*f6dc9357SAndroid Build Coastguard Worker return NFileOperationReturnCode::kError;
293*f6dc9357SAndroid Build Coastguard Worker }
294*f6dc9357SAndroid Build Coastguard Worker
295*f6dc9357SAndroid Build Coastguard Worker // if (move != 0)
296*f6dc9357SAndroid Build Coastguard Worker // {
297*f6dc9357SAndroid Build Coastguard Worker // if (DeleteFiles(panelItems, itemsNumber, opMode) == FALSE)
298*f6dc9357SAndroid Build Coastguard Worker // return NFileOperationReturnCode::kError;
299*f6dc9357SAndroid Build Coastguard Worker // }
300*f6dc9357SAndroid Build Coastguard Worker return NFileOperationReturnCode::kSuccess;
301*f6dc9357SAndroid Build Coastguard Worker }
302