206 lines
6.2 KiB
C++
206 lines
6.2 KiB
C++
/*
|
|
*
|
|
* Copyright (C) 2023, KylinSoft Co., Ltd.
|
|
*
|
|
* 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 <https://www.gnu.org/licenses/>.
|
|
*
|
|
* Authors: iaom <zhangpengfei@kylinos.cn>
|
|
*/
|
|
#include "search-task-plugin-manager.h"
|
|
#include <QDebug>
|
|
#include <QPluginLoader>
|
|
|
|
#include "file-search-task.h"
|
|
#include "file-content-search-task.h"
|
|
#include "app-search-task.h"
|
|
|
|
using namespace UkuiSearch;
|
|
static SearchTaskPluginManager *global_instance = nullptr;
|
|
SearchTaskPluginManager *SearchTaskPluginManager::getInstance()
|
|
{
|
|
if (!global_instance) {
|
|
global_instance = new SearchTaskPluginManager;
|
|
}
|
|
return global_instance;
|
|
}
|
|
|
|
SearchTaskPluginManager::SearchTaskPluginManager(QObject *parent) : QObject(parent)
|
|
{
|
|
}
|
|
|
|
bool SearchTaskPluginManager::startSearch(const QUuid &uuid, SearchProperty::SearchType searchType, const QString &customType)
|
|
{
|
|
QMutexLocker locker(&m_mutex);
|
|
if (m_managedPlugins.contains(uuid)) {
|
|
ManagedPlugin* managedPlugin = m_managedPlugins.value(uuid);
|
|
|
|
SearchTaskPluginIface *plugin = nullptr;
|
|
if (searchType == SearchProperty::SearchType::Custom) {
|
|
plugin = managedPlugin->externalPlugin(customType);
|
|
|
|
} else {
|
|
plugin = managedPlugin->internalPlugin(searchType);
|
|
}
|
|
|
|
if (plugin) {
|
|
plugin->startSearch();
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
SearchTaskPluginIface *SearchTaskPluginManager::getPlugin(SearchProperty::SearchType searchType, const QString& customType)
|
|
{
|
|
SearchTaskPluginIface *searchPlugin = nullptr;
|
|
if (searchType == SearchProperty::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 SearchProperty::SearchType::File:
|
|
searchPlugin = new FileSearchTask();
|
|
break;
|
|
case SearchProperty::SearchType::FileContent:
|
|
searchPlugin = new FileContentSearchTask();
|
|
break;
|
|
case SearchProperty::SearchType::Application:
|
|
searchPlugin = new AppSearchTask();
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
return searchPlugin;
|
|
}
|
|
|
|
void SearchTaskPluginManager::registerPluginPath(const QString& customType, const QString &pluginPath)
|
|
{
|
|
QMutexLocker locker(&m_mutex);
|
|
if (!m_loadedPluginPath.contains(customType)) {
|
|
m_loadedPluginPath.insert(customType, pluginPath);
|
|
}
|
|
}
|
|
|
|
bool SearchTaskPluginManager::isSearching(const QUuid &uuid, SearchProperty::SearchType searchType, const QString &customType)
|
|
{
|
|
QMutexLocker locker(&m_mutex);
|
|
if (m_managedPlugins.contains(uuid)) {
|
|
ManagedPlugin* managedPlugin = m_managedPlugins.value(uuid);
|
|
|
|
SearchTaskPluginIface *plugin = nullptr;
|
|
if (searchType == SearchProperty::SearchType::Custom) {
|
|
plugin = managedPlugin->externalPlugin(customType);
|
|
|
|
} else {
|
|
plugin = managedPlugin->internalPlugin(searchType);
|
|
}
|
|
|
|
if (plugin) {
|
|
return plugin->isSearching();
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
SearchTaskPluginIface *SearchTaskPluginManager::initPlugins(const QUuid& uuid, SearchProperty::SearchType searchType, const QString& customType)
|
|
{
|
|
QMutexLocker locker(&m_mutex);
|
|
if (!m_managedPlugins.contains(uuid)) {
|
|
m_managedPlugins.insert(uuid, new ManagedPlugin(nullptr));
|
|
}
|
|
|
|
SearchTaskPluginIface *plugin = getPlugin(searchType, customType);
|
|
bool succeed = false;
|
|
if (searchType == SearchProperty::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)
|
|
{
|
|
QMutexLocker locker(&m_mutex);
|
|
delete m_managedPlugins.take(uuid);
|
|
}
|
|
|
|
ManagedPlugin::~ManagedPlugin()
|
|
{
|
|
qDeleteAll(m_internalPlugins);
|
|
qDeleteAll(m_externalPlugin);
|
|
}
|
|
|
|
bool ManagedPlugin::insertInternalPlugin(const SearchProperty::SearchType &searchType, SearchTaskPluginIface *plugin)
|
|
{
|
|
QMutexLocker locker(&m_mutex);
|
|
if (plugin) {
|
|
auto type = static_cast<size_t>(searchType);
|
|
plugin->setParent(this);
|
|
|
|
if (!m_internalPlugins.contains(type)) {
|
|
m_internalPlugins.insert(type, plugin);
|
|
return true;
|
|
}
|
|
|
|
delete plugin;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
bool ManagedPlugin::insertExternalPlugin(const QString &customType, SearchTaskPluginIface *plugin)
|
|
{
|
|
QMutexLocker locker(&m_mutex);
|
|
if (plugin) {
|
|
plugin->setParent(this);
|
|
if (!customType.isEmpty() && !m_externalPlugin.contains(customType)) {
|
|
m_externalPlugin.insert(customType, plugin);
|
|
return true;
|
|
}
|
|
|
|
delete plugin;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
inline SearchTaskPluginIface *ManagedPlugin::internalPlugin(const SearchProperty::SearchType &searchType)
|
|
{
|
|
QMutexLocker locker(&m_mutex);
|
|
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)
|
|
{
|
|
QMutexLocker locker(&m_mutex);
|
|
if (m_externalPlugin.contains(customType)) {
|
|
return m_externalPlugin.value(customType);
|
|
}
|
|
return nullptr;
|
|
}
|