diff options
author | Jasper St. Pierre <jstpierre@mecheye.net> | 2012-01-04 14:46:51 -0500 |
---|---|---|
committer | Jasper St. Pierre <jstpierre@mecheye.net> | 2012-02-03 11:52:33 -0500 |
commit | 6920430e7034bba42258c7b010347037b1641fb1 (patch) | |
tree | bde4b494451fbaf8d12ab2a36c8ac1e24e5eaa02 /girepository | |
parent | 8e34268de5c57095a0dfb89df4f77480bc823a84 (diff) | |
download | gobject-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.
Diffstat (limited to 'girepository')
-rw-r--r-- | girepository/giobjectinfo.c | 60 | ||||
-rw-r--r-- | girepository/giobjectinfo.h | 3 |
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); |