struct plugin_handle* plugin_load(const char* filename, const char* config, struct hub_info* hub) { plugin_register_f register_f; plugin_unregister_f unregister_f; int ret; struct plugin_handle* handle = (struct plugin_handle*) hub_malloc_zero(sizeof(struct plugin_handle)); struct uhub_plugin* plugin = plugin_open(filename); struct plugin_hub_internals* internals = (struct plugin_hub_internals*) plugin->internals; if (!plugin) return NULL; if (!handle) { plugin_close(plugin); return NULL; } handle->handle = plugin; register_f = plugin_lookup_symbol(plugin, "plugin_register"); unregister_f = plugin_lookup_symbol(plugin, "plugin_unregister"); // register hub internals internals->unregister = unregister_f; internals->hub = hub; internals->callback_data = plugin_callback_data_create(); // setup callback functions, where the plugin can contact the hub. plugin_register_callback_functions(handle); if (register_f && unregister_f) { ret = register_f(handle, config); if (ret == 0) { if (handle->plugin_api_version == PLUGIN_API_VERSION && handle->plugin_funcs_size == sizeof(struct plugin_funcs)) { LOG_INFO("Loaded plugin: %s: %s, version %s.", filename, handle->name, handle->version); LOG_PLUGIN("Plugin API version: %d (func table size: " PRINTF_SIZE_T ")", handle->plugin_api_version, handle->plugin_funcs_size); return handle; } else { LOG_ERROR("Unable to load plugin: %s - API version mistmatch", filename); } } else { LOG_ERROR("Unable to load plugin: %s - Failed to initialize: %s", filename, handle->error_msg); } } plugin_close(plugin); hub_free(handle); return NULL; }
struct plugin_handle* plugin_load(const char* filename, const char* config) { plugin_register_f register_f; plugin_unregister_f unregister_f; int ret; struct plugin_handle* handle = hub_malloc_zero(sizeof(struct plugin_handle)); struct uhub_plugin* plugin = plugin_open(filename); if (!plugin) return NULL; if (!handle) { plugin_close(plugin); return NULL; } handle->handle = plugin; register_f = plugin_lookup_symbol(plugin, "plugin_register"); unregister_f = plugin_lookup_symbol(plugin, "plugin_unregister"); if (register_f && unregister_f) { ret = register_f(handle, config); if (ret == 0) { if (handle->plugin_api_version == PLUGIN_API_VERSION && handle->plugin_funcs_size == sizeof(struct plugin_funcs)) { LOG_INFO("Loaded plugin: %s: %s, version %s.", filename, handle->name, handle->version); LOG_TRACE("Plugin API version: %d (func table size: " PRINTF_SIZE_T ")", handle->plugin_api_version, handle->plugin_funcs_size); plugin->unregister = unregister_f; return handle; } else { LOG_ERROR("Unable to load plugin: %s - API version mistmatch", filename); } } else { LOG_ERROR("Unable to load plugin: %s - Failed to initialize: %s", filename, handle->error_msg); } } plugin_close(plugin); hub_free(handle); return NULL; }
static void plugin_action_cb (GtkAction *action, GigglePlugin *plugin) { char *callback_name; GigglePluginCallback callback; const GSignalInvocationHint *hint; hint = g_signal_get_invocation_hint (action); g_signal_handlers_disconnect_by_func (action, plugin_action_cb, plugin); callback_name = plugin_get_callback_name (gtk_action_get_name (action), g_signal_name (hint->signal_id)); callback = plugin_lookup_symbol (plugin, callback_name); if (callback) { g_signal_connect (action, g_signal_name (hint->signal_id), G_CALLBACK (callback), plugin); callback (action, plugin); } g_free (callback_name); }
static void plugin_action_cb (GtkAction *action, GigglePlugin *plugin) { char *callback_name; GigglePluginCallback callback; const GSignalInvocationHint *hint; g_signal_handlers_disconnect_by_func (action, plugin_action_cb, plugin); hint = g_signal_get_invocation_hint (action); callback_name = plugin_get_callback_name (gtk_action_get_name (action), g_signal_name (hint->signal_id)); callback = plugin_lookup_symbol (plugin, callback_name); if (callback) { g_signal_connect (action, g_signal_name (hint->signal_id), G_CALLBACK (callback), plugin); callback (action, plugin); } else if (!strcmp (g_signal_name (hint->signal_id), "activate")) { g_warning ("%s: Cannot find %s()", G_STRFUNC, callback_name); } g_free (callback_name); }