/******************************************************************************* ** ** smolbote: yet another qute browser ** Copyright (C) 2017 Xian Nox ** ** 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 3 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, see . ** ******************************************************************************/ #include #include "browser.h" #include #include #include #include "mainwindow.h" // read config into std::string, supports qrc inline std::string readConfig(QString path) { QFile conf(path); std::string ret; if(conf.open(QIODevice::ReadOnly)) { ret = conf.readAll().toStdString(); conf.close(); } return ret; } bool writeUserConfig(const std::string &path, Configuration &config) { // set firstRun to false so we don't re-init on every run config.setValue("browser.firstRun", false); // The .path's need to be overriden because ~ doesn't translate to home const QString &home = QStandardPaths::writableLocation(QStandardPaths::HomeLocation); // profile.path std::string profilePath = config.value("profile.path").value(); config.setValue("profile.path", patchHome(profilePath, home.toStdString())); // bookmarks.path std::string bookmarksPath = config.value("bookmarks.path").value(); config.setValue("bookmarks.path", patchHome(bookmarksPath, home.toStdString())); // downloads.path std::string downloadsPath = config.value("downloads.path").value(); config.setValue("downloads.path", patchHome(downloadsPath, home.toStdString())); return config.writeUserConfiguration(path); } int main(int argc, char *argv[]) { // Create application object Browser instance(argc, argv); QCommandLineParser parser; parser.setApplicationDescription("yet another Qt browser"); parser.addHelpOption(); parser.addVersionOption(); // user config, ~/.config/smolbote/smolbote.cfg or empty if there is none QCommandLineOption configOption({"c", "config"}, "Set configuration file.", "path"); configOption.setDefaultValue(QStandardPaths::locate(QStandardPaths::AppConfigLocation, "smolbote.cfg")); parser.addOption(configOption); // default config, :/poi.cfg QCommandLineOption defaultConfigOption("default-config", "Set the default configuration file.", "path"); defaultConfigOption.setDefaultValue(":/poi.cfg"); parser.addOption(defaultConfigOption); // print default config, so users can easily create their overrides QCommandLineOption printDefaultConfigOption("print-default-config", "Print default configuration."); parser.addOption(printDefaultConfigOption); // generate user config QCommandLineOption generateUserConfigOption("generate-user-config", "Generate user configuration and exit."); parser.addOption(generateUserConfigOption); QCommandLineOption profileOption({"p", "profile"}, "Use this profile.", "PROFILE"); profileOption.setDefaultValue(""); parser.addOption(profileOption); QCommandLineOption newInstanceOption("new-instance", "Skip instance check at startup"); parser.addOption(newInstanceOption); QCommandLineOption newWindowOption("in-new-window", "Open URL in new window"); parser.addOption(newWindowOption); QCommandLineOption newTabOption("in-new-tab", "Open URL in new tab"); parser.addOption(newTabOption); parser.addPositionalArgument("URL", "URL(s) to open"); parser.process(instance); #ifdef QT_DEBUG qDebug("config=%s", qUtf8Printable(parser.value(configOption))); qDebug("default-config=%s", qUtf8Printable(parser.value(defaultConfigOption))); #endif if(parser.isSet(printDefaultConfigOption)) { std::cout << readConfig(parser.value(defaultConfigOption)); std::cout.flush(); return 0; } std::shared_ptr config = std::make_shared(); config->readDefaultConfiguration(readConfig(parser.value(defaultConfigOption))); config->readUserConfiguration(parser.value(configOption).toStdString()); instance.setConfiguration(config); // check if first run if(config->value("browser.firstRun").value() || parser.isSet(generateUserConfigOption)) { // create a user config file QString path = parser.value(configOption); // there may be no smolbote.cfg if(path.isEmpty()) { path = QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/smolbote.cfg"; } #ifdef QT_DEBUG qDebug("Generating user config on first run to %s", qUtf8Printable(path)); #endif qDebug("Saving config to: %s - %s", qUtf8Printable(path), writeUserConfig(path.toStdString(), *config) ? "ok" : "failed"); if(parser.isSet(generateUserConfigOption)) { return 0; } } // TODO: instance check instance.loadProfiles(); MainWindow* mainWindow = instance.createWindow(); if(parser.isSet(profileOption)) { mainWindow->setProfile(instance.profile(parser.value(profileOption))); } if(parser.positionalArguments().isEmpty()) { // no URLs were given mainWindow->newTab(QUrl::fromUserInput(config->value("profile.homepage").value().c_str())); } else { for(const QString &url : parser.positionalArguments()) { mainWindow->newTab(QUrl::fromUserInput(url)); } } return instance.exec(); }