Ejemplo n.º 1
0
INotificator *PluginLoader::load(QString lib)
{
    QPluginLoader pluginLoader(lib); // linux_libnotifyPxNotifyPlugin

    QGenericPlugin* plugin = (QGenericPlugin*)pluginLoader.instance();
    if (!pluginLoader.isLoaded()) {
        qWarning() << "Plugin" << lib << "not loaded!" << pluginLoader.errorString();
        return nullptr;
    }

    if (!checkNames(plugin->objectName(), lib)) {
        qWarning() << "Loaded plugin have name" << plugin->objectName()
                   << ", but trying loaded" << lib
                   << ". Aborted! Plugin not loaded!";
        return nullptr;
    }

    INotificator* inotiticator = (INotificator*)plugin->create("", "");
    if (!inotiticator) {
        qWarning() << "Plugin" << lib << "cannot instance INotificator. Aborted! Plugin not loaded!";
        return nullptr;
    }

    qDebug() << "Plugin" << lib << "loaded!";

    return load(lib, inotiticator);
}
Ejemplo n.º 2
0
void ServiceHelperPrivate::loadPlugin()
{
    QString libPath = getenv("ACCOUNTS_UI_PLUGIN_DIR");
    if (!libPath.isEmpty()) {
        libPath = QDir::cleanPath(libPath) + QDir::separator();
    } else {
        libPath = "/usr/lib/AccountsUI/";
    }
    QString libName("lib%1plugin.so");

    //use the xml element plugin to get the plugin name
    QDomElement root = domDocument.documentElement();
    QDomElement pluginElement = root.firstChildElement("plugin");

    QString path;
    path = libPath + libName.arg(pluginElement.text());
    //fallback use id as a plugin name
    if (!QFile::exists(path)) {
        QString serviceId = root.attribute("id");
        path = libPath + libName.arg(serviceId);
    }

    QObject *plugin = 0;

    qDebug() << "Loading plugin " << path;
    QPluginLoader pluginLoader(path);
    if (QFile::exists(path)) {
        plugin = pluginLoader.instance();
    }

    this->plugin = qobject_cast<ServicePluginInterface *>(plugin);
}
Ejemplo n.º 3
0
void QtTrader::createGUI ()
{
  QMenuBar *menuBar = new QMenuBar();
  setMenuBar(menuBar);
  QMenu *menu = new QMenu("&Help");

  QAction* a = new QAction(QIcon(":icons/info"), tr("&About"), this);
  a->setIconVisibleInMenu(true);
  connect(a, SIGNAL(activated()), this, SLOT(about()));
  menu->addAction(a);
  menuBar->addMenu(menu);

  statusBar()->showMessage(tr("Ready"), 2000);

  QSettings settings(g_settings);
  settings.beginGroup("plugins");
  QStringList value = settings.value("gui").toStringList();
  settings.endGroup();

  QToolBar* toolbar = new QToolBar();
  for(int i = 0; i<value.size(); i++){
      toolbar->addAction(value.at(i), this, SLOT(pluginLoader()));
  }
  toolbar->show();
  toolbar->setObjectName("MainToolbar");

  addToolBar(toolbar);
  setUnifiedTitleAndToolBarOnMac(true);
}
Ejemplo n.º 4
0
int main(int argc, char *argv[])
{
   if(argc < 2)
   {   qDebug() << "Error! Pass in Plugin File Name!"; return -1;   }

   QApplication app(argc,argv);
   QString pluginFilePath = QString(argv[1]);
   QPluginPloader pluginLoader(pluginFilePath);

   return app.exec();
}
bool Slave::init(void)
{
    // Check on which hardware we are running based on the info in /proc/cpuinfo.
    // Defaulting to Generic X86
    QString hardwarePlugin("plugins/GenericX86/libgeneric_x86.so");
    QFile cpuinfo("/proc/cpuinfo");
    if (cpuinfo.open(QIODevice::ReadOnly | QIODevice::Text)) {
        qDebug() << "Reading cpuinfo";
        QByteArray content = cpuinfo.readAll();

        // Check for Gumstix Overo
        if (content.contains("Gumstix Overo")) {
            qDebug() << "Detected Gumstix Overo";
            hardwarePlugin = "plugins/GumstixOvero/libgumstix_overo.so";
        }

        cpuinfo.close();
    }


    qDebug() << "Loading hardware plugin:" << hardwarePlugin;
    // FIXME: add proper application specific plugin installation prefix.
    // For now we just seach so that the plugins in source code directories work.
    // FIXME: these doesn't affect pluginLoader?
    this->addLibraryPath("./plugins/GenericX86");
    this->addLibraryPath("./plugins/GumstixOvero");

    QPluginLoader pluginLoader(hardwarePlugin);
    QObject *plugin = pluginLoader.instance();

    if (plugin) {
        hardware = qobject_cast<Hardware*>(plugin);
        if (!hardware) {
            qCritical("Failed cast Hardware");
        }
    } else {
        qCritical("Failed to load plugin: %s", pluginLoader.errorString().toUtf8().data());
        qCritical("Search path: %s", this->libraryPaths().join(",").toUtf8().data());
    }

    // FIXME: get serial device path from hardware plugin?
    cb = new ControlBoard("/dev/ttyUSB0");
    if (!cb->init()) {
        qCritical("Failed to initialize ControlBoard");
        // CHECKME: to return false or not to return false (and do clean up)?
    } else {
        // Set ControlBoard frequency to 50Hz to match standard servos
        cb->setPWMFreq(50);
    }

    return true;
}
//---------------------------------------------------------------------
// PosSettingsPluginsLoader::loadPlugins
// 
//---------------------------------------------------------------------
QList<PosSettingsAdvInterface*> PosSettingsPluginsLoader::loadPlugins()
    {
    qDebug() << "+ PosSettingsPluginsLoader::loadPlugins()";
    // parse the default cen rep key value which is used to determine
    // the order of loading the default positioning settings plugins
    ParseCenRepKey();
    // List containing the plugins implementing the PositioningSettingsAdvancedInterface
    QList<PosSettingsAdvInterface*> pluginsList;
    // Check for the files under the positioningsettings directory
    QDir pluginsDir(PLUGIN_PATH + QDir::separator());
    QFileInfoList fileInfoList = pluginsDir.entryInfoList();
    // check each file in this directory,only if its a dll give it to the
    // plugin loader
    foreach ( const QFileInfo &fileInfo, fileInfoList )
            {
            QString fileName = fileInfo.absoluteFilePath();
						qDebug() << "Filename: " <<  fileName;
						
            if (!QLibrary::isLibrary(fileName))
                {
                continue;
                }
            // load the dlls using QPluginLoader
            QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(fileName));
            qDebug() << "Plugin Filename: " <<  pluginsDir.absoluteFilePath(fileName);
            QObject *plugin = pluginLoader.instance();
            // Check if the plugin found is an implementation of the
            // PosSettingsAdvInterface,if yes add it to the plugins list

            if (plugin)
                {
                PosSettingsAdvInterface* advancedInterface = qobject_cast<
                        PosSettingsAdvInterface *> (plugin);

                if (advancedInterface)
                    {
                    
                    QString dllName = fileInfo.baseName();
                    // check the position into which the plugin needs to be
                    // inserted if it is one of the default plugins
                    for (int i = 0; i < mDllNameList.count(); i++)
                        {
                        if (dllName.compare(mDllNameList[i],Qt::CaseInsensitive) == KErrNone)
                            {
                            pluginsList.insert(i, advancedInterface);
                            break;
                            }
                        }
                    }
                }
            }
