Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/kornelski/7z.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'CPP/7zip/UI/FileManager/PanelCopy.cpp')
-rwxr-xr-xCPP/7zip/UI/FileManager/PanelCopy.cpp115
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);
}
-