summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKarsten Heimrich <karsten.heimrich@theqtcompany.com>2015-06-10 12:14:16 +0200
committerKarsten Heimrich <karsten.heimrich@theqtcompany.com>2015-06-10 12:53:28 +0000
commit97b5fe3ebc452d74d70cc7e5a325599ba607cea1 (patch)
treec6207e934e4fc6726df36ca83568b4abc3a1617d
parenta893c90bfa27a6088597eb34355ee4a353712ea5 (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.pri9
-rw-r--r--src/libs/installer/lib7z_facade.h18
-rw-r--r--tools/archivegen/archive.cpp162
-rw-r--r--tools/archivegen/archivegen.pro1
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