diff options
Diffstat (limited to 'CPP/7zip/UI/FileManager/PanelCopy.cpp')
-rwxr-xr-x | CPP/7zip/UI/FileManager/PanelCopy.cpp | 115 |
1 files changed, 57 insertions, 58 deletions
diff --git a/CPP/7zip/UI/FileManager/PanelCopy.cpp b/CPP/7zip/UI/FileManager/PanelCopy.cpp index 8ad3d4c9..8c27ef2f 100755 --- a/CPP/7zip/UI/FileManager/PanelCopy.cpp +++ b/CPP/7zip/UI/FileManager/PanelCopy.cpp @@ -13,8 +13,10 @@ using namespace NWindows; -struct CThreadExtractInArchive2 +class CPanelCopyThread: public CProgressThreadVirt { + HRESULT ProcessVirt(); +public: CMyComPtr<IFolderOperations> FolderOperations; CRecordVector<UInt32> Indices; UString DestPath; @@ -23,26 +25,17 @@ struct CThreadExtractInArchive2 HRESULT Result; bool MoveMode; - CThreadExtractInArchive2(): MoveMode(false) {} - - DWORD Extract() - { - ExtractCallbackSpec->ProgressDialog.WaitCreating(); - if (MoveMode) - Result = FolderOperations->MoveTo(&Indices.Front(), Indices.Size(), - DestPath, ExtractCallback); - else - Result = FolderOperations->CopyTo(&Indices.Front(), Indices.Size(), - DestPath, ExtractCallback); - ExtractCallbackSpec->ProgressDialog.MyClose(); - return 0; - } - - static THREAD_FUNC_DECL MyThreadFunction(void *param) - { - return ((CThreadExtractInArchive2 *)param)->Extract(); - } + CPanelCopyThread(): MoveMode(false), Result(E_FAIL) {} }; + +HRESULT CPanelCopyThread::ProcessVirt() +{ + if (MoveMode) + Result = FolderOperations->MoveTo(&Indices.Front(), Indices.Size(), DestPath, ExtractCallback); + else + Result = FolderOperations->CopyTo(&Indices.Front(), Indices.Size(), DestPath, ExtractCallback); + return Result; +} HRESULT CPanel::CopyTo(const CRecordVector<UInt32> &indices, const UString &folder, bool moveMode, bool showErrorMessages, UStringVector *messages, @@ -61,22 +54,22 @@ HRESULT CPanel::CopyTo(const CRecordVector<UInt32> &indices, const UString &fold HRESULT res; { - CThreadExtractInArchive2 extracter; + CPanelCopyThread extracter; + extracter.ExtractCallbackSpec = new CExtractCallbackImp; extracter.ExtractCallback = extracter.ExtractCallbackSpec; - extracter.ExtractCallbackSpec->ParentWindow = GetParent(); - extracter.ExtractCallbackSpec->ShowMessages = showErrorMessages; - extracter.ExtractCallbackSpec->ProgressDialog.CompressingMode = false; + extracter.ExtractCallbackSpec->ProgressDialog = &extracter.ProgressDialog; + extracter.ProgressDialog.CompressingMode = false; UString title = moveMode ? LangString(IDS_MOVING, 0x03020206): LangString(IDS_COPYING, 0x03020205); UString progressWindowTitle = LangString(IDS_APP_TITLE, 0x03000000); - extracter.ExtractCallbackSpec->ProgressDialog.MainWindow = GetParent(); - extracter.ExtractCallbackSpec->ProgressDialog.MainTitle = progressWindowTitle; - extracter.ExtractCallbackSpec->ProgressDialog.MainAddTitle = title + L" "; + extracter.ProgressDialog.MainWindow = GetParent(); + extracter.ProgressDialog.MainTitle = progressWindowTitle; + extracter.ProgressDialog.MainAddTitle = title + L" "; extracter.ExtractCallbackSpec->OverwriteMode = NExtract::NOverwriteMode::kAskBefore; extracter.ExtractCallbackSpec->Init(); @@ -88,15 +81,13 @@ HRESULT CPanel::CopyTo(const CRecordVector<UInt32> &indices, const UString &fold extracter.ExtractCallbackSpec->PasswordIsDefined = usePassword; extracter.ExtractCallbackSpec->Password = password; - NWindows::CThread extractThread; - RINOK(extractThread.Create(CThreadExtractInArchive2::MyThreadFunction, &extracter)); - extracter.ExtractCallbackSpec->StartProgressDialog(title); + RINOK(extracter.Create(title, GetParent())); if (messages != 0) - *messages = extracter.ExtractCallbackSpec->Messages; + *messages = extracter.ProgressDialog.Sync.Messages; res = extracter.Result; - if (res == S_OK && extracter.ExtractCallbackSpec->Messages.IsEmpty()) + if (res == S_OK && extracter.ExtractCallbackSpec->IsOK()) { usePassword = extracter.ExtractCallbackSpec->PasswordIsDefined; password = extracter.ExtractCallbackSpec->Password; @@ -113,57 +104,55 @@ struct CThreadUpdate UString FolderPrefix; UStringVector FileNames; CRecordVector<const wchar_t *> FileNamePointers; + CProgressDialog ProgressDialog; CMyComPtr<IFolderArchiveUpdateCallback> UpdateCallback; CUpdateCallback100Imp *UpdateCallbackSpec; HRESULT Result; - DWORD Process() + void Process() { - UpdateCallbackSpec->ProgressDialog.WaitCreating(); - Result = FolderOperations->CopyFrom( + try + { + CProgressCloser closer(ProgressDialog); + Result = FolderOperations->CopyFrom( FolderPrefix, &FileNamePointers.Front(), FileNamePointers.Size(), UpdateCallback); - UpdateCallbackSpec->ProgressDialog.MyClose(); - return 0; + } + catch(...) { Result = E_FAIL; } } - static THREAD_FUNC_DECL MyThreadFunction(void *param) { - return ((CThreadUpdate *)param)->Process(); + ((CThreadUpdate *)param)->Process(); + return 0; } }; - HRESULT CPanel::CopyFrom(const UString &folderPrefix, const UStringVector &filePaths, bool showErrorMessages, UStringVector *messages) { CMyComPtr<IFolderOperations> folderOperations; - if (_folder.QueryInterface(IID_IFolderOperations, &folderOperations) != S_OK) - { - UString errorMessage = LangString(IDS_OPERATION_IS_NOT_SUPPORTED, 0x03020208); - if (showErrorMessages) - MessageBox(errorMessage); - else if (messages != 0) - messages->Add(errorMessage); - return E_FAIL; - } - + _folder.QueryInterface(IID_IFolderOperations, &folderOperations); HRESULT res; + if (!folderOperations) + res = E_NOINTERFACE; + else { CThreadUpdate updater; updater.UpdateCallbackSpec = new CUpdateCallback100Imp; updater.UpdateCallback = updater.UpdateCallbackSpec; + updater.UpdateCallbackSpec->ProgressDialog = &updater.ProgressDialog; + UString title = LangString(IDS_COPYING, 0x03020205); UString progressWindowTitle = LangString(IDS_APP_TITLE, 0x03000000); - updater.UpdateCallbackSpec->ProgressDialog.MainWindow = GetParent(); - updater.UpdateCallbackSpec->ProgressDialog.MainTitle = progressWindowTitle; - updater.UpdateCallbackSpec->ProgressDialog.MainAddTitle = title + UString(L" "); + updater.ProgressDialog.MainWindow = GetParent(); + updater.ProgressDialog.MainTitle = progressWindowTitle; + updater.ProgressDialog.MainAddTitle = title + UString(L" "); - updater.UpdateCallbackSpec->Init((HWND)*this, false, L""); + updater.UpdateCallbackSpec->Init(false, L""); updater.FolderOperations = folderOperations; updater.FolderPrefix = folderPrefix; updater.FileNames.Reserve(filePaths.Size()); @@ -176,13 +165,24 @@ HRESULT CPanel::CopyFrom(const UString &folderPrefix, const UStringVector &fileP NWindows::CThread thread; RINOK(thread.Create(CThreadUpdate::MyThreadFunction, &updater)); - updater.UpdateCallbackSpec->StartProgressDialog(title); + updater.ProgressDialog.Create(title, thread, GetParent()); if (messages != 0) - *messages = updater.UpdateCallbackSpec->Messages; + *messages = updater.ProgressDialog.Sync.Messages; res = updater.Result; } + + if (res == E_NOINTERFACE) + { + UString errorMessage = LangString(IDS_OPERATION_IS_NOT_SUPPORTED, 0x03020208); + if (showErrorMessages) + MessageBox(errorMessage); + else if (messages != 0) + messages->Add(errorMessage); + return E_ABORT; + } + RefreshTitleAlways(); return res; } @@ -219,10 +219,9 @@ void CPanel::CopyFromAsk(const UStringVector &filePaths) message += L"\n\'"; message += _currentFolderPrefix; message += L"\' ?"; - int res = ::MessageBoxW(*(this), message, title, MB_YESNOCANCEL | MB_ICONQUESTION | MB_SYSTEMMODAL); + int res = ::MessageBoxW(*(this), message, title, MB_YESNOCANCEL | MB_ICONQUESTION); if (res != IDYES) return; CopyFromNoAsk(filePaths); } - |