xref: /aosp_15_r20/external/lzma/CPP/7zip/UI/Far/PluginWrite.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // PluginWrite.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 <stdio.h>
6*f6dc9357SAndroid Build Coastguard Worker 
7*f6dc9357SAndroid Build Coastguard Worker #include "Plugin.h"
8*f6dc9357SAndroid Build Coastguard Worker 
9*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/StringConvert.h"
10*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/Wildcard.h"
11*f6dc9357SAndroid Build Coastguard Worker 
12*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/FileName.h"
13*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/FileFind.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 "../Agent/Agent.h"
18*f6dc9357SAndroid Build Coastguard Worker 
19*f6dc9357SAndroid Build Coastguard Worker #include "ProgressBox.h"
20*f6dc9357SAndroid Build Coastguard Worker #include "Messages.h"
21*f6dc9357SAndroid Build Coastguard Worker #include "UpdateCallbackFar.h"
22*f6dc9357SAndroid Build Coastguard Worker 
23*f6dc9357SAndroid Build Coastguard Worker using namespace NWindows;
24*f6dc9357SAndroid Build Coastguard Worker using namespace NFile;
25*f6dc9357SAndroid Build Coastguard Worker using namespace NDir;
26*f6dc9357SAndroid Build Coastguard Worker using namespace NFar;
27*f6dc9357SAndroid Build Coastguard Worker 
28*f6dc9357SAndroid Build Coastguard Worker using namespace NUpdateArchive;
29*f6dc9357SAndroid Build Coastguard Worker 
30*f6dc9357SAndroid Build Coastguard Worker static const char * const kHelpTopic = "Update";
31*f6dc9357SAndroid Build Coastguard Worker 
32*f6dc9357SAndroid Build Coastguard Worker static const char * const kArchiveHistoryKeyName = "7-ZipArcName";
33*f6dc9357SAndroid Build Coastguard Worker 
34*f6dc9357SAndroid Build Coastguard Worker static const UInt32 g_MethodMap[] = { 0, 1, 3, 5, 7, 9 };
35*f6dc9357SAndroid Build Coastguard Worker 
SetOutProperties(IOutFolderArchive * outArchive,UInt32 method)36*f6dc9357SAndroid Build Coastguard Worker static HRESULT SetOutProperties(IOutFolderArchive *outArchive, UInt32 method)
37*f6dc9357SAndroid Build Coastguard Worker {
38*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr<ISetProperties> setProperties;
39*f6dc9357SAndroid Build Coastguard Worker   if (outArchive->QueryInterface(IID_ISetProperties, (void **)&setProperties) == S_OK)
40*f6dc9357SAndroid Build Coastguard Worker   {
41*f6dc9357SAndroid Build Coastguard Worker     /*
42*f6dc9357SAndroid Build Coastguard Worker     UStringVector realNames;
43*f6dc9357SAndroid Build Coastguard Worker     realNames.Add(UString("x"));
44*f6dc9357SAndroid Build Coastguard Worker     NCOM::CPropVariant value = (UInt32)method;
45*f6dc9357SAndroid Build Coastguard Worker     CRecordVector<const wchar_t *> names;
46*f6dc9357SAndroid Build Coastguard Worker     FOR_VECTOR (i, realNames)
47*f6dc9357SAndroid Build Coastguard Worker       names.Add(realNames[i]);
48*f6dc9357SAndroid Build Coastguard Worker     RINOK(setProperties->SetProperties(&names.Front(), &value, names.Size()));
49*f6dc9357SAndroid Build Coastguard Worker     */
50*f6dc9357SAndroid Build Coastguard Worker     NCOM::CPropVariant value = (UInt32)method;
51*f6dc9357SAndroid Build Coastguard Worker     const wchar_t *name = L"x";
52*f6dc9357SAndroid Build Coastguard Worker     RINOK(setProperties->SetProperties(&name, &value, 1))
53*f6dc9357SAndroid Build Coastguard Worker   }
54*f6dc9357SAndroid Build Coastguard Worker   return S_OK;
55*f6dc9357SAndroid Build Coastguard Worker }
56*f6dc9357SAndroid Build Coastguard Worker 
57*f6dc9357SAndroid Build Coastguard Worker /*
58*f6dc9357SAndroid Build Coastguard Worker HRESULT CPlugin::AfterUpdate(CWorkDirTempFile &tempFile, const UStringVector &pathVector)
59*f6dc9357SAndroid Build Coastguard Worker {
60*f6dc9357SAndroid Build Coastguard Worker   _folder.Release();
61*f6dc9357SAndroid Build Coastguard Worker   m_ArchiveHandler->Close();
62*f6dc9357SAndroid Build Coastguard Worker 
63*f6dc9357SAndroid Build Coastguard Worker   RINOK(tempFile.MoveToOriginal(true));
64*f6dc9357SAndroid Build Coastguard Worker 
65*f6dc9357SAndroid Build Coastguard Worker   RINOK(m_ArchiveHandler->ReOpen(NULL)); // check it
66*f6dc9357SAndroid Build Coastguard Worker 
67*f6dc9357SAndroid Build Coastguard Worker   m_ArchiveHandler->BindToRootFolder(&_folder);
68*f6dc9357SAndroid Build Coastguard Worker   FOR_VECTOR (i, pathVector)
69*f6dc9357SAndroid Build Coastguard Worker   {
70*f6dc9357SAndroid Build Coastguard Worker     CMyComPtr<IFolderFolder> newFolder;
71*f6dc9357SAndroid Build Coastguard Worker     _folder->BindToFolder(pathVector[i], &newFolder);
72*f6dc9357SAndroid Build Coastguard Worker     if (!newFolder)
73*f6dc9357SAndroid Build Coastguard Worker       break;
74*f6dc9357SAndroid Build Coastguard Worker     _folder = newFolder;
75*f6dc9357SAndroid Build Coastguard Worker   }
76*f6dc9357SAndroid Build Coastguard Worker   return S_OK;
77*f6dc9357SAndroid Build Coastguard Worker }
78*f6dc9357SAndroid Build Coastguard Worker */
79*f6dc9357SAndroid Build Coastguard Worker 
PutFiles(struct PluginPanelItem * panelItems,unsigned numItems,int moveMode,int opMode)80*f6dc9357SAndroid Build Coastguard Worker NFileOperationReturnCode::EEnum CPlugin::PutFiles(
81*f6dc9357SAndroid Build Coastguard Worker   struct PluginPanelItem *panelItems, unsigned numItems,
82*f6dc9357SAndroid Build Coastguard Worker   int moveMode, int opMode)
83*f6dc9357SAndroid Build Coastguard Worker {
84*f6dc9357SAndroid Build Coastguard Worker   if (moveMode != 0
85*f6dc9357SAndroid Build Coastguard Worker       && _agent->_isHashHandler)
86*f6dc9357SAndroid Build Coastguard Worker   {
87*f6dc9357SAndroid Build Coastguard Worker     g_StartupInfo.ShowMessage(NMessageID::kMoveIsNotSupported);
88*f6dc9357SAndroid Build Coastguard Worker     return NFileOperationReturnCode::kError;
89*f6dc9357SAndroid Build Coastguard Worker   }
90*f6dc9357SAndroid Build Coastguard Worker 
91*f6dc9357SAndroid Build Coastguard Worker   if (numItems <= 0)
92*f6dc9357SAndroid Build Coastguard Worker     return NFileOperationReturnCode::kError;
93*f6dc9357SAndroid Build Coastguard Worker 
94*f6dc9357SAndroid Build Coastguard Worker   if (_agent->IsThere_ReadOnlyArc())
95*f6dc9357SAndroid Build Coastguard Worker   {
96*f6dc9357SAndroid Build Coastguard Worker     g_StartupInfo.ShowMessage(NMessageID::kUpdateNotSupportedForThisArchive);
97*f6dc9357SAndroid Build Coastguard Worker     return NFileOperationReturnCode::kError;
98*f6dc9357SAndroid Build Coastguard Worker   }
99*f6dc9357SAndroid Build Coastguard Worker 
100*f6dc9357SAndroid Build Coastguard Worker   const int kYSize = 14;
101*f6dc9357SAndroid Build Coastguard Worker   const int kXMid = 38;
102*f6dc9357SAndroid Build Coastguard Worker 
103*f6dc9357SAndroid Build Coastguard Worker   NCompression::CInfo compressionInfo;
104*f6dc9357SAndroid Build Coastguard Worker   compressionInfo.Load();
105*f6dc9357SAndroid Build Coastguard Worker 
106*f6dc9357SAndroid Build Coastguard Worker   unsigned methodIndex = 0;
107*f6dc9357SAndroid Build Coastguard Worker 
108*f6dc9357SAndroid Build Coastguard Worker   unsigned i;
109*f6dc9357SAndroid Build Coastguard Worker   for (i = Z7_ARRAY_SIZE(g_MethodMap); i != 0;)
110*f6dc9357SAndroid Build Coastguard Worker   {
111*f6dc9357SAndroid Build Coastguard Worker     i--;
112*f6dc9357SAndroid Build Coastguard Worker     if (compressionInfo.Level >= g_MethodMap[i])
113*f6dc9357SAndroid Build Coastguard Worker     {
114*f6dc9357SAndroid Build Coastguard Worker       methodIndex = i;
115*f6dc9357SAndroid Build Coastguard Worker       break;
116*f6dc9357SAndroid Build Coastguard Worker     }
117*f6dc9357SAndroid Build Coastguard Worker   }
118*f6dc9357SAndroid Build Coastguard Worker 
119*f6dc9357SAndroid Build Coastguard Worker   const int kMethodRadioIndex = 2;
120*f6dc9357SAndroid Build Coastguard Worker   const int kModeRadioIndex = kMethodRadioIndex + 7;
121*f6dc9357SAndroid Build Coastguard Worker 
122*f6dc9357SAndroid Build Coastguard Worker   struct CInitDialogItem initItems[]={
123*f6dc9357SAndroid Build Coastguard Worker     { DI_DOUBLEBOX, 3, 1, 72, kYSize - 2, false, false, 0, false, NMessageID::kUpdateTitle, NULL, NULL },
124*f6dc9357SAndroid Build Coastguard Worker 
125*f6dc9357SAndroid Build Coastguard Worker     { DI_SINGLEBOX, 4, 2, kXMid - 2, 2 + 7, false, false, 0, false, NMessageID::kUpdateMethod, NULL, NULL },
126*f6dc9357SAndroid Build Coastguard Worker 
127*f6dc9357SAndroid Build Coastguard Worker     { DI_RADIOBUTTON, 6, 3, 0, 0, methodIndex == 0, methodIndex == 0, DIF_GROUP, false, NMessageID::kUpdateMethod_Store, NULL, NULL },
128*f6dc9357SAndroid Build Coastguard Worker     { DI_RADIOBUTTON, 6, 4, 0, 0, methodIndex == 1, methodIndex == 1, 0, false, NMessageID::kUpdateMethod_Fastest, NULL, NULL },
129*f6dc9357SAndroid Build Coastguard Worker     { DI_RADIOBUTTON, 6, 5, 0, 0, methodIndex == 2, methodIndex == 2, 0, false, NMessageID::kUpdateMethod_Fast, NULL, NULL },
130*f6dc9357SAndroid Build Coastguard Worker     { DI_RADIOBUTTON, 6, 6, 0, 0, methodIndex == 3, methodIndex == 3, 0, false, NMessageID::kUpdateMethod_Normal, NULL, NULL },
131*f6dc9357SAndroid Build Coastguard Worker     { DI_RADIOBUTTON, 6, 7, 0, 0, methodIndex == 4, methodIndex == 4, 0, false, NMessageID::kUpdateMethod_Maximum, NULL, NULL },
132*f6dc9357SAndroid Build Coastguard Worker     { DI_RADIOBUTTON, 6, 8, 0, 0, methodIndex == 5, methodIndex == 5, 0, false, NMessageID::kUpdateMethod_Ultra, NULL, NULL },
133*f6dc9357SAndroid Build Coastguard Worker 
134*f6dc9357SAndroid Build Coastguard Worker     { DI_SINGLEBOX, kXMid, 2, 70, 2 + 5, false, false, 0, false, NMessageID::kUpdateMode, NULL, NULL },
135*f6dc9357SAndroid Build Coastguard Worker 
136*f6dc9357SAndroid Build Coastguard Worker     { DI_RADIOBUTTON, kXMid + 2, 3, 0, 0, false, true, DIF_GROUP, false, NMessageID::kUpdateMode_Add, NULL, NULL },
137*f6dc9357SAndroid Build Coastguard Worker     { DI_RADIOBUTTON, kXMid + 2, 4, 0, 0, false, false,        0, false, NMessageID::kUpdateMode_Update, NULL, NULL },
138*f6dc9357SAndroid Build Coastguard Worker     { DI_RADIOBUTTON, kXMid + 2, 5, 0, 0, false, false,        0, false, NMessageID::kUpdateMode_Fresh, NULL, NULL },
139*f6dc9357SAndroid Build Coastguard Worker     { DI_RADIOBUTTON, kXMid + 2, 6, 0, 0, false, false,        0, false, NMessageID::kUpdateMode_Sync, NULL, NULL },
140*f6dc9357SAndroid Build Coastguard Worker 
141*f6dc9357SAndroid Build Coastguard Worker     { DI_TEXT, 3, kYSize - 4, 0, 0, false, false, DIF_BOXCOLOR|DIF_SEPARATOR, false, -1, "", NULL  },
142*f6dc9357SAndroid Build Coastguard Worker 
143*f6dc9357SAndroid Build Coastguard Worker     { DI_BUTTON, 0, kYSize - 3, 0, 0, false, false, DIF_CENTERGROUP, true, NMessageID::kUpdateAdd, NULL, NULL  },
144*f6dc9357SAndroid Build Coastguard Worker     { DI_BUTTON, 0, kYSize - 3, 0, 0, false, false, DIF_CENTERGROUP, false, NMessageID::kCancel, NULL, NULL  }
145*f6dc9357SAndroid Build Coastguard Worker   };
146*f6dc9357SAndroid Build Coastguard Worker 
147*f6dc9357SAndroid Build Coastguard Worker   const int kNumDialogItems = Z7_ARRAY_SIZE(initItems);
148*f6dc9357SAndroid Build Coastguard Worker   const int kOkButtonIndex = kNumDialogItems - 2;
149*f6dc9357SAndroid Build Coastguard Worker   FarDialogItem dialogItems[kNumDialogItems];
150*f6dc9357SAndroid Build Coastguard Worker   g_StartupInfo.InitDialogItems(initItems, dialogItems, kNumDialogItems);
151*f6dc9357SAndroid Build Coastguard Worker   const int askCode = g_StartupInfo.ShowDialog(76, kYSize,
152*f6dc9357SAndroid Build Coastguard Worker       kHelpTopic, dialogItems, kNumDialogItems);
153*f6dc9357SAndroid Build Coastguard Worker   if (askCode != kOkButtonIndex)
154*f6dc9357SAndroid Build Coastguard Worker     return NFileOperationReturnCode::kInterruptedByUser;
155*f6dc9357SAndroid Build Coastguard Worker 
156*f6dc9357SAndroid Build Coastguard Worker   compressionInfo.Level = g_MethodMap[0];
157*f6dc9357SAndroid Build Coastguard Worker   for (i = 0; i < Z7_ARRAY_SIZE(g_MethodMap); i++)
158*f6dc9357SAndroid Build Coastguard Worker     if (dialogItems[kMethodRadioIndex + i].Selected)
159*f6dc9357SAndroid Build Coastguard Worker       compressionInfo.Level = g_MethodMap[i];
160*f6dc9357SAndroid Build Coastguard Worker 
161*f6dc9357SAndroid Build Coastguard Worker   const CActionSet *actionSet;
162*f6dc9357SAndroid Build Coastguard Worker 
163*f6dc9357SAndroid Build Coastguard Worker        if (dialogItems[kModeRadioIndex    ].Selected) actionSet = &k_ActionSet_Add;
164*f6dc9357SAndroid Build Coastguard Worker   else if (dialogItems[kModeRadioIndex + 1].Selected) actionSet = &k_ActionSet_Update;
165*f6dc9357SAndroid Build Coastguard Worker   else if (dialogItems[kModeRadioIndex + 2].Selected) actionSet = &k_ActionSet_Fresh;
166*f6dc9357SAndroid Build Coastguard Worker   else if (dialogItems[kModeRadioIndex + 3].Selected) actionSet = &k_ActionSet_Sync;
167*f6dc9357SAndroid Build Coastguard Worker   else throw 51751;
168*f6dc9357SAndroid Build Coastguard Worker 
169*f6dc9357SAndroid Build Coastguard Worker   compressionInfo.Save();
170*f6dc9357SAndroid Build Coastguard Worker 
171*f6dc9357SAndroid Build Coastguard Worker   CWorkDirTempFile tempFile;
172*f6dc9357SAndroid Build Coastguard Worker   if (tempFile.CreateTempFile(m_FileName) != S_OK)
173*f6dc9357SAndroid Build Coastguard Worker     return NFileOperationReturnCode::kError;
174*f6dc9357SAndroid Build Coastguard Worker 
175*f6dc9357SAndroid Build Coastguard Worker 
176*f6dc9357SAndroid Build Coastguard Worker   /*
177*f6dc9357SAndroid Build Coastguard Worker   CSysStringVector fileNames;
178*f6dc9357SAndroid Build Coastguard Worker   for (int i = 0; i < numItems; i++)
179*f6dc9357SAndroid Build Coastguard Worker   {
180*f6dc9357SAndroid Build Coastguard Worker     const PluginPanelItem &panelItem = panelItems[i];
181*f6dc9357SAndroid Build Coastguard Worker     CSysString fullName;
182*f6dc9357SAndroid Build Coastguard Worker     if (!MyGetFullPathName(panelItem.FindData.cFileName, fullName))
183*f6dc9357SAndroid Build Coastguard Worker       return NFileOperationReturnCode::kError;
184*f6dc9357SAndroid Build Coastguard Worker     fileNames.Add(fullName);
185*f6dc9357SAndroid Build Coastguard Worker   }
186*f6dc9357SAndroid Build Coastguard Worker   */
187*f6dc9357SAndroid Build Coastguard Worker 
188*f6dc9357SAndroid Build Coastguard Worker   CScreenRestorer screenRestorer;
189*f6dc9357SAndroid Build Coastguard Worker   CProgressBox progressBox;
190*f6dc9357SAndroid Build Coastguard Worker   CProgressBox *progressBoxPointer = NULL;
191*f6dc9357SAndroid Build Coastguard Worker   if ((opMode & OPM_SILENT) == 0 && (opMode & OPM_FIND ) == 0)
192*f6dc9357SAndroid Build Coastguard Worker   {
193*f6dc9357SAndroid Build Coastguard Worker     screenRestorer.Save();
194*f6dc9357SAndroid Build Coastguard Worker 
195*f6dc9357SAndroid Build Coastguard Worker     progressBoxPointer = &progressBox;
196*f6dc9357SAndroid Build Coastguard Worker     progressBox.Init(
197*f6dc9357SAndroid Build Coastguard Worker         // g_StartupInfo.GetMsgString(NMessageID::kWaitTitle),
198*f6dc9357SAndroid Build Coastguard Worker         g_StartupInfo.GetMsgString(NMessageID::kUpdating));
199*f6dc9357SAndroid Build Coastguard Worker   }
200*f6dc9357SAndroid Build Coastguard Worker 
201*f6dc9357SAndroid Build Coastguard Worker   UStringVector pathVector;
202*f6dc9357SAndroid Build Coastguard Worker   GetPathParts(pathVector);
203*f6dc9357SAndroid Build Coastguard Worker 
204*f6dc9357SAndroid Build Coastguard Worker   UStringVector fileNames;
205*f6dc9357SAndroid Build Coastguard Worker   fileNames.ClearAndReserve(numItems);
206*f6dc9357SAndroid Build Coastguard Worker   for (i = 0; i < (unsigned)numItems; i++)
207*f6dc9357SAndroid Build Coastguard Worker     fileNames.AddInReserved(MultiByteToUnicodeString(panelItems[i].FindData.cFileName, CP_OEMCP));
208*f6dc9357SAndroid Build Coastguard Worker   CObjArray<const wchar_t *> fileNamePointers(numItems);
209*f6dc9357SAndroid Build Coastguard Worker   for (i = 0; i < (unsigned)numItems; i++)
210*f6dc9357SAndroid Build Coastguard Worker     fileNamePointers[i] = fileNames[i];
211*f6dc9357SAndroid Build Coastguard Worker 
212*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr<IOutFolderArchive> outArchive;
213*f6dc9357SAndroid Build Coastguard Worker   HRESULT result = m_ArchiveHandler.QueryInterface(IID_IOutFolderArchive, &outArchive);
214*f6dc9357SAndroid Build Coastguard Worker   if (result != S_OK)
215*f6dc9357SAndroid Build Coastguard Worker   {
216*f6dc9357SAndroid Build Coastguard Worker     g_StartupInfo.ShowMessage(NMessageID::kUpdateNotSupportedForThisArchive);
217*f6dc9357SAndroid Build Coastguard Worker     return NFileOperationReturnCode::kError;
218*f6dc9357SAndroid Build Coastguard Worker   }
219*f6dc9357SAndroid Build Coastguard Worker 
220*f6dc9357SAndroid Build Coastguard Worker   /*
221*f6dc9357SAndroid Build Coastguard Worker   BYTE actionSetByte[NUpdateArchive::NPairState::kNumValues];
222*f6dc9357SAndroid Build Coastguard Worker   for (i = 0; i < NUpdateArchive::NPairState::kNumValues; i++)
223*f6dc9357SAndroid Build Coastguard Worker     actionSetByte[i] = (BYTE)actionSet->StateActions[i];
224*f6dc9357SAndroid Build Coastguard Worker   */
225*f6dc9357SAndroid Build Coastguard Worker 
226*f6dc9357SAndroid Build Coastguard Worker   CUpdateCallback100Imp *updateCallbackSpec = new CUpdateCallback100Imp;
227*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr<IFolderArchiveUpdateCallback> updateCallback(updateCallbackSpec );
228*f6dc9357SAndroid Build Coastguard Worker 
229*f6dc9357SAndroid Build Coastguard Worker   updateCallbackSpec->Init(/* m_ArchiveHandler, */ progressBoxPointer);
230*f6dc9357SAndroid Build Coastguard Worker   updateCallbackSpec->PasswordIsDefined = PasswordIsDefined;
231*f6dc9357SAndroid Build Coastguard Worker   updateCallbackSpec->Password = Password;
232*f6dc9357SAndroid Build Coastguard Worker 
233*f6dc9357SAndroid Build Coastguard Worker   if (!_agent->_isHashHandler)
234*f6dc9357SAndroid Build Coastguard Worker   {
235*f6dc9357SAndroid Build Coastguard Worker     if (SetOutProperties(outArchive, compressionInfo.Level) != S_OK)
236*f6dc9357SAndroid Build Coastguard Worker       return NFileOperationReturnCode::kError;
237*f6dc9357SAndroid Build Coastguard Worker   }
238*f6dc9357SAndroid Build Coastguard Worker 
239*f6dc9357SAndroid Build Coastguard Worker   /*
240*f6dc9357SAndroid Build Coastguard Worker   outArchive->SetFolder(_folder);
241*f6dc9357SAndroid Build Coastguard Worker   outArchive->SetFiles(L"", fileNamePointers, numItems);
242*f6dc9357SAndroid Build Coastguard Worker   // FStringVector requestedPaths;
243*f6dc9357SAndroid Build Coastguard Worker   // FStringVector processedPaths;
244*f6dc9357SAndroid Build Coastguard Worker   result = outArchive->DoOperation2(
245*f6dc9357SAndroid Build Coastguard Worker       // &requestedPaths, &processedPaths,
246*f6dc9357SAndroid Build Coastguard Worker       NULL, NULL,
247*f6dc9357SAndroid Build Coastguard Worker       tempFile.OutStream, actionSetByte, NULL, updateCallback);
248*f6dc9357SAndroid Build Coastguard Worker   updateCallback.Release();
249*f6dc9357SAndroid Build Coastguard Worker   outArchive.Release();
250*f6dc9357SAndroid Build Coastguard Worker 
251*f6dc9357SAndroid Build Coastguard Worker   if (result == S_OK)
252*f6dc9357SAndroid Build Coastguard Worker   {
253*f6dc9357SAndroid Build Coastguard Worker     result = AfterUpdate(tempFile, pathVector);
254*f6dc9357SAndroid Build Coastguard Worker   }
255*f6dc9357SAndroid Build Coastguard Worker   */
256*f6dc9357SAndroid Build Coastguard Worker 
257*f6dc9357SAndroid Build Coastguard Worker   {
258*f6dc9357SAndroid Build Coastguard Worker     result = _agent->SetFiles(L"", fileNamePointers, numItems);
259*f6dc9357SAndroid Build Coastguard Worker     if (result == S_OK)
260*f6dc9357SAndroid Build Coastguard Worker     {
261*f6dc9357SAndroid Build Coastguard Worker       CAgentFolder *agentFolder = NULL;
262*f6dc9357SAndroid Build Coastguard Worker       {
263*f6dc9357SAndroid Build Coastguard Worker         CMyComPtr<IArchiveFolderInternal> afi;
264*f6dc9357SAndroid Build Coastguard Worker         _folder.QueryInterface(IID_IArchiveFolderInternal, &afi);
265*f6dc9357SAndroid Build Coastguard Worker         if (afi)
266*f6dc9357SAndroid Build Coastguard Worker           afi->GetAgentFolder(&agentFolder);
267*f6dc9357SAndroid Build Coastguard Worker       }
268*f6dc9357SAndroid Build Coastguard Worker       if (agentFolder)
269*f6dc9357SAndroid Build Coastguard Worker         result = agentFolder->CommonUpdateOperation(AGENT_OP_Uni,
270*f6dc9357SAndroid Build Coastguard Worker             (moveMode != 0), NULL, actionSet, NULL, 0, updateCallback);
271*f6dc9357SAndroid Build Coastguard Worker       else
272*f6dc9357SAndroid Build Coastguard Worker         result = E_FAIL;
273*f6dc9357SAndroid Build Coastguard Worker     }
274*f6dc9357SAndroid Build Coastguard Worker   }
275*f6dc9357SAndroid Build Coastguard Worker 
276*f6dc9357SAndroid Build Coastguard Worker   if (result != S_OK)
277*f6dc9357SAndroid Build Coastguard Worker   {
278*f6dc9357SAndroid Build Coastguard Worker     ShowSysErrorMessage(result);
279*f6dc9357SAndroid Build Coastguard Worker     return NFileOperationReturnCode::kError;
280*f6dc9357SAndroid Build Coastguard Worker   }
281*f6dc9357SAndroid Build Coastguard Worker 
282*f6dc9357SAndroid Build Coastguard Worker   return NFileOperationReturnCode::kSuccess;
283*f6dc9357SAndroid Build Coastguard Worker }
284*f6dc9357SAndroid Build Coastguard Worker 
285*f6dc9357SAndroid Build Coastguard Worker namespace NPathType
286*f6dc9357SAndroid Build Coastguard Worker {
287*f6dc9357SAndroid Build Coastguard Worker   enum EEnum
288*f6dc9357SAndroid Build Coastguard Worker   {
289*f6dc9357SAndroid Build Coastguard Worker     kLocal,
290*f6dc9357SAndroid Build Coastguard Worker     kUNC
291*f6dc9357SAndroid Build Coastguard Worker   };
292*f6dc9357SAndroid Build Coastguard Worker   EEnum GetPathType(const UString &path);
293*f6dc9357SAndroid Build Coastguard Worker }
294*f6dc9357SAndroid Build Coastguard Worker 
295*f6dc9357SAndroid Build Coastguard Worker struct CParsedPath
296*f6dc9357SAndroid Build Coastguard Worker {
297*f6dc9357SAndroid Build Coastguard Worker   UString Prefix; // Disk or UNC with slash
298*f6dc9357SAndroid Build Coastguard Worker   UStringVector PathParts;
299*f6dc9357SAndroid Build Coastguard Worker   void ParsePath(const UString &path);
300*f6dc9357SAndroid Build Coastguard Worker   UString MergePath() const;
301*f6dc9357SAndroid Build Coastguard Worker };
302*f6dc9357SAndroid Build Coastguard Worker 
303*f6dc9357SAndroid Build Coastguard Worker static const char kDirDelimiter = CHAR_PATH_SEPARATOR;
304*f6dc9357SAndroid Build Coastguard Worker static const wchar_t kDiskDelimiter = L':';
305*f6dc9357SAndroid Build Coastguard Worker 
306*f6dc9357SAndroid Build Coastguard Worker namespace NPathType
307*f6dc9357SAndroid Build Coastguard Worker {
GetPathType(const UString & path)308*f6dc9357SAndroid Build Coastguard Worker   EEnum GetPathType(const UString &path)
309*f6dc9357SAndroid Build Coastguard Worker   {
310*f6dc9357SAndroid Build Coastguard Worker     if (path.Len() <= 2)
311*f6dc9357SAndroid Build Coastguard Worker       return kLocal;
312*f6dc9357SAndroid Build Coastguard Worker     if (path[0] == kDirDelimiter && path[1] == kDirDelimiter)
313*f6dc9357SAndroid Build Coastguard Worker       return kUNC;
314*f6dc9357SAndroid Build Coastguard Worker     return kLocal;
315*f6dc9357SAndroid Build Coastguard Worker   }
316*f6dc9357SAndroid Build Coastguard Worker }
317*f6dc9357SAndroid Build Coastguard Worker 
ParsePath(const UString & path)318*f6dc9357SAndroid Build Coastguard Worker void CParsedPath::ParsePath(const UString &path)
319*f6dc9357SAndroid Build Coastguard Worker {
320*f6dc9357SAndroid Build Coastguard Worker   int curPos = 0;
321*f6dc9357SAndroid Build Coastguard Worker   switch (NPathType::GetPathType(path))
322*f6dc9357SAndroid Build Coastguard Worker   {
323*f6dc9357SAndroid Build Coastguard Worker     case NPathType::kLocal:
324*f6dc9357SAndroid Build Coastguard Worker     {
325*f6dc9357SAndroid Build Coastguard Worker       const int posDiskDelimiter = path.Find(kDiskDelimiter);
326*f6dc9357SAndroid Build Coastguard Worker       if (posDiskDelimiter >= 0)
327*f6dc9357SAndroid Build Coastguard Worker       {
328*f6dc9357SAndroid Build Coastguard Worker         curPos = posDiskDelimiter + 1;
329*f6dc9357SAndroid Build Coastguard Worker         if ((int)path.Len() > curPos)
330*f6dc9357SAndroid Build Coastguard Worker           if (path[curPos] == kDirDelimiter)
331*f6dc9357SAndroid Build Coastguard Worker             curPos++;
332*f6dc9357SAndroid Build Coastguard Worker       }
333*f6dc9357SAndroid Build Coastguard Worker       break;
334*f6dc9357SAndroid Build Coastguard Worker     }
335*f6dc9357SAndroid Build Coastguard Worker     case NPathType::kUNC:
336*f6dc9357SAndroid Build Coastguard Worker     {
337*f6dc9357SAndroid Build Coastguard Worker       // the bug was fixed:
338*f6dc9357SAndroid Build Coastguard Worker       curPos = path.Find((wchar_t)kDirDelimiter, 2);
339*f6dc9357SAndroid Build Coastguard Worker       if (curPos < 0)
340*f6dc9357SAndroid Build Coastguard Worker         curPos = (int)path.Len();
341*f6dc9357SAndroid Build Coastguard Worker       else
342*f6dc9357SAndroid Build Coastguard Worker         curPos++;
343*f6dc9357SAndroid Build Coastguard Worker     }
344*f6dc9357SAndroid Build Coastguard Worker   }
345*f6dc9357SAndroid Build Coastguard Worker   Prefix = path.Left(curPos);
346*f6dc9357SAndroid Build Coastguard Worker   SplitPathToParts(path.Ptr(curPos), PathParts);
347*f6dc9357SAndroid Build Coastguard Worker }
348*f6dc9357SAndroid Build Coastguard Worker 
MergePath() const349*f6dc9357SAndroid Build Coastguard Worker UString CParsedPath::MergePath() const
350*f6dc9357SAndroid Build Coastguard Worker {
351*f6dc9357SAndroid Build Coastguard Worker   UString result = Prefix;
352*f6dc9357SAndroid Build Coastguard Worker   FOR_VECTOR (i, PathParts)
353*f6dc9357SAndroid Build Coastguard Worker   {
354*f6dc9357SAndroid Build Coastguard Worker     if (i != 0)
355*f6dc9357SAndroid Build Coastguard Worker       // result += kDirDelimiter;
356*f6dc9357SAndroid Build Coastguard Worker       result.Add_PathSepar();
357*f6dc9357SAndroid Build Coastguard Worker     result += PathParts[i];
358*f6dc9357SAndroid Build Coastguard Worker   }
359*f6dc9357SAndroid Build Coastguard Worker   return result;
360*f6dc9357SAndroid Build Coastguard Worker }
361*f6dc9357SAndroid Build Coastguard Worker 
362*f6dc9357SAndroid Build Coastguard Worker 
SetArcName(UString & arcName,const CArcInfoEx & arcInfo)363*f6dc9357SAndroid Build Coastguard Worker static void SetArcName(UString &arcName, const CArcInfoEx &arcInfo)
364*f6dc9357SAndroid Build Coastguard Worker {
365*f6dc9357SAndroid Build Coastguard Worker   if (!arcInfo.Flags_KeepName())
366*f6dc9357SAndroid Build Coastguard Worker   {
367*f6dc9357SAndroid Build Coastguard Worker     int dotPos = arcName.ReverseFind_Dot();
368*f6dc9357SAndroid Build Coastguard Worker     int slashPos = arcName.ReverseFind_PathSepar();
369*f6dc9357SAndroid Build Coastguard Worker     if (dotPos > slashPos + 1)
370*f6dc9357SAndroid Build Coastguard Worker       arcName.DeleteFrom(dotPos);
371*f6dc9357SAndroid Build Coastguard Worker   }
372*f6dc9357SAndroid Build Coastguard Worker   arcName.Add_Dot();
373*f6dc9357SAndroid Build Coastguard Worker   arcName += arcInfo.GetMainExt();
374*f6dc9357SAndroid Build Coastguard Worker }
375*f6dc9357SAndroid Build Coastguard Worker 
CompressFiles(const CObjectVector<PluginPanelItem> & pluginPanelItems)376*f6dc9357SAndroid Build Coastguard Worker HRESULT CompressFiles(const CObjectVector<PluginPanelItem> &pluginPanelItems)
377*f6dc9357SAndroid Build Coastguard Worker {
378*f6dc9357SAndroid Build Coastguard Worker   if (pluginPanelItems.Size() == 0)
379*f6dc9357SAndroid Build Coastguard Worker     return E_FAIL;
380*f6dc9357SAndroid Build Coastguard Worker 
381*f6dc9357SAndroid Build Coastguard Worker   UStringVector fileNames;
382*f6dc9357SAndroid Build Coastguard Worker   {
383*f6dc9357SAndroid Build Coastguard Worker     FOR_VECTOR (i, pluginPanelItems)
384*f6dc9357SAndroid Build Coastguard Worker     {
385*f6dc9357SAndroid Build Coastguard Worker       const PluginPanelItem &panelItem = pluginPanelItems[i];
386*f6dc9357SAndroid Build Coastguard Worker       if (strcmp(panelItem.FindData.cFileName, "..") == 0 &&
387*f6dc9357SAndroid Build Coastguard Worker           NFind::NAttributes::IsDir(panelItem.FindData.dwFileAttributes))
388*f6dc9357SAndroid Build Coastguard Worker         return E_FAIL;
389*f6dc9357SAndroid Build Coastguard Worker       if (strcmp(panelItem.FindData.cFileName, ".") == 0 &&
390*f6dc9357SAndroid Build Coastguard Worker           NFind::NAttributes::IsDir(panelItem.FindData.dwFileAttributes))
391*f6dc9357SAndroid Build Coastguard Worker         return E_FAIL;
392*f6dc9357SAndroid Build Coastguard Worker       FString fullPath;
393*f6dc9357SAndroid Build Coastguard Worker       FString fileNameUnicode = us2fs(MultiByteToUnicodeString(panelItem.FindData.cFileName, CP_OEMCP));
394*f6dc9357SAndroid Build Coastguard Worker       if (!MyGetFullPathName(fileNameUnicode, fullPath))
395*f6dc9357SAndroid Build Coastguard Worker         return E_FAIL;
396*f6dc9357SAndroid Build Coastguard Worker       fileNames.Add(fs2us(fullPath));
397*f6dc9357SAndroid Build Coastguard Worker     }
398*f6dc9357SAndroid Build Coastguard Worker   }
399*f6dc9357SAndroid Build Coastguard Worker 
400*f6dc9357SAndroid Build Coastguard Worker   NCompression::CInfo compressionInfo;
401*f6dc9357SAndroid Build Coastguard Worker   compressionInfo.Load();
402*f6dc9357SAndroid Build Coastguard Worker 
403*f6dc9357SAndroid Build Coastguard Worker   int archiverIndex = -1;
404*f6dc9357SAndroid Build Coastguard Worker 
405*f6dc9357SAndroid Build Coastguard Worker   /*
406*f6dc9357SAndroid Build Coastguard Worker   CCodecs *codecs = new CCodecs;
407*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr<ICompressCodecsInfo> compressCodecsInfo = codecs;
408*f6dc9357SAndroid Build Coastguard Worker   if (codecs->Load() != S_OK)
409*f6dc9357SAndroid Build Coastguard Worker     throw "Can't load 7-Zip codecs";
410*f6dc9357SAndroid Build Coastguard Worker   */
411*f6dc9357SAndroid Build Coastguard Worker 
412*f6dc9357SAndroid Build Coastguard Worker   if (LoadGlobalCodecs() != S_OK)
413*f6dc9357SAndroid Build Coastguard Worker     throw "Can't load 7-Zip codecs";
414*f6dc9357SAndroid Build Coastguard Worker 
415*f6dc9357SAndroid Build Coastguard Worker   CCodecs *codecs = g_CodecsObj;
416*f6dc9357SAndroid Build Coastguard Worker 
417*f6dc9357SAndroid Build Coastguard Worker   {
418*f6dc9357SAndroid Build Coastguard Worker     FOR_VECTOR (i, codecs->Formats)
419*f6dc9357SAndroid Build Coastguard Worker     {
420*f6dc9357SAndroid Build Coastguard Worker       const CArcInfoEx &arcInfo = codecs->Formats[i];
421*f6dc9357SAndroid Build Coastguard Worker       if (arcInfo.UpdateEnabled)
422*f6dc9357SAndroid Build Coastguard Worker       {
423*f6dc9357SAndroid Build Coastguard Worker         if (archiverIndex == -1)
424*f6dc9357SAndroid Build Coastguard Worker           archiverIndex = (int)i;
425*f6dc9357SAndroid Build Coastguard Worker         if (MyStringCompareNoCase(arcInfo.Name, compressionInfo.ArcType) == 0)
426*f6dc9357SAndroid Build Coastguard Worker           archiverIndex = (int)i;
427*f6dc9357SAndroid Build Coastguard Worker       }
428*f6dc9357SAndroid Build Coastguard Worker     }
429*f6dc9357SAndroid Build Coastguard Worker   }
430*f6dc9357SAndroid Build Coastguard Worker 
431*f6dc9357SAndroid Build Coastguard Worker   if (archiverIndex < 0)
432*f6dc9357SAndroid Build Coastguard Worker     throw "there is no output handler";
433*f6dc9357SAndroid Build Coastguard Worker 
434*f6dc9357SAndroid Build Coastguard Worker   UString resultPath;
435*f6dc9357SAndroid Build Coastguard Worker   {
436*f6dc9357SAndroid Build Coastguard Worker     CParsedPath parsedPath;
437*f6dc9357SAndroid Build Coastguard Worker     parsedPath.ParsePath(fileNames.Front());
438*f6dc9357SAndroid Build Coastguard Worker     if (parsedPath.PathParts.Size() == 0)
439*f6dc9357SAndroid Build Coastguard Worker       return E_FAIL;
440*f6dc9357SAndroid Build Coastguard Worker     if (fileNames.Size() == 1 || parsedPath.PathParts.Size() == 1)
441*f6dc9357SAndroid Build Coastguard Worker     {
442*f6dc9357SAndroid Build Coastguard Worker       // CSysString pureName, dot, extension;
443*f6dc9357SAndroid Build Coastguard Worker       resultPath = parsedPath.PathParts.Back();
444*f6dc9357SAndroid Build Coastguard Worker     }
445*f6dc9357SAndroid Build Coastguard Worker     else
446*f6dc9357SAndroid Build Coastguard Worker     {
447*f6dc9357SAndroid Build Coastguard Worker       parsedPath.PathParts.DeleteBack();
448*f6dc9357SAndroid Build Coastguard Worker       resultPath = parsedPath.PathParts.Back();
449*f6dc9357SAndroid Build Coastguard Worker     }
450*f6dc9357SAndroid Build Coastguard Worker   }
451*f6dc9357SAndroid Build Coastguard Worker   UString archiveNameSrc = resultPath;
452*f6dc9357SAndroid Build Coastguard Worker   UString arcName = archiveNameSrc;
453*f6dc9357SAndroid Build Coastguard Worker 
454*f6dc9357SAndroid Build Coastguard Worker   int prevFormat = archiverIndex;
455*f6dc9357SAndroid Build Coastguard Worker   SetArcName(arcName, codecs->Formats[archiverIndex]);
456*f6dc9357SAndroid Build Coastguard Worker 
457*f6dc9357SAndroid Build Coastguard Worker   const CActionSet *actionSet = &k_ActionSet_Add;
458*f6dc9357SAndroid Build Coastguard Worker 
459*f6dc9357SAndroid Build Coastguard Worker   for (;;)
460*f6dc9357SAndroid Build Coastguard Worker   {
461*f6dc9357SAndroid Build Coastguard Worker     AString archiveNameA (UnicodeStringToMultiByte(arcName, CP_OEMCP));
462*f6dc9357SAndroid Build Coastguard Worker     const int kYSize = 16;
463*f6dc9357SAndroid Build Coastguard Worker     const int kXMid = 38;
464*f6dc9357SAndroid Build Coastguard Worker 
465*f6dc9357SAndroid Build Coastguard Worker     const int kArchiveNameIndex = 2;
466*f6dc9357SAndroid Build Coastguard Worker     const int kMethodRadioIndex = kArchiveNameIndex + 2;
467*f6dc9357SAndroid Build Coastguard Worker     const int kModeRadioIndex = kMethodRadioIndex + 7;
468*f6dc9357SAndroid Build Coastguard Worker 
469*f6dc9357SAndroid Build Coastguard Worker     // char updateAddToArchiveString[512];
470*f6dc9357SAndroid Build Coastguard Worker     AString str1;
471*f6dc9357SAndroid Build Coastguard Worker     {
472*f6dc9357SAndroid Build Coastguard Worker       const CArcInfoEx &arcInfo = codecs->Formats[archiverIndex];
473*f6dc9357SAndroid Build Coastguard Worker       const AString s (UnicodeStringToMultiByte(arcInfo.Name, CP_OEMCP));
474*f6dc9357SAndroid Build Coastguard Worker       str1 = g_StartupInfo.GetMsgString(NMessageID::kUpdateAddToArchive);
475*f6dc9357SAndroid Build Coastguard Worker       str1.Replace(AString ("%s"), s);
476*f6dc9357SAndroid Build Coastguard Worker       /*
477*f6dc9357SAndroid Build Coastguard Worker       sprintf(updateAddToArchiveString,
478*f6dc9357SAndroid Build Coastguard Worker         g_StartupInfo.GetMsgString(NMessageID::kUpdateAddToArchive), (const char *)s);
479*f6dc9357SAndroid Build Coastguard Worker       */
480*f6dc9357SAndroid Build Coastguard Worker     }
481*f6dc9357SAndroid Build Coastguard Worker 
482*f6dc9357SAndroid Build Coastguard Worker     unsigned methodIndex = 0;
483*f6dc9357SAndroid Build Coastguard Worker     unsigned i;
484*f6dc9357SAndroid Build Coastguard Worker     for (i = Z7_ARRAY_SIZE(g_MethodMap); i != 0;)
485*f6dc9357SAndroid Build Coastguard Worker     {
486*f6dc9357SAndroid Build Coastguard Worker       i--;
487*f6dc9357SAndroid Build Coastguard Worker       if (compressionInfo.Level >= g_MethodMap[i])
488*f6dc9357SAndroid Build Coastguard Worker       {
489*f6dc9357SAndroid Build Coastguard Worker         methodIndex = i;
490*f6dc9357SAndroid Build Coastguard Worker         break;
491*f6dc9357SAndroid Build Coastguard Worker       }
492*f6dc9357SAndroid Build Coastguard Worker     }
493*f6dc9357SAndroid Build Coastguard Worker 
494*f6dc9357SAndroid Build Coastguard Worker     const struct CInitDialogItem initItems[]=
495*f6dc9357SAndroid Build Coastguard Worker     {
496*f6dc9357SAndroid Build Coastguard Worker       { DI_DOUBLEBOX, 3, 1, 72, kYSize - 2, false, false, 0, false, NMessageID::kUpdateTitle, NULL, NULL },
497*f6dc9357SAndroid Build Coastguard Worker 
498*f6dc9357SAndroid Build Coastguard Worker       { DI_TEXT, 5, 2, 0, 0, false, false, 0, false, -1, str1, NULL },
499*f6dc9357SAndroid Build Coastguard Worker 
500*f6dc9357SAndroid Build Coastguard Worker       { DI_EDIT, 5, 3, 70, 3, true, false, DIF_HISTORY, false, -1, archiveNameA, kArchiveHistoryKeyName},
501*f6dc9357SAndroid Build Coastguard Worker       // { DI_EDIT, 5, 3, 70, 3, true, false, 0, false, -1, arcName, NULL},
502*f6dc9357SAndroid Build Coastguard Worker 
503*f6dc9357SAndroid Build Coastguard Worker       { DI_SINGLEBOX, 4, 4, kXMid - 2, 4 + 7, false, false, 0, false, NMessageID::kUpdateMethod, NULL, NULL },
504*f6dc9357SAndroid Build Coastguard Worker 
505*f6dc9357SAndroid Build Coastguard Worker       { DI_RADIOBUTTON, 6, 5, 0, 0, false, methodIndex == 0, DIF_GROUP, false, NMessageID::kUpdateMethod_Store, NULL, NULL },
506*f6dc9357SAndroid Build Coastguard Worker       { DI_RADIOBUTTON, 6, 6, 0, 0, false, methodIndex == 1, 0, false, NMessageID::kUpdateMethod_Fastest, NULL, NULL },
507*f6dc9357SAndroid Build Coastguard Worker       { DI_RADIOBUTTON, 6, 7, 0, 0, false, methodIndex == 2, 0, false, NMessageID::kUpdateMethod_Fast, NULL, NULL },
508*f6dc9357SAndroid Build Coastguard Worker       { DI_RADIOBUTTON, 6, 8, 0, 0, false, methodIndex == 3, 0, false, NMessageID::kUpdateMethod_Normal, NULL, NULL },
509*f6dc9357SAndroid Build Coastguard Worker       { DI_RADIOBUTTON, 6, 9, 0, 0, false, methodIndex == 4, 0, false, NMessageID::kUpdateMethod_Maximum, NULL, NULL },
510*f6dc9357SAndroid Build Coastguard Worker       { DI_RADIOBUTTON, 6,10, 0, 0, false, methodIndex == 5, 0, false, NMessageID::kUpdateMethod_Ultra, NULL, NULL },
511*f6dc9357SAndroid Build Coastguard Worker 
512*f6dc9357SAndroid Build Coastguard Worker       { DI_SINGLEBOX, kXMid, 4, 70, 4 + 5, false, false, 0, false, NMessageID::kUpdateMode, NULL, NULL },
513*f6dc9357SAndroid Build Coastguard Worker 
514*f6dc9357SAndroid Build Coastguard Worker       { DI_RADIOBUTTON, kXMid + 2, 5, 0, 0, false, actionSet == &k_ActionSet_Add, DIF_GROUP, false, NMessageID::kUpdateMode_Add, NULL, NULL },
515*f6dc9357SAndroid Build Coastguard Worker       { DI_RADIOBUTTON, kXMid + 2, 6, 0, 0, false, actionSet == &k_ActionSet_Update,      0, false, NMessageID::kUpdateMode_Update, NULL, NULL },
516*f6dc9357SAndroid Build Coastguard Worker       { DI_RADIOBUTTON, kXMid + 2, 7, 0, 0, false, actionSet == &k_ActionSet_Fresh,       0, false, NMessageID::kUpdateMode_Fresh, NULL, NULL },
517*f6dc9357SAndroid Build Coastguard Worker       { DI_RADIOBUTTON, kXMid + 2, 8, 0, 0, false, actionSet == &k_ActionSet_Sync,        0, false, NMessageID::kUpdateMode_Sync, NULL, NULL },
518*f6dc9357SAndroid Build Coastguard Worker 
519*f6dc9357SAndroid Build Coastguard Worker       { DI_TEXT, 3, kYSize - 4, 0, 0, false, false, DIF_BOXCOLOR|DIF_SEPARATOR, false, -1, "", NULL  },
520*f6dc9357SAndroid Build Coastguard Worker 
521*f6dc9357SAndroid Build Coastguard Worker       { DI_BUTTON, 0, kYSize - 3, 0, 0, false, false, DIF_CENTERGROUP, true, NMessageID::kUpdateAdd, NULL, NULL  },
522*f6dc9357SAndroid Build Coastguard Worker       { DI_BUTTON, 0, kYSize - 3, 0, 0, false, false, DIF_CENTERGROUP, false, NMessageID::kUpdateSelectArchiver, NULL, NULL  },
523*f6dc9357SAndroid Build Coastguard Worker       { DI_BUTTON, 0, kYSize - 3, 0, 0, false, false, DIF_CENTERGROUP, false, NMessageID::kCancel, NULL, NULL  }
524*f6dc9357SAndroid Build Coastguard Worker     };
525*f6dc9357SAndroid Build Coastguard Worker 
526*f6dc9357SAndroid Build Coastguard Worker     const int kNumDialogItems = Z7_ARRAY_SIZE(initItems);
527*f6dc9357SAndroid Build Coastguard Worker 
528*f6dc9357SAndroid Build Coastguard Worker     const int kOkButtonIndex = kNumDialogItems - 3;
529*f6dc9357SAndroid Build Coastguard Worker     const int kSelectarchiverButtonIndex = kNumDialogItems - 2;
530*f6dc9357SAndroid Build Coastguard Worker 
531*f6dc9357SAndroid Build Coastguard Worker     FarDialogItem dialogItems[kNumDialogItems];
532*f6dc9357SAndroid Build Coastguard Worker     g_StartupInfo.InitDialogItems(initItems, dialogItems, kNumDialogItems);
533*f6dc9357SAndroid Build Coastguard Worker     int askCode = g_StartupInfo.ShowDialog(76, kYSize,
534*f6dc9357SAndroid Build Coastguard Worker         kHelpTopic, dialogItems, kNumDialogItems);
535*f6dc9357SAndroid Build Coastguard Worker 
536*f6dc9357SAndroid Build Coastguard Worker     archiveNameA = dialogItems[kArchiveNameIndex].Data;
537*f6dc9357SAndroid Build Coastguard Worker     archiveNameA.Trim();
538*f6dc9357SAndroid Build Coastguard Worker     MultiByteToUnicodeString2(arcName, archiveNameA, CP_OEMCP);
539*f6dc9357SAndroid Build Coastguard Worker 
540*f6dc9357SAndroid Build Coastguard Worker     compressionInfo.Level = g_MethodMap[0];
541*f6dc9357SAndroid Build Coastguard Worker     for (i = 0; i < Z7_ARRAY_SIZE(g_MethodMap); i++)
542*f6dc9357SAndroid Build Coastguard Worker       if (dialogItems[kMethodRadioIndex + i].Selected)
543*f6dc9357SAndroid Build Coastguard Worker         compressionInfo.Level = g_MethodMap[i];
544*f6dc9357SAndroid Build Coastguard Worker 
545*f6dc9357SAndroid Build Coastguard Worker          if (dialogItems[kModeRadioIndex    ].Selected) actionSet = &k_ActionSet_Add;
546*f6dc9357SAndroid Build Coastguard Worker     else if (dialogItems[kModeRadioIndex + 1].Selected) actionSet = &k_ActionSet_Update;
547*f6dc9357SAndroid Build Coastguard Worker     else if (dialogItems[kModeRadioIndex + 2].Selected) actionSet = &k_ActionSet_Fresh;
548*f6dc9357SAndroid Build Coastguard Worker     else if (dialogItems[kModeRadioIndex + 3].Selected) actionSet = &k_ActionSet_Sync;
549*f6dc9357SAndroid Build Coastguard Worker     else throw 51751;
550*f6dc9357SAndroid Build Coastguard Worker 
551*f6dc9357SAndroid Build Coastguard Worker     if (askCode == kSelectarchiverButtonIndex)
552*f6dc9357SAndroid Build Coastguard Worker     {
553*f6dc9357SAndroid Build Coastguard Worker       CUIntVector indices;
554*f6dc9357SAndroid Build Coastguard Worker       AStringVector archiverNames;
555*f6dc9357SAndroid Build Coastguard Worker       FOR_VECTOR (k, codecs->Formats)
556*f6dc9357SAndroid Build Coastguard Worker       {
557*f6dc9357SAndroid Build Coastguard Worker         const CArcInfoEx &arc = codecs->Formats[k];
558*f6dc9357SAndroid Build Coastguard Worker         if (arc.UpdateEnabled)
559*f6dc9357SAndroid Build Coastguard Worker         {
560*f6dc9357SAndroid Build Coastguard Worker           indices.Add(k);
561*f6dc9357SAndroid Build Coastguard Worker           archiverNames.Add(GetOemString(arc.Name));
562*f6dc9357SAndroid Build Coastguard Worker         }
563*f6dc9357SAndroid Build Coastguard Worker       }
564*f6dc9357SAndroid Build Coastguard Worker 
565*f6dc9357SAndroid Build Coastguard Worker       const int index = g_StartupInfo.Menu(FMENU_AUTOHIGHLIGHT,
566*f6dc9357SAndroid Build Coastguard Worker           g_StartupInfo.GetMsgString(NMessageID::kUpdateSelectArchiverMenuTitle),
567*f6dc9357SAndroid Build Coastguard Worker           NULL, archiverNames, archiverIndex);
568*f6dc9357SAndroid Build Coastguard Worker       if (index >= 0)
569*f6dc9357SAndroid Build Coastguard Worker       {
570*f6dc9357SAndroid Build Coastguard Worker         const CArcInfoEx &prevArchiverInfo = codecs->Formats[prevFormat];
571*f6dc9357SAndroid Build Coastguard Worker         if (prevArchiverInfo.Flags_KeepName())
572*f6dc9357SAndroid Build Coastguard Worker         {
573*f6dc9357SAndroid Build Coastguard Worker           const UString &prevExtension = prevArchiverInfo.GetMainExt();
574*f6dc9357SAndroid Build Coastguard Worker           const unsigned prevExtensionLen = prevExtension.Len();
575*f6dc9357SAndroid Build Coastguard Worker           if (arcName.Len() >= prevExtensionLen &&
576*f6dc9357SAndroid Build Coastguard Worker               MyStringCompareNoCase(arcName.RightPtr(prevExtensionLen), prevExtension) == 0)
577*f6dc9357SAndroid Build Coastguard Worker           {
578*f6dc9357SAndroid Build Coastguard Worker             const unsigned pos = arcName.Len() - prevExtensionLen;
579*f6dc9357SAndroid Build Coastguard Worker             if (pos > 2)
580*f6dc9357SAndroid Build Coastguard Worker             {
581*f6dc9357SAndroid Build Coastguard Worker               if (arcName[pos - 1] == '.')
582*f6dc9357SAndroid Build Coastguard Worker                 arcName.DeleteFrom(pos - 1);
583*f6dc9357SAndroid Build Coastguard Worker             }
584*f6dc9357SAndroid Build Coastguard Worker           }
585*f6dc9357SAndroid Build Coastguard Worker         }
586*f6dc9357SAndroid Build Coastguard Worker 
587*f6dc9357SAndroid Build Coastguard Worker         archiverIndex = (int)indices[index];
588*f6dc9357SAndroid Build Coastguard Worker         const CArcInfoEx &arcInfo = codecs->Formats[archiverIndex];
589*f6dc9357SAndroid Build Coastguard Worker         prevFormat = archiverIndex;
590*f6dc9357SAndroid Build Coastguard Worker 
591*f6dc9357SAndroid Build Coastguard Worker         if (arcInfo.Flags_KeepName())
592*f6dc9357SAndroid Build Coastguard Worker           arcName = archiveNameSrc;
593*f6dc9357SAndroid Build Coastguard Worker         SetArcName(arcName, arcInfo);
594*f6dc9357SAndroid Build Coastguard Worker       }
595*f6dc9357SAndroid Build Coastguard Worker       continue;
596*f6dc9357SAndroid Build Coastguard Worker     }
597*f6dc9357SAndroid Build Coastguard Worker 
598*f6dc9357SAndroid Build Coastguard Worker     if (askCode != kOkButtonIndex)
599*f6dc9357SAndroid Build Coastguard Worker       return E_ABORT;
600*f6dc9357SAndroid Build Coastguard Worker 
601*f6dc9357SAndroid Build Coastguard Worker     break;
602*f6dc9357SAndroid Build Coastguard Worker   }
603*f6dc9357SAndroid Build Coastguard Worker 
604*f6dc9357SAndroid Build Coastguard Worker   const CArcInfoEx &archiverInfoFinal = codecs->Formats[archiverIndex];
605*f6dc9357SAndroid Build Coastguard Worker   compressionInfo.ArcType = archiverInfoFinal.Name;
606*f6dc9357SAndroid Build Coastguard Worker   compressionInfo.Save();
607*f6dc9357SAndroid Build Coastguard Worker 
608*f6dc9357SAndroid Build Coastguard Worker   NWorkDir::CInfo workDirInfo;
609*f6dc9357SAndroid Build Coastguard Worker   workDirInfo.Load();
610*f6dc9357SAndroid Build Coastguard Worker 
611*f6dc9357SAndroid Build Coastguard Worker   FString fullArcName;
612*f6dc9357SAndroid Build Coastguard Worker   if (!MyGetFullPathName(us2fs(arcName), fullArcName))
613*f6dc9357SAndroid Build Coastguard Worker     return E_FAIL;
614*f6dc9357SAndroid Build Coastguard Worker 
615*f6dc9357SAndroid Build Coastguard Worker   CWorkDirTempFile tempFile;
616*f6dc9357SAndroid Build Coastguard Worker   RINOK(tempFile.CreateTempFile(fullArcName))
617*f6dc9357SAndroid Build Coastguard Worker   CScreenRestorer screenRestorer;
618*f6dc9357SAndroid Build Coastguard Worker   CProgressBox progressBox;
619*f6dc9357SAndroid Build Coastguard Worker   CProgressBox *progressBoxPointer = NULL;
620*f6dc9357SAndroid Build Coastguard Worker 
621*f6dc9357SAndroid Build Coastguard Worker   screenRestorer.Save();
622*f6dc9357SAndroid Build Coastguard Worker 
623*f6dc9357SAndroid Build Coastguard Worker   progressBoxPointer = &progressBox;
624*f6dc9357SAndroid Build Coastguard Worker   progressBox.Init(
625*f6dc9357SAndroid Build Coastguard Worker       // g_StartupInfo.GetMsgString(NMessageID::kWaitTitle),
626*f6dc9357SAndroid Build Coastguard Worker       g_StartupInfo.GetMsgString(NMessageID::kUpdating));
627*f6dc9357SAndroid Build Coastguard Worker 
628*f6dc9357SAndroid Build Coastguard Worker 
629*f6dc9357SAndroid Build Coastguard Worker   NFind::CFileInfo fileInfo;
630*f6dc9357SAndroid Build Coastguard Worker 
631*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr<IOutFolderArchive> outArchive;
632*f6dc9357SAndroid Build Coastguard Worker 
633*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr<IInFolderArchive> archiveHandler;
634*f6dc9357SAndroid Build Coastguard Worker   if (fileInfo.Find(fullArcName))
635*f6dc9357SAndroid Build Coastguard Worker   {
636*f6dc9357SAndroid Build Coastguard Worker     if (fileInfo.IsDir())
637*f6dc9357SAndroid Build Coastguard Worker       throw "There is Directory with such name";
638*f6dc9357SAndroid Build Coastguard Worker 
639*f6dc9357SAndroid Build Coastguard Worker     CAgent *agentSpec = new CAgent;
640*f6dc9357SAndroid Build Coastguard Worker     archiveHandler = agentSpec;
641*f6dc9357SAndroid Build Coastguard Worker     // CLSID realClassID;
642*f6dc9357SAndroid Build Coastguard Worker     CMyComBSTR archiveType;
643*f6dc9357SAndroid Build Coastguard Worker     RINOK(archiveHandler->Open(NULL,
644*f6dc9357SAndroid Build Coastguard Worker         GetUnicodeString(fullArcName, CP_OEMCP), UString(),
645*f6dc9357SAndroid Build Coastguard Worker         // &realClassID,
646*f6dc9357SAndroid Build Coastguard Worker         &archiveType,
647*f6dc9357SAndroid Build Coastguard Worker         NULL))
648*f6dc9357SAndroid Build Coastguard Worker 
649*f6dc9357SAndroid Build Coastguard Worker     if (MyStringCompareNoCase(archiverInfoFinal.Name, (const wchar_t *)archiveType) != 0)
650*f6dc9357SAndroid Build Coastguard Worker       throw "Type of existing archive differs from specified type";
651*f6dc9357SAndroid Build Coastguard Worker     const HRESULT result = archiveHandler.QueryInterface(
652*f6dc9357SAndroid Build Coastguard Worker         IID_IOutFolderArchive, &outArchive);
653*f6dc9357SAndroid Build Coastguard Worker     if (result != S_OK)
654*f6dc9357SAndroid Build Coastguard Worker     {
655*f6dc9357SAndroid Build Coastguard Worker       g_StartupInfo.ShowMessage(NMessageID::kUpdateNotSupportedForThisArchive);
656*f6dc9357SAndroid Build Coastguard Worker       return E_FAIL;
657*f6dc9357SAndroid Build Coastguard Worker     }
658*f6dc9357SAndroid Build Coastguard Worker   }
659*f6dc9357SAndroid Build Coastguard Worker   else
660*f6dc9357SAndroid Build Coastguard Worker   {
661*f6dc9357SAndroid Build Coastguard Worker     // HRESULT result = outArchive.CoCreateInstance(classID);
662*f6dc9357SAndroid Build Coastguard Worker     CAgent *agentSpec = new CAgent;
663*f6dc9357SAndroid Build Coastguard Worker     outArchive = agentSpec;
664*f6dc9357SAndroid Build Coastguard Worker 
665*f6dc9357SAndroid Build Coastguard Worker     /*
666*f6dc9357SAndroid Build Coastguard Worker     HRESULT result = outArchive.CoCreateInstance(CLSID_CAgentArchiveHandler);
667*f6dc9357SAndroid Build Coastguard Worker     if (result != S_OK)
668*f6dc9357SAndroid Build Coastguard Worker     {
669*f6dc9357SAndroid Build Coastguard Worker       g_StartupInfo.ShowMessage(NMessageID::kUpdateNotSupportedForThisArchive);
670*f6dc9357SAndroid Build Coastguard Worker       return E_FAIL;
671*f6dc9357SAndroid Build Coastguard Worker     }
672*f6dc9357SAndroid Build Coastguard Worker     */
673*f6dc9357SAndroid Build Coastguard Worker   }
674*f6dc9357SAndroid Build Coastguard Worker 
675*f6dc9357SAndroid Build Coastguard Worker   CObjArray<const wchar_t *> fileNamePointers(fileNames.Size());
676*f6dc9357SAndroid Build Coastguard Worker 
677*f6dc9357SAndroid Build Coastguard Worker   unsigned i;
678*f6dc9357SAndroid Build Coastguard Worker   for (i = 0; i < fileNames.Size(); i++)
679*f6dc9357SAndroid Build Coastguard Worker     fileNamePointers[i] = fileNames[i];
680*f6dc9357SAndroid Build Coastguard Worker 
681*f6dc9357SAndroid Build Coastguard Worker   outArchive->SetFolder(NULL);
682*f6dc9357SAndroid Build Coastguard Worker   outArchive->SetFiles(L"", fileNamePointers, fileNames.Size());
683*f6dc9357SAndroid Build Coastguard Worker   BYTE actionSetByte[NUpdateArchive::NPairState::kNumValues];
684*f6dc9357SAndroid Build Coastguard Worker   for (i = 0; i < NUpdateArchive::NPairState::kNumValues; i++)
685*f6dc9357SAndroid Build Coastguard Worker     actionSetByte[i] = (BYTE)actionSet->StateActions[i];
686*f6dc9357SAndroid Build Coastguard Worker 
687*f6dc9357SAndroid Build Coastguard Worker   CUpdateCallback100Imp *updateCallbackSpec = new CUpdateCallback100Imp;
688*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr<IFolderArchiveUpdateCallback> updateCallback(updateCallbackSpec );
689*f6dc9357SAndroid Build Coastguard Worker 
690*f6dc9357SAndroid Build Coastguard Worker   updateCallbackSpec->Init(/* archiveHandler, */ progressBoxPointer);
691*f6dc9357SAndroid Build Coastguard Worker 
692*f6dc9357SAndroid Build Coastguard Worker 
693*f6dc9357SAndroid Build Coastguard Worker   RINOK(SetOutProperties(outArchive, compressionInfo.Level))
694*f6dc9357SAndroid Build Coastguard Worker 
695*f6dc9357SAndroid Build Coastguard Worker   // FStringVector requestedPaths;
696*f6dc9357SAndroid Build Coastguard Worker   // FStringVector processedPaths;
697*f6dc9357SAndroid Build Coastguard Worker   HRESULT result = outArchive->DoOperation(
698*f6dc9357SAndroid Build Coastguard Worker       // &requestedPaths, &processedPaths,
699*f6dc9357SAndroid Build Coastguard Worker       NULL, NULL,
700*f6dc9357SAndroid Build Coastguard Worker       codecs, archiverIndex,
701*f6dc9357SAndroid Build Coastguard Worker       tempFile.OutStream, actionSetByte,
702*f6dc9357SAndroid Build Coastguard Worker       NULL, updateCallback);
703*f6dc9357SAndroid Build Coastguard Worker   updateCallback.Release();
704*f6dc9357SAndroid Build Coastguard Worker   outArchive.Release();
705*f6dc9357SAndroid Build Coastguard Worker 
706*f6dc9357SAndroid Build Coastguard Worker   if (result != S_OK)
707*f6dc9357SAndroid Build Coastguard Worker   {
708*f6dc9357SAndroid Build Coastguard Worker     ShowSysErrorMessage(result);
709*f6dc9357SAndroid Build Coastguard Worker     return result;
710*f6dc9357SAndroid Build Coastguard Worker   }
711*f6dc9357SAndroid Build Coastguard Worker 
712*f6dc9357SAndroid Build Coastguard Worker   if (archiveHandler)
713*f6dc9357SAndroid Build Coastguard Worker   {
714*f6dc9357SAndroid Build Coastguard Worker     archiveHandler->Close();
715*f6dc9357SAndroid Build Coastguard Worker   }
716*f6dc9357SAndroid Build Coastguard Worker 
717*f6dc9357SAndroid Build Coastguard Worker   result = tempFile.MoveToOriginal(archiveHandler != NULL);
718*f6dc9357SAndroid Build Coastguard Worker   if (result != S_OK)
719*f6dc9357SAndroid Build Coastguard Worker   {
720*f6dc9357SAndroid Build Coastguard Worker     ShowSysErrorMessage(result);
721*f6dc9357SAndroid Build Coastguard Worker     return result;
722*f6dc9357SAndroid Build Coastguard Worker   }
723*f6dc9357SAndroid Build Coastguard Worker   return S_OK;
724*f6dc9357SAndroid Build Coastguard Worker }
725*f6dc9357SAndroid Build Coastguard Worker 
726*f6dc9357SAndroid Build Coastguard Worker 
727*f6dc9357SAndroid Build Coastguard Worker static const char * const k_CreateFolder_History = "NewFolder"; // we use default FAR folder name
728*f6dc9357SAndroid Build Coastguard Worker 
CreateFolder()729*f6dc9357SAndroid Build Coastguard Worker HRESULT CPlugin::CreateFolder()
730*f6dc9357SAndroid Build Coastguard Worker {
731*f6dc9357SAndroid Build Coastguard Worker   if (_agent->IsThere_ReadOnlyArc())
732*f6dc9357SAndroid Build Coastguard Worker   {
733*f6dc9357SAndroid Build Coastguard Worker     g_StartupInfo.ShowMessage(NMessageID::kUpdateNotSupportedForThisArchive);
734*f6dc9357SAndroid Build Coastguard Worker     return TRUE;
735*f6dc9357SAndroid Build Coastguard Worker   }
736*f6dc9357SAndroid Build Coastguard Worker 
737*f6dc9357SAndroid Build Coastguard Worker   UString destPathU;
738*f6dc9357SAndroid Build Coastguard Worker   {
739*f6dc9357SAndroid Build Coastguard Worker     const int kXSize = 60;
740*f6dc9357SAndroid Build Coastguard Worker     const int kYSize = 8;
741*f6dc9357SAndroid Build Coastguard Worker     const int kPathIndex = 2;
742*f6dc9357SAndroid Build Coastguard Worker 
743*f6dc9357SAndroid Build Coastguard Worker     AString destPath ("New Folder");
744*f6dc9357SAndroid Build Coastguard Worker 
745*f6dc9357SAndroid Build Coastguard Worker     const struct CInitDialogItem initItems[]={
746*f6dc9357SAndroid Build Coastguard Worker       { DI_DOUBLEBOX, 3, 1, kXSize - 4, kYSize - 2, false, false, 0, false,
747*f6dc9357SAndroid Build Coastguard Worker           -1, "Create Folder", NULL },
748*f6dc9357SAndroid Build Coastguard Worker 
749*f6dc9357SAndroid Build Coastguard Worker       { DI_TEXT, 5, 2, 0, 0, false, false, 0, false, -1, "Folder name:", NULL },
750*f6dc9357SAndroid Build Coastguard Worker 
751*f6dc9357SAndroid Build Coastguard Worker       { DI_EDIT, 5, 3, kXSize - 6, 3, true, false, DIF_HISTORY, false, -1, destPath, k_CreateFolder_History },
752*f6dc9357SAndroid Build Coastguard Worker 
753*f6dc9357SAndroid Build Coastguard Worker       { DI_BUTTON, 0, kYSize - 3, 0, 0, false, false, DIF_CENTERGROUP, true, NMessageID::kOk, NULL, NULL },
754*f6dc9357SAndroid Build Coastguard Worker       { DI_BUTTON, 0, kYSize - 3, 0, 0, false, false, DIF_CENTERGROUP, false, NMessageID::kCancel, NULL, NULL }
755*f6dc9357SAndroid Build Coastguard Worker     };
756*f6dc9357SAndroid Build Coastguard Worker 
757*f6dc9357SAndroid Build Coastguard Worker     const int kNumDialogItems = Z7_ARRAY_SIZE(initItems);
758*f6dc9357SAndroid Build Coastguard Worker     const int kOkButtonIndex = kNumDialogItems - 2;
759*f6dc9357SAndroid Build Coastguard Worker 
760*f6dc9357SAndroid Build Coastguard Worker     FarDialogItem dialogItems[kNumDialogItems];
761*f6dc9357SAndroid Build Coastguard Worker     g_StartupInfo.InitDialogItems(initItems, dialogItems, kNumDialogItems);
762*f6dc9357SAndroid Build Coastguard Worker     for (;;)
763*f6dc9357SAndroid Build Coastguard Worker     {
764*f6dc9357SAndroid Build Coastguard Worker       int askCode = g_StartupInfo.ShowDialog(kXSize, kYSize,
765*f6dc9357SAndroid Build Coastguard Worker           NULL, // kHelpTopic
766*f6dc9357SAndroid Build Coastguard Worker           dialogItems, kNumDialogItems);
767*f6dc9357SAndroid Build Coastguard Worker       if (askCode != kOkButtonIndex)
768*f6dc9357SAndroid Build Coastguard Worker         return E_ABORT;
769*f6dc9357SAndroid Build Coastguard Worker       destPath = dialogItems[kPathIndex].Data;
770*f6dc9357SAndroid Build Coastguard Worker       destPathU = GetUnicodeString(destPath, CP_OEMCP);
771*f6dc9357SAndroid Build Coastguard Worker       destPathU.Trim();
772*f6dc9357SAndroid Build Coastguard Worker       if (!destPathU.IsEmpty())
773*f6dc9357SAndroid Build Coastguard Worker         break;
774*f6dc9357SAndroid Build Coastguard Worker       g_StartupInfo.ShowErrorMessage("You must specify folder name");
775*f6dc9357SAndroid Build Coastguard Worker     }
776*f6dc9357SAndroid Build Coastguard Worker 
777*f6dc9357SAndroid Build Coastguard Worker   }
778*f6dc9357SAndroid Build Coastguard Worker 
779*f6dc9357SAndroid Build Coastguard Worker   CScreenRestorer screenRestorer;
780*f6dc9357SAndroid Build Coastguard Worker   CProgressBox progressBox;
781*f6dc9357SAndroid Build Coastguard Worker   CProgressBox *progressBoxPointer = NULL;
782*f6dc9357SAndroid Build Coastguard Worker   // if ((opMode & OPM_SILENT) == 0 && (opMode & OPM_FIND ) == 0)
783*f6dc9357SAndroid Build Coastguard Worker   {
784*f6dc9357SAndroid Build Coastguard Worker     screenRestorer.Save();
785*f6dc9357SAndroid Build Coastguard Worker 
786*f6dc9357SAndroid Build Coastguard Worker     progressBoxPointer = &progressBox;
787*f6dc9357SAndroid Build Coastguard Worker     progressBox.Init(
788*f6dc9357SAndroid Build Coastguard Worker         // g_StartupInfo.GetMsgString(NMessageID::kWaitTitle),
789*f6dc9357SAndroid Build Coastguard Worker         g_StartupInfo.GetMsgString(NMessageID::kDeleting));
790*f6dc9357SAndroid Build Coastguard Worker   }
791*f6dc9357SAndroid Build Coastguard Worker 
792*f6dc9357SAndroid Build Coastguard Worker   CUpdateCallback100Imp *updateCallbackSpec = new CUpdateCallback100Imp;
793*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr<IFolderArchiveUpdateCallback> updateCallback(updateCallbackSpec);
794*f6dc9357SAndroid Build Coastguard Worker 
795*f6dc9357SAndroid Build Coastguard Worker   updateCallbackSpec->Init(/* m_ArchiveHandler, */ progressBoxPointer);
796*f6dc9357SAndroid Build Coastguard Worker   updateCallbackSpec->PasswordIsDefined = PasswordIsDefined;
797*f6dc9357SAndroid Build Coastguard Worker   updateCallbackSpec->Password = Password;
798*f6dc9357SAndroid Build Coastguard Worker 
799*f6dc9357SAndroid Build Coastguard Worker   HRESULT result;
800*f6dc9357SAndroid Build Coastguard Worker   {
801*f6dc9357SAndroid Build Coastguard Worker     CMyComPtr<IFolderOperations> folderOperations;
802*f6dc9357SAndroid Build Coastguard Worker     result = _folder.QueryInterface(IID_IFolderOperations, &folderOperations);
803*f6dc9357SAndroid Build Coastguard Worker     if (folderOperations)
804*f6dc9357SAndroid Build Coastguard Worker       result = folderOperations->CreateFolder(destPathU, updateCallback);
805*f6dc9357SAndroid Build Coastguard Worker     else if (result != S_OK)
806*f6dc9357SAndroid Build Coastguard Worker       result = E_FAIL;
807*f6dc9357SAndroid Build Coastguard Worker   }
808*f6dc9357SAndroid Build Coastguard Worker 
809*f6dc9357SAndroid Build Coastguard Worker   if (result != S_OK)
810*f6dc9357SAndroid Build Coastguard Worker   {
811*f6dc9357SAndroid Build Coastguard Worker     ShowSysErrorMessage(result);
812*f6dc9357SAndroid Build Coastguard Worker     return result;
813*f6dc9357SAndroid Build Coastguard Worker   }
814*f6dc9357SAndroid Build Coastguard Worker 
815*f6dc9357SAndroid Build Coastguard Worker   g_StartupInfo.Control(this, FCTL_UPDATEPANEL, (void *)1);
816*f6dc9357SAndroid Build Coastguard Worker   g_StartupInfo.Control(this, FCTL_REDRAWPANEL, NULL);
817*f6dc9357SAndroid Build Coastguard Worker 
818*f6dc9357SAndroid Build Coastguard Worker   PanelInfo panelInfo;
819*f6dc9357SAndroid Build Coastguard Worker 
820*f6dc9357SAndroid Build Coastguard Worker   if (g_StartupInfo.ControlGetActivePanelInfo(panelInfo))
821*f6dc9357SAndroid Build Coastguard Worker   {
822*f6dc9357SAndroid Build Coastguard Worker     const AString destPath (GetOemString(destPathU));
823*f6dc9357SAndroid Build Coastguard Worker 
824*f6dc9357SAndroid Build Coastguard Worker     for (int i = 0; i < panelInfo.ItemsNumber; i++)
825*f6dc9357SAndroid Build Coastguard Worker     {
826*f6dc9357SAndroid Build Coastguard Worker       const PluginPanelItem &pi = panelInfo.PanelItems[i];
827*f6dc9357SAndroid Build Coastguard Worker       if (strcmp(destPath, pi.FindData.cFileName) == 0)
828*f6dc9357SAndroid Build Coastguard Worker       {
829*f6dc9357SAndroid Build Coastguard Worker         PanelRedrawInfo panelRedrawInfo;
830*f6dc9357SAndroid Build Coastguard Worker         panelRedrawInfo.CurrentItem = i;
831*f6dc9357SAndroid Build Coastguard Worker         panelRedrawInfo.TopPanelItem = 0;
832*f6dc9357SAndroid Build Coastguard Worker         g_StartupInfo.Control(this, FCTL_REDRAWPANEL, &panelRedrawInfo);
833*f6dc9357SAndroid Build Coastguard Worker         break;
834*f6dc9357SAndroid Build Coastguard Worker       }
835*f6dc9357SAndroid Build Coastguard Worker     }
836*f6dc9357SAndroid Build Coastguard Worker   }
837*f6dc9357SAndroid Build Coastguard Worker 
838*f6dc9357SAndroid Build Coastguard Worker   SetCurrentDirVar();
839*f6dc9357SAndroid Build Coastguard Worker   return S_OK;
840*f6dc9357SAndroid Build Coastguard Worker }
841