diff --git a/libsearch/libsearch.pro b/libsearch/libsearch.pro index 6b9c2d8..03921e2 100644 --- a/libsearch/libsearch.pro +++ b/libsearch/libsearch.pro @@ -1,5 +1,6 @@ QT += core xml widgets dbus concurrent VERSION = 0.0.1 +DEFINES += VERSION='\\"$${VERSION}\\"' TARGET = ukui-search TEMPLATE = lib @@ -16,6 +17,9 @@ CONFIG += c++11 link_pkgconfig no_keywords lrelease # deprecated API in order to know how to port your code away from it. DEFINES += QT_DEPRECATED_WARNINGS +PLUGIN_INSTALL_DIRS = $$[QT_INSTALL_LIBS]/ukui-search-plugins +DEFINES += PLUGIN_INSTALL_DIRS='\\"$${PLUGIN_INSTALL_DIRS}\\"' + # You can also make your code fail to compile if it uses deprecated APIs. # In order to do so, uncomment the following line. # You can also select to disable deprecated APIs only up to a certain version of Qt. @@ -25,7 +29,8 @@ include(index/index.pri) include(parser/parser.pri)) include(appsearch/appsearch.pri) include(settingsearch/settingsearch.pri)) -include(plugininterface/plugininterface.pri) +include(plugininterface/plugin-interface.pri) +include(pluginmanage/plugin-manager.pri) LIBS += -L$$OUT_PWD/../libchinese-segmentation/ -lchinese-segmentation LIBS += -lxapian -lquazip5 -luchardet diff --git a/libsearch/plugininterface/plugin-iface.h b/libsearch/plugininterface/plugin-iface.h index e5b8922..cf4a2c7 100644 --- a/libsearch/plugininterface/plugin-iface.h +++ b/libsearch/plugininterface/plugin-iface.h @@ -6,7 +6,7 @@ namespace Zeeker { class PluginInterface { public: - enum PluginType + enum class PluginType { MenuPlugin, PreviewPagePlugin, diff --git a/libsearch/plugininterface/plugininterface.pri b/libsearch/plugininterface/plugin-interface.pri similarity index 89% rename from libsearch/plugininterface/plugininterface.pri rename to libsearch/plugininterface/plugin-interface.pri index 508cfbb..694ab73 100644 --- a/libsearch/plugininterface/plugininterface.pri +++ b/libsearch/plugininterface/plugin-interface.pri @@ -4,4 +4,3 @@ HEADERS += \ $$PWD/plugin-iface.h \ $$PWD/search-plugin-iface.h -SOURCES += diff --git a/libsearch/plugininterface/search-plugin-iface.h b/libsearch/plugininterface/search-plugin-iface.h index ff3c477..19806d7 100644 --- a/libsearch/plugininterface/search-plugin-iface.h +++ b/libsearch/plugininterface/search-plugin-iface.h @@ -11,9 +11,9 @@ namespace Zeeker { class SearchPluginIface : public PluginInterface { public: - /// - /// \brief The resultInfo struct - /// + /** + * @brief The resultInfo struct + */ struct resultInfo { QIcon icon; @@ -21,13 +21,13 @@ public: QString description; QMap actionMap;//action name and action key }; - virtual ~SearchInterface(){} + virtual ~SearchPluginIface() {} virtual QString getPluginName() = 0; - virtual void KeywordSearch(QString keyword,QQueue); - virtual void openAction(QString key); + virtual void KeywordSearch(QString keyword,QQueue *searchResult); + virtual void openAction(QString name, QString key); }; } -Q_DECLARE_INTERFACE(SearchPluginIface, SearchPluginIface_iid) +Q_DECLARE_INTERFACE(Zeeker::SearchPluginIface, SearchPluginIface_iid) #endif // SEARCHPLUGINIFACE_H diff --git a/libsearch/pluginmanage/plugin-manager.cpp b/libsearch/pluginmanage/plugin-manager.cpp new file mode 100644 index 0000000..6fbb124 --- /dev/null +++ b/libsearch/pluginmanage/plugin-manager.cpp @@ -0,0 +1,59 @@ +#include "plugin-manager.h" +#include "search-plugin-manager.h" + +using namespace Zeeker; + +static PluginManager *global_instance = nullptr; +void PluginManager::init() +{ + PluginManager::getInstance(); +} + +PluginManager *PluginManager::getInstance() +{ + if (!global_instance) { + global_instance = new PluginManager; + } + return global_instance; +} + +void PluginManager::setPluginEnableByName(const QString &pluginName, bool enable) +{ + m_hash.value(pluginName)->setEnable(enable); +} + +PluginManager::PluginManager(QObject *parent) : QObject(parent) +{ + QDir pluginsDir(PLUGIN_INSTALL_DIRS); + pluginsDir.setFilter(QDir::Files); + + Q_FOREACH(QString fileName, pluginsDir.entryList(QDir::Files)) { + QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(fileName)); + // version check + if (pluginLoader.metaData().value("MetaData").toObject().value("version").toString() != VERSION) + continue; + + QObject *plugin = pluginLoader.instance(); + if (!plugin) + continue; + PluginInterface *piface = dynamic_cast(plugin); + if (!piface) + continue; + m_hash.insert(piface->name(), piface); + switch (piface->pluginType()) { + case PluginInterface::PluginType::SearchPlugin: { + auto p = dynamic_cast(plugin); + SearchPluginManager::getInstance()->registerPlugin(p); + break; + } + default: + break; + } + } +} + +PluginManager::~PluginManager() +{ + m_hash.clear(); + SearchPluginManager::getInstance()->close(); +} diff --git a/libsearch/pluginmanage/plugin-manager.h b/libsearch/pluginmanage/plugin-manager.h new file mode 100644 index 0000000..567647b --- /dev/null +++ b/libsearch/pluginmanage/plugin-manager.h @@ -0,0 +1,38 @@ +#ifndef PLUGINMANAGER_H +#define PLUGINMANAGER_H + +#include +#include +#include +#include +#include +#include "libsearch_global.h" +#include "plugininterface/plugin-iface.h" +#include "plugininterface/search-plugin-iface.h" + +namespace Zeeker { +class LIBSEARCH_EXPORT PluginManager : public QObject +{ + Q_OBJECT +public: + static void init(); + static PluginManager *getInstance(); + void close(); + +Q_SIGNALS: + void pluginStateChanged(const QString &pluginName, bool enable); + +public Q_SLOTS: + void setPluginEnableByName(const QString &pluginName, bool enable); + +private: + explicit PluginManager(QObject *parent = nullptr); + + ~PluginManager(); + + QHash m_hash; + +}; +} + +#endif // PLUGINMANAGER_H diff --git a/libsearch/pluginmanage/plugin-manager.pri b/libsearch/pluginmanage/plugin-manager.pri new file mode 100644 index 0000000..41847f8 --- /dev/null +++ b/libsearch/pluginmanage/plugin-manager.pri @@ -0,0 +1,9 @@ +INCLUDEPATH += $$PWD + +HEADERS += \ + $$PWD/search-plugin-manager.h \ + $$PWD/plugin-manager.h + +SOURCES += \ + $$PWD/search-plugin-manager.cpp \ + $$PWD/plugin-manager.cpp diff --git a/libsearch/pluginmanage/search-plugin-manager.cpp b/libsearch/pluginmanage/search-plugin-manager.cpp new file mode 100644 index 0000000..f81bbe0 --- /dev/null +++ b/libsearch/pluginmanage/search-plugin-manager.cpp @@ -0,0 +1,40 @@ +#include "search-plugin-manager.h" + +using namespace Zeeker; + +static SearchPluginManager *global_instance = nullptr; +bool SearchPluginManager::registerPlugin(Zeeker::SearchPluginIface *plugin) +{ + if (m_hash.value(plugin->name())) { + return false; + } + m_hash.insert(plugin->name(), plugin); + return true; +} + +SearchPluginManager *SearchPluginManager::getInstance() +{ + if (!global_instance) { + global_instance = new SearchPluginManager; + } + return global_instance; +} + +const QStringList SearchPluginManager::getPluginIds() +{ + return m_hash.keys(); +} + +SearchPluginIface *SearchPluginManager::getPlugin(const QString &pluginId) +{ + return m_hash.value(pluginId); +} + +void SearchPluginManager::close() +{ + this->deleteLater(); +} + +SearchPluginManager::SearchPluginManager(QObject *parent) +{ +} diff --git a/libsearch/pluginmanage/search-plugin-manager.h b/libsearch/pluginmanage/search-plugin-manager.h new file mode 100644 index 0000000..6c93d47 --- /dev/null +++ b/libsearch/pluginmanage/search-plugin-manager.h @@ -0,0 +1,29 @@ +#ifndef SEARCHPLUGINFACTORY_H +#define SEARCHPLUGINFACTORY_H + +#include +#include "plugininterface/search-plugin-iface.h" + +namespace Zeeker { +class SearchPluginManager : public QObject +{ + Q_OBJECT +public: + bool registerPlugin(SearchPluginIface *plugin); + + static SearchPluginManager *getInstance(); + const QStringList getPluginIds(); + SearchPluginIface *getPlugin(const QString &pluginId); + + void close(); + +private: + QHash m_hash; + + explicit SearchPluginManager(QObject *parent = nullptr); + ~SearchPluginManager(); + +}; +} + +#endif // SEARCHPLUGINFACTORY_H