[gobject-introspection/wip/gobj-kitchen-sink: 2/5] giobjectinfo: Add g_object_info_find_vfunc_using_interfaces



commit 6920430e7034bba42258c7b010347037b1641fb1
Author: Jasper St. Pierre <jstpierre mecheye net>
Date:   Wed Jan 4 14:46:51 2012 -0500

    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.

 girepository/giobjectinfo.c |   60 +++++++++++++++++++++++++++++++++++++++++++
 girepository/giobjectinfo.h |    3 ++
 2 files changed, 63 insertions(+), 0 deletions(-)
---
diff --git a/girepository/giobjectinfo.c b/girepository/giobjectinfo.c
index 4aca8bd..32a5b0c 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 fd35ef8..569c083 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);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]