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