gplugin/gplugin

Reorganize the object hierary for GPluginPlugin
develop
2018-10-08, Gary Kramlich
6208c125120e
Parents ba95fcc25c10
Children 041fbe100c2f
Reorganize the object hierary for GPluginPlugin
--- a/gplugin/gplugin-manager.c Mon Oct 08 00:55:11 2018 -0500
+++ b/gplugin/gplugin-manager.c Mon Oct 08 20:27:16 2018 -0500
@@ -86,6 +86,8 @@
GList *(*list_plugins)(GPluginManager *manager);
+ GSList *(*get_plugin_dependencies)(GPluginManager *manager, GPluginPlugin *plugin, GError **error);
+
gboolean (*load_plugin)(GPluginManager *manager,
GPluginPlugin *plugin,
GError **error);
@@ -455,8 +457,7 @@
/* we want the internal filename from the plugin to avoid
* duplicate memory, so we need to grab it for the "view".
*/
- gchar *real_filename =
- gplugin_plugin_get_internal_filename(plugin);
+ gchar *real_filename = gplugin_plugin_get_filename(plugin);
/* we also need the GPluginPluginInfo to get the plugin's
* ID for the key in our main hash table.
@@ -687,7 +688,8 @@
ret = gplugin_manager_load_plugin(dplugin, error);
- gplugin_plugin_add_dependent_plugin(dplugin, plugin);
+# warning need to figure out dependencies
+// gplugin_plugin_add_dependent_plugin(dplugin, plugin);
g_object_unref(G_OBJECT(dplugin));
@@ -714,6 +716,47 @@
return TRUE;
}
+static GSList *
+gplugin_manager_real_get_plugin_dependencies(GPluginManager *manager,
+ GPluginPlugin *plugin,
+ GError **error)
+{
+ GPluginPluginInfo *info = NULL;
+ GSList *ret = NULL;
+ const gchar * const *dependencies = NULL;
+ gint idx = 0;
+
+ info = gplugin_plugin_get_info(plugin);
+ dependencies = gplugin_plugin_info_get_dependencies(info);
+
+ if(dependencies == NULL) {
+ return NULL;
+ }
+
+ for(idx = 0; dependencies[idx] != NULL; idx++) {
+ GPluginPlugin *dep = gplugin_manager_find_plugin(dependencies[idx]);
+
+ if(!GPLUGIN_IS_PLUGIN(dep)) {
+ if(error) {
+ *error = g_error_new(
+ GPLUGIN_DOMAIN,
+ 0,
+ "failed to find plugin dependency '%s'",
+ dependencies[idx]
+ );
+
+ g_slist_free_full(ret, g_object_unref);
+
+ return NULL;
+ }
+ }
+
+ ret = g_slist_prepend(ret, dep);
+ }
+
+ return ret;
+}
+
static gboolean
gplugin_manager_real_load_plugin(GPluginManager *manager,
GPluginPlugin *plugin,
@@ -891,6 +934,8 @@
manager_class->find_plugins = gplugin_manager_real_find_plugins;
manager_class->list_plugins = gplugin_manager_real_list_plugins;
+ manager_class->get_plugin_dependencies = gplugin_manager_real_get_plugin_dependencies;
+
manager_class->load_plugin = gplugin_manager_real_load_plugin;
manager_class->unload_plugin = gplugin_manager_real_unload_plugin;
@@ -919,7 +964,7 @@
gplugin_marshal_BOOLEAN__OBJECT_POINTER,
G_TYPE_BOOLEAN,
2,
- GPLUGIN_TYPE_PLUGIN, G_TYPE_POINTER);
+ G_TYPE_OBJECT, G_TYPE_POINTER);
/**
* GPluginManager::loaded-plugin:
@@ -939,7 +984,7 @@
gplugin_marshal_VOID__OBJECT,
G_TYPE_NONE,
1,
- GPLUGIN_TYPE_PLUGIN);
+ G_TYPE_OBJECT);
/**
* GPluginManager::load-failed:
@@ -958,7 +1003,7 @@
gplugin_marshal_VOID__OBJECT,
G_TYPE_NONE,
1,
- GPLUGIN_TYPE_PLUGIN);
+ G_TYPE_OBJECT);
/**
* GPluginManager::unloading-plugin:
@@ -979,7 +1024,7 @@
gplugin_marshal_BOOLEAN__OBJECT_POINTER,
G_TYPE_BOOLEAN,
2,
- GPLUGIN_TYPE_PLUGIN, G_TYPE_POINTER);
+ G_TYPE_OBJECT, G_TYPE_POINTER);
/**
* GPluginManager::unloaded-plugin:
@@ -999,7 +1044,7 @@
gplugin_marshal_VOID__OBJECT,
G_TYPE_NONE,
1,
- GPLUGIN_TYPE_PLUGIN);
+ G_TYPE_OBJECT);
}
static void
@@ -1335,6 +1380,34 @@
return plugin;
}
+/**
+ * gplugin_manager_get_plugin_dependencies:
+ * @plugin: The #GPluginPlugin whose dependencies to get.
+ * @error: Return address for a #GError.
+ *
+ * Returns a list of all the #GPluginPlugin's that @plugin depends on.
+ *
+ * Return value: (element-type GPlugin.Plugin) (transfer full): A #GSList of
+ * #GPluginPlugin's that @plugin depends on, or NULL on error
+ * with @error set.
+ */
+GSList *
+gplugin_manager_get_plugin_dependencies(GPluginPlugin *plugin, GError **error) {
+ GPluginManager *manager = NULL;
+ GPluginManagerClass *klass = NULL;
+
+ g_return_val_if_fail(GPLUGIN_IS_PLUGIN(plugin), NULL);
+
+ manager = GPLUGIN_MANAGER_INSTANCE;
+ g_return_val_if_fail(GPLUGIN_IS_MANAGER(manager), NULL);
+
+ klass = GPLUGIN_MANAGER_GET_CLASS(manager);
+ if(klass && klass->get_plugin_dependencies) {
+ return klass->get_plugin_dependencies(manager, plugin, error);
+ }
+
+ return NULL;
+}
/**
* gplugin_manager_load_plugin:
--- a/gplugin/gplugin-manager.h Mon Oct 08 00:55:11 2018 -0500
+++ b/gplugin/gplugin-manager.h Mon Oct 08 20:27:16 2018 -0500
@@ -51,6 +51,8 @@
GPluginPlugin *gplugin_manager_find_plugin(const gchar *id);
+GSList *gplugin_manager_get_plugin_dependencies(GPluginPlugin *plugin, GError **error);
+
gboolean gplugin_manager_load_plugin(GPluginPlugin *plugin, GError **error);
gboolean gplugin_manager_unload_plugin(GPluginPlugin *plugin, GError **error);
--- a/gplugin/gplugin-native-loader.c Mon Oct 08 00:55:11 2018 -0500
+++ b/gplugin/gplugin-native-loader.c Mon Oct 08 20:27:16 2018 -0500
@@ -226,19 +226,8 @@
g_return_val_if_fail(plugin != NULL, FALSE);
g_return_val_if_fail(GPLUGIN_IS_NATIVE_PLUGIN(plugin), FALSE);
- /* get the function */
+ /* get and call the function */
g_object_get(G_OBJECT(plugin), "load-func", &func, NULL);
-
- /* validate the function */
- if(func == NULL) {
- const char *filename = gplugin_plugin_get_filename(plugin);
-
- g_warning(_("load function for %s is NULL"), filename);
-
- return FALSE;
- }
-
- /* now call the function */
if(!func(GPLUGIN_NATIVE_PLUGIN(plugin), error)) {
if(error && *error == NULL)
*error = g_error_new(GPLUGIN_DOMAIN, 0, _("unknown failure"));
--- a/gplugin/gplugin-native-plugin.c Mon Oct 08 00:55:11 2018 -0500
+++ b/gplugin/gplugin-native-plugin.c Mon Oct 08 20:27:16 2018 -0500
@@ -44,26 +44,12 @@
gpointer load_func;
gpointer unload_func;
- GSList *type_infos;
- GSList *interface_infos;
-
- guint use_count;
+ gchar *filename;
+ GPluginLoader *loader;
+ GPluginPluginInfo *info;
+ GPluginPluginState state;
} GPluginNativePluginPrivate;
-typedef struct {
- gboolean loaded;
- GType type;
- GType parent;
- GTypeInfo info;
-} GPluginNativePluginTypeInfo;
-
-typedef struct {
- gboolean loaded;
- GType instance_type;
- GType interface_type;
- GInterfaceInfo info;
-} GPluginNativePluginInterfaceInfo;
-
/******************************************************************************
* Enums
*****************************************************************************/
@@ -73,148 +59,58 @@
PROP_LOAD_FUNC,
PROP_UNLOAD_FUNC,
N_PROPERTIES,
+ /* overrides */
+ PROP_FILENAME = N_PROPERTIES,
+ PROP_LOADER,
+ PROP_INFO,
+ PROP_STATE
};
static GParamSpec *properties[N_PROPERTIES] = {NULL,};
/* I hate forward declarations... */
-static void gplugin_native_plugin_iface_init(GTypePluginClass *iface);
+static void gplugin_native_plugin_iface_init(GPluginPluginInterface *iface);
G_DEFINE_TYPE_WITH_CODE(
GPluginNativePlugin,
gplugin_native_plugin,
- GPLUGIN_TYPE_PLUGIN,
+ G_TYPE_TYPE_MODULE,
G_ADD_PRIVATE(GPluginNativePlugin)
- G_IMPLEMENT_INTERFACE(G_TYPE_TYPE_PLUGIN, gplugin_native_plugin_iface_init)
+ G_IMPLEMENT_INTERFACE(GPLUGIN_TYPE_PLUGIN, gplugin_native_plugin_iface_init)
);
/******************************************************************************
- * Helpers
+ * GPluginPlugin Implementation
*****************************************************************************/
-static GPluginNativePluginTypeInfo *
-gplugin_native_plugin_find_type_info(GPluginNativePlugin *plugin, GType type) {
- GPluginNativePluginPrivate *priv = gplugin_native_plugin_get_instance_private(plugin);
- GSList *l = NULL;
-
- for(l = priv->type_infos; l; l = l->next) {
- GPluginNativePluginTypeInfo *info =
- (GPluginNativePluginTypeInfo *)(l->data);
-
- if(info->type == type)
- return info;
- }
-
- return NULL;
-}
-
-static GPluginNativePluginInterfaceInfo *
-gplugin_native_plugin_find_interface_info(GPluginNativePlugin *plugin,
- GType instance_type,
- GType interface_type)
-{
- GPluginNativePluginPrivate *priv = gplugin_native_plugin_get_instance_private(plugin);
- GSList *l = NULL;
-
- for(l = priv->interface_infos; l; l = l->next) {
- GPluginNativePluginInterfaceInfo *info =
- (GPluginNativePluginInterfaceInfo *)(l->data);
-
- if(info->instance_type == instance_type &&
- info->interface_type == interface_type)
- {
- return info;
- }
- }
-
- return NULL;
+static void
+gplugin_native_plugin_iface_init(GPluginPluginInterface *iface) {
}
/******************************************************************************
- * GTypePlugin Implementation
+ * GPluginPlugin Implementation
*****************************************************************************/
-static void
-gplugin_native_plugin_priv_use(GTypePlugin *plugin) {
- GPluginNativePlugin *native = GPLUGIN_NATIVE_PLUGIN(plugin);
- GError *error = NULL;
-
- if(!gplugin_native_plugin_use(native, &error)) {
- GPluginPluginInfo *info =
- gplugin_plugin_get_info(GPLUGIN_PLUGIN(native));
- const gchar *name = NULL;
+static gboolean
+gplugin_native_plugin_load(GTypeModule *module) {
+ // GPluginNativePlugin *native = GPLUGIN_NATIVE_PLUGIN(module);
+ // GPluginNativePluginPrivate *priv = gplugin_native_plugin_get_instance_private(native);
+ // GError *error = NULL;
+ // GPluginNativePluginLoadFunc func;
+ // gboolean ret = FALSE;
- if(GPLUGIN_IS_PLUGIN_INFO(info))
- name = gplugin_plugin_info_get_name(info);
+ // func = (GPluginNativePluginLoadFunc)priv->load_func;
+
+ // ret = func(native, &error);
- g_warning(_("Could not reload previously loaded plugin '%s': %s\n"),
- name ? name : _("(unknown)"),
- error ? error->message : _("unknown"));
+ // if(error != NULL) {
+ // g_warning("failed to load plugin: %s", error->message);
+ // }
- g_object_unref(G_OBJECT(info));
+ // return ret;
- if (error)
- g_error_free(error);
- }
+ return TRUE;
}
static void
-gplugin_native_plugin_priv_unuse(GTypePlugin *plugin) {
- GPluginNativePlugin *native = GPLUGIN_NATIVE_PLUGIN(plugin);
- GError *error = NULL;
-
- if(!gplugin_native_plugin_unuse(native, &error)) {
- GPluginPluginInfo *info =
- gplugin_plugin_get_info(GPLUGIN_PLUGIN(native));
- const gchar *name = NULL;
-
- if(GPLUGIN_IS_PLUGIN_INFO(info))
- name = gplugin_plugin_info_get_name(info);
-
- g_warning(_("Could not unuse plugin '%s': %s\n"),
- name ? name : _("(unknown)"),
- error ? error->message : _("unknown"));
-
- g_object_unref(G_OBJECT(info));
-
- if (error)
- g_error_free(error);
- }
-}
-
-static void
-gplugin_native_plugin_complete_type_info(GTypePlugin *plugin, GType type,
- GTypeInfo *info,
- GTypeValueTable *value_table)
-{
- GPluginNativePlugin *native = GPLUGIN_NATIVE_PLUGIN(plugin);
- GPluginNativePluginTypeInfo *native_info =
- gplugin_native_plugin_find_type_info(native, type);
-
- *info = native_info->info;
-
- if(native_info->info.value_table)
- *value_table = *native_info->info.value_table;
-}
-
-static void
-gplugin_native_plugin_complete_interface_info(GTypePlugin *plugin,
- GType instance_type,
- GType interface_type,
- GInterfaceInfo *info)
-{
- GPluginNativePlugin *native = GPLUGIN_NATIVE_PLUGIN(plugin);
- GPluginNativePluginInterfaceInfo *iface_info =
- gplugin_native_plugin_find_interface_info(native, instance_type,
- interface_type);
-
- *info = iface_info->info;
-}
-
-static void
-gplugin_native_plugin_iface_init(GTypePluginClass *iface) {
- iface->use_plugin = gplugin_native_plugin_priv_use;
- iface->unuse_plugin = gplugin_native_plugin_priv_unuse;
- iface->complete_type_info = gplugin_native_plugin_complete_type_info;
- iface->complete_interface_info =
- gplugin_native_plugin_complete_interface_info;
+gplugin_native_plugin_unload(GTypeModule *module) {
}
/******************************************************************************
@@ -238,6 +134,20 @@
case PROP_UNLOAD_FUNC:
g_value_set_pointer(value, priv->unload_func);
break;
+
+ /* overrides */
+ case PROP_FILENAME:
+ g_value_set_string(value, priv->filename);
+ break;
+ case PROP_LOADER:
+ g_value_set_object(value, priv->loader);
+ break;
+ case PROP_INFO:
+ g_value_set_object(value, priv->info);
+ break;
+ case PROP_STATE:
+ g_value_set_enum(value, priv->state);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec);
break;
@@ -260,6 +170,21 @@
case PROP_UNLOAD_FUNC:
priv->unload_func = g_value_get_pointer(value);
break;
+
+ /* overrides */
+ case PROP_FILENAME:
+ priv->filename = g_strdup(g_value_get_string(value));
+ break;
+ case PROP_LOADER:
+ priv->loader = g_object_ref(g_value_get_object(value));
+ break;
+ case PROP_INFO:
+ priv->info = g_object_ref(g_value_get_object(value));
+ break;
+ case PROP_STATE:
+ priv->state = g_value_get_enum(value);
+ break;
+
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec);
break;
@@ -270,8 +195,9 @@
gplugin_native_plugin_finalize(GObject *obj) {
GPluginNativePluginPrivate *priv = gplugin_native_plugin_get_instance_private(GPLUGIN_NATIVE_PLUGIN(obj));
- g_slist_free(priv->type_infos);
- g_slist_free(priv->interface_infos);
+ g_free(priv->filename);
+ g_object_unref(G_OBJECT(priv->loader));
+ g_object_unref(G_OBJECT(priv->info));
G_OBJECT_CLASS(gplugin_native_plugin_parent_class)->finalize(obj);
}
@@ -283,11 +209,15 @@
static void
gplugin_native_plugin_class_init(GPluginNativePluginClass *klass) {
GObjectClass *obj_class = G_OBJECT_CLASS(klass);
+ GTypeModuleClass *module_class = G_TYPE_MODULE_CLASS(klass);
obj_class->finalize = gplugin_native_plugin_finalize;
obj_class->get_property = gplugin_native_plugin_get_property;
obj_class->set_property = gplugin_native_plugin_set_property;
+ module_class->load = gplugin_native_plugin_load;
+ module_class->unload = gplugin_native_plugin_unload;
+
/**
* GPluginNativePlugin:module:
*
@@ -322,322 +252,17 @@
);
g_object_class_install_properties(obj_class, N_PROPERTIES, properties);
+
+ /* add our overrides */
+ g_object_class_override_property(obj_class, PROP_FILENAME, "filename");
+ g_object_class_override_property(obj_class, PROP_LOADER, "loader");
+ g_object_class_override_property(obj_class, PROP_INFO, "info");
+ g_object_class_override_property(obj_class, PROP_STATE, "state");
}
/******************************************************************************
* API
*****************************************************************************/
-/**
- * gplugin_native_plugin_use:
- * @plugin: a #GPluginNativePlugin
- * @error: (out): return location for a #GError or null
- *
- * Increments the ref count of @plugin by one.
- *
- * See: g_type_module_use
- *
- * Returns: FALSE if @plugin needed to be loaded and loading failed.
- */
-gboolean
-gplugin_native_plugin_use(GPluginNativePlugin *plugin,
- GPLUGIN_UNUSED GError **error)
-{
- GPluginNativePluginPrivate *priv = NULL;
-
- g_return_val_if_fail(GPLUGIN_IS_NATIVE_PLUGIN(plugin), FALSE);
-
- priv = gplugin_native_plugin_get_instance_private(plugin);
-
- priv->use_count++;
- if(priv->use_count == 1) {
- GSList *l = NULL;
-
- for(l = priv->type_infos; l; l = l->next) {
- GPluginNativePluginTypeInfo *info =
- (GPluginNativePluginTypeInfo *)(l->data);
-
- if(!info->loaded) {
- GPluginPluginInfo *plugin_info =
- gplugin_plugin_get_info(GPLUGIN_PLUGIN(plugin));
- const gchar *name = NULL;
-
- if(GPLUGIN_IS_PLUGIN_INFO(plugin_info))
- name = gplugin_plugin_info_get_name(plugin_info);
-
- if(name == NULL)
- name = _("(unknown)");
-
- g_warning(_("plugin '%s' failed to register type '%s'\n"),
- name, g_type_name(info->type));
-
- g_object_unref(G_OBJECT(plugin_info));
-
- return FALSE;
- }
- }
- }
-
- return TRUE;
-}
-
-/**
- * gplugin_native_plugin_unuse:
- * @plugin: a #GPluginNativePlugin
- * @error: (out): return location for a #GError or null
- *
- * Decreases the ref count of @plugin by one. If the result is zero, @plugin
- * is unloaded.
- *
- * See: g_type_module_unuse
- *
- * Returns: TRUE if successful, FALSE otherwise.
- */
-gboolean
-gplugin_native_plugin_unuse(GPluginNativePlugin *plugin,
- GPLUGIN_UNUSED GError **error)
-{
- GPluginNativePluginPrivate *priv = NULL;
-
- g_return_val_if_fail(GPLUGIN_IS_NATIVE_PLUGIN(plugin), FALSE);
-
- priv = gplugin_native_plugin_get_instance_private(plugin);
-
- g_return_val_if_fail(priv->use_count > 0, FALSE);
-
- priv->use_count--;
-
- if(priv->use_count == 0) {
- GSList *l = NULL;
-
- for(l = priv->type_infos; l; l = l->next) {
- GPluginNativePluginTypeInfo *info =
- (GPluginNativePluginTypeInfo *)(l->data);
-
- info->loaded = FALSE;
- }
- }
-
- return TRUE;
-}
-
-/**
- * gplugin_native_plugin_register_type:
- * @plugin: a #GPluginNativePlugin
- * @parent: the type for the parent class
- * @name: name for the type
- * @info: type information structure
- * @flags: flags field providing details about the type.
- *
- * Looks up or registers a type that is implemented in @plugin.
- *
- * See: g_type_module_register_type
- *
- * Returns: the new or existing type ID
- */
-GType
-gplugin_native_plugin_register_type(GPluginNativePlugin *plugin, GType parent,
- const gchar *name, const GTypeInfo *info,
- GTypeFlags flags)
-{
- GPluginNativePluginPrivate *priv = NULL;
- GPluginNativePluginTypeInfo *type_info = NULL;
- GType type = G_TYPE_INVALID;
-
- g_return_val_if_fail(GPLUGIN_IS_NATIVE_PLUGIN(plugin), G_TYPE_INVALID);
- g_return_val_if_fail(name, G_TYPE_INVALID);
- g_return_val_if_fail(info, G_TYPE_INVALID);
-
- priv = gplugin_native_plugin_get_instance_private(plugin);
-
- type = g_type_from_name(name);
-
- if(type != G_TYPE_INVALID) {
- /* this type is already loaded, let's make sure it's the same plugin
- * loading it again.
- */
- GTypePlugin *old = g_type_get_plugin(type);
-
- if(old != G_TYPE_PLUGIN(plugin)) {
- g_warning(_("Two different plugins tried to register '%s'"),
- name);
-
- return G_TYPE_INVALID;
- }
-
- /* The same plugin is reloading the type */
- type_info = gplugin_native_plugin_find_type_info(plugin, type);
- if(type_info == NULL)
- return G_TYPE_INVALID;
-
- if(type_info->parent != parent) {
- /* eek, them bastards tried to reparent this type! */
-
- const gchar *parent_name = g_type_name(parent);
-
- g_warning(_("Type '%s' was recreated with a different parent type."
- "(was '%s', now '%s')"),
- name, g_type_name(type_info->parent),
- (parent_name) ? parent_name : _("unknown"));
-
- return G_TYPE_INVALID;
- }
-
- /* we need to free the old vtable if the old type had one */
- if(type_info->info.value_table)
- g_free((GTypeValueTable *)type_info->info.value_table);
- } else {
- /* the type hasn't been loaded before, so now we need to add it */
- type_info = g_new(GPluginNativePluginTypeInfo, 1);
-
- type_info->parent = parent;
- type_info->type = g_type_register_dynamic(parent, name,
- G_TYPE_PLUGIN(plugin),
- flags);
-
- priv->type_infos = g_slist_prepend(priv->type_infos, type_info);
- }
-
- /* ok, now finish up */
- type_info->loaded = TRUE;
- type_info->info = *info;
-
- if(info->value_table) {
- type_info->info.value_table = g_memdup(info->value_table,
- sizeof(GTypeValueTable));
- }
-
- if(g_type_is_a(type_info->type, GPLUGIN_TYPE_LOADER) &&
- !G_TYPE_IS_ABSTRACT(type_info->type))
- {
- gplugin_manager_register_loader(type_info->type);
- }
-
- return type_info->type;
-}
-
-/**
- * gplugin_native_plugin_add_interface:
- * @plugin: a #GPluginNativePlugin
- * @instance_type: type to which to add the interface
- * @interface_type: interface type to add
- * @interface_info: type information structure
- *
- * Registers an additional interface for a type that lives in @plugin.
- *
- * See: g_type_module_add_interface
- */
-void
-gplugin_native_plugin_add_interface(GPluginNativePlugin *plugin,
- GType instance_type, GType interface_type,
- const GInterfaceInfo *interface_info)
-{
- GPluginNativePluginPrivate *priv = NULL;
- GPluginNativePluginInterfaceInfo *iface_info = NULL;
-
- g_return_if_fail(GPLUGIN_IS_NATIVE_PLUGIN(plugin));
- g_return_if_fail(interface_info);
-
- priv = gplugin_native_plugin_get_instance_private(plugin);
-
- if(g_type_is_a(instance_type, interface_type)) {
- GTypePlugin *old = g_type_interface_get_plugin(instance_type,
- interface_type);
-
- if(!old) {
- g_warning(_("Interface '%s' for '%s' was previously registered "
- "statically or for a parent type."),
- g_type_name(interface_type),
- g_type_name(instance_type));
- return;
- } else if(old != G_TYPE_PLUGIN(plugin)) {
- g_warning(_("Two different plugins tried to register interface "
- "'%s' for '%s')"),
- g_type_name(interface_type),
- g_type_name(instance_type));
- return;
- }
-
- iface_info = gplugin_native_plugin_find_interface_info(plugin,
- instance_type,
- interface_type);
-
- g_return_if_fail(iface_info);
- } else {
- iface_info = g_new0(GPluginNativePluginInterfaceInfo, 1);
-
- iface_info->instance_type = instance_type;
- iface_info->interface_type = interface_type;
-
- g_type_add_interface_dynamic(instance_type, interface_type,
- G_TYPE_PLUGIN(plugin));
-
- priv->interface_infos = g_slist_prepend(priv->interface_infos,
- iface_info);
- }
-
- iface_info->loaded = TRUE;
- iface_info->info = *interface_info;
-}
-
-/**
- * gplugin_native_plugin_register_enum:
- * @plugin: a #GPluginNativePlugin
- * @name: a name for the type
- * @values: an array of %GEnumValue structs for the possible enumeration
- * values. The array is terminated by a struct with all members being
- * 0.
- *
- * Looks up or registers a new enumeration named @name with the given @values,
- * and associates it with @plugin.
- *
- * See: g_type_module_register_enum
- *
- * Returns: the new or existing type ID.
- */
-GType
-gplugin_native_plugin_register_enum(GPluginNativePlugin *plugin,
- const gchar *name,
- const GEnumValue *values)
-{
- GTypeInfo enum_info;
-
- g_return_val_if_fail(GPLUGIN_IS_NATIVE_PLUGIN(plugin), G_TYPE_INVALID);
- g_return_val_if_fail(name, G_TYPE_INVALID);
- g_return_val_if_fail(values, G_TYPE_INVALID);
-
- g_enum_complete_type_info(G_TYPE_ENUM, &enum_info, values);
-
- return gplugin_native_plugin_register_type(plugin, G_TYPE_ENUM, name,
- &enum_info, 0);
-}
-
-/**
- * gplugin_native_plugin_register_flags:
- * @plugin: a #GPluginNativePlugin
- * @name: name for the type
- * @values: an array of %GFlagValue structs for the possible flags values. The
- * array is terminated by a struct with all members being 0.
- *
- * See: g_type_module_register_flags
- *
- * Returns: the new or existing type ID.
- */
-GType
-gplugin_native_plugin_register_flags(GPluginNativePlugin *plugin,
- const gchar *name,
- const GFlagsValue *values)
-{
- GTypeInfo flags_info;
-
- g_return_val_if_fail(GPLUGIN_IS_NATIVE_PLUGIN(plugin), G_TYPE_INVALID);
- g_return_val_if_fail(name, G_TYPE_INVALID);
- g_return_val_if_fail(values, G_TYPE_INVALID);
-
- g_flags_complete_type_info(G_TYPE_FLAGS, &flags_info, values);
-
- return gplugin_native_plugin_register_type(plugin, G_TYPE_FLAGS, name,
- &flags_info, 0);
-}
/**
* gplugin_native_plugin_get_module: (skip)
--- a/gplugin/gplugin-native-plugin.h Mon Oct 08 00:55:11 2018 -0500
+++ b/gplugin/gplugin-native-plugin.h Mon Oct 08 20:27:16 2018 -0500
@@ -39,35 +39,23 @@
#include <gmodule.h>
struct _GPluginNativePlugin {
- GPluginPlugin parent;
+ /*< private >*/
+ GTypeModule parent;
- void (*_gplugin_reserved_1)(void);
- void (*_gplugin_reserved_2)(void);
- void (*_gplugin_reserved_3)(void);
- void (*_gplugin_reserved_4)(void);
+ gpointer reserved[4];
};
struct _GPluginNativePluginClass {
- GPluginPluginClass parent;
+ /*< private >*/
+ GTypeModuleClass parent;
- void (*_gplugin_reserved_1)(void);
- void (*_gplugin_reserved_2)(void);
- void (*_gplugin_reserved_3)(void);
- void (*_gplugin_reserved_4)(void);
+ gpointer reserved[4];
};
G_BEGIN_DECLS
GType gplugin_native_plugin_get_type(void);
-gboolean gplugin_native_plugin_use(GPluginNativePlugin *plugin, GError **error);
-gboolean gplugin_native_plugin_unuse(GPluginNativePlugin *plugin, GError **error);
-
-GType gplugin_native_plugin_register_type(GPluginNativePlugin *plugin, GType parent, const gchar *name, const GTypeInfo *info, GTypeFlags flags);
-void gplugin_native_plugin_add_interface(GPluginNativePlugin *plugin, GType instance_type, GType interface_type, const GInterfaceInfo *interface_info);
-GType gplugin_native_plugin_register_enum(GPluginNativePlugin *plugin, const gchar *name, const GEnumValue *values);
-GType gplugin_native_plugin_register_flags(GPluginNativePlugin *plugin, const gchar *name, const GFlagsValue *values);
-
GModule *gplugin_native_plugin_get_module(GPluginNativePlugin *plugin);
G_END_DECLS
--- a/gplugin/gplugin-plugin.c Mon Oct 08 00:55:11 2018 -0500
+++ b/gplugin/gplugin-plugin.c Mon Oct 08 20:27:16 2018 -0500
@@ -45,231 +45,75 @@
*/
/******************************************************************************
- * Structs
- *****************************************************************************/
-typedef struct {
- gchar *filename;
-
- GPluginLoader *loader;
- GPluginPluginInfo *info;
-
- GPluginPluginState state;
-
- GList *dependents;
-} GPluginPluginPrivate;
-
-/******************************************************************************
* Enums
*****************************************************************************/
enum {
- PROP_ZERO,
- PROP_FILENAME,
- PROP_LOADER,
- PROP_INFO,
- PROP_STATE,
- N_PROPERTIES,
-};
-static GParamSpec *properties[N_PROPERTIES] = {NULL,};
-
-enum {
SIG_STATE_CHANGED,
SIG_LAST,
};
static guint signals[SIG_LAST] = {0, };
-G_DEFINE_TYPE_WITH_PRIVATE(GPluginPlugin, gplugin_plugin, G_TYPE_OBJECT);
-
-/******************************************************************************
- * Private API
- *****************************************************************************/
-static void
-gplugin_plugin_set_filename(GPluginPlugin *plugin, const gchar *filename) {
- GPluginPluginPrivate *priv = gplugin_plugin_get_instance_private(plugin);
-
- g_free(priv->filename);
-
- priv->filename = (filename) ? g_strdup(filename) : NULL;
-
- g_object_notify(G_OBJECT(plugin), "filename");
-}
-
-static void
-gplugin_plugin_set_loader(GPluginPlugin *plugin, GPluginLoader *loader) {
- GPluginPluginPrivate *priv = gplugin_plugin_get_instance_private(plugin);
-
- if(priv->loader)
- g_object_unref(G_OBJECT(priv->loader));
-
- if(GPLUGIN_IS_LOADER(loader))
- priv->loader = GPLUGIN_LOADER(g_object_ref(G_OBJECT(loader)));
- else
- priv->loader = NULL;
-}
-
-static void
-gplugin_plugin_set_info(GPluginPlugin *plugin, GPluginPluginInfo *info) {
- GPluginPluginPrivate *priv = gplugin_plugin_get_instance_private(plugin);
-
- if(priv->info) {
- g_object_unref(G_OBJECT(priv->info));
- priv->info = NULL;
- }
-
- if(info) {
- priv->info = GPLUGIN_PLUGIN_INFO(g_object_ref(G_OBJECT(info)));
- }
-}
-
-gchar *
-gplugin_plugin_get_internal_filename(GPluginPlugin *plugin) {
- GPluginPluginPrivate *priv = gplugin_plugin_get_instance_private(plugin);
-
- return priv->filename;
-}
-
-void
-gplugin_plugin_add_dependent_plugin(GPluginPlugin *plugin,
- GPluginPlugin *dependent)
-{
- GPluginPluginPrivate *priv = gplugin_plugin_get_instance_private(plugin);
-
- priv->dependents = g_list_append(priv->dependents, g_object_ref(dependent));
-}
+G_DEFINE_INTERFACE(GPluginPlugin, gplugin_plugin, G_TYPE_INVALID);
/******************************************************************************
* Object Stuff
*****************************************************************************/
static void
-gplugin_plugin_get_property(GObject *obj, guint param_id, GValue *value,
- GParamSpec *pspec)
-{
- GPluginPlugin *plugin = GPLUGIN_PLUGIN(obj);
-
- switch(param_id) {
- case PROP_FILENAME:
- g_value_set_string(value, gplugin_plugin_get_filename(plugin));
- break;
- case PROP_LOADER:
- g_value_take_object(value, gplugin_plugin_get_loader(plugin));
- break;
- case PROP_INFO:
- g_value_take_object(value, gplugin_plugin_get_info(plugin));
- break;
- case PROP_STATE:
- g_value_set_enum(value, gplugin_plugin_get_state(plugin));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec);
- break;
- }
-}
-
-static void
-gplugin_plugin_set_property(GObject *obj, guint param_id, const GValue *value,
- GParamSpec *pspec)
-{
- GPluginPlugin *plugin = GPLUGIN_PLUGIN(obj);
-
- switch(param_id) {
- case PROP_FILENAME:
- gplugin_plugin_set_filename(plugin, g_value_get_string(value));
- break;
- case PROP_LOADER:
- gplugin_plugin_set_loader(plugin, g_value_get_object(value));
- break;
- case PROP_INFO:
- gplugin_plugin_set_info(plugin, g_value_get_object(value));
- break;
- case PROP_STATE:
- gplugin_plugin_set_state(plugin, g_value_get_enum(value));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec);
- break;
- }
-}
-
-static void
-gplugin_plugin_finalize(GObject *obj) {
- GPluginPluginPrivate *priv = gplugin_plugin_get_instance_private(GPLUGIN_PLUGIN(obj));
- GList *l = NULL;
-
- g_free(priv->filename);
- g_object_unref(priv->loader);
-
- if(priv->info)
- g_object_unref(G_OBJECT(priv->info));
-
- for(l = priv->dependents; l; l = l->next) {
- g_object_unref(G_OBJECT(l->data));
- }
-
- G_OBJECT_CLASS(gplugin_plugin_parent_class)->finalize(obj);
-}
-
-static void
-gplugin_plugin_init(GPluginPlugin *plugin) {
-}
-
-static void
-gplugin_plugin_class_init(GPluginPluginClass *klass) {
- GObjectClass *obj_class = G_OBJECT_CLASS(klass);
-
- obj_class->get_property = gplugin_plugin_get_property;
- obj_class->set_property = gplugin_plugin_set_property;
- obj_class->finalize = gplugin_plugin_finalize;
+gplugin_plugin_default_init(GPluginPluginInterface *iface) {
+ GParamSpec *pspec = NULL;
/**
* GPluginPlugin:filename:
*
* The absolute path to the plugin on disk.
*/
- properties[PROP_FILENAME] = g_param_spec_string(
+ pspec = g_param_spec_string(
"filename", "filename",
"The filename of the plugin",
NULL,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY
);
+ g_object_interface_install_property(iface, pspec);
/**
* GPluginPlugin:loader:
*
* The #GPluginLoader that loaded this plugin.
*/
- properties[PROP_LOADER] = g_param_spec_object(
+ pspec = g_param_spec_object(
"loader", "loader",
"The loader for this plugin",
GPLUGIN_TYPE_LOADER,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY
);
+ g_object_interface_install_property(iface, pspec);
/**
* GPluginPlugin:info:
*
* The #GPluginPluginInfo from this plugin.
*/
- properties[PROP_INFO] = g_param_spec_object(
+ pspec = g_param_spec_object(
"info", "info",
"The information for the plugin",
GPLUGIN_TYPE_PLUGIN_INFO,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY
);
+ g_object_interface_install_property(iface, pspec);
/**
* GPluginPlugin:state:
*
* The #GPluginPluginState that this plugin is in.
*/
- properties[PROP_STATE] = g_param_spec_enum(
+ pspec = g_param_spec_enum(
"state", "state",
"The state of the plugin",
GPLUGIN_TYPE_PLUGIN_STATE,
GPLUGIN_PLUGIN_STATE_UNKNOWN,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT
);
-
- /* install the properties */
- g_object_class_install_properties(obj_class, N_PROPERTIES, properties);
+ g_object_interface_install_property(iface, pspec);
/**
* GPluginPlugin::state-changed:
@@ -281,9 +125,9 @@
*/
signals[SIG_STATE_CHANGED] =
g_signal_new("state-changed",
- G_OBJECT_CLASS_TYPE(klass),
+ GPLUGIN_TYPE_PLUGIN,
G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET(GPluginPluginClass, state_changed),
+ G_STRUCT_OFFSET(GPluginPluginInterface, state_changed),
NULL, NULL,
gplugin_marshal_VOID__ENUM_ENUM,
G_TYPE_NONE,
@@ -301,17 +145,17 @@
*
* Returns the filename that @plugin was loaded from.
*
- * Returns: The filename of @plugin
+ * Returns: (transfer full): The filename of @plugin
*/
-const gchar *
+gchar *
gplugin_plugin_get_filename(GPluginPlugin *plugin) {
- GPluginPluginPrivate *priv = NULL;
+ gchar *filename = NULL;
g_return_val_if_fail(GPLUGIN_IS_PLUGIN(plugin), NULL);
- priv = gplugin_plugin_get_instance_private(plugin);
+ g_object_get(G_OBJECT(plugin), "filename", &filename, NULL);
- return priv->filename;
+ return filename;
}
/**
@@ -324,13 +168,13 @@
*/
GPluginLoader *
gplugin_plugin_get_loader(GPluginPlugin *plugin) {
- GPluginPluginPrivate *priv = NULL;
+ GPluginLoader *loader = NULL;
g_return_val_if_fail(GPLUGIN_IS_PLUGIN(plugin), NULL);
- priv = gplugin_plugin_get_instance_private(plugin);
+ g_object_get(G_OBJECT(plugin), "loader", &loader, NULL);
- return (priv->info) ? GPLUGIN_LOADER(g_object_ref(G_OBJECT(priv->loader))) : NULL;
+ return loader;
}
/**
@@ -343,13 +187,13 @@
*/
GPluginPluginInfo *
gplugin_plugin_get_info(GPluginPlugin *plugin) {
- GPluginPluginPrivate *priv = NULL;
+ GPluginPluginInfo *info = NULL;
g_return_val_if_fail(GPLUGIN_IS_PLUGIN(plugin), NULL);
- priv = gplugin_plugin_get_instance_private(plugin);
+ g_object_get(G_OBJECT(plugin), "info", &info, NULL);
- return (priv->info) ? GPLUGIN_PLUGIN_INFO(g_object_ref(G_OBJECT(priv->info))) : NULL;
+ return info;
}
/**
@@ -362,13 +206,13 @@
*/
GPluginPluginState
gplugin_plugin_get_state(GPluginPlugin *plugin) {
- GPluginPluginPrivate *priv = NULL;
+ GPluginPluginState state = GPLUGIN_PLUGIN_STATE_UNKNOWN;
g_return_val_if_fail(GPLUGIN_IS_PLUGIN(plugin), GPLUGIN_PLUGIN_STATE_UNKNOWN);
- priv = gplugin_plugin_get_instance_private(plugin);
+ g_object_get(G_OBJECT(plugin), "state", &state, NULL);
- return priv->state;
+ return state;
}
/**
@@ -381,36 +225,14 @@
*/
void
gplugin_plugin_set_state(GPluginPlugin *plugin, GPluginPluginState state) {
- GPluginPluginPrivate *priv = NULL;
GPluginPluginState oldstate = GPLUGIN_PLUGIN_STATE_UNKNOWN;
g_return_if_fail(GPLUGIN_IS_PLUGIN(plugin));
- priv = gplugin_plugin_get_instance_private(plugin);
+ oldstate = gplugin_plugin_get_state(plugin);
- oldstate = priv->state;
- priv->state = state;
+ g_object_set(G_OBJECT(plugin), "state", state, NULL);
g_signal_emit(plugin, signals[SIG_STATE_CHANGED], 0,
- oldstate, priv->state);
+ oldstate, state);
}
-
-/**
- * gplugin_plugin_get_dependent_plugins:
- * @plugin: #GPluginPlugin instance
- *
- * Returns a list of plugins that depend on @plugin.
- *
- * Returns: (element-type GPlugin.Plugin) (transfer none): A #GList of each
- * plugin that depends on this plugin.
- */
-GList *
-gplugin_plugin_get_dependent_plugins(GPluginPlugin *plugin) {
- GPluginPluginPrivate *priv = NULL;
-
- g_return_val_if_fail(GPLUGIN_IS_PLUGIN(plugin), NULL);
-
- priv = gplugin_plugin_get_instance_private(plugin);
-
- return priv->dependents;
-}
--- a/gplugin/gplugin-plugin.h Mon Oct 08 00:55:11 2018 -0500
+++ b/gplugin/gplugin-plugin.h Mon Oct 08 20:27:16 2018 -0500
@@ -26,13 +26,11 @@
#define GPLUGIN_TYPE_PLUGIN (gplugin_plugin_get_type())
#define GPLUGIN_PLUGIN(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GPLUGIN_TYPE_PLUGIN, GPluginPlugin))
-#define GPLUGIN_PLUGIN_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GPLUGIN_TYPE_PLUGIN, GPluginPluginClass))
#define GPLUGIN_IS_PLUGIN(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GPLUGIN_TYPE_PLUGIN))
-#define GPLUGIN_IS_PLUGIN_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GPLUGIN_TYPE_PLUGIN))
-#define GPLUGIN_PLUGIN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GPLUGIN_TYPE_PLUGIN, GPluginPluginClass))
+#define GPLUGIN_PLUGIN_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE((obj), GPLUGIN_TYPE_PLUGIN, GPluginPluginInterface))
typedef struct _GPluginPlugin GPluginPlugin;
-typedef struct _GPluginPluginClass GPluginPluginClass;
+typedef struct _GPluginPluginInterface GPluginPluginInterface;
typedef enum /*< prefix=GPLUGIN_PLUGIN_STATE,underscore_name=GPLUGIN_PLUGIN_STATE >*/ {
GPLUGIN_PLUGIN_STATE_UNKNOWN = -1,
@@ -52,32 +50,26 @@
#include <gplugin/gplugin-plugin-info.h>
#include <gplugin/gplugin-loader.h>
-struct _GPluginPlugin {
- GObject gparent;
-};
-
-struct _GPluginPluginClass {
- GObjectClass gparent;
+struct _GPluginPluginInterface {
+ /*< private >*/
+ GTypeInterface parent;
void (*state_changed)(GPluginPlugin *plugin, GPluginPluginState oldstate, GPluginPluginState newstate);
- void (*_gplugin_reserved_1)(void);
- void (*_gplugin_reserved_2)(void);
- void (*_gplugin_reserved_3)(void);
- void (*_gplugin_reserved_4)(void);
+ /*< private >*/
+ gpointer reserved[8];
};
G_BEGIN_DECLS
GType gplugin_plugin_get_type(void);
-const gchar *gplugin_plugin_get_filename(GPluginPlugin *plugin);
+gchar *gplugin_plugin_get_filename(GPluginPlugin *plugin);
GPluginLoader *gplugin_plugin_get_loader(GPluginPlugin *plugin);
GPluginPluginInfo *gplugin_plugin_get_info(GPluginPlugin *plugin);
GPluginPluginState gplugin_plugin_get_state(GPluginPlugin *plugin);
void gplugin_plugin_set_state(GPluginPlugin *plugin, GPluginPluginState state);
-GList *gplugin_plugin_get_dependent_plugins(GPluginPlugin *plugin);
G_END_DECLS
--- a/gplugin/gplugin-private.h Mon Oct 08 00:55:11 2018 -0500
+++ b/gplugin/gplugin-private.h Mon Oct 08 20:27:16 2018 -0500
@@ -32,15 +32,12 @@
G_BEGIN_DECLS
-gchar *gplugin_plugin_get_internal_filename(GPluginPlugin *plugin);
-
void gplugin_manager_private_init(void);
void gplugin_manager_private_uninit(void);
gboolean gplugin_boolean_accumulator(GSignalInvocationHint *hint, GValue *return_accu, const GValue *handler_return, gpointer data);
gboolean gplugin_plugin_info_get_bind_local(GPluginPluginInfo *info);
-void gplugin_plugin_add_dependent_plugin(GPluginPlugin *plugin, GPluginPlugin *dependent);
G_END_DECLS
--- a/gplugin/tests/dynamic-type/dynamic-type-provider.c Mon Oct 08 00:55:11 2018 -0500
+++ b/gplugin/tests/dynamic-type/dynamic-type-provider.c Mon Oct 08 20:27:16 2018 -0500
@@ -20,36 +20,20 @@
#include "dynamic-test.h"
-static GType type_real = 0;
+G_DEFINE_DYNAMIC_TYPE(DynamicTest, dynamic_test, G_TYPE_OBJECT);
static void
-dynamic_test_register_type(GPluginNativePlugin *plugin) {
- if(g_once_init_enter(&type_real)) {
- GType type = 0;
-
- static const GTypeInfo info = {
- .class_size = sizeof(DynamicTestClass),
- .instance_size = sizeof(DynamicTest),
- };
-
- type = gplugin_native_plugin_register_type(plugin,
- G_TYPE_OBJECT,
- "DynamicTest",
- &info,
- 0);
-
- g_once_init_leave(&type_real, type);
- }
+dynamic_test_init(DynamicTest *inst) {
+ g_message("instance created");
}
-GType
-dynamic_test_get_type(void) {
- if(G_UNLIKELY(type_real == 0)) {
- g_warning("dynamic_test_get_type was called before "
- "the type was registered!\n");
- }
+static void
+dynamic_test_class_finalize(DynamicTestClass *klass) {
+}
- return type_real;
+static void
+dynamic_test_class_init(DynamicTestClass *klass) {
+ g_message("class created");
}
G_MODULE_EXPORT GPluginPluginInfo *
@@ -63,13 +47,7 @@
G_MODULE_EXPORT gboolean
gplugin_load(GPluginNativePlugin *plugin, GError **error) {
- dynamic_test_register_type(plugin);
-
- if (type_real == 0) {
- *error = g_error_new(GPLUGIN_DOMAIN, 0,
- "type DynamicTest was not registered");
- return FALSE;
- }
+ dynamic_test_register_type(G_TYPE_MODULE(plugin));
return TRUE;
}
--- a/gplugin/tests/test-versioned-dependencies.c Mon Oct 08 00:55:11 2018 -0500
+++ b/gplugin/tests/test-versioned-dependencies.c Mon Oct 08 20:27:16 2018 -0500
@@ -30,20 +30,26 @@
const gchar *id)
{
GPluginPlugin *plugin = NULL;
- GList *l = NULL;
+ GSList *deps = NULL, *l = NULL;
gboolean found = FALSE;
plugin = gplugin_manager_find_plugin("gplugin/test-no-version");
g_assert_cmpint(gplugin_plugin_get_state(plugin), ==,
GPLUGIN_PLUGIN_STATE_LOADED);
- for(l = gplugin_plugin_get_dependent_plugins(plugin); l; l = l->next) {
- if(l->data == dependent)
- found = TRUE;
+ deps = gplugin_manager_get_plugin_dependencies(plugin, NULL);
+ if(deps != NULL) {
+ for(l = deps; l; l = l->next) {
+ if(l->data == dependent) {
+ found = TRUE;
+ }
+ }
+
+ g_slist_free_full(deps, g_object_unref);
+
+ g_assert_true(found);
}
- g_assert(found);
-
g_object_unref(G_OBJECT(plugin));
}
--- a/lua/gplugin-lua-loader.c Mon Oct 08 00:55:11 2018 -0500
+++ b/lua/gplugin-lua-loader.c Mon Oct 08 20:27:16 2018 -0500
@@ -25,11 +25,7 @@
#include <lauxlib.h>
#include <lualib.h>
-/******************************************************************************
- * Globals
- *****************************************************************************/
-static GObjectClass *parent_class = NULL;
-static GType type_real = 0;
+G_DEFINE_DYNAMIC_TYPE(GPluginLuaLoader, gplugin_lua_loader, GPLUGIN_TYPE_LOADER);
/******************************************************************************
* Helpers
@@ -171,7 +167,7 @@
plugin = g_object_new(GPLUGIN_TYPE_LUA_PLUGIN,
"filename", filename,
"loader", loader,
- "state", L,
+ "lua-state", L,
"info", info,
NULL);
@@ -199,11 +195,17 @@
* GObject Stuff
*****************************************************************************/
static void
+gplugin_lua_loader_init(GPluginLuaLoader *loader) {
+}
+
+static void
+gplugin_lua_loader_class_finalize(GPluginLuaLoaderClass *klass) {
+}
+
+static void
gplugin_lua_loader_class_init(GPluginLuaLoaderClass *klass) {
GPluginLoaderClass *loader_class = GPLUGIN_LOADER_CLASS(klass);
- parent_class = g_type_class_peek_parent(klass);
-
loader_class->supported_extensions =
gplugin_lua_loader_class_supported_extensions;
loader_class->query = gplugin_lua_loader_query;
@@ -216,32 +218,5 @@
*****************************************************************************/
void
gplugin_lua_loader_register(GPluginNativePlugin *plugin) {
- if(g_once_init_enter(&type_real)) {
- GType type = 0;
-
- static const GTypeInfo info = {
- .class_size = sizeof(GPluginLuaLoaderClass),
- .class_init = (GClassInitFunc)gplugin_lua_loader_class_init,
- .instance_size = sizeof(GPluginLuaLoader),
- };
-
- type = gplugin_native_plugin_register_type(plugin,
- GPLUGIN_TYPE_LOADER,
- "GPluginLuaLoader",
- &info,
- 0);
-
- g_once_init_leave(&type_real, type);
- }
+ gplugin_lua_loader_register_type(G_TYPE_MODULE(plugin));
}
-
-GType
-gplugin_lua_loader_get_type(void) {
- if(G_UNLIKELY(type_real == 0)) {
- g_warning("gplugin_lua_loader_get_type was called before "
- "the type was registered!\n");
- }
-
- return type_real;
-}
-
--- a/lua/gplugin-lua-loader.h Mon Oct 08 00:55:11 2018 -0500
+++ b/lua/gplugin-lua-loader.h Mon Oct 08 20:27:16 2018 -0500
@@ -32,21 +32,17 @@
#include <gplugin-native.h>
struct _GPluginLuaLoader {
+ /*< private >*/
GPluginLoader parent;
- void (*_gplugin_reserved_1)(void);
- void (*_gplugin_reserved_2)(void);
- void (*_gplugin_reserved_3)(void);
- void (*_gplugin_reserved_4)(void);
+ gpointer reserved[4];
};
struct _GPluginLuaLoaderClass {
+ /*< private >*/
GPluginLoaderClass parent;
- void (*_gplugin_reserved_1)(void);
- void (*_gplugin_reserved_2)(void);
- void (*_gplugin_reserved_3)(void);
- void (*_gplugin_reserved_4)(void);
+ gpointer reserved[4];
};
G_BEGIN_DECLS
--- a/lua/gplugin-lua-plugin.c Mon Oct 08 00:55:11 2018 -0500
+++ b/lua/gplugin-lua-plugin.c Mon Oct 08 20:27:16 2018 -0500
@@ -19,14 +19,16 @@
#include <lua.h>
-#define GPLUGIN_LUA_PLUGIN_GET_PRIVATE(obj) \
- (G_TYPE_INSTANCE_GET_PRIVATE((obj), GPLUGIN_TYPE_LUA_PLUGIN, GPluginLuaPluginPrivate))
-
/******************************************************************************
* Typedefs
*****************************************************************************/
typedef struct {
lua_State *L;
+
+ gchar *filename;
+ GPluginLoader *loader;
+ GPluginPluginInfo *info;
+ GPluginPluginState state;
} GPluginLuaPluginPrivate;
/******************************************************************************
@@ -34,22 +36,33 @@
*****************************************************************************/
enum {
PROP_ZERO,
- PROP_STATE,
+ PROP_LUA_STATE,
N_PROPERTIES,
+ /* overrides */
+ PROP_FILENAME = N_PROPERTIES,
+ PROP_LOADER,
+ PROP_INFO,
+ PROP_STATE
};
static GParamSpec *properties[N_PROPERTIES] = {NULL,};
-static GObjectClass *parent_class = NULL;
-static GType type_real = 0;
+/* I hate forward declarations... */
+static void gplugin_lua_plugin_iface_init(GPluginPluginInterface *iface);
+
+G_DEFINE_DYNAMIC_TYPE_EXTENDED(
+ GPluginLuaPlugin,
+ gplugin_lua_plugin,
+ G_TYPE_OBJECT,
+ 0,
+ G_ADD_PRIVATE_DYNAMIC(GPluginLuaPlugin)
+ G_IMPLEMENT_INTERFACE(GPLUGIN_TYPE_PLUGIN, gplugin_lua_plugin_iface_init)
+);
/******************************************************************************
- * Private Stuff
+ * GPluginPlugin Implementation
*****************************************************************************/
static void
-gplugin_lua_plugin_set_state(GPluginLuaPlugin *plugin, lua_State *L) {
- GPluginLuaPluginPrivate *priv = GPLUGIN_LUA_PLUGIN_GET_PRIVATE(plugin);
-
- priv->L = L;
+gplugin_lua_plugin_iface_init(GPluginPluginInterface *iface) {
}
/******************************************************************************
@@ -60,12 +73,27 @@
GParamSpec *pspec)
{
GPluginLuaPlugin *plugin = GPLUGIN_LUA_PLUGIN(obj);
+ GPluginLuaPluginPrivate *priv = gplugin_lua_plugin_get_instance_private(plugin);
switch(param_id) {
+ case PROP_LUA_STATE:
+ g_value_set_pointer(value, priv->L);
+ break;
+
+ /* overrides */
+ case PROP_FILENAME:
+ g_value_set_string(value, priv->filename);
+ break;
+ case PROP_LOADER:
+ g_value_set_object(value, priv->loader);
+ break;
+ case PROP_INFO:
+ g_value_set_object(value, priv->info);
+ break;
case PROP_STATE:
- g_value_set_pointer(value,
- gplugin_lua_plugin_get_state(plugin));
+ g_value_set_enum(value, priv->state);
break;
+
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec);
break;
@@ -77,12 +105,27 @@
const GValue *value, GParamSpec *pspec)
{
GPluginLuaPlugin *plugin = GPLUGIN_LUA_PLUGIN(obj);
+ GPluginLuaPluginPrivate *priv = gplugin_lua_plugin_get_instance_private(plugin);
switch(param_id) {
+ case PROP_LUA_STATE:
+ priv->L = g_value_get_pointer(value);
+ break;
+
+ /* overrides */
+ case PROP_FILENAME:
+ priv->filename = g_strdup(g_value_get_string(value));
+ break;
+ case PROP_LOADER:
+ priv->loader = g_object_ref(g_value_get_object(value));
+ break;
+ case PROP_INFO:
+ priv->info = g_object_ref(g_value_get_object(value));
+ break;
case PROP_STATE:
- gplugin_lua_plugin_set_state(plugin,
- g_value_get_pointer(value));
+ priv->state = g_value_get_enum(value);
break;
+
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec);
break;
@@ -91,12 +134,24 @@
static void
gplugin_lua_plugin_finalize(GObject *obj) {
- GPluginLuaPluginPrivate *priv = GPLUGIN_LUA_PLUGIN_GET_PRIVATE(obj);
+ GPluginLuaPluginPrivate *priv = gplugin_lua_plugin_get_instance_private(GPLUGIN_LUA_PLUGIN(obj));
if(priv->L)
lua_close(priv->L);
- G_OBJECT_CLASS(parent_class)->finalize(obj);
+ g_free(priv->filename);
+ g_object_unref(G_OBJECT(priv->loader));
+ g_object_unref(G_OBJECT(priv->info));
+
+ G_OBJECT_CLASS(gplugin_lua_plugin_parent_class)->finalize(obj);
+}
+
+static void
+gplugin_lua_plugin_init(GPluginLuaPlugin *plugin) {
+}
+
+static void
+gplugin_lua_plugin_class_finalize(GPluginLuaPluginClass *klass) {
}
static void
@@ -107,53 +162,36 @@
obj_class->set_property = gplugin_lua_plugin_set_property;
obj_class->finalize = gplugin_lua_plugin_finalize;
- properties[PROP_STATE] = g_param_spec_pointer(
- "state", "state",
+ properties[PROP_LUA_STATE] = g_param_spec_pointer(
+ "lua-state", "lua-state",
"The lua state for the plugin",
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY
);
g_object_class_install_properties(obj_class, N_PROPERTIES, properties);
+
+ /* add our overrides */
+ g_object_class_override_property(obj_class, PROP_FILENAME, "filename");
+ g_object_class_override_property(obj_class, PROP_LOADER, "loader");
+ g_object_class_override_property(obj_class, PROP_INFO, "info");
+ g_object_class_override_property(obj_class, PROP_STATE, "state");
}
/******************************************************************************
* API
*****************************************************************************/
void
-gplugin_lua_plugin_register(GPluginNativePlugin *plugin) {
- if(g_once_init_enter(&type_real)) {
- GType type = 0;
-
- static const GTypeInfo info = {
- .class_size = sizeof(GPluginLuaPluginClass),
- .class_init = (GClassInitFunc)gplugin_lua_plugin_class_init,
- .instance_size = sizeof(GPluginLuaPlugin),
- };
-
- type = gplugin_native_plugin_register_type(plugin,
- GPLUGIN_TYPE_PLUGIN,
- "GPluginLuaPlugin",
- &info,
- 0);
-
- g_once_init_leave(&type_real, type);
- }
-}
-
-GType
-gplugin_lua_plugin_get_type(void) {
- if(G_UNLIKELY(type_real == 0)) {
- g_warning("gplugin_lua_plugin_get_type was called before "
- "the type was registered!\n");
- }
-
- return type_real;
+gplugin_lua_plugin_register(GPluginNativePlugin *native) {
+ gplugin_lua_plugin_register_type(G_TYPE_MODULE(native));
}
lua_State *
-gplugin_lua_plugin_get_state(const GPluginLuaPlugin *plugin) {
- GPluginLuaPluginPrivate *priv = GPLUGIN_LUA_PLUGIN_GET_PRIVATE(plugin);
+gplugin_lua_plugin_get_state(GPluginLuaPlugin *plugin) {
+ GPluginLuaPluginPrivate *priv = NULL;
+
+ g_return_val_if_fail(GPLUGIN_IS_LUA_PLUGIN(plugin), NULL);
+
+ priv = gplugin_lua_plugin_get_instance_private(plugin);
return priv->L;
}
-
--- a/lua/gplugin-lua-plugin.h Mon Oct 08 00:55:11 2018 -0500
+++ b/lua/gplugin-lua-plugin.h Mon Oct 08 20:27:16 2018 -0500
@@ -34,24 +34,25 @@
#include <lua.h>
struct _GPluginLuaPlugin {
- GPluginPlugin parent;
+ /*< private >*/
+ GObject parent;
+
+ gpointer reserved[4];
};
struct _GPluginLuaPluginClass {
- GPluginPluginClass parent;
+ /*< private >*/
+ GObjectClass parent;
- void (*_gplugin_reserved_1)(void);
- void (*_gplugin_reserved_2)(void);
- void (*_gplugin_reserved_3)(void);
- void (*_gplugin_reserved_4)(void);
+ gpointer reserved[4];
};
G_BEGIN_DECLS
-void gplugin_lua_plugin_register(GPluginNativePlugin *plugin);
+void gplugin_lua_plugin_register(GPluginNativePlugin *native);
GType gplugin_lua_plugin_get_type(void);
-lua_State *gplugin_lua_plugin_get_state(const GPluginLuaPlugin *plugin);
+lua_State *gplugin_lua_plugin_get_state(GPluginLuaPlugin *plugin);
G_END_DECLS
--- a/python/gplugin-python-loader.c Mon Oct 08 00:55:11 2018 -0500
+++ b/python/gplugin-python-loader.c Mon Oct 08 20:27:16 2018 -0500
@@ -28,25 +28,21 @@
#include <pygobject.h>
-#define GPLUGIN_PYTHON_LOADER_GET_PRIVATE(obj) \
- (G_TYPE_INSTANCE_GET_PRIVATE((obj), GPLUGIN_TYPE_PYTHON_LOADER, GPluginPythonLoaderPrivate))
-
-/******************************************************************************
- * Typedefs
- *****************************************************************************/
typedef struct {
PyThreadState *py_thread_state;
guint gc_id;
} GPluginPythonLoaderPrivate;
-/******************************************************************************
- * Globals
- *****************************************************************************/
-static GObjectClass *parent_class = NULL;
-static GType type_real = 0;
+G_DEFINE_DYNAMIC_TYPE_EXTENDED(
+ GPluginPythonLoader,
+ gplugin_python_loader,
+ GPLUGIN_TYPE_LOADER,
+ 0,
+ G_ADD_PRIVATE_DYNAMIC(GPluginPythonLoader)
+);
/******************************************************************************
- * GPluginLoaderInterface API
+ * GPluginLoader Implementation
*****************************************************************************/
static GSList *
gplugin_python_loader_class_supported_extensions(GPLUGIN_UNUSED const GPluginLoaderClass *klass) {
@@ -357,26 +353,16 @@
* Object Stuff
*****************************************************************************/
static void
-gplugin_python_loader_finalize(GObject *obj) {
-#if 0
- GPluginPythonLoaderPrivate *priv =
- GPLUGIN_PYTHON_LOADER_GET_PRIVATE(obj);
-#endif
+gplugin_python_loader_init(GPluginPythonLoader *loader) {
+}
- G_OBJECT_CLASS(parent_class)->finalize(obj);
+static void
+gplugin_python_loader_class_finalize(GPluginPythonLoaderClass *klass) {
}
static void
gplugin_python_loader_class_init(GPluginPythonLoaderClass *klass) {
- GObjectClass *obj_class = G_OBJECT_CLASS(klass);
- GPluginLoaderClass *loader_class =
- GPLUGIN_LOADER_CLASS(klass);
-
- parent_class = g_type_class_peek_parent(klass);
-
- g_type_class_add_private(klass, sizeof(GPluginPythonLoaderPrivate));
-
- obj_class->finalize = gplugin_python_loader_finalize;
+ GPluginLoaderClass *loader_class = GPLUGIN_LOADER_CLASS(klass);
loader_class->supported_extensions =
gplugin_python_loader_class_supported_extensions;
@@ -389,35 +375,9 @@
* API
*****************************************************************************/
void
-gplugin_python_loader_register(GPluginNativePlugin *plugin) {
- if(g_once_init_enter(&type_real)) {
- GType type = 0;
-
- static const GTypeInfo info = {
- .class_size = sizeof(GPluginPythonLoaderClass),
- .class_init = (GClassInitFunc)gplugin_python_loader_class_init,
- .instance_size = sizeof(GPluginPythonLoader),
- };
+gplugin_python_loader_register(GPluginNativePlugin *native) {
+ gplugin_python_loader_register_type(G_TYPE_MODULE(native));
- type = gplugin_native_plugin_register_type(plugin,
- GPLUGIN_TYPE_LOADER,
- "GPluginPythonLoader",
- &info,
- 0);
-
- gplugin_python_loader_init_python();
-
- g_once_init_leave(&type_real, type);
- }
+ gplugin_python_loader_init_python();
}
-GType
-gplugin_python_loader_get_type(void) {
- if(G_UNLIKELY(type_real == 0)) {
- g_warning("gplugin_python_loader_get_type was called before "
- "the type was registered!\n");
- }
-
- return type_real;
-}
-
--- a/python/gplugin-python-loader.h Mon Oct 08 00:55:11 2018 -0500
+++ b/python/gplugin-python-loader.h Mon Oct 08 20:27:16 2018 -0500
@@ -32,26 +32,22 @@
#include <gplugin-native.h>
struct _GPluginPythonLoader {
+ /*< private >*/
GPluginLoader parent;
- void (*_gplugin_reserved_1)(void);
- void (*_gplugin_reserved_2)(void);
- void (*_gplugin_reserved_3)(void);
- void (*_gplugin_reserved_4)(void);
+ gpointer reserved[4];
};
struct _GPluginPythonLoaderClass {
+ /*< private >*/
GPluginLoaderClass parent;
- void (*_gplugin_reserved_1)(void);
- void (*_gplugin_reserved_2)(void);
- void (*_gplugin_reserved_3)(void);
- void (*_gplugin_reserved_4)(void);
+ gpointer reserved[4];
};
G_BEGIN_DECLS
-void gplugin_python_loader_register(GPluginNativePlugin *plugin);
+void gplugin_python_loader_register(GPluginNativePlugin *native);
GType gplugin_python_loader_get_type(void);
G_END_DECLS
--- a/python/gplugin-python-plugin.c Mon Oct 08 00:55:11 2018 -0500
+++ b/python/gplugin-python-plugin.c Mon Oct 08 20:27:16 2018 -0500
@@ -21,9 +21,6 @@
#include <pygobject.h>
-#define GPLUGIN_PYTHON_PLUGIN_GET_PRIVATE(obj) \
- (G_TYPE_INSTANCE_GET_PRIVATE((obj), GPLUGIN_TYPE_PYTHON_PLUGIN, GPluginPythonPluginPrivate))
-
/******************************************************************************
* Typedefs
*****************************************************************************/
@@ -32,6 +29,12 @@
PyObject *query;
PyObject *load;
PyObject *unload;
+
+ /* overrides */
+ gchar *filename;
+ GPluginLoader *loader;
+ GPluginPluginInfo *info;
+ GPluginPluginState state;
} GPluginPythonPluginPrivate;
/******************************************************************************
@@ -43,22 +46,43 @@
PROP_LOAD_FUNC,
PROP_UNLOAD_FUNC,
N_PROPERTIES,
+ /* overrides */
+ PROP_FILENAME = N_PROPERTIES,
+ PROP_LOADER,
+ PROP_INFO,
+ PROP_STATE
};
static GParamSpec *properties[N_PROPERTIES] = {NULL,};
-static GObjectClass *parent_class = NULL;
-static GType type_real = 0;
+/* I hate forward declarations... */
+static void gplugin_python_plugin_iface_init(GPluginPluginInterface *iface);
+
+G_DEFINE_DYNAMIC_TYPE_EXTENDED(
+ GPluginPythonPlugin,
+ gplugin_python_plugin,
+ G_TYPE_OBJECT,
+ 0,
+ G_ADD_PRIVATE_DYNAMIC(GPluginPythonPlugin)
+ G_IMPLEMENT_INTERFACE(GPLUGIN_TYPE_PLUGIN, gplugin_python_plugin_iface_init)
+);
+
+/******************************************************************************
+ * GPluginPlugin Implementation
+ *****************************************************************************/
+static void
+gplugin_python_plugin_iface_init(GPluginPluginInterface *iface) {
+}
/******************************************************************************
* Private Stuff
*****************************************************************************/
static PyObject *
-gplugin_python_plugin_get_module(const GPluginPythonPlugin *plugin) {
+gplugin_python_plugin_get_module(GPluginPythonPlugin *plugin) {
GPluginPythonPluginPrivate *priv = NULL;
g_return_val_if_fail(GPLUGIN_IS_PYTHON_PLUGIN(plugin), NULL);
- priv = GPLUGIN_PYTHON_PLUGIN_GET_PRIVATE(plugin);
+ priv = gplugin_python_plugin_get_instance_private(plugin);
return priv->module;
}
@@ -72,7 +96,7 @@
g_return_if_fail(GPLUGIN_IS_PLUGIN(plugin));
g_return_if_fail(module);
- priv = GPLUGIN_PYTHON_PLUGIN_GET_PRIVATE(plugin);
+ priv = gplugin_python_plugin_get_instance_private(plugin);
if(priv->module)
Py_DECREF(priv->module);
@@ -84,12 +108,12 @@
}
static gpointer
-gplugin_python_plugin_get_load_func(const GPluginPythonPlugin *plugin) {
+gplugin_python_plugin_get_load_func(GPluginPythonPlugin *plugin) {
GPluginPythonPluginPrivate *priv = NULL;
g_return_val_if_fail(GPLUGIN_IS_PYTHON_PLUGIN(plugin), NULL);
- priv = GPLUGIN_PYTHON_PLUGIN_GET_PRIVATE(plugin);
+ priv = gplugin_python_plugin_get_instance_private(plugin);
return priv->load;
}
@@ -103,7 +127,7 @@
g_return_if_fail(GPLUGIN_IS_PYTHON_PLUGIN(plugin));
g_return_if_fail(func != NULL);
- priv = GPLUGIN_PYTHON_PLUGIN_GET_PRIVATE(plugin);
+ priv = gplugin_python_plugin_get_instance_private(plugin);
if(priv->load)
Py_DECREF(priv->load);
@@ -114,12 +138,12 @@
}
static gpointer
-gplugin_python_plugin_get_unload_func(const GPluginPythonPlugin *plugin) {
+gplugin_python_plugin_get_unload_func(GPluginPythonPlugin *plugin) {
GPluginPythonPluginPrivate *priv = NULL;
g_return_val_if_fail(GPLUGIN_IS_PYTHON_PLUGIN(plugin), NULL);
- priv = GPLUGIN_PYTHON_PLUGIN_GET_PRIVATE(plugin);
+ priv = gplugin_python_plugin_get_instance_private(plugin);
return priv->unload;
}
@@ -133,7 +157,7 @@
g_return_if_fail(GPLUGIN_IS_PYTHON_PLUGIN(plugin));
g_return_if_fail(func != NULL);
- priv = GPLUGIN_PYTHON_PLUGIN_GET_PRIVATE(plugin);
+ priv = gplugin_python_plugin_get_instance_private(plugin);
if(priv->unload)
Py_DECREF(priv->unload);
@@ -151,6 +175,7 @@
GParamSpec *pspec)
{
GPluginPythonPlugin *plugin = GPLUGIN_PYTHON_PLUGIN(obj);
+ GPluginPythonPluginPrivate *priv = gplugin_python_plugin_get_instance_private(plugin);
switch(param_id) {
case PROP_MODULE:
@@ -165,6 +190,21 @@
g_value_set_pointer(value,
gplugin_python_plugin_get_unload_func(plugin));
break;
+
+ /* overrides */
+ case PROP_FILENAME:
+ g_value_set_string(value, priv->filename);
+ break;
+ case PROP_LOADER:
+ g_value_set_object(value, priv->loader);
+ break;
+ case PROP_INFO:
+ g_value_set_object(value, priv->info);
+ break;
+ case PROP_STATE:
+ g_value_set_enum(value, priv->state);
+ break;
+
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec);
break;
@@ -176,6 +216,7 @@
const GValue *value, GParamSpec *pspec)
{
GPluginPythonPlugin *plugin = GPLUGIN_PYTHON_PLUGIN(obj);
+ GPluginPythonPluginPrivate *priv = gplugin_python_plugin_get_instance_private(plugin);
switch(param_id) {
case PROP_MODULE:
@@ -190,6 +231,21 @@
gplugin_python_plugin_set_unload_func(plugin,
g_value_get_pointer(value));
break;
+
+ /* overrides */
+ case PROP_FILENAME:
+ priv->filename = g_strdup(g_value_get_string(value));
+ break;
+ case PROP_LOADER:
+ priv->loader = g_object_ref(g_value_get_object(value));
+ break;
+ case PROP_INFO:
+ priv->info = g_object_ref(g_value_get_object(value));
+ break;
+ case PROP_STATE:
+ priv->state = g_value_get_enum(value);
+ break;
+
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec);
break;
@@ -198,8 +254,7 @@
static void
gplugin_python_plugin_finalize(GObject *obj) {
- GPluginPythonPluginPrivate *priv =
- GPLUGIN_PYTHON_PLUGIN_GET_PRIVATE(obj);
+ GPluginPythonPluginPrivate *priv = gplugin_python_plugin_get_instance_private(GPLUGIN_PYTHON_PLUGIN(obj));
if(priv->module)
Py_DECREF(priv->module);
@@ -208,17 +263,25 @@
if(priv->unload)
Py_DECREF(priv->unload);
- G_OBJECT_CLASS(parent_class)->finalize(obj);
+ g_free(priv->filename);
+ g_object_unref(G_OBJECT(priv->loader));
+ g_object_unref(G_OBJECT(priv->info));
+
+ G_OBJECT_CLASS(gplugin_python_plugin_parent_class)->finalize(obj);
+}
+
+static void
+gplugin_python_plugin_init(GPluginPythonPlugin *plugin) {
+}
+
+static void
+gplugin_python_plugin_class_finalize(GPluginPythonPluginClass *klass) {
}
static void
gplugin_python_plugin_class_init(GPluginPythonPluginClass *klass) {
GObjectClass *obj_class = G_OBJECT_CLASS(klass);
- parent_class = g_type_class_peek_parent(klass);
-
- g_type_class_add_private(klass, sizeof(GPluginPythonPluginPrivate));
-
obj_class->get_property = gplugin_python_plugin_get_property;
obj_class->set_property = gplugin_python_plugin_set_property;
obj_class->finalize = gplugin_python_plugin_finalize;
@@ -242,39 +305,18 @@
);
g_object_class_install_properties(obj_class, N_PROPERTIES, properties);
+
+ /* add our overrides */
+ g_object_class_override_property(obj_class, PROP_FILENAME, "filename");
+ g_object_class_override_property(obj_class, PROP_LOADER, "loader");
+ g_object_class_override_property(obj_class, PROP_INFO, "info");
+ g_object_class_override_property(obj_class, PROP_STATE, "state");
}
/******************************************************************************
* API
*****************************************************************************/
void
-gplugin_python_plugin_register(GPluginNativePlugin *plugin) {
- if(g_once_init_enter(&type_real)) {
- GType type = 0;
-
- static const GTypeInfo info = {
- .class_size = sizeof(GPluginPythonPluginClass),
- .class_init = (GClassInitFunc)gplugin_python_plugin_class_init,
- .instance_size = sizeof(GPluginPythonPlugin),
- };
-
- type = gplugin_native_plugin_register_type(plugin,
- GPLUGIN_TYPE_PLUGIN,
- "GPluginPythonPlugin",
- &info,
- 0);
-
- g_once_init_leave(&type_real, type);
- }
+gplugin_python_plugin_register(GPluginNativePlugin *native) {
+ gplugin_python_plugin_register_type(G_TYPE_MODULE(native));
}
-
-GType
-gplugin_python_plugin_get_type(void) {
- if(G_UNLIKELY(type_real == 0)) {
- g_warning("gplugin_python_plugin_get_type was called before "
- "the type was registered!\n");
- }
-
- return type_real;
-}
-
--- a/python/gplugin-python-plugin.h Mon Oct 08 00:55:11 2018 -0500
+++ b/python/gplugin-python-plugin.h Mon Oct 08 20:27:16 2018 -0500
@@ -32,21 +32,22 @@
#include <gplugin-native.h>
struct _GPluginPythonPlugin {
- GPluginPlugin parent;
+ /*< private >*/
+ GObject parent;
+
+ gpointer reserved[4];
};
struct _GPluginPythonPluginClass {
- GPluginPluginClass parent;
+ /*< private >*/
+ GObjectClass parent;
- void (*_gplugin_reserved_1)(void);
- void (*_gplugin_reserved_2)(void);
- void (*_gplugin_reserved_3)(void);
- void (*_gplugin_reserved_4)(void);
+ gpointer reserved[4];
};
G_BEGIN_DECLS
-void gplugin_python_plugin_register(GPluginNativePlugin *plugin);
+void gplugin_python_plugin_register(GPluginNativePlugin *native);
GType gplugin_python_plugin_get_type(void);
G_END_DECLS