1*f6dc9357SAndroid Build Coastguard Worker /// PanelCopy.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 "../Common/ZipRegistry.h"
6*f6dc9357SAndroid Build Coastguard Worker
7*f6dc9357SAndroid Build Coastguard Worker #include "../GUI/HashGUI.h"
8*f6dc9357SAndroid Build Coastguard Worker
9*f6dc9357SAndroid Build Coastguard Worker #include "FSFolder.h"
10*f6dc9357SAndroid Build Coastguard Worker #include "ExtractCallback.h"
11*f6dc9357SAndroid Build Coastguard Worker #include "LangUtils.h"
12*f6dc9357SAndroid Build Coastguard Worker #include "Panel.h"
13*f6dc9357SAndroid Build Coastguard Worker #include "UpdateCallback100.h"
14*f6dc9357SAndroid Build Coastguard Worker
15*f6dc9357SAndroid Build Coastguard Worker #include "resource.h"
16*f6dc9357SAndroid Build Coastguard Worker
17*f6dc9357SAndroid Build Coastguard Worker
18*f6dc9357SAndroid Build Coastguard Worker class CPanelCopyThread: public CProgressThreadVirt
19*f6dc9357SAndroid Build Coastguard Worker {
20*f6dc9357SAndroid Build Coastguard Worker bool ResultsWereShown;
21*f6dc9357SAndroid Build Coastguard Worker bool NeedShowRes;
22*f6dc9357SAndroid Build Coastguard Worker
23*f6dc9357SAndroid Build Coastguard Worker HRESULT ProcessVirt() Z7_override;
24*f6dc9357SAndroid Build Coastguard Worker virtual void ProcessWasFinished_GuiVirt() Z7_override;
25*f6dc9357SAndroid Build Coastguard Worker public:
26*f6dc9357SAndroid Build Coastguard Worker const CCopyToOptions *options;
27*f6dc9357SAndroid Build Coastguard Worker const UStringVector *CopyFrom_Paths;
28*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IFolderOperations> FolderOperations;
29*f6dc9357SAndroid Build Coastguard Worker CRecordVector<UInt32> Indices;
30*f6dc9357SAndroid Build Coastguard Worker CExtractCallbackImp *ExtractCallbackSpec;
31*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IFolderOperationsExtractCallback> ExtractCallback;
32*f6dc9357SAndroid Build Coastguard Worker
33*f6dc9357SAndroid Build Coastguard Worker CHashBundle Hash;
34*f6dc9357SAndroid Build Coastguard Worker // UString FirstFilePath;
35*f6dc9357SAndroid Build Coastguard Worker
36*f6dc9357SAndroid Build Coastguard Worker // HRESULT Result2;
37*f6dc9357SAndroid Build Coastguard Worker
38*f6dc9357SAndroid Build Coastguard Worker void ShowFinalResults(HWND hwnd);
39*f6dc9357SAndroid Build Coastguard Worker
CPanelCopyThread()40*f6dc9357SAndroid Build Coastguard Worker CPanelCopyThread():
41*f6dc9357SAndroid Build Coastguard Worker ResultsWereShown(false),
42*f6dc9357SAndroid Build Coastguard Worker NeedShowRes(false),
43*f6dc9357SAndroid Build Coastguard Worker CopyFrom_Paths(NULL)
44*f6dc9357SAndroid Build Coastguard Worker // , Result2(E_FAIL)
45*f6dc9357SAndroid Build Coastguard Worker {}
46*f6dc9357SAndroid Build Coastguard Worker };
47*f6dc9357SAndroid Build Coastguard Worker
ShowFinalResults(HWND hwnd)48*f6dc9357SAndroid Build Coastguard Worker void CPanelCopyThread::ShowFinalResults(HWND hwnd)
49*f6dc9357SAndroid Build Coastguard Worker {
50*f6dc9357SAndroid Build Coastguard Worker if (NeedShowRes)
51*f6dc9357SAndroid Build Coastguard Worker if (!ResultsWereShown)
52*f6dc9357SAndroid Build Coastguard Worker {
53*f6dc9357SAndroid Build Coastguard Worker ResultsWereShown = true;
54*f6dc9357SAndroid Build Coastguard Worker ShowHashResults(Hash, hwnd);
55*f6dc9357SAndroid Build Coastguard Worker }
56*f6dc9357SAndroid Build Coastguard Worker }
57*f6dc9357SAndroid Build Coastguard Worker
ProcessWasFinished_GuiVirt()58*f6dc9357SAndroid Build Coastguard Worker void CPanelCopyThread::ProcessWasFinished_GuiVirt()
59*f6dc9357SAndroid Build Coastguard Worker {
60*f6dc9357SAndroid Build Coastguard Worker ShowFinalResults(*this);
61*f6dc9357SAndroid Build Coastguard Worker }
62*f6dc9357SAndroid Build Coastguard Worker
ProcessVirt()63*f6dc9357SAndroid Build Coastguard Worker HRESULT CPanelCopyThread::ProcessVirt()
64*f6dc9357SAndroid Build Coastguard Worker {
65*f6dc9357SAndroid Build Coastguard Worker /*
66*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IFolderSetReplaceAltStreamCharsMode> iReplace;
67*f6dc9357SAndroid Build Coastguard Worker FolderOperations.QueryInterface(IID_IFolderSetReplaceAltStreamCharsMode, &iReplace);
68*f6dc9357SAndroid Build Coastguard Worker if (iReplace)
69*f6dc9357SAndroid Build Coastguard Worker {
70*f6dc9357SAndroid Build Coastguard Worker RINOK(iReplace->SetReplaceAltStreamCharsMode(ReplaceAltStreamChars ? 1 : 0));
71*f6dc9357SAndroid Build Coastguard Worker }
72*f6dc9357SAndroid Build Coastguard Worker */
73*f6dc9357SAndroid Build Coastguard Worker
74*f6dc9357SAndroid Build Coastguard Worker HRESULT result2;
75*f6dc9357SAndroid Build Coastguard Worker
76*f6dc9357SAndroid Build Coastguard Worker if (FolderOperations)
77*f6dc9357SAndroid Build Coastguard Worker {
78*f6dc9357SAndroid Build Coastguard Worker {
79*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IFolderSetZoneIdMode> setZoneMode;
80*f6dc9357SAndroid Build Coastguard Worker FolderOperations.QueryInterface(IID_IFolderSetZoneIdMode, &setZoneMode);
81*f6dc9357SAndroid Build Coastguard Worker if (setZoneMode)
82*f6dc9357SAndroid Build Coastguard Worker {
83*f6dc9357SAndroid Build Coastguard Worker RINOK(setZoneMode->SetZoneIdMode(options->ZoneIdMode))
84*f6dc9357SAndroid Build Coastguard Worker }
85*f6dc9357SAndroid Build Coastguard Worker }
86*f6dc9357SAndroid Build Coastguard Worker {
87*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IFolderSetZoneIdFile> setZoneFile;
88*f6dc9357SAndroid Build Coastguard Worker FolderOperations.QueryInterface(IID_IFolderSetZoneIdFile, &setZoneFile);
89*f6dc9357SAndroid Build Coastguard Worker if (setZoneFile)
90*f6dc9357SAndroid Build Coastguard Worker {
91*f6dc9357SAndroid Build Coastguard Worker RINOK(setZoneFile->SetZoneIdFile(options->ZoneBuf, (UInt32)options->ZoneBuf.Size()))
92*f6dc9357SAndroid Build Coastguard Worker }
93*f6dc9357SAndroid Build Coastguard Worker }
94*f6dc9357SAndroid Build Coastguard Worker }
95*f6dc9357SAndroid Build Coastguard Worker
96*f6dc9357SAndroid Build Coastguard Worker if (CopyFrom_Paths)
97*f6dc9357SAndroid Build Coastguard Worker {
98*f6dc9357SAndroid Build Coastguard Worker result2 = NFsFolder::CopyFileSystemItems(
99*f6dc9357SAndroid Build Coastguard Worker *CopyFrom_Paths,
100*f6dc9357SAndroid Build Coastguard Worker us2fs(options->folder),
101*f6dc9357SAndroid Build Coastguard Worker options->moveMode,
102*f6dc9357SAndroid Build Coastguard Worker (IFolderOperationsExtractCallback *)ExtractCallbackSpec);
103*f6dc9357SAndroid Build Coastguard Worker }
104*f6dc9357SAndroid Build Coastguard Worker else if (options->testMode)
105*f6dc9357SAndroid Build Coastguard Worker {
106*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IArchiveFolder> archiveFolder;
107*f6dc9357SAndroid Build Coastguard Worker FolderOperations.QueryInterface(IID_IArchiveFolder, &archiveFolder);
108*f6dc9357SAndroid Build Coastguard Worker if (!archiveFolder)
109*f6dc9357SAndroid Build Coastguard Worker return E_NOTIMPL;
110*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IFolderArchiveExtractCallback> extractCallback2;
111*f6dc9357SAndroid Build Coastguard Worker RINOK(ExtractCallback.QueryInterface(IID_IFolderArchiveExtractCallback, &extractCallback2))
112*f6dc9357SAndroid Build Coastguard Worker NExtract::NPathMode::EEnum pathMode =
113*f6dc9357SAndroid Build Coastguard Worker NExtract::NPathMode::kCurPaths;
114*f6dc9357SAndroid Build Coastguard Worker // NExtract::NPathMode::kFullPathnames;
115*f6dc9357SAndroid Build Coastguard Worker result2 = archiveFolder->Extract(Indices.ConstData(), Indices.Size(),
116*f6dc9357SAndroid Build Coastguard Worker BoolToInt(options->includeAltStreams),
117*f6dc9357SAndroid Build Coastguard Worker BoolToInt(options->replaceAltStreamChars),
118*f6dc9357SAndroid Build Coastguard Worker pathMode, NExtract::NOverwriteMode::kAsk,
119*f6dc9357SAndroid Build Coastguard Worker options->folder, BoolToInt(true), extractCallback2);
120*f6dc9357SAndroid Build Coastguard Worker }
121*f6dc9357SAndroid Build Coastguard Worker else
122*f6dc9357SAndroid Build Coastguard Worker result2 = FolderOperations->CopyTo(
123*f6dc9357SAndroid Build Coastguard Worker BoolToInt(options->moveMode),
124*f6dc9357SAndroid Build Coastguard Worker Indices.ConstData(), Indices.Size(),
125*f6dc9357SAndroid Build Coastguard Worker BoolToInt(options->includeAltStreams),
126*f6dc9357SAndroid Build Coastguard Worker BoolToInt(options->replaceAltStreamChars),
127*f6dc9357SAndroid Build Coastguard Worker options->folder, ExtractCallback);
128*f6dc9357SAndroid Build Coastguard Worker
129*f6dc9357SAndroid Build Coastguard Worker if (result2 == S_OK && !ExtractCallbackSpec->ThereAreMessageErrors)
130*f6dc9357SAndroid Build Coastguard Worker {
131*f6dc9357SAndroid Build Coastguard Worker if (!options->hashMethods.IsEmpty())
132*f6dc9357SAndroid Build Coastguard Worker NeedShowRes = true;
133*f6dc9357SAndroid Build Coastguard Worker else if (options->testMode)
134*f6dc9357SAndroid Build Coastguard Worker {
135*f6dc9357SAndroid Build Coastguard Worker CProgressMessageBoxPair &pair = GetMessagePair(false); // GetMessagePair(ExtractCallbackSpec->Hash.NumErrors != 0);
136*f6dc9357SAndroid Build Coastguard Worker AddHashBundleRes(pair.Message, Hash);
137*f6dc9357SAndroid Build Coastguard Worker }
138*f6dc9357SAndroid Build Coastguard Worker }
139*f6dc9357SAndroid Build Coastguard Worker
140*f6dc9357SAndroid Build Coastguard Worker return result2;
141*f6dc9357SAndroid Build Coastguard Worker }
142*f6dc9357SAndroid Build Coastguard Worker
143*f6dc9357SAndroid Build Coastguard Worker
144*f6dc9357SAndroid Build Coastguard Worker /*
145*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_EXTERNAL_CODECS
146*f6dc9357SAndroid Build Coastguard Worker
147*f6dc9357SAndroid Build Coastguard Worker static void ThrowException_if_Error(HRESULT res)
148*f6dc9357SAndroid Build Coastguard Worker {
149*f6dc9357SAndroid Build Coastguard Worker if (res != S_OK)
150*f6dc9357SAndroid Build Coastguard Worker throw CSystemException(res);
151*f6dc9357SAndroid Build Coastguard Worker }
152*f6dc9357SAndroid Build Coastguard Worker
153*f6dc9357SAndroid Build Coastguard Worker #endif
154*f6dc9357SAndroid Build Coastguard Worker */
155*f6dc9357SAndroid Build Coastguard Worker
Get_ZoneId_Stream_from_ParentFolders(CByteBuffer & buf)156*f6dc9357SAndroid Build Coastguard Worker void CPanel::Get_ZoneId_Stream_from_ParentFolders(CByteBuffer &buf)
157*f6dc9357SAndroid Build Coastguard Worker {
158*f6dc9357SAndroid Build Coastguard Worker // we suppose that ZoneId of top parent has priority over ZoneId from childs.
159*f6dc9357SAndroid Build Coastguard Worker FOR_VECTOR (i, _parentFolders)
160*f6dc9357SAndroid Build Coastguard Worker {
161*f6dc9357SAndroid Build Coastguard Worker // _parentFolders[0] = is top level archive
162*f6dc9357SAndroid Build Coastguard Worker // _parentFolders[1 ... ].isVirtual == true is possible
163*f6dc9357SAndroid Build Coastguard Worker // if extracted size meets size conditions derived from g_RAM_Size.
164*f6dc9357SAndroid Build Coastguard Worker const CFolderLink &fl = _parentFolders[i];
165*f6dc9357SAndroid Build Coastguard Worker if (fl.IsVirtual)
166*f6dc9357SAndroid Build Coastguard Worker {
167*f6dc9357SAndroid Build Coastguard Worker if (fl.ZoneBuf.Size() != 0)
168*f6dc9357SAndroid Build Coastguard Worker {
169*f6dc9357SAndroid Build Coastguard Worker buf = fl.ZoneBuf;
170*f6dc9357SAndroid Build Coastguard Worker return;
171*f6dc9357SAndroid Build Coastguard Worker }
172*f6dc9357SAndroid Build Coastguard Worker }
173*f6dc9357SAndroid Build Coastguard Worker else if (!fl.FilePath.IsEmpty())
174*f6dc9357SAndroid Build Coastguard Worker {
175*f6dc9357SAndroid Build Coastguard Worker ReadZoneFile_Of_BaseFile(fl.FilePath, buf);
176*f6dc9357SAndroid Build Coastguard Worker if (buf.Size() != 0)
177*f6dc9357SAndroid Build Coastguard Worker return;
178*f6dc9357SAndroid Build Coastguard Worker }
179*f6dc9357SAndroid Build Coastguard Worker }
180*f6dc9357SAndroid Build Coastguard Worker }
181*f6dc9357SAndroid Build Coastguard Worker
CopyTo(CCopyToOptions & options,const CRecordVector<UInt32> & indices,UStringVector * messages,bool & usePassword,UString & password,const UStringVector * filePaths)182*f6dc9357SAndroid Build Coastguard Worker HRESULT CPanel::CopyTo(CCopyToOptions &options,
183*f6dc9357SAndroid Build Coastguard Worker const CRecordVector<UInt32> &indices,
184*f6dc9357SAndroid Build Coastguard Worker UStringVector *messages,
185*f6dc9357SAndroid Build Coastguard Worker bool &usePassword, UString &password,
186*f6dc9357SAndroid Build Coastguard Worker const UStringVector *filePaths)
187*f6dc9357SAndroid Build Coastguard Worker {
188*f6dc9357SAndroid Build Coastguard Worker if (options.NeedRegistryZone && !options.testMode)
189*f6dc9357SAndroid Build Coastguard Worker {
190*f6dc9357SAndroid Build Coastguard Worker CContextMenuInfo ci;
191*f6dc9357SAndroid Build Coastguard Worker ci.Load();
192*f6dc9357SAndroid Build Coastguard Worker if (ci.WriteZone != (UInt32)(Int32)-1)
193*f6dc9357SAndroid Build Coastguard Worker options.ZoneIdMode = (NExtract::NZoneIdMode::EEnum)(int)(Int32)ci.WriteZone;
194*f6dc9357SAndroid Build Coastguard Worker }
195*f6dc9357SAndroid Build Coastguard Worker
196*f6dc9357SAndroid Build Coastguard Worker if (options.ZoneBuf.Size() == 0
197*f6dc9357SAndroid Build Coastguard Worker && options.ZoneIdMode != NExtract::NZoneIdMode::kNone)
198*f6dc9357SAndroid Build Coastguard Worker Get_ZoneId_Stream_from_ParentFolders(options.ZoneBuf);
199*f6dc9357SAndroid Build Coastguard Worker
200*f6dc9357SAndroid Build Coastguard Worker if (IsHashFolder())
201*f6dc9357SAndroid Build Coastguard Worker {
202*f6dc9357SAndroid Build Coastguard Worker if (!options.testMode)
203*f6dc9357SAndroid Build Coastguard Worker return E_NOTIMPL;
204*f6dc9357SAndroid Build Coastguard Worker }
205*f6dc9357SAndroid Build Coastguard Worker
206*f6dc9357SAndroid Build Coastguard Worker if (!filePaths)
207*f6dc9357SAndroid Build Coastguard Worker if (!_folderOperations)
208*f6dc9357SAndroid Build Coastguard Worker {
209*f6dc9357SAndroid Build Coastguard Worker const UString errorMessage = LangString(IDS_OPERATION_IS_NOT_SUPPORTED);
210*f6dc9357SAndroid Build Coastguard Worker if (options.showErrorMessages)
211*f6dc9357SAndroid Build Coastguard Worker MessageBox_Error(errorMessage);
212*f6dc9357SAndroid Build Coastguard Worker else if (messages)
213*f6dc9357SAndroid Build Coastguard Worker messages->Add(errorMessage);
214*f6dc9357SAndroid Build Coastguard Worker return E_FAIL;
215*f6dc9357SAndroid Build Coastguard Worker }
216*f6dc9357SAndroid Build Coastguard Worker
217*f6dc9357SAndroid Build Coastguard Worker HRESULT res = S_OK;
218*f6dc9357SAndroid Build Coastguard Worker
219*f6dc9357SAndroid Build Coastguard Worker {
220*f6dc9357SAndroid Build Coastguard Worker /*
221*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_EXTERNAL_CODECS
222*f6dc9357SAndroid Build Coastguard Worker CExternalCodecs g_ExternalCodecs;
223*f6dc9357SAndroid Build Coastguard Worker #endif
224*f6dc9357SAndroid Build Coastguard Worker */
225*f6dc9357SAndroid Build Coastguard Worker /* extracter.Hash uses g_ExternalCodecs
226*f6dc9357SAndroid Build Coastguard Worker extracter must be declared after g_ExternalCodecs for correct destructor order !!! */
227*f6dc9357SAndroid Build Coastguard Worker
228*f6dc9357SAndroid Build Coastguard Worker CPanelCopyThread extracter;
229*f6dc9357SAndroid Build Coastguard Worker
230*f6dc9357SAndroid Build Coastguard Worker extracter.ExtractCallbackSpec = new CExtractCallbackImp;
231*f6dc9357SAndroid Build Coastguard Worker extracter.ExtractCallback = extracter.ExtractCallbackSpec;
232*f6dc9357SAndroid Build Coastguard Worker extracter.ExtractCallbackSpec->Src_Is_IO_FS_Folder =
233*f6dc9357SAndroid Build Coastguard Worker IsFSFolder() || IsAltStreamsFolder();
234*f6dc9357SAndroid Build Coastguard Worker // options.src_Is_IO_FS_Folder;
235*f6dc9357SAndroid Build Coastguard Worker extracter.options = &options;
236*f6dc9357SAndroid Build Coastguard Worker extracter.ExtractCallbackSpec->ProgressDialog = &extracter;
237*f6dc9357SAndroid Build Coastguard Worker extracter.CompressingMode = false;
238*f6dc9357SAndroid Build Coastguard Worker
239*f6dc9357SAndroid Build Coastguard Worker extracter.ExtractCallbackSpec->StreamMode = options.streamMode;
240*f6dc9357SAndroid Build Coastguard Worker
241*f6dc9357SAndroid Build Coastguard Worker
242*f6dc9357SAndroid Build Coastguard Worker if (indices.Size() == 1)
243*f6dc9357SAndroid Build Coastguard Worker {
244*f6dc9357SAndroid Build Coastguard Worker extracter.Hash.FirstFileName = GetItemRelPath(indices[0]);
245*f6dc9357SAndroid Build Coastguard Worker extracter.Hash.MainName = extracter.Hash.FirstFileName;
246*f6dc9357SAndroid Build Coastguard Worker }
247*f6dc9357SAndroid Build Coastguard Worker
248*f6dc9357SAndroid Build Coastguard Worker if (options.VirtFileSystemSpec)
249*f6dc9357SAndroid Build Coastguard Worker {
250*f6dc9357SAndroid Build Coastguard Worker extracter.ExtractCallbackSpec->VirtFileSystem = options.VirtFileSystemSpec;
251*f6dc9357SAndroid Build Coastguard Worker extracter.ExtractCallbackSpec->VirtFileSystemSpec = options.VirtFileSystemSpec;
252*f6dc9357SAndroid Build Coastguard Worker }
253*f6dc9357SAndroid Build Coastguard Worker extracter.ExtractCallbackSpec->ProcessAltStreams = options.includeAltStreams;
254*f6dc9357SAndroid Build Coastguard Worker
255*f6dc9357SAndroid Build Coastguard Worker if (!options.hashMethods.IsEmpty())
256*f6dc9357SAndroid Build Coastguard Worker {
257*f6dc9357SAndroid Build Coastguard Worker /* this code is used when we call CRC calculation for files in side archive
258*f6dc9357SAndroid Build Coastguard Worker But new code uses global codecs so we don't need to call LoadGlobalCodecs again */
259*f6dc9357SAndroid Build Coastguard Worker
260*f6dc9357SAndroid Build Coastguard Worker /*
261*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_EXTERNAL_CODECS
262*f6dc9357SAndroid Build Coastguard Worker ThrowException_if_Error(LoadGlobalCodecs());
263*f6dc9357SAndroid Build Coastguard Worker #endif
264*f6dc9357SAndroid Build Coastguard Worker */
265*f6dc9357SAndroid Build Coastguard Worker
266*f6dc9357SAndroid Build Coastguard Worker extracter.Hash.SetMethods(EXTERNAL_CODECS_VARS_G options.hashMethods);
267*f6dc9357SAndroid Build Coastguard Worker extracter.ExtractCallbackSpec->SetHashMethods(&extracter.Hash);
268*f6dc9357SAndroid Build Coastguard Worker }
269*f6dc9357SAndroid Build Coastguard Worker else if (options.testMode)
270*f6dc9357SAndroid Build Coastguard Worker {
271*f6dc9357SAndroid Build Coastguard Worker extracter.ExtractCallbackSpec->SetHashCalc(&extracter.Hash);
272*f6dc9357SAndroid Build Coastguard Worker }
273*f6dc9357SAndroid Build Coastguard Worker
274*f6dc9357SAndroid Build Coastguard Worker // extracter.Hash.Init();
275*f6dc9357SAndroid Build Coastguard Worker
276*f6dc9357SAndroid Build Coastguard Worker UString title;
277*f6dc9357SAndroid Build Coastguard Worker {
278*f6dc9357SAndroid Build Coastguard Worker UInt32 titleID = IDS_COPYING;
279*f6dc9357SAndroid Build Coastguard Worker if (options.moveMode)
280*f6dc9357SAndroid Build Coastguard Worker titleID = IDS_MOVING;
281*f6dc9357SAndroid Build Coastguard Worker else if (!options.hashMethods.IsEmpty() && options.streamMode)
282*f6dc9357SAndroid Build Coastguard Worker {
283*f6dc9357SAndroid Build Coastguard Worker titleID = IDS_CHECKSUM_CALCULATING;
284*f6dc9357SAndroid Build Coastguard Worker if (options.hashMethods.Size() == 1)
285*f6dc9357SAndroid Build Coastguard Worker {
286*f6dc9357SAndroid Build Coastguard Worker const UString &s = options.hashMethods[0];
287*f6dc9357SAndroid Build Coastguard Worker if (s != L"*")
288*f6dc9357SAndroid Build Coastguard Worker title = s;
289*f6dc9357SAndroid Build Coastguard Worker }
290*f6dc9357SAndroid Build Coastguard Worker }
291*f6dc9357SAndroid Build Coastguard Worker else if (options.testMode)
292*f6dc9357SAndroid Build Coastguard Worker titleID = IDS_PROGRESS_TESTING;
293*f6dc9357SAndroid Build Coastguard Worker
294*f6dc9357SAndroid Build Coastguard Worker if (title.IsEmpty())
295*f6dc9357SAndroid Build Coastguard Worker title = LangString(titleID);
296*f6dc9357SAndroid Build Coastguard Worker }
297*f6dc9357SAndroid Build Coastguard Worker
298*f6dc9357SAndroid Build Coastguard Worker const UString progressWindowTitle ("7-Zip"); // LangString(IDS_APP_TITLE);
299*f6dc9357SAndroid Build Coastguard Worker
300*f6dc9357SAndroid Build Coastguard Worker extracter.MainWindow = GetParent();
301*f6dc9357SAndroid Build Coastguard Worker extracter.MainTitle = progressWindowTitle;
302*f6dc9357SAndroid Build Coastguard Worker extracter.MainAddTitle = title + L' ';
303*f6dc9357SAndroid Build Coastguard Worker
304*f6dc9357SAndroid Build Coastguard Worker extracter.ExtractCallbackSpec->OverwriteMode = NExtract::NOverwriteMode::kAsk;
305*f6dc9357SAndroid Build Coastguard Worker extracter.ExtractCallbackSpec->Init();
306*f6dc9357SAndroid Build Coastguard Worker
307*f6dc9357SAndroid Build Coastguard Worker extracter.CopyFrom_Paths = filePaths;
308*f6dc9357SAndroid Build Coastguard Worker if (!filePaths)
309*f6dc9357SAndroid Build Coastguard Worker {
310*f6dc9357SAndroid Build Coastguard Worker extracter.Indices = indices;
311*f6dc9357SAndroid Build Coastguard Worker extracter.FolderOperations = _folderOperations;
312*f6dc9357SAndroid Build Coastguard Worker }
313*f6dc9357SAndroid Build Coastguard Worker
314*f6dc9357SAndroid Build Coastguard Worker extracter.ExtractCallbackSpec->PasswordIsDefined = usePassword;
315*f6dc9357SAndroid Build Coastguard Worker extracter.ExtractCallbackSpec->Password = password;
316*f6dc9357SAndroid Build Coastguard Worker
317*f6dc9357SAndroid Build Coastguard Worker RINOK(extracter.Create(title, GetParent()))
318*f6dc9357SAndroid Build Coastguard Worker
319*f6dc9357SAndroid Build Coastguard Worker
320*f6dc9357SAndroid Build Coastguard Worker if (messages)
321*f6dc9357SAndroid Build Coastguard Worker *messages = extracter.Sync.Messages;
322*f6dc9357SAndroid Build Coastguard Worker
323*f6dc9357SAndroid Build Coastguard Worker // res = extracter.Result2;
324*f6dc9357SAndroid Build Coastguard Worker res = extracter.Result;
325*f6dc9357SAndroid Build Coastguard Worker
326*f6dc9357SAndroid Build Coastguard Worker if (res == S_OK && extracter.ExtractCallbackSpec->IsOK())
327*f6dc9357SAndroid Build Coastguard Worker {
328*f6dc9357SAndroid Build Coastguard Worker usePassword = extracter.ExtractCallbackSpec->PasswordIsDefined;
329*f6dc9357SAndroid Build Coastguard Worker password = extracter.ExtractCallbackSpec->Password;
330*f6dc9357SAndroid Build Coastguard Worker }
331*f6dc9357SAndroid Build Coastguard Worker
332*f6dc9357SAndroid Build Coastguard Worker extracter.ShowFinalResults(_window);
333*f6dc9357SAndroid Build Coastguard Worker
334*f6dc9357SAndroid Build Coastguard Worker }
335*f6dc9357SAndroid Build Coastguard Worker
336*f6dc9357SAndroid Build Coastguard Worker RefreshTitleAlways();
337*f6dc9357SAndroid Build Coastguard Worker return res;
338*f6dc9357SAndroid Build Coastguard Worker }
339*f6dc9357SAndroid Build Coastguard Worker
340*f6dc9357SAndroid Build Coastguard Worker
341*f6dc9357SAndroid Build Coastguard Worker struct CThreadUpdate
342*f6dc9357SAndroid Build Coastguard Worker {
343*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IFolderOperations> FolderOperations;
344*f6dc9357SAndroid Build Coastguard Worker UString FolderPrefix;
345*f6dc9357SAndroid Build Coastguard Worker UStringVector FileNames;
346*f6dc9357SAndroid Build Coastguard Worker CRecordVector<const wchar_t *> FileNamePointers;
347*f6dc9357SAndroid Build Coastguard Worker CProgressDialog ProgressDialog;
348*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IFolderArchiveUpdateCallback> UpdateCallback;
349*f6dc9357SAndroid Build Coastguard Worker CUpdateCallback100Imp *UpdateCallbackSpec;
350*f6dc9357SAndroid Build Coastguard Worker HRESULT Result;
351*f6dc9357SAndroid Build Coastguard Worker bool MoveMode;
352*f6dc9357SAndroid Build Coastguard Worker
ProcessCThreadUpdate353*f6dc9357SAndroid Build Coastguard Worker void Process()
354*f6dc9357SAndroid Build Coastguard Worker {
355*f6dc9357SAndroid Build Coastguard Worker try
356*f6dc9357SAndroid Build Coastguard Worker {
357*f6dc9357SAndroid Build Coastguard Worker CProgressCloser closer(ProgressDialog);
358*f6dc9357SAndroid Build Coastguard Worker Result = FolderOperations->CopyFrom(
359*f6dc9357SAndroid Build Coastguard Worker MoveMode,
360*f6dc9357SAndroid Build Coastguard Worker FolderPrefix,
361*f6dc9357SAndroid Build Coastguard Worker FileNamePointers.ConstData(),
362*f6dc9357SAndroid Build Coastguard Worker FileNamePointers.Size(),
363*f6dc9357SAndroid Build Coastguard Worker UpdateCallback);
364*f6dc9357SAndroid Build Coastguard Worker }
365*f6dc9357SAndroid Build Coastguard Worker catch(...) { Result = E_FAIL; }
366*f6dc9357SAndroid Build Coastguard Worker }
MyThreadFunctionCThreadUpdate367*f6dc9357SAndroid Build Coastguard Worker static THREAD_FUNC_DECL MyThreadFunction(void *param)
368*f6dc9357SAndroid Build Coastguard Worker {
369*f6dc9357SAndroid Build Coastguard Worker ((CThreadUpdate *)param)->Process();
370*f6dc9357SAndroid Build Coastguard Worker return 0;
371*f6dc9357SAndroid Build Coastguard Worker }
372*f6dc9357SAndroid Build Coastguard Worker };
373*f6dc9357SAndroid Build Coastguard Worker
374*f6dc9357SAndroid Build Coastguard Worker
CopyFrom(bool moveMode,const UString & folderPrefix,const UStringVector & filePaths,bool showErrorMessages,UStringVector * messages)375*f6dc9357SAndroid Build Coastguard Worker HRESULT CPanel::CopyFrom(bool moveMode, const UString &folderPrefix, const UStringVector &filePaths,
376*f6dc9357SAndroid Build Coastguard Worker bool showErrorMessages, UStringVector *messages)
377*f6dc9357SAndroid Build Coastguard Worker {
378*f6dc9357SAndroid Build Coastguard Worker if (IsHashFolder())
379*f6dc9357SAndroid Build Coastguard Worker {
380*f6dc9357SAndroid Build Coastguard Worker if (moveMode)
381*f6dc9357SAndroid Build Coastguard Worker return E_NOTIMPL;
382*f6dc9357SAndroid Build Coastguard Worker }
383*f6dc9357SAndroid Build Coastguard Worker // CDisableNotify disableNotify(*this);
384*f6dc9357SAndroid Build Coastguard Worker
385*f6dc9357SAndroid Build Coastguard Worker HRESULT res;
386*f6dc9357SAndroid Build Coastguard Worker if (!_folderOperations)
387*f6dc9357SAndroid Build Coastguard Worker res = E_NOINTERFACE;
388*f6dc9357SAndroid Build Coastguard Worker else
389*f6dc9357SAndroid Build Coastguard Worker {
390*f6dc9357SAndroid Build Coastguard Worker CThreadUpdate updater;
391*f6dc9357SAndroid Build Coastguard Worker updater.MoveMode = moveMode;
392*f6dc9357SAndroid Build Coastguard Worker updater.UpdateCallbackSpec = new CUpdateCallback100Imp;
393*f6dc9357SAndroid Build Coastguard Worker updater.UpdateCallback = updater.UpdateCallbackSpec;
394*f6dc9357SAndroid Build Coastguard Worker updater.UpdateCallbackSpec->Init();
395*f6dc9357SAndroid Build Coastguard Worker
396*f6dc9357SAndroid Build Coastguard Worker updater.UpdateCallbackSpec->ProgressDialog = &updater.ProgressDialog;
397*f6dc9357SAndroid Build Coastguard Worker
398*f6dc9357SAndroid Build Coastguard Worker const UString title = LangString(IDS_COPYING);
399*f6dc9357SAndroid Build Coastguard Worker const UString progressWindowTitle ("7-Zip"); // LangString(IDS_APP_TITLE);
400*f6dc9357SAndroid Build Coastguard Worker
401*f6dc9357SAndroid Build Coastguard Worker updater.ProgressDialog.MainWindow = GetParent();
402*f6dc9357SAndroid Build Coastguard Worker updater.ProgressDialog.MainTitle = progressWindowTitle;
403*f6dc9357SAndroid Build Coastguard Worker updater.ProgressDialog.MainAddTitle = title + L' ';
404*f6dc9357SAndroid Build Coastguard Worker
405*f6dc9357SAndroid Build Coastguard Worker {
406*f6dc9357SAndroid Build Coastguard Worker if (!_parentFolders.IsEmpty())
407*f6dc9357SAndroid Build Coastguard Worker {
408*f6dc9357SAndroid Build Coastguard Worker const CFolderLink &fl = _parentFolders.Back();
409*f6dc9357SAndroid Build Coastguard Worker updater.UpdateCallbackSpec->PasswordIsDefined = fl.UsePassword;
410*f6dc9357SAndroid Build Coastguard Worker updater.UpdateCallbackSpec->Password = fl.Password;
411*f6dc9357SAndroid Build Coastguard Worker }
412*f6dc9357SAndroid Build Coastguard Worker }
413*f6dc9357SAndroid Build Coastguard Worker
414*f6dc9357SAndroid Build Coastguard Worker updater.FolderOperations = _folderOperations;
415*f6dc9357SAndroid Build Coastguard Worker updater.FolderPrefix = folderPrefix;
416*f6dc9357SAndroid Build Coastguard Worker updater.FileNames.ClearAndReserve(filePaths.Size());
417*f6dc9357SAndroid Build Coastguard Worker unsigned i;
418*f6dc9357SAndroid Build Coastguard Worker for (i = 0; i < filePaths.Size(); i++)
419*f6dc9357SAndroid Build Coastguard Worker updater.FileNames.AddInReserved(filePaths[i]);
420*f6dc9357SAndroid Build Coastguard Worker updater.FileNamePointers.ClearAndReserve(updater.FileNames.Size());
421*f6dc9357SAndroid Build Coastguard Worker for (i = 0; i < updater.FileNames.Size(); i++)
422*f6dc9357SAndroid Build Coastguard Worker updater.FileNamePointers.AddInReserved(updater.FileNames[i]);
423*f6dc9357SAndroid Build Coastguard Worker
424*f6dc9357SAndroid Build Coastguard Worker {
425*f6dc9357SAndroid Build Coastguard Worker NWindows::CThread thread;
426*f6dc9357SAndroid Build Coastguard Worker const WRes wres = thread.Create(CThreadUpdate::MyThreadFunction, &updater);
427*f6dc9357SAndroid Build Coastguard Worker if (wres != 0)
428*f6dc9357SAndroid Build Coastguard Worker return HRESULT_FROM_WIN32(wres);
429*f6dc9357SAndroid Build Coastguard Worker updater.ProgressDialog.Create(title, thread, GetParent());
430*f6dc9357SAndroid Build Coastguard Worker }
431*f6dc9357SAndroid Build Coastguard Worker
432*f6dc9357SAndroid Build Coastguard Worker if (messages)
433*f6dc9357SAndroid Build Coastguard Worker *messages = updater.ProgressDialog.Sync.Messages;
434*f6dc9357SAndroid Build Coastguard Worker
435*f6dc9357SAndroid Build Coastguard Worker res = updater.Result;
436*f6dc9357SAndroid Build Coastguard Worker }
437*f6dc9357SAndroid Build Coastguard Worker
438*f6dc9357SAndroid Build Coastguard Worker if (res == E_NOINTERFACE)
439*f6dc9357SAndroid Build Coastguard Worker {
440*f6dc9357SAndroid Build Coastguard Worker const UString errorMessage = LangString(IDS_OPERATION_IS_NOT_SUPPORTED);
441*f6dc9357SAndroid Build Coastguard Worker if (showErrorMessages)
442*f6dc9357SAndroid Build Coastguard Worker MessageBox_Error(errorMessage);
443*f6dc9357SAndroid Build Coastguard Worker else if (messages)
444*f6dc9357SAndroid Build Coastguard Worker messages->Add(errorMessage);
445*f6dc9357SAndroid Build Coastguard Worker return E_ABORT;
446*f6dc9357SAndroid Build Coastguard Worker }
447*f6dc9357SAndroid Build Coastguard Worker
448*f6dc9357SAndroid Build Coastguard Worker RefreshTitleAlways();
449*f6dc9357SAndroid Build Coastguard Worker return res;
450*f6dc9357SAndroid Build Coastguard Worker }
451*f6dc9357SAndroid Build Coastguard Worker
CopyFromNoAsk(bool moveMode,const UStringVector & filePaths)452*f6dc9357SAndroid Build Coastguard Worker void CPanel::CopyFromNoAsk(bool moveMode, const UStringVector &filePaths)
453*f6dc9357SAndroid Build Coastguard Worker {
454*f6dc9357SAndroid Build Coastguard Worker CDisableTimerProcessing disableTimerProcessing(*this);
455*f6dc9357SAndroid Build Coastguard Worker
456*f6dc9357SAndroid Build Coastguard Worker CSelectedState srcSelState;
457*f6dc9357SAndroid Build Coastguard Worker SaveSelectedState(srcSelState);
458*f6dc9357SAndroid Build Coastguard Worker
459*f6dc9357SAndroid Build Coastguard Worker CDisableNotify disableNotify(*this);
460*f6dc9357SAndroid Build Coastguard Worker
461*f6dc9357SAndroid Build Coastguard Worker const HRESULT result = CopyFrom(moveMode, L"", filePaths, true, NULL);
462*f6dc9357SAndroid Build Coastguard Worker
463*f6dc9357SAndroid Build Coastguard Worker if (result != S_OK)
464*f6dc9357SAndroid Build Coastguard Worker {
465*f6dc9357SAndroid Build Coastguard Worker disableNotify.Restore();
466*f6dc9357SAndroid Build Coastguard Worker // For Password:
467*f6dc9357SAndroid Build Coastguard Worker SetFocusToList();
468*f6dc9357SAndroid Build Coastguard Worker if (result != E_ABORT)
469*f6dc9357SAndroid Build Coastguard Worker MessageBox_Error_HRESULT(result);
470*f6dc9357SAndroid Build Coastguard Worker return;
471*f6dc9357SAndroid Build Coastguard Worker }
472*f6dc9357SAndroid Build Coastguard Worker
473*f6dc9357SAndroid Build Coastguard Worker RefreshListCtrl(srcSelState);
474*f6dc9357SAndroid Build Coastguard Worker
475*f6dc9357SAndroid Build Coastguard Worker disableNotify.Restore();
476*f6dc9357SAndroid Build Coastguard Worker SetFocusToList();
477*f6dc9357SAndroid Build Coastguard Worker }
478