diff options
Diffstat (limited to 'tools')
-rw-r--r-- | tools/archivegen/archive.cpp | 130 | ||||
-rw-r--r-- | tools/devtool/binaryreplace.cpp | 39 | ||||
-rw-r--r-- | tools/repogen/repogen.cpp | 21 |
3 files changed, 62 insertions, 128 deletions
diff --git a/tools/archivegen/archive.cpp b/tools/archivegen/archive.cpp index e1a40a880..56aae1b21 100644 --- a/tools/archivegen/archive.cpp +++ b/tools/archivegen/archive.cpp @@ -27,102 +27,19 @@ **************************************************************************/ #include <errors.h> -#include <lib7z_create.h> +#include <archivefactory.h> #include <lib7z_facade.h> #include <utils.h> #include <QCoreApplication> #include <QCommandLineParser> #include <QDir> +#include <QMetaEnum> #include <iostream> using namespace QInstaller; -class FailOnErrorCallback : public Lib7z::UpdateCallback -{ - HRESULT OpenFileError(const wchar_t*, DWORD) Q_DECL_OVERRIDE { - return S_FALSE; - } - - HRESULT CanNotFindError(const wchar_t*, DWORD) Q_DECL_OVERRIDE { - return S_FALSE; - } - - HRESULT OpenResult(const wchar_t*, HRESULT result, const wchar_t*) Q_DECL_OVERRIDE { - return result; - } -}; - -class VerbosePrinterCallback : public Lib7z::UpdateCallback -{ -public: - ~VerbosePrinterCallback() { - m_PercentPrinter.ClosePrint(); - } - -private: - HRESULT SetTotal(UInt64 size) Q_DECL_OVERRIDE { - m_PercentPrinter.SetTotal(size); - return S_OK; - } - - HRESULT SetCompleted(const UInt64 *size) Q_DECL_OVERRIDE { - if (size) { - m_PercentPrinter.SetRatio(*size); - m_PercentPrinter.PrintRatio(); - } - return S_OK; - } - - HRESULT OpenResult(const wchar_t *file, HRESULT result, const wchar_t*) Q_DECL_OVERRIDE { - if (result != S_OK) { - printBlock(QCoreApplication::translate("archivegen", "Cannot update file \"%1\". " - "Unsupported archive.").arg(QDir::toNativeSeparators(QString::fromWCharArray(file))), Q_NULLPTR); - } - return result; - } - - HRESULT OpenFileError(const wchar_t *file, DWORD) Q_DECL_OVERRIDE { - printBlock(QCoreApplication::translate("archivegen", "Cannot open file "), file); - return S_FALSE; - } - - HRESULT CanNotFindError(const wchar_t *file, DWORD) Q_DECL_OVERRIDE { - printBlock(QCoreApplication::translate("archivegen", "Cannot find file "), file); - return S_FALSE; - } - - HRESULT StartArchive(const wchar_t *name, bool) Q_DECL_OVERRIDE { - printLine(QCoreApplication::translate("archivegen", "Create archive.")); - if (name) { - m_PercentPrinter.PrintNewLine(); - m_PercentPrinter.PrintString(name); - } - return S_OK; - } - - HRESULT FinishArchive() Q_DECL_OVERRIDE { - 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 { @@ -132,12 +49,16 @@ int main(int argc, char *argv[]) QCoreApplication::setApplicationVersion(QLatin1String(QUOTE(IFW_VERSION_STR))); #undef QUOTE #undef QUOTE_ - + const QString archiveFormats = ArchiveFactory::supportedTypes().join(QLatin1Char('|')); 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 format = QCommandLineOption(QStringList() + << QLatin1String("f") << QLatin1String("format"), + QCoreApplication::translate("archivegen", + "%1\n" + "Format for the archive. Defaults to 7z." + ).arg(archiveFormats), QLatin1String("format"), QLatin1String("7z")); const QCommandLineOption compression = QCommandLineOption(QStringList() << QLatin1String("c") << QLatin1String("compression"), QCoreApplication::translate("archivegen", @@ -147,10 +68,12 @@ int main(int argc, char *argv[]) "5 (Normal compressing)\n" "7 (Maximum compressing)\n" "9 (Ultra compressing)\n" - "Defaults to 5 (Normal compression)." + "Defaults to 5 (Normal compression).\n" + "Note: some formats do not support all the possible values, " + "for example bzip2 compression only supports values from 1 to 9." ), QLatin1String("5"), QLatin1String("5")); - parser.addOption(verbose); + parser.addOption(format); parser.addOption(compression); parser.addPositionalArgument(QLatin1String("archive"), QCoreApplication::translate("archivegen", "Compressed archive to create.")); @@ -176,22 +99,29 @@ int main(int argc, char *argv[]) } bool ok = false; - const int values[6] = { 0, 1, 3, 5, 7, 9 }; + QMetaEnum levels = QMetaEnum::fromType<AbstractArchive::CompressionLevel>(); const int value = parser.value(compression).toInt(&ok); - if (!ok || (std::find(std::begin(values), std::end(values), value) == std::end(values))) { + if (!ok || !levels.valueToKey(value)) { 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::TmpFile::No, Lib7z::Compression(value), - [&] () -> Lib7z::UpdateCallback * { - if (parser.isSet(verbose)) - return new VerbosePrinterCallback; - return new FailOnErrorCallback; - } () - ); - return EXIT_SUCCESS; + QString archiveFilename = args[0]; + // Check if filename already has a supported suffix + if (!ArchiveFactory::isSupportedType(archiveFilename)) + archiveFilename += QLatin1Char('.') + parser.value(format); + + QScopedPointer<AbstractArchive> archive(ArchiveFactory::instance().create(archiveFilename)); + if (!archive) { + throw QInstaller::Error(QString::fromLatin1("Could not create handler " + "object for archive \"%1\": \"%2\".").arg(archiveFilename, QLatin1String(Q_FUNC_INFO))); + } + archive->setCompressionLevel(AbstractArchive::CompressionLevel(value)); + if (archive->open(QIODevice::WriteOnly) && archive->create(args.mid(1))) + return EXIT_SUCCESS; + + std::cerr << archive->errorString() << std::endl; } catch (const QInstaller::Error &e) { std::cerr << e.message() << std::endl; } catch (...) { diff --git a/tools/devtool/binaryreplace.cpp b/tools/devtool/binaryreplace.cpp index 97dac37d2..a959bd7dc 100644 --- a/tools/devtool/binaryreplace.cpp +++ b/tools/devtool/binaryreplace.cpp @@ -34,9 +34,7 @@ #include <errors.h> #include <fileio.h> #include <fileutils.h> -#include <lib7z_extract.h> -#include <lib7z_facade.h> -#include <lib7z_list.h> +#include <archivefactory.h> #include <QDir> #include <QFutureWatcher> @@ -68,29 +66,22 @@ int BinaryReplace::replace(const QString &source, const QString &target) return result; QString newInstallerBasePath = future.result().target(); - if (Lib7z::isSupportedArchive(newInstallerBasePath)) { - QFile archive(newInstallerBasePath); - if (archive.open(QIODevice::ReadOnly)) { - try { - Lib7z::extractArchive(&archive, QDir::tempPath()); - const QVector<Lib7z::File> files = Lib7z::listArchive(&archive); - newInstallerBasePath = QDir::tempPath() + QLatin1Char('/') + files.value(0) - .path; - result = EXIT_SUCCESS; - } catch (const Lib7z::SevenZipException& e) { - std::cerr << qPrintable(QString::fromLatin1("Error while extracting \"%1\": %2") - .arg(QDir::toNativeSeparators(newInstallerBasePath), e.message())) << std::endl; - } catch (...) { - std::cerr << qPrintable(QString::fromLatin1("Unknown exception caught while " - "extracting \"%1\".").arg(QDir::toNativeSeparators(newInstallerBasePath))) << std::endl; - } + QScopedPointer<QInstaller::AbstractArchive> archive( + QInstaller::ArchiveFactory::instance().create(newInstallerBasePath)); + + if (archive && archive->open(QIODevice::ReadOnly) && archive->isSupported()) { + if (archive->extract(QDir::tempPath())) { + const QVector<QInstaller::ArchiveEntry> files = archive->list(); + newInstallerBasePath = QDir::tempPath() + QLatin1Char('/') + files.value(0).path; + result = EXIT_SUCCESS; } else { - std::cerr << qPrintable(QString::fromLatin1("Cannot open \"%1\" for reading: %2") - .arg(QDir::toNativeSeparators(newInstallerBasePath), archive.errorString())) << std::endl; + std::cerr << qPrintable(QString::fromLatin1("Error while extracting \"%1\": %2") + .arg(QDir::toNativeSeparators(newInstallerBasePath), archive->errorString())) << std::endl; } - if (!archive.remove()) { - std::cerr << qPrintable(QString::fromLatin1("Cannot delete file \"%1\": %2") - .arg(QDir::toNativeSeparators(newInstallerBasePath), archive.errorString())) << std::endl; + + if (!QFile::remove(newInstallerBasePath)) { + std::cerr << qPrintable(QString::fromLatin1("Cannot delete file \"%1\"") + .arg(QDir::toNativeSeparators(newInstallerBasePath))) << std::endl; } if (result != EXIT_SUCCESS) return result; diff --git a/tools/repogen/repogen.cpp b/tools/repogen/repogen.cpp index b630f8cd3..a709899c6 100644 --- a/tools/repogen/repogen.cpp +++ b/tools/repogen/repogen.cpp @@ -34,7 +34,7 @@ #include <settings.h> #include <utils.h> #include <loggingutils.h> -#include <lib7z_facade.h> +#include <archivefactory.h> #include <QDomDocument> #include <QtCore/QDir> @@ -50,6 +50,8 @@ using namespace QInstaller; static void printUsage() { const QString appName = QFileInfo(QCoreApplication::applicationFilePath()).fileName(); + const QString archiveFormats = ArchiveFactory::supportedTypes().join(QLatin1Char('|')); + std::cout << "Usage: " << appName << " [options] repository-dir" << std::endl; std::cout << std::endl; std::cout << "Options:" << std::endl; @@ -71,6 +73,9 @@ static void printUsage() std::cout << " download phase." << std::endl; std::cout << " --component-metadata Creates one metadata 7z per component. " << std::endl; + std::cout << " --af|--archive-format " << archiveFormats << std::endl; + std::cout << " Set the format used when packaging new component data archives. If" << std::endl; + std::cout << " you omit this option the 7z format will be used as a default." << std::endl; std::cout << std::endl; std::cout << "Example:" << std::endl; @@ -105,6 +110,7 @@ int main(int argc, char** argv) bool updateExistingRepositoryWithNewComponents = false; bool createUnifiedMetadata = true; bool createComponentMetadata = true; + QString archiveSuffix = QLatin1String("7z"); //TODO: use a for loop without removing values from args like it is in binarycreator.cpp //for (QStringList::const_iterator it = args.begin(); it != args.end(); ++it) { @@ -197,6 +203,15 @@ int main(int argc, char** argv) args.removeFirst(); packagesUpdatedWithSha = args.first().split(QLatin1Char(',')); args.removeFirst(); + } else if (args.first() == QLatin1String("--af") || args.first() == QLatin1String("--archive-format")) { + args.removeFirst(); + if (args.isEmpty()) { + return printErrorAndUsageAndExit(QCoreApplication::translate("QInstaller", + "Error: Archive format parameter missing argument")); + } + // TODO: do we need early check for supported formats? + archiveSuffix = args.first(); + args.removeFirst(); } else { printUsage(); return 1; @@ -248,11 +263,9 @@ int main(int argc, char** argv) tmp.setAutoRemove(false); tmpMetaDir = tmp.path(); QInstallerTools::createRepository(repoInfo, &packages, tmpMetaDir, - createComponentMetadata, createUnifiedMetadata); + createComponentMetadata, createUnifiedMetadata, archiveSuffix); exitCode = EXIT_SUCCESS; - } catch (const Lib7z::SevenZipException &e) { - std::cerr << "Caught 7zip exception: " << e.message() << std::endl; } catch (const QInstaller::Error &e) { std::cerr << "Caught exception: " << e.message() << std::endl; } catch (...) { |