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); } }
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(); } }