// CompressCall2.cpp #include "StdAfx.h" #ifndef Z7_EXTERNAL_CODECS #include "../../../Common/MyException.h" #include "../../UI/Common/EnumDirItems.h" #include "../../UI/FileManager/LangUtils.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" #include "CompressCall.h" extern HWND g_HWND; #define MY_TRY_BEGIN HRESULT result; try { #define MY_TRY_FINISH } \ catch(CSystemException &e) { result = e.ErrorCode; } \ catch(UString &s) { ErrorMessage(s); result = E_FAIL; } \ 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); } #ifdef Z7_EXTERNAL_CODECS #define CREATE_CODECS \ CCodecs *codecs = new CCodecs; \ CMyComPtr compressCodecsInfo = codecs; \ ThrowException_if_Error(codecs->Load()); \ Codecs_AddHashArcHandler(codecs); #define LOAD_EXTERNAL_CODECS \ CExternalCodecs _externalCodecs; \ _externalCodecs.GetCodecs = codecs; \ _externalCodecs.GetHashers = codecs; \ ThrowException_if_Error(_externalCodecs.Load()); #else #define CREATE_CODECS \ CCodecs *codecs = new CCodecs; \ CMyComPtr compressCodecsInfo = codecs; \ ThrowException_if_Error(codecs->Load()); \ Codecs_AddHashArcHandler(codecs); #define LOAD_EXTERNAL_CODECS #endif UString GetQuotedString(const UString &s) { UString s2 ('\"'); s2 += s; s2.Add_Char('\"'); return s2; } 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) { 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 */) { MY_TRY_BEGIN CREATE_CODECS CUpdateCallbackGUI callback; callback.Init(); CUpdateOptions uo; uo.EMailMode = email; uo.SetActionCommand_Add(); uo.ArcNameMode = (addExtension ? k_ArcNameMode_Add : k_ArcNameMode_Exact); CObjectVector formatIndices; if (!ParseOpenTypes(*codecs, arcType, formatIndices)) { ErrorLangMessage(IDS_UNSUPPORTED_ARCHIVE_TYPE); return E_FAIL; } const UString arcPath = arcPathPrefix + arcName; if (!uo.InitFormatIndex(codecs, formatIndices, arcPath) || !uo.SetArcPath(codecs, arcPath)) { ErrorLangMessage(IDS_UPDATE_NOT_SUPPORTED); return E_FAIL; } NWildcard::CCensor censor; FOR_VECTOR (i, names) { censor.AddPreItem_NoWildcard(names[i]); } bool messageWasDisplayed = false; result = UpdateGUI(codecs, formatIndices, arcPath, 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, CExtractOptions &eo, const char *kType = NULL) { MY_TRY_BEGIN CREATE_CODECS CExtractCallbackImp *ecs = new CExtractCallbackImp; CMyComPtr extractCallback = ecs; ecs->Init(); // eo.CalcCrc = options.CalcCrc; UStringVector arcPathsSorted; UStringVector arcFullPathsSorted; { NWildcard::CCensor arcCensor; FOR_VECTOR (i, arcPaths) { arcCensor.AddPreItem_NoWildcard(arcPaths[i]); } arcCensor.AddPathsToCensor(NWildcard::k_RelatPath); CDirItemsStat st; EnumerateDirItemsAndSort(arcCensor, NWildcard::k_RelatPath, UString(), arcPathsSorted, arcFullPathsSorted, st, NULL // &scan: change it!!!! ); } CObjectVector formatIndices; if (kType) { if (!ParseOpenTypes(*codecs, UString(kType), formatIndices)) { throw CSystemException(E_INVALIDARG); // ErrorLangMessage(IDS_UNSUPPORTED_ARCHIVE_TYPE); // return E_INVALIDARG; } } NWildcard::CCensor censor; { censor.AddPreItem_Wildcard(); } censor.AddPathsToCensor(NWildcard::k_RelatPath); bool messageWasDisplayed = false; ecs->MultiArcMode = (arcPathsSorted.Size() > 1); 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) return E_FAIL; throw CSystemException(result); } return ecs->IsOK() ? S_OK : E_FAIL; MY_TRY_FINISH return result; } void ExtractArchives(const UStringVector &arcPaths, const UString &outFolder, bool showDialog, bool elimDup, UInt32 writeZone) { CExtractOptions eo; eo.OutputDir = us2fs(outFolder); eo.TestMode = false; eo.ElimDup.Val = elimDup; eo.ElimDup.Def = elimDup; if (writeZone != (UInt32)(Int32)-1) eo.ZoneMode = (NExtract::NZoneIdMode::EEnum)writeZone; ExtractGroupCommand(arcPaths, showDialog, eo); } void TestArchives(const UStringVector &arcPaths, bool hashMode) { CExtractOptions eo; eo.TestMode = true; ExtractGroupCommand(arcPaths, true, // showDialog eo, hashMode ? "hash" : NULL); } void CalcChecksum(const UStringVector &paths, const UString &methodName, const UString &arcPathPrefix, const UString &arcFileName) { MY_TRY_BEGIN if (!arcFileName.IsEmpty()) { CompressFiles( arcPathPrefix, arcFileName, UString("hash"), false, // addExtension, paths, false, // email, false, // showDialog, false // waitFinish ); return; } CREATE_CODECS LOAD_EXTERNAL_CODECS NWildcard::CCensor censor; FOR_VECTOR (i, paths) { censor.AddPreItem_NoWildcard(paths[i]); } censor.AddPathsToCensor(NWildcard::k_RelatPath); bool messageWasDisplayed = false; CHashOptions options; options.Methods.Add(methodName); /* if (!arcFileName.IsEmpty()) options.HashFilePath = arcPathPrefix + arcFileName; */ result = HashCalcGUI(EXTERNAL_CODECS_VARS_L 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 props; if (totalMode) { CProperty prop; prop.Name = "m"; prop.Value = "*"; props.Add(prop); } result = Benchmark( EXTERNAL_CODECS_VARS_L props, k_NumBenchIterations_Default, g_HWND); MY_TRY_FINISH } #endif