1 #include "plughandler.h"
2 #include <QPluginLoader>
3 #include <QCoreApplication>
4 #include <QDir>
5 #include <QDebug>
6 #include <QJsonArray>
7 #include <QGlobalStatic>
8 #include <QTimer>
9
10 Q_GLOBAL_STATIC(PlugHandler, s_instance)
11 class PlugHandlerPrivate
12 {
13 public:
14 QMap<QString, IPlugin *> plugins;
15 QMap<QString, QPluginLoader*> loaders;
16 };
PlugHandler(QObject * parent)17 PlugHandler::PlugHandler(QObject *parent) : QObject(parent),
18 m_d(new PlugHandlerPrivate)
19 {
20 }
21
~PlugHandler()22 PlugHandler::~PlugHandler()
23 {
24 delete m_d;
25 }
26
instance()27 PlugHandler *PlugHandler::instance()
28 {
29 return s_instance;
30 }
31
getShowPlugins()32 QStringList PlugHandler::getShowPlugins()
33 {
34 QStringList list;
35 QDir pluginsDir = QDir(qApp->applicationDirPath()+"/../plugins");
36
37 int i=0;
38 qDebug()<<"plugins :"<< pluginsDir.entryInfoList(QDir::Files).size();
39 foreach (QString fileName, pluginsDir.entryList(QDir::Files)) {
40 QPluginLoader loader(pluginsDir.absoluteFilePath(fileName));
41 if(loader.load()){
42
43 QJsonObject json = loader.metaData();
44 QJsonObject object =json.value("MetaData").toObject();
45 QJsonArray arry = object.value("Keys").toArray();
46 foreach (QJsonValue v, arry) {
47 i++;
48 qDebug()<< QString("plugins%1: %2").arg(i).arg(v.toString());
49 list << v.toString();
50 }
51 qDebug() <<"unload "+ list.last()<< loader.unload();
52 }
53 }
54
55 return list;
56 }
57
loadPlugins(const QString & id)58 void PlugHandler::loadPlugins(const QString &id)
59 {
60 if(plugins().contains(id) || id.isEmpty()){
61 qDebug()<<QString("Not find plugins %1 or already loaded").arg(id);
62 return;
63 }
64 QDir pluginsDir = QDir(qApp->applicationDirPath()+"/../plugins");
65 qDebug()<<"count "<< pluginsDir.entryInfoList(QDir::Files).size();
66
67 foreach (QString fileName, pluginsDir.entryList(QDir::Files)) {
68
69 QPluginLoader *loader = new QPluginLoader(pluginsDir.absoluteFilePath(fileName));
70
71 if(loader->load())
72 {
73 QJsonObject json = loader->metaData();
74 QJsonObject object =json.value("MetaData").toObject();
75 QJsonArray arry = object.value("Keys").toArray();
76
77 if(arry.contains(id))
78 {
79 IPlugin *p = dynamic_cast<IPlugin*>(loader->instance());
80 if(p)
81 {
82 m_d->plugins.insert(p->id(), p);
83 m_d->loaders.insert(p->id(), loader);
84 qDebug()<<"load " << p->id();
85 break;
86 }
87 }
88 }
89
90 loader->unload();
91 delete loader;
92 }
93 }
94
unloadPlugins(const QString & id)95 bool PlugHandler::unloadPlugins(const QString &id)
96 {
97 bool bResult = false;
98 if(m_d->plugins.keys().contains(id))
99 {
100 m_d->plugins.remove(id);
101 QPluginLoader *loader = m_d->loaders.value(id);
102 if(loader && loader->unload())
103 {
104 delete loader;
105 bResult = true;
106 qDebug()<<"unload plugins:" << id;
107 m_d->loaders.remove(id);
108 }else{
109 qDebug()<<"unkown error:" << id;
110 }
111 }
112
113 return bResult;
114 }
115
plugins()116 QMap<QString, IPlugin *> PlugHandler::plugins()
117 {
118 return m_d->plugins;
119 }
120