Example #1
0
/**
 * peas_extension_get_extension_type:
 * @exten: A #PeasExtension.
 *
 * Get the type of the extension interface of the object proxied by @exten.
 *
 * Return value: The #GType proxied by @exten.
 */
GType
peas_extension_get_extension_type (PeasExtension *exten)
{
  if (PEAS_IS_EXTENSION_WRAPPER (exten))
    {
      return peas_extension_wrapper_get_extension_type (PEAS_EXTENSION_WRAPPER (exten));
    }
  else
    {
      return (GType) g_object_get_data (G_OBJECT (exten), "peas-extension-type");
    }
}
static void
handle_method_impl (ffi_cif  *cif,
                    gpointer  result,
                    gpointer *args,
                    gpointer  data)
{
  MethodImpl *impl = (MethodImpl *) data;
  GIArgInfo arg_info;
  GITypeInfo type_info;
  GITypeInfo return_type_info;
  gint n_args, i;
  PeasExtensionWrapper *instance;
  GIArgument *arguments;
  GIArgument return_value;
  gboolean success;

  instance = *((PeasExtensionWrapper **) args[0]);
  g_assert (PEAS_IS_EXTENSION_WRAPPER (instance));

  n_args = g_callable_info_get_n_args (impl->invoker_info);
  g_return_if_fail (n_args >= 0);
  arguments = g_newa (GIArgument, n_args);

  for (i = 0; i < n_args; i++)
    {
      g_callable_info_load_arg (impl->invoker_info, i, &arg_info);
      g_arg_info_load_type (&arg_info, &type_info);

      if (g_arg_info_get_direction (&arg_info) == GI_DIRECTION_IN)
        peas_gi_pointer_to_argument (&type_info, args[i + 1], &arguments[i]);
      else
        arguments[i].v_pointer = *((gpointer **) args[i + 1]);
    }

  success = peas_extension_wrapper_callv (instance, impl->interface_type,
                                          impl->invoker_info, impl->method_name,
                                          arguments, &return_value);

  if (!success)
    memset (&return_value, 0, sizeof (GIArgument));

  g_callable_info_load_return_type (impl->invoker_info, &return_type_info);
  if (g_type_info_get_tag (&return_type_info) != GI_TYPE_TAG_VOID)
    peas_gi_argument_to_pointer (&return_type_info, &return_value, result);
}
Example #3
0
/**
 * peas_extension_callv:
 * @exten: A #PeasExtension.
 * @method_name: the name of the method that should be called.
 * @args: the arguments for the method.
 * @return_value: the return falue for the method.
 *
 * Call a method of the object behind @extension, using @args as arguments.
 *
 * See peas_extension_call() for more information.
 *
 * Return value: (transfer full): %TRUE on successful call.
 *
 * Deprecated: 1.2. Use the dynamically implemented interface instead.
 *
 * Rename to: peas_extension_call
 */
gboolean
peas_extension_callv (PeasExtension *exten,
                      const gchar   *method_name,
                      GIArgument    *args,
                      GIArgument    *return_value)
{
  if (PEAS_IS_EXTENSION_WRAPPER (exten))
    {
      return peas_extension_wrapper_callv (PEAS_EXTENSION_WRAPPER (exten),
                                           method_name,
                                           args,
                                           return_value);
    }
  else
    {
      GType gtype = peas_extension_get_extension_type (exten);

      return peas_method_apply (G_OBJECT (exten),
                                gtype,
                                method_name,
                                args,
                                return_value);
    }
}