Files
pilotclient/src/blackcore/pluginmgr.cpp

105 lines
3.2 KiB
C++

/* Copyright (C) 2013 VATSIM Community / authors
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "blackcore/pluginmgr.h"
#include "blackmisc/plugins.h"
#include "blackmisc/context.h"
#include <QDirIterator>
#include <iostream>
#include <stdexcept>
namespace BlackCore
{
CPluginManager::~CPluginManager()
{
for (QVector<PluginEntry>::iterator it = m_plugins.begin(); it != m_plugins.end(); ++it)
{
Q_ASSERT_X(it->loader, "Plugin manager", "Previously loaded plugin's loader ptr is null");
it->loader->unload();
}
}
void CPluginManager::loadAllPlugins(const QString &pluginsPath)
{
//TODO should we use a custom extension, so we don't attempt to load non-plugin .dll/.so files?
#ifdef Q_OS_WIN
static const QStringList pluginsFilter("*.dll");
#else
static const QStringList pluginsFilter("*.so");
#endif
QDirIterator iter (pluginsPath, pluginsFilter, QDir::Files);
while (iter.hasNext())
{
QString filename = iter.next();
QSharedPointer<QPluginLoader> loader (new QPluginLoader (filename));
try
{
if (! loader->load())
{
throw std::runtime_error(QString("Failed loading plugin from %1").arg(filename).toStdString());
}
PluginEntry entry;
entry.loader = loader;
entry.factory = qobject_cast<BlackMisc::IPluginFactory*>(loader->instance());
if (! entry.factory)
{
throw std::runtime_error(QString("Plugin loaded from %1 is not compatible").arg(filename).toStdString());
}
m_plugins.push_back(entry);
}
catch (...)
{
//TODO warning?
}
}
}
const CPluginManager::PluginEntry &CPluginManager::getEntry(int index) const
{
Q_ASSERT_X(index < getPluginCount(), "Plugin manager", "Plugin index out of bounds");
const PluginEntry &entry = m_plugins[index];
Q_ASSERT_X(entry.factory, "Plugin manager", "Previously loaded plugin's factory ptr is null");
Q_ASSERT_X(entry.loader, "Plugin manager", "Previously loaded plugin's loader ptr is null");
if (! entry.loader->isLoaded())
{
//TODO throw plugin loader unexpectedly unloaded
}
return entry;
}
const QString CPluginManager::getName(int index) const
{
return getFactory(index)->getName();
}
const QString CPluginManager::getDescription(int index) const
{
return getFactory(index)->getDescription();
}
BlackMisc::IPlugin *CPluginManager::constructPlugin(int index)
{
BlackMisc::IPlugin *plugin = getFactory(index)->create(BlackMisc::IContext::getInstance());
if (! plugin->isValid())
{
delete plugin;
plugin = 0;
//TODO throw plugin construction failed
}
return plugin;
}
} // namespace BlackCore