diff options
Diffstat (limited to 'tools/archivegen/archive.cpp')
-rw-r--r-- | tools/archivegen/archive.cpp | 162 |
1 files changed, 148 insertions, 14 deletions
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; } |