grim/gplugin-purple2-loader

fd4ebce81b79
Just checking in my working copy, it's been a long time since i've looked at this
#include "gplugin-purple2-loader.h"
#include "gplugin-purple2-core.h"
#include "gplugin-purple2-plugin.h"
#include "gplugin-purple2-purple3.h"
#include "purple2/gplugin-purple2-stubs-purple.h"
G_DEFINE_DYNAMIC_TYPE(GPluginPurple2Loader, gplugin_purple2_loader, GPLUGIN_TYPE_LOADER);
/******************************************************************************
* GPluginLoader Stuff
*****************************************************************************/
static GSList *
gplugin_purple2_loader_class_supported_extensions(G_GNUC_UNUSED const GPluginLoaderClass *klass) {
return g_slist_append(NULL, G_MODULE_SUFFIX);
}
static GPluginPlugin *
gplugin_purple2_loader_query(G_GNUC_UNUSED GPluginLoader *loader,
const gchar *filename,
GError **error)
{
GPluginPluginInfo *info = NULL;
GModule *module = NULL;
PurplePlugin *purple_plugin = NULL;
gboolean (*init_func)(PurplePlugin *);
module = g_module_open(filename, 0);
if(module == NULL) {
const gchar *msg = g_module_error();
g_set_error(
error,
GPLUGIN_PURPLE2_DOMAIN,
0,
"failed to open plugin %s: %s",
filename,
msg
);
return NULL;
}
/* look for the purple_init_plugin symbol */
if(!g_module_symbol(module, "purple_init_plugin", (gpointer)(&init_func))) {
g_module_close(module);
g_set_error(
error,
GPLUGIN_PURPLE2_DOMAIN,
0,
"failed to query plugin %s: purple_init_plugin function not found",
filename
);
return NULL;
}
/* now create the PurplePlugin instance so we can call the
* purple_init_plugin function.
*/
purple_plugin = g_new0(PurplePlugin, 1);
purple_plugin->native_plugin = TRUE;
purple_plugin->path = g_strdup(filename);
purple_plugin->handle = module;
/* now call the init function */
if(!init_func(purple_plugin)) {
g_module_close(module);
g_set_error(
error,
GPLUGIN_PURPLE2_DOMAIN,
0,
"purple_init_plugin failed for %s",
filename
);
return NULL;
}
/* do some validation */
if(purple_plugin->info->id == NULL || *purple_plugin->info->id == '\0') {
g_module_close(module);
g_clear_pointer(&purple_plugin, g_free);
g_set_error(
error,
GPLUGIN_PURPLE2_DOMAIN,
0,
"plugin %s does not have an id set",
filename
);
return NULL;
}
/* now create the GPluginPluginInfo */
info = gplugin_plugin_info_new(
purple_plugin->info->id,
GPLUGIN_NATIVE_PLUGIN_ABI_VERSION,
"name", purple_plugin->info->name,
"version", purple_plugin->info->version,
"summary", purple_plugin->info->summary,
"description", purple_plugin->info->description,
"website", purple_plugin->info->homepage,
NULL
);
/* finally return the plugin */
return g_object_new(
GPLUGIN_PURPLE2_TYPE_PLUGIN,
"module", module,
"purple-plugin", purple_plugin,
"filename", filename,
"loader", loader,
"info", info,
NULL
);
}
static gboolean
gplugin_purple2_loader_load(G_GNUC_UNUSED GPluginLoader *loader,
GPluginPlugin *plugin,
GError **error)
{
return FALSE;
}
static gboolean
gplugin_purple2_loader_unload(G_GNUC_UNUSED GPluginLoader *loader,
GPluginPlugin *plugin,
GError **error)
{
return FALSE;
}
/******************************************************************************
* GObject Stuff
*****************************************************************************/
static void
gplugin_purple2_loader_init(G_GNUC_UNUSED GPluginPurple2Loader *loader) {
}
static void
gplugin_purple2_loader_class_finalize(G_GNUC_UNUSED GPluginPurple2LoaderClass *klass) {
}
static void
gplugin_purple2_loader_class_init(GPluginPurple2LoaderClass *klass) {
GPluginLoaderClass *loader_class = GPLUGIN_LOADER_CLASS(klass);
loader_class->supported_extensions =
gplugin_purple2_loader_class_supported_extensions;
loader_class->query = gplugin_purple2_loader_query;
loader_class->load = gplugin_purple2_loader_load;
loader_class->unload = gplugin_purple2_loader_unload;
}
/******************************************************************************
* API
*****************************************************************************/
void
gplugin_purple2_loader_register(GPluginNativePlugin *native) {
gplugin_purple2_loader_register_type(G_TYPE_MODULE(native));
}