@@ -27,6 +27,8 @@ class DynamicPluginInfo : public QPluginFactoryBase::PluginInfo
27
27
QJsonObject metaData () const override ;
28
28
QObject *instance () override ;
29
29
30
+ QPluginLoader *loader () const ;
31
+
30
32
private:
31
33
QScopedPointer<QPluginLoader, QScopedPointerDeleteLater> _loader;
32
34
};
@@ -142,10 +144,14 @@ void QPluginFactoryBase::reloadPlugins()
142
144
QScopedPointer<QPluginLoader, QScopedPointerDeleteLater> loader (new QPluginLoader (info.absoluteFilePath ()));
143
145
auto metaData = loader->metaData ();
144
146
auto keys = checkMeta (metaData, loader->fileName ());
147
+ if (keys.isEmpty ())
148
+ continue ;
149
+
150
+ auto dynInfo = QSharedPointer<DynamicPluginInfo>::create (loader);
145
151
foreach (auto key, keys) {
146
152
auto k = key.toString ();
147
153
if (!_plugins.contains (k))
148
- _plugins.insert (k, QSharedPointer<DynamicPluginInfo>:: create (loader) );
154
+ _plugins.insert (k, dynInfo );
149
155
oldKeys.removeOne (k);
150
156
}
151
157
}
@@ -167,6 +173,36 @@ void QPluginFactoryBase::reloadPlugins()
167
173
_plugins.remove (key);
168
174
}
169
175
176
+ bool QPluginFactoryBase::isLoaded (const QString &key) const
177
+ {
178
+ QMutexLocker _ (&_loaderMutex);
179
+ auto info = _plugins.value (key);
180
+ if (info) {
181
+ auto dynInfo = info.dynamicCast <DynamicPluginInfo>();
182
+ if (dynInfo)
183
+ return dynInfo->loader ()->isLoaded ();
184
+ else // static plugin
185
+ return true ;
186
+ } else
187
+ return false ;
188
+ }
189
+
190
+ void QPluginFactoryBase::unload (const QString &key)
191
+ {
192
+ QMutexLocker _ (&_loaderMutex);
193
+ auto info = _plugins.value (key);
194
+ if (info) {
195
+ auto dynInfo = info.dynamicCast <DynamicPluginInfo>();
196
+ if (dynInfo) {
197
+ auto loader = dynInfo->loader ();
198
+ if (loader->isLoaded ()){
199
+ if (!loader->unload ())
200
+ qWarning ().noquote () << " Failed to unload plugin for key" << key << " with error:" << loader->errorString ();
201
+ }
202
+ }
203
+ }
204
+ }
205
+
170
206
QJsonArray QPluginFactoryBase::checkMeta (const QJsonObject &metaData, const QString &filename) const
171
207
{
172
208
if (metaData[QStringLiteral (" debug" )].toBool () != __qpluginfactory_is_debug ())
@@ -250,3 +286,8 @@ QObject *DynamicPluginInfo::instance()
250
286
throw QPluginLoadException (_loader.data ());
251
287
return _loader->instance ();
252
288
}
289
+
290
+ QPluginLoader *DynamicPluginInfo::loader () const
291
+ {
292
+ return _loader.data ();
293
+ }
0 commit comments