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')
-rw-r--r--[-rwxr-xr-x]CPP/7zip/UI/FileManager/PanelCopy.cpp199
1 files changed, 157 insertions, 42 deletions
diff --git a/CPP/7zip/UI/FileManager/PanelCopy.cpp b/CPP/7zip/UI/FileManager/PanelCopy.cpp
index 8c27ef2f..d11368cf 100755..100644
--- a/CPP/7zip/UI/FileManager/PanelCopy.cpp
+++ b/CPP/7zip/UI/FileManager/PanelCopy.cpp
@@ -1,14 +1,15 @@
-// PanelExtract.cpp
+/// PanelExtract.cpp
#include "StdAfx.h"
+#include "../../../Common/MyException.h"
+
+#include "../GUI/HashGUI.h"
+
+#include "ExtractCallback.h"
+#include "LangUtils.h"
#include "Panel.h"
#include "resource.h"
-#include "LangUtils.h"
-#include "ExtractCallback.h"
-#include "Windows/Thread.h"
-////////////////////////////////////////////////////////////////
-
#include "UpdateCallback100.h"
using namespace NWindows;
@@ -17,35 +18,82 @@ class CPanelCopyThread: public CProgressThreadVirt
{
HRESULT ProcessVirt();
public:
+ const CCopyToOptions *options;
CMyComPtr<IFolderOperations> FolderOperations;
CRecordVector<UInt32> Indices;
- UString DestPath;
CExtractCallbackImp *ExtractCallbackSpec;
CMyComPtr<IFolderOperationsExtractCallback> ExtractCallback;
+
+ CHashBundle Hash;
+ UString FirstFilePath;
+
HRESULT Result;
- bool MoveMode;
+
- CPanelCopyThread(): MoveMode(false), Result(E_FAIL) {}
+ CPanelCopyThread(): Result(E_FAIL) {}
};
HRESULT CPanelCopyThread::ProcessVirt()
{
- if (MoveMode)
- Result = FolderOperations->MoveTo(&Indices.Front(), Indices.Size(), DestPath, ExtractCallback);
+ /*
+ CMyComPtr<IFolderSetReplaceAltStreamCharsMode> iReplace;
+ FolderOperations.QueryInterface(IID_IFolderSetReplaceAltStreamCharsMode, &iReplace);
+ if (iReplace)
+ {
+ RINOK(iReplace->SetReplaceAltStreamCharsMode(ReplaceAltStreamChars ? 1 : 0));
+ }
+ */
+
+ if (options->testMode)
+ {
+ CMyComPtr<IArchiveFolder> archiveFolder;
+ FolderOperations.QueryInterface(IID_IArchiveFolder, &archiveFolder);
+ if (!archiveFolder)
+ return E_NOTIMPL;
+ CMyComPtr<IFolderArchiveExtractCallback> extractCallback2;
+ RINOK(ExtractCallback.QueryInterface(IID_IFolderArchiveExtractCallback, &extractCallback2));
+ NExtract::NPathMode::EEnum pathMode =
+ NExtract::NPathMode::kCurPaths;
+ // NExtract::NPathMode::kFullPathnames;
+ Result = archiveFolder->Extract(&Indices.Front(), Indices.Size(),
+ BoolToInt(options->includeAltStreams),
+ BoolToInt(options->replaceAltStreamChars),
+ pathMode, NExtract::NOverwriteMode::kAsk,
+ options->folder, BoolToInt(true), extractCallback2);
+ }
else
- Result = FolderOperations->CopyTo(&Indices.Front(), Indices.Size(), DestPath, ExtractCallback);
+ Result = FolderOperations->CopyTo(
+ BoolToInt(options->moveMode),
+ &Indices.Front(), Indices.Size(),
+ BoolToInt(options->includeAltStreams),
+ BoolToInt(options->replaceAltStreamChars),
+ options->folder, ExtractCallback);
+
+ if (Result == S_OK && !ExtractCallbackSpec->ThereAreMessageErrors &&
+ (!options->hashMethods.IsEmpty() || options->testMode))
+ {
+ CProgressMessageBoxPair &pair = GetMessagePair(false); // GetMessagePair(ExtractCallbackSpec->Hash.NumErrors != 0);
+ AddHashBundleRes(pair.Message, Hash, FirstFilePath);
+ }
+
return Result;
}
-HRESULT CPanel::CopyTo(const CRecordVector<UInt32> &indices, const UString &folder,
- bool moveMode, bool showErrorMessages, UStringVector *messages,
+static void ThrowException_if_Error(HRESULT res)
+{
+ if (res != S_OK)
+ throw CSystemException(res);
+}
+
+HRESULT CPanel::CopyTo(CCopyToOptions &options, const CRecordVector<UInt32> &indices,
+ UStringVector *messages,
bool &usePassword, UString &password)
{
CMyComPtr<IFolderOperations> folderOperations;
if (_folder.QueryInterface(IID_IFolderOperations, &folderOperations) != S_OK)
{
- UString errorMessage = LangString(IDS_OPERATION_IS_NOT_SUPPORTED, 0x03020208);
- if (showErrorMessages)
+ UString errorMessage = LangString(IDS_OPERATION_IS_NOT_SUPPORTED);
+ if (options.showErrorMessages)
MessageBox(errorMessage);
else if (messages != 0)
messages->Add(errorMessage);
@@ -56,27 +104,88 @@ HRESULT CPanel::CopyTo(const CRecordVector<UInt32> &indices, const UString &fold
{
CPanelCopyThread extracter;
-
extracter.ExtractCallbackSpec = new CExtractCallbackImp;
extracter.ExtractCallback = extracter.ExtractCallbackSpec;
+
+ extracter.options = &options;
extracter.ExtractCallbackSpec->ProgressDialog = &extracter.ProgressDialog;
extracter.ProgressDialog.CompressingMode = false;
+
+ extracter.ExtractCallbackSpec->StreamMode = options.streamMode;
+
+ #ifdef EXTERNAL_CODECS
+ CExternalCodecs __externalCodecs;
+ #else
+ CMyComPtr<IUnknown> compressCodecsInfo;
+ #endif
+
+ if (indices.Size() == 1)
+ extracter.FirstFilePath = GetItemRelPath(indices[0]);
+
+ if (options.VirtFileSystem)
+ {
+ extracter.ExtractCallbackSpec->VirtFileSystem = options.VirtFileSystem;
+ extracter.ExtractCallbackSpec->VirtFileSystemSpec = options.VirtFileSystemSpec;
+ }
+ extracter.ExtractCallbackSpec->ProcessAltStreams = options.includeAltStreams;
+
+ if (!options.hashMethods.IsEmpty())
+ {
+ {
+ CCodecs *codecs = new CCodecs;
+ ThrowException_if_Error(codecs->Load());
+ #ifdef EXTERNAL_CODECS
+ __externalCodecs.GetCodecs = codecs;
+ __externalCodecs.GetHashers = codecs;
+ ThrowException_if_Error(__externalCodecs.LoadCodecs());
+ #else
+ compressCodecsInfo = codecs;
+ #endif
+ }
+
+ extracter.Hash.SetMethods(EXTERNAL_CODECS_VARS options.hashMethods);
+ extracter.ExtractCallbackSpec->SetHashMethods(&extracter.Hash);
+ }
+ else if (options.testMode)
+ {
+ extracter.ExtractCallbackSpec->SetHashCalc(&extracter.Hash);
+ }
+
+ extracter.Hash.Init();
+
- UString title = moveMode ?
- LangString(IDS_MOVING, 0x03020206):
- LangString(IDS_COPYING, 0x03020205);
- UString progressWindowTitle = LangString(IDS_APP_TITLE, 0x03000000);
+ UString title;
+ {
+ UInt32 titleID = IDS_COPYING;
+ if (options.moveMode)
+ titleID = IDS_MOVING;
+ else if (!options.hashMethods.IsEmpty() && options.streamMode)
+ {
+ titleID = IDS_CHECKSUM_CALCULATING;
+ if (options.hashMethods.Size() == 1)
+ {
+ const UString &s = options.hashMethods[0];
+ if (s != L"*")
+ title = s;
+ }
+ }
+ else if (options.testMode)
+ titleID = IDS_PROGRESS_TESTING;
+
+ if (title.IsEmpty())
+ title = LangString(titleID);
+ }
+
+ UString progressWindowTitle = L"7-Zip"; // LangString(IDS_APP_TITLE);
extracter.ProgressDialog.MainWindow = GetParent();
extracter.ProgressDialog.MainTitle = progressWindowTitle;
- extracter.ProgressDialog.MainAddTitle = title + L" ";
+ extracter.ProgressDialog.MainAddTitle = title + L' ';
- extracter.ExtractCallbackSpec->OverwriteMode = NExtract::NOverwriteMode::kAskBefore;
+ extracter.ExtractCallbackSpec->OverwriteMode = NExtract::NOverwriteMode::kAsk;
extracter.ExtractCallbackSpec->Init();
extracter.Indices = indices;
- extracter.DestPath = folder;
extracter.FolderOperations = folderOperations;
- extracter.MoveMode = moveMode;
extracter.ExtractCallbackSpec->PasswordIsDefined = usePassword;
extracter.ExtractCallbackSpec->Password = password;
@@ -93,6 +202,7 @@ HRESULT CPanel::CopyTo(const CRecordVector<UInt32> &indices, const UString &fold
password = extracter.ExtractCallbackSpec->Password;
}
}
+
RefreshTitleAlways();
return res;
}
@@ -108,6 +218,7 @@ struct CThreadUpdate
CMyComPtr<IFolderArchiveUpdateCallback> UpdateCallback;
CUpdateCallback100Imp *UpdateCallbackSpec;
HRESULT Result;
+ bool MoveMode;
void Process()
{
@@ -115,6 +226,7 @@ struct CThreadUpdate
{
CProgressCloser closer(ProgressDialog);
Result = FolderOperations->CopyFrom(
+ MoveMode,
FolderPrefix,
&FileNamePointers.Front(),
FileNamePointers.Size(),
@@ -129,7 +241,7 @@ struct CThreadUpdate
}
};
-HRESULT CPanel::CopyFrom(const UString &folderPrefix, const UStringVector &filePaths,
+HRESULT CPanel::CopyFrom(bool moveMode, const UString &folderPrefix, const UStringVector &filePaths,
bool showErrorMessages, UStringVector *messages)
{
CMyComPtr<IFolderOperations> folderOperations;
@@ -140,28 +252,29 @@ HRESULT CPanel::CopyFrom(const UString &folderPrefix, const UStringVector &fileP
else
{
CThreadUpdate updater;
+ updater.MoveMode = moveMode;
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);
+ UString title = LangString(IDS_COPYING);
+ UString progressWindowTitle = L"7-Zip"; // LangString(IDS_APP_TITLE);
updater.ProgressDialog.MainWindow = GetParent();
updater.ProgressDialog.MainTitle = progressWindowTitle;
- updater.ProgressDialog.MainAddTitle = title + UString(L" ");
+ updater.ProgressDialog.MainAddTitle = title + UString(L' ');
updater.UpdateCallbackSpec->Init(false, L"");
updater.FolderOperations = folderOperations;
updater.FolderPrefix = folderPrefix;
- updater.FileNames.Reserve(filePaths.Size());
- int i;
- for(i = 0; i < filePaths.Size(); i++)
- updater.FileNames.Add(filePaths[i]);
- updater.FileNamePointers.Reserve(updater.FileNames.Size());
- for(i = 0; i < updater.FileNames.Size(); i++)
- updater.FileNamePointers.Add(updater.FileNames[i]);
+ updater.FileNames.ClearAndReserve(filePaths.Size());
+ unsigned i;
+ for (i = 0; i < filePaths.Size(); i++)
+ updater.FileNames.AddInReserved(filePaths[i]);
+ updater.FileNamePointers.ClearAndReserve(updater.FileNames.Size());
+ for (i = 0; i < updater.FileNames.Size(); i++)
+ updater.FileNamePointers.AddInReserved(updater.FileNames[i]);
NWindows::CThread thread;
RINOK(thread.Create(CThreadUpdate::MyThreadFunction, &updater));
@@ -175,7 +288,7 @@ HRESULT CPanel::CopyFrom(const UString &folderPrefix, const UStringVector &fileP
if (res == E_NOINTERFACE)
{
- UString errorMessage = LangString(IDS_OPERATION_IS_NOT_SUPPORTED, 0x03020208);
+ UString errorMessage = LangString(IDS_OPERATION_IS_NOT_SUPPORTED);
if (showErrorMessages)
MessageBox(errorMessage);
else if (messages != 0)
@@ -194,11 +307,13 @@ void CPanel::CopyFromNoAsk(const UStringVector &filePaths)
CSelectedState srcSelState;
SaveSelectedState(srcSelState);
- HRESULT result = CopyFrom(L"", filePaths, true, 0);
+ HRESULT result = CopyFrom(false, L"", filePaths, true, 0);
+
+ CDisableNotify disableNotify(*this);
if (result != S_OK)
{
- disableTimerProcessing.Restore();
+ disableNotify.Restore();
// For Password:
SetFocusToList();
if (result != E_ABORT)
@@ -208,14 +323,14 @@ void CPanel::CopyFromNoAsk(const UStringVector &filePaths)
RefreshListCtrl(srcSelState);
- disableTimerProcessing.Restore();
+ disableNotify.Restore();
SetFocusToList();
}
void CPanel::CopyFromAsk(const UStringVector &filePaths)
{
- UString title = LangString(IDS_CONFIRM_FILE_COPY, 0x03020222);
- UString message = LangString(IDS_WANT_TO_COPY_FILES, 0x03020223);
+ UString title = LangString(IDS_CONFIRM_FILE_COPY);
+ UString message = LangString(IDS_WANT_TO_COPY_FILES);
message += L"\n\'";
message += _currentFolderPrefix;
message += L"\' ?";