Developer Documentation
PluginLoader.cc
1 /*===========================================================================*\
2 * *
3 * OpenFlipper *
4  * Copyright (c) 2001-2015, RWTH-Aachen University *
5  * Department of Computer Graphics and Multimedia *
6  * All rights reserved. *
7  * www.openflipper.org *
8  * *
9  *---------------------------------------------------------------------------*
10  * This file is part of OpenFlipper. *
11  *---------------------------------------------------------------------------*
12  * *
13  * Redistribution and use in source and binary forms, with or without *
14  * modification, are permitted provided that the following conditions *
15  * are met: *
16  * *
17  * 1. Redistributions of source code must retain the above copyright notice, *
18  * this list of conditions and the following disclaimer. *
19  * *
20  * 2. Redistributions in binary form must reproduce the above copyright *
21  * notice, this list of conditions and the following disclaimer in the *
22  * documentation and/or other materials provided with the distribution. *
23  * *
24  * 3. Neither the name of the copyright holder nor the names of its *
25  * contributors may be used to endorse or promote products derived from *
26  * this software without specific prior written permission. *
27  * *
28  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *
29  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED *
30  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
31  * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER *
32  * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, *
33  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, *
34  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR *
35  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
36  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING *
37  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
38  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
39 * *
40 \*===========================================================================*/
41 
42 
43 
44 //=============================================================================
45 //
46 // CLASS Core - IMPLEMENTATION of the Plugin Loading
47 //
48 //=============================================================================
49 
50 
51 //== INCLUDES =================================================================
52 
53 // -------------------- mview
54 #include "Core.hh"
55 
56 
65 #include "OpenFlipper/BasePlugin/TextureInterface.hh"
69 #include "OpenFlipper/BasePlugin/INIInterface.hh"
76 #include "OpenFlipper/BasePlugin/PluginFunctionsCore.hh"
77 
78 
79 #include <ACG/QtWidgets/QtFileDialog.hh>
80 #include "OpenFlipper/widgets/PluginDialog/PluginDialog.hh"
81 
84 
85 #include <OpenFlipper/BasePlugin/PythonFunctionsCore.hh>
86 
91 static const int PRELOAD_THREADS_COUNT = (QThread::idealThreadCount() != -1) ? QThread::idealThreadCount() : 8;
92 
93 namespace cmake { extern const char *static_plugins; };
94 
96  public:
97  PreloadAggregator() : expectedLoaders_(0) {}
98 
108  void expectLoaders(int count) {
109  QMutexLocker loadersLock(&loadersMutex_);
110  expectedLoaders_ += count;
111  }
112 
119  void loaderReady(QPluginLoader *loader) {
120  QMutexLocker loadersLock(&loadersMutex_);
121  loaders_.push_back(loader);
122  --expectedLoaders_;
123  pluginAvailable_.wakeOne();
124  }
125 
137  QPluginLoader *waitForNextLoader() {
138  QMutexLocker loadersLock(&loadersMutex_);
139  if (loaders_.empty()) {
140  if (expectedLoaders_ > 0) {
141  pluginAvailable_.wait(&loadersMutex_);
142  } else {
143  return 0;
144  }
145  }
146 
147  /*
148  * At this point, it is guaranteed that
149  * loaders_.size() > 0.
150  */
151  QPluginLoader *result = loaders_.front();
152  loaders_.pop_front();
153  return result;
154  }
155 
156  protected:
157  std::deque<QPluginLoader *> loaders_;
158  QWaitCondition pluginAvailable_;
159  QMutex loadersMutex_;
160 
161  int expectedLoaders_;
162 };
163 
164 class PreloadThread : public QThread
165 {
166  public:
167 
174  explicit PreloadThread(PreloadAggregator *aggregator) : aggregator_(aggregator) {
175  }
176 
177  public:
178 
179  void addFilename(const QString &filename) {
180  QMutexLocker filenamesLock(&filenamesMutex_);
181  filenames_.push_back(filename);
182  aggregator_->expectLoaders(1);
183  }
184 
189  void run() {
190  for (;;) {
191  QString fileName;
192  {
193  /*
194  * Just to be on the safe side, we protect
195  * filenames_. (addFilename() could be called from
196  * a different thread.)
197  */
198  QMutexLocker filenamesLock(&filenamesMutex_);
199  if (filenames_.empty()) break;
200  fileName = filenames_.front();
201  filenames_.pop_front();
202  }
203 
204  QPluginLoader *loader = new QPluginLoader;
205  loader->setFileName(fileName);
206  loader->load();
207  aggregator_->loaderReady(loader);
208  }
209  }
210 
211  private:
212  std::deque<QString> filenames_;
213  QMutex filenamesMutex_;
214  PreloadAggregator *aggregator_;
215 };
216 
226  public:
227  size_t getTypeOrdinal(const QString &name) const {
228  const QString basename = QFileInfo(name).baseName();
229  if (basename.contains("Plugin-Type"))
230  return 0;
231  else if (basename.contains("Plugin-File"))
232  return 1;
233  else if (basename.contains("TextureControl"))
234  return 2;
235  else
236  return 3;
237 
238  }
239  bool operator() (const QString &a, const QString &b) const {
240  const size_t typeA = getTypeOrdinal(a);
241  const size_t typeB = getTypeOrdinal(b);
242  if (typeA != typeB) { return typeA < typeB; }
243  return a < b;
244  }
245 
246  bool operator() (const QPluginLoader *a, const QPluginLoader *b) const {
247  return operator() (a->fileName(), b->fileName());
248  }
249 };
250 
251 //== IMPLEMENTATION ==========================================================
252 
253 
254 bool Core::checkSlot(QObject* _plugin , const char* _slotSignature) {
255  const QMetaObject* meta = _plugin->metaObject();
256  int id = meta->indexOfSlot( QMetaObject::normalizedSignature( _slotSignature ) );
257  return ( id != -1 );
258 }
259 
260 bool Core::checkSignal(QObject* _plugin , const char* _signalSignature) {
261  const QMetaObject* meta = _plugin->metaObject();
262  int id = meta->indexOfSignal( QMetaObject::normalizedSignature( _signalSignature ) );
263  return ( id != -1 );
264 }
265 
269 {
270 
271  //regsiter custom datatypes for signal/slots
272  registerTypes();
273 
274  QString licenseTexts = "";
275 
276  //try to load plugins from new location
277  QDir tempDir = QDir(OpenFlipper::Options::pluginDir());
278 
279  // Possible Plugin extensions
280  // Windows gets DLLs
281  // Mac and Linux use so
282  // We don't use the dylib extension on Mac at the moment.
283  QStringList filter;
284  if ( OpenFlipper::Options::isWindows() )
285  filter << "*.dll";
286  else
287  filter << "*.so";
288 
289  // Get all files in the Plugin dir
290  QStringList pluginlist = tempDir.entryList(filter,QDir::Files);
291 
292  // Convert local file path to absolute path
293  for (int i=0; i < pluginlist.size(); i++) {
294  pluginlist[i] = tempDir.absoluteFilePath(pluginlist[i]);
295  }
296 
297  // get all Plugin Names which will not be loaded
298  QStringList dontLoadPlugins = OpenFlipperSettings().value("PluginControl/DontLoadNames", QStringList()).toStringList();
299 
300  // Output info about additional plugins
301  for ( int i = 0 ; i < dontLoadPlugins.size(); ++i)
302  emit log(LOGOUT,tr("dontLoadPlugins Plugin from ini file: %1").arg( dontLoadPlugins[i] ) );
303 
304  // get all Plugins which should be loaded in addition to the standard plugins
305  QStringList additionalPlugins = OpenFlipperSettings().value("PluginControl/AdditionalPlugins", QStringList()).toStringList();
306 
307  // Output info about additional plugins
308  for ( int i = 0 ; i < additionalPlugins.size(); ++i) {
309  emit log(LOGOUT,tr("Additional Plugin from file: %1").arg( additionalPlugins[i] ) );
310  }
311 
312  // Prepend the additional Plugins to the plugin list
313  pluginlist = additionalPlugins << pluginlist;
314 
315  /*
316  * Remove static plugins from dynamically loaded list.
317  */
318  {
319  QStringList list = QString::fromUtf8(cmake::static_plugins).split("\n");
320  #if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0))
321  QSet<QString> staticPlugins = QSet<QString>(list.begin(),list.end());
322  #else
323  QSet<QString> staticPlugins = QSet<QString>::fromList(list);
324  #endif
325  for (int i = 0; i < pluginlist.size(); ) {
326  const QString bn = QFileInfo(pluginlist[i]).baseName().remove("lib");
327  if (staticPlugins.contains(bn)) {
328  emit log(LOGWARN, tr("Not loading dynamic %1 as it is statically "
329  "linked against OpenFlipper.").arg(bn));
330  pluginlist.removeAt(i);
331  } else {
332  ++i;
333  }
334  }
335  }
336 
337  /*
338  * Note: This call is not necessary, anymore. Initialization order
339  * is determined later.
340  */
341  //std::sort(pluginlist.begin(), pluginlist.end(), PluginInitializationOrder());
342 
343  for ( int i = 0 ; i < dontLoadPlugins.size(); ++i )
344  emit log(LOGWARN,tr("Skipping Plugins :\t %1").arg( dontLoadPlugins[i] ) );
345 
346  emit log(LOGOUT,"================================================================================");
347 
348  QElapsedTimer time;
349 
350  time.start();
351 
352  PreloadAggregator preloadAggregator;
353  std::vector< PreloadThread* > loaderThreads(PRELOAD_THREADS_COUNT);
354 
355  /*
356  * Initialize loaderThreads.
357  */
358  for (std::vector< PreloadThread* >::iterator it = loaderThreads.begin();
359  it != loaderThreads.end(); ++it) {
360  *it = new PreloadThread(&preloadAggregator);
361  }
362 
363  /*
364  * Distribute plugins onto loader threads in a round robin fashion.
365  * (only load them in seperate thread. Instance will be created in main thread)
366  */
367  for ( int i = 0 ; i < pluginlist.size() ; ++i) {
368  loaderThreads[i % loaderThreads.size()]->addFilename(pluginlist[i]);
369  }
370 
371  /*
372  * Start plugin preloading.
373  */
374  for (std::vector< PreloadThread* >::iterator it = loaderThreads.begin();
375  it != loaderThreads.end(); ++it) {
376  (*it)->start();
377  }
378 
379  /*
380  * Wait for the plugins to get preloaded
381  */
382  std::vector<QPluginLoader*> loadedPlugins;
383  loadedPlugins.reserve(pluginlist.size());
384 
385  for (QPluginLoader *loader = preloadAggregator.waitForNextLoader(); loader != 0;
386  loader = preloadAggregator.waitForNextLoader()) {
387 
388  loadedPlugins.push_back(loader);
389 
390  if (splash_) {
391  splashMessage_ = tr("Loading Plugin %1/%2").arg(loadedPlugins.size()).arg(pluginlist.size()) ;
392  splash_->showMessage( splashMessage_ , Qt::AlignBottom | Qt::AlignLeft , Qt::white);
393  }
394  }
395 
396  /*
397  * Finalize PreloadThreads.
398  */
399  for (std::vector< PreloadThread* >::iterator it = loaderThreads.begin();
400  it != loaderThreads.end(); ++it) {
401  (*it)->wait();
402  delete *it;
403  }
404 
405  /*
406  * Initialize preloaded plugins in the correct order.
407  */
408  std::sort(loadedPlugins.begin(), loadedPlugins.end(), PluginInitializationOrder());
409  for (std::vector<QPluginLoader*>::iterator it = loadedPlugins.begin();
410  it != loadedPlugins.end(); ++it) {
411 
412  if (splash_) {
413  splashMessage_ = tr("Initializing Plugin %1/%2")
414  .arg(std::distance(loadedPlugins.begin(), it) + 1)
415  .arg(loadedPlugins.size());
416  splash_->showMessage( splashMessage_ , Qt::AlignBottom | Qt::AlignLeft , Qt::white);
417  }
418 
419  if ((*it)->instance() != 0 ) {
420  QString pluginLicenseText = "";
421  loadPlugin((*it)->fileName(),true,pluginLicenseText, (*it)->instance());
422  licenseTexts += pluginLicenseText;
423  } else {
424  emit log(LOGERR,tr("Unable to load Plugin :\t %1").arg( (*it)->fileName() ) );
425  emit log(LOGERR,tr("Error was : ") + (*it)->errorString() );
426  emit log(LOGOUT,"================================================================================");
427  }
428  delete *it;
429  }
430 
431  /*
432  * Initialize static plugins.
433  */
434  QVector<QStaticPlugin> staticPlugins = QPluginLoader::staticPlugins();
435  for (QVector<QStaticPlugin>::iterator it = staticPlugins.begin();
436  it != staticPlugins.end(); ++it) {
437  QObject *instance = it->instance();
438  BaseInterface* basePlugin = qobject_cast< BaseInterface * >(instance);
439  if (basePlugin) {
440  QString fakeName = QString::fromUtf8("<Statically Linked>::/%1.%2")
441  .arg(basePlugin->name())
442  .arg(OpenFlipper::Options::isWindows() ? "dll" : "so");
443  QString pluginLicenseText = "";
444  loadPlugin(fakeName, true, pluginLicenseText, instance);
445  licenseTexts += pluginLicenseText;
446  }
447  }
448 
449  emit log(LOGINFO, tr("Total time needed to load plugins was %1 ms.").arg(time.elapsed()));
450 
451  splashMessage_ = "";
452 
453  if ( licenseTexts != "" ) {
454  if ( OpenFlipper::Options::gui() ) {
455 
456  // split for each license block
457  QStringList licenseBlocks = licenseTexts.split("==");
458 
459  // Cleanup lists to get only the ones containing valid plugins.
460  for ( QStringList::iterator it = licenseBlocks.begin(); it != licenseBlocks.end() ; ++it )
461  if ( ! it->contains("PluginName") ) {
462  licenseBlocks.erase(it);
463  it = licenseBlocks.begin();
464  }
465 
466  // sort by the contact mails
467  QMap< QString , QString > contacts;
468 
469  for ( QStringList::iterator it = licenseBlocks.begin(); it != licenseBlocks.end() ; ++it ) {
470  QStringList lines = it->split("\n");
471 
472  lines = lines.filter ( "Contact mail", Qt::CaseInsensitive );
473 
474  // Corect one found:
475  if (lines.size() == 1) {
476  QString mail = lines[0].section(":",-1).simplified();
477  QString list = contacts.take(mail);
478  list.append(*it);
479  contacts.insert(mail,list);
480  } else {
481  emit log(LOGWARN,tr("Can't extract mail contact from license request"));
482  }
483 
484  }
485 
486  for ( QMap<QString , QString>::iterator it = contacts.begin() ; it != contacts.end() ; ++it ) {
487 
488  QStringList request = it.value().split("\n");
489 
490  // Cleanup lists to get only the relevant part
491  for ( QStringList::iterator lit = request.begin(); lit != request.end() ; ++lit ) {
492 
493  if ( lit->contains("Message:") ) {
494  *lit = lit->section(":",-1).simplified();
495  }
496 
497  if ( lit->contains("Contact mail:") ) {
498  *lit = lit->section(":",-1).simplified();
499  }
500 
501  }
502 
503  QDialog licenseBox;
504 
505  QTextEdit *edit = new QTextEdit(&licenseBox);
506  edit->setText(request.join("\n"));
507 
508  QLabel* mailLabel = new QLabel(&licenseBox);
509  mailLabel->setText(tr("The text has been copied to your clipboard. Open in Mail program?"));
510 
511  QPushButton* noButton = new QPushButton(&licenseBox);
512  noButton->setText(tr("No"));
513  connect( noButton, SIGNAL(clicked ()), &licenseBox, SLOT(reject()) );
514 
515  QPushButton* yesButton = new QPushButton(&licenseBox);
516  yesButton->setText(tr("Yes"));
517  connect( yesButton, SIGNAL(clicked ()), &licenseBox, SLOT(accept()) );
518 
519  QGridLayout *layout = new QGridLayout;
520  layout->addWidget(edit,0,0,1,2);
521  layout->addWidget(mailLabel,1,0,1,2);
522  layout->addWidget(noButton,2,0);
523  layout->addWidget(yesButton,2,1);
524  licenseBox.setLayout(layout);
525 
526  licenseBox.resize(500,500);
527  licenseBox.setModal(true);
528  licenseBox.setWindowTitle(tr("Plugin License check failed, issuer is: %1").arg( it.key() ));
529  int userAnswer =licenseBox.exec();
530 
531  // set a text to the Clipboard
532  QClipboard *cb = QApplication::clipboard();
533  cb->setText(request.join("\n"));
534 
535  if ( userAnswer == 1 ) {
536  QString url = "mailto:" + it.key();
537  url += "?subject=License Request&body=";
538 #ifdef WIN32
539  url += request.join(";;");
540 #else
541  url += request.join("\n");
542 #endif
543 
544  QUrl encodedURL(url, QUrl::TolerantMode);
545  QDesktopServices::openUrl(encodedURL);
546  }
547 
548  }
549 
550 
551  } else {
552 
553  emit log(LOGWARN,tr("Plugin License check failed: "));
554  std::cerr << licenseTexts.toStdString() << std::endl;
555  }
556  }
557 
558  emit pluginsInitialized();
559 
560  emit pluginsInitialized(PluginFunctions::pluginCommandLineOptions());
561 
562  emit log(LOGOUT,tr("Loaded %n Plugin(s)","",int(plugins().size())) );
563 }
564 
568 
569  if ( OpenFlipper::Options::nogui() )
570  return;
571 
572  // Setup filters for possible plugin extensions
573  // Windows gets DLLs
574  // Mac and Linux use so
575  // We don't use the dylib extension on Mac at the moment.
576  QString filter;
577  if ( OpenFlipper::Options::isWindows() )
578  filter = "Plugins (*.dll)";
579  else
580  filter = "Plugins (*.so)";
581 
582  // Ask the user to select the file to load
583  QString filename = ACG::getOpenFileName(coreWidget_,tr("Load Plugin"),filter, OpenFlipperSettings().value("Core/CurrentDir").toString() );
584 
585  if (filename.isEmpty())
586  return;
587 
588  // get the plugin name
589  // and check if Plugin is in the dontLoad List
590  QPluginLoader loader( filename );
591  QObject *plugin = loader.instance();
592  QString name;
593 
594  // Check if a plugin has been loaded
595  if (plugin) {
596  // Check if it is a BasePlugin
597  BaseInterface* basePlugin = qobject_cast< BaseInterface * >(plugin);
598  if ( basePlugin ) {
599  name = basePlugin->name();
600  }else
601  return;
602  }else
603  return;
604 
605  // Ask if the plugin is on the block list
606  QStringList dontLoadPlugins = OpenFlipperSettings().value("PluginControl/DontLoadNames", QStringList()).toStringList();
607  if (dontLoadPlugins.contains(name)){
608  int ret = QMessageBox::question(0, tr("Plugin Loading Prevention"),
609  tr("OpenFlipper is currently configured to prevent loading this plugin.\n"
610  "Do you want to enable this plugin permanently?"),
611  QMessageBox::Yes | QMessageBox::No,
612  QMessageBox::Yes);
613  if (ret == QMessageBox::Yes) {
614  dontLoadPlugins.removeAll(name);
615  OpenFlipperSettings().setValue("PluginControl/DontLoadNames",dontLoadPlugins);
616  } else
617  return;
618  }
619 
620  // check if the plugin is not on the additional plugin list
621  QStringList additionalPlugins = OpenFlipperSettings().value("PluginControl/AdditionalPlugins", QStringList()).toStringList();
622  if (!additionalPlugins.contains(name)){
623  int ret = QMessageBox::question(0, tr("Plugin Loading ..."),
624  tr("Should OpenFlipper load this plugin on next startup?"),
625  QMessageBox::Yes | QMessageBox::No,
626  QMessageBox::Yes);
627  if (ret == QMessageBox::Yes) {
628  additionalPlugins << filename;
629  std::cerr << "Added: " << filename.toStdString() << std::endl;
630  OpenFlipperSettings().setValue("PluginControl/AdditionalPlugins",additionalPlugins);
631  }
632  }
633 
634  QString licenseText = "";
635  loadPlugin(filename,false,licenseText);
636 
637  if ( licenseText != "" ) {
638  if ( OpenFlipper::Options::gui() ) {
639  QMessageBox::warning ( 0, tr("Plugin License check failed"), licenseText );
640 
641  std::cerr << "OpenURL: " << std::endl;
642  QDesktopServices::openUrl(QUrl(tr("mailto:contact@openflipper.com?subject=License Request&body=%1").arg(licenseText), QUrl::TolerantMode));
643  } else {
644  std::cerr << "Plugin License check failed" << std::endl;
645  std::cerr << licenseText.toStdString() << std::endl;
646  }
647  }
648 }
649 
653 
654  if ( OpenFlipper::Options::gui() ){
655 
656  int ret = 0;
657 
658  while (ret == 0){
659 
660  PluginDialog* dialog = new PluginDialog(plugins(), coreWidget_);
661 
662  //connect signals
663  connect(dialog, SIGNAL( loadPlugin() ), this, SLOT( slotLoadPlugin() ));
664  connect(dialog, SIGNAL(blockPlugin(const QString&)), this, SLOT(slotBlockPlugin(const QString&)));
665  connect(dialog, SIGNAL(unBlockPlugin(const QString&)), this, SLOT(slotUnBlockPlugin(const QString&)));
666  connect(dialog, SIGNAL(loadPlugin(const QString& ,const bool , QString& , QObject* )),
667  this,SLOT(loadPlugin(const QString& ,const bool , QString& , QObject* )));
668 
669  //if a plugin was deleted/loaded the dialog returns 0 and it needs to be loaded again
670  ret = dialog->exec();
671 
672  delete dialog;
673  }
674  }
675 }
676 
677 void Core::slotBlockPlugin(const QString &_name)
678 {
679  QStringList dontLoadPlugins = OpenFlipperSettings().value("PluginControl/DontLoadNames",QStringList()).toStringList();
680  if ( !dontLoadPlugins.contains(_name) ){
681  dontLoadPlugins << _name;
682  OpenFlipperSettings().setValue("PluginControl/DontLoadNames",dontLoadPlugins);
683  }
684 
685  for (size_t i = 0; i < plugins().size();++i)
686  if (plugins()[i].name == _name)
687  plugins()[i].status = PluginInfo::BLOCKED;
688 }
689 
690 void Core::slotUnBlockPlugin(const QString &_name)
691 {
692  QStringList dontLoadPlugins = OpenFlipperSettings().value("PluginControl/DontLoadNames",QStringList()).toStringList();
693  dontLoadPlugins.removeAll(_name);
694  OpenFlipperSettings().setValue("PluginControl/DontLoadNames",dontLoadPlugins);
695 
696  for (size_t i = 0; i < plugins().size();++i)
697  if (plugins()[i].name == _name)
698  plugins()[i].status = PluginInfo::UNLOADED;
699 }
700 
701 
702 void Core::printPluginLoadLog(const QString& errors,const QString& warnings ) {
703  emit log(LOGERR ,errors );
704  emit log(LOGWARN,warnings );
705  emit log(LOGOUT,"================================================================================");
706 }
707 
714 void Core::loadPlugin(const QString& _filename,const bool _silent, QString& _licenseErrors, QObject* _plugin){
715 
716  _licenseErrors = "";
717 
718  // Only load .dll under windows
719  if ( OpenFlipper::Options::isWindows() ) {
720  QString dllname = _filename;
721  if ( ! dllname.endsWith( ".dll" ) )
722  return;
723  }
724  // Only load .so under linux
725  if ( OpenFlipper::Options::isLinux() ) {
726  QString soname = _filename;
727  if ( ! soname.endsWith( ".so" ) )
728  return;
729  }
730 
731  // This will be the reference to our plugin
732  QObject *plugin = 0;
733 
734  // Collect error and warning info
735  QString errors, warnings;
736 
737 
738  // Try to open the file if we did not get a plugin,
739  // Otherwise use the supplied plugin pointer
740  if ( _plugin == 0 ) {
741  QPluginLoader loader( _filename );
742  plugin = loader.instance();
743 
744  if ( !plugin) {
745 
746  errors += tr("Error: Unable to load Plugin :\t %1").arg( _filename ) + "\n";
747  errors += tr("Error: Error was : ") + loader.errorString() + "\n";
748 
749  emit log(LOGERR,errors );
750 
751  emit log(LOGOUT,"================================================================================");
752  } else {
753  emit log (LOGOUT,tr("Plugin loaded: \t %1").arg(_filename));
754  }
755 
756  } else {
757  plugin = _plugin;
758  }
759 
760  // Check if a plugin has been loaded
761  PluginInfo info;
762  int alreadyLoadedAt = -1;
763  for (unsigned int k=0; k < plugins().size(); k++)
764  {
765  if (plugins()[k].path == _filename)
766  alreadyLoadedAt = static_cast<int>(k);
767  }
768  info.status = PluginInfo::FAILED;
769  info.path = _filename;
770  QString supported;
771 
772  emit log(LOGOUT,tr("Location : \t %1").arg( _filename) );
773 
774  // Check if it is a BasePlugin
775  BaseInterface* basePlugin = qobject_cast< BaseInterface * >(plugin);
776  if ( basePlugin ) {
777 
778  //set basic information about plugin
779  info.name = basePlugin->name();
780  info.rpcName = info.name.remove(" ").toLower();
781  info.description = basePlugin->description();
782  info.warnings = "BLA";
783 
784  QStringList additionalPlugins = OpenFlipperSettings().value("PluginControl/AdditionalPlugins", QStringList()).toStringList();
785  info.buildIn = !additionalPlugins.contains(info.path);
786 
787  emit log(LOGOUT,tr("Found Plugin : \t %1").arg(basePlugin->name()) );
788 
789  if (splash_) {
790  splashMessage_ = splashMessage_ + " " + basePlugin->name() ;
791  splash_->showMessage( splashMessage_ , Qt::AlignBottom | Qt::AlignLeft , Qt::white);
792  }
793 
794  //Check if plugin is already loaded
795  for (unsigned int k=0; k < plugins().size(); k++){
796 
797  QString name_nospace = basePlugin->name();
798  name_nospace.remove(" ");
799 
800  if (plugins()[k].name == name_nospace && plugins()[k].path != _filename && plugins()[k].status == PluginInfo::LOADED){
801  if (_silent || OpenFlipper::Options::nogui() ){ //dont load the plugin
802 
803  warnings += tr("Warning: Already loaded from %1").arg( plugins()[k].path) + "\n";
804 
805  printPluginLoadLog(errors, warnings);
806 
807  info.description = basePlugin->description() + tr(" *Already loaded.*");
808 
809  info.errors = errors;
810  info.warnings = warnings;
811 
812  PluginStorage::pluginsFailed().push_back(info);
813 
814  return;
815  }else{ //ask the user
816  int ret = QMessageBox::question(coreWidget_,
817  tr("Plugin already loaded"),
818  tr("A Plugin with the same name was already loaded from %1.\n"
819  "You can only load the new plugin if you unload the existing one first.\n\n"
820  "Do you want to unload the existing plugin first?").arg( plugins()[k].path),
821  QMessageBox::Yes|QMessageBox::No, QMessageBox::No);
822  if (ret == QMessageBox::No)
823  {
824  warnings += tr("Warning: Already loaded from %1.").arg( plugins()[k].path) + "\n";
825 
826  printPluginLoadLog(errors, warnings);
827 
828  info.description = basePlugin->description() + tr(" *Already loaded.*");
829 
830  info.errors = errors;
831  info.warnings = warnings;
832 
833  PluginStorage::pluginsFailed().push_back(info);
834  return;
835  }
836  }
837  }
838  }
839 
840  QStringList dontLoadPlugins = OpenFlipperSettings().value("PluginControl/DontLoadNames",QStringList()).toStringList();
841 
842  if ( dontLoadPlugins.contains(basePlugin->name(), Qt::CaseInsensitive) ) {
843 
844  warnings += tr("Warning: OpenFlipper.ini prevented Plugin %1 from being loaded! ").arg( basePlugin->name() ) + "\n";
845 
846  printPluginLoadLog(errors, warnings);
847 
848  info.status = PluginInfo::BLOCKED;
849 
850  info.errors = errors;
851  info.warnings = warnings;
852 
853  PluginStorage::pluginsFailed().push_back(info);
854 
855  return;
856  }
857 
858  //Check if it is a BasePlugin
859  SecurityInterface * securePlugin = qobject_cast< SecurityInterface * >(plugin);
860  if ( securePlugin ) {
861  emit log(LOGINFO,tr("Plugin uses security interface. Trying to authenticate against plugin ..."));
862 
863  bool success = false;
864  QMetaObject::invokeMethod(plugin,"authenticate", Q_RETURN_ARG( bool , success ) ) ;
865 
866  QString message = "";
867  QMetaObject::invokeMethod(plugin,"licenseError", Q_RETURN_ARG( QString , message ) ) ;
868  _licenseErrors = message;
869 
870  if ( success )
871  emit log(LOGINFO,tr("... ok. Loading plugin "));
872  else {
873 
874  errors += tr("Error: Failed to load plugin. Plugin access denied by license management.");
875 
876  printPluginLoadLog(errors, warnings);
877 
878  info.description = basePlugin->description() + tr(" *Plugin access denied.*");
879  // Abort here, as the plugin will not do anything else until correct authentication.
880 
881  info.errors = errors;
882  info.warnings = warnings;
883 
884  PluginStorage::pluginsFailed().push_back(info);
885  return;
886  }
887  }
888 
889 
890  emit log(LOGOUT,tr("Plugin Description :\t %1 ").arg( basePlugin->description()) );
891 
892  supported = "BaseInterface ";
893 
894  info.plugin = plugin;
895  if ( checkSlot(plugin,"version()") )
896  info.version = basePlugin->version();
897  else
898  info.version = QString::number(-1);
899 
900  if ( OpenFlipper::Options::nogui() ) {
901 
902  if ( ! checkSlot( plugin , "noguiSupported()" ) ) {
903  warnings += tr("Warning: Running in nogui mode which is unsupported by this plugin, skipping");
904 
905  printPluginLoadLog(errors, warnings);
906 
907  info.errors = errors;
908  info.warnings = warnings;
909 
910  PluginStorage::pluginsFailed().push_back(info);
911 
912  return;
913  }
914 
915  }
916 
917 
918  // Check for baseInterface of old style!
919  if ( checkSignal(plugin,"updated_objects(int)") ) {
920 
921  errors += tr("Error: Plugin Uses old style updated_objects! Convert to updatedObject!") + "\n";
922 
923  printPluginLoadLog(errors, warnings);
924 
925  info.errors = errors;
926  info.warnings = warnings;
927 
928  PluginStorage::pluginsFailed().push_back(info);
929 
930  return;
931  }
932 
933  if ( checkSignal(plugin,"update_view()") ) {
934  errors += tr("Error: Plugin Uses old style update_view! Convert to updateView!") + "\n";
935 
936  printPluginLoadLog(errors, warnings);
937 
938  info.errors = errors;
939  info.warnings = warnings;
940 
941  PluginStorage::pluginsFailed().push_back(info);
942 
943  return;
944  }
945 
946  if ( checkSignal(plugin,"updateView()") )
947  connect(plugin,SIGNAL(updateView()),this,SLOT(updateView()), Qt::AutoConnection);
948 
949  if ( checkSignal(plugin,"blockScenegraphUpdates(bool)") )
950  connect(plugin,SIGNAL(blockScenegraphUpdates(bool)),this,SLOT(blockScenegraphUpdates(bool)), Qt::QueuedConnection);
951 
952  if ( checkSignal(plugin,"updatedObject(int)") && checkSignal(plugin,"updatedObject(int,const UpdateType&)") ){
953 
954  errors += tr("Error: Plugin uses deprecated and(!) new updatedObject. Only new updatedObject will be active.") + "\n";
955 
956  log(LOGERR,tr("Plugin uses deprecated and(!) new updatedObject. Only new updatedObject will be active."));
957  connect(plugin,SIGNAL(updatedObject(int,const UpdateType&)),this,SLOT(slotObjectUpdated(int,const UpdateType&)), Qt::AutoConnection);
958 
959  } else {
960 
961  if ( checkSignal(plugin,"updatedObject(int)") ){
962  warnings += tr("Warning: Plugin uses deprecated updatedObject.") + "\n";
963 
964  log(LOGWARN,tr("Plugin uses deprecated updatedObject."));
965  connect(plugin,SIGNAL(updatedObject(int)),this,SLOT(slotObjectUpdated(int)), Qt::AutoConnection);
966  }
967 
968  if ( checkSignal(plugin,"updatedObject(int,const UpdateType&)") )
969  connect(plugin,SIGNAL(updatedObject(int,const UpdateType&)),this,SLOT(slotObjectUpdated(int,const UpdateType&)), Qt::AutoConnection);
970  }
971 
972  if ( checkSlot( plugin , "slotObjectUpdated(int)" ) && checkSlot( plugin , "slotObjectUpdated(int,const UpdateType&)" ) ){
973  errors += tr("Error: Plugin uses deprecated and(!) new slotObjectUpdated. Only new slotObjectUpdated will be active.") + "\n";
974 
975  log(LOGERR,tr("Plugin uses deprecated and(!) new slotObjectUpdated. Only new slotObjectUpdated will be active."));
976  connect(this,SIGNAL(signalObjectUpdated(int,const UpdateType&)),plugin,SLOT(slotObjectUpdated(int,const UpdateType&)), Qt::DirectConnection);
977 
978  } else {
979 
980  if ( checkSlot( plugin , "slotObjectUpdated(int)" ) ){
981  warnings += tr("Warning: Plugin uses deprecated slotObjectUpdated.") + "\n";
982  log(LOGWARN,tr("Plugin uses deprecated slotObjectUpdated."));
983  connect(this,SIGNAL(signalObjectUpdated(int)),plugin,SLOT(slotObjectUpdated(int)), Qt::DirectConnection);
984  }
985 
986  if ( checkSlot( plugin , "slotObjectUpdated(int,const UpdateType&)" ) )
987  connect(this,SIGNAL(signalObjectUpdated(int,const UpdateType&)),plugin,SLOT(slotObjectUpdated(int,const UpdateType&)), Qt::DirectConnection);
988  }
989 
990  if ( checkSignal(plugin,"objectPropertiesChanged(int)")) {
991  errors += tr("Error: Signal objectPropertiesChanged(int) is deprecated.") + "\n";
992  errors += tr("Error: The signal will be automatically emitted by the object that has been changed and the core will deliver it to the plugins!.") + "\n";
993  errors += tr("Error: Please remove this signal from your plugins!.") + "\n";
994  }
995 
996  if ( checkSlot( plugin , "slotViewChanged()" ) )
997  connect(this,SIGNAL(pluginViewChanged()),plugin,SLOT(slotViewChanged()), Qt::DirectConnection);
998 
999  if ( checkSlot( plugin , "slotSceneDrawn()" ) )
1000  connect(this,SIGNAL(pluginSceneDrawn()),plugin,SLOT(slotSceneDrawn()), Qt::DirectConnection);
1001 
1002  if ( checkSlot( plugin , "slotDrawModeChanged(int)" ) )
1003  connect(coreWidget_,SIGNAL(drawModeChanged(int)),plugin,SLOT(slotDrawModeChanged(int)), Qt::DirectConnection);
1004 
1005  if ( checkSlot(plugin,"slotObjectPropertiesChanged(int)"))
1006  connect(this,SIGNAL(objectPropertiesChanged(int)),plugin,SLOT(slotObjectPropertiesChanged(int)), Qt::DirectConnection);
1007 
1008  if ( checkSignal(plugin,"visibilityChanged()" ) ) {
1009  errors += tr("Error: Signal visibilityChanged() now requires objectid or -1 as argument.") + "\n";
1010  }
1011 
1012  if ( checkSignal(plugin,"visibilityChanged(int)") ) {
1013  errors += tr("Error: Signal visibilityChanged(int) is deprecated!") + "\n";
1014  errors += tr("Error: If an object changes its visibility, it will call the required functions automatically.") + "\n";
1015  errors += tr("Error: If you change a scenegraph node, call nodeVisibilityChanged(int). See docu of this function for details.") + "\n";
1016  }
1017 
1018  if ( checkSignal(plugin,"nodeVisibilityChanged(int)") )
1019  connect(plugin,SIGNAL(nodeVisibilityChanged(int)),this,SLOT(slotVisibilityChanged(int)), Qt::DirectConnection);
1020 
1021 
1022  if ( checkSlot(plugin,"slotVisibilityChanged(int)") )
1023  connect(this,SIGNAL(visibilityChanged(int)),plugin,SLOT(slotVisibilityChanged(int)), Qt::DirectConnection);
1024 
1025  if ( checkSignal(plugin,"activeObjectChanged()" ) ) {
1026  errors += tr("Error: Signal activeObjectChanged() is now objectSelectionChanged( int _objectId )") + "\n";
1027  }
1028 
1029  if ( checkSlot(plugin,"slotActiveObjectChanged()" ) ) {
1030  errors += tr("Error: Slot slotActiveObjectChanged() is now slotObjectSelectionChanged( int _objectId ) ") + "\n";
1031  }
1032 
1033  if ( checkSlot(plugin,"slotAllCleared()") )
1034  connect(this,SIGNAL(allCleared()),plugin,SLOT(slotAllCleared()));
1035 
1036 
1037  if ( checkSignal(plugin,"objectSelectionChanged(int)") ) {
1038  errors += tr("Error: Signal objectSelectionChanged(in) is deprecated!") + "\n";
1039  errors += tr("Error: If the selection for an object is changed, the core will emit the required signals itself!") + "\n";
1040  }
1041 
1042  if ( checkSlot( plugin , "slotObjectSelectionChanged(int)" ) )
1043  connect(this,SIGNAL(objectSelectionChanged(int)),plugin,SLOT(slotObjectSelectionChanged(int) ), Qt::DirectConnection);
1044 
1045 
1046  if ( checkSlot( plugin , "pluginsInitialized()" ) )
1047  connect(this,SIGNAL(pluginsInitialized()),plugin,SLOT(pluginsInitialized()), Qt::DirectConnection);
1048 
1049  if ( checkSlot( plugin , "pluginsInitialized(QVector<QPair<QString,QString>>const&)" ) )
1050  connect(this,SIGNAL(pluginsInitialized(QVector<QPair<QString,QString>>const&)),plugin,SLOT(pluginsInitialized(QVector<QPair<QString,QString>>const&)), Qt::DirectConnection);
1051 
1052  if ( checkSignal(plugin,"setSlotDescription(QString,QString,QStringList,QStringList)") )
1053  connect(plugin, SIGNAL(setSlotDescription(QString,QString,QStringList,QStringList)),
1054  this, SLOT(slotSetSlotDescription(QString,QString,QStringList,QStringList)) );
1055 
1056  // =============================================
1057  // Function allowing switching of renderers from other plugins
1058  // =============================================
1059  if ( checkSignal(plugin,"setRenderer(unsigned int,QString)" ) ) {
1060  connect(plugin,SIGNAL(setRenderer(unsigned int,QString)),this,SLOT(slotSetRenderer(unsigned int,QString)));
1061  }
1062 
1063  if ( checkSignal(plugin,"getCurrentRenderer(unsigned int,QString&)" ) ) {
1064  connect(plugin,SIGNAL(getCurrentRenderer(unsigned int,QString&)),this,SLOT(slotGetCurrentRenderer(unsigned int,QString&)), Qt::DirectConnection);
1065  }
1066 
1067 
1068  }
1069 
1070  //Check if the plugin supports Logging
1071  LoggingInterface* logPlugin = qobject_cast< LoggingInterface * >(plugin);
1072  if ( logPlugin ) {
1073  supported = supported + "Logging ";
1074 
1075  // Create intermediate logger class which will mangle the output
1076  PluginLogger* newlog = new PluginLogger(info.name);
1077  loggers_.push_back(newlog);
1078  connect(plugin,SIGNAL(log(Logtype, QString )),newlog,SLOT(slotLog(Logtype, QString )),Qt::DirectConnection);
1079  connect(plugin,SIGNAL(log(QString )),newlog,SLOT(slotLog(QString )),Qt::DirectConnection);
1080 
1081  // Connect it to the core widget logger
1082  if ( OpenFlipper::Options::gui() )
1083  connect(newlog,SIGNAL(log(Logtype, QString )),coreWidget_,SLOT(slotLog(Logtype, QString )),Qt::DirectConnection);
1084 
1085  // connection to console logger
1086  connect(newlog,SIGNAL(log(Logtype, QString )),this,SLOT(slotLog(Logtype, QString )),Qt::DirectConnection);
1087 
1088  // connection to file logger
1089  connect(newlog,SIGNAL(log(Logtype, QString )),this,SLOT(slotLogToFile(Logtype, QString )),Qt::DirectConnection);
1090 
1091  // connection to external plugin logger
1092  if ( checkSlot(plugin,"logOutput(Logtype,QString)") )
1093  connect(this,SIGNAL(externalLog(Logtype,QString)), plugin, SLOT(logOutput(Logtype,QString)) ) ;
1094  }
1095 
1096  //Check if the plugin supports Menubar-Interface
1097  MenuInterface* menubarPlugin = qobject_cast< MenuInterface * >(plugin);
1098  if ( menubarPlugin && OpenFlipper::Options::gui() ) {
1099  supported = supported + "Menubar ";
1100 
1101  if ( checkSignal(plugin,"addMenubarAction(QAction*,QString)") )
1102  connect(plugin , SIGNAL(addMenubarAction(QAction*,QString)),
1103  coreWidget_ , SLOT(slotAddMenubarAction(QAction*,QString)),Qt::DirectConnection);
1104  if ( checkSignal(plugin,"addMenubarActions(std::vector<QAction*>, QString)") )
1105  connect(plugin , SIGNAL(addMenubarActions(std::vector<QAction*>,QString)),
1106  coreWidget_ , SLOT(slotAddMenubarActions(std::vector<QAction*>,QString)),Qt::DirectConnection);
1107  if ( checkSignal(plugin,"getMenubarMenu (QString,QMenu*&,bool)") )
1108  connect(plugin , SIGNAL(getMenubarMenu (QString,QMenu*&,bool)),
1109  coreWidget_ , SLOT(slotGetMenubarMenu (QString,QMenu*&,bool)),Qt::DirectConnection);
1110  }
1111 
1112  //Check if the plugin supports ContextMenuInterface
1113  ContextMenuInterface* contextMenuPlugin = qobject_cast< ContextMenuInterface * >(plugin);
1114  if ( contextMenuPlugin && OpenFlipper::Options::gui() ) {
1115  supported = supported + "ContextMenu ";
1116 
1117  if ( checkSignal(plugin,"addContextMenuItem(QAction*,ContextMenuType)") )
1118  connect(plugin , SIGNAL(addContextMenuItem(QAction*,ContextMenuType)),
1119  coreWidget_ , SLOT(slotAddContextItem(QAction*,ContextMenuType)),Qt::DirectConnection);
1120 
1121  if ( checkSignal(plugin,"addContextMenuItem(QAction*,DataType,ContextMenuType)") )
1122  connect(plugin , SIGNAL(addContextMenuItem(QAction*,DataType,ContextMenuType)),
1123  coreWidget_ , SLOT(slotAddContextItem(QAction*,DataType,ContextMenuType)),Qt::DirectConnection);
1124 
1125  if ( checkSignal(plugin,"hideContextMenu()") )
1126  connect(plugin , SIGNAL(hideContextMenu()),
1127  coreWidget_ , SLOT(slotHideContextMenu()),Qt::DirectConnection);
1128 
1129  if ( checkSlot(plugin,"slotUpdateContextMenu(int)") )
1130  connect(coreWidget_ , SIGNAL(updateContextMenu(int)),
1131  plugin , SLOT(slotUpdateContextMenu(int)),Qt::DirectConnection);
1132 
1133  if ( checkSlot(plugin,"slotUpdateContextMenuNode(int)") )
1134  connect(coreWidget_ , SIGNAL(updateContextMenuNode(int)),
1135  plugin , SLOT(slotUpdateContextMenuNode(int)),Qt::DirectConnection);
1136 
1137  if ( checkSlot(plugin,"slotUpdateContextMenuBackground()") )
1138  connect(coreWidget_ , SIGNAL(updateContextMenuBackground()),
1139  plugin , SLOT(slotUpdateContextMenuBackground()),Qt::DirectConnection);
1140  }
1141 
1142  //Check if the plugin supports Toolbox-Interface
1143  ToolboxInterface* toolboxPlugin = qobject_cast< ToolboxInterface * >(plugin);
1144  if ( toolboxPlugin && OpenFlipper::Options::gui() ) {
1145  supported = supported + "Toolbox ";
1146 
1147 
1148  if ( checkSignal(plugin, "addToolbox(QString,QWidget*)"))
1149  connect(plugin, SIGNAL( addToolbox(QString,QWidget*) ),
1150  this, SLOT( addToolbox(QString,QWidget*) ),Qt::DirectConnection );
1151 
1152  if ( checkSignal(plugin, "addToolbox(QString,QWidget*,QIcon*)"))
1153  connect(plugin, SIGNAL( addToolbox(QString,QWidget*,QIcon*) ),
1154  this, SLOT( addToolbox(QString,QWidget*,QIcon*) ),Qt::DirectConnection );
1155 
1156  if ( checkSignal(plugin, "addToolbox(QString,QWidget*,QIcon*,QWidget*)"))
1157  connect(plugin, SIGNAL( addToolbox(QString,QWidget*,QIcon*,QWidget*) ),
1158  this, SLOT( addToolbox(QString,QWidget*,QIcon*,QWidget*) ),Qt::DirectConnection );
1159 }
1160 
1161  //Check if the plugin supports ViewMode-Interface
1162  ViewModeInterface* viewModePlugin = qobject_cast< ViewModeInterface * >(plugin);
1163  if ( viewModePlugin && OpenFlipper::Options::gui() ) {
1164  supported = supported + "ViewMode ";
1165 
1166  if ( checkSignal(plugin, "defineViewModeToolboxes(QString,QStringList)"))
1167  connect(plugin, SIGNAL( defineViewModeToolboxes(QString, QStringList) ),
1168  coreWidget_, SLOT( slotAddViewModeToolboxes(QString, QStringList) ),Qt::DirectConnection );
1169 
1170  if ( checkSignal(plugin, "defineViewModeToolbars(QString,QStringList)"))
1171  connect(plugin, SIGNAL( defineViewModeToolbars(QString, QStringList) ),
1172  coreWidget_, SLOT( slotAddViewModeToolbars(QString, QStringList) ),Qt::DirectConnection );
1173 
1174  if ( checkSignal(plugin, "defineViewModeContextMenus(QString,QStringList)"))
1175  connect(plugin, SIGNAL( defineViewModeContextMenus(QString, QStringList) ),
1176  coreWidget_, SLOT( slotAddViewModeContextMenus(QString, QStringList) ),Qt::DirectConnection );
1177 
1178  if ( checkSignal(plugin, "defineViewModeIcon(QString,QString)"))
1179  connect(plugin, SIGNAL( defineViewModeIcon(QString, QString) ),
1180  coreWidget_, SLOT( slotSetViewModeIcon(QString, QString) ),Qt::DirectConnection );
1181 
1182  if ( checkSignal(plugin, "setViewMode(QString,bool)"))
1183  connect(plugin, SIGNAL( setViewMode(QString, bool) ),
1184  coreWidget_, SLOT( setViewMode(QString, bool) ),Qt::DirectConnection );
1185  }
1186 
1187  //Check if the plugin supports Options-Interface
1188  OptionsInterface* optionsPlugin = qobject_cast< OptionsInterface * >(plugin);
1189  if ( optionsPlugin && OpenFlipper::Options::gui() ) {
1190  supported = supported + "Options ";
1191 
1192  QWidget* widget = 0;
1193  if ( optionsPlugin->initializeOptionsWidget( widget ) ) {
1194  info.optionsWidget = widget;
1195 
1196  if ( checkSlot(plugin,"applyOptions()") )
1197  connect(coreWidget_ , SIGNAL( applyOptions() ),
1198  plugin , SLOT( applyOptions() ),Qt::DirectConnection);
1199  }
1200  }
1201 
1202  //Check if the plugin supports Toolbar-Interface
1203  ToolbarInterface* toolbarPlugin = qobject_cast< ToolbarInterface * >(plugin);
1204  if ( toolbarPlugin && OpenFlipper::Options::gui() ) {
1205  supported = supported + "Toolbars ";
1206 
1207  if ( checkSignal(plugin,"addToolbar(QToolBar*)") )
1208  connect(plugin,SIGNAL(addToolbar(QToolBar*)),
1209  coreWidget_,SLOT(slotAddToolbar(QToolBar*)),Qt::DirectConnection);
1210 
1211  if ( checkSignal(plugin,"removeToolbar(QToolBar*)") )
1212  connect(plugin,SIGNAL(removeToolbar(QToolBar*)),
1213  coreWidget_,SLOT(slotRemoveToolbar(QToolBar*)),Qt::DirectConnection);
1214 
1215  if ( checkSignal(plugin,"getToolBar(QString,QToolBar*&)") )
1216  connect(plugin,SIGNAL(getToolBar(QString,QToolBar*&)),
1217  coreWidget_,SLOT(getToolBar(QString,QToolBar*&)),Qt::DirectConnection);
1218 
1219  }
1220 
1221  //Check if the plugin supports StatusBar-Interface
1222  StatusbarInterface* statusbarPlugin = qobject_cast< StatusbarInterface * >(plugin);
1223  if ( statusbarPlugin && OpenFlipper::Options::gui() ) {
1224  supported = supported + "StatusBar ";
1225 
1226  if ( checkSignal(plugin,"showStatusMessage(QString,int)") )
1227  connect(plugin,SIGNAL(showStatusMessage(QString,int)),
1228  coreWidget_,SLOT(statusMessage(QString,int)),Qt::DirectConnection);
1229 
1230 
1231  if ( checkSignal(plugin,"setStatus(ApplicationStatus::applicationStatus)") )
1232  connect(plugin,SIGNAL(setStatus(ApplicationStatus::applicationStatus)),
1233  coreWidget_,SLOT(setStatus(ApplicationStatus::applicationStatus)),Qt::DirectConnection);
1234 
1235  if ( checkSignal(plugin,"clearStatusMessage()") )
1236  connect(plugin,SIGNAL(clearStatusMessage()),
1237  coreWidget_,SLOT(clearStatusMessage()));
1238 
1239  if ( checkSignal(plugin,"addWidgetToStatusbar(QWidget*)") )
1240  connect(plugin,SIGNAL(addWidgetToStatusbar(QWidget*)), coreWidget_,SLOT(addWidgetToStatusbar(QWidget*)));
1241  }
1242 
1243  //Check if the plugin supports Key-Interface
1244  KeyInterface* keyPlugin = qobject_cast< KeyInterface * >(plugin);
1245  if ( keyPlugin && OpenFlipper::Options::gui() ) {
1246  supported = supported + "KeyboardEvents ";
1247 
1248  if ( checkSignal(plugin,"registerKey(int,Qt::KeyboardModifiers,QString,bool)") )
1249  connect(plugin,SIGNAL( registerKey(int, Qt::KeyboardModifiers, QString, bool) ),
1250  coreWidget_,SLOT(slotRegisterKey(int, Qt::KeyboardModifiers, QString, bool)) );
1251  }
1252 
1253  //Check if the plugin supports Mouse-Interface
1254  MouseInterface* mousePlugin = qobject_cast< MouseInterface * >(plugin);
1255  if ( mousePlugin && OpenFlipper::Options::gui() ) {
1256  supported = supported + "MouseEvents ";
1257 
1258  if ( checkSlot( plugin , "slotMouseWheelEvent(QWheelEvent*,const std::string&)" ) )
1259  connect(this , SIGNAL(PluginWheelEvent(QWheelEvent * , const std::string & )),
1260  plugin , SLOT(slotMouseWheelEvent(QWheelEvent* , const std::string & )));
1261 
1262  if ( checkSlot( plugin , "slotMouseEvent(QMouseEvent*)" ) )
1263  connect(this , SIGNAL(PluginMouseEvent(QMouseEvent*)),
1264  plugin , SLOT(slotMouseEvent(QMouseEvent*)));
1265 
1266  if ( checkSlot( plugin , "slotMouseEventLight(QMouseEvent*)" ) )
1267  connect(this , SIGNAL(PluginMouseEventLight(QMouseEvent*)),
1268  plugin , SLOT(slotMouseEventLight(QMouseEvent*)));
1269 
1270  }
1271 
1272  //Check if the plugin supports InformationInterface
1273  InformationInterface* infoPlugin = qobject_cast< InformationInterface * >(plugin);
1274  if ( infoPlugin && OpenFlipper::Options::gui() ) {
1275  supported = supported + "TypeInformation ";
1276 
1277  DataType dtype = infoPlugin->supportedDataTypes();
1278  supportedInfoTypes().insert(std::pair<InformationInterface*,DataType>(infoPlugin,dtype));
1279  }
1280 
1281  //Check if the plugin supports Picking-Interface
1282  PickingInterface* pickPlugin = qobject_cast< PickingInterface * >(plugin);
1283  if ( pickPlugin && OpenFlipper::Options::gui() ) {
1284  supported = supported + "Picking ";
1285 
1286  if ( checkSlot( plugin , "slotPickModeChanged(const std::string&)" ) )
1287  connect(coreWidget_,SIGNAL(signalPickModeChanged (const std::string &)),
1288  plugin,SLOT(slotPickModeChanged( const std::string &)));
1289 
1290  if ( checkSignal(plugin,"addPickMode(const std::string&)") )
1291  connect(plugin,SIGNAL(addPickMode( const std::string& )),
1292  this,SLOT(slotAddPickMode( const std::string& )),Qt::DirectConnection);
1293 
1294  if ( checkSignal(plugin,"addHiddenPickMode(const std::string&)") )
1295  connect(plugin,SIGNAL(addHiddenPickMode( const std::string& )),
1296  this,SLOT(slotAddHiddenPickMode( const std::string& )),Qt::DirectConnection);
1297 
1298  if ( checkSignal(plugin,"setPickModeCursor(const std::string&,QCursor)") )
1299  for ( unsigned int i = 0 ; i < OpenFlipper::Options::examinerWidgets() ; ++i )
1300  connect(plugin,SIGNAL(setPickModeCursor( const std::string& ,QCursor)),
1301  coreWidget_,SLOT(setPickModeCursor( const std::string& ,QCursor)),Qt::DirectConnection);
1302 
1303  if ( checkSignal(plugin,"setPickModeMouseTracking(const std::string&,bool)") )
1304  for ( unsigned int i = 0 ; i < OpenFlipper::Options::examinerWidgets() ; ++i )
1305  connect(plugin,SIGNAL(setPickModeMouseTracking( const std::string& ,bool)),
1306  coreWidget_,SLOT(setPickModeMouseTracking( const std::string& ,bool)),Qt::DirectConnection);
1307 
1308  if ( checkSignal(plugin,"setPickModeToolbar(const std::string&,QToolBar*)") )
1309  connect(plugin,SIGNAL(setPickModeToolbar (const std::string&, QToolBar*)),
1310  coreWidget_,SLOT(setPickModeToolbar (const std::string&, QToolBar*)),Qt::DirectConnection);
1311 
1312  if ( checkSignal(plugin,"removePickModeToolbar(const std::string&)") )
1313  connect(plugin,SIGNAL(removePickModeToolbar( const std::string&)),
1314  coreWidget_,SLOT(removePickModeToolbar( const std::string&)),Qt::DirectConnection);
1315 
1316  }
1317 
1318  //Check if the plugin supports INI-Interface
1319  INIInterface* iniPlugin = qobject_cast< INIInterface * >(plugin);
1320  if ( iniPlugin ) {
1321  supported = supported + "INIFile ";
1322 
1323  if ( checkSlot( plugin , "loadIniFile(INIFile&,int)" ) )
1324  connect(this , SIGNAL(iniLoad( INIFile&,int)),
1325  plugin , SLOT( loadIniFile( INIFile&,int) ),Qt::DirectConnection);
1326 
1327  if ( checkSlot( plugin , "saveIniFile(INIFile&,int)" ) )
1328  connect(this , SIGNAL(iniSave( INIFile& , int )),
1329  plugin , SLOT( saveIniFile( INIFile& , int ) ),Qt::DirectConnection);
1330 
1331  if ( checkSlot( plugin , "saveIniFileOptions(INIFile&)" ) )
1332  connect(this , SIGNAL(iniSaveOptions( INIFile& )),
1333  plugin , SLOT( saveIniFileOptions( INIFile& ) ),Qt::DirectConnection);
1334 
1335  if ( checkSlot( plugin , "saveOnExit(INIFile&)" ) )
1336  connect(this , SIGNAL(saveOnExit( INIFile& )),
1337  plugin , SLOT( saveOnExit( INIFile& ) ),Qt::DirectConnection);
1338 
1339  if ( checkSlot( plugin , "loadIniFileOptions(INIFile&)" ) )
1340  connect(this , SIGNAL(iniLoadOptions( INIFile& )),
1341  plugin , SLOT( loadIniFileOptions( INIFile& ) ),Qt::DirectConnection);
1342 
1343  if ( checkSlot( plugin , "loadIniFileOptionsLast(INIFile&)" ) )
1344  connect(this , SIGNAL(iniLoadOptionsLast( INIFile& )),
1345  plugin , SLOT( loadIniFileOptionsLast( INIFile& ) ),Qt::DirectConnection);
1346  }
1347 
1348 #ifdef PYTHON_ENABLED
1349 
1350  // Check if the plugin supports Python Interface
1351  PythonInterface* pythonPlugin = qobject_cast< PythonInterface * >(plugin);
1352 
1353  if ( pythonPlugin ) {
1354  supported = supported + "PythonInterface ";
1355 
1356  QObject* currentPluginPointer = qobject_cast< QObject * >(plugin);
1357 
1358  setPluginPointer(basePlugin->name() , currentPluginPointer);
1359 
1360  }
1361 
1362 #endif
1363 
1364  //Check if the plugin supports Selection-Interface
1365  SelectionInterface* selectionPlugin = qobject_cast< SelectionInterface * >(plugin);
1366  if ( selectionPlugin && OpenFlipper::Options::gui() ) {
1367  supported = supported + "SelectionBase ";
1368 
1369  if ( checkSignal(plugin,"addSelectionEnvironment(QString,QString,QIcon,QString&)") ) {
1370  errors += tr("Error: Plugin uses deprecated addSelectionEnvironment(QString,QString,QIcon,QString&) , Replace the qicon by the path to the icon!") + "\n";
1371  log(LOGERR,tr("Plugin uses deprecated addSelectionEnvironment(QString,QString,QIcon,QString&) , Replace the qicon by the path to the icon!"));
1372  }
1373 
1374  if ( checkSignal(plugin,"addSelectionEnvironment(QString,QString,QString,QString&)") )
1375  connect(plugin , SIGNAL(addSelectionEnvironment(QString,QString,QString,QString&)),
1376  this , SLOT(slotAddSelectionEnvironment(QString,QString,QString,QString&)),Qt::DirectConnection);
1377 
1378  // ===============
1379 
1380  if ( checkSlot(plugin,"slotAddSelectionEnvironment(QString,QString,QIcon,QString&)") ) {
1381  errors += tr("Error: Plugin uses deprecated slotAddSelectionEnvironment(QString,QString,QIcon,QString&) , Replace the qicon by the path to the icon!") + "\n";
1382  }
1383 
1384  if ( checkSlot( plugin , "slotAddSelectionEnvironment(QString,QString,QString,QString&)" ) )
1385  connect(this , SIGNAL(addSelectionEnvironment(QString,QString,QString,QString&)),
1386  plugin , SLOT(slotAddSelectionEnvironment(QString,QString,QString,QString&)),Qt::DirectConnection);
1387 
1388  // ===============
1389 
1390  if ( checkSignal(plugin,"registerType(QString,DataType)") )
1391  connect(plugin , SIGNAL(registerType(QString,DataType)),
1392  this , SLOT(slotRegisterType(QString,DataType)),Qt::DirectConnection);
1393 
1394  // ===============
1395 
1396  if ( checkSlot( plugin , "slotRegisterType(QString,DataType)" ) )
1397  connect(this , SIGNAL(registerType(QString,DataType)),
1398  plugin , SLOT(slotRegisterType(QString,DataType)),Qt::DirectConnection);
1399 
1400  // ===============
1401 
1402  if ( checkSignal(plugin,"addPrimitiveType(QString,QString,QIcon,SelectionInterface::PrimitiveType&)") ) {
1403  errors += tr("Error: Plugin uses deprecated addPrimitiveType(QString,QString,QIcon,SelectionInterface::PrimitiveType&) , Replace the qicon by the path to the icon!") + "\n";
1404  }
1405 
1406  if ( checkSignal(plugin,"addPrimitiveType(QString,QString,QString,SelectionInterface::PrimitiveType&)") )
1407  connect(plugin , SIGNAL(addPrimitiveType(QString,QString,QString,SelectionInterface::PrimitiveType&)),
1408  this , SLOT(slotAddPrimitiveType(QString,QString,QString,SelectionInterface::PrimitiveType&)),Qt::DirectConnection);
1409 
1410  // ===============
1411 
1412  if ( checkSlot(plugin,"slotAddPrimitiveType(QString,QString,QIcon,SelectionInterface::PrimitiveType&)") )
1413  log(LOGERR,tr("Plugin uses deprecated slotAddPrimitiveType(QString,QString,QIcon,SelectionInterface::PrimitiveType&) , Replace the qicon by the path to the icon!"));
1414 
1415  if ( checkSlot( plugin , "slotAddPrimitiveType(QString,QString,QString,SelectionInterface::PrimitiveType&)" ) )
1416  connect(this , SIGNAL(addPrimitiveType(QString,QString,QString,SelectionInterface::PrimitiveType&)),
1417  plugin , SLOT(slotAddPrimitiveType(QString,QString,QString,SelectionInterface::PrimitiveType&)),Qt::DirectConnection);
1418 
1419  // ===============
1420 
1421  if ( checkSignal(plugin,"addCustomSelectionMode(QString,QString,QString,QIcon,SelectionInterface::PrimitiveType,QString&)") ) {
1422  errors += tr("Error: Plugin uses deprecated addCustomSelectionMode(QString,QString,QString,QIcon,SelectionInterface::PrimitiveType,QString&) , Replace the qicon by the path to the icon!") + "\n";
1423 
1424  log(LOGERR,tr("Plugin uses deprecated addCustomSelectionMode(QString,QString,QString,QIcon,SelectionInterface::PrimitiveType,QString&) , Replace the qicon by the path to the icon!"));
1425  }
1426 
1427  if ( checkSignal(plugin,"addCustomSelectionMode(QString,QString,QString,QString,SelectionInterface::PrimitiveType,QString&)") )
1428  connect(plugin , SIGNAL(addCustomSelectionMode(QString,QString,QString,QString,SelectionInterface::PrimitiveType,QString&)),
1429  this , SLOT(slotAddCustomSelectionMode(QString,QString,QString,QString,SelectionInterface::PrimitiveType,QString&)),Qt::DirectConnection);
1430 
1431  // ===============
1432 
1433  if ( checkSignal(plugin,"addCustomSelectionMode(QString,QString,QString,QIcon,SelectionInterface::PrimitiveType,QString&,DataType)") ) {
1434  errors += tr("Error: Plugin uses deprecated addCustomSelectionMode(QString,QString,QString,QIcon,SelectionInterface::PrimitiveType,QString&,DataType) , Replace the qicon by the path to the icon!") + "\n";
1435  log(LOGERR,tr("Plugin uses deprecated addCustomSelectionMode(QString,QString,QString,QIcon,SelectionInterface::PrimitiveType,QString&,DataType) , Replace the qicon by the path to the icon!"));
1436  }
1437 
1438  if ( checkSignal(plugin,"addCustomSelectionMode(QString,QString,QString,QIcon,SelectionInterface::PrimitiveType,QString&,DataType)") )
1439  connect(plugin , SIGNAL(addCustomSelectionMode(QString,QString,QString,QIcon,SelectionInterface::PrimitiveType,QString&,DataType)),
1440  this , SLOT(slotAddCustomSelectionMode(QString,QString,QString,QIcon,SelectionInterface::PrimitiveType,QString&,DataType)),Qt::DirectConnection);
1441 
1442  // ===============
1443 
1444  if ( checkSlot(plugin,"slotAddCustomSelectionMode(QString,QString,QString,QIcon,SelectionInterface::PrimitiveType,QString&)") ) {
1445  errors += tr("Error: Plugin uses deprecated slotAddCustomSelectionMode(QString,QString,QString,QIcon,SelectionInterface::PrimitiveType,QString&) , Replace the qicon by the path to the icon!") + "\n";
1446  log(LOGERR,tr("Plugin uses deprecated slotAddCustomSelectionMode(QString,QString,QString,QIcon,SelectionInterface::PrimitiveType,QString&) , Replace the qicon by the path to the icon!"));
1447  }
1448 
1449  if ( checkSlot( plugin , "slotAddCustomSelectionMode(QString,QString,QString,QString,SelectionInterface::PrimitiveType,QString&)" ) )
1450  connect(this , SIGNAL(addCustomSelectionMode(QString,QString,QString,QString,SelectionInterface::PrimitiveType,QString&)),
1451  plugin , SLOT(slotAddCustomSelectionMode(QString,QString,QString,QString,SelectionInterface::PrimitiveType,QString&)),Qt::DirectConnection);
1452 
1453  // ===============
1454 
1455  if ( checkSlot(plugin,"slotAddCustomSelectionMode(QString,QString,QString,QIcon,SelectionInterface::PrimitiveType,QString&,DataType)") ) {
1456  errors += tr("Error: Plugin uses deprecated slotAddCustomSelectionMode(QString,QString,QString,QIcon,SelectionInterface::PrimitiveType,QString&,DataType) , Replace the qicon by the path to the icon!") + "\n";
1457  log(LOGERR,tr("Plugin uses deprecated slotAddCustomSelectionMode(QString,QString,QString,QIcon,SelectionInterface::PrimitiveType,QString&,DataType) , Replace the qicon by the path to the icon!"));
1458  }
1459 
1460  if ( checkSlot( plugin , "slotAddCustomSelectionMode(QString,QString,QString,QString,SelectionInterface::PrimitiveType,QString&,DataType)" ) )
1461  connect(this , SIGNAL(addCustomSelectionMode(QString,QString,QString,QString,SelectionInterface::PrimitiveType,QString&,DataType)),
1462  plugin , SLOT(slotAddCustomSelectionMode(QString,QString,QString,QString,SelectionInterface::PrimitiveType,QString&,DataType)),Qt::DirectConnection);
1463 
1464  // ===============
1465 
1466 
1467  if ( checkSignal(plugin,"addSelectionOperations(QString,QStringList,QString,SelectionInterface::PrimitiveType)") )
1468  connect(plugin , SIGNAL(addSelectionOperations(QString,QStringList,QString,SelectionInterface::PrimitiveType)),
1469  this , SLOT(slotAddSelectionOperations(QString,QStringList,QString,SelectionInterface::PrimitiveType)),Qt::DirectConnection);
1470 
1471  if ( checkSlot( plugin , "slotAddSelectionOperations(QString,QStringList,QString,SelectionInterface::PrimitiveType)" ) )
1472  connect(this , SIGNAL(addSelectionOperations(QString,QStringList,QString,SelectionInterface::PrimitiveType)),
1473  plugin , SLOT(slotAddSelectionOperations(QString,QStringList,QString,SelectionInterface::PrimitiveType)),Qt::DirectConnection);
1474 
1475  if ( checkSignal(plugin,"addSelectionParameters(QString,QWidget*,QString,SelectionInterface::PrimitiveType)") )
1476  connect(plugin , SIGNAL(addSelectionParameters(QString,QWidget*,QString,SelectionInterface::PrimitiveType)),
1477  this , SLOT(slotAddSelectionParameters(QString,QWidget*,QString,SelectionInterface::PrimitiveType)),Qt::DirectConnection);
1478 
1479  if ( checkSlot( plugin , "slotAddSelectionParameters(QString,QWidget*,QString,SelectionInterface::PrimitiveType)" ) )
1480  connect(this , SIGNAL(addSelectionParameters(QString,QWidget*,QString,SelectionInterface::PrimitiveType)),
1481  plugin , SLOT(slotAddSelectionParameters(QString,QWidget*,QString,SelectionInterface::PrimitiveType)),Qt::DirectConnection);
1482 
1483 
1484  if ( checkSignal(plugin,"selectionOperation(QString)") )
1485  connect(plugin , SIGNAL(selectionOperation(QString)),
1486  this , SLOT(slotSelectionOperation(QString)),Qt::DirectConnection);
1487 
1488  if ( checkSlot( plugin , "slotSelectionOperation(QString)" ) )
1489  connect(this , SIGNAL(selectionOperation(QString)),
1490  plugin , SLOT(slotSelectionOperation(QString)),Qt::DirectConnection);
1491 
1492  if ( checkSignal(plugin,"showToggleSelectionMode(QString,bool,SelectionInterface::PrimitiveType)") )
1493  connect(plugin , SIGNAL(showToggleSelectionMode(QString,bool,SelectionInterface::PrimitiveType)),
1494  this , SLOT(slotShowToggleSelectionMode(QString,bool,SelectionInterface::PrimitiveType)),Qt::DirectConnection);
1495 
1496  if ( checkSlot( plugin , "slotShowToggleSelectionMode(QString,bool,SelectionInterface::PrimitiveType)" ) )
1497  connect(this , SIGNAL(showToggleSelectionMode(QString,bool,SelectionInterface::PrimitiveType)),
1498  plugin , SLOT(slotShowToggleSelectionMode(QString,bool,SelectionInterface::PrimitiveType)),Qt::DirectConnection);
1499 
1500  if ( checkSignal(plugin,"showLassoSelectionMode(QString,bool,SelectionInterface::PrimitiveType)") )
1501  connect(plugin , SIGNAL(showLassoSelectionMode(QString,bool,SelectionInterface::PrimitiveType)),
1502  this , SLOT(slotShowLassoSelectionMode(QString,bool,SelectionInterface::PrimitiveType)),Qt::DirectConnection);
1503 
1504  if ( checkSlot( plugin , "slotShowLassoSelectionMode(QString,bool,SelectionInterface::PrimitiveType)" ) )
1505  connect(this , SIGNAL(showLassoSelectionMode(QString,bool,SelectionInterface::PrimitiveType)),
1506  plugin , SLOT(slotShowLassoSelectionMode(QString,bool,SelectionInterface::PrimitiveType)),Qt::DirectConnection);
1507 
1508  if ( checkSignal(plugin,"showVolumeLassoSelectionMode(QString,bool,SelectionInterface::PrimitiveType)") )
1509  connect(plugin , SIGNAL(showVolumeLassoSelectionMode(QString,bool,SelectionInterface::PrimitiveType)),
1510  this , SLOT(slotShowVolumeLassoSelectionMode(QString,bool,SelectionInterface::PrimitiveType)),Qt::DirectConnection);
1511 
1512  if ( checkSlot( plugin , "slotShowVolumeLassoSelectionMode(QString,bool,SelectionInterface::PrimitiveType)" ) )
1513  connect(this , SIGNAL(showVolumeLassoSelectionMode(QString,bool,SelectionInterface::PrimitiveType)),
1514  plugin , SLOT(slotShowVolumeLassoSelectionMode(QString,bool,SelectionInterface::PrimitiveType)),Qt::DirectConnection);
1515 
1516  if ( checkSignal(plugin,"showSurfaceLassoSelectionMode(QString,bool,SelectionInterface::PrimitiveType)") )
1517  connect(plugin , SIGNAL(showSurfaceLassoSelectionMode(QString,bool,SelectionInterface::PrimitiveType)),
1518  this , SLOT(slotShowSurfaceLassoSelectionMode(QString,bool,SelectionInterface::PrimitiveType)),Qt::DirectConnection);
1519 
1520  if ( checkSlot( plugin , "slotShowSurfaceLassoSelectionMode(QString,bool,SelectionInterface::PrimitiveType)" ) )
1521  connect(this , SIGNAL(showSurfaceLassoSelectionMode(QString,bool,SelectionInterface::PrimitiveType)),
1522  plugin , SLOT(slotShowSurfaceLassoSelectionMode(QString,bool,SelectionInterface::PrimitiveType)),Qt::DirectConnection);
1523 
1524  if ( checkSignal(plugin,"showSphereSelectionMode(QString,bool,SelectionInterface::PrimitiveType)") )
1525  connect(plugin , SIGNAL(showSphereSelectionMode(QString,bool,SelectionInterface::PrimitiveType)),
1526  this , SLOT(slotShowSphereSelectionMode(QString,bool,SelectionInterface::PrimitiveType)),Qt::DirectConnection);
1527 
1528  if ( checkSlot( plugin , "slotShowSphereSelectionMode(QString,bool,SelectionInterface::PrimitiveType)" ) )
1529  connect(this , SIGNAL(showSphereSelectionMode(QString,bool,SelectionInterface::PrimitiveType)),
1530  plugin , SLOT(slotShowSphereSelectionMode(QString,bool,SelectionInterface::PrimitiveType)),Qt::DirectConnection);
1531 
1532  if ( checkSignal(plugin,"showClosestBoundarySelectionMode(QString,bool,SelectionInterface::PrimitiveType)") )
1533  connect(plugin , SIGNAL(showClosestBoundarySelectionMode(QString,bool,SelectionInterface::PrimitiveType)),
1534  this , SLOT(slotShowClosestBoundarySelectionMode(QString,bool,SelectionInterface::PrimitiveType)),Qt::DirectConnection);
1535 
1536  if ( checkSlot( plugin , "slotShowClosestBoundarySelectionMode(QString,bool,SelectionInterface::PrimitiveType)" ) )
1537  connect(this , SIGNAL(showClosestBoundarySelectionMode(QString,bool,SelectionInterface::PrimitiveType)),
1538  plugin , SLOT(slotShowClosestBoundarySelectionMode(QString,bool,SelectionInterface::PrimitiveType)),Qt::DirectConnection);
1539 
1540  if ( checkSignal(plugin,"showFloodFillSelectionMode(QString,bool,SelectionInterface::PrimitiveType)") )
1541  connect(plugin , SIGNAL(showFloodFillSelectionMode(QString,bool,SelectionInterface::PrimitiveType)),
1542  this , SLOT(slotShowFloodFillSelectionMode(QString,bool,SelectionInterface::PrimitiveType)),Qt::DirectConnection);
1543 
1544  if ( checkSlot( plugin , "slotShowFloodFillSelectionMode(QString,bool,SelectionInterface::PrimitiveType)" ) )
1545  connect(this , SIGNAL(showFloodFillSelectionMode(QString,bool,SelectionInterface::PrimitiveType)),
1546  plugin , SLOT(slotShowFloodFillSelectionMode(QString,bool,SelectionInterface::PrimitiveType)),Qt::DirectConnection);
1547 
1548  if ( checkSignal(plugin,"showComponentsSelectionMode(QString,bool,SelectionInterface::PrimitiveType)") )
1549  connect(plugin , SIGNAL(showComponentsSelectionMode(QString,bool,SelectionInterface::PrimitiveType)),
1550  this , SLOT(slotShowComponentsSelectionMode(QString,bool,SelectionInterface::PrimitiveType)),Qt::DirectConnection);
1551 
1552  if ( checkSlot( plugin , "slotShowComponentsSelectionMode(QString,bool,SelectionInterface::PrimitiveType)" ) )
1553  connect(this , SIGNAL(showComponentsSelectionMode(QString,bool,SelectionInterface::PrimitiveType)),
1554  plugin , SLOT(slotShowComponentsSelectionMode(QString,bool,SelectionInterface::PrimitiveType)),Qt::DirectConnection);
1555 
1556  if ( checkSignal(plugin,"toggleSelection(QMouseEvent*,SelectionInterface::PrimitiveType,bool)") )
1557  connect(plugin , SIGNAL(toggleSelection(QMouseEvent*,SelectionInterface::PrimitiveType,bool)),
1558  this , SLOT(slotToggleSelection(QMouseEvent*,SelectionInterface::PrimitiveType,bool)),Qt::DirectConnection);
1559 
1560  if ( checkSlot( plugin , "slotToggleSelection(QMouseEvent*,SelectionInterface::PrimitiveType,bool)" ) )
1561  connect(this , SIGNAL(toggleSelection(QMouseEvent*,SelectionInterface::PrimitiveType,bool)),
1562  plugin , SLOT(slotToggleSelection(QMouseEvent*,SelectionInterface::PrimitiveType,bool)),Qt::DirectConnection);
1563 
1564  if ( checkSignal(plugin,"lassoSelection(QMouseEvent*,SelectionInterface::PrimitiveType,bool)") )
1565  connect(plugin , SIGNAL(lassoSelection(QMouseEvent*,SelectionInterface::PrimitiveType,bool)),
1566  this , SLOT(slotLassoSelection(QMouseEvent*,SelectionInterface::PrimitiveType,bool)),Qt::DirectConnection);
1567 
1568  if ( checkSlot( plugin , "slotLassoSelection(QMouseEvent*,SelectionInterface::PrimitiveType,bool)" ) )
1569  connect(this , SIGNAL(lassoSelection(QMouseEvent*,SelectionInterface::PrimitiveType,bool)),
1570  plugin , SLOT(slotLassoSelection(QMouseEvent*,SelectionInterface::PrimitiveType,bool)),Qt::DirectConnection);
1571 
1572  if ( checkSignal(plugin,"volumeLassoSelection(QMouseEvent*,SelectionInterface::PrimitiveType,bool)") )
1573  connect(plugin , SIGNAL(volumeLassoSelection(QMouseEvent*,SelectionInterface::PrimitiveType,bool)),
1574  this , SLOT(slotVolumeLassoSelection(QMouseEvent*,SelectionInterface::PrimitiveType,bool)),Qt::DirectConnection);
1575 
1576  if ( checkSlot( plugin , "slotVolumeLassoSelection(QMouseEvent*,SelectionInterface::PrimitiveType,bool)" ) )
1577  connect(this , SIGNAL(volumeLassoSelection(QMouseEvent*,SelectionInterface::PrimitiveType,bool)),
1578  plugin , SLOT(slotVolumeLassoSelection(QMouseEvent*,SelectionInterface::PrimitiveType,bool)),Qt::DirectConnection);
1579 
1580  if ( checkSignal(plugin,"surfaceLassoSelection(QMouseEvent*,SelectionInterface::PrimitiveType,bool)") )
1581  connect(plugin , SIGNAL(surfaceLassoSelection(QMouseEvent*,SelectionInterface::PrimitiveType,bool)),
1582  this , SLOT(slotSurfaceLassoSelection(QMouseEvent*,SelectionInterface::PrimitiveType,bool)),Qt::DirectConnection);
1583 
1584  if ( checkSlot( plugin , "slotSurfaceLassoSelection(QMouseEvent*,SelectionInterface::PrimitiveType,bool)" ) )
1585  connect(this , SIGNAL(surfaceLassoSelection(QMouseEvent*,SelectionInterface::PrimitiveType,bool)),
1586  plugin , SLOT(slotSurfaceLassoSelection(QMouseEvent*,SelectionInterface::PrimitiveType,bool)),Qt::DirectConnection);
1587 
1588  if ( checkSignal(plugin,"sphereSelection(QMouseEvent*,double,SelectionInterface::PrimitiveType,bool)") )
1589  connect(plugin , SIGNAL(sphereSelection(QMouseEvent*,double,SelectionInterface::PrimitiveType,bool)),
1590  this , SLOT(slotSphereSelection(QMouseEvent*,double,SelectionInterface::PrimitiveType,bool)),Qt::DirectConnection);
1591 
1592  if ( checkSlot( plugin , "slotSphereSelection(QMouseEvent*,double,SelectionInterface::PrimitiveType,bool)" ) )
1593  connect(this , SIGNAL(sphereSelection(QMouseEvent*,double,SelectionInterface::PrimitiveType,bool)),
1594  plugin , SLOT(slotSphereSelection(QMouseEvent*,double,SelectionInterface::PrimitiveType,bool)),Qt::DirectConnection);
1595 
1596  if ( checkSignal(plugin,"closestBoundarySelection(QMouseEvent*,SelectionInterface::PrimitiveType,bool)") )
1597  connect(plugin , SIGNAL(closestBoundarySelection(QMouseEvent*,SelectionInterface::PrimitiveType,bool)),
1598  this , SLOT(slotClosestBoundarySelection(QMouseEvent*,SelectionInterface::PrimitiveType,bool)),Qt::DirectConnection);
1599 
1600  if ( checkSlot( plugin , "slotClosestBoundarySelection(QMouseEvent*,SelectionInterface::PrimitiveType,bool)" ) )
1601  connect(this , SIGNAL(closestBoundarySelection(QMouseEvent*,SelectionInterface::PrimitiveType,bool)),
1602  plugin , SLOT(slotClosestBoundarySelection(QMouseEvent*,SelectionInterface::PrimitiveType,bool)),Qt::DirectConnection);
1603 
1604  if ( checkSignal(plugin,"floodFillSelection(QMouseEvent*,SelectionInterface::PrimitiveType,bool)") )
1605  connect(plugin , SIGNAL(floodFillSelection(QMouseEvent*,SelectionInterface::PrimitiveType,bool)),
1606  this , SLOT(slotFloodFillSelection(QMouseEvent*,SelectionInterface::PrimitiveType,bool)),Qt::DirectConnection);
1607 
1608  if ( checkSlot( plugin , "slotFloodFillSelection(QMouseEvent*,SelectionInterface::PrimitiveType,bool)" ) )
1609  connect(this , SIGNAL(floodFillSelection(QMouseEvent*,SelectionInterface::PrimitiveType,bool)),
1610  plugin , SLOT(slotFloodFillSelection(QMouseEvent*,SelectionInterface::PrimitiveType,bool)),Qt::DirectConnection);
1611 
1612  if ( checkSignal(plugin,"componentsSelection(QMouseEvent*,SelectionInterface::PrimitiveType,bool)") )
1613  connect(plugin , SIGNAL(componentsSelection(QMouseEvent*,SelectionInterface::PrimitiveType,bool)),
1614  this , SLOT(slotComponentsSelection(QMouseEvent*,SelectionInterface::PrimitiveType,bool)),Qt::DirectConnection);
1615 
1616  if ( checkSlot( plugin , "slotComponentsSelection(QMouseEvent*,SelectionInterface::PrimitiveType,bool)" ) )
1617  connect(this , SIGNAL(componentsSelection(QMouseEvent*,SelectionInterface::PrimitiveType,bool)),
1618  plugin , SLOT(slotComponentsSelection(QMouseEvent*,SelectionInterface::PrimitiveType,bool)),Qt::DirectConnection);
1619 
1620  if ( checkSignal(plugin,"customSelection(QMouseEvent*,SelectionInterface::PrimitiveType,QString,bool)") )
1621  connect(plugin , SIGNAL(customSelection(QMouseEvent*,SelectionInterface::PrimitiveType,QString,bool)),
1622  this , SLOT(slotCustomSelection(QMouseEvent*,SelectionInterface::PrimitiveType,QString,bool)),Qt::DirectConnection);
1623 
1624  if ( checkSlot( plugin , "slotCustomSelection(QMouseEvent*,SelectionInterface::PrimitiveType,QString,bool)" ) )
1625  connect(this , SIGNAL(customSelection(QMouseEvent*,SelectionInterface::PrimitiveType,QString,bool)),
1626  plugin , SLOT(slotCustomSelection(QMouseEvent*,SelectionInterface::PrimitiveType,QString,bool)),Qt::DirectConnection);
1627 
1628  if ( checkSignal(plugin,"getActiveDataTypes(SelectionInterface::TypeList&)") )
1629  connect(plugin , SIGNAL(getActiveDataTypes(SelectionInterface::TypeList&)),
1630  this , SLOT(slotGetActiveDataTypes(SelectionInterface::TypeList&)),Qt::DirectConnection);
1631 
1632  if ( checkSlot( plugin , "slotGetActiveDataTypes(SelectionInterface::TypeList&)" ) )
1633  connect(this , SIGNAL(getActiveDataTypes(SelectionInterface::TypeList&)),
1634  plugin , SLOT(slotGetActiveDataTypes(SelectionInterface::TypeList&)),Qt::DirectConnection);
1635 
1636  if ( checkSignal(plugin,"getActivePrimitiveType(SelectionInterface::PrimitiveType&)") )
1637  connect(plugin , SIGNAL(getActivePrimitiveType(SelectionInterface::PrimitiveType&)),
1638  this , SLOT(slotGetActivePrimitiveType(SelectionInterface::PrimitiveType&)),Qt::DirectConnection);
1639 
1640  if ( checkSlot( plugin , "slotGetActivePrimitiveType(SelectionInterface::PrimitiveType&)" ) )
1641  connect(this , SIGNAL(getActivePrimitiveType(SelectionInterface::PrimitiveType&)),
1642  plugin , SLOT(slotGetActivePrimitiveType(SelectionInterface::PrimitiveType&)),Qt::DirectConnection);
1643 
1644  if ( checkSignal(plugin,"targetObjectsOnly(bool&)") )
1645  connect(plugin , SIGNAL(targetObjectsOnly(bool&)),
1646  this , SLOT(slotTargetObjectsOnly(bool&)),Qt::DirectConnection);
1647 
1648  if ( checkSlot( plugin , "slotTargetObjectsOnly(bool&)" ) )
1649  connect(this , SIGNAL(targetObjectsOnly(bool&)),
1650  plugin , SLOT(slotTargetObjectsOnly(bool&)),Qt::DirectConnection);
1651 
1652  if ( checkSignal(plugin,"loadSelection(const INIFile&)") )
1653  connect(plugin , SIGNAL(loadSelection(const INIFile&)),
1654  this , SLOT(slotLoadSelection(const INIFile&)),Qt::DirectConnection);
1655 
1656  if ( checkSlot( plugin , "slotLoadSelection(const INIFile&)" ) )
1657  connect(this , SIGNAL(loadSelection(const INIFile&)),
1658  plugin , SLOT(slotLoadSelection(const INIFile&)),Qt::DirectConnection);
1659 
1660  if ( checkSignal(plugin,"saveSelection(INIFile&)") )
1661  connect(plugin , SIGNAL(saveSelection(INIFile&)),
1662  this , SLOT(slotSaveSelection(INIFile&)),Qt::DirectConnection);
1663 
1664  if ( checkSlot( plugin , "slotSaveSelection(INIFile&)" ) )
1665  connect(this , SIGNAL(saveSelection(INIFile&)),
1666  plugin , SLOT(slotSaveSelection(INIFile&)),Qt::DirectConnection);
1667 
1668  if ( checkSignal(plugin,"registerKeyShortcut(int,Qt::KeyboardModifiers)") )
1669  connect(plugin , SIGNAL(registerKeyShortcut(int,Qt::KeyboardModifiers)),
1670  this , SLOT(slotRegisterKeyShortcut(int,Qt::KeyboardModifiers)),Qt::DirectConnection);
1671 
1672  if ( checkSlot( plugin , "slotRegisterKeyShortcut(int,Qt::KeyboardModifiers)" ) )
1673  connect(this , SIGNAL(registerKeyShortcut(int,Qt::KeyboardModifiers)),
1674  plugin , SLOT(slotRegisterKeyShortcut(int,Qt::KeyboardModifiers)),Qt::DirectConnection);
1675 
1676  if ( checkSignal(plugin,"keyShortcutEvent(int,Qt::KeyboardModifiers)") )
1677  connect(plugin , SIGNAL(keyShortcutEvent(int,Qt::KeyboardModifiers)),
1678  this , SLOT(slotKeyShortcutEvent(int,Qt::KeyboardModifiers)),Qt::DirectConnection);
1679 
1680  if ( checkSlot( plugin , "slotKeyShortcutEvent(int,Qt::KeyboardModifiers)" ) )
1681  connect(this , SIGNAL(keyShortcutEvent(int,Qt::KeyboardModifiers)),
1682  plugin , SLOT(slotKeyShortcutEvent(int,Qt::KeyboardModifiers)),Qt::DirectConnection);
1683  }
1684 
1685  //Check if the plugin supports Texture-Interface
1686  TextureInterface* texturePlugin = qobject_cast< TextureInterface * >(plugin);
1687  if ( texturePlugin && OpenFlipper::Options::gui() ) {
1688  supported = supported + "Textures ";
1689 
1690  if ( checkSignal(plugin,"addTexture(QString,QString,uint,int)") )
1691  connect(plugin , SIGNAL(addTexture( QString , QString , uint , int )),
1692  this , SLOT(slotAddTexture(QString, QString, uint, int)),Qt::DirectConnection);
1693 
1694  if ( checkSignal(plugin,"addTexture(QString,QImage,uint,int)") )
1695  connect(plugin , SIGNAL(addTexture( QString , QImage , uint , int )),
1696  this , SLOT(slotAddTexture(QString, QImage, uint, int)),Qt::DirectConnection);
1697 
1698  if ( checkSlot( plugin , "slotTextureAdded(QString,QString,uint,int)" ) )
1699  connect(this , SIGNAL(addTexture(QString,QString, uint, int)),
1700  plugin , SLOT(slotTextureAdded(QString,QString, uint, int)),Qt::DirectConnection);
1701 
1702  if ( checkSlot( plugin , "slotTextureAdded(QString,QImage,uint,int)" ) )
1703  connect(this , SIGNAL(addTexture(QString,QImage, uint, int)),
1704  plugin , SLOT(slotTextureAdded(QString,QImage, uint, int)),Qt::DirectConnection);
1705 
1706  if ( checkSignal(plugin,"addTexture(QString,QString,uint)") )
1707  connect(plugin , SIGNAL(addTexture( QString , QString , uint )),
1708  this , SLOT(slotAddTexture(QString, QString, uint)),Qt::AutoConnection);
1709 
1710  if ( checkSignal(plugin,"addTexture(QString,QImage,uint)") )
1711  connect(plugin , SIGNAL(addTexture( QString , QImage , uint )),
1712  this , SLOT(slotAddTexture(QString, QImage, uint)),Qt::AutoConnection);
1713 
1714  if ( checkSlot( plugin , "slotTextureAdded(QString,QString,uint)" ) )
1715  connect(this , SIGNAL(addTexture(QString,QString, uint)),
1716  plugin , SLOT(slotTextureAdded(QString,QString, uint)),Qt::DirectConnection);
1717 
1718  if ( checkSlot( plugin , "slotTextureAdded(QString,QImage,uint)" ) )
1719  connect(this , SIGNAL(addTexture(QString,QImage, uint)),
1720  plugin , SLOT(slotTextureAdded(QString,QImage, uint)),Qt::DirectConnection);
1721 
1722  if ( checkSignal(plugin,"updateTexture(QString,int)") )
1723  connect(plugin , SIGNAL(updateTexture( QString ,int )),
1724  this , SLOT(slotUpdateTexture(QString , int)),Qt::AutoConnection);
1725 
1726  if ( checkSlot( plugin , "slotUpdateTexture(QString,int)" ) )
1727  connect(this , SIGNAL(updateTexture(QString ,int)),
1728  plugin , SLOT(slotUpdateTexture(QString,int )),Qt::DirectConnection);
1729 
1730  if ( checkSignal(plugin,"updateAllTextures()") )
1731  connect(plugin , SIGNAL(updateAllTextures()),
1732  this , SLOT(slotUpdateAllTextures()));
1733 
1734  if ( checkSlot( plugin , "slotUpdateAllTextures()" ) )
1735  connect(this , SIGNAL(updateAllTextures()),
1736  plugin , SLOT(slotUpdateAllTextures()));
1737 
1738  if ( checkSignal(plugin,"updatedTextures(QString,int)") )
1739  connect(plugin , SIGNAL(updatedTextures( QString , int )),
1740  this , SLOT(slotTextureUpdated( QString, int ) ),Qt::AutoConnection);
1741 
1742  if ( checkSlot( plugin , "slotTextureUpdated(QString,int)" ) )
1743  connect(this , SIGNAL(updatedTextures( QString , int )),
1744  plugin , SLOT(slotTextureUpdated( QString, int ) ),Qt::DirectConnection);
1745 
1746  if ( checkSignal(plugin,"setTextureMode(QString,QString,int)") )
1747  connect(plugin , SIGNAL(setTextureMode(QString, QString, int )),
1748  this , SLOT(slotSetTextureMode(QString, QString, int )),Qt::AutoConnection );
1749 
1750  if ( checkSlot( plugin , "slotSetTextureMode(QString,QString,int)" ) )
1751  connect(this , SIGNAL(setTextureMode(QString, QString, int )),
1752  plugin , SLOT(slotSetTextureMode(QString, QString, int )),Qt::DirectConnection );
1753 
1754  if ( checkSignal(plugin,"setTextureMode(QString,QString)") )
1755  connect(plugin , SIGNAL(setTextureMode(QString ,QString )),
1756  this , SLOT(slotSetTextureMode(QString ,QString )),Qt::AutoConnection );
1757 
1758  if ( checkSlot( plugin , "slotSetTextureMode(QString,QString)" ) )
1759  connect(this , SIGNAL(setTextureMode(QString ,QString )),
1760  plugin , SLOT(slotSetTextureMode(QString ,QString )),Qt::DirectConnection );
1761 
1762  if ( checkSignal(plugin,"switchTexture(QString,int)") )
1763  connect(plugin , SIGNAL(switchTexture(QString, int )),
1764  this , SLOT(slotSwitchTexture(QString, int )),Qt::QueuedConnection);
1765 
1766  if ( checkSlot( plugin , "slotSwitchTexture(QString,int)" ) )
1767  connect(this , SIGNAL(switchTexture(QString, int )),
1768  plugin , SLOT(slotSwitchTexture(QString, int )),Qt::QueuedConnection);
1769 
1770  if ( checkSignal(plugin,"switchTexture(QString)") )
1771  connect(plugin , SIGNAL(switchTexture(QString )),
1772  this , SLOT(slotSwitchTexture(QString )),Qt::QueuedConnection);
1773 
1774  if ( checkSlot( plugin , "slotSwitchTexture(QString)" ) )
1775  connect(this , SIGNAL(switchTexture(QString )),
1776  plugin , SLOT(slotSwitchTexture(QString )),Qt::QueuedConnection);
1777 
1778 
1779 
1780  if ( checkSignal( plugin , "textureChangeImage(QString,QImage&,int)" ) )
1781  connect(plugin , SIGNAL(textureChangeImage(QString,QImage&,int)),
1782  this , SLOT(slotTextureChangeImage(QString,QImage&,int)),Qt::DirectConnection);
1783 
1784  if ( checkSlot( plugin , "slotTextureChangeImage(QString,QImage&,int)" ) )
1785  connect(this , SIGNAL(textureChangeImage(QString,QImage&,int)),
1786  plugin , SLOT(slotTextureChangeImage(QString,QImage&,int)),Qt::DirectConnection);
1787 
1788  if ( checkSignal( plugin , "textureChangeImage(QString,QImage&)" ) )
1789  connect(plugin , SIGNAL(textureChangeImage(QString,QImage&)),
1790  this , SLOT(slotTextureChangeImage(QString,QImage&)),Qt::DirectConnection);
1791 
1792  if ( checkSlot( plugin , "slotTextureChangeImage(QString,QImage&)" ) )
1793  connect(this , SIGNAL(textureChangeImage(QString,QImage&)),
1794  plugin , SLOT(slotTextureChangeImage(QString,QImage&)),Qt::DirectConnection);
1795 
1796  if ( checkSignal( plugin , "addMultiTexture(QString,QString,QString,int,int&)" ) )
1797  connect(plugin , SIGNAL(addMultiTexture(QString,QString,QString,int,int&) ),
1798  this , SLOT(slotMultiTextureAdded(QString,QString,QString,int,int&) ),Qt::DirectConnection);
1799 
1800  if ( checkSignal( plugin , "addMultiTexture(QString,QString,QImage,int,int&)" ) )
1801  connect(plugin , SIGNAL(addMultiTexture(QString,QString,QImage,int,int&) ),
1802  this , SLOT(slotMultiTextureAdded(QString,QString,QImage,int,int&) ),Qt::DirectConnection);
1803 
1804  if ( checkSlot( plugin , "slotMultiTextureAdded( QString,QString,QString,int,int&)" ) )
1805  connect(this , SIGNAL(addMultiTexture(QString,QString,QString,int,int&) ),
1806  plugin , SLOT(slotMultiTextureAdded( QString,QString,QString,int,int&) ),Qt::DirectConnection);
1807 
1808  if ( checkSlot( plugin , "slotMultiTextureAdded( QString,QString,QImage,int,int&)" ) )
1809  connect(this , SIGNAL(addMultiTexture(QString,QString,QImage,int,int&) ),
1810  plugin , SLOT(slotMultiTextureAdded( QString,QString,QImage,int,int&) ),Qt::DirectConnection);
1811 
1812  if ( checkSignal( plugin , "textureGetImage(QString,QImage&,int)" ) )
1813  connect(plugin , SIGNAL(textureGetImage(QString,QImage&,int)),
1814  this , SLOT(slotTextureGetImage(QString,QImage&,int)),Qt::DirectConnection);
1815 
1816  if ( checkSlot( plugin , "slotTextureGetImage(QString,QImage&,int)" ) )
1817  connect(this , SIGNAL(textureGetImage(QString,QImage&,int)),
1818  plugin , SLOT(slotTextureGetImage(QString,QImage&,int)),Qt::DirectConnection);
1819 
1820  if ( checkSignal( plugin , "textureGetImage(QString,QImage&)" ) )
1821  connect(plugin , SIGNAL(textureGetImage(QString,QImage&)),
1822  this , SLOT(slotTextureGetImage(QString,QImage&)),Qt::DirectConnection);
1823 
1824  if ( checkSlot( plugin , "slotTextureGetImage(QString,QImage&)" ) )
1825  connect(this , SIGNAL(textureGetImage(QString,QImage&)),
1826  plugin , SLOT(slotTextureGetImage(QString,QImage&)),Qt::DirectConnection);
1827 
1828  if ( checkSignal( plugin , "textureIndex(QString,int,int&)" ) )
1829  connect(plugin , SIGNAL(textureIndex(QString,int,int&)),
1830  this , SLOT(slotTextureIndex(QString,int,int&)),Qt::DirectConnection);
1831 
1832  if ( checkSlot( plugin , "slotTextureIndex(QString,int,int&)" ) )
1833  connect(this , SIGNAL(textureIndex(QString,int,int&)),
1834  plugin , SLOT(slotTextureIndex(QString,int,int&)),Qt::DirectConnection);
1835 
1836  if ( checkSignal( plugin , "textureIndexPropertyName(int,QString&)" ) )
1837  connect(plugin , SIGNAL(textureIndexPropertyName(int,QString&)),
1838  this , SLOT(slotTextureIndexPropertyName(int,QString&)),Qt::DirectConnection);
1839 
1840  if ( checkSlot( plugin , "slotTextureIndexPropertyName(int,QString&)" ) )
1841  connect(this , SIGNAL(textureIndexPropertyName(int,QString&)),
1842  plugin , SLOT(slotTextureIndexPropertyName(int,QString&)),Qt::DirectConnection);
1843 
1844  if ( checkSignal( plugin , "textureName(int,int,QString&)" ) )
1845  connect(plugin , SIGNAL(textureName(int,int,QString&)),
1846  this , SLOT(slotTextureName(int,int,QString&)),Qt::DirectConnection);
1847 
1848  if ( checkSlot( plugin , "slotTextureName(int,int,QString&)" ) )
1849  connect(this , SIGNAL(textureName(int,int,QString&)),
1850  plugin , SLOT(slotTextureName(int,int,QString&)),Qt::DirectConnection);
1851 
1852  if ( checkSignal( plugin , "textureFilename(int,QString,QString&)" ) )
1853  connect(plugin , SIGNAL(textureFilename(int,QString,QString&)),
1854  this , SLOT(slotTextureFilename(int,QString,QString&)),Qt::DirectConnection);
1855 
1856  if ( checkSlot( plugin , "slotTextureFilename(int,QString,QString&)" ) )
1857  connect(this , SIGNAL(textureFilename(int,QString,QString&)),
1858  plugin , SLOT(slotTextureFilename(int,QString,QString&)),Qt::DirectConnection);
1859 
1860  if ( checkSignal( plugin , "getCurrentTexture(int,QString&)" ) )
1861  connect(plugin , SIGNAL(getCurrentTexture(int,QString&)),
1862  this , SLOT(slotGetCurrentTexture(int,QString&)),Qt::DirectConnection);
1863 
1864  if ( checkSlot( plugin , "slotGetCurrentTexture(int,QString&)" ) )
1865  connect(this , SIGNAL(getCurrentTexture(int,QString&)),
1866  plugin , SLOT(slotGetCurrentTexture(int,QString&)),Qt::DirectConnection);
1867 
1868  if ( checkSignal( plugin , "getSubTextures(int,QString,QStringList&)" ) )
1869  connect(plugin , SIGNAL(getSubTextures(int,QString,QStringList&)),
1870  this , SLOT(slotGetSubTextures(int,QString,QStringList&)),Qt::DirectConnection);
1871 
1872  if ( checkSlot( plugin , "slotGetSubTextures(int,QString,QStringList&)" ) )
1873  connect(this , SIGNAL(getSubTextures(int,QString,QStringList&)),
1874  plugin , SLOT(slotGetSubTextures(int,QString,QStringList&)),Qt::DirectConnection);
1875  }
1876 
1877  //Check if the plugin supports Backup-Interface
1878  BackupInterface* backupPlugin = qobject_cast< BackupInterface * >(plugin);
1879  if ( backupPlugin ) {
1880  supported = supported + "Backups ";
1881 
1882  // Incoming Signal that a backup should be created
1883  if ( checkSignal( plugin , "createBackup(int,QString,UpdateType)" ) ) {
1884  connect(plugin , SIGNAL(createBackup(int,QString,UpdateType)) ,
1885  this , SIGNAL(createBackup(int,QString,UpdateType)),Qt::DirectConnection );
1886  }
1887  // Signal send from core to plugins that they should create a backup
1888  if ( checkSlot( plugin , "slotCreateBackup(int,QString,UpdateType)" ) ) {
1889  connect(this , SIGNAL(createBackup(int,QString,UpdateType)),
1890  plugin , SLOT( slotCreateBackup(int,QString,UpdateType) ),Qt::DirectConnection);
1891  }
1892 
1893  // Incoming Signal that a backup should be created
1894  if ( checkSignal( plugin , "createBackup(IdList,QString,std::vector<UpdateType>)" ) ) {
1895  connect(plugin , SIGNAL(createBackup(IdList,QString,std::vector<UpdateType>)) ,
1896  this , SIGNAL(createBackup(IdList,QString,std::vector<UpdateType>)),Qt::DirectConnection );
1897  }
1898  // Signal send from core to plugins that they should create a backup
1899  if ( checkSlot( plugin , "slotCreateBackup(IdList,QString,std::vector<UpdateType>)" ) ) {
1900  connect(this , SIGNAL(createBackup(IdList,QString,std::vector<UpdateType>)),
1901  plugin , SLOT( slotCreateBackup(IdList,QString,std::vector<UpdateType>) ),Qt::DirectConnection);
1902  }
1903 
1904 
1905  // Signal from plugin to restore an object with the given id
1906  if ( checkSignal( plugin , "undo(int)" ) ) {
1907  connect(plugin , SIGNAL(undo(int)) ,
1908  this , SIGNAL(undo(int)),Qt::DirectConnection );
1909  }
1910 
1911  // Signal send from core to backup plugin that it should restore the given object
1912  if ( checkSlot( plugin , "slotUndo(int)" ) ) {
1913  connect(this , SIGNAL(undo(int)),
1914  plugin , SLOT( slotUndo(int) ),Qt::DirectConnection);
1915  }
1916 
1917  // Signal from plugin to restore an object with the given id
1918  if ( checkSignal( plugin , "redo(int)" ) ) {
1919  connect(plugin , SIGNAL(redo(int)) ,
1920  this , SIGNAL(redo(int)),Qt::DirectConnection );
1921  }
1922 
1923  // Signal send from core to backup plugin that it should restore the given object
1924  if ( checkSlot( plugin , "slotRedo(int)" ) ) {
1925  connect(this , SIGNAL(redo(int)),
1926  plugin , SLOT( slotRedo(int) ),Qt::DirectConnection);
1927  }
1928 
1929  // Signal from plugin to restore an object with the given id
1930  if ( checkSignal( plugin , "undo()" ) ) {
1931  connect(plugin , SIGNAL(undo()) ,
1932  this , SIGNAL(undo()),Qt::DirectConnection );
1933  }
1934 
1935  // Signal send from core to backup plugin that it should restore the given object
1936  if ( checkSlot( plugin , "slotUndo()" ) ) {
1937  connect(this , SIGNAL(undo()),
1938  plugin , SLOT( slotUndo() ),Qt::DirectConnection);
1939  }
1940 
1941  // Signal from plugin to restore an object with the given id
1942  if ( checkSignal( plugin , "redo()" ) ) {
1943  connect(plugin , SIGNAL(redo()) ,
1944  this , SIGNAL(redo()),Qt::DirectConnection );
1945  }
1946 
1947  // Signal send from core to backup plugin that it should restore the given object
1948  if ( checkSlot( plugin , "slotRedo()" ) ) {
1949  connect(this , SIGNAL(redo()),
1950  plugin , SLOT( slotRedo() ),Qt::DirectConnection);
1951  }
1952 
1953  //====================================================================================
1954  // Backup Plugin signals for communication with the other plugins about restore state
1955  //====================================================================================
1956 
1957  // Stage one : restore will happen soon
1958  if ( checkSignal( plugin , "aboutToRestore(int)" ) ) {
1959  connect(plugin , SIGNAL( aboutToRestore(int)) ,
1960  this , SIGNAL( aboutToRestore(int) ),Qt::DirectConnection);
1961  }
1962 
1963  // Stage two: Restore complete
1964  if ( checkSignal( plugin , "restored(int)" ) ) {
1965  connect(plugin , SIGNAL(restored(int)) ,
1966  this , SIGNAL( restored(int) ),Qt::DirectConnection);
1967  }
1968 
1969  //====================================================================================
1970  // Plugin slots about restore state
1971  //====================================================================================
1972 
1973  // Stage one : restore will happen soon
1974  if ( checkSlot( plugin , "slotAboutToRestore(int)" ) ) {
1975  connect(this , SIGNAL( aboutToRestore(int)) ,
1976  plugin , SLOT( slotAboutToRestore(int) ),Qt::DirectConnection);
1977  }
1978 
1979  // Stage two : restore will happen soon
1980  if ( checkSlot( plugin , "slotRestored(int)" ) ) {
1981  connect(this , SIGNAL( restored(int)) ,
1982  plugin , SLOT( slotRestored(int) ),Qt::DirectConnection);
1983  }
1984 
1985  // Signal from plugin to restore a group with the given id
1986  if ( checkSignal( plugin , "generateBackup(int,QString,UpdateType)" ) ) {
1987  connect(plugin , SIGNAL(generateBackup(int,QString,UpdateType)) ,
1988  this , SLOT(slotGenerateBackup(int,QString,UpdateType)),Qt::DirectConnection );
1989  }
1990  }
1991 
1992  //Check if the plugin supports LoadSave-Interface
1993  LoadSaveInterface* LoadSavePlugin = qobject_cast< LoadSaveInterface * >(plugin);
1994  if ( LoadSavePlugin ) {
1995  supported = supported + "Load/Save ";
1996  if ( checkSignal(plugin,"load( QString,DataType,int& )" ) )
1997  connect(plugin , SIGNAL(load( QString,DataType,int& )) ,
1998  this , SLOT(slotLoad( QString,DataType,int& )),Qt::DirectConnection );
1999  if ( checkSignal(plugin,"save(int,QString)" ) )
2000  connect(plugin , SIGNAL( save(int,QString) ) ,
2001  this , SLOT( saveObject(int,QString) ), Qt::DirectConnection);
2002 
2003  if ( checkSlot( plugin , "fileOpened(int)" ) )
2004  connect(this , SIGNAL( openedFile( int) ) ,
2005  plugin , SLOT( fileOpened( int ) ),Qt::DirectConnection);
2006 
2007  if ( checkSignal(plugin,"addEmptyObject(DataType,int&)" ) )
2008  connect(plugin , SIGNAL( addEmptyObject( DataType, int& )) ,
2009  this , SLOT( slotAddEmptyObject( DataType, int&) ),Qt::DirectConnection);
2010 
2011  if ( checkSignal(plugin,"copyObject(int,int&)" ) )
2012  connect(plugin , SIGNAL( copyObject( int, int& )) ,
2013  this , SLOT( slotCopyObject( int, int&) ),Qt::DirectConnection);
2014 
2015  // Plugins to core
2016  if ( checkSignal(plugin,"emptyObjectAdded(int)" ) )
2017  connect(plugin , SIGNAL( emptyObjectAdded( int ) ) ,
2018  this , SLOT( slotEmptyObjectAdded ( int ) ),Qt::QueuedConnection);
2019 
2020  // core to plugins
2021  if ( checkSlot(plugin,"addedEmptyObject(int)" ) )
2022  connect(this , SIGNAL( emptyObjectAdded( int ) ) ,
2023  plugin , SLOT( addedEmptyObject( int ) ),Qt::DirectConnection);
2024 
2025  if ( checkSignal(plugin,"deleteObject(int)" ) )
2026  connect(plugin , SIGNAL( deleteObject( int ) ) ,
2027  this , SLOT( deleteObject( int ) ),Qt::AutoConnection);
2028 
2029  if ( checkSignal(plugin,"deleteAllObjects()" ) )
2030  connect(plugin , SIGNAL( deleteAllObjects() ) ,
2031  this , SLOT( slotDeleteAllObjects() ),Qt::DirectConnection);
2032 
2033  if ( checkSignal(plugin,"getAllFileFilters(QStringList&)" ) )
2034  connect(plugin , SIGNAL( getAllFileFilters(QStringList&) ) ,
2035  this , SLOT( slotGetAllFilters(QStringList&) ),Qt::DirectConnection);
2036 
2037  if ( checkSlot(plugin,"objectDeleted(int)" ) )
2038  connect(this , SIGNAL( objectDeleted( int ) ) ,
2039  plugin , SLOT( objectDeleted( int ) ),Qt::DirectConnection);
2040 
2041  }
2042 
2043  //Check if the plugin supports View-Interface
2044  ViewInterface* viewPlugin = qobject_cast< ViewInterface * >(plugin);
2045  if ( viewPlugin && OpenFlipper::Options::gui() ) {
2046  supported = supported + "View ";
2047 
2048  if ( checkSignal(plugin,"getStackWidget(QString,QWidget*&)" ) )
2049  connect(plugin , SIGNAL(getStackWidget( QString , QWidget*&)),
2050  coreWidget_ , SLOT( slotGetStackWidget( QString , QWidget*& ) ) ,Qt::DirectConnection );
2051  if ( checkSignal(plugin,"addStackWidget(QString,QWidget*)" ) )
2052  connect(plugin , SIGNAL(addStackWidget( QString , QWidget*)),
2053  coreWidget_ , SLOT( slotAddStackWidget( QString , QWidget* ) ) ,Qt::DirectConnection );
2054  if ( checkSignal(plugin,"updateStackWidget(QString,QWidget*)" ) )
2055  connect(plugin , SIGNAL(updateStackWidget( QString , QWidget*)),
2056  coreWidget_ , SLOT( slotUpdateStackWidget( QString , QWidget* ) ) ,Qt::DirectConnection );
2057  }
2058 
2059  //Check if the plugin supports Process-Interface
2060  ProcessInterface* processPlugin = qobject_cast< ProcessInterface * >(plugin);
2061  if ( processPlugin ) {
2062  supported = supported + "Process ";
2063 
2064  if ( checkSignal(plugin,"startJob(QString,QString,int,int,bool)" ) )
2065  connect(plugin , SIGNAL(startJob(QString, QString,int,int,bool)),
2066  this , SLOT( slotStartJob(QString, QString,int,int,bool) ), Qt::DirectConnection );
2067  else {
2068  errors += tr("Error: Process Interface defined but no startJob signal found!") + "\n";
2069  }
2070 
2071  if ( checkSignal(plugin,"setJobState(QString,int)" ) )
2072  connect(plugin , SIGNAL(setJobState(QString,int)),
2073  this , SLOT( slotSetJobState(QString,int) ), Qt::QueuedConnection );
2074  else {
2075  errors += tr("Error: Process Interface defined but no setJobState signal found!") + "\n";
2076  }
2077 
2078  if ( checkSignal(plugin,"setJobName(QString,QString)" ) )
2079  connect(plugin , SIGNAL(setJobName(QString, QString)),
2080  this , SLOT( slotSetJobName(QString, QString) ), Qt::QueuedConnection );
2081  else {
2082  errors += tr("Error: Process Interface defined but no setJobName signal found!") + "\n";
2083  }
2084 
2085  if ( checkSignal(plugin,"setJobDescription(QString,QString)" ) )
2086  connect(plugin , SIGNAL(setJobDescription(QString, QString)),
2087  this , SLOT( slotSetJobDescription(QString, QString) ), Qt::QueuedConnection );
2088  else {
2089  errors += tr("Error: Process Interface defined but no setJobDescription signal found!") + "\n";
2090  }
2091 
2092  if ( checkSignal(plugin,"cancelJob(QString)" ) )
2093  connect(plugin , SIGNAL(cancelJob(QString)),
2094  this , SLOT( slotCancelJob(QString) ), Qt::QueuedConnection );
2095 
2096  if ( checkSignal(plugin,"finishJob(QString)" ) )
2097  connect(plugin , SIGNAL(finishJob(QString)),
2098  this , SLOT( slotFinishJob(QString) ), Qt::QueuedConnection );
2099  else {
2100  errors += tr("Error: Process Interface defined but no finishJob signal found!") + "\n";
2101  }
2102 
2103  if ( checkSlot(plugin,"canceledJob(QString)" ) )
2104  connect(this , SIGNAL( jobCanceled( QString ) ) ,
2105  plugin , SLOT( canceledJob(QString) ),Qt::QueuedConnection);
2106  else {
2107  errors += tr("Error: Process Interface defined but no cancel canceledJob slot found!") + "\n";
2108  }
2109  }
2110 
2111  //Check if the plugin supports RPC-Interface
2112  RPCInterface* rpcPlugin = qobject_cast< RPCInterface * >(plugin);
2113  if ( rpcPlugin ) {
2114  supported = supported + "RPC ";
2115 
2116  if ( checkSignal(plugin,"pluginExists(QString,bool&)" ) )
2117  connect(plugin , SIGNAL( pluginExists(QString,bool&) ),
2118  this , SLOT( slotPluginExists(QString,bool&) ) ,Qt::DirectConnection );
2119  if ( checkSignal(plugin,"functionExists(QString,QString,bool&)" ) )
2120  connect(plugin , SIGNAL(functionExists(QString,QString,bool&)),
2121  this , SLOT( slotFunctionExists(QString,QString,bool&) ) ,Qt::DirectConnection );
2122  if ( checkSignal(plugin,"call(QString,QString,bool&)" ) )
2123  connect(plugin , SIGNAL(call(QString,QString,bool&)),
2124  this , SLOT(slotCall(QString,QString,bool&)) ,Qt::DirectConnection );
2125  if ( checkSignal(plugin,"call(QString,bool&)" ) )
2126  connect(plugin , SIGNAL(call(QString,bool&)),
2127  this , SLOT(slotCall(QString,bool&)) ,Qt::DirectConnection );
2128  if ( checkSignal(plugin,"getValue(QString,QVariant&)" ) )
2129  connect(plugin , SIGNAL(getValue(QString,QVariant&)),
2130  this , SLOT(slotGetValue(QString,QVariant&)) ,Qt::DirectConnection );
2131  }
2132 
2133  //Check if the plugin supports PluginConnectionInterface
2134  PluginConnectionInterface* interconnectionPlugin = qobject_cast< PluginConnectionInterface * >(plugin);
2135  if ( interconnectionPlugin ) {
2136  supported = supported + "Plugin Interconnection ";
2137 
2138  if ( checkSignal(plugin,"crossPluginConnect(QString,const char*,QString,const char*)" ) ) {
2139  connect(plugin , SIGNAL( crossPluginConnect(QString,const char*,QString,const char*) ),
2140  this , SLOT( slotCrossPluginConnect(QString,const char*,QString,const char*) ));
2141  }
2142 
2143  if ( checkSignal(plugin,"crossPluginConnectQueued(QString,const char*,QString,const char*)" ) ) {
2144  connect(plugin , SIGNAL( crossPluginConnectQueued(QString,const char*,QString,const char*) ),
2145  this , SLOT( slotCrossPluginConnectQueued(QString,const char*,QString,const char*) ));
2146  }
2147  }
2148 
2149  //Check if the plugin supports RenderInterface
2150  RenderInterface* renderPlugin = qobject_cast< RenderInterface * >(plugin);
2151  if ( renderPlugin ) {
2152  supported = supported + "Rendering ";
2153 
2154  if ( checkSlot( plugin , "rendererName()" ) ) {
2155  QString rendererNameString = "";
2156 
2157  // Get the name of the renderer
2158  QMetaObject::invokeMethod(plugin,"rendererName", Qt::DirectConnection, Q_RETURN_ARG(QString,rendererNameString) ) ;
2159 
2160  // Let the plugin check its OpenGL support requirements
2161  QString openGLCheck = "";
2162  QMetaObject::invokeMethod(plugin,"checkOpenGL", Qt::DirectConnection, Q_RETURN_ARG(QString,openGLCheck) ) ;
2163 
2164  if ( openGLCheck != "" ) {
2165  errors += tr("Error: Insufficient OpenGL capabilities in Renderer Plugin ") + rendererNameString + " !" + "\n";
2166  errors += openGLCheck + "\n";
2167 
2168  printPluginLoadLog(errors, warnings);
2169 
2170  info.errors = errors;
2171  info.warnings = warnings;
2172 
2173  PluginStorage::pluginsFailed().push_back(info);
2174 
2175  return;
2176  }
2177 
2178  // Check if it already exists and add it if not.
2179  RendererInfo* rendererInfo = 0;
2180  if ( ! renderManager().rendererExists(rendererNameString) ) {
2181  rendererInfo = renderManager().newRenderer(rendererNameString);
2182  } else {
2183  errors += tr("Error: Renderer Plugin %1 already exists") + "\n";
2184  }
2185 
2186  // Retrieve and store renderer information
2187  if ( rendererInfo != 0) {
2188  rendererInfo->plugin = renderPlugin;
2189  rendererInfo->name = basePlugin->name();
2190  rendererInfo->version = basePlugin->version();
2191  rendererInfo->description = basePlugin->description();
2192 
2193  ACG::SceneGraph::DrawModes::DrawMode supportedModes;
2194 
2195  // Get the supported draw modes of the renderer
2196  QMetaObject::invokeMethod(plugin,"supportedDrawModes", Q_ARG(ACG::SceneGraph::DrawModes::DrawMode& ,supportedModes) );
2197 
2198  rendererInfo->modes = supportedModes;
2199 
2200  if ( checkSlot( plugin , "optionsAction()" ) ) {
2201  //Get an action for the post processor options
2202  rendererInfo->optionsAction = renderPlugin->optionsAction();
2203 
2204  } else {
2205  rendererInfo->optionsAction = 0;
2206  }
2207  }
2208 
2209  } else {
2210  errors += tr("Error: Renderer Plugin without rendererName Function?!") + "\n";
2211  }
2212 
2213  }
2214 
2215  //Check if the plugin supports PostProcessorInterface
2216  PostProcessorInterface* postProcessorPlugin = qobject_cast< PostProcessorInterface * >(plugin);
2217  if ( postProcessorPlugin ) {
2218  supported = supported + "PostProcessor ";
2219 
2220  if ( checkSlot( plugin , "postProcessorName()" ) ) {
2221  QString postProcessorNameString = "";
2222 
2223  // Get the name of the PostProcessor
2224  QMetaObject::invokeMethod(plugin,"postProcessorName", Qt::DirectConnection, Q_RETURN_ARG(QString,postProcessorNameString) ) ;
2225 
2226  // Let the plugin check its OpenGL support requirements
2227  QString openGLCheck = "";
2228  QMetaObject::invokeMethod(plugin,"checkOpenGL", Qt::DirectConnection, Q_RETURN_ARG(QString,openGLCheck) ) ;
2229 
2230  if ( openGLCheck != "" ) {
2231  errors += tr("Error: Insufficient OpenGL capabilities in post processor Plugin ") + postProcessorNameString + " !" + "\n";
2232  errors += openGLCheck + "\n";
2233 
2234  info.errors = errors;
2235  info.warnings = warnings;
2236 
2237  PluginStorage::pluginsFailed().push_back(info);
2238 
2239  return;
2240  }
2241 
2242  // Check if it already exists and add it if not.
2243  PostProcessorInfo* postProcessorInfo = 0;
2244  if ( ! postProcessorManager().postProcessorExists(postProcessorNameString) ) {
2245  postProcessorInfo = postProcessorManager().newPostProcessor(postProcessorNameString);
2246  } else {
2247  errors += tr("Error: PostProcessor Plugin %1 already exists").arg(postProcessorNameString) + "\n";
2248  }
2249 
2250  // Retrieve and store PostProcessor information
2251  if ( postProcessorInfo != 0) {
2252  postProcessorInfo->plugin = postProcessorPlugin;
2253  postProcessorInfo->name = basePlugin->name();
2254  postProcessorInfo->version = basePlugin->version();
2255  postProcessorInfo->description = basePlugin->description();
2256 
2257  if ( checkSlot( plugin , "optionsAction()" ) ) {
2258  //Get an action for the post processor options
2259  postProcessorInfo->optionsAction = postProcessorPlugin->optionsAction();
2260 
2261  } else {
2262  postProcessorInfo->optionsAction = 0;
2263  }
2264  }
2265 
2266  } else {
2267  errors += tr("Error: PostProcessor Plugin without postProcessorName Function?!") + "\n";
2268  }
2269  }
2270 
2271  //Check if the plugin supports AboutInfo-Interface
2272  AboutInfoInterface* aboutInfoPlugin = qobject_cast< AboutInfoInterface * >(plugin);
2273  if ( aboutInfoPlugin && OpenFlipper::Options::gui() ) {
2274  supported = supported + "AboutInfo ";
2275 
2276  if ( checkSignal(plugin,"addAboutInfo(QString,QString)") )
2277  connect(plugin , SIGNAL(addAboutInfo(QString,QString)),
2278  coreWidget_ , SLOT(addAboutInfo(QString,QString)),Qt::DirectConnection);
2279  }
2280 
2281  //========================================================================================
2282  // === Collect Scripting Information for Plugin ============================
2283 
2284  QScriptValue scriptInstance = scriptEngine_.newQObject(plugin,
2285  QScriptEngine::QtOwnership,
2286  QScriptEngine::ExcludeChildObjects |
2287  QScriptEngine::ExcludeSuperClassMethods |
2288  QScriptEngine::ExcludeSuperClassProperties
2289  );
2290 
2291  // Make plugin available for scripting
2292  QString scriptingName = info.rpcName;
2293 
2294  scriptEngine_.globalObject().setProperty(scriptingName, scriptInstance);
2295 
2296  QScriptValueIterator it(scriptInstance);
2297  while (it.hasNext()) {
2298  it.next();
2299 
2301  if ( checkSignal( plugin, it.name().toLatin1() ) )
2302  continue;
2303 
2304  info.rpcFunctions.push_back( it.name() );
2305 
2306  scriptingFunctions_.push_back( scriptingName + "." + it.name() );
2307 
2308  }
2309 
2310  //Check if the plugin supports RPC-Interface
2311  ScriptInterface* scriptPlugin = qobject_cast< ScriptInterface * >(plugin);
2312  if ( scriptPlugin ) {
2313  supported = supported + "Scripting ";
2314 
2315  // Create intermediate wrapper class which will mangle the call information
2316  ScriptingWrapper* newScript = new ScriptingWrapper(info.rpcName);
2317  scriptingWrappers_.push_back(newScript);
2318 
2319  //========= Part one, Scriptinfos via wrapper to core and than to scipting Plugin ==========
2320 
2321  if ( checkSignal(plugin,"scriptInfo(QString)" ) ) {
2322 
2323  // Plugin to wrapper
2324  connect(plugin , SIGNAL( scriptInfo(QString) ),
2325  newScript , SLOT( slotScriptInfo(QString) ) ,Qt::DirectConnection );
2326 
2327  // wrapper to core
2328  connect(newScript , SIGNAL( scriptInfo(QString,QString) ),
2329  this , SLOT( slotScriptInfo(QString,QString) ));
2330  }
2331 
2332  // Core to plugins ( normally only one scripting plugin)
2333  if ( checkSlot(plugin,"slotScriptInfo(QString,QString)") ) {
2334  connect(this , SIGNAL(scriptInfo(QString,QString)),
2335  plugin , SLOT(slotScriptInfo(QString,QString)));
2336  }
2337 
2338  // Function descriptions
2339  if ( checkSignal(plugin,"getDescription(QString,QString&,QStringList&,QStringList&)") )
2340  connect(plugin , SIGNAL( getDescription(QString,QString&,QStringList&,QStringList&) ),
2341  this , SLOT( slotGetDescription(QString,QString&,QStringList&,QStringList&) ));
2342 
2343  //========= Script Execution ==========
2344 
2345  // Plugins to Core
2346  if ( checkSignal(plugin,"executeScript(QString)") )
2347  connect(plugin , SIGNAL(executeScript(QString)),
2348  this , SLOT(slotExecuteScript(QString)));
2349 
2350  // Plugins to Core
2351  if ( checkSignal(plugin,"executeFileScript(QString)") )
2352  connect(plugin , SIGNAL(executeFileScript(QString)),
2353  this , SLOT(slotExecuteFileScript(QString)));
2354 
2355  // Core to plugins ( normally only one scripting plugin)
2356  if ( checkSlot(plugin,"slotExecuteScript(QString)") )
2357  connect(this , SIGNAL(executeScript(QString)),
2358  plugin , SLOT(slotExecuteScript(QString)));
2359 
2360  // Core to plugins ( normally only one scripting plugin)
2361  if ( checkSlot(plugin,"slotExecuteFileScript(QString)") )
2362  connect(this , SIGNAL(executeFileScript(QString)),
2363  plugin , SLOT(slotExecuteFileScript(QString)));
2364 
2365  //========= Engine ==========
2366 
2367  // Plugins to Core
2368  if ( checkSignal(plugin,"getScriptingEngine(QScriptEngine*&)") )
2369  connect(plugin , SIGNAL(getScriptingEngine(QScriptEngine*&)),
2370  this , SLOT(slotGetScriptingEngine(QScriptEngine*&)));
2371 
2372  // Plugins to Core
2373  if ( checkSignal(plugin,"getAvailableFunctions(QStringList&)") )
2374  connect(plugin , SIGNAL(getAvailableFunctions(QStringList&)),
2375  this , SLOT(slotGetAllAvailableFunctions(QStringList&)));
2376 
2377  }
2378 
2379  //========================================================================================
2380 
2381  info.status = PluginInfo::LOADED;
2382  info.errors = errors;
2383  info.warnings = warnings;
2384 
2385  if (alreadyLoadedAt != -1) {
2386  plugins()[alreadyLoadedAt] = info;
2387  }
2388  else
2389  plugins().push_back(info);
2390 
2391  printPluginLoadLog(errors, warnings);
2392 
2393 
2394  // Initialize Plugin
2395  if ( basePlugin ) {
2396  if ( checkSlot(plugin,"initializePlugin()") )
2397  QMetaObject::invokeMethod(plugin, "initializePlugin", Qt::DirectConnection);
2398  }
2399 
2400 
2401  //Check if its a filePlugin
2402  FileInterface* filePlugin = qobject_cast< FileInterface * >(plugin);
2403  if ( filePlugin ){
2404  supported = supported + "File ";
2405 
2406  QStringList loadFilters = filePlugin->getLoadFilters().split(";;");
2407  QStringList saveFilters = filePlugin->getSaveFilters().split(";;");
2408 
2409  // Collect supported Data from file plugin
2410  for (int i = 0; i < loadFilters.size(); ++i) {
2411  fileTypes ft;
2412  ft.name = basePlugin->name();
2413  ft.type = filePlugin->supportedType();
2414  ft.loadFilters = loadFilters[i];
2415  ft.saveFilters = "";
2416  ft.plugin = filePlugin;
2417  ft.object = plugin;
2418  ft.saveMultipleObjects = checkSlot(plugin,"saveObjects(IdList,QString)");
2419 
2420  supportedTypes().push_back(ft);
2421  }
2422  for (int i = 0; i < saveFilters.size(); ++i) {
2423  fileTypes ft;
2424  ft.name = basePlugin->name();
2425  ft.type = filePlugin->supportedType();
2426  ft.loadFilters = "";
2427  ft.saveFilters = saveFilters[i];
2428  ft.plugin = filePlugin;
2429  ft.object = plugin;
2430  ft.saveMultipleObjects = checkSlot(plugin,"saveObjects(IdList,QString)");
2431 
2432  supportedTypes().push_back(ft);
2433  }
2434 
2435 
2436  if ( checkSignal(plugin,"openedFile(int)" ) )
2437  connect(plugin , SIGNAL( openedFile( int ) ) ,
2438  this , SLOT( slotFileOpened ( int ) ),Qt::DirectConnection);
2439  }
2440 
2441  //Check if it's a typePlugin
2442  TypeInterface* typePlugin = qobject_cast< TypeInterface * >(plugin);
2443  if ( typePlugin ){
2444  supported = supported + "Type ";
2445 
2446  // Call register type
2447  typePlugin->registerType();
2448 
2449  // Collect supported Data from type plugin
2450  dataTypes dt;
2451  dt.name = basePlugin->name();
2452  dt.type = typePlugin->supportedType();
2453  dt.plugin = typePlugin;
2454 
2455  // Add type info
2456  supportedDataTypes_.push_back(dt);
2457 
2458  // Connect signals ( But only if we not already connected in in the loadsave interface )
2459  if ( !LoadSavePlugin && checkSignal(plugin,"emptyObjectAdded(int)" ) )
2460  connect(plugin , SIGNAL( emptyObjectAdded( int ) ) ,
2461  this , SLOT( slotEmptyObjectAdded ( int ) ),Qt::DirectConnection);
2462  }
2463 
2464  MetadataInterface* metadataPlugin = qobject_cast< MetadataInterface * >(plugin);
2465  if ( metadataPlugin ) {
2466  if (checkSlot(plugin, "slotGenericMetadataDeserialized(QString,QString)")) {
2467  connect(this, SIGNAL(genericMetadataDeserialized(QString, QString)),
2468  plugin, SLOT(slotGenericMetadataDeserialized(QString, QString)));
2469  }
2470  if (checkSlot(plugin, "slotObjectMetadataDeserialized(QString,QString)")) {
2471  connect(this, SIGNAL(objectMetadataDeserialized(QString, QString)),
2472  plugin, SLOT(slotObjectMetadataDeserialized(QString, QString)));
2473  }
2474  if (checkSlot(plugin, "slotObjectMetadataDeserializedJson(QString,QJsonDocument)")) {
2475  connect(this, SIGNAL(objectMetadataDeserializedJson(QString, QJsonDocument)),
2476  plugin, SLOT(slotObjectMetadataDeserializedJson(QString, QJsonDocument)));
2477  }
2478  if (checkSignal(plugin, "metadataDeserialized(QVector<QPair<QString,QString> >)")) {
2479  connect(plugin, SIGNAL(metadataDeserialized(QVector<QPair<QString, QString> >)),
2480  this, SLOT(slotMetadataDeserialized(QVector<QPair<QString, QString> >)));
2481  }
2482  }
2483 
2484  //========================================================================================
2485 
2486 
2487 
2488 
2489 }
const QVector< QPair< QString, QString > > & pluginCommandLineOptions()
Get command line plugin settings as key-value pairs.
virtual QAction * optionsAction()
Return options menu.
Interface class for type definitions.
void loadPlugin(const QString &_filename, const bool _silent, QString &_licenseErrors, QObject *_plugin=0)
Function for loading Plugins.
QString description
Description of the plugin.
void loaderReady(QPluginLoader *loader)
Interface class for exporting functions to python.
Options Dialog interface.
void slotBlockPlugin(const QString &_rpcName)
Function for Blocking Plugins. Blocked plugins will unloaded and not loaded wthin the next starts...
Add a toolbox to OpenFlipper.
QString version
Version of the plugin.
Interface for all plugins which provide entries to the main menubar.
Interface class for receiving mouse events.
Plugins can add its own toolbox to the main widget&#39;s toolbox area by using this interface.
QString name
Name of the plugin ( requested from the plugin on load)
Definition: RendererInfo.hh:67
bool checkSignal(QObject *_plugin, const char *_signalSignature)
Check if a plugin has a signal.
virtual QString getLoadFilters()=0
void loadPlugins()
Load all plugins from default plugin directory and from INI-File.
QString warnings
Store warnings encountered during plugin loading.
Definition: PluginInfo.hh:146
Logtype
Log types for Message Window.
RenderInterface * plugin
Pointer to the loaded plugin (Already casted when loading it)
Definition: RendererInfo.hh:64
QString description
Description of the plugin ( requested from the plugin on load)
Definition: PluginInfo.hh:131
virtual bool initializeOptionsWidget(QWidget *&_widget)=0
Initialize the Options Widget.
Defines the order in which plugins have to be loaded.
QString description
Description of the plugin ( requested from the plugin on load)
Definition: RendererInfo.hh:73
QString name
Name of the plugin ( requested from the plugin on load)
Definition: PluginInfo.hh:128
ACG::SceneGraph::DrawModes::DrawMode modes
Supported DrawModes.
Definition: RendererInfo.hh:76
Predefined datatypes.
Definition: DataTypes.hh:83
Interface for all Plugins which do logging to the logging window of the framework.
void slotShowPlugins()
Show Plugins Dialog.
bool buildIn
Indicates, if the plugin is a built in Plugin (in Plugin directory)
Definition: PluginInfo.hh:176
QStringList rpcFunctions
List of exported rpc slots.
Definition: PluginInfo.hh:149
applicationStatus
Enum for the statusBar Status Icon.
Interface class for adding view modes to the ui.
QString name
Name of the plugin ( requested from the plugin on load)
PostProcessorInfo * newPostProcessor(QString _name)
Get a new post processor Instance.
virtual QAction * optionsAction()
Return options menu.
std::vector< int > IdList
Standard Type for id Lists used for scripting.
Definition: DataTypes.hh:181
virtual QString name()=0
Return a name for the plugin.
virtual QString version()
Return a version string for your plugin.
DLLEXPORT void registerTypes()
Definition: Types.cc:417
PreloadThread(PreloadAggregator *aggregator)
Preload thread constructor.
void printPluginLoadLog(const QString &errors, const QString &warnings)
Print all info collected about plugin during loading.
virtual DataType supportedDataTypes()=0
Get data type for information requests.
void slotUnBlockPlugin(const QString &_rpcName)
Function for UnBlocking Plugins. Plugins will not loaded automatically.
QWidget * optionsWidget
Pointer to plugins options widget (if available)
Definition: PluginInfo.hh:173
QString version
Version of the plugin.
Definition: PluginInfo.hh:134
QVariant value(const QString &key, const QVariant &defaultValue=QVariant()) const
void expectLoaders(int count)
Interface to add global image post processor functions from within plugins.
Interface to call functions across plugins.
Definition: RPCInterface.hh:61
RendererInfo * newRenderer(QString _name)
Get a new renderer Instance.
Definition: RendererInfo.cc:89
virtual QString description()=0
Return a description of what the plugin is doing.
Interface class for adding copy protection and license management to a plugin.
Interface for all plugins which want to use selection functions.
Update type class.
Definition: UpdateType.hh:59
Control OpenFlippers status bar.
void slotLoadPlugin()
Load Plugins from menu.
QString version
Version of the plugin ( requested from the plugin on load)
Definition: RendererInfo.hh:70
virtual DataType supportedType()=0
Return your supported object type( e.g. DATA_TRIANGLE_MESH )
virtual DataType supportedType()=0
Return your supported object type( e.g. DATA_TRIANGLE_MESH )
QPluginLoader * waitForNextLoader()
About Info interface.
Interface class for providing information on objects.
Keyboard Event Interface.
Definition: KeyInterface.hh:59
Interface class for Plugins which have to store information in ini files.
Definition: INIInterface.hh:60
Class for the handling of simple configuration files.
Definition: INIFile.hh:99
bool checkSlot(QObject *_plugin, const char *_slotSignature)
Check if a plugin has a slot.
QString errors
Store errors encountered during plugin loading.
Definition: PluginInfo.hh:143
QString path
Path to the plugin ( set on load )
Definition: PluginInfo.hh:137
Interface for all Plugins which provide scriptable Functions.
Enables implementers to react on deserialization of meta data.
void run()
preload function
QObject * plugin
Pointer to the loaded plugin (Already casted when loading it)
Definition: PluginInfo.hh:125
void setValue(const QString &key, const QVariant &value)
Wrapper function which makes it possible to enable Debugging output with -DOPENFLIPPER_SETTINGS_DEBUG...
Interface to add additional rendering functions from within plugins.
Allow to connect slots between plugins.
DLLEXPORT OpenFlipperQSettings & OpenFlipperSettings()
QSettings object containing all program settings of OpenFlipper.
Interface class for creating custom context menus.
Provide texture support for a plugin.
QAction * optionsAction
Possible action to add an options action or menu to the system.
Definition: RendererInfo.hh:79
Interface class for Thread handling.
virtual QString getSaveFilters()=0
PostProcessorInterface * plugin
Pointer to the loaded plugin (Already casted when loading it)
QAction * optionsAction
Possible action to add an options action or menu to the system.
Interface class from which all plugins have to be created.
Allow access to picking functions.
Interface class for backup handling.
Interface class for file handling.
QString rpcName
Clean rpc name of the plugin.
Definition: PluginInfo.hh:140
Interface for all plugins which want to Load or Save files and create Objects.