xref: /OK3568_Linux_fs/app/forlinx/flapp/src/libs/core/plughandler.cpp (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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