diff options
author | Karsten Heimrich <karsten.heimrich@theqtcompany.com> | 2015-06-10 12:14:16 +0200 |
---|---|---|
committer | Karsten Heimrich <karsten.heimrich@theqtcompany.com> | 2015-06-10 12:53:28 +0000 |
commit | 97b5fe3ebc452d74d70cc7e5a325599ba607cea1 (patch) | |
tree | c6207e934e4fc6726df36ca83568b4abc3a1617d | |
parent | a893c90bfa27a6088597eb34355ee4a353712ea5 (diff) |
Update archivegen.
Stop on file errors. Better verbose/ help output. Add support
for compression level. Do not hide symbols in statically build
lib7z to use e.g. CPercentPrinter symbol in dynamic IFW builds.
Task-number: QTIFW-695
Change-Id: I18e2ea58b5f1880bfb7f3ed84e34b8810f864188
Reviewed-by: Kai Koehne <kai.koehne@theqtcompany.com>
-rw-r--r-- | src/libs/7zip/7zip.pri | 9 | ||||
-rw-r--r-- | src/libs/installer/lib7z_facade.h | 18 | ||||
-rw-r--r-- | tools/archivegen/archive.cpp | 162 | ||||
-rw-r--r-- | tools/archivegen/archivegen.pro | 1 |
4 files changed, 172 insertions, 18 deletions
diff --git a/src/libs/7zip/7zip.pri b/src/libs/7zip/7zip.pri index 85574ce5e..26c052fc7 100644 --- a/src/libs/7zip/7zip.pri +++ b/src/libs/7zip/7zip.pri @@ -4,7 +4,6 @@ win32 { 7ZIP_BASE=$$PWD/win INCLUDEPATH += $$7ZIP_BASE/C $$7ZIP_BASE/CPP DEFINES += WIN_LONG_PATH _CRT_SECURE_NO_WARNINGS - win32-g++*:QMAKE_CXXFLAGS += -w -fvisibility=hidden QMAKE_CXXFLAGS_RELEASE -= -Zc:strictStrings QMAKE_CXXFLAGS_RELEASE_WITH_DEBUGINFO -= -Zc:strictStrings @@ -18,9 +17,11 @@ unix { $$7ZIP_BASE/CPP/myWindows \ $$7ZIP_BASE/CPP/include_windows - QMAKE_CFLAGS += -w - QMAKE_CXXFLAGS += -fvisibility=hidden -w - macx:DEFINES += ENV_MACOSX DEFINES += _FILE_OFFSET_BITS=64 _LARGEFILE_SOURCE NDEBUG _REENTRANT ENV_UNIX UNICODE } + +unix|win32-g++* { + QMAKE_CFLAGS += -w + QMAKE_CXXFLAGS += -w +} diff --git a/src/libs/installer/lib7z_facade.h b/src/libs/installer/lib7z_facade.h index b252e7696..527cf65ab 100644 --- a/src/libs/installer/lib7z_facade.h +++ b/src/libs/installer/lib7z_facade.h @@ -37,6 +37,9 @@ #include "installer_global.h" #include "errors.h" +#include <Common/MyWindows.h> +#include <7zip/UI/Console/PercentPrinter.h> + QT_BEGIN_NAMESPACE class QFileDevice; QT_END_NAMESPACE @@ -59,6 +62,21 @@ namespace Lib7z {} }; + class INSTALLER_EXPORT PercentPrinter : public CPercentPrinter + { + public: + PercentPrinter() : CPercentPrinter(1 << 16) { + OutStream = &g_StdOut; + } + + void PrintRatio() { CPercentPrinter::PrintRatio(); } + void ClosePrint() { CPercentPrinter::ClosePrint(); } + void RePrintRatio() { CPercentPrinter::RePrintRatio(); } + void PrintNewLine() { CPercentPrinter::PrintNewLine(); } + void PrintString(const char *s) { CPercentPrinter::PrintString(s); } + void PrintString(const wchar_t *s) { CPercentPrinter::PrintString(s); } + }; + } // namespace Lib7z #endif // LIB7Z_FACADE_H diff --git a/tools/archivegen/archive.cpp b/tools/archivegen/archive.cpp index 256fd5201..b6ae31bfa 100644 --- a/tools/archivegen/archive.cpp +++ b/tools/archivegen/archive.cpp @@ -31,43 +31,177 @@ ** $QT_END_LICENSE$ ** **************************************************************************/ -#include "common/repositorygen.h" #include <errors.h> -#include <init.h> #include <lib7z_create.h> +#include <lib7z_facade.h> #include <utils.h> #include <QCoreApplication> -#include <QFileInfo> +#include <QCommandLineParser> #include <iostream> using namespace QInstaller; -static void printUsage() +class FailOnErrorCallback : public Lib7z::UpdateCallback { - std::cout << "Usage: " << QFileInfo(QCoreApplication::applicationFilePath()).fileName() - << " directory.7z [files | directories]" << std::endl; -} + HRESULT OpenFileError(const wchar_t*, DWORD) { + return S_FALSE; + } + + HRESULT CanNotFindError(const wchar_t*, DWORD) { + return S_FALSE; + } + + HRESULT OpenResult(const wchar_t*, HRESULT result, const wchar_t*) { + return result; + } +}; + +class VerbosePrinterCallback : public Lib7z::UpdateCallback +{ +public: + ~VerbosePrinterCallback() { + m_PercentPrinter.ClosePrint(); + } + +private: + HRESULT SetTotal(UInt64 size) { + m_PercentPrinter.SetTotal(size); + return S_OK; + } + + HRESULT SetCompleted(const UInt64 *size) { + if (size) { + m_PercentPrinter.SetRatio(*size); + m_PercentPrinter.PrintRatio(); + } + return S_OK; + } + + HRESULT OpenResult(const wchar_t *file, HRESULT result, const wchar_t*) { + if (result != S_OK) { + printBlock(QCoreApplication::translate("archivegen", "Cannot update file: '%1'. " + "Unsuporrted archive.").arg(QString::fromWCharArray(file)), Q_NULLPTR); + } + return result; + } + + HRESULT OpenFileError(const wchar_t *file, DWORD) { + printBlock(QCoreApplication::translate("archivegen", "Cannot open file: "), file); + return S_FALSE; + } + + HRESULT CanNotFindError(const wchar_t *file, DWORD) { + printBlock(QCoreApplication::translate("archivegen", "Cannot find file: "), file); + return S_FALSE; + } + + HRESULT StartArchive(const wchar_t *name, bool) { + printLine(QCoreApplication::translate("archivegen", "Create archive.")); + if (name) { + m_PercentPrinter.PrintNewLine(); + m_PercentPrinter.PrintString(name); + } + return S_OK; + } + + HRESULT FinishArchive() { + m_PercentPrinter.PrintNewLine(); + printLine(QCoreApplication::translate("archivegen", "Finished archive.")); + return S_OK; + } + + void printLine(const QString &message) { + m_PercentPrinter.PrintString(message.toStdWString().c_str()); + } + + void printBlock(const QString &message, const wchar_t *message2) { + m_PercentPrinter.PrintNewLine(); + m_PercentPrinter.PrintString(message.toStdWString().c_str()); + if (message2) + m_PercentPrinter.PrintString(message2); + m_PercentPrinter.PrintNewLine(); + } + + Lib7z::PercentPrinter m_PercentPrinter; +}; int main(int argc, char *argv[]) { try { QCoreApplication app(argc, argv); +#define QUOTE_(x) #x +#define QUOTE(x) QUOTE_(x) + QCoreApplication::setApplicationVersion(QLatin1String(QUOTE(IFW_VERSION_STR))); +#undef QUOTE +#undef QUOTE_ + + QCommandLineParser parser; + const QCommandLineOption help = parser.addHelpOption(); + const QCommandLineOption version = parser.addVersionOption(); + QCommandLineOption verbose(QLatin1String("verbose"), + QCoreApplication::translate("archivegen", "Verbose mode. Prints out more information.")); + const QCommandLineOption compression = QCommandLineOption(QStringList() + << QLatin1String("c") << QLatin1String("compression"), + QCoreApplication::translate("archivegen", + "0 (No compression)\n" + "1 (Fastest compressing)\n" + "3 (Fast compressing)\n" + "5 (Normal compressing)\n" + "7 (Maximum compressing)\n" + "9 (Ultra compressing)\n" + "Defaults to 5 (Normal compression)." + ), QLatin1String("5"), QLatin1String("5")); + + parser.addOption(verbose); + parser.addOption(compression); + parser.addPositionalArgument(QLatin1String("archive"), + QCoreApplication::translate("archivegen", "Compressed archive to create.")); + parser.addPositionalArgument(QLatin1String("sources"), + QCoreApplication::translate("archivegen", "List of files and directories to compress.")); + + parser.parse(app.arguments()); + if (parser.isSet(help)) { + std::cout << parser.helpText() << std::endl; + return EXIT_SUCCESS; + } - if (app.arguments().count() < 3) { - printUsage(); + if (parser.isSet(version)) { + parser.showVersion(); + return EXIT_SUCCESS; + } + + const QStringList args = parser.positionalArguments(); + if (args.count() < 2) { + std::cerr << QCoreApplication::translate("archivegen", "Wrong argument count. See " + "'archivgen --help'.") << std::endl; return EXIT_FAILURE; } - QInstaller::init(); - QInstaller::setVerbose(true); - const QStringList sourceDirectories = app.arguments().mid(2); - Lib7z::createArchive(app.arguments().at(1), sourceDirectories, Lib7z::QTmpFile::No); + bool ok = false; + const int values[6] = { 0, 1, 3, 5, 7, 9 }; + const int value = parser.value(compression).toInt(&ok); + if (!ok || (std::find(std::begin(values), std::end(values), value) == std::end(values))) { + throw QInstaller::Error(QCoreApplication::translate("archivegen", + "Unknown compression level '%1'. See 'archivgen --help'.").arg(value)); + } + + Lib7z::initSevenZ(); + Lib7z::createArchive(args[0], args.mid(1), Lib7z::QTmpFile::No, Lib7z::Compression(value), + [&] () -> Lib7z::UpdateCallback * { + if (parser.isSet(verbose)) + return new VerbosePrinterCallback; + return new FailOnErrorCallback; + } () + ); return EXIT_SUCCESS; } catch (const QInstaller::Error &e) { - std::cerr << "Caught exception: " << e.message() << std::endl; + std::cerr << e.message() << std::endl; + } catch (...) { + std::cerr << QCoreApplication::translate("archivegen", "Unknown exception caught.") + << std::endl; } return EXIT_FAILURE; } diff --git a/tools/archivegen/archivegen.pro b/tools/archivegen/archivegen.pro index 135c34010..719b35a7f 100644 --- a/tools/archivegen/archivegen.pro +++ b/tools/archivegen/archivegen.pro @@ -7,6 +7,7 @@ include(../../installerfw.pri) QT -= gui QT += qml xml +LIBS += -l7z CONFIG += console DESTDIR = $$IFW_APP_PATH |