giobjectinfo: Add g_object_info_find_vfunc_using_interfaces
authorJasper St. Pierre <jstpierre@mecheye.net>
Wed, 4 Jan 2012 19:46:51 +0000 (14:46 -0500)
committerJasper St. Pierre <jstpierre@mecheye.net>
Fri, 3 Feb 2012 16:52:33 +0000 (11:52 -0500)
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
girepository/giobjectinfo.h

index 4aca8bd..32a5b0c 100644 (file)
@@ -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
  *
index fd35ef8..569c083 100644 (file)
@@ -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);