summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorColin Walters <walters@verbum.org>2010-10-22 14:22:19 -0400
committerColin Walters <walters@verbum.org>2010-12-06 10:09:50 -0500
commitef97d3e097dccf44d790b2ab02d12189f9a04a6c (patch)
tree644bf4193d1c722912fb6d3cdeaafc23d7e89770
parent22d35e6b914ef9d0277758dcd9c197b5775a1ab9 (diff)
downloadgobject-introspection-ef97d3e097dccf44d790b2ab02d12189f9a04a6c.tar.gz
g_object_info_find_method_using_interfaces: New function
Pull this down into introspection from gjs; this will allow us to cache this better in the future (for example, by caching the infos for interfaces in the info for the object). https://bugzilla.gnome.org/show_bug.cgi?id=632924
-rw-r--r--girepository/giobjectinfo.c57
-rw-r--r--girepository/giobjectinfo.h5
2 files changed, 62 insertions, 0 deletions
diff --git a/girepository/giobjectinfo.c b/girepository/giobjectinfo.c
index e1f0bc1d..d6bdce66 100644
--- a/girepository/giobjectinfo.c
+++ b/girepository/giobjectinfo.c
@@ -414,6 +414,63 @@ g_object_info_find_method (GIObjectInfo *info,
}
/**
+ * g_object_info_find_method_using_interfaces:
+ * @info: a #GIObjectInfo
+ * @name: name of method to obtain
+ * @implementor: (out) (transfer full): The implementor of the interface
+ *
+ * Obtain a method of the object given a @name, searching both the
+ * object @info and any interfaces it implements. %NULL will be
+ * returned if there's no method available with that name.
+ *
+ * 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.
+ */
+GIFunctionInfo *
+g_object_info_find_method_using_interfaces (GIObjectInfo *info,
+ const gchar *name,
+ GIObjectInfo **implementor)
+{
+ GIFunctionInfo *result = NULL;
+ GIObjectInfo *implementor_result = NULL;
+
+ result = g_object_info_find_method (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_method (iface_info, name);
+
+ if (result != NULL)
+ {
+ implementor_result = iface_info;
+ break;
+ }
+ g_base_info_unref ((GIBaseInfo*) iface_info);
+ }
+ }
+ if (implementor)
+ *implementor = implementor_result;
+ else
+ g_base_info_unref ((GIBaseInfo*) implementor_result);
+ return result;
+}
+
+/**
* g_object_info_get_n_signals:
* @info: a #GIObjectInfo
*
diff --git a/girepository/giobjectinfo.h b/girepository/giobjectinfo.h
index 09e4bec9..fd35ef8f 100644
--- a/girepository/giobjectinfo.h
+++ b/girepository/giobjectinfo.h
@@ -91,6 +91,11 @@ GIFunctionInfo * g_object_info_get_method (GIObjectInfo *info,
gint n);
GIFunctionInfo * g_object_info_find_method (GIObjectInfo *info,
const gchar *name);
+
+GIFunctionInfo * g_object_info_find_method_using_interfaces (GIObjectInfo *info,
+ const gchar *name,
+ GIObjectInfo **implementor);
+
gint g_object_info_get_n_signals (GIObjectInfo *info);
GISignalInfo * g_object_info_get_signal (GIObjectInfo *info,
gint n);