Skip to content
This repository was archived by the owner on Mar 4, 2023. It is now read-only.

Commit 84fc433

Browse files
committed
extended api
1 parent a117b4d commit 84fc433

File tree

2 files changed

+46
-1
lines changed

2 files changed

+46
-1
lines changed

qpluginfactory.cpp

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ class DynamicPluginInfo : public QPluginFactoryBase::PluginInfo
2727
QJsonObject metaData() const override;
2828
QObject *instance() override;
2929

30+
QPluginLoader *loader() const;
31+
3032
private:
3133
QScopedPointer<QPluginLoader, QScopedPointerDeleteLater> _loader;
3234
};
@@ -142,10 +144,14 @@ void QPluginFactoryBase::reloadPlugins()
142144
QScopedPointer<QPluginLoader, QScopedPointerDeleteLater> loader(new QPluginLoader(info.absoluteFilePath()));
143145
auto metaData = loader->metaData();
144146
auto keys = checkMeta(metaData, loader->fileName());
147+
if(keys.isEmpty())
148+
continue;
149+
150+
auto dynInfo = QSharedPointer<DynamicPluginInfo>::create(loader);
145151
foreach(auto key, keys) {
146152
auto k = key.toString();
147153
if(!_plugins.contains(k))
148-
_plugins.insert(k, QSharedPointer<DynamicPluginInfo>::create(loader));
154+
_plugins.insert(k, dynInfo);
149155
oldKeys.removeOne(k);
150156
}
151157
}
@@ -167,6 +173,36 @@ void QPluginFactoryBase::reloadPlugins()
167173
_plugins.remove(key);
168174
}
169175

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+
170206
QJsonArray QPluginFactoryBase::checkMeta(const QJsonObject &metaData, const QString &filename) const
171207
{
172208
if(metaData[QStringLiteral("debug")].toBool() != __qpluginfactory_is_debug())
@@ -250,3 +286,8 @@ QObject *DynamicPluginInfo::instance()
250286
throw QPluginLoadException(_loader.data());
251287
return _loader->instance();
252288
}
289+
290+
QPluginLoader *DynamicPluginInfo::loader() const
291+
{
292+
return _loader.data();
293+
}

qpluginfactory.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,10 @@ public slots:
5353

5454
void reloadPlugins();
5555

56+
protected:
57+
bool isLoaded(const QString &key) const;
58+
void unload(const QString &key);
59+
5660
private:
5761
const QString _pluginType;
5862
QByteArray _pluginIid;

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy