kde-extraapps/ark/app/main.cpp
Ivailo Monev 5cd80dddb1 ark: prepare for KCmdLineArgs changes
Signed-off-by: Ivailo Monev <xakepa10@gmail.com>
2024-05-16 01:38:03 +03:00

215 lines
8.8 KiB
C++

/*
* ark -- archiver for the KDE project
*
* Copyright (C) 2007 Henrique Pinto <henrique.pinto@kdemail.net>
* Copyright (C) 2008-2009 Harald Hvaal <haraldhv@stud.ntnu.no>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
#include "mainwindow.h"
#include "batchextract.h"
#include "kerfuffle/addtoarchive.h"
#include <KAboutData>
#include <KApplication>
#include <KCmdLineArgs>
#include <KDebug>
#include <KLocale>
#include <QByteArray>
#include <QFileInfo>
// NOTE: this has to be done before application instance is created and KMediaPlayer part requires
// it, i.e. it is too late to do it from the kmediaplayer library itself if it is dlopen-ed
#if defined(Q_WS_X11)
static int ark_x11_init_threads() {
QApplication::setAttribute(Qt::AA_X11InitThreads, true);
return 1;
};
Q_CONSTRUCTOR_FUNCTION(ark_x11_init_threads)
#endif
using Kerfuffle::AddToArchive;
int main(int argc, char **argv)
{
KAboutData aboutData("ark", 0, ki18n("Ark"),
"2.19", ki18n("KDE Archiving tool"),
KAboutData::License_GPL,
ki18n("(c) 1997-2011, The Various Ark Developers")
);
aboutData.addAuthor(ki18n("Raphael Kubo da Costa"),
ki18n("Maintainer"),
"rakuco@FreeBSD.org");
aboutData.addAuthor(ki18n("Harald Hvaal"),
ki18n("Former Maintainer"),
"haraldhv@stud.ntnu.no");
aboutData.addAuthor(ki18n("Henrique Pinto"),
ki18n("Former Maintainer"),
"henrique.pinto@kdemail.net");
aboutData.addAuthor(ki18n("Helio Chissini de Castro"),
ki18n("Former maintainer"),
"helio@kde.org");
aboutData.addAuthor(ki18n("Georg Robbers"),
KLocalizedString(),
"Georg.Robbers@urz.uni-hd.de");
aboutData.addAuthor(ki18n("Roberto Selbach Teixeira"),
KLocalizedString(),
"maragato@kde.org");
aboutData.addAuthor(ki18n("Francois-Xavier Duranceau"),
KLocalizedString(),
"duranceau@kde.org");
aboutData.addAuthor(ki18n("Emily Ezust (Corel Corporation)"),
KLocalizedString(),
"emilye@corel.com");
aboutData.addAuthor(ki18n("Michael Jarrett (Corel Corporation)"),
KLocalizedString(),
"michaelj@corel.com");
aboutData.addAuthor(ki18n("Robert Palmbos"),
KLocalizedString(),
"palm9744@kettering.edu");
aboutData.addCredit(ki18n("Bryce Corkins"),
ki18n("Icons"),
"dbryce@attglobal.net");
aboutData.addCredit(ki18n("Liam Smit"),
ki18n("Ideas, help with the icons"),
"smitty@absamail.co.za");
aboutData.addCredit(ki18n("Andrew Smith"),
ki18n("bkisofs code"),
QByteArray(),
"http://littlesvr.ca/misc/contactandrew.php");
aboutData.setProgramIconName(QLatin1String("ark"));
KCmdLineArgs::init(argc, argv, &aboutData);
KCmdLineOptions option;
option.add("+[url]", ki18n("URL of an archive to be opened"));
option.add("d").add("dialog", ki18n("Show a dialog for specifying the options for the operation (extract/add)"));
option.add("o").add("destination <directory>", ki18n("Destination folder to extract to. Defaults to current path if not specified."));
option.add(":", ki18n("Options for adding files"));
option.add("c").add("add", ki18n("Query the user for an archive filename and add specified files to it. Quit when finished."));
option.add("t").add("add-to <filename>", ki18n("Add the specified files to 'filename'. Create archive if it does not exist. Quit when finished."));
option.add("p").add("changetofirstpath", ki18n("Change the current dir to the first entry and add all other entries relative to this one."));
option.add("f").add("autofilename <suffix>", ki18n("Automatically choose a filename, with the selected suffix (for example rar, tar.gz, zip or any other supported types)"));
option.add(":", ki18n("Options for batch extraction:"));
option.add("b").add("batch", ki18n("Use the batch interface instead of the usual dialog. This option is implied if more than one url is specified."));
option.add("e").add("autodestination", ki18n("The destination argument will be set to the path of the first file supplied."));
option.add("a").add("autosubfolder", ki18n("Archive contents will be read, and if detected to not be a single folder archive, a subfolder with the name of the archive will be created."));
KCmdLineArgs::addCmdLineOptions(option);
KApplication application;
application.setQuitOnLastWindowClosed(false);
application.enableSessionManagement();
//session restoring
if (application.isSessionRestored()) {
if (!KMainWindow::canBeRestored(1)) {
return -1;
}
MainWindow* window = new MainWindow();
if (!window->loadPart()) {
delete window;
return -1;
}
window->restore(1);
} else { //new ark window (no restored session)
// open any given URLs
KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
if (args->isSet("add") || args->isSet("add-to")) {
AddToArchive *addToArchiveJob = new AddToArchive(&application);
application.connect(addToArchiveJob, SIGNAL(result(KJob*)), SLOT(quit()), Qt::QueuedConnection);
if (args->isSet("changetofirstpath")) {
addToArchiveJob->setChangeToFirstPath(true);
}
if (args->isSet("add-to")) {
addToArchiveJob->setFilename(args->getOption("add-to"));
}
if (args->isSet("autofilename")) {
addToArchiveJob->setAutoFilenameSuffix(args->getOption("autofilename"));
}
for (int i = 0; i < args->count(); ++i) {
//TODO: use the returned value here?
addToArchiveJob->addInput(args->url(i));
}
if (args->isSet("dialog")) {
if (!addToArchiveJob->showAddDialog()) {
return 0;
}
}
addToArchiveJob->start();
} else if (args->isSet("batch")) {
BatchExtract *batchJob = new BatchExtract(&application);
application.connect(batchJob, SIGNAL(result(KJob*)), SLOT(quit()), Qt::QueuedConnection);
for (int i = 0; i < args->count(); ++i) {
batchJob->addInput(args->url(i));
}
if (args->isSet("autosubfolder")) {
kDebug() << "Setting autosubfolder";
batchJob->setAutoSubfolder(true);
}
if (args->isSet("autodestination")) {
QString autopath = QFileInfo(args->url(0).path()).path();
kDebug() << "By autodestination, setting path to " << autopath;
batchJob->setDestinationFolder(autopath);
}
if (args->isSet("destination")) {
kDebug() << "Setting destination to " << args->getOption("destination");
batchJob->setDestinationFolder(args->getOption("destination"));
}
if (args->isSet("dialog")) {
if (!batchJob->showExtractDialog()) {
return 0;
}
}
batchJob->start();
} else {
MainWindow *window = new MainWindow();
if (!window->loadPart()) { // if loading the part fails
delete window;
return -1;
}
if (args->count()) {
kDebug() << "trying to open" << args->url(0);
if (args->isSet("dialog")) {
window->setShowExtractDialog(true);
}
window->openUrl(args->url(0));
}
window->show();
}
}
kDebug() << "Entering application loop";
return application.exec();
}