summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJasper St. Pierre <jstpierre@mecheye.net>2012-01-04 14:46:51 -0500
committerJasper St. Pierre <jstpierre@mecheye.net>2012-02-03 11:52:33 -0500
commit6920430e7034bba42258c7b010347037b1641fb1 (patch)
treebde4b494451fbaf8d12ab2a36c8ac1e24e5eaa02
parent8e34268de5c57095a0dfb89df4f77480bc823a84 (diff)
downloadgobject-introspection-6920430e7034bba42258c7b010347037b1641fb1.tar.gz
giobjectinfo: Add g_object_info_find_vfunc_using_interfaces
As an analogue to g_object_info_find_method_using_interfaces, add a new API so that we can find a vfunc using the same strategy.
-rw-r--r--girepository/giobjectinfo.c60
-rw-r--r--girepository/giobjectinfo.h3
2 files changed, 63 insertions, 0 deletions
diff --git a/girepository/giobjectinfo.c b/girepository/giobjectinfo.c
index 4aca8bd4..32a5b0c5 100644
--- a/girepository/giobjectinfo.c
+++ b/girepository/giobjectinfo.c
@@ -660,6 +660,66 @@ g_object_info_find_vfunc (GIObjectInfo *info,
}
/**
+ * g_object_info_find_vfunc_using_interfaces:
+ * @info: a #GIObjectInfo
+ * @name: name of method to obtain
+ * @implementor: (out) (transfer full): The implementor of the interface
+ *
+ * Locate a virtual function slot with name @name, searching both the object
+ * @info and any interfaces it implements. Note that the namespace for
+ * virtuals is distinct from that of methods; there may or may not be a
+ * concrete method associated for a virtual. If there is one, it may be
+ * retrieved using g_vfunc_info_get_invoker(), otherwise %NULL will be
+ * returned.
+ *
+ * Note that this function does *not* search parent classes; you will have
+ * to chain up if that's desired.
+ *
+ * Returns: (transfer full): the #GIFunctionInfo. Free the struct by calling
+ * g_base_info_unref() when done.
+ */
+GIVFuncInfo *
+g_object_info_find_vfunc_using_interfaces (GIObjectInfo *info,
+ const gchar *name,
+ GIObjectInfo **implementor)
+{
+ GIVFuncInfo *result = NULL;
+ GIObjectInfo *implementor_result = NULL;
+
+ result = g_object_info_find_vfunc (info, name);
+ if (result)
+ implementor_result = g_base_info_ref ((GIBaseInfo*) info);
+
+ if (result == NULL)
+ {
+ int n_interfaces;
+ int i;
+
+ n_interfaces = g_object_info_get_n_interfaces (info);
+ for (i = 0; i < n_interfaces; ++i)
+ {
+ GIInterfaceInfo *iface_info;
+
+ iface_info = g_object_info_get_interface (info, i);
+
+ result = g_interface_info_find_vfunc (iface_info, name);
+
+ if (result != NULL)
+ {
+ implementor_result = iface_info;
+ break;
+ }
+ g_base_info_unref ((GIBaseInfo*) iface_info);
+ }
+ }
+ if (implementor)
+ *implementor = implementor_result;
+ else if (implementor_result != NULL)
+ g_base_info_unref ((GIBaseInfo*) implementor_result);
+ return result;
+}
+
+/**
* g_object_info_get_n_constants:
* @info: a #GIObjectInfo
*
diff --git a/girepository/giobjectinfo.h b/girepository/giobjectinfo.h
index fd35ef8f..569c0839 100644
--- a/girepository/giobjectinfo.h
+++ b/girepository/giobjectinfo.h
@@ -108,6 +108,9 @@ GIVFuncInfo * g_object_info_get_vfunc (GIObjectInfo *info,
gint n);
GIVFuncInfo * g_object_info_find_vfunc (GIObjectInfo *info,
const gchar *name);
+GIVFuncInfo * g_object_info_find_vfunc_using_interfaces (GIObjectInfo *info,
+ const gchar *name,
+ GIObjectInfo **implementor);
gint g_object_info_get_n_constants (GIObjectInfo *info);
GIConstantInfo * g_object_info_get_constant (GIObjectInfo *info,
gint n);