From f3b48f75a1ae6d9bbfd7be8190c6d567e34256ef Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Thu, 22 Feb 2018 19:52:35 +0100 Subject: [PATCH] Ref T258, use "which 7za" on UNIX systems --- src/blackmisc/compressutils.cpp | 35 ++++++++++++++++++++++++++------- src/blackmisc/compressutils.h | 6 +++++- 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/src/blackmisc/compressutils.cpp b/src/blackmisc/compressutils.cpp index d88ff86d8..0c271b554 100644 --- a/src/blackmisc/compressutils.cpp +++ b/src/blackmisc/compressutils.cpp @@ -35,10 +35,11 @@ namespace BlackMisc { const QFileInfo fi(file); if (!fi.exists()) { return false; } + if (!CCompressUtils::hasZip7(stdOutAndError)) { return false; } const bool win = CBuildConfig::isRunningOnWindowsNtPlatform(); const QString d = - d.isEmpty() ? d : + directory.isEmpty() ? directory : win ? CFileUtils::toWindowsLocalPath(directory) : directory; const QString f = win ? CFileUtils::toWindowsLocalPath(file) : file; @@ -58,15 +59,14 @@ namespace BlackMisc if (zipProcess.exitStatus() != QProcess::NormalExit) { return false; } if (!finished) { return false; } const int r = zipProcess.exitCode(); - const QString pStdout = zipProcess.readAllStandardOutput(); - const QString pStderr = zipProcess.readAllStandardError(); if (stdOutAndError) { + const QString pStdout = zipProcess.readAllStandardOutput(); + const QString pStderr = zipProcess.readAllStandardError(); stdOutAndError->clear(); stdOutAndError->push_back(pStdout); stdOutAndError->push_back(pStderr); } - return r == 0; } else @@ -77,19 +77,40 @@ namespace BlackMisc } } - bool CCompressUtils::hasZip7() + bool CCompressUtils::hasZip7(QStringList *stdOutAndError) { // just display info const bool win = CBuildConfig::isRunningOnWindowsNtPlatform(); - const QString cmd = win ? QStringLiteral("7za.exe") : QStringLiteral("7za"); + if (!win) { return CCompressUtils::whichZip7(stdOutAndError); } + QStringList args; args << "i"; QProcess zipProcess; - zipProcess.start(cmd, args); + zipProcess.start("7za.exe", args); const bool finished = zipProcess.waitForFinished(); if (zipProcess.exitStatus() != QProcess::NormalExit) { return false; } if (!finished) { return false; } const int r = zipProcess.exitCode(); return r == 0; } + + bool CCompressUtils::whichZip7(QStringList *stdOutAndError) + { + const QString cmd("which 7za"); + QProcess zipProcess; + zipProcess.start(cmd); + const bool finished = zipProcess.waitForFinished(); + if (!finished) { return false; } + + const QString pStdout = zipProcess.readAllStandardOutput(); + const QString pStderr = zipProcess.readAllStandardError(); + if (stdOutAndError) + { + stdOutAndError->clear(); + stdOutAndError->push_back(pStdout); + stdOutAndError->push_back(pStderr); + } + const int r = zipProcess.exitCode(); + return r == 0 && pStdout.contains("7za", Qt::CaseInsensitive); + } } // ns diff --git a/src/blackmisc/compressutils.h b/src/blackmisc/compressutils.h index 66b0b0e80..a5fc30939 100644 --- a/src/blackmisc/compressutils.h +++ b/src/blackmisc/compressutils.h @@ -32,7 +32,11 @@ namespace BlackMisc //! External program existing? //! \remark relies on external 7zip command line - static bool hasZip7(); + static bool hasZip7(QStringList *stdOutAndError = nullptr); + + //! Uses which to determine if 7Zip exists + //! \remark for UNIX systems, using which + static bool whichZip7(QStringList *stdOutAndError = nullptr); private: //! Ctor