10 #include "modules/PluginControl.h"
13 #include <QMetaObject>
14 #include <QMetaMethod>
24 qRegisterMetaType<void *>(
"const void *");
27 PluginControl::~PluginControl()
30 QMultiHash<Project*,IPlugin*>::iterator itInst;
31 QHash<QString,IPluginFactory*>::iterator itFac;
36 for (itInst = pluginInstances.begin();
37 itInst != pluginInstances.end(); itInst++)
39 QList<IPlugin*> instances = pluginInstances.values(itInst.key());
40 QList<IPlugin*>::iterator it;
42 for (it = instances.begin(); it != instances.end(); it++)
45 fac = factoryByPlugin.value(inst);
46 factoryByPlugin.remove(inst);
48 pluginInstances.remove(itInst.key(),inst);
52 for (itFac = pluginFactories.begin() ; itFac != pluginFactories.end();
60 pluginFactories.clear();
61 pluginInstances.clear();
62 pluginsByType.clear();
63 factoryByPlugin.clear();
64 messageControls.clear();
70 QPluginLoader loader(fileName);
71 QObject *plugin = loader.instance();
79 QString pluginID = pluginFactory->id();
80 if (!pluginFactories.contains(pluginID))
82 pluginFactories[pluginID] = pluginFactory;
83 QList<LanguageType> types = pluginFactory->getSupportedLanguages();
85 QList<LanguageType>::iterator it;
87 for (it = types.begin() ; it!= types.end(); it++)
89 pluginsByType.insert(*it, pluginFactory->id());
96 qDebug() <<
"PluginControl::loadPlugins failed to load"
97 <<
"(" << fileName <<
")" <<
" -- " << loader.errorString();
100 return pluginFactory;
112 QDir pluginsDir = QDir(pluginsDirPath);
113 pluginsDir.setFilter(QDir::Files | QDir::NoSymLinks);
115 if(!pluginsDir.exists())
117 emit
notifyError(tr(
"The Plugin Directory (%1) does not exist").
118 arg(pluginsDirPath));
123 filter.append(
"*.so");
124 filter.append(
"*.dylib");
125 filter.append(
"*.dll");
126 pluginsDir.setNameFilters(filter);
128 foreach (QString fileName, pluginsDir.entryList(QDir::Files
131 loadPlugin(pluginsDir.absoluteFilePath(fileName));
143 messageControls[project] = msgControl;
145 QList<QString>::iterator it;
146 QList<QString> plugIDs = pluginsByType.values(type);
147 for (it = plugIDs.begin() ; it != plugIDs.end() ;
150 factory = pluginFactories[*it];
153 settings.beginGroup(
"loadPlugins");
154 if(!settings.contains(*it) || settings.value(*it).toBool() ==
true)
156 launchNewPlugin(factory, project);
168 pluginInstance->setPluginInstanceID(
169 factory->id() +
"#" +QUuid::createUuid().toString());
171 launchNewPlugin(pluginInstance, messageControls[project]);
173 pluginInstances.insert(project, pluginInstance);
174 factoryByPlugin.insert(pluginInstance, factory);
177 factoryByPlugin.size());
180 pluginInstance->
init();
183 emit
notifyError(tr(
"Could not create an instance for the"
184 "plugin (%1)").arg(factory->id()));
207 SIGNAL(addEntity(QString, QString, QMap<QString,QString>&,
bool)),
209 SLOT(onAddEntity(QString, QString, QMap<QString,QString>&,
bool)),
210 Qt::DirectConnection);
212 connect(plugin, SIGNAL(setAttributes(
Entity*, QMap<QString,QString>,
bool)),
214 SLOT(onEditEntity(
Entity*, QMap<QString,QString>,
bool)),
215 Qt::DirectConnection);
218 SIGNAL(removeEntity(
Entity*,
bool)),
220 SLOT(onRemoveEntity(
Entity*,
bool)),
221 Qt::DirectConnection);
224 SIGNAL(setListenFilter(QStringList)),
226 SLOT(setListenFilter(QStringList)),
227 Qt::DirectConnection);
230 SIGNAL(setCurrentProjectAsDirty()),
232 SLOT(setCurrentProjectAsDirty()),
233 Qt::DirectConnection);
236 connect(plugin, SIGNAL(sendBroadcastMessage(
const char*,
void *)),
237 this, SLOT(sendBroadcastMessage(
const char*,
void*)),
238 Qt::DirectConnection);
241 connect(plugin, SIGNAL(setPluginData(QByteArray)),
242 mControl, SLOT(setPluginData(QByteArray)),
243 Qt::DirectConnection);
250 SIGNAL(addEntity(QString, QString, QMap<QString,QString>&,
bool)),
252 SLOT(onAddEntity(QString, QString, QMap<QString,QString>&,
bool)));
254 connect(mControl,SIGNAL(entityAdded(QString,
Entity*)),
255 parser, SLOT(onEntityAdded(QString,
Entity*)));
260 QHash<QString,IPluginFactory*>::iterator it;
261 QList<IPluginFactory*> pList;
262 for (it = pluginFactories.begin() ; it != pluginFactories.end(); it++)
264 pList.append(it.value());
272 qDebug() <<
"Project is NULL";
276 if (!messageControls.contains(project))
278 qDebug() <<
"Message Control does not know the project";
293 messageControls.remove(project);
296 QList<IPlugin*> instances = pluginInstances.values(project);
298 QList<IPlugin*>::iterator it;
299 for (it = instances.begin(); it != instances.end(); it++)
304 factoryByPlugin.remove(inst);
307 pluginInstances.remove(project);
312 void PluginControl::sendBroadcastMessage(
const char* slot,
void *obj)
316 QList<IPlugin*>::iterator it;
317 QList<IPlugin*> instances = pluginInstances.values(plugin->
getProject());
319 QString slotName(slot);
320 slotName.append(
"(QString,void*)");
321 for (it = instances.begin(); it != instances.end(); it++)
324 int idxSlot = inst->metaObject()
325 ->indexOfSlot( slotName.toStdString().c_str() );
328 QMetaMethod method = inst->metaObject()->method(idxSlot);
329 method.invoke(inst, Qt::DirectConnection,
330 Q_ARG(QString, plugin->getPluginInstanceID()),
338 QList<IPlugin*>::iterator it;
339 QList<IPlugin*> instances = pluginInstances.values(project);
341 for (it = instances.begin(); it != instances.end(); it++)
350 return messageControls.value(project);
353 QList <IPlugin*> PluginControl::getPluginInstances(
Project *project)
355 QList<IPlugin*> instances;
356 if(pluginInstances.contains(project))
357 instances = pluginInstances.values(project);