Ejemplo n.º 7
0
	void ActionFactory::loadActionPack(const QString &filename, const QString &locale)
	{
		QPluginLoader pluginLoader(filename);
		QObject *actionPackObject = pluginLoader.instance();
		QString shortFilename = QFileInfo(filename).baseName();

		if(!actionPackObject)
		{
			emit actionPackLoadError(tr("%1: \"%2\"").arg(shortFilename).arg(pluginLoader.errorString()));
			return;
		}

		ActionPack *actionPack = qobject_cast<ActionPack *>(actionPackObject);
		if(!actionPack)
		{
            emit actionPackLoadError(tr("%1: invalid definition version").arg(shortFilename));
			return;
		}

        Tools::installTranslator(QString("actionpack%1").arg(actionPack->id()), locale);

		actionPack->createDefinitions();

        for(ActionDefinition *definition: actionPack->actionsDefinitions())
		{
			if(actionDefinition(definition->id()))
			{
				emit actionPackLoadError(tr("%1: <b>%2</b> already loaded").arg(shortFilename).arg(definition->id()));
				continue;
			}

			if(definition->worksUnderThisOS())
			{
				QStringList missingFeatures;
				if(!definition->requirementCheck(missingFeatures))
				{
					emit actionPackLoadError(tr("%1: <b>%2</b> cannot be loaded:<ul><li>%3</ul>")
									   .arg(shortFilename)
									   .arg(definition->id())
									   .arg(missingFeatures.join("<li>")));
					continue;
				}
			}

			mActionDefinitions << definition;
		}

		actionPack->setFilename(filename);

		mActionPacks << actionPack;
	}
