1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
/**************************************************************************
**
** Copyright (C) 2020 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the Qt Installer Framework.
**
** $QT_BEGIN_LICENSE:GPL-EXCEPT$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 as published by the Free Software
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
**************************************************************************/
#include <errors.h>
#include <archivefactory.h>
#include <utils.h>
#include <QCoreApplication>
#include <QCommandLineParser>
#include <QDir>
#include <QMetaEnum>
#include <iostream>
using namespace QInstaller;
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_
const QString archiveFormats = ArchiveFactory::supportedTypes().join(QLatin1Char('|'));
QCommandLineParser parser;
const QCommandLineOption help = parser.addHelpOption();
const QCommandLineOption version = parser.addVersionOption();
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",
"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).\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(format);
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 (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;
}
bool ok = false;
QMetaEnum levels = QMetaEnum::fromType<AbstractArchive::CompressionLevel>();
const int value = parser.value(compression).toInt(&ok);
if (!ok || !levels.valueToKey(value)) {
throw QInstaller::Error(QCoreApplication::translate("archivegen",
"Unknown compression level \"%1\". See 'archivgen --help'.").arg(value));
}
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 (...) {
std::cerr << QCoreApplication::translate("archivegen", "Unknown exception caught.")
<< std::endl;
}
return EXIT_FAILURE;
}
|