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 }