6 #include "resource.h"
\r
7 #include "LangUtils.h"
\r
8 #include "ExtractCallback.h"
\r
9 #include "Windows/Thread.h"
\r
10 ////////////////////////////////////////////////////////////////
\r
12 #include "UpdateCallback100.h"
\r
14 using namespace NWindows;
\r
16 class CPanelCopyThread: public CProgressThreadVirt
\r
18 HRESULT ProcessVirt();
\r
20 CMyComPtr<IFolderOperations> FolderOperations;
\r
21 CRecordVector<UInt32> Indices;
\r
23 CExtractCallbackImp *ExtractCallbackSpec;
\r
24 CMyComPtr<IFolderOperationsExtractCallback> ExtractCallback;
\r
28 CPanelCopyThread(): MoveMode(false), Result(E_FAIL) {}
\r
31 HRESULT CPanelCopyThread::ProcessVirt()
\r
34 Result = FolderOperations->MoveTo(&Indices.Front(), Indices.Size(), DestPath, ExtractCallback);
\r
36 Result = FolderOperations->CopyTo(&Indices.Front(), Indices.Size(), DestPath, ExtractCallback);
\r
40 HRESULT CPanel::CopyTo(const CRecordVector<UInt32> &indices, const UString &folder,
\r
41 bool moveMode, bool showErrorMessages, UStringVector *messages,
\r
42 bool &usePassword, UString &password)
\r
44 CMyComPtr<IFolderOperations> folderOperations;
\r
45 if (_folder.QueryInterface(IID_IFolderOperations, &folderOperations) != S_OK)
\r
47 UString errorMessage = LangString(IDS_OPERATION_IS_NOT_SUPPORTED, 0x03020208);
\r
48 if (showErrorMessages)
\r
49 MessageBox(errorMessage);
\r
50 else if (messages != 0)
\r
51 messages->Add(errorMessage);
\r
57 CPanelCopyThread extracter;
\r
60 extracter.ExtractCallbackSpec = new CExtractCallbackImp;
\r
61 extracter.ExtractCallback = extracter.ExtractCallbackSpec;
\r
62 extracter.ExtractCallbackSpec->ProgressDialog = &extracter.ProgressDialog;
\r
63 extracter.ProgressDialog.CompressingMode = false;
\r
65 UString title = moveMode ?
\r
66 LangString(IDS_MOVING, 0x03020206):
\r
67 LangString(IDS_COPYING, 0x03020205);
\r
68 UString progressWindowTitle = LangString(IDS_APP_TITLE, 0x03000000);
\r
70 extracter.ProgressDialog.MainWindow = GetParent();
\r
71 extracter.ProgressDialog.MainTitle = progressWindowTitle;
\r
72 extracter.ProgressDialog.MainAddTitle = title + L" ";
\r
74 extracter.ExtractCallbackSpec->OverwriteMode = NExtract::NOverwriteMode::kAskBefore;
\r
75 extracter.ExtractCallbackSpec->Init();
\r
76 extracter.Indices = indices;
\r
77 extracter.DestPath = folder;
\r
78 extracter.FolderOperations = folderOperations;
\r
79 extracter.MoveMode = moveMode;
\r
81 extracter.ExtractCallbackSpec->PasswordIsDefined = usePassword;
\r
82 extracter.ExtractCallbackSpec->Password = password;
\r
84 RINOK(extracter.Create(title, GetParent()));
\r
87 *messages = extracter.ProgressDialog.Sync.Messages;
\r
88 res = extracter.Result;
\r
90 if (res == S_OK && extracter.ExtractCallbackSpec->IsOK())
\r
92 usePassword = extracter.ExtractCallbackSpec->PasswordIsDefined;
\r
93 password = extracter.ExtractCallbackSpec->Password;
\r
96 RefreshTitleAlways();
\r
101 struct CThreadUpdate
\r
103 CMyComPtr<IFolderOperations> FolderOperations;
\r
104 UString FolderPrefix;
\r
105 UStringVector FileNames;
\r
106 CRecordVector<const wchar_t *> FileNamePointers;
\r
107 CProgressDialog ProgressDialog;
\r
108 CMyComPtr<IFolderArchiveUpdateCallback> UpdateCallback;
\r
109 CUpdateCallback100Imp *UpdateCallbackSpec;
\r
116 CProgressCloser closer(ProgressDialog);
\r
117 Result = FolderOperations->CopyFrom(
\r
119 &FileNamePointers.Front(),
\r
120 FileNamePointers.Size(),
\r
123 catch(...) { Result = E_FAIL; }
\r
125 static THREAD_FUNC_DECL MyThreadFunction(void *param)
\r
127 ((CThreadUpdate *)param)->Process();
\r
132 HRESULT CPanel::CopyFrom(const UString &folderPrefix, const UStringVector &filePaths,
\r
133 bool showErrorMessages, UStringVector *messages)
\r
135 CMyComPtr<IFolderOperations> folderOperations;
\r
136 _folder.QueryInterface(IID_IFolderOperations, &folderOperations);
\r
138 if (!folderOperations)
\r
139 res = E_NOINTERFACE;
\r
142 CThreadUpdate updater;
\r
143 updater.UpdateCallbackSpec = new CUpdateCallback100Imp;
\r
144 updater.UpdateCallback = updater.UpdateCallbackSpec;
\r
146 updater.UpdateCallbackSpec->ProgressDialog = &updater.ProgressDialog;
\r
148 UString title = LangString(IDS_COPYING, 0x03020205);
\r
149 UString progressWindowTitle = LangString(IDS_APP_TITLE, 0x03000000);
\r
151 updater.ProgressDialog.MainWindow = GetParent();
\r
152 updater.ProgressDialog.MainTitle = progressWindowTitle;
\r
153 updater.ProgressDialog.MainAddTitle = title + UString(L" ");
\r
155 updater.UpdateCallbackSpec->Init(false, L"");
\r
156 updater.FolderOperations = folderOperations;
\r
157 updater.FolderPrefix = folderPrefix;
\r
158 updater.FileNames.Reserve(filePaths.Size());
\r
160 for(i = 0; i < filePaths.Size(); i++)
\r
161 updater.FileNames.Add(filePaths[i]);
\r
162 updater.FileNamePointers.Reserve(updater.FileNames.Size());
\r
163 for(i = 0; i < updater.FileNames.Size(); i++)
\r
164 updater.FileNamePointers.Add(updater.FileNames[i]);
\r
166 NWindows::CThread thread;
\r
167 RINOK(thread.Create(CThreadUpdate::MyThreadFunction, &updater));
\r
168 updater.ProgressDialog.Create(title, thread, GetParent());
\r
171 *messages = updater.ProgressDialog.Sync.Messages;
\r
173 res = updater.Result;
\r
176 if (res == E_NOINTERFACE)
\r
178 UString errorMessage = LangString(IDS_OPERATION_IS_NOT_SUPPORTED, 0x03020208);
\r
179 if (showErrorMessages)
\r
180 MessageBox(errorMessage);
\r
181 else if (messages != 0)
\r
182 messages->Add(errorMessage);
\r
186 RefreshTitleAlways();
\r
190 void CPanel::CopyFromNoAsk(const UStringVector &filePaths)
\r
192 CDisableTimerProcessing disableTimerProcessing(*this);
\r
194 CSelectedState srcSelState;
\r
195 SaveSelectedState(srcSelState);
\r
197 HRESULT result = CopyFrom(L"", filePaths, true, 0);
\r
199 if (result != S_OK)
\r
201 disableTimerProcessing.Restore();
\r
204 if (result != E_ABORT)
\r
205 MessageBoxError(result);
\r
209 RefreshListCtrl(srcSelState);
\r
211 disableTimerProcessing.Restore();
\r
215 void CPanel::CopyFromAsk(const UStringVector &filePaths)
\r
217 UString title = LangString(IDS_CONFIRM_FILE_COPY, 0x03020222);
\r
218 UString message = LangString(IDS_WANT_TO_COPY_FILES, 0x03020223);
\r
219 message += L"\n\'";
\r
220 message += _currentFolderPrefix;
\r
221 message += L"\' ?";
\r
222 int res = ::MessageBoxW(*(this), message, title, MB_YESNOCANCEL | MB_ICONQUESTION);
\r
226 CopyFromNoAsk(filePaths);
\r