Changed: #1193 Code cleanup.

This commit is contained in:
dnk-88 2010-11-29 17:36:12 +02:00
parent be65deea8a
commit 6a7355e3a3
6 changed files with 356 additions and 356 deletions

View file

@ -21,13 +21,13 @@
#define IPLUGIN_H
#include <QtPlugin>
#include <QtCore/QString>
#include "iplugin_manager.h"
namespace NLQT
{
#include <QtCore/QString>
#include "iplugin_manager.h"
namespace NLQT
{
class IPlugin
{
public:
@ -37,9 +37,9 @@ public:
virtual void extensionsInitialized() = 0;
virtual void shutdown() { }
virtual QString name() const = 0;
virtual QString version() const = 0;
virtual QString vendor() const = 0;
virtual QString name() const = 0;
virtual QString version() const = 0;
virtual QString vendor() const = 0;
virtual QString description() const = 0;
};

View file

@ -39,13 +39,13 @@ public:
virtual void addObject(QObject *obj) = 0;
virtual void removeObject(QObject *obj) = 0;
virtual QList<QObject *> allObjects() const = 0;
// Plugin operations
virtual void loadPlugins() = 0;
virtual QStringList getPluginPaths() const = 0;
virtual void setPluginPaths(const QStringList &paths) = 0;
virtual QList<NLQT::CPluginSpec *> plugins() const = 0;
Q_SIGNALS:
void objectAdded(QObject *obj);
void aboutToRemoveObject(QObject *obj);

View file

@ -1,129 +1,129 @@
/*
Object Viewer Qt
Copyright (C) 2010 Dzmitry Kamiahin <dnk-88@tut.by>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "plugin_manager.h"
#include <QtCore/QDir>
/*
Object Viewer Qt
Copyright (C) 2010 Dzmitry Kamiahin <dnk-88@tut.by>
#include <nel/misc/debug.h>
#include "plugin_spec.h"
namespace NLQT
{
CPluginManager::CPluginManager(QObject *parent):
IPluginManager(parent)
{
}
CPluginManager::~CPluginManager()
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "plugin_manager.h"
#include <QtCore/QDir>
#include <nel/misc/debug.h>
#include "plugin_spec.h"
namespace NLQT
{
CPluginManager::CPluginManager(QObject *parent):
IPluginManager(parent)
{
}
CPluginManager::~CPluginManager()
{
stopAll();
qDeleteAll(_pluginSpecs);
}
void CPluginManager::addObject(QObject *obj)
{
QWriteLocker lock(&_lock);
if (obj == 0)
qDeleteAll(_pluginSpecs);
}
void CPluginManager::addObject(QObject *obj)
{
QWriteLocker lock(&_lock);
if (obj == 0)
{
nlwarning("trying to add null object");
return;
return;
}
if (_allObjects.contains(obj))
if (_allObjects.contains(obj))
{
nlwarning("trying to add duplicate object");
return;
}
}
nlinfo(QString("addObject:" + obj->objectName()).toStdString().c_str());
_allObjects.append(obj);
Q_EMIT objectAdded(obj);
}
void CPluginManager::removeObject(QObject *obj)
Q_EMIT objectAdded(obj);
}
void CPluginManager::removeObject(QObject *obj)
{
if (obj == 0)
if (obj == 0)
{
nlwarning("trying to remove null object");
return;
}
return;
}
if (!_allObjects.contains(obj))
if (!_allObjects.contains(obj))
{
nlinfo(QString("object not in list:" + obj->objectName()).toStdString().c_str());
return;
}
}
nlinfo(QString("removeObject:" + obj->objectName()).toStdString().c_str());
Q_EMIT aboutToRemoveObject(obj);
Q_EMIT aboutToRemoveObject(obj);
QWriteLocker lock(&_lock);
_allObjects.removeAll(obj);
}
QList<QObject *> CPluginManager::allObjects() const
{
return _allObjects;
}
void CPluginManager::loadPlugins()
_allObjects.removeAll(obj);
}
QList<QObject *> CPluginManager::allObjects() const
{
Q_FOREACH (CPluginSpec *spec, _pluginSpecs)
setPluginState(spec, State::Loaded);
return _allObjects;
}
Q_FOREACH (CPluginSpec *spec, _pluginSpecs)
setPluginState(spec, State::Initialized);
void CPluginManager::loadPlugins()
{
Q_FOREACH (CPluginSpec *spec, _pluginSpecs)
setPluginState(spec, State::Loaded);
Q_FOREACH (CPluginSpec *spec, _pluginSpecs)
setPluginState(spec, State::Running);
Q_EMIT pluginsChanged();
}
QStringList CPluginManager::getPluginPaths() const
{
return _pluginPaths;
}
void CPluginManager::setPluginPaths(const QStringList &paths)
{
_pluginPaths = paths;
readPluginPaths();
}
QList<CPluginSpec *> CPluginManager::plugins() const
{
return _pluginSpecs;
}
void CPluginManager::readPluginPaths()
Q_FOREACH (CPluginSpec *spec, _pluginSpecs)
setPluginState(spec, State::Initialized);
Q_FOREACH (CPluginSpec *spec, _pluginSpecs)
setPluginState(spec, State::Running);
Q_EMIT pluginsChanged();
}
QStringList CPluginManager::getPluginPaths() const
{
return _pluginPaths;
}
void CPluginManager::setPluginPaths(const QStringList &paths)
{
_pluginPaths = paths;
readPluginPaths();
}
QList<CPluginSpec *> CPluginManager::plugins() const
{
return _pluginSpecs;
}
void CPluginManager::readPluginPaths()
{
qDeleteAll(_pluginSpecs);
_pluginSpecs.clear();
_pluginSpecs.clear();
QStringList pluginsList;
QStringList searchPaths = _pluginPaths;
while (!searchPaths.isEmpty())
QStringList searchPaths = _pluginPaths;
while (!searchPaths.isEmpty())
{
const QDir dir(searchPaths.takeFirst());
const QDir dir(searchPaths.takeFirst());
#ifdef Q_OS_WIN
const QFileInfoList files = dir.entryInfoList(QStringList() << QString("*.dll"), QDir::Files);
#elif defined(Q_OS_MAC)
@ -132,62 +132,62 @@ void CPluginManager::readPluginPaths()
const QFileInfoList files = dir.entryInfoList(QStringList() << QString("*.so"), QDir::Files);
#endif
Q_FOREACH (const QFileInfo &file, files)
pluginsList << file.absoluteFilePath();
pluginsList << file.absoluteFilePath();
const QFileInfoList dirs = dir.entryInfoList(QDir::Dirs|QDir::NoDotAndDotDot);
Q_FOREACH (const QFileInfo &subdir, dirs)
searchPaths << subdir.absoluteFilePath();
}
Q_FOREACH (const QString &pluginFile, pluginsList)
searchPaths << subdir.absoluteFilePath();
}
Q_FOREACH (const QString &pluginFile, pluginsList)
{
CPluginSpec *spec = new CPluginSpec;
CPluginSpec *spec = new CPluginSpec;
if (spec->setFileName(pluginFile))
_pluginSpecs.append(spec);
else
delete spec;
}
Q_EMIT pluginsChanged();
}
}
Q_EMIT pluginsChanged();
}
CPluginSpec *CPluginManager::pluginByName(const QString &name) const
{
Q_FOREACH (CPluginSpec *spec, _pluginSpecs)
if (spec->name() == name)
return spec;
return 0;
}
void CPluginManager::setPluginState(CPluginSpec *spec, int destState)
Q_FOREACH (CPluginSpec *spec, _pluginSpecs)
if (spec->name() == name)
return spec;
return 0;
}
void CPluginManager::setPluginState(CPluginSpec *spec, int destState)
{
if (spec->hasError())
return;
if (destState == State::Running)
if (destState == State::Running)
{
spec->initializeExtensions();
return;
}
else if (destState == State::Deleted)
return;
}
else if (destState == State::Deleted)
{
spec->kill();
return;
}
if (destState == State::Loaded)
spec->loadLibrary();
else if (destState == State::Initialized)
spec->initializePlugin();
else if (destState == State::Stopped)
spec->stop();
}
void CPluginManager::stopAll()
{
Q_FOREACH (CPluginSpec *spec, _pluginSpecs)
setPluginState(spec, State::Stopped);
spec->kill();
return;
}
if (destState == State::Loaded)
spec->loadLibrary();
else if (destState == State::Initialized)
spec->initializePlugin();
else if (destState == State::Stopped)
spec->stop();
}
void CPluginManager::stopAll()
{
Q_FOREACH (CPluginSpec *spec, _pluginSpecs)
setPluginState(spec, State::Stopped);
Q_FOREACH (CPluginSpec *spec, _pluginSpecs)
setPluginState(spec, State::Deleted);
}
Q_FOREACH (CPluginSpec *spec, _pluginSpecs)
setPluginState(spec, State::Deleted);
}
}; // namespace NLQT

View file

@ -33,22 +33,22 @@ class IPlugin;
class CPluginManager : public IPluginManager
{
Q_OBJECT
Q_OBJECT
public:
CPluginManager(QObject *parent = 0);
~CPluginManager();
CPluginManager(QObject *parent = 0);
~CPluginManager();
// Object pool operations
virtual void addObject(QObject *obj);
virtual void removeObject(QObject *obj);
virtual QList<QObject *> allObjects() const;
// Object pool operations
virtual void addObject(QObject *obj);
virtual void removeObject(QObject *obj);
virtual QList<QObject *> allObjects() const;
// Plugin operations
virtual void loadPlugins();
virtual QStringList getPluginPaths() const;
virtual void setPluginPaths(const QStringList &paths);
virtual QList<CPluginSpec *> plugins() const;
// Plugin operations
virtual void loadPlugins();
virtual QStringList getPluginPaths() const;
virtual void setPluginPaths(const QStringList &paths);
virtual QList<CPluginSpec *> plugins() const;
CPluginSpec *pluginByName(const QString &name) const;
@ -59,10 +59,10 @@ private:
mutable QReadWriteLock _lock;
QList<CPluginSpec *> _pluginSpecs;
QStringList _pluginPaths;
QList<QObject *> _allObjects;
QList<CPluginSpec *> _pluginSpecs;
QStringList _pluginPaths;
QList<QObject *> _allObjects;
}; // class CPluginManager
} // namespace NLQT

View file

@ -1,46 +1,46 @@
/*
Object Viewer Qt
Copyright (C) 2010 Dzmitry Kamiahin <dnk-88@tut.by>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "plugin_spec.h"
#include <QtCore/QFile>
#include <QtCore/QFileInfo>
#include <QtCore/QPluginLoader>
#include <QtCore/QCoreApplication>
#include "iplugin.h"
#include "iplugin_manager.h"
namespace NLQT
{
CPluginSpec::CPluginSpec():
_state(State::Invalid),
_hasError(false),
_plugin(NULL)
{
}
CPluginSpec::~CPluginSpec()
{
}
/*
Object Viewer Qt
Copyright (C) 2010 Dzmitry Kamiahin <dnk-88@tut.by>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "plugin_spec.h"
#include <QtCore/QFile>
#include <QtCore/QFileInfo>
#include <QtCore/QPluginLoader>
#include <QtCore/QCoreApplication>
#include "iplugin.h"
#include "iplugin_manager.h"
namespace NLQT
{
CPluginSpec::CPluginSpec():
_state(State::Invalid),
_hasError(false),
_plugin(NULL)
{
}
CPluginSpec::~CPluginSpec()
{
}
QString CPluginSpec::name() const
{
return _name;
@ -52,172 +52,172 @@ QString CPluginSpec::version() const
}
QString CPluginSpec::vendor() const
{
return _vendor;
}
QString CPluginSpec::description() const
{
return _description;
}
QString CPluginSpec::location() const
{
return _location;
}
QString CPluginSpec::filePath() const
{
return _filePath;
}
QString CPluginSpec::fileName() const
{
return _fileName;
}
IPlugin* CPluginSpec::plugin() const
{
return _plugin;
}
int CPluginSpec::getState() const
{
return _state;
}
bool CPluginSpec::hasError() const
{
return _hasError;
}
QString CPluginSpec::errorString() const
{
return _errorString;
}
bool CPluginSpec::setFileName(const QString &fileName)
{
{
return _vendor;
}
QString CPluginSpec::description() const
{
return _description;
}
QString CPluginSpec::location() const
{
return _location;
}
QString CPluginSpec::filePath() const
{
return _filePath;
}
QString CPluginSpec::fileName() const
{
return _fileName;
}
IPlugin* CPluginSpec::plugin() const
{
return _plugin;
}
int CPluginSpec::getState() const
{
return _state;
}
bool CPluginSpec::hasError() const
{
return _hasError;
}
QString CPluginSpec::errorString() const
{
return _errorString;
}
bool CPluginSpec::setFileName(const QString &fileName)
{
_name
= _version
= _vendor
= _description
= _location
= _filePath
= _fileName
= "";
_state = State::Invalid;
_hasError = false;
_errorString = "";
QFile file(fileName);
if (!file.exists())
return reportError(QCoreApplication::translate("CPluginSpec", "File does not exist: %1").arg(file.fileName()));
if (!file.open(QIODevice::ReadOnly))
return reportError(QCoreApplication::translate("CPluginSpec", "Could not open file for read: %1").arg(file.fileName()));
= _version
= _vendor
= _description
= _location
= _filePath
= _fileName
= "";
_state = State::Invalid;
_hasError = false;
_errorString = "";
QFile file(fileName);
if (!file.exists())
return reportError(QCoreApplication::translate("CPluginSpec", "File does not exist: %1").arg(file.fileName()));
if (!file.open(QIODevice::ReadOnly))
return reportError(QCoreApplication::translate("CPluginSpec", "Could not open file for read: %1").arg(file.fileName()));
QFileInfo fileInfo(file);
_location = fileInfo.absolutePath();
_filePath = fileInfo.absoluteFilePath();
_location = fileInfo.absolutePath();
_filePath = fileInfo.absoluteFilePath();
_fileName = fileInfo.fileName();
_state = State::Read;
return true;
}
_state = State::Read;
return true;
}
bool CPluginSpec::loadLibrary()
{
if (_hasError)
return false;
if (_state != State::Read)
if (_state != State::Read)
{
if (_state == State::Loaded)
return true;
if (_state == State::Loaded)
return true;
return reportError(QCoreApplication::translate("CPluginSpec", "Loading the library failed because state != Resolved"));
}
QString libName = QString("%1/%2").arg(_location).arg(_fileName);
}
QString libName = QString("%1/%2").arg(_location).arg(_fileName);
QPluginLoader loader(libName);
if (!loader.load())
QPluginLoader loader(libName);
if (!loader.load())
return reportError(libName + QString::fromLatin1(": ") + loader.errorString());
IPlugin *pluginObject = qobject_cast<IPlugin*>(loader.instance());
if (!pluginObject)
IPlugin *pluginObject = qobject_cast<IPlugin*>(loader.instance());
if (!pluginObject)
{
loader.unload();
return reportError(QCoreApplication::translate("CPluginSpec", "Plugin is not valid (does not derive from IPlugin)"));
}
}
_name = pluginObject->name();
_version = pluginObject->version();
_vendor = pluginObject->vendor();
_description = pluginObject->description();
_state = State::Loaded;
_plugin = pluginObject;
return true;
_state = State::Loaded;
_plugin = pluginObject;
return true;
}
bool CPluginSpec::initializePlugin()
{
if (_hasError)
return false;
if (_state != State::Loaded)
return false;
if (_state != State::Loaded)
{
if (_state == State::Initialized)
return true;
if (_state == State::Initialized)
return true;
return reportError(QCoreApplication::translate("CPluginSpec", "Initializing the plugin failed because state != Loaded)"));
}
if (!_plugin)
}
if (!_plugin)
return reportError(QCoreApplication::translate("CPluginSpec", "Internal error: have no plugin instance to initialize"));
QString err;
if (!_plugin->initialize(_pluginManager, &err))
if (!_plugin->initialize(_pluginManager, &err))
return reportError(QCoreApplication::translate("CPluginSpec", "Plugin initialization failed: %1").arg(err));
_state = State::Initialized;
return true;
_state = State::Initialized;
return true;
}
bool CPluginSpec::initializeExtensions()
{
if (_hasError)
return false;
if (_state != State::Initialized)
if (_state != State::Initialized)
{
if (_state == State::Running)
return true;
if (_state == State::Running)
return true;
return reportError(QCoreApplication::translate("CPluginSpec", "Cannot perform extensionsInitialized because state != Initialized"));
}
if (!_plugin)
}
if (!_plugin)
return reportError(QCoreApplication::translate("CPluginSpec", "Internal error: have no plugin instance to perform extensionsInitialized"));
_plugin->extensionsInitialized();
_state = State::Running;
return true;
_state = State::Running;
return true;
}
void CPluginSpec::stop()
{
if (!_plugin)
return;
_plugin->shutdown();
_state = State::Stopped;
}
void CPluginSpec::kill()
{
_plugin->shutdown();
_state = State::Stopped;
}
void CPluginSpec::kill()
{
if (!_plugin)
return;
delete _plugin;
_plugin = NULL;
_state = State::Deleted;
}
delete _plugin;
_plugin = NULL;
_state = State::Deleted;
}
bool CPluginSpec::reportError(const QString &err)
{
_errorString = err;
_hasError = true;
return false;
}
_errorString = err;
_hasError = true;
return false;
}
} // namespace NLQT

View file

@ -26,37 +26,37 @@
namespace NLQT
{
class IPlugin;
class IPluginManager;
struct State
{
enum List
{
Invalid = 1,
class IPluginManager;
struct State
{
enum List
{
Invalid = 1,
Read,
Loaded,
Initialized,
Running,
Stopped,
Deleted
};
Deleted
};
};
class CPluginSpec
{
public:
~CPluginSpec();
QString name() const;
QString version() const;
QString vendor() const;
QString name() const;
QString version() const;
QString vendor() const;
QString description() const;
QString location() const;
QString filePath() const;
QString fileName() const;
IPlugin *plugin() const;
IPlugin *plugin() const;
// state
int getState() const;
@ -66,27 +66,27 @@ public:
private:
CPluginSpec();
bool setFileName(const QString &fileName);
bool loadLibrary();
bool initializePlugin();
bool initializeExtensions();
void stop();
void kill();
bool reportError(const QString &err);
QString _location;
QString _filePath;
bool setFileName(const QString &fileName);
bool loadLibrary();
bool initializePlugin();
bool initializeExtensions();
void stop();
void kill();
bool reportError(const QString &err);
QString _location;
QString _filePath;
QString _fileName;
QString _name;
QString _version;
QString _vendor;
QString _name;
QString _version;
QString _vendor;
QString _description;
int _state;
bool _hasError;
QString _errorString;
int _state;
bool _hasError;
QString _errorString;
IPlugin *_plugin;
IPluginManager *_pluginManager;