summaryrefslogtreecommitdiff
path: root/libpeas/peas-utils.c
diff options
context:
space:
mode:
authorGarrett Regier <garrettregier@gmail.com>2017-03-24 12:41:09 -0700
committerGarrett Regier <garrettregier@gmail.com>2017-03-24 21:27:15 -0700
commit7e7e850d24a930ffdaf04d0feaf6607fe797f30e (patch)
treedbde908fd4a0969afe0ee49fd668a1f74f540009 /libpeas/peas-utils.c
parent743ca63655ac23c24efed5aad33479fa1f4faadf (diff)
downloadlibpeas-7e7e850d24a930ffdaf04d0feaf6607fe797f30e.tar.gz
Allow extensions to be an Abstract Base Class
https://bugzilla.gnome.org/show_bug.cgi?id=767223
Diffstat (limited to 'libpeas/peas-utils.c')
-rw-r--r--libpeas/peas-utils.c40
1 files changed, 33 insertions, 7 deletions
diff --git a/libpeas/peas-utils.c b/libpeas/peas-utils.c
index 1051d20..7d3bd91 100644
--- a/libpeas/peas-utils.c
+++ b/libpeas/peas-utils.c
@@ -91,6 +91,34 @@ add_all_prerequisites (GType iface_type,
g_free (prereq);
}
+static GPtrArray *
+find_base_type_and_interfaces (GType exten_type,
+ GType *base_type)
+{
+ GPtrArray *ifaces;
+ GType *interfaces;
+ gint i;
+
+ ifaces = g_ptr_array_new ();
+ g_ptr_array_set_free_func (ifaces,
+ (GDestroyNotify) g_type_default_interface_unref);
+
+ if (G_TYPE_IS_INTERFACE (exten_type))
+ {
+ add_all_prerequisites (exten_type, base_type, ifaces);
+ return ifaces;
+ }
+
+ interfaces = g_type_interfaces (exten_type, NULL);
+ for (i = 0; interfaces[i] != G_TYPE_INVALID; ++i)
+ add_all_prerequisites (exten_type, base_type, ifaces);
+
+ *base_type = exten_type;
+
+ g_free (interfaces);
+ return ifaces;
+}
+
static GParamSpec *
find_param_spec_for_prerequisites (const gchar *name,
GObjectClass *klass,
@@ -113,7 +141,7 @@ find_param_spec_for_prerequisites (const gchar *name,
}
gboolean
-peas_utils_valist_to_parameter_list (GType iface_type,
+peas_utils_valist_to_parameter_list (GType exten_type,
const gchar *first_property,
va_list args,
GParameter **params,
@@ -125,12 +153,10 @@ peas_utils_valist_to_parameter_list (GType iface_type,
const gchar *name;
guint n_allocated_params;
- g_return_val_if_fail (G_TYPE_IS_INTERFACE (iface_type), FALSE);
+ g_return_val_if_fail (G_TYPE_IS_INTERFACE (exten_type) ||
+ G_TYPE_IS_OBJECT (exten_type), FALSE);
- ifaces = g_ptr_array_new ();
- g_ptr_array_set_free_func (ifaces,
- (GDestroyNotify) g_type_default_interface_unref);
- add_all_prerequisites (iface_type, &base_type, ifaces);
+ ifaces = find_base_type_and_interfaces (exten_type, &base_type);
if (base_type != G_TYPE_INVALID)
klass = g_type_class_ref (base_type);
@@ -150,7 +176,7 @@ peas_utils_valist_to_parameter_list (GType iface_type,
if (!pspec)
{
g_warning ("%s: type '%s' has no property named '%s'",
- G_STRFUNC, g_type_name (iface_type), name);
+ G_STRFUNC, g_type_name (exten_type), name);
goto error;
}