From e354b747f9b6d400daeaea98f8810630ad8ce72b Mon Sep 17 00:00:00 2001 From: Patric Stout Date: Sun, 21 Jan 2024 10:53:26 +0100 Subject: [PATCH] Add: initialize plugin when found --- src/openttd.cpp | 1 + src/social_integration.cpp | 63 ++++++++++++++++++++++++++++++++++++++ src/social_integration.h | 5 +++ 3 files changed, 69 insertions(+) diff --git a/src/openttd.cpp b/src/openttd.cpp index be2d05027a..79642f43b1 100644 --- a/src/openttd.cpp +++ b/src/openttd.cpp @@ -289,6 +289,7 @@ static void ShutdownGame() if (_network_available) NetworkShutDown(); // Shut down the network and close any open connections + SocialIntegration::Shutdown(); DriverFactoryBase::ShutdownDrivers(); UnInitWindowSystem(); diff --git a/src/social_integration.cpp b/src/social_integration.cpp index 4dd63a1e87..1fceeb82ab 100644 --- a/src/social_integration.cpp +++ b/src/social_integration.cpp @@ -20,6 +20,25 @@ #include "safeguards.h" +/** + * Container to track information per plugin. + */ +class InternalSocialIntegrationPlugin { +public: + InternalSocialIntegrationPlugin(const std::string &filename, const std::string &basepath) : library(filename) + { + openttd_info.openttd_version = _openttd_revision; + } + + OpenTTD_SocialIntegration_v1_PluginInfo plugin_info = {}; ///< Information supplied by plugin. + OpenTTD_SocialIntegration_v1_PluginApi plugin_api = {}; ///< API supplied by plugin. + OpenTTD_SocialIntegration_v1_OpenTTDInfo openttd_info = {}; ///< Information supplied by OpenTTD. + + LibraryLoader library; ///< Library handle. +}; + +static std::vector> _plugins; ///< List of loaded plugins. + /** Helper for scanning for files with SocialIntegration as extension */ class SocialIntegrationFileScanner : FileScanner { public: @@ -40,6 +59,45 @@ public: { std::string basepath = filename.substr(basepath_length); Debug(misc, 1, "[Social Integration: {}] Loading ...", basepath); + + auto &plugin = _plugins.emplace_back(std::make_unique(filename, basepath)); + + if (plugin->library.HasError()) { + Debug(misc, 0, "[Social Integration: {}] Failed to load library: {}", basepath, plugin->library.GetLastError()); + return false; + } + + OpenTTD_SocialIntegration_v1_GetInfo getinfo_func = plugin->library.GetFunction("SocialIntegration_v1_GetInfo"); + if (plugin->library.HasError()) { + Debug(misc, 0, "[Social Integration: {}] Failed to find symbol SocialPlugin_v1_GetInfo: {}", basepath, plugin->library.GetLastError()); + return false; + } + + OpenTTD_SocialIntegration_v1_Init init_func = plugin->library.GetFunction("SocialIntegration_v1_Init"); + if (plugin->library.HasError()) { + Debug(misc, 0, "[Social Integration: {}] Failed to find symbol SocialPlugin_v1_Init: {}", basepath, plugin->library.GetLastError()); + return false; + } + + getinfo_func(&plugin->plugin_info); + + auto state = init_func(&plugin->plugin_api, &plugin->openttd_info); + switch (state) { + case OTTD_SOCIAL_INTEGRATION_V1_INIT_SUCCESS: + Debug(misc, 1, "[Social Integration: {}] Loaded for {}: {} ({})", basepath, plugin->plugin_info.social_platform, plugin->plugin_info.name, plugin->plugin_info.version); + return true; + + case OTTD_SOCIAL_INTEGRATION_V1_INIT_FAILED: + Debug(misc, 0, "[Social Integration: {}] Failed to initialize", basepath); + return false; + + case OTTD_SOCIAL_INTEGRATION_V1_INIT_PLATFORM_NOT_RUNNING: + Debug(misc, 1, "[Social Integration: {}] Failed to initialize: {} is not running", basepath, plugin->plugin_info.social_platform); + return false; + + default: + NOT_REACHED(); + } } }; @@ -48,3 +106,8 @@ void SocialIntegration::Initialize() SocialIntegrationFileScanner fs; fs.Scan(); } + +void SocialIntegration::Shutdown() +{ + _plugins.clear(); +} diff --git a/src/social_integration.h b/src/social_integration.h index c03e90d56e..f8f7e9eb5c 100644 --- a/src/social_integration.h +++ b/src/social_integration.h @@ -16,6 +16,11 @@ public: * Initialize the social integration system, loading any social integration plugins that are available. */ static void Initialize(); + + /** + * Shutdown the social integration system, and all social integration plugins that are loaded. + */ + static void Shutdown(); }; #endif /* SOCIAL_INTEGRATION_H */