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/Common/CompressCall2.cpp')
-rw-r--r--[-rwxr-xr-x]CPP/7zip/UI/Common/CompressCall2.cpp148
1 files changed, 103 insertions, 45 deletions
diff --git a/CPP/7zip/UI/Common/CompressCall2.cpp b/CPP/7zip/UI/Common/CompressCall2.cpp
index ab483d2f..bd27f37b 100755..100644
--- a/CPP/7zip/UI/Common/CompressCall2.cpp
+++ b/CPP/7zip/UI/Common/CompressCall2.cpp
@@ -2,13 +2,14 @@
#include "StdAfx.h"
-#include "Common/MyException.h"
+#include "../../../Common/MyException.h"
#include "../../UI/common/ArchiveCommandLine.h"
#include "../../UI/GUI/BenchmarkDialog.h"
#include "../../UI/GUI/ExtractGUI.h"
#include "../../UI/GUI/UpdateGUI.h"
+#include "../../UI/GUI/HashGUI.h"
#include "../../UI/GUI/ExtractRes.h"
@@ -16,20 +17,38 @@
extern HWND g_HWND;
-#define MY_TRY_BEGIN try {
+#define MY_TRY_BEGIN HRESULT result; try {
#define MY_TRY_FINISH } \
catch(CSystemException &e) { result = e.ErrorCode; } \
catch(...) { result = E_FAIL; } \
if (result != S_OK && result != E_ABORT) \
ErrorMessageHRESULT(result);
+static void ThrowException_if_Error(HRESULT res)
+{
+ if (res != S_OK)
+ throw CSystemException(res);
+}
+
#define CREATE_CODECS \
CCodecs *codecs = new CCodecs; \
- CMyComPtr<IUnknown> compressCodecsInfo = codecs; \
- result = codecs->Load(); \
- if (result != S_OK) \
- throw CSystemException(result);
+ CMyComPtr<ICompressCodecsInfo> compressCodecsInfo = codecs; \
+ ThrowException_if_Error(codecs->Load());
+
+#ifdef EXTERNAL_CODECS
+#define LOAD_EXTERNAL_CODECS \
+ CExternalCodecs __externalCodecs; \
+ __externalCodecs.GetCodecs = codecs; \
+ __externalCodecs.GetHashers = codecs; \
+ ThrowException_if_Error(__externalCodecs.LoadCodecs());
+
+#else
+
+LOAD_EXTERNAL_CODECS
+
+#endif
+
UString GetQuotedString(const UString &s)
{
return UString(L'\"') + s + UString(L'\"');
@@ -45,19 +64,19 @@ static void ErrorMessageHRESULT(HRESULT res)
ErrorMessage(HResultToMessage(res));
}
-static void ErrorLangMessage(UINT resourceID, UInt32 langID)
+static void ErrorLangMessage(UINT resourceID)
{
- ErrorMessage(LangString(resourceID, langID));
+ ErrorMessage(LangString(resourceID));
}
HRESULT CompressFiles(
const UString &arcPathPrefix,
const UString &arcName,
const UString &arcType,
+ bool addExtension,
const UStringVector &names,
bool email, bool showDialog, bool /* waitFinish */)
{
- HRESULT result;
MY_TRY_BEGIN
CREATE_CODECS
@@ -67,26 +86,35 @@ HRESULT CompressFiles(
CUpdateOptions uo;
uo.EMailMode = email;
- uo.SetAddActionCommand();
+ uo.SetActionCommand_Add();
- CIntVector formatIndices;
- if (!codecs->FindFormatForArchiveType(arcType, formatIndices))
+ uo.ArcNameMode = (addExtension ? k_ArcNameMode_Add : k_ArcNameMode_Exact);
+
+ CObjectVector<COpenType> formatIndices;
+ if (!ParseOpenTypes(*codecs, arcType, formatIndices))
{
- ErrorLangMessage(IDS_UNSUPPORTED_ARCHIVE_TYPE, 0x0200060D);
+ ErrorLangMessage(IDS_UNSUPPORTED_ARCHIVE_TYPE);
return E_FAIL;
}
- if (!uo.Init(codecs, formatIndices, arcPathPrefix + arcName))
+ const UString arcPath = arcPathPrefix + arcName;
+ if (!uo.InitFormatIndex(codecs, formatIndices, arcPath) ||
+ !uo.SetArcPath(codecs, arcPath))
{
- ErrorLangMessage(IDS_UPDATE_NOT_SUPPORTED, 0x02000601);
+ ErrorLangMessage(IDS_UPDATE_NOT_SUPPORTED);
return E_FAIL;
}
NWildcard::CCensor censor;
- for (int i = 0; i < names.Size(); i++)
- censor.AddItem(true, names[i], false);
+ FOR_VECTOR (i, names)
+ {
+ censor.AddPreItem(names[i]);
+ }
bool messageWasDisplayed = false;
- result = UpdateGUI(codecs, censor, uo, showDialog, messageWasDisplayed, &callback, g_HWND);
+
+ result = UpdateGUI(codecs,
+ formatIndices, arcPath,
+ censor, uo, showDialog, messageWasDisplayed, &callback, g_HWND);
if (result != S_OK)
{
@@ -105,15 +133,16 @@ HRESULT CompressFiles(
}
static HRESULT ExtractGroupCommand(const UStringVector &arcPaths,
- bool showDialog, const UString &outFolder, bool testMode)
+ bool showDialog, const UString &outFolder, bool testMode, bool elimDup = false)
{
- HRESULT result;
MY_TRY_BEGIN
CREATE_CODECS
CExtractOptions eo;
eo.OutputDir = us2fs(outFolder);
eo.TestMode = testMode;
+ eo.ElimDup.Val = elimDup;
+ eo.ElimDup.Def = elimDup;
CExtractCallbackImp *ecs = new CExtractCallbackImp;
CMyComPtr<IFolderArchiveExtractCallback> extractCallback = ecs;
@@ -125,20 +154,29 @@ static HRESULT ExtractGroupCommand(const UStringVector &arcPaths,
UStringVector arcPathsSorted;
UStringVector arcFullPathsSorted;
{
- NWildcard::CCensor acrCensor;
- for (int i = 0; i < arcPaths.Size(); i++)
- acrCensor.AddItem(true, arcPaths[i], false);
- EnumerateDirItemsAndSort(acrCensor, arcPathsSorted, arcFullPathsSorted);
+ NWildcard::CCensor arcCensor;
+ FOR_VECTOR (i, arcPaths)
+ {
+ arcCensor.AddPreItem(arcPaths[i]);
+ }
+ arcCensor.AddPathsToCensor(NWildcard::k_RelatPath);
+ EnumerateDirItemsAndSort(false, arcCensor, NWildcard::k_RelatPath, UString(), arcPathsSorted, arcFullPathsSorted);
}
- CIntVector formatIndices;
-
+ CObjectVector<COpenType> formatIndices;
+
NWildcard::CCensor censor;
- censor.AddItem(true, L"*", false);
+ {
+ censor.AddPreItem_Wildcard();
+ }
+ censor.AddPathsToCensor(NWildcard::k_RelatPath);
+
bool messageWasDisplayed = false;
- result = ExtractGUI(codecs, formatIndices, arcPathsSorted, arcFullPathsSorted,
- censor.Pairs.Front().Head, eo, showDialog, messageWasDisplayed, ecs, g_HWND);
+ result = ExtractGUI(codecs,
+ formatIndices, CIntVector(),
+ arcPathsSorted, arcFullPathsSorted,
+ censor.Pairs.Front().Head, eo, NULL, showDialog, messageWasDisplayed, ecs, g_HWND);
if (result != S_OK)
{
if (result != E_ABORT && messageWasDisplayed)
@@ -150,26 +188,51 @@ static HRESULT ExtractGroupCommand(const UStringVector &arcPaths,
return result;
}
-HRESULT ExtractArchives(const UStringVector &arcPaths, const UString &outFolder, bool showDialog)
+void ExtractArchives(const UStringVector &arcPaths, const UString &outFolder, bool showDialog, bool elimDup)
{
- return ExtractGroupCommand(arcPaths, showDialog, outFolder, false);
+ ExtractGroupCommand(arcPaths, showDialog, outFolder, false, elimDup);
}
-HRESULT TestArchives(const UStringVector &arcPaths)
+void TestArchives(const UStringVector &arcPaths)
{
- return ExtractGroupCommand(arcPaths, true, UString(), true);
+ ExtractGroupCommand(arcPaths, true, UString(), true);
}
-HRESULT Benchmark(bool totalMode)
+void CalcChecksum(const UStringVector &paths, const UString &methodName)
{
- HRESULT result;
MY_TRY_BEGIN
CREATE_CODECS
+ LOAD_EXTERNAL_CODECS
- #ifdef EXTERNAL_CODECS
- CObjectVector<CCodecInfoEx> externalCodecs;
- RINOK(LoadExternalCodecs(codecs, externalCodecs));
- #endif
+ NWildcard::CCensor censor;
+ FOR_VECTOR (i, paths)
+ {
+ censor.AddPreItem(paths[i]);
+ }
+
+ censor.AddPathsToCensor(NWildcard::k_RelatPath);
+ bool messageWasDisplayed = false;
+
+ CHashOptions options;
+ options.Methods.Add(methodName);
+
+ result = HashCalcGUI(EXTERNAL_CODECS_VARS censor, options, messageWasDisplayed);
+ if (result != S_OK)
+ {
+ if (result != E_ABORT && messageWasDisplayed)
+ return; // E_FAIL;
+ throw CSystemException(result);
+ }
+ MY_TRY_FINISH
+ return; // result;
+}
+
+void Benchmark(bool totalMode)
+{
+ MY_TRY_BEGIN
+ CREATE_CODECS
+ LOAD_EXTERNAL_CODECS
+
CObjectVector<CProperty> props;
if (totalMode)
{
@@ -178,11 +241,6 @@ HRESULT Benchmark(bool totalMode)
prop.Value = L"*";
props.Add(prop);
}
- result = Benchmark(
- #ifdef EXTERNAL_CODECS
- codecs, &externalCodecs,
- #endif
- props, g_HWND);
+ result = Benchmark(EXTERNAL_CODECS_VARS props, g_HWND);
MY_TRY_FINISH
- return result;
}