File indexing completed on 2024-04-28 04:00:33

0001 /*
0002  SPDX-FileCopyrightText: 2014 Aleix Pol Gonzalez <aleixpol@blue-systems.com>
0003 
0004  SPDX-License-Identifier: LGPL-2.1-or-later
0005 */
0006 
0007 #include "qqml.h"
0008 #include <KAboutData>
0009 #include <KLocalizedContext>
0010 #include <KLocalizedString>
0011 #include <QApplication>
0012 #include <QCommandLineParser>
0013 #include <QDebug>
0014 #include <QJsonArray>
0015 #include <QJsonDocument>
0016 #include <QMimeDatabase>
0017 #include <QQmlApplicationEngine>
0018 #include <QQmlContext>
0019 #include <purpose/alternativesmodel.h>
0020 #include <purpose/job.h>
0021 
0022 int main(int argc, char **argv)
0023 {
0024     QApplication app(argc, argv);
0025     KAboutData data(QStringLiteral("sharetool"), i18n("Share Tool"), QStringLiteral("1.0"), i18n("Share random information"), KAboutLicense::GPL);
0026     data.addAuthor(QStringLiteral("Aleix Pol i Gonzalez"), i18n("Implementation"), QStringLiteral("aleixpol@kde.org"));
0027     KAboutData::setApplicationData(data);
0028 
0029     QJsonObject inputData;
0030     QStringList files;
0031     {
0032         QCommandLineParser parser;
0033         parser.addPositionalArgument(QStringLiteral("files"), i18n("Files to share"), i18n("[files...]"));
0034         parser.addOption(QCommandLineOption(QStringLiteral("data"), i18n("Data tuple to initialize the process with"), QStringLiteral("json")));
0035 
0036         data.setupCommandLine(&parser);
0037         parser.addHelpOption();
0038         parser.addVersionOption();
0039         parser.process(app);
0040         data.processCommandLine(&parser);
0041 
0042         if (parser.isSet(QStringLiteral("data"))) {
0043             QJsonParseError error;
0044             QJsonDocument doc = QJsonDocument::fromJson(parser.value(QStringLiteral("data")).toLatin1(), &error);
0045             if (error.error) {
0046                 qCritical() << qPrintable(i18n("Error in the data argument formatting: %1 at %2", error.errorString(), error.offset));
0047                 parser.showHelp(2);
0048             } else if (!doc.isObject()) {
0049                 qCritical() << qPrintable(i18n("Error in the data argument type, it should be a json object."));
0050                 parser.showHelp(3);
0051             }
0052             inputData = doc.object();
0053         }
0054 
0055         files = parser.positionalArguments();
0056         if (files.isEmpty() && !inputData.contains(QStringLiteral("urls"))) {
0057             qCritical() << qPrintable(i18n("Must specify some files to share"));
0058             parser.showHelp(1);
0059         }
0060     }
0061 
0062     QMimeType common;
0063     QJsonArray urls;
0064     if (!files.isEmpty() && (!inputData.contains(QStringLiteral("urls")) || !inputData.contains(QStringLiteral("mimeType")))) {
0065         QMimeDatabase db;
0066         for (const QString &file : std::as_const(files)) {
0067             const QUrl url = QUrl::fromUserInput(file, QString(), QUrl::AssumeLocalFile);
0068             QMimeType type = db.mimeTypeForUrl(url);
0069             if (!common.isValid())
0070                 common = type;
0071             else if (common.inherits(type.name())) {
0072                 common = type;
0073             } else if (type.inherits(common.name())) {
0074                 ;
0075             } else {
0076                 common = db.mimeTypeForName(QStringLiteral("application/octet-stream"));
0077             }
0078             urls += url.toString();
0079         }
0080         inputData.insert(QStringLiteral("urls"), urls);
0081         inputData.insert(QStringLiteral("mimeType"), common.name());
0082     }
0083 
0084     QQmlApplicationEngine engine;
0085     engine.rootContext()->setContextObject(new KLocalizedContext);
0086     engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
0087 
0088     engine.rootObjects().at(0)->setProperty("inputData", inputData);
0089     engine.rootObjects().at(0)->setProperty("visible", true);
0090 
0091     return app.exec();
0092 }