diff options
| author | Aqua-sama <aqua@iserlohn-fortress.net> | 2018-10-09 12:05:28 +0200 | 
|---|---|---|
| committer | Aqua-sama <aqua@iserlohn-fortress.net> | 2018-10-09 12:05:28 +0200 | 
| commit | 3639d5789259561c531a3481d7061a0cb492c644 (patch) | |
| tree | c9c7ff04022b62cf5be4d4ea31bf28d966ccefda /src | |
| parent | Create .profile file when adding a new profile (diff) | |
| download | smolbote-3639d5789259561c531a3481d7061a0cb492c644.tar.xz | |
Unlink plugins from lib/ libraries
Diffstat (limited to 'src')
| -rw-r--r-- | src/CMakeLists.txt | 7 | ||||
| -rw-r--r-- | src/browser.cpp | 73 | ||||
| -rw-r--r-- | src/browser.h | 22 | ||||
| -rw-r--r-- | src/main.cpp | 37 | ||||
| -rw-r--r-- | src/plugin.h | 42 | 
5 files changed, 84 insertions, 97 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index e8f2794..a44a44f 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -47,8 +47,10 @@ set(srclist          webengine/webview.cpp          webengine/webview.h -        # plugin interfaces -        plugin.h +    # interfaces +    ${PROJECT_SOURCE_DIR}/include/plugininterface.h +    ${PROJECT_SOURCE_DIR}/include/profileinterface.h +    ${PROJECT_SOURCE_DIR}/include/browserinterface.h  )  # if you are using a custom build location for breakpad: @@ -64,6 +66,7 @@ endif()  target_include_directories(${poi_exe}          PRIVATE ${Boost_INCLUDE_DIRS} +    PRIVATE ${PROJECT_SOURCE_DIR}/include          PRIVATE ${PROJECT_SOURCE_DIR}/lib          PRIVATE ${PROJECT_SOURCE_DIR}/plugins  ) diff --git a/src/browser.cpp b/src/browser.cpp index 97020bc..0ad1071 100644 --- a/src/browser.cpp +++ b/src/browser.cpp @@ -28,6 +28,8 @@  #include <web/profilemanager.h>  #include <web/webprofile.h>  #include "webengine/filter.h" +#include <QPluginLoader> +#include <plugininterface.h>  Browser::Browser(int &argc, char *argv[], bool allowSecondary)      : SingleApplication(argc, argv, allowSecondary, SingleApplication::User | SingleApplication::SecondaryNotification | SingleApplication::ExcludeAppVersion) @@ -49,23 +51,48 @@ Browser::~Browser()  void Browser::about()  {      auto *dlg = new AboutDialog; -    for(const Plugin &plugin : qAsConst(m_plugins)) { -        dlg->addPlugin(plugin.name, plugin.author, plugin.shortcut.toString()); +    for(const QPluginLoader *loader : qAsConst(m_plugins)) { +        const auto meta = loader->metaData().value("MetaData").toObject(); +        dlg->addPlugin(meta.value("name").toString(), meta.value("author").toString(), meta.value("shortcut").toString());      }      dlg->exec();  } -QPair<QString, WebProfile *> Browser::loadProfile(const QString &id) +const QStringList Browser::configurationOptions() const +{ +    QStringList options; +    for(const auto &option : m_config->options()) { +        options.append(QString::fromStdString(option->long_name())); +    } +    return options; +} + +const QString Browser::configuration(const QString& key) const +{ +    return m_config->value<QString>(qUtf8Printable(key)).value_or(QString()); +} + +void Browser::setConfiguration(const QString& key, const QString& value) +{ +    m_config->setValue(qUtf8Printable(key), value); +} + +const QList<QPair<QString, Profile *>> Browser::profileList() const +{ +    QList<QPair<QString, Profile *>> profiles; +    for(const QString &id : m_profileManager->idList()) { +        profiles.append(qMakePair(id, m_profileManager->profile(id))); +    } +    return profiles; +} + +QPair<QString, Profile *> Browser::loadProfile(const QString &id, bool isOffTheRecord)  {      WebProfile *profile = nullptr;      if(QFile::exists(id)) { -        //qDebug("id %s exists", qUtf8Printable(id));          profile = m_profileManager->loadProfile(id);      } else { -        QDir profileDir(m_config->value<QString>("profile.path").value()); -        //qDebug("id %s --> %s", qUtf8Printable(id), qUtf8Printable(profileDir.absoluteFilePath(id + ".profile"))); -        profile = m_profileManager->loadProfile(profileDir.absoluteFilePath(id + ".profile")); -        profile->setName(id); +        profile = m_profileManager->createProfile(id, isOffTheRecord);      }      connect(profile, &WebProfile::downloadRequested, m_downloads.get(), &DownloadsWidget::addDownload);      auto *interceptor = new UrlRequestInterceptor(m_urlFilter.get(), profile, profile); @@ -74,6 +101,11 @@ QPair<QString, WebProfile *> Browser::loadProfile(const QString &id)      return QPair<QString, WebProfile *>(m_profileManager->id(profile), profile);  } +void Browser::removeProfile(const QString &id) +{ +    m_profileManager->deleteProfile(id); +} +  void Browser::setConfiguration(std::unique_ptr<Configuration> &config)  {      Q_ASSERT(config); @@ -91,20 +123,10 @@ ProfileManager *Browser::getProfileManager()      return m_profileManager;  } -void Browser::registerPlugin(const Plugin &plugin) -{ -    Q_ASSERT(m_config); - -    auto *p = qobject_cast<PluginInterface *>(plugin.instance); -    if(p != nullptr) { -        p->setBrowserInterface(this); -        m_plugins.append(plugin); -    } -} - -void Browser::setup() +void Browser::setup(QVector<QPluginLoader *> plugins)  {      Q_ASSERT(m_config); +    m_plugins = plugins;      auto stylesheet = m_config->value<QString>("browser.stylesheet");      if(stylesheet) { @@ -132,7 +154,7 @@ void Browser::setup()          const QString id = m_config->value<QString>("profile.default").value();          auto *profile = m_profileManager->profile(id);          if(profile == nullptr) { -            profile = this->loadProfile(id).second; +            profile = qobject_cast<WebProfile *>(loadProfile(id).second);          }          WebProfile::setDefaultProfile(profile); @@ -225,13 +247,12 @@ MainWindow *Browser::createWindow()      });      window->addAction(MainWindow::ToolsMenu, downloadsAction); -    for(const Plugin &p : qAsConst(m_plugins)) { -        auto *plugin = qobject_cast<PluginInterface *>(p.instance); +    for(QPluginLoader *loader : qAsConst(m_plugins)) { +        const auto *plugin = qobject_cast<PluginInterface *>(loader->instance());          Q_CHECK_PTR(plugin); -        auto *pluginAction = new QAction(p.name, window); -        pluginAction->setShortcut(p.shortcut); - +        auto *pluginAction = new QAction(loader->metaData().value("MetaData").toObject().value("name").toString(), window); +        pluginAction->setShortcut(QKeySequence::fromString(loader->metaData().value("MetaData").toObject().value("shortcut").toString()));          connect(pluginAction, &QAction::triggered, window, [=]() {              plugin->createWidget(window)->exec();          }); diff --git a/src/browser.h b/src/browser.h index 6731f59..35b4149 100644 --- a/src/browser.h +++ b/src/browser.h @@ -10,10 +10,10 @@  #define SMOLBOTE_BROWSER_H  #include <singleapplication.h> +#include <browserinterface.h>  #include <QJsonObject>  #include <QVector>  #include <functional> -#include <interfaces.h>  #include <memory>  #include "session.h" @@ -22,7 +22,8 @@ class BookmarksWidget;  class DownloadsWidget;  class Filter;  class MainWindow; -class WebProfile; +class ProfileManager; +class QPluginLoader;  class Browser : public SingleApplication, public BrowserInterface  {      Q_OBJECT @@ -36,16 +37,19 @@ public slots:  public:      // interface -    Configuration *getConfiguration() const override; +    Configuration *getConfiguration() const; +    const QStringList configurationOptions() const override; +    const QString configuration(const QString &key) const override; +    void setConfiguration(const QString &key, const QString &value) override; -    ProfileManager *getProfileManager() override; -    QPair<QString, WebProfile *> loadProfile(const QString &id) override; +    ProfileManager *getProfileManager(); +    const QList<QPair<QString, Profile *>> profileList() const override; +    QPair<QString, Profile *> loadProfile(const QString &id, bool isOffTheRecord = true) override; +    void removeProfile(const QString &id) override;      void setConfiguration(std::unique_ptr<Configuration> &config); -    void registerPlugin(const Plugin &plugin); - -    void setup(); +    void setup(QVector<QPluginLoader *> plugins);      QJsonObject session() const {          return Session::session(m_windows); @@ -65,7 +69,7 @@ private:      std::unique_ptr<Filter> m_urlFilter;      QVector<MainWindow *> m_windows; -    QVector<Plugin> m_plugins; +    QVector<QPluginLoader *> m_plugins;  };  #endif // SMOLBOTE_BROWSER_H diff --git a/src/main.cpp b/src/main.cpp index 6940856..e0ba7eb 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -7,7 +7,6 @@   */  #include "browser.h" -#include "plugin.h"  #include "session.h"  #include "util.h"  #include "version.h" @@ -17,6 +16,8 @@  #include <configuration/configuration.h>  #include <iostream>  #include <memory> +#include <QPluginLoader> +#include <plugininterface.h>  #ifdef _WIN32  #include <cstdio>  #include <windows.h> @@ -102,19 +103,23 @@ int main(int argc, char **argv)          return 0;      } -    QVector<Plugin> plugins; +    QVector<QPluginLoader *> plugins; +    CommandHash_t pluginCommands; +      for(const QString &path : Util::files(config->value<QString>("plugins.path").value())) { -        plugins.append(loadPluginFromPath(path)); -    } -    QMap<QString, std::function<int()>> pluginCommands; -    for(const auto &plugin : plugins) { -        auto *pluginInterface = qobject_cast<PluginInterface *>(plugin.instance); -        Q_CHECK_PTR(pluginInterface); - -        QHashIterator<QString, std::function<int()>> i(pluginInterface->commands()); -        while(i.hasNext()) { -            i.next(); -            pluginCommands.insert(i.key(), i.value()); +        QPluginLoader *loader = new QPluginLoader(path); +        const bool loaded = loader->load(); +#ifdef QT_DEBUG +        qDebug("Loading plugin %s %s", qUtf8Printable(path), loaded ? "[ok]" : "[failed]"); +#endif + +        if(loader->load()) { +            plugins.append(loader); +            auto *plugin = qobject_cast<PluginInterface *>(loader->instance()); +            pluginCommands.unite(plugin->commands()); +        } else { +            qDebug("%s", qUtf8Printable(loader->errorString())); +            delete loader;          }      } @@ -187,11 +192,7 @@ int main(int argc, char **argv)      auto profile = config->value<QString>("profile.default");      app.setConfiguration(config); -    app.setup(); - -    for(const Plugin &plugin : plugins) { -        app.registerPlugin(plugin); -    } +    app.setup(plugins);      QStringList urls;      if(arguments) { diff --git a/src/plugin.h b/src/plugin.h deleted file mode 100644 index 045d047..0000000 --- a/src/plugin.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - * This file is part of smolbote. It's copyrighted by the contributors recorded - * in the version control history of the file, available from its original - * location: https://neueland.iserlohn-fortress.net/gitea/aqua/smolbote - * - * SPDX-License-Identifier: GPL-3.0 - */ - -#ifndef SMOLBOTE_PLUGIN_H -#define SMOLBOTE_PLUGIN_H - -#include <interfaces.h> -#include <QPluginLoader> -#include <QFileInfo> -#include <QDir> - -inline Plugin loadPluginFromPath(const QString &path) -{ -    Plugin p; -    QPluginLoader loader(path); - -    if(loader.load()) { -#ifdef QT_DEBUG -        qDebug("Loading plugin: %s [ok]", qUtf8Printable(path)); -#endif - -        auto meta = loader.metaData().value("MetaData").toObject(); -        p.name = meta.value("name").toString(); -        p.author = meta.value("author").toString(); -        p.shortcut = QKeySequence::fromString(meta.value("shortcut").toString()); - -        p.instance = loader.instance(); - -    } else { -        qDebug("Loading pluing: %s [failed]", qUtf8Printable(path)); -        qDebug("%s", qUtf8Printable(loader.errorString())); -    } - -    return p; -} - -#endif // SMOLBOTE_PLUGIN_H  | 
