xref: /aosp_15_r20/external/lzma/CPP/7zip/UI/Far/PluginRead.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
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