/** * 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); }
/** * 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); } }