summaryrefslogtreecommitdiffstats
path: root/src/libs/7zip/win/CPP/7zip/UI/Common/CompressCall2.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/libs/7zip/win/CPP/7zip/UI/Common/CompressCall2.cpp')
-rw-r--r--src/libs/7zip/win/CPP/7zip/UI/Common/CompressCall2.cpp178
1 files changed, 178 insertions, 0 deletions
diff --git a/src/libs/7zip/win/CPP/7zip/UI/Common/CompressCall2.cpp b/src/libs/7zip/win/CPP/7zip/UI/Common/CompressCall2.cpp
new file mode 100644
index 000000000..473f7d933
--- /dev/null
+++ b/src/libs/7zip/win/CPP/7zip/UI/Common/CompressCall2.cpp
@@ -0,0 +1,178 @@
+// CompressCall.cpp
+
+#include "StdAfx.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/ExtractRes.h"
+
+#include "CompressCall.h"
+
+#define MY_TRY_BEGIN try {
+#define MY_TRY_FINISH } \
+ catch(CSystemException &e) { result = e.ErrorCode; } \
+ catch(...) { result = E_FAIL; } \
+ if (result != S_OK && result != E_ABORT) \
+ ErrorMessageHRESULT(result);
+
+#define CREATE_CODECS \
+ CCodecs *codecs = new CCodecs; \
+ CMyComPtr<IUnknown> compressCodecsInfo = codecs; \
+ result = codecs->Load(); \
+ if (result != S_OK) \
+ throw CSystemException(result);
+
+UString GetQuotedString(const UString &s)
+{
+ return UString(L'\"') + s + UString(L'\"');
+}
+
+static void ErrorMessage(LPCWSTR message)
+{
+ MessageBoxW(g_HWND, message, L"7-Zip", MB_ICONERROR);
+}
+
+static void ErrorMessageHRESULT(HRESULT res)
+{
+ ErrorMessage(HResultToMessage(res));
+}
+
+static void ErrorLangMessage(UINT resourceID, UInt32 langID)
+{
+ ErrorMessage(LangString(resourceID, langID));
+}
+
+HRESULT CompressFiles(
+ const UString &arcPathPrefix,
+ const UString &arcName,
+ const UString &arcType,
+ const UStringVector &names,
+ bool email, bool showDialog, bool /* waitFinish */)
+{
+ HRESULT result;
+ MY_TRY_BEGIN
+ CREATE_CODECS
+
+ CUpdateCallbackGUI callback;
+
+ callback.Init();
+
+ CUpdateOptions uo;
+ uo.EMailMode = email;
+ uo.SetAddActionCommand();
+
+ CIntVector formatIndices;
+ if (!codecs->FindFormatForArchiveType(arcType, formatIndices))
+ {
+ ErrorLangMessage(IDS_UNSUPPORTED_ARCHIVE_TYPE, 0x0200060D);
+ return E_FAIL;
+ }
+ if (!uo.Init(codecs, formatIndices, arcPathPrefix + arcName))
+ {
+ ErrorLangMessage(IDS_UPDATE_NOT_SUPPORTED, 0x02000601);
+ return E_FAIL;
+ }
+
+ NWildcard::CCensor censor;
+ for (int i = 0; i < names.Size(); i++)
+ censor.AddItem(true, names[i], false);
+
+ bool messageWasDisplayed = false;
+ result = UpdateGUI(codecs, censor, uo, showDialog, messageWasDisplayed, &callback, g_HWND);
+
+ if (result != S_OK)
+ {
+ if (result != E_ABORT && messageWasDisplayed)
+ return E_FAIL;
+ throw CSystemException(result);
+ }
+ if (callback.FailedFiles.Size() > 0)
+ {
+ if (!messageWasDisplayed)
+ throw CSystemException(E_FAIL);
+ return E_FAIL;
+ }
+ MY_TRY_FINISH
+ return S_OK;
+}
+
+static HRESULT ExtractGroupCommand(const UStringVector &arcPaths,
+ bool showDialog, const UString &outFolder, bool testMode)
+{
+ HRESULT result;
+ MY_TRY_BEGIN
+ CREATE_CODECS
+
+ CExtractOptions eo;
+ eo.OutputDir = outFolder;
+ eo.TestMode = testMode;
+
+ CExtractCallbackImp *ecs = new CExtractCallbackImp;
+ CMyComPtr<IFolderArchiveExtractCallback> extractCallback = ecs;
+
+ ecs->Init();
+
+ // eo.CalcCrc = options.CalcCrc;
+
+ 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);
+ }
+
+ CIntVector formatIndices;
+
+ NWildcard::CCensor censor;
+ censor.AddItem(true, L"*", false);
+
+ bool messageWasDisplayed = false;
+ result = ExtractGUI(codecs, formatIndices, arcPathsSorted, arcFullPathsSorted,
+ censor.Pairs.Front().Head, eo, showDialog, messageWasDisplayed, ecs, g_HWND);
+ if (result != S_OK)
+ {
+ if (result != E_ABORT && messageWasDisplayed)
+ return E_FAIL;
+ throw CSystemException(result);
+ }
+ return ecs->IsOK() ? S_OK : E_FAIL;
+ MY_TRY_FINISH
+ return result;
+}
+
+HRESULT ExtractArchives(const UStringVector &arcPaths, const UString &outFolder, bool showDialog)
+{
+ return ExtractGroupCommand(arcPaths, showDialog, outFolder, false);
+}
+
+HRESULT TestArchives(const UStringVector &arcPaths)
+{
+ return ExtractGroupCommand(arcPaths, true, UString(), true);
+}
+
+HRESULT Benchmark()
+{
+ HRESULT result;
+ MY_TRY_BEGIN
+ CREATE_CODECS
+
+ #ifdef EXTERNAL_CODECS
+ CObjectVector<CCodecInfoEx> externalCodecs;
+ RINOK(LoadExternalCodecs(codecs, externalCodecs));
+ #endif
+ result = Benchmark(
+ #ifdef EXTERNAL_CODECS
+ codecs, &externalCodecs,
+ #endif
+ (UInt32)-1, (UInt32)-1, g_HWND);
+ MY_TRY_FINISH
+ return result;
+}