forked from openkylin/ukui-search
修改搜索服务searchtask与搜索插件的对应关系.
This commit is contained in:
parent
78fb35c8e1
commit
6d419424bf
|
@ -64,6 +64,7 @@ PluginManager::PluginManager(QObject *parent) : QObject(parent)
|
||||||
case PluginInterface::PluginType::SearchTaskPlugin: {
|
case PluginInterface::PluginType::SearchTaskPlugin: {
|
||||||
auto p = dynamic_cast<SearchTaskPluginIface*>(plugin);
|
auto p = dynamic_cast<SearchTaskPluginIface*>(plugin);
|
||||||
SearchTaskPluginManager::getInstance()->registerPlugin(p);
|
SearchTaskPluginManager::getInstance()->registerPlugin(p);
|
||||||
|
SearchTaskPluginManager::getInstance()->registerPluginPath(p->getCustomSearchType(), pluginsDir.absoluteFilePath(fileName));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
#include "search-task-plugin-manager.h"
|
#include "search-task-plugin-manager.h"
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
|
#include <QPluginLoader>
|
||||||
|
|
||||||
#include "file-search-task.h"
|
#include "file-search-task.h"
|
||||||
#include "file-content-search-task.h"
|
#include "file-content-search-task.h"
|
||||||
|
@ -83,3 +84,142 @@ void SearchTaskPluginManager::pluginSearch(QString customSearchType, std::shared
|
||||||
Q_EMIT this->searchError(searchController.get()->getCurrentSearchId(), tr("plugin type: %1, is not registered!").arg(customSearchType));
|
Q_EMIT this->searchError(searchController.get()->getCurrentSearchId(), tr("plugin type: %1, is not registered!").arg(customSearchType));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool SearchTaskPluginManager::startSearch(const QUuid &uuid, std::shared_ptr<SearchController> searchController, SearchType searchType, const QString &customType)
|
||||||
|
{
|
||||||
|
if (m_managedPlugins.contains(uuid)) {
|
||||||
|
ManagedPlugin* managedPlugin = m_managedPlugins.value(uuid);
|
||||||
|
|
||||||
|
SearchTaskPluginIface *plugin = nullptr;
|
||||||
|
if (searchType == SearchType::Custom) {
|
||||||
|
plugin = managedPlugin->externalPlugin(customType);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
plugin = managedPlugin->internalPlugin(searchType);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (plugin) {
|
||||||
|
plugin->startSearch(std::move(searchController));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
SearchTaskPluginIface *SearchTaskPluginManager::getPlugin(SearchType searchType, const QString& customType)
|
||||||
|
{
|
||||||
|
SearchTaskPluginIface *searchPlugin = nullptr;
|
||||||
|
if (searchType == SearchType::Custom) {
|
||||||
|
if (m_loadedPluginPath.contains(customType)) {
|
||||||
|
QPluginLoader pluginLoader(m_loadedPluginPath.value(customType));
|
||||||
|
QObject *plugin = pluginLoader.instance();
|
||||||
|
if (plugin) {
|
||||||
|
searchPlugin = dynamic_cast<SearchTaskPluginIface*>(plugin);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
switch (searchType) {
|
||||||
|
case SearchType::File:
|
||||||
|
searchPlugin = new FileSearchTask(this);
|
||||||
|
break;
|
||||||
|
case SearchType::FileContent:
|
||||||
|
searchPlugin = new FileContentSearchTask(this);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return searchPlugin;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SearchTaskPluginManager::registerPluginPath(const QString& customType, const QString &pluginPath)
|
||||||
|
{
|
||||||
|
if (!m_loadedPluginPath.contains(customType)) {
|
||||||
|
m_loadedPluginPath.insert(customType, pluginPath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SearchTaskPluginIface *SearchTaskPluginManager::initPlugins(const QUuid& uuid, SearchType searchType, const QString& customType)
|
||||||
|
{
|
||||||
|
if (!m_managedPlugins.contains(uuid)) {
|
||||||
|
m_managedPlugins.insert(uuid, new ManagedPlugin(nullptr));
|
||||||
|
}
|
||||||
|
|
||||||
|
SearchTaskPluginIface *plugin = getPlugin(searchType, customType);
|
||||||
|
bool succeed = false;
|
||||||
|
if (searchType == SearchType::Custom) {
|
||||||
|
succeed = m_managedPlugins.value(uuid)->insertExternalPlugin(customType, plugin);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
succeed = m_managedPlugins.value(uuid)->insertInternalPlugin(searchType, plugin);
|
||||||
|
}
|
||||||
|
|
||||||
|
return succeed ? plugin : nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SearchTaskPluginManager::destroyPlugins(const QUuid &uuid)
|
||||||
|
{
|
||||||
|
if (m_managedPlugins.contains(uuid)) {
|
||||||
|
ManagedPlugin *managedPlugin = m_managedPlugins.value(uuid);
|
||||||
|
m_managedPlugins.remove(uuid);
|
||||||
|
|
||||||
|
delete managedPlugin;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ManagedPlugin::~ManagedPlugin()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ManagedPlugin::insertInternalPlugin(const SearchType &searchType, SearchTaskPluginIface *plugin)
|
||||||
|
{
|
||||||
|
if (plugin) {
|
||||||
|
auto type = static_cast<size_t>(searchType);
|
||||||
|
plugin->setParent(this);
|
||||||
|
|
||||||
|
if (!m_internalPlugins.contains(type)) {
|
||||||
|
m_internalPlugins.insert(type, plugin);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
plugin->deleteLater();
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ManagedPlugin::insertExternalPlugin(const QString &customType, SearchTaskPluginIface *plugin)
|
||||||
|
{
|
||||||
|
if (plugin) {
|
||||||
|
plugin->setParent(this);
|
||||||
|
if (!customType.isEmpty() && !m_externalPlugin.contains(customType)) {
|
||||||
|
m_externalPlugin.insert(customType, plugin);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
plugin->deleteLater();
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline SearchTaskPluginIface *ManagedPlugin::internalPlugin(const SearchType &searchType)
|
||||||
|
{
|
||||||
|
auto type = static_cast<size_t>(searchType);
|
||||||
|
if (m_internalPlugins.contains(type)) {
|
||||||
|
return m_internalPlugins.value(type);
|
||||||
|
}
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline SearchTaskPluginIface *ManagedPlugin::externalPlugin(const QString &customType)
|
||||||
|
{
|
||||||
|
if (m_externalPlugin.contains(customType)) {
|
||||||
|
return m_externalPlugin.value(customType);
|
||||||
|
}
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
|
@ -2,19 +2,46 @@
|
||||||
#define SEARCHTASKPLUGINMANAGER_H
|
#define SEARCHTASKPLUGINMANAGER_H
|
||||||
|
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
|
#include <QUuid>
|
||||||
#include "search-task-plugin-iface.h"
|
#include "search-task-plugin-iface.h"
|
||||||
|
|
||||||
namespace UkuiSearch {
|
namespace UkuiSearch {
|
||||||
|
|
||||||
|
class ManagedPlugin : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
explicit ManagedPlugin(QObject *parent) : QObject(parent) {}
|
||||||
|
~ManagedPlugin() override;
|
||||||
|
|
||||||
|
inline SearchTaskPluginIface *internalPlugin(const SearchType& searchType);
|
||||||
|
inline SearchTaskPluginIface *externalPlugin(const QString& customType);
|
||||||
|
|
||||||
|
bool insertInternalPlugin(const SearchType& searchType, SearchTaskPluginIface* plugin);
|
||||||
|
bool insertExternalPlugin(const QString& customType, SearchTaskPluginIface* plugin);
|
||||||
|
|
||||||
|
private:
|
||||||
|
QMap<size_t, SearchTaskPluginIface*> m_internalPlugins;
|
||||||
|
QMap<QString, SearchTaskPluginIface*> m_externalPlugin;
|
||||||
|
};
|
||||||
|
|
||||||
class SearchTaskPluginManager : public QObject
|
class SearchTaskPluginManager : public QObject
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
static SearchTaskPluginManager *getInstance();
|
static SearchTaskPluginManager *getInstance();
|
||||||
void initPlugins(SearchType searchType);
|
void initPlugins(SearchType searchType);
|
||||||
|
SearchTaskPluginIface *initPlugins(const QUuid&, SearchType, const QString& customType = QString());
|
||||||
bool registerPlugin(SearchTaskPluginIface *plugin);
|
bool registerPlugin(SearchTaskPluginIface *plugin);
|
||||||
bool registerBuildinPlugin(SearchTaskPluginIface *plugin);
|
bool registerBuildinPlugin(SearchTaskPluginIface *plugin);
|
||||||
void pluginSearch(SearchType searchType, std::shared_ptr<SearchController> searchController);
|
void pluginSearch(SearchType searchType, std::shared_ptr<SearchController> searchController);
|
||||||
void pluginSearch(QString customSearchType, std::shared_ptr<SearchController> searchController);
|
void pluginSearch(QString customSearchType, std::shared_ptr<SearchController> searchController);
|
||||||
|
bool startSearch(const QUuid&, std::shared_ptr<SearchController>, SearchType, const QString& customType = QString());
|
||||||
|
void destroyPlugins(const QUuid& uuid);
|
||||||
|
|
||||||
|
SearchTaskPluginIface *getPlugin(SearchType searchType, const QString& customType = QString());
|
||||||
|
void registerPluginPath(const QString& customType, const QString& pluginPath);
|
||||||
|
|
||||||
Q_SIGNALS:
|
Q_SIGNALS:
|
||||||
void searchFinished(size_t searchId);
|
void searchFinished(size_t searchId);
|
||||||
void searchError(size_t searchId, QString msg);
|
void searchError(size_t searchId, QString msg);
|
||||||
|
@ -25,7 +52,8 @@ private:
|
||||||
//这里初衷是把内外部插件分开管理,内部插件可以增加枚举值,外部插件似乎只能用编写者自定义的字符串区分?
|
//这里初衷是把内外部插件分开管理,内部插件可以增加枚举值,外部插件似乎只能用编写者自定义的字符串区分?
|
||||||
QHash<size_t, SearchTaskPluginIface*> m_buildinPlugin;
|
QHash<size_t, SearchTaskPluginIface*> m_buildinPlugin;
|
||||||
QHash<QString, SearchTaskPluginIface*> m_loadedPlugin;
|
QHash<QString, SearchTaskPluginIface*> m_loadedPlugin;
|
||||||
|
QMap<QString, QString> m_loadedPluginPath;
|
||||||
|
QMap<QUuid, ManagedPlugin*> m_managedPlugins;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -112,7 +112,7 @@ void SearchControllerPrivate::finishSearchIdCheck()
|
||||||
void SearchControllerPrivate::stop()
|
void SearchControllerPrivate::stop()
|
||||||
{
|
{
|
||||||
m_searchIdMutex.lock();
|
m_searchIdMutex.lock();
|
||||||
m_searchId = 0;
|
m_searchId += 1;
|
||||||
m_searchIdMutex.unlock();
|
m_searchIdMutex.unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -5,9 +5,12 @@
|
||||||
#include <QThreadPool>
|
#include <QThreadPool>
|
||||||
#include <QMutex>
|
#include <QMutex>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
#include <QUuid>
|
||||||
|
|
||||||
#include "data-queue.h"
|
#include "data-queue.h"
|
||||||
#include "search-controller.h"
|
#include "search-controller.h"
|
||||||
|
#include "search-task-plugin-iface.h"
|
||||||
|
|
||||||
namespace UkuiSearch {
|
namespace UkuiSearch {
|
||||||
class UkuiSearchTaskPrivate : public QObject
|
class UkuiSearchTaskPrivate : public QObject
|
||||||
{
|
{
|
||||||
|
@ -23,23 +26,25 @@ public:
|
||||||
void setOnlySearchFile(bool onlySearchFile);
|
void setOnlySearchFile(bool onlySearchFile);
|
||||||
void setOnlySearchDir(bool onlySearchDir);
|
void setOnlySearchDir(bool onlySearchDir);
|
||||||
void setSearchOnlineApps(bool searchOnlineApps);
|
void setSearchOnlineApps(bool searchOnlineApps);
|
||||||
void initSearchPlugin(SearchType searchType);
|
void initSearchPlugin(SearchType searchType, const QString& customSearchType = QString());
|
||||||
void clearAllConditions();
|
void clearAllConditions();
|
||||||
void clearKeyWords();
|
void clearKeyWords();
|
||||||
void clearSearchDir();
|
void clearSearchDir();
|
||||||
void clearFileLabel();
|
void clearFileLabel();
|
||||||
void setPagination(unsigned int first, unsigned int maxResults);
|
void setPagination(unsigned int first, unsigned int maxResults);
|
||||||
|
|
||||||
size_t startSearch(SearchType searchtype, QString customSearchType = QString());
|
size_t startSearch(SearchType searchtype, const QString& customSearchType = QString());
|
||||||
void stop();
|
void stop();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::shared_ptr<SearchController> m_searchCotroller = nullptr;
|
std::shared_ptr<SearchController> m_searchCotroller = nullptr;
|
||||||
size_t m_searchId = 0;
|
size_t m_searchId = 0;
|
||||||
UkuiSearchTask* q = nullptr;
|
UkuiSearchTask* q = nullptr;
|
||||||
|
QUuid m_uuid;
|
||||||
|
|
||||||
Q_SIGNALS:
|
Q_SIGNALS:
|
||||||
void searchFinished(size_t searchId);
|
void searchFinished(size_t searchId);
|
||||||
|
void searchError(size_t searchId, QString msg);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -7,14 +7,14 @@ UkuiSearchTaskPrivate::UkuiSearchTaskPrivate(UkuiSearchTask *parent)
|
||||||
: QObject(parent),
|
: QObject(parent),
|
||||||
q(parent)
|
q(parent)
|
||||||
{
|
{
|
||||||
m_searchCotroller = std::shared_ptr<SearchController>(new SearchController());
|
m_searchCotroller = std::make_shared<SearchController>();
|
||||||
connect(SearchTaskPluginManager::getInstance(), &SearchTaskPluginManager::searchFinished, this, &UkuiSearchTaskPrivate::searchFinished);
|
m_uuid = QUuid::createUuid();
|
||||||
connect(SearchTaskPluginManager::getInstance(), &SearchTaskPluginManager::searchError, q, &UkuiSearchTask::searchError);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
UkuiSearchTaskPrivate::~UkuiSearchTaskPrivate()
|
UkuiSearchTaskPrivate::~UkuiSearchTaskPrivate()
|
||||||
{
|
{
|
||||||
this->stop();
|
this->stop();
|
||||||
|
SearchTaskPluginManager::getInstance()->destroyPlugins(m_uuid);
|
||||||
}
|
}
|
||||||
|
|
||||||
DataQueue<ResultItem> *UkuiSearchTaskPrivate::init()
|
DataQueue<ResultItem> *UkuiSearchTaskPrivate::init()
|
||||||
|
@ -56,25 +56,27 @@ void UkuiSearchTaskPrivate::setSearchOnlineApps(bool searchOnlineApps)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void UkuiSearchTaskPrivate::initSearchPlugin(SearchType searchType)
|
void UkuiSearchTaskPrivate::initSearchPlugin(SearchType searchType, const QString& customSearchType)
|
||||||
{
|
{
|
||||||
SearchTaskPluginManager::getInstance()->initPlugins(searchType);
|
SearchTaskPluginIface *plugin = SearchTaskPluginManager::getInstance()->initPlugins(m_uuid, searchType, customSearchType);
|
||||||
|
if (plugin) {
|
||||||
|
connect(plugin, &SearchTaskPluginIface::searchFinished,this, &UkuiSearchTaskPrivate::searchFinished);
|
||||||
|
connect(plugin, &SearchTaskPluginIface::searchError,this, &UkuiSearchTaskPrivate::searchError);
|
||||||
|
} else {
|
||||||
|
qWarning() << "The plugin has been initialized or the plugin failed to load.";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t UkuiSearchTaskPrivate::startSearch(SearchType searchtype, QString customSearchType)
|
size_t UkuiSearchTaskPrivate::startSearch(SearchType searchtype, const QString& customSearchType)
|
||||||
{
|
{
|
||||||
|
|
||||||
m_searchId = m_searchCotroller->refreshSearchId();
|
m_searchId = m_searchCotroller->refreshSearchId();
|
||||||
if(m_searchCotroller->getDataQueue() == nullptr) {
|
if(m_searchCotroller->getDataQueue() == nullptr) {
|
||||||
qWarning() << "the date queue has not been initialized, you need run init first!";
|
qWarning() << "the date queue has not been initialized, you need run init first!";
|
||||||
}
|
}
|
||||||
|
|
||||||
//plugin manager do async search here
|
//plugin manager do async search here
|
||||||
if(SearchType::Custom != searchtype) {
|
if (!SearchTaskPluginManager::getInstance()->startSearch(m_uuid, m_searchCotroller, searchtype, customSearchType)) {
|
||||||
SearchTaskPluginManager::getInstance()->pluginSearch(searchtype, m_searchCotroller);
|
Q_EMIT searchError(m_searchCotroller->getCurrentSearchId(), tr("Current task uuid error or an unregistered plugin is used!"));
|
||||||
} else {
|
|
||||||
SearchTaskPluginManager::getInstance()->pluginSearch(customSearchType, m_searchCotroller);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return m_searchId;
|
return m_searchId;
|
||||||
|
@ -113,6 +115,7 @@ void UkuiSearchTaskPrivate::setPagination(unsigned int first, unsigned int maxRe
|
||||||
UkuiSearchTask::UkuiSearchTask(QObject *parent) : QObject(parent), d(new UkuiSearchTaskPrivate(this))
|
UkuiSearchTask::UkuiSearchTask(QObject *parent) : QObject(parent), d(new UkuiSearchTaskPrivate(this))
|
||||||
{
|
{
|
||||||
connect(d, &UkuiSearchTaskPrivate::searchFinished, this, &UkuiSearchTask::searchFinished);
|
connect(d, &UkuiSearchTaskPrivate::searchFinished, this, &UkuiSearchTask::searchFinished);
|
||||||
|
connect(d, &UkuiSearchTaskPrivate::searchError, this, &UkuiSearchTask::searchError);
|
||||||
}
|
}
|
||||||
|
|
||||||
UkuiSearchTask::~UkuiSearchTask()
|
UkuiSearchTask::~UkuiSearchTask()
|
||||||
|
|
Loading…
Reference in New Issue