File indexing completed on 2024-05-19 04:58:35

0001 /* ============================================================
0002 * Falkon - Qt web browser
0003 * Copyright (C) 2010-2016 David Rosca <nowrep@gmail.com>
0004 *
0005 * This program is free software: you can redistribute it and/or modify
0006 * it under the terms of the GNU General Public License as published by
0007 * the Free Software Foundation, either version 3 of the License, or
0008 * (at your option) any later version.
0009 *
0010 * This program is distributed in the hope that it will be useful,
0011 * but WITHOUT ANY WARRANTY; without even the implied warranty of
0012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
0013 * GNU General Public License for more details.
0014 *
0015 * You should have received a copy of the GNU General Public License
0016 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
0017 * ============================================================ */
0018 #include "commandlineoptions.h"
0019 
0020 #include <QFileInfo>
0021 #include <QCoreApplication>
0022 #include <QCommandLineParser>
0023 
0024 #include <iostream>
0025 
0026 CommandLineOptions::CommandLineOptions()
0027 {
0028     parseActions();
0029 }
0030 
0031 CommandLineOptions::ActionPairList CommandLineOptions::getActions()
0032 {
0033     return m_actions;
0034 }
0035 
0036 void CommandLineOptions::parseActions()
0037 {
0038     // Options
0039     QCommandLineOption authorsOption(QStringList({QSL("a"), QSL("authors")}));
0040     authorsOption.setDescription(QSL("Displays author information."));
0041 
0042     QCommandLineOption profileOption(QStringList({QSL("p"), QSL("profile")}));
0043     profileOption.setValueName(QSL("profileName"));
0044     profileOption.setDescription(QSL("Starts with specified profile."));
0045 
0046     QCommandLineOption noExtensionsOption(QStringList({QSL("e"), QSL("no-extensions")}));
0047     noExtensionsOption.setDescription(QSL("Starts without extensions."));
0048 
0049     QCommandLineOption privateBrowsingOption(QStringList({QSL("i"), QSL("private-browsing")}));
0050     privateBrowsingOption.setDescription(QSL("Starts private browsing."));
0051 
0052     QCommandLineOption portableOption(QStringList({QSL("o"), QSL("portable")}));
0053     portableOption.setDescription(QSL("Starts in portable mode."));
0054 
0055     QCommandLineOption noRemoteOption(QStringList({QSL("r"), QSL("no-remote")}));
0056     noRemoteOption.setDescription(QSL("Starts new browser instance."));
0057 
0058     QCommandLineOption newTabOption(QStringList({QSL("t"), QSL("new-tab")}));
0059     newTabOption.setDescription(QSL("Opens new tab."));
0060 
0061     QCommandLineOption newWindowOption(QStringList({QSL("w"), QSL("new-window")}));
0062     newWindowOption.setDescription(QSL("Opens new window."));
0063 
0064     QCommandLineOption downloadManagerOption(QStringList({QSL("d"), QSL("download-manager")}));
0065     downloadManagerOption.setDescription(QSL("Opens download manager."));
0066 
0067     QCommandLineOption currentTabOption(QStringList({QSL("c"), QSL("current-tab")}));
0068     currentTabOption.setValueName(QSL("URL"));
0069     currentTabOption.setDescription(QSL("Opens URL in current tab."));
0070 
0071     QCommandLineOption openWindowOption(QStringList({QSL("u"), QSL("open-window")}));
0072     openWindowOption.setValueName(QSL("URL"));
0073     openWindowOption.setDescription(QSL("Opens URL in new window."));
0074 
0075     QCommandLineOption fullscreenOption(QStringList({QSL("f"), QSL("fullscreen")}));
0076     fullscreenOption.setDescription(QSL("Toggles fullscreen."));
0077 
0078     QCommandLineOption wmclassOption(QStringList({QSL("wmclass")}));
0079     wmclassOption.setValueName(QSL("WM_CLASS"));
0080     wmclassOption.setDescription(QSL("Application class (X11 only)."));
0081 
0082     // Parser
0083     QCommandLineParser parser;
0084     parser.setApplicationDescription(QSL("QtWebEngine based browser"));
0085     QCommandLineOption helpOption = parser.addHelpOption();
0086     QCommandLineOption versionOption = parser.addVersionOption();
0087     parser.addOption(authorsOption);
0088     parser.addOption(profileOption);
0089     parser.addOption(noExtensionsOption);
0090     parser.addOption(privateBrowsingOption);
0091     parser.addOption(portableOption);
0092     parser.addOption(noRemoteOption);
0093     parser.addOption(newTabOption);
0094     parser.addOption(newWindowOption);
0095     parser.addOption(downloadManagerOption);
0096     parser.addOption(currentTabOption);
0097     parser.addOption(openWindowOption);
0098     parser.addOption(fullscreenOption);
0099     parser.addOption(wmclassOption);
0100     parser.addPositionalArgument(QSL("URL"), QSL("URLs to open"), QSL("[URL...]"));
0101 
0102     // parse() and not process() so we can pass arbitrary options to Chromium
0103     parser.parse(QCoreApplication::arguments());
0104 
0105     if (parser.isSet(helpOption)) {
0106         parser.showHelp();
0107     }
0108 
0109     if (parser.isSet(QSL("help-all"))) {
0110         parser.process({QSL("falkon"), QSL("--help-all")});
0111     }
0112 
0113     if (parser.isSet(versionOption)) {
0114         parser.showVersion();
0115     }
0116 
0117     if (parser.isSet(authorsOption)) {
0118         std::cout << "David Rosca <nowrep@gmail.com>" << std::endl;
0119 
0120         ActionPair pair;
0121         pair.action = Qz::CL_ExitAction;
0122         m_actions.append(pair);
0123         return;
0124     }
0125 
0126     if (parser.isSet(profileOption)) {
0127         const QString profileName = parser.value(profileOption);
0128         std::cout << "Falkon: Starting with profile '" << profileName.toUtf8().data() << "'" << std::endl;
0129 
0130         ActionPair pair;
0131         pair.action = Qz::CL_StartWithProfile;
0132         pair.text = profileName;
0133         m_actions.append(pair);
0134     }
0135 
0136     if (parser.isSet(noExtensionsOption)) {
0137         ActionPair pair;
0138         pair.action = Qz::CL_StartWithoutAddons;
0139         m_actions.append(pair);
0140     }
0141 
0142     if (parser.isSet(privateBrowsingOption)) {
0143         ActionPair pair;
0144         pair.action = Qz::CL_StartPrivateBrowsing;
0145         m_actions.append(pair);
0146     }
0147 
0148     if (parser.isSet(portableOption)) {
0149         ActionPair pair;
0150         pair.action = Qz::CL_StartPortable;
0151         m_actions.append(pair);
0152     }
0153 
0154     if (parser.isSet(noRemoteOption)) {
0155         ActionPair pair;
0156         pair.action = Qz::CL_StartNewInstance;
0157         m_actions.append(pair);
0158     }
0159 
0160     if (parser.isSet(newTabOption)) {
0161         ActionPair pair;
0162         pair.action = Qz::CL_NewTab;
0163         m_actions.append(pair);
0164     }
0165 
0166     if (parser.isSet(newWindowOption)) {
0167         ActionPair pair;
0168         pair.action = Qz::CL_NewWindow;
0169         m_actions.append(pair);
0170     }
0171 
0172     if (parser.isSet(downloadManagerOption)) {
0173         ActionPair pair;
0174         pair.action = Qz::CL_ShowDownloadManager;
0175         m_actions.append(pair);
0176     }
0177 
0178     if (parser.isSet(currentTabOption)) {
0179         ActionPair pair;
0180         pair.action = Qz::CL_OpenUrlInCurrentTab;
0181         pair.text = parser.value(currentTabOption);
0182         m_actions.append(pair);
0183     }
0184 
0185     if (parser.isSet(openWindowOption)) {
0186         ActionPair pair;
0187         pair.action = Qz::CL_OpenUrlInNewWindow;
0188         pair.text = parser.value(openWindowOption);
0189         m_actions.append(pair);
0190     }
0191 
0192     if (parser.isSet(fullscreenOption)) {
0193         ActionPair pair;
0194         pair.action = Qz::CL_ToggleFullScreen;
0195         m_actions.append(pair);
0196     }
0197 
0198     if (parser.isSet(wmclassOption)) {
0199         ActionPair pair;
0200         pair.action = Qz::CL_WMClass;
0201         pair.text = parser.value(wmclassOption);
0202         m_actions.append(pair);
0203     }
0204 
0205     if (parser.positionalArguments().isEmpty())
0206         return;
0207 
0208     QString url = parser.positionalArguments().constLast();
0209     QFileInfo fileInfo(url);
0210 
0211     if (fileInfo.exists()) {
0212         url = fileInfo.absoluteFilePath();
0213     }
0214 
0215     if (!url.isEmpty() && !url.startsWith(QLatin1Char('-'))) {
0216         ActionPair pair;
0217         pair.action = Qz::CL_OpenUrl;
0218         pair.text = url;
0219         m_actions.append(pair);
0220     }
0221 }