| 1 | // SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. |
| 2 | // |
| 3 | // SPDX-License-Identifier: GPL-3.0-or-later |
| 4 | |
| 5 | #ifndef PLUGINMETAOBJECT_H |
| 6 | #define PLUGINMETAOBJECT_H |
| 7 | |
| 8 | #include "framework/framework_global.h" |
| 9 | #include "framework/lifecycle/plugindepend.h" |
| 10 | |
| 11 | #include <QSharedData> |
| 12 | #include <QPluginLoader> |
| 13 | |
| 14 | DPF_BEGIN_NAMESPACE |
| 15 | |
| 16 | /** |
| 17 | * @brief PluginMetaT1 模板类 |
| 18 | * @details 此模板类为扩展特性,可实现不同插件元数据 |
| 19 | * 目前只是预留接口 |
| 20 | * @tparam 传入插件对象接口例如 Plugin |
| 21 | */ |
| 22 | template <class T> |
| 23 | class PluginMetaT1 : public QSharedData |
| 24 | { |
| 25 | Q_DISABLE_COPY(PluginMetaT1) |
| 26 | public: |
| 27 | PluginMetaT1(){} |
| 28 | }; |
| 29 | |
| 30 | /** 插件json元文件示例 |
| 31 | * @code |
| 32 | * { |
| 33 | * "Name" : "more", |
| 34 | * "Version" : "4.8.2", |
| 35 | * "CompatVersion" : "4.8.0", |
| 36 | * "Category" : "more", |
| 37 | * "Description" : "The core plugin for the Qt IDE.", |
| 38 | * "Vendor" : "The Qt Company Ltd", |
| 39 | * "Copyright" : "(C) 2019 The Qt Company Ltd", |
| 40 | * "License" : [ |
| 41 | * "https://www.gnu.org/licenses/gpl-3.0.html" |
| 42 | * ], |
| 43 | * "UrlLink" : "http://www.qt.io", |
| 44 | * "Depends" : [ |
| 45 | * {"Name" : "core", "Version" : "4.8.2"}, |
| 46 | * {"Name" : "other", "Version" : "4.8.2"} |
| 47 | * ] |
| 48 | * } |
| 49 | * @endcode |
| 50 | */ |
| 51 | |
| 52 | class Plugin; |
| 53 | class PluginContext; |
| 54 | class PluginService; |
| 55 | |
| 56 | /** |
| 57 | * @brief The PluginMetaObject class |
| 58 | * 插件元数据对象 |
| 59 | * @details 该类与SharedPointer配套使用时是线程安全的 |
| 60 | */ |
| 61 | class PluginMetaObjectPrivate; |
| 62 | class PluginMetaObject final : public PluginMetaT1<Plugin> |
| 63 | { |
| 64 | QSharedPointer<PluginMetaObjectPrivate> d; |
| 65 | |
| 66 | friend class PluginManager; |
| 67 | friend class PluginManagerPrivate; |
| 68 | friend Q_CORE_EXPORT QDebug operator<< (QDebug, const PluginMetaObject &); |
| 69 | |
| 70 | public: |
| 71 | |
| 72 | enum State { |
| 73 | Invalid, /// 插件未操作获得任何状态 |
| 74 | Reading, /// 插件正在读取Json |
| 75 | Readed, /// 插件读取Json完毕 |
| 76 | Loading, /// 插件正在加载 |
| 77 | Loaded, /// 插件已加载 |
| 78 | Initialized, /// 插件已经操作Initialized函数 |
| 79 | Started, /// 插件已经操作Start函数 |
| 80 | Stoped, /// 插件已停操作Stop函数 |
| 81 | Shutdown, /// 插件卸载并已经释放 |
| 82 | }; |
| 83 | |
| 84 | PluginMetaObject(); |
| 85 | PluginMetaObject(const PluginMetaObject &meta); |
| 86 | PluginMetaObject& operator = (const PluginMetaObject &meta); |
| 87 | QString fileName() const; |
| 88 | QString iid() const; |
| 89 | QString name() const; |
| 90 | QString version() const; |
| 91 | QString compatVersion() const; |
| 92 | QString category() const; |
| 93 | QString vendor() const; |
| 94 | QString copyright() const; |
| 95 | QStringList license() const; |
| 96 | QString description() const; |
| 97 | QString urlLink() const; |
| 98 | QList<PluginDepend> depends() const; |
| 99 | State pluginState() const; |
| 100 | QSharedPointer<Plugin> plugin(); |
| 101 | bool isEnabledBySettings(); |
| 102 | bool isDisabledBySettings(); |
| 103 | void setEnabledBySettings(bool value); |
| 104 | |
| 105 | //state |
| 106 | State state() const; |
| 107 | QString errorString(); |
| 108 | }; |
| 109 | |
| 110 | typedef QSharedPointer<DPF_NAMESPACE::PluginMetaObject> PluginMetaObjectPointer; |
| 111 | |
| 112 | QT_BEGIN_NAMESPACE |
| 113 | #ifndef QT_NO_DEBUG_STREAM |
| 114 | Q_CORE_EXPORT QDebug operator<< (QDebug, const DPF_NAMESPACE::PluginMetaObject &); |
| 115 | Q_CORE_EXPORT QDebug operator<< (QDebug, const DPF_NAMESPACE::PluginMetaObjectPointer &); |
| 116 | #endif //QT_NO_DEBUG_STREAM |
| 117 | QT_END_NAMESPACE |
| 118 | |
| 119 | DPF_END_NAMESPACE |
| 120 | |
| 121 | #endif // PLUGINMETAOBJECT_H |
| 122 | |