Ejemplo n.º 8
0
void g19daemon::loadPlugins()
{
	PluginInterface *pluginint;
	QDir pluginsDir(qApp->applicationDirPath());
	QString name;
	
	name = settings->value("ActivePlugin").toString();
	pluginsDir.cd(PLUGINS_DIR);
	QDirIterator iterator(pluginsDir.absolutePath(), QStringList() << "*.so", QDir::Files, QDirIterator::NoIteratorFlags);

	while (iterator.hasNext())
	{
		iterator.next();
		QString filename = iterator.fileName();
		
		QPluginLoader pluginLoader(iterator.filePath());
		pluginLoader.setLoadHints(QLibrary::ResolveAllSymbolsHint);
		QObject *plugin = pluginLoader.instance();
		
		if (plugin)
		{
			pluginint = qobject_cast<PluginInterface *>(plugin);
			
			if (pluginint)
			{
				QObject *signalsource = pluginint->getQObject();
				connect(signalsource, SIGNAL(doAction(gAction, void *)), this, SLOT(doAction(gAction, void *)));

				if (pluginint->isPopup())
				{
					PopupPlugins.append(pluginint);
				}
				else
				{
					plugins.append(pluginint);

					if (pluginint->getName().compare(name) == 0)
					{
						activePlugin = plugins.indexOf(pluginint);
					}
				}
			}
		}
		else
		{
			QErrorMessage err(this);
			err.showMessage(pluginLoader.errorString());
			qDebug() << "\tError: " << pluginLoader.errorString();
		}
	}
Ejemplo n.º 9
0
static KonqViewFactory tryLoadingService(KService::Ptr service)
{
    KPluginLoader pluginLoader(*service);
    pluginLoader.setLoadHints(QLibrary::ExportExternalSymbolsHint); // #110947
    KPluginFactory* factory = pluginLoader.factory();
    if (!factory) {
        KMessageBox::error(0,
                           i18n("There was an error loading the module %1.\nThe diagnostics is:\n%2",
                                service->name(), pluginLoader.errorString()));
        return KonqViewFactory();
    }
    else {
        return KonqViewFactory(service->library(), factory);
    }
}
Ejemplo n.º 10
0
void TCPServer::loadDriver()
{
    QPluginLoader pluginLoader("libposjs.so");
    pluginLoader.load();
    QObject *plugin = pluginLoader.instance();

    posdriver = qobject_cast<POSDriverInterface*>(plugin);

    if(posdriver)
    {
        qDebug() << "libposjs OK...!!!";
    }
    else
    {
        qDebug() << "libposjs not found...!!!";
    }
}
Ejemplo n.º 11
0
/** Load a plugin by its location on the hard drive. */
bool PluginManager::loadPlugin(const QString &pluginAbsPath)
{
	QPluginLoader pluginLoader(pluginAbsPath, this);
	QObject *plugin = pluginLoader.instance();
	if (plugin) {
		BasicPlugin *basic = dynamic_cast<BasicPlugin*>(plugin);
		basic->setParent(this);
		SettingsPrivate *settings = SettingsPrivate::instance();
		if (basic) {
			PluginInfo pluginInfo;
			pluginInfo.setAbsFilePath(pluginAbsPath);
			pluginInfo.setPluginName(basic->name());
			pluginInfo.setVersion(basic->version());
			pluginInfo.setConfigPage(basic->isConfigurable());
			pluginInfo.setEnabled(true);

			settings->addPlugin(pluginInfo);
			if (basic->isConfigurable()) {
				QString pluginLang(":/translations/" + basic->name() + "_" + settings->language());
				if (basic->translator.load(pluginLang)) {
					QApplication::installTranslator(&basic->translator);
				}
			}

			// Keep references of loaded plugins, to be able to unload them later
			_loadedPlugins.insert(pluginAbsPath, basic);
		} else {
			return false;
		}

		basic->init();
		if (MediaPlayerPlugin *mediaPlayerPlugin = qobject_cast<MediaPlayerPlugin*>(plugin)) {
			this->loadMediaPlayerPlugin(mediaPlayerPlugin);
		} else if (ItemViewPlugin *itemViewPlugin = qobject_cast<ItemViewPlugin*>(plugin)) {
			this->loadItemViewPlugin(itemViewPlugin);
		} else if (RemoteMediaPlayerPlugin *remoteMediaPlayerPlugin = qobject_cast<RemoteMediaPlayerPlugin*>(plugin)) {
			this->loadRemoteMediaPlayerPlugin(remoteMediaPlayerPlugin);
		} else if (TagEditorPlugin *tagEditorPlugin = qobject_cast<TagEditorPlugin*>(plugin)) {
			this->loadTagEditorPlugin(tagEditorPlugin);
		}
	}
	return plugin != nullptr;
}
Ejemplo n.º 12
0
bool FactoryPrivate::createBackend()
{
    Q_ASSERT(m_backendObject == 0);
#ifndef QT_NO_PHONON_PLATFORMPLUGIN
    PlatformPlugin *f = globalFactory->platformPlugin();
    if (f) {
        m_backendObject = f->createBackend();
    }
#endif //QT_NO_PHONON_PLATFORMPLUGIN
    if (!m_backendObject) {
        ensureLibraryPathSet();

        // could not load a backend through the platform plugin. Falling back to the default
        // (finding the first loadable backend).
        const QLatin1String suffix("/phonon_backend/");
        foreach (QString libPath, QCoreApplication::libraryPaths()) {
            libPath += suffix;
            const QDir dir(libPath);
            if (!dir.exists()) {
                pDebug() << Q_FUNC_INFO << dir.absolutePath() << "does not exist";
                continue;
            }
            foreach (const QString &pluginName, dir.entryList(QDir::Files)) {
                QPluginLoader pluginLoader(libPath + pluginName);
                if (!pluginLoader.load()) {
                    pDebug() << Q_FUNC_INFO << "  load failed:"
                             << pluginLoader.errorString();
                    continue;
                }
                pDebug() << pluginLoader.instance();
                m_backendObject = pluginLoader.instance();
                if (m_backendObject) {
                    break;
                }

                // no backend found, don't leave an unused plugin in memory
                pluginLoader.unload();
            }

            if (m_backendObject) {
                break;
            }
        }
Ejemplo n.º 13
0
/**
 * @param filename File where to load plugin from
 * 
 */
void PluginManager::loadPlugin(const QString & filename) {
	QPluginLoader pluginLoader(filename);
	QObject * plugin = pluginLoader.instance();
	if (plugin == 0) {
		// FIXME - inform about invalid plugin format
		return;
	}
	DictionaryShelfPluginInterface * shelf = 
		qobject_cast<DictionaryShelfPluginInterface *>(plugin);
	if (shelf == 0) {
		// FIXME - inform about invalid plugin interface
		return;
	}
	
	// everythings seems fine, let's add the dictionaries to the 
	// local list
	DictionaryList dicts = shelf->getDictionaries();
	DictionaryList::iterator e = dicts.end();
	for (DictionaryList::iterator i = dicts.begin(); i != e; ++i) {
		addDictionary(*i);
	}
}
Ejemplo n.º 14
0
  bool PluginLoader::findPlugin(const QDir& pluginsDir)
  {
    bool foundFlag = false;
    for (const QString& fileName : pluginsDir.entryList({PLUGIN_PREFIX + QLatin1String("*")}, QDir::Files))
    {
      QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(fileName));
      IPlugin *iplugin = qobject_cast<IPlugin *>(pluginLoader.instance());

      if (iplugin)
      {
        foundFlag = true;
        qDebug() << "Loading the plugin:" << iplugin->name();
        m_pluginMap.insert(iplugin->name(), iplugin);
        m_availablePlugins.insert(iplugin->name());
      }
      else
      {
        qWarning() << pluginLoader.errorString();
        qWarning() << "Cannot load the plugin " << fileName;
      }
    }
    
    return foundFlag;
  }
PlatformPlugin *FactoryPrivate::platformPlugin()
{
    if (m_platformPlugin) {
        return m_platformPlugin;
    }
    if (m_noPlatformPlugin) {
        return 0;
    }
#ifndef QT_NO_DBUS
    if (!QCoreApplication::instance() || QCoreApplication::applicationName().isEmpty()) {
        pWarning() << "Phonon needs QCoreApplication::applicationName to be set to export audio output names through the DBUS interface";
    }
#endif
    Q_ASSERT(QCoreApplication::instance());
    const QByteArray platform_plugin_env = qgetenv("PHONON_PLATFORMPLUGIN");
    if (!platform_plugin_env.isEmpty()) {
        QPluginLoader pluginLoader(QString::fromLocal8Bit(platform_plugin_env.constData()));
        if (pluginLoader.load()) {
            m_platformPlugin = qobject_cast<PlatformPlugin *>(pluginLoader.instance());
            if (m_platformPlugin) {
                return m_platformPlugin;
            }
        }
    }
    const QString suffix(QLatin1String("/phonon_platform/"));
    ensureLibraryPathSet();
    QDir dir;
    dir.setNameFilters(
            !qgetenv("KDE_FULL_SESSION").isEmpty() ? QStringList(QLatin1String("kde.*")) :
            (!qgetenv("GNOME_DESKTOP_SESSION_ID").isEmpty() ? QStringList(QLatin1String("gnome.*")) :
             QStringList())
            );
    dir.setFilter(QDir::Files);
    const QStringList libPaths = QCoreApplication::libraryPaths();
    forever {
        for (int i = 0; i < libPaths.count(); ++i) {
            const QString libPath = libPaths.at(i) + suffix;
            dir.setPath(libPath);
            if (!dir.exists()) {
                continue;
            }
            const QStringList files = dir.entryList(QDir::Files);
            for (int i = 0; i < files.count(); ++i) {
                QPluginLoader pluginLoader(libPath + files.at(i));
                if (!pluginLoader.load()) {
                    pDebug() << Q_FUNC_INFO << "  platform plugin load failed:"
                        << pluginLoader.errorString();
                    continue;
                }
                pDebug() << pluginLoader.instance();
                QObject *qobj = pluginLoader.instance();
                m_platformPlugin = qobject_cast<PlatformPlugin *>(qobj);
                pDebug() << m_platformPlugin;
                if (m_platformPlugin) {
                    connect(qobj, SIGNAL(objectDescriptionChanged(ObjectDescriptionType)),
                            SLOT(objectDescriptionChanged(ObjectDescriptionType)));
                    return m_platformPlugin;
                } else {
                    delete qobj;
                    pDebug() << Q_FUNC_INFO << dir.absolutePath() << "exists but the platform plugin was not loadable:" << pluginLoader.errorString();
                    pluginLoader.unload();
                }
            }
        }
        if (dir.nameFilters().isEmpty()) {
            break;
        }
        dir.setNameFilters(QStringList());
    }
    pDebug() << Q_FUNC_INFO << "platform plugin could not be loaded";
    m_noPlatformPlugin = true;
    return 0;
}
bool FactoryPrivate::createBackend()
{
#ifndef QT_NO_LIBRARY
    Q_ASSERT(m_backendObject == 0);
#ifndef QT_NO_PHONON_PLATFORMPLUGIN
    PlatformPlugin *f = globalFactory->platformPlugin();
    if (f) {
        m_backendObject = f->createBackend();
    }
#endif //QT_NO_PHONON_PLATFORMPLUGIN
    if (!m_backendObject) {
        ensureLibraryPathSet();

        // could not load a backend through the platform plugin. Falling back to the default
        // (finding the first loadable backend).
        const QLatin1String suffix("/phonon_backend/");
        const QStringList paths = QCoreApplication::libraryPaths();
        for (int i = 0; i < paths.count(); ++i) {
            const QString libPath = paths.at(i) + suffix;
            const QDir dir(libPath);
            if (!dir.exists()) {
                pDebug() << Q_FUNC_INFO << dir.absolutePath() << "does not exist";
                continue;
            }

            QStringList plugins(dir.entryList(QDir::Files));

#ifdef Q_OS_SYMBIAN
            /* On Symbian OS we might have two plugins, one which uses Symbian
             * MMF framework("mmf"), and one which uses Real Networks's
             * Helix("hxphonon"). We prefer the latter because it's more
             * sophisticated, so we make sure the Helix backend is attempted
             * to be loaded first, and the MMF backend is used for backup. */
            {
                const int helix = plugins.indexOf(QLatin1String("hxphonon"));
                if (helix != -1)
                    plugins.move(helix, 0);
            }
#endif

            const QStringList files = dir.entryList(QDir::Files);
            for (int i = 0; i < files.count(); ++i) {
                QPluginLoader pluginLoader(libPath + files.at(i));
                if (!pluginLoader.load()) {
                    pDebug() << Q_FUNC_INFO << "  load failed:"
                             << pluginLoader.errorString();
                    continue;
                }
                pDebug() << pluginLoader.instance();
                m_backendObject = pluginLoader.instance();
                if (m_backendObject) {
                    break;
                }

                // no backend found, don't leave an unused plugin in memory
                pluginLoader.unload();
            }

            if (m_backendObject) {
                break;
            }
        }
        if (!m_backendObject) {
            pWarning() << Q_FUNC_INFO << "phonon backend plugin could not be loaded";
            return false;
        }
    }

    connect(m_backendObject, SIGNAL(objectDescriptionChanged(ObjectDescriptionType)),
            SLOT(objectDescriptionChanged(ObjectDescriptionType)));

    return true;
#else //QT_NO_LIBRARY
    pWarning() << Q_FUNC_INFO << "Trying to use Phonon with QT_NO_LIBRARY defined. "
                                 "That is currently not supported";
    return false;
#endif
}
//FIXME: keep loaded plugins in own plugin manager and
//unload plugins to let load new version without
//the need to restart the application
void RackWindow::loadPlugin(QWidget *pluginHost)
{
    QDir pluginsDir(qApp->applicationDirPath());
#if defined(Q_OS_WIN)
    if (pluginsDir.dirName().toLower() == "debug" || pluginsDir.dirName().toLower() == "release")
        pluginsDir.cdUp();
#elif defined(Q_OS_MAC)
    if (pluginsDir.dirName() == "MacOS") {
        pluginsDir.cdUp();
        pluginsDir.cdUp();
        pluginsDir.cdUp();
    }
#endif

    if (!pluginsDir.cd("plugins"))
    {
        QMessageBox::information(this, "Error", "No plugin folder found");
        return;
    }


    QStringList pluginList = pluginsDir.entryList(QDir::Files);


    RSelectPluginDialog pluginDialog(this);
    pluginDialog.pluginListWidget->addItems(pluginList);
    pluginDialog.pluginListWidget->setCurrentRow(0);
    if (pluginDialog.exec())
    {



//    bool ok;
//    int newPluginIndex = RSelectPluginDialog::getIndex(this, pluginList, &ok);
//    if (ok) {

        //QString fileName = pluginsDir.entryList(QDir::Files).at(newPluginIndex);

        QString fileName = pluginsDir.entryList(QDir::Files).at(pluginDialog.pluginListWidget->currentRow());

        QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(fileName));
        QObject *plugin = pluginLoader.instance();


        ///test

//        QList<QPluginLoader *> loadedPlugins = findChildren<QPluginLoader *>();

//        QObject *plugin = 0;

//        for (int i = 0; i < loadedPlugins.size(); ++i) {
//            if (loadedPlugins.at(i)->fileName() == pluginsDir.absoluteFilePath(fileName)) {
//                plugin = loadedPlugins.at(i)->instance();
//                break;
//            }
//        }

//        if (!plugin) {
//            QPluginLoader *pluginLoader = new QPluginLoader(pluginsDir.absoluteFilePath(fileName), this);
//            plugin = pluginLoader->instance();
//        }


        //debug code
        qDebug() << "we have the following plugins loaded:";
        QList<QPluginLoader *> debugPlugins = findChildren<QPluginLoader *>();
        for (int i = 0; i < debugPlugins.size(); ++i) {
            qDebug() << debugPlugins.at(i)->fileName();
        }


        //////////


//        m_pluginLoader = new QPluginLoader(pluginsDir.absoluteFilePath(fileName), this);
//        QObject *plugin = m_pluginLoader->instance();

        /////////////////


        if (plugin)
        {
            IWidgetPlugin *widgetPlugin = qobject_cast<IWidgetPlugin *>(plugin);
            if (widgetPlugin)
            {
                QWidget *newWidget = widgetPlugin->createRWidget(m_coreImpl, this);

                //get pointers from pluginhost:
                QStackedWidget *pluginStack = pluginHost->findChild<QStackedWidget *>("rackPluginStack");
                QToolBar *pluginHostToolBar = pluginHost->findChild<QToolBar *>("rackPluginHostToolBar");
                QToolBar *pluginToolBar = pluginHost->property("pluginToolBar").value<QToolBar *>();
                QSignalMapper *sm = pluginHost->findChild<QSignalMapper *>("rackPluginSwitchMapper");
                QActionGroup *ag = pluginHostToolBar->findChild<QActionGroup *>();

                //add plugin widget to the widget stack:
                pluginStack->setCurrentIndex(pluginStack->addWidget(newWidget));

                //create action for the toolbars:
                QAction *act = new QAction(widgetPlugin->name(), ag);
                act->setCheckable(true);
                act->setChecked(true);
                //qt bugfix: set transparent dummy icon to move button text down or right
                act->setIcon(QIcon(":/images/transparent-icon.png"));

                //create button for pluginhost toolbar:
                QToolButton *tb = new QToolButton;
                tb->setObjectName(QLatin1String(newWidget->metaObject()->className()) + "ToolButton");
                tb->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
                tb->setFocusPolicy(Qt::NoFocus);
                tb->setDefaultAction(act);
                RPushButton *settingsButton = new RPushButton;
                settingsButton->setObjectName("rackPluginHostToolBarSettingsButton");
                RPushButton *deleteButton = new RPushButton;
                deleteButton->setObjectName("rackPluginHostToolBarDeleteButton");
                QHBoxLayout *hl = new QHBoxLayout(tb);
                hl->setSpacing(0);
                hl->setContentsMargins(0,0,1,0);
                hl->addStretch();
                hl->addWidget(settingsButton);
                hl->addWidget(deleteButton);
                pluginHostToolBar->addWidget(tb);

                //create button for plugin toolbar:
                QToolButton *tb1 = new QToolButton;
                tb1->setObjectName(QLatin1String(newWidget->metaObject()->className()) + "ToolButton");
                tb1->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
                tb1->setFocusPolicy(Qt::NoFocus);
                tb1->setDefaultAction(act);
                pluginToolBar->addWidget(tb1);

                //connect action trigger to PluginSwitchMapper;
                QObject::connect(act, SIGNAL(triggered()), sm, SLOT(map()));
                sm->setMapping(act, newWidget);

                //connect delete signal
                //remove act from actiongroup and delete it:
                QObject::connect(deleteButton, SIGNAL(clicked()), m_mapperClosePlugin, SLOT(map()));
                m_mapperClosePlugin->setMapping(deleteButton, act);
                QObject::connect(deleteButton, SIGNAL(clicked()), newWidget, SLOT(deleteLater()));
                QObject::connect(deleteButton, SIGNAL(clicked()), tb1, SLOT(deleteLater()));
                QObject::connect(deleteButton, SIGNAL(clicked()), tb, SLOT(deleteLater()));

                //connect settings signal
                //if (plugin has settings) ...
                //QObject::connect(settingsButton, SIGNAL(clicked()),

            }
        }
        else
        {
            QMessageBox::information(this, "Error", "Could not load the plugin");
            qDebug() << pluginLoader.errorString();

        }
    }
}
Ejemplo n.º 18
0
void
DrishtiImport::registerPlugins()
{
  m_pluginFileTypes.clear();
  m_pluginFileDLib.clear();
  m_pluginDirTypes.clear();
  m_pluginDirDLib.clear();

  QString plugindir = qApp->applicationDirPath() + QDir::separator() + "importplugins";
  QStringList filters;

#if defined(Q_OS_WIN32)
  filters << "*.dll";
#endif
#ifdef Q_OS_MACX
  // look in drishti.app/importplugins
  QString sep = QDir::separator();
  plugindir = qApp->applicationDirPath()+sep+".."+sep+".."+sep+"importplugins";
  filters << "*.dylib";
#endif
#if defined(Q_OS_LINUX)
  filters << "*.so";
#endif

  QDir dir(plugindir);
  dir.setFilter(QDir::Files);

  dir.setNameFilters(filters);
  QFileInfoList list = dir.entryInfoList();

  if (list.size() == 0)
    {
      QMessageBox::information(0, "Error", QString("No plugins found in %1").arg(plugindir));
      close();
    }

  for (int i=0; i<list.size(); i++)
    {
      QString pluginflnm = list.at(i).absoluteFilePath();

      QPluginLoader pluginLoader(pluginflnm);
      QObject *plugin = pluginLoader.instance();
      if (plugin)
	{
	  VolInterface *vi = qobject_cast<VolInterface *>(plugin);
	  if (vi)
	    {
	      QStringList rs = vi->registerPlugin();

	      int idx = rs.indexOf("file");
	      if (idx == -1) idx = rs.indexOf("files");
	      if (idx >= 0)
		{
		  if (rs.size() >= idx+1)
		    {
		      m_pluginFileTypes << rs[idx+1];
		      m_pluginFileDLib << pluginflnm;
		    }
		  else
		    QMessageBox::information(0, "Error",
		      QString("Received illegal files register string [%1] for plugin [%2]").\
					     arg(rs.join(" ")).arg(pluginflnm));

		}

	      idx = rs.indexOf("dir");
	      if (idx == -1) idx = rs.indexOf("directory");
	      if (idx >= 0)
		{
		  QPair<QString, QStringList> ft;
		  if (rs.size() >= idx+1)
		    {
		      m_pluginDirTypes << rs[idx+1];
		      m_pluginDirDLib << pluginflnm;
		    }
		  else
		    QMessageBox::information(0, "Error",
		    QString("Received illegal directory register string [%1] for plugin [%2]").\
					     arg(rs.join(" ")).arg(pluginflnm));

		}
	    }
	}
      else
	{
	  QMessageBox::information(0, "Error", QString("Cannot load %1").arg(pluginflnm));
	}
    }

  QMenu *loadDirMenu;
  QMenu *loadFileMenu;

  if (m_pluginDirTypes.size() > 0)
    loadDirMenu = ui.menuLoad->addMenu("Directory");

  if (m_pluginFileTypes.size() > 0)
    loadFileMenu = ui.menuLoad->addMenu("Files");
  
  for (int i=0; i<m_pluginDirTypes.size(); i++)
    {
      QAction *action = new QAction(this);
      action->setText(m_pluginDirTypes[i]);
      action->setData(m_pluginDirTypes[i]);
      action->setVisible(true);      
      connect(action, SIGNAL(triggered()),
	      this, SLOT(loadDirectory()));
      loadDirMenu->addAction(action);
    }

  for (int i=0; i<m_pluginFileTypes.size(); i++)
    {
      QAction *action = new QAction(this);
      action->setText(m_pluginFileTypes[i]);
      action->setData(m_pluginFileTypes[i]);
      action->setVisible(true);      
      connect(action, SIGNAL(triggered()),
	      this, SLOT(loadFiles()));
      loadFileMenu->addAction(action);
    }
}