예제 #1
0
void PluginManager::loadPlugins()
{
    // Load static plugins
    const QObjectList &staticPluginInstances = QPluginLoader::staticInstances();
    for (QObject *instance : staticPluginInstances) {
        mPlugins.append(PluginFile(PluginStatic, instance));

        if (Plugin *plugin = qobject_cast<Plugin*>(instance))
            plugin->initialize();
        else
            addObject(instance);
    }

    // Determine the plugin path based on the application location
#ifndef TILED_PLUGIN_DIR
    QString pluginPath = QCoreApplication::applicationDirPath();
#endif

#if defined(Q_OS_WIN32)
    pluginPath += QLatin1String("/plugins/tiled");
#elif defined(Q_OS_MAC)
    pluginPath += QLatin1String("/../PlugIns");
#elif defined(TILED_PLUGIN_DIR)
    QString pluginPath = QLatin1String(TILED_PLUGIN_DIR);
#else
    pluginPath += QLatin1String("/../lib/tiled/plugins");
#endif

    // Load dynamic plugins
    QDirIterator iterator(pluginPath, QDir::Files | QDir::Readable);
    while (iterator.hasNext()) {
        const QString &pluginFile = iterator.next();
        if (!QLibrary::isLibrary(pluginFile))
            continue;

        QString fileName = QFileInfo(pluginFile).fileName();
        PluginState state = mPluginStates.value(fileName);

        auto *loader = new QPluginLoader(pluginFile, this);
        auto metaData = loader->metaData().value(QStringLiteral("MetaData")).toObject();
        bool defaultEnable = metaData.value(QStringLiteral("defaultEnable")).toBool();

        bool enable = state == PluginEnabled || (defaultEnable && state != PluginDisabled);

        QObject *instance = nullptr;

        if (enable) {
            instance = loader->instance();

            if (!instance)
                qWarning().noquote() << "Error:" << loader->errorString();
        }

        mPlugins.append(PluginFile(state, instance, loader, defaultEnable));

        if (!instance)
            continue;

        if (Plugin *plugin = qobject_cast<Plugin*>(instance))
            plugin->initialize();
        else
            addObject(instance);
    }
}
예제 #2
0
void CPlugins::CreatePlugins( void ) 
{
	if (m_Gfx == NULL)
	{
		m_GfxFile = g_Settings->LoadString(Game_Plugin_Gfx);
		CPath GfxPluginFile(m_PluginDir.c_str(),m_GfxFile.c_str());
		WriteTraceF(TraceGfxPlugin,__FUNCTION__ ": GFX Loading (%s): Starting",(LPCTSTR)GfxPluginFile);
		m_Gfx = new CGfxPlugin(GfxPluginFile);
		WriteTrace(TraceGfxPlugin,__FUNCTION__ ": GFX Loading Done");
		WriteTraceF(TraceGfxPlugin,__FUNCTION__ ": GFX Current Ver: %s",m_Gfx->PluginName().c_str());
		g_Settings->SaveString(Plugin_GFX_CurVer,m_Gfx->PluginName().c_str());
	}

	if (m_Audio == NULL)
	{
		m_AudioFile = g_Settings->LoadString(Game_Plugin_Audio);
		CPath PluginFile(m_PluginDir.c_str(),m_AudioFile.c_str());
		WriteTraceF(TraceDebug,__FUNCTION__ ": Loading Audio Plugin (%s): Starting",(LPCTSTR)PluginFile);
		m_Audio = new CAudioPlugin(PluginFile);
		WriteTrace(TraceDebug,__FUNCTION__ ": Loading Audio Plugin Done");
		g_Settings->SaveString(Plugin_AUDIO_CurVer,m_Audio->PluginName().c_str());
	}

	if (m_RSP == NULL)
	{
		m_RSPFile = g_Settings->LoadString(Game_Plugin_RSP);
		CPath RspPluginFile(m_PluginDir.c_str(),m_RSPFile.c_str());
		WriteTraceF(TraceRSP,__FUNCTION__ "(%s): RSP Loading",(LPCTSTR)RspPluginFile);
		m_RSP = new CRSP_Plugin(RspPluginFile);
		WriteTrace(TraceRSP,__FUNCTION__ ": RSP Loading Done");

		WriteTraceF(TraceRSP,__FUNCTION__ ": RSP Current Ver: %s",m_RSP->PluginName().c_str());
		g_Settings->SaveString(Plugin_RSP_CurVer,m_RSP->PluginName().c_str());

		//Enable debugger
		if (m_RSP->EnableDebugging)
		{
			WriteTrace(TraceRSP,__FUNCTION__ ": EnableDebugging starting");
			m_RSP->EnableDebugging(bHaveDebugger());
			WriteTrace(TraceRSP,__FUNCTION__ ": EnableDebugging done");
		}
	}

	if (m_Control == NULL)
	{
		m_ControlFile = g_Settings->LoadString(Game_Plugin_Controller);
		CPath PluginFile(m_PluginDir.c_str(),m_ControlFile.c_str());
		WriteTraceF(TraceDebug,__FUNCTION__ ": Loading (%s): Starting",(LPCTSTR)PluginFile);
		m_Control = new CControl_Plugin(PluginFile);
		WriteTrace(TraceDebug,__FUNCTION__ ": Loading Done");
		g_Settings->SaveString(Plugin_CONT_CurVer,m_Control->PluginName().c_str());
	}

/*	Reset(PLUGIN_TYPE_GFX);
	Reset(PLUGIN_TYPE_AUDIO);
	Reset(PLUGIN_TYPE_RSP);
	Reset(PLUGIN_TYPE_CONTROLLER);	*/

	if (bHaveDebugger())
	{
		g_Notify->RefreshMenu();
	}
}