grim/gplugin-purple2-loader
Clone
Summary
Browse
Changes
Graph
Just checking in my working copy, it's been a long time since i've looked at this
draft
default
tip
2020-01-21, Gary Kramlich
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
));
}