00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef QIMSYSPLUGINMANAGER_H
00022 #define QIMSYSPLUGINMANAGER_H
00023
00024 #include <QCoreApplication>
00025 #include <QList>
00026 #include <QDir>
00027 #include <QPluginLoader>
00028 #include <QPointer>
00029 #include <QLibraryInfo>
00030 #include "qimsysdebug.h"
00031 #include "qimsysglobal.h"
00032 #include "qimsysabstractpluginobject.h"
00033 #include "qimsysplugin.h"
00034
00035 const QIMSYS_EXPORT QString &qimsysPluginPath();
00036 void QIMSYS_EXPORT setQimsysPluginPath(const QString &);
00037
00038 class QIMSYS_EXPORT QimsysPluginManager
00039 {
00040 public:
00041 template<class T>
00042 static QList<T*> objects(QObject *parent = 0) {
00043 qimsysDebugIn();
00044 QList<T*> ret;
00045 qimsysDebug() << instance();
00046 qimsysDebug() << instance()->m_plugins.count();
00047 qimsysDebug() << instance()->m_plugins;
00048 foreach(QimsysPlugin *plugin, instance()->m_plugins) {
00049 qimsysDebug() << plugin;
00050 QimsysAbstractPluginObject *o = plugin->object(parent);
00051 T *t = qobject_cast<T*>(o);
00052 qimsysDebug() << o << t;
00053 if (t) ret.append(t);
00054 }
00055 qimsysDebugOut() << ret;
00056 return ret;
00057 }
00058
00059 private:
00060 static QimsysPluginManager *instance() {
00061 static QimsysPluginManager *manager = 0;
00062 if (!manager)
00063 manager = new QimsysPluginManager;
00064 return manager;
00065 }
00066
00067 QimsysPluginManager() {
00068 loadPlugins();
00069 }
00070
00071 public:
00072 ~QimsysPluginManager() {
00073 qimsysDebugIn();
00074 qDeleteAll(m_plugins);
00075 qimsysDebugOut();
00076 }
00077
00078 private:
00079 void loadPlugins() {
00080 QDir dir(qimsysPluginPath() + QLatin1String("/"));
00081 if (!dir.exists()) {
00082 qWarning() << QString::fromLatin1("No such file or directory: %1").arg(dir.absolutePath());
00083 }
00084 QStringList pluginFilter;
00085 #ifdef Q_OS_WIN
00086 pluginFilter << QLatin1String("*.dll");
00087 #elif defined(Q_OS_MAC)
00088 pluginFilter << QLatin1String("*.dylib");
00089 #else
00090 pluginFilter << QLatin1String("*.so");
00091 #endif
00092
00093 foreach(const QString &lib, dir.entryList(pluginFilter, QDir::Files)) {
00094 QPluginLoader loader(dir.absoluteFilePath(lib));
00095 QObject *object = loader.instance();
00096 if (object) {
00097 QimsysPlugin *plugin = qobject_cast<QimsysPlugin*>(object);
00098 if (plugin) {
00099 m_plugins.append(plugin);
00100 plugin->setObjectName(lib);
00101 } else {
00102 qimsysDebug() << object;
00103 delete object;
00104 }
00105 } else {
00106 qimsysWarning() << loader.errorString();
00107 }
00108 }
00109 }
00110
00111 QList< QPointer<QimsysPlugin> > m_plugins;
00112 };
00113
00114 #endif // QIMSYSPLUGINMANAGER_H