1// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd.
2//
3// SPDX-License-Identifier: GPL-3.0-or-later
4
5#include "lifecycle.h"
6#include "pluginmetaobject.h"
7
8DPF_BEGIN_NAMESPACE
9
10Q_GLOBAL_STATIC(PluginManager,pluginManager);
11
12/** @brief 设置插件身份标识,与Qt插件的IID标识接口保持一致
13 * 你可以在任何的代码块中使用,如下
14 * @code
15 * LifeCycle::setPluginIID("org.deepin.plugin.[XXX]")
16 * @encode
17 * @param QString 可以传入任意标识IID的字符
18 * @return void
19 */
20PluginManager *LifeCycle::getPluginManagerInstance()
21{
22 return pluginManager;
23}
24
25void LifeCycle::setPluginIID(const QString &pluginIID)
26{
27 return pluginManager->setPluginIID(pluginIID);
28}
29
30/** @brief 获取插件身份标识
31 * 如果当前未设置任意代码
32 * @code
33 * LifeCycle::setPluginIID("org.deepin.plugin.[XXX]")
34 * @encode
35 * @param QString 可以传入任意标识IID的字符
36 * @return void
37 */
38QString LifeCycle::pluginIID()
39{
40 return pluginManager->pluginIID();
41}
42
43/** @brief 获取设置的插件路径
44 * @return QStringList 返回插件路径列表
45 */
46QStringList LifeCycle::pluginPaths()
47{
48 return pluginManager->pluginPaths();
49}
50
51/** @brief 设置的插件路径
52 * @param const QStringList &pluginPaths 设置插件的路径
53 * @return void
54 */
55void LifeCycle::setPluginPaths(const QStringList &pluginPaths)
56{
57 return pluginManager->setPluginPaths(pluginPaths);
58}
59
60/** @brief 获取插件服务的路径
61 * @return QStringList 返回插件服务路径的列表
62 */
63QStringList LifeCycle::servicePaths()
64{
65 return pluginManager->servicePaths();
66}
67
68/** @brief 设置服务的路径列表路径
69 * @param const QStringList &servicePaths 设置插件服务的路径列表
70 * @return void
71 */
72void LifeCycle::setServicePaths(const QStringList &servicePaths)
73{
74 return pluginManager->setServicePaths(servicePaths);
75}
76
77PluginMetaObjectPointer LifeCycle::pluginMetaObj(const QString &pluginName,
78 const QString version)
79{
80 return pluginManager->pluginMetaObj(pluginName, version);
81}
82
83/** @brief 读取所有的插件的元数据
84 * @pre {
85 * 在使用该函数之前应该先调用setPluginIID与setPluginPaths函数,否则执行该函数没有任何意义
86 * }
87 * @details 该函数执行将自动扫描设置的插件路径下所有符合IID要求的插件,同时读取插件元数据。
88 * 当插件管理器PluginManager读取到相关插件元数据后,
89 * 内部将产生PluginMetaObject元数据对象,
90 * 可参阅文件pluginmetaobject.h/.cpp
91 * @return void
92 */
93bool LifeCycle::readPlugins()
94{
95 return pluginManager->readPlugins();
96}
97
98/** @brief 加载所有插件
99 * @pre {
100 * 需要先执行readPlugins,否则将无法加载任何插件
101 * }
102 * @details 内部使用QPluginLoader对读取到插件元数据的插件进行插件加载
103 * 该函数将调用 PluginManager中如下函数
104 * @code
105 * loadPlugins();
106 * initPlugins();
107 * startPlugins();
108 * @endcode
109 * 详情可参阅 class PluginManager
110 */
111bool LifeCycle::loadPlugins()
112{
113 if (!pluginManager->loadPlugins())
114 return false;
115
116 pluginManager->initPlugins();
117 pluginManager->startPlugins();
118
119 return true;
120}
121
122/** @brief 卸载所有插件
123 * @pre {
124 * 需要先执行loadPlugins,否则调用无意义
125 * }
126 * @details 内部将执行释放Plugin接口指针,
127 * 随后内部将执行QPluginLoader unloader函数,参照Qt特性
128 * 详情可参阅 class PluginManager中stopPlugins函数
129 */
130void LifeCycle::shutdownPlugins()
131{
132 pluginManager->stopPlugins();
133}
134
135void LifeCycle::setSettings(PluginSetting *settings)
136{
137 pluginManager->setSettings(settings);
138}
139
140bool LifeCycle::loadPlugin(PluginMetaObjectPointer &pointer)
141{
142 if (!pluginManager->loadPlugin(pointer))
143 return false;
144 if (!pluginManager->initPlugin(pointer))
145 return false;
146 if (!pluginManager->startPlugin(pointer))
147 return false;
148
149 return true;
150}
151
152void LifeCycle::shutdownPlugin(PluginMetaObjectPointer &pointer)
153{
154 pluginManager->stopPlugin(pointer);
155}
156
157DPF_END_NAMESPACE
158