#include <Common/Globals>
#include <Common/Util>
#include <Common/iLogger>
-#include <Common/iEnv>
#include <Common/iApp>
#include <QtCore>
namespace Internal {
// Plugin manager interface implementation
- static eVaf::Plugins::PluginManager * mPluginManager = 0;
+ static eVaf::Plugins::PluginManager * mPluginManager = nullptr;
} // namespace eVaf::Plugins::Internal
} // namespace eVaf::Plugins
PluginManager::PluginManager()
: QObject()
+ , d(new Internal::PluginManagerPrivate)
{
setObjectName(QString("%1-PluginManager").arg(VER_MODULE_NAME_STR));
Internal::mPluginManager = this;
- d = new Internal::PluginManagerPrivate;
-
EVAF_INFO("%s created", qPrintable(objectName()));
}
PluginManager::~PluginManager()
{
- delete d;
+ d.reset();
- Internal::mPluginManager = 0;
+ Internal::mPluginManager = nullptr;
EVAF_INFO("%s destroyed", qPrintable(objectName()));
}
bool PluginManagerPrivate::loadPlugins()
{
// Get the name of the application's XML file
- QString xmlFileName = Common::iEnv::instance()->etcDir() + Common::iApp::instance()->xmlFileName();
+ QString xmlFileName = Common::iApp::instance()->etcDir() + Common::iApp::instance()->xmlFileName();
// Open the XML file
QFile xmlFile(xmlFileName);
if (!isPlugins && !isQtPlugins) {
if (xml.name() == "plugins") {
// Check for windows and linux only sections
-#ifdef Q_OS_LINUX
+#if defined(Q_OS_LINUX) || defined(Q_OS_MACOS)
if (Common::isTrue(xml.attributes().value("windowsonly").toString()))
continue;
#endif
else if (xml.name() == "qtplugins") {
// Check for windows and linux only sections
-#ifdef Q_OS_LINUX
+#if defined(Q_OS_LINUX) || defined(Q_OS_MACOS)
if (Common::isTrue(xml.attributes().value("windowsonly").toString()))
continue;
#endif
// An individual plugin?
else if (isPlugins && xml.name() == "plugin") {
// Check for windows and linux only plugins
-#ifdef Q_OS_LINUX
+#if defined(Q_OS_LINUX) || defined(Q_OS_MACOS)
if (Common::isTrue(xml.attributes().value("windowsonly").toString())) {
EVAF_INFO("Plugin '%s' is for Windows only", qPrintable(xml.attributes().value("name").toString()));
continue;
// An individual Qt plugin?
else if (isQtPlugins && xml.name() == "plugin") {
// Check for windows and linux only plugins
-#ifdef Q_OS_LINUX
+#if defined(Q_OS_LINUX) || defined(Q_OS_MACOS)
if (Common::isTrue(xml.attributes().value("windowsonly").toString())) {
EVAF_INFO("Qt plugin '%s' is for Windows only", qPrintable(xml.attributes().value("name").toString()));
continue;
} // End element?
}
- // Load Qt plugins
- int i;
- for (i = 0; i < qtPlugins.size(); ++i) {
- loadQtPlugin(qtPlugins.at(i));
- }
-
// Load eVaf plugins
- i = 0;
+ int i = 0;
while (i < mPlugins.size()) {
if (!mPlugins.at(i)->load()) {
EVAF_ERROR("Failed to load module '%s'", qPrintable(mPlugins.at(i)->name()));
void PluginManagerPrivate::unloadPlugins()
{
// Finalize all the plugins
- for (int i = 0; i < mPlugins.size(); ++i)
+ for (int i = mPlugins.size() - 1; i >= 0; --i)
mPlugins.at(i)->done();
while (!mPlugins.isEmpty()) {
QExplicitlySharedDataPointer<Plugin> p = mPlugins.takeLast();
if (mModules.at(i)->name() == name)
return mModules.at(i).data();
}
- return 0;
-}
-
-bool PluginManagerPrivate::loadQtPlugin(QString const & name) const
-{
- // Get the Qt plugin file name with the full path
- QString fileName;
-
-#ifdef Q_OS_LINUX
- fileName = QString("%1libq%2.so").arg(Common::iEnv::instance()->qtPluginsDir()).arg(name);
-# ifndef QT_NO_DEBUG
- QString t = QString("%1libq%2.so.debug").arg(Common::iEnv::instance()->qtPluginsDir()).arg(name);
- if (QFile::exists(t))
- fileName = t;
-# endif
-#endif
-
-#ifdef Q_OS_WIN32
- fileName = QString("%2q%2%3").arg(Common::iEnv::instance()->qtPluginsDir()).arg(name).arg("4.dll");
-# ifndef QT_NO_DEBUG
- QString t = QString("%1q%2%3").arg(Common::iEnv::instance()->qtPluginsDir()).arg(name).arg("d4.dll");
- if (!QFile::exists(t))
- fileName = t;
-# endif
-#endif
-
- if (fileName.isEmpty()) {
- EVAF_ERROR("Don\'t know how to load Qt plugin '%s'", qPrintable(name));
- return false;
- }
-
- EVAF_INFO("Loading Qt plugin '%s'", qPrintable(fileName));
-
- QLibrary lib(fileName);
- void * fn = lib.resolve("qt_plugin_instance");
- if (fn) {
- qRegisterStaticPluginInstanceFunction(QtPluginInstanceFunction(fn));
- return true;
- }
- else {
- EVAF_ERROR("Failed to load Qt plugin '%s' : %s", qPrintable(fileName), qPrintable(lib.errorString()));
- return false;
- }
+ return nullptr;
}
Module::Module(QString const & name)
: QSharedData()
, mName(name)
- , mLoader(0)
- , mRoot(0)
- , mPlugin(0)
- , mPluginFactory(0)
+ , mRoot(nullptr)
+ , mPlugin(nullptr)
+ , mPluginFactory(nullptr)
{}
Module::~Module()
{
if (mLoader) {
mLoader->unload();
- delete mLoader;
+ mLoader.reset();
}
}
bool Module::load()
{
// The real file name with path
- QString fileName = Common::iEnv::instance()->binDir() + expandPluginName(mName);
+ QString fileName = Common::iApp::instance()->binDir() + expandPluginName(mName);
// Try to load the module
QScopedPointer<QPluginLoader> p(new QPluginLoader(fileName));
QObject * root = p->instance();
// Does the module implement the iPluginFactory interface?
- if ((mPluginFactory = qobject_cast<iPluginFactory *>(root)) == 0) {
+ if ((mPluginFactory = qobject_cast<iPluginFactory *>(root)) == nullptr) {
// If not, then it has to implement the iPlugin interface
- if (qobject_cast<iPlugin *>(root) == 0) {
+ if (qobject_cast<iPlugin *>(root) == nullptr) {
EVAF_FATAL_ERROR("Module '%s' is not a valid eVaf module", qPrintable(mName));
return false;
}
}
mRoot = root;
- mLoader = p.take();
+ mLoader.reset(p.take());
return true;
}
void Module::unload()
{
- mRoot = 0;
- mPluginFactory = 0;
- mPlugin = 0;
+ mRoot = nullptr;
+ mPluginFactory = nullptr;
+ mPlugin = nullptr;
if (mLoader) {
mLoader->unload();
- delete mLoader;
- mLoader = 0;
+ mLoader.reset();
}
}
// If the module is not loaded, load it now
if (!mLoader) {
if (!load())
- return false;
+ return nullptr;
}
- iPlugin * i = 0;
+ iPlugin * i = nullptr;
// Does the module implement the iPluginFactory interface?
if (mPluginFactory) {
// Use the iPluginFactory interface to create the requested interface
i = qobject_cast<iPlugin *>(mPluginFactory->create(name));
- if (i == 0) {
+ if (i == nullptr) {
EVAF_FATAL_ERROR("Module '%s' failed to create the iPlugin interface with name '%s'", qPrintable(mName), qPrintable(name));
- return 0;
+ return nullptr;
}
}
if (mPlugin) {
EVAF_FATAL_ERROR("Module '%s' can implement only one iPlugin interface and one with the name '%s' is already created",
qPrintable(mName), qPrintable(mPlugin->objectName()));
- return 0;
+ return nullptr;
}
i = qobject_cast<iPlugin *>(mRoot);
- if (i == 0) {
+ if (i == nullptr) {
EVAF_FATAL_ERROR("Module '%s' does not implement the iPlugin interface", qPrintable(mName));
- return 0;
+ return nullptr;
}
mPlugin = i;
, mModule(module)
, mName(name)
, mArgs(args)
- , mPlugin(0)
+ , mPlugin(nullptr)
{}
Plugin::~Plugin()
mPlugin = mModule->create(mName);
if (mPlugin && !mPlugin->objectName().isEmpty())
mName = mPlugin->objectName();
- return mPlugin != 0;
+ return mPlugin != nullptr;
}
void Plugin::unload()
{
- mPlugin = 0;
+ mPlugin = nullptr;
}
bool Plugin::init()