Пример #1
0
static PyObject *
_wrap_g_object_info_get_interfaces (PyGIBaseInfo *self)
{
    gssize n_infos;
    PyObject *infos;
    gssize i;

    n_infos = g_object_info_get_n_interfaces ( (GIObjectInfo *) self->info);

    infos = PyTuple_New (n_infos);
    if (infos == NULL) {
        return NULL;
    }

    for (i = 0; i < n_infos; i++) {
        GIBaseInfo *info;
        PyObject *py_info;

        info = (GIBaseInfo *) g_object_info_get_interface ( (GIObjectInfo *) self->info, i);
        g_assert (info != NULL);

        py_info = _pygi_info_new (info);

        g_base_info_unref (info);

        if (py_info == NULL) {
            Py_CLEAR (infos);
            break;
        }

        PyTuple_SET_ITEM (infos, i, py_info);
    }

    return infos;
}
Пример #2
0
/**
 * 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;
}