-
Notifications
You must be signed in to change notification settings - Fork 39
Expand file tree
/
Copy pathpluginmanager.cpp
More file actions
106 lines (80 loc) · 2.9 KB
/
Copy pathpluginmanager.cpp
File metadata and controls
106 lines (80 loc) · 2.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd.
//
// SPDX-License-Identifier: GPL-3.0-or-later
#include "pluginmanager.h"
#include <QDir>
#include <QLibrary>
#include <QPluginLoader>
#include <QJsonObject>
#include <QJsonArray>
static const QString FieldDescription = "description";
static const QString FieldFilters = "filters";
static const QString FieldExec = "exec";
static const QString FilterAction = "action_id";
PluginManager::PluginManager(QObject *parent)
: QObject(parent)
{
load();
}
QList<QButtonGroup*> PluginManager::reduceGetOptions(const QString &actionID)
{
QList<QButtonGroup*> ret;
for (AgentExtension *plugin : m_plugins) {
if (plugin->interestedActions().contains(actionID) || plugin->interestedActions().isEmpty()) {
ret << plugin->options();
}
}
return ret;
}
void PluginManager::load()
{
QStringList pluginsDirs = QProcessEnvironment::systemEnvironment().value("DDE_POLKIT_AGENT_PLUGINS_DIRS").split(QDir::listSeparator(), Qt::SkipEmptyParts);
pluginsDirs.append("/usr/lib/polkit-1-dde/plugins/");
for (const QString &dirName : pluginsDirs) {
QDir dir(dirName);
QFileInfoList pluginFiles = dir.entryInfoList((QStringList("*.so")));
for (const QFileInfo &pluginFile : pluginFiles) {
// dpa-ext-gnonekeyring 项目暂时无实质作用,如果安装过 dpa-ext-gnonekeyring 包, 进行一个过滤。
if (pluginFile.fileName() == "libdpa-ext-gnomekeyring.so") continue;
AgentExtension *plugin = loadFile(pluginFile.absoluteFilePath());
if (plugin)
m_plugins << plugin;
}
}
}
AgentExtension *PluginManager::loadFile(const QString &filePath)
{
qDebug() << "try to load plugin: " << filePath;
if (!QLibrary::isLibrary(filePath))
return nullptr;
QPluginLoader *loader = new QPluginLoader(filePath, this);
const QJsonObject meta = loader->metaData().value("MetaData").toObject();
const QString apiVersion = meta.value("api_version").toString();
if (apiVersion == "1.0") {
AgentExtension *extend = qobject_cast<AgentExtension*>(loader->instance());
if (extend)
extend->initialize(this);
qDebug() << "done loading plugin: " << filePath;
return extend;
}
qWarning() << "failed to load plugin file: " << loader->errorString();
loader->unload();
loader->deleteLater();
return nullptr;
}
void PluginManager::reduce(const QString &username, const QString passwd)
{
m_username = username;
m_password = passwd;
for (AgentExtension *plugin : m_plugins) {
if (plugin->interestedActions().contains(m_actionID) || plugin->interestedActions().isEmpty()) {
plugin->extendedDo();
}
}
m_username = "";
m_password = "";
}
void PluginManager::setActionID(const QString &actionID)
{
m_actionID = actionID;
}