File indexing completed on 2024-04-28 15:52:02

0001 /*
0002     SPDX-FileCopyrightText: 2009 Pino Toscano <pino@kde.org>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "shellutils.h"
0008 
0009 // qt/kde includes
0010 #include <QCommandLineParser>
0011 #include <QDebug>
0012 #include <QDir>
0013 #include <QFile>
0014 #include <QFileInfo>
0015 #include <QUrl>
0016 
0017 namespace ShellUtils
0018 {
0019 namespace detail
0020 {
0021 bool qfileExistFunc(const QString &fileName)
0022 {
0023     return QFile::exists(fileName);
0024 }
0025 
0026 }
0027 
0028 FileExistFunc qfileExistFunc()
0029 {
0030     return detail::qfileExistFunc;
0031 }
0032 
0033 QUrl urlFromArg(const QString &_arg, FileExistFunc exist_func, const QString &pageArg)
0034 {
0035     QUrl url = QUrl::fromUserInput(_arg, QDir::currentPath(), QUrl::AssumeLocalFile);
0036     if (url.isLocalFile()) {
0037         // make sure something like /tmp/foo#bar.pdf is treated as a path name (default)
0038         // but something like /tmp/foo.pdf#bar is foo.pdf plus an anchor "bar"
0039         const QString path = url.path();
0040         int hashIndex = path.lastIndexOf(QLatin1Char('#'));
0041         if (hashIndex != -1 && !exist_func(path)) {
0042             url.setPath(path.left(hashIndex));
0043             url.setFragment(path.mid(hashIndex + 1));
0044         }
0045     }
0046     if (!pageArg.isEmpty()) {
0047         url.setFragment(pageArg);
0048     }
0049     return url;
0050 }
0051 
0052 QString serializeOptions(const QCommandLineParser &args)
0053 {
0054     const bool startInPresentation = args.isSet(QStringLiteral("presentation"));
0055     const bool showPrintDialog = args.isSet(QStringLiteral("print"));
0056     const bool showPrintDialogAndExit = args.isSet(QStringLiteral("print-and-exit"));
0057     const bool unique = args.isSet(QStringLiteral("unique")) && args.positionalArguments().count() <= 1;
0058     const bool noRaise = args.isSet(QStringLiteral("noraise"));
0059     const QString page = args.value(QStringLiteral("page"));
0060     const QString find = args.value(QStringLiteral("find"));
0061     const QString editorCmd = args.value(QStringLiteral("editor-cmd"));
0062 
0063     return serializeOptions(startInPresentation, showPrintDialog, showPrintDialogAndExit, unique, noRaise, page, find, editorCmd);
0064 }
0065 
0066 QString serializeOptions(bool startInPresentation, bool showPrintDialog, bool showPrintDialogAndExit, bool unique, bool noRaise, const QString &page, const QString &find, const QString &editorCmd)
0067 {
0068     return QStringLiteral("%1:%2:%3:%4:%5:%6:%7:%8")
0069         .arg(startInPresentation)
0070         .arg(showPrintDialog)
0071         .arg(showPrintDialogAndExit)
0072         .arg(unique)
0073         .arg(noRaise)
0074         .arg(page, QString::fromLatin1(find.toUtf8().toBase64()), QString::fromLatin1(editorCmd.toUtf8().toBase64()));
0075 }
0076 
0077 static bool unserializeOptions(const QString &serializedOptions, bool *presentation, bool *print, bool *print_and_exit, bool *unique, bool *noraise, QString *page, QString *find, QString *editorCmd)
0078 {
0079     const QStringList args = serializedOptions.split(QStringLiteral(":"));
0080 
0081     if (args.count() >= 8) {
0082         *presentation = args[0] == QLatin1String("1");
0083         *print = args[1] == QLatin1String("1");
0084         *print_and_exit = args[2] == QLatin1String("1");
0085         *unique = args[3] == QLatin1String("1");
0086         *noraise = args[4] == QLatin1String("1");
0087         *page = args[5];
0088         *find = args[6];
0089         *editorCmd = args[7];
0090         return true;
0091     }
0092     return false;
0093 }
0094 
0095 bool startInPresentation(const QString &serializedOptions)
0096 {
0097     bool result, dummy;
0098     QString dummyString;
0099     return unserializeOptions(serializedOptions, &result, &dummy, &dummy, &dummy, &dummy, &dummyString, &dummyString, &dummyString) && result;
0100 }
0101 
0102 bool showPrintDialog(const QString &serializedOptions)
0103 {
0104     bool result, dummy;
0105     QString dummyString;
0106     return unserializeOptions(serializedOptions, &dummy, &result, &dummy, &dummy, &dummy, &dummyString, &dummyString, &dummyString) && result;
0107 }
0108 
0109 bool showPrintDialogAndExit(const QString &serializedOptions)
0110 {
0111     bool result, dummy;
0112     QString dummyString;
0113     return unserializeOptions(serializedOptions, &dummy, &dummy, &result, &dummy, &dummy, &dummyString, &dummyString, &dummyString) && result;
0114 }
0115 
0116 bool unique(const QString &serializedOptions)
0117 {
0118     bool result, dummy;
0119     QString dummyString;
0120     return unserializeOptions(serializedOptions, &dummy, &dummy, &dummy, &result, &dummy, &dummyString, &dummyString, &dummyString) && result;
0121 }
0122 
0123 bool noRaise(const QString &serializedOptions)
0124 {
0125     bool result, dummy;
0126     QString dummyString;
0127     return unserializeOptions(serializedOptions, &dummy, &dummy, &dummy, &dummy, &result, &dummyString, &dummyString, &dummyString) && result;
0128 }
0129 
0130 QString page(const QString &serializedOptions)
0131 {
0132     QString result, dummyString;
0133     bool dummy;
0134     unserializeOptions(serializedOptions, &dummy, &dummy, &dummy, &dummy, &dummy, &result, &dummyString, &dummyString);
0135     return result;
0136 }
0137 
0138 QString find(const QString &serializedOptions)
0139 {
0140     QString result, dummyString;
0141     bool dummy;
0142     unserializeOptions(serializedOptions, &dummy, &dummy, &dummy, &dummy, &dummy, &dummyString, &result, &dummyString);
0143     return QString::fromUtf8(QByteArray::fromBase64(result.toLatin1()));
0144 }
0145 
0146 QString editorCmd(const QString &serializedOptions)
0147 {
0148     QString result, dummyString;
0149     bool dummy;
0150     unserializeOptions(serializedOptions, &dummy, &dummy, &dummy, &dummy, &dummy, &dummyString, &dummyString, &result);
0151     return QString::fromUtf8(QByteArray::fromBase64(result.toLatin1()));
0152 }
0153 }