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