Mercurial > pidgin
diff libpurple/signals.c @ 15373:5fe8042783c1
Rename gtk/ and libgaim/ to pidgin/ and libpurple/
author | Sean Egan <seanegan@gmail.com> |
---|---|
date | Sat, 20 Jan 2007 02:32:10 +0000 |
parents | |
children | b15cc37605c4 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/signals.c Sat Jan 20 02:32:10 2007 +0000 @@ -0,0 +1,990 @@ +/** + * @file signals.c Signal API + * @ingroup core + * + * gaim + * + * Gaim is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#include "internal.h" + +#include "dbus-maybe.h" +#include "debug.h" +#include "signals.h" +#include "value.h" + +/* must include this to use G_VA_COPY */ +#include <string.h> + +typedef struct +{ + void *instance; + + GHashTable *signals; + size_t signal_count; + + gulong next_signal_id; + +} GaimInstanceData; + +typedef struct +{ + gulong id; + + GaimSignalMarshalFunc marshal; + + int num_values; + GaimValue **values; + GaimValue *ret_value; + + GList *handlers; + size_t handler_count; + + gulong next_handler_id; +} GaimSignalData; + +typedef struct +{ + gulong id; + GaimCallback cb; + void *handle; + void *data; + gboolean use_vargs; + int priority; + +} GaimSignalHandlerData; + +static GHashTable *instance_table = NULL; + +static void +destroy_instance_data(GaimInstanceData *instance_data) +{ + g_hash_table_destroy(instance_data->signals); + + g_free(instance_data); +} + +static void +destroy_signal_data(GaimSignalData *signal_data) +{ + g_list_foreach(signal_data->handlers, (GFunc)g_free, NULL); + g_list_free(signal_data->handlers); + + if (signal_data->values != NULL) + { + int i; + + for (i = 0; i < signal_data->num_values; i++) + gaim_value_destroy((GaimValue *)signal_data->values[i]); + + g_free(signal_data->values); + } + + if (signal_data->ret_value != NULL) + gaim_value_destroy(signal_data->ret_value); + g_free(signal_data); +} + +gulong +gaim_signal_register(void *instance, const char *signal, + GaimSignalMarshalFunc marshal, + GaimValue *ret_value, int num_values, ...) +{ + GaimInstanceData *instance_data; + GaimSignalData *signal_data; + va_list args; + + g_return_val_if_fail(instance != NULL, 0); + g_return_val_if_fail(signal != NULL, 0); + g_return_val_if_fail(marshal != NULL, 0); + + instance_data = + (GaimInstanceData *)g_hash_table_lookup(instance_table, instance); + + if (instance_data == NULL) + { + instance_data = g_new0(GaimInstanceData, 1); + + instance_data->instance = instance; + instance_data->next_signal_id = 1; + + instance_data->signals = + g_hash_table_new_full(g_str_hash, g_str_equal, g_free, + (GDestroyNotify)destroy_signal_data); + + g_hash_table_insert(instance_table, instance, instance_data); + } + + signal_data = g_new0(GaimSignalData, 1); + signal_data->id = instance_data->next_signal_id; + signal_data->marshal = marshal; + signal_data->next_handler_id = 1; + signal_data->ret_value = ret_value; + signal_data->num_values = num_values; + + if (num_values > 0) + { + int i; + + signal_data->values = g_new0(GaimValue *, num_values); + + va_start(args, num_values); + + for (i = 0; i < num_values; i++) + signal_data->values[i] = va_arg(args, GaimValue *); + + va_end(args); + } + + g_hash_table_insert(instance_data->signals, + g_strdup(signal), signal_data); + + instance_data->next_signal_id++; + instance_data->signal_count++; + + return signal_data->id; +} + +void +gaim_signal_unregister(void *instance, const char *signal) +{ + GaimInstanceData *instance_data; + + g_return_if_fail(instance != NULL); + g_return_if_fail(signal != NULL); + + instance_data = + (GaimInstanceData *)g_hash_table_lookup(instance_table, instance); + + g_return_if_fail(instance_data != NULL); + + g_hash_table_remove(instance_data->signals, signal); + + instance_data->signal_count--; + + if (instance_data->signal_count == 0) + { + /* Unregister the instance. */ + g_hash_table_remove(instance_table, instance); + } +} + +void +gaim_signals_unregister_by_instance(void *instance) +{ + gboolean found; + + g_return_if_fail(instance != NULL); + + found = g_hash_table_remove(instance_table, instance); + + /* + * Makes things easier (more annoying?) for developers who don't have + * things registering and unregistering in the right order :) + */ + g_return_if_fail(found); +} + +void +gaim_signal_get_values(void *instance, const char *signal, + GaimValue **ret_value, + int *num_values, GaimValue ***values) +{ + GaimInstanceData *instance_data; + GaimSignalData *signal_data; + + g_return_if_fail(instance != NULL); + g_return_if_fail(signal != NULL); + g_return_if_fail(num_values != NULL); + g_return_if_fail(values != NULL); + + /* Get the instance data */ + instance_data = + (GaimInstanceData *)g_hash_table_lookup(instance_table, instance); + + g_return_if_fail(instance_data != NULL); + + /* Get the signal data */ + signal_data = + (GaimSignalData *)g_hash_table_lookup(instance_data->signals, signal); + + g_return_if_fail(signal_data != NULL); + + *num_values = signal_data->num_values; + *values = signal_data->values; + + if (ret_value != NULL) + *ret_value = signal_data->ret_value; +} + +static gint handler_priority(void * a, void * b) { + GaimSignalHandlerData *ah = (GaimSignalHandlerData*)a; + GaimSignalHandlerData *bh = (GaimSignalHandlerData*)b; + if (ah->priority > bh->priority) return 1; + if (ah->priority < bh->priority) return -1; + return 0; +} + +static gulong +signal_connect_common(void *instance, const char *signal, void *handle, + GaimCallback func, void *data, int priority, gboolean use_vargs) +{ + GaimInstanceData *instance_data; + GaimSignalData *signal_data; + GaimSignalHandlerData *handler_data; + + g_return_val_if_fail(instance != NULL, 0); + g_return_val_if_fail(signal != NULL, 0); + g_return_val_if_fail(handle != NULL, 0); + g_return_val_if_fail(func != NULL, 0); + + /* Get the instance data */ + instance_data = + (GaimInstanceData *)g_hash_table_lookup(instance_table, instance); + + if (instance_data == NULL) + { + gaim_debug_warning("signals", "Something tried to register a callback " + "for the '%s' signal, but we do not have any signals " + "registered with the given handle\n", signal); + g_return_val_if_reached(0); + } + + /* Get the signal data */ + signal_data = + (GaimSignalData *)g_hash_table_lookup(instance_data->signals, signal); + + if (signal_data == NULL) + { + gaim_debug(GAIM_DEBUG_ERROR, "signals", + "Signal data for %s not found!\n", signal); + return 0; + } + + /* Create the signal handler data */ + handler_data = g_new0(GaimSignalHandlerData, 1); + handler_data->id = signal_data->next_handler_id; + handler_data->cb = func; + handler_data->handle = handle; + handler_data->data = data; + handler_data->use_vargs = use_vargs; + handler_data->priority = priority; + + signal_data->handlers = g_list_insert_sorted(signal_data->handlers, handler_data, (GCompareFunc)handler_priority); + signal_data->handler_count++; + signal_data->next_handler_id++; + + return handler_data->id; +} + +gulong +gaim_signal_connect_priority(void *instance, const char *signal, void *handle, + GaimCallback func, void *data, int priority) +{ + return signal_connect_common(instance, signal, handle, func, data, priority, FALSE); +} + +gulong +gaim_signal_connect(void *instance, const char *signal, void *handle, + GaimCallback func, void *data) +{ + return signal_connect_common(instance, signal, handle, func, data, GAIM_SIGNAL_PRIORITY_DEFAULT, FALSE); +} + +gulong +gaim_signal_connect_priority_vargs(void *instance, const char *signal, void *handle, + GaimCallback func, void *data, int priority) +{ + return signal_connect_common(instance, signal, handle, func, data, priority, TRUE); +} + +gulong +gaim_signal_connect_vargs(void *instance, const char *signal, void *handle, + GaimCallback func, void *data) +{ + return signal_connect_common(instance, signal, handle, func, data, GAIM_SIGNAL_PRIORITY_DEFAULT, TRUE); +} + +void +gaim_signal_disconnect(void *instance, const char *signal, + void *handle, GaimCallback func) +{ + GaimInstanceData *instance_data; + GaimSignalData *signal_data; + GaimSignalHandlerData *handler_data; + GList *l; + gboolean found = FALSE; + + g_return_if_fail(instance != NULL); + g_return_if_fail(signal != NULL); + g_return_if_fail(handle != NULL); + g_return_if_fail(func != NULL); + + /* Get the instance data */ + instance_data = + (GaimInstanceData *)g_hash_table_lookup(instance_table, instance); + + g_return_if_fail(instance_data != NULL); + + /* Get the signal data */ + signal_data = + (GaimSignalData *)g_hash_table_lookup(instance_data->signals, signal); + + if (signal_data == NULL) + { + gaim_debug(GAIM_DEBUG_ERROR, "signals", + "Signal data for %s not found!\n", signal); + return; + } + + /* Find the handler data. */ + for (l = signal_data->handlers; l != NULL; l = l->next) + { + handler_data = (GaimSignalHandlerData *)l->data; + + if (handler_data->handle == handle && handler_data->cb == func) + { + g_free(handler_data); + + signal_data->handlers = g_list_remove(signal_data->handlers, + handler_data); + signal_data->handler_count--; + + found = TRUE; + + break; + } + } + + /* See note somewhere about this actually helping developers.. */ + g_return_if_fail(found); +} + +/* + * TODO: Make this all more efficient by storing a list of handlers, keyed + * to a handle. + */ +static void +disconnect_handle_from_signals(const char *signal, + GaimSignalData *signal_data, void *handle) +{ + GList *l, *l_next; + GaimSignalHandlerData *handler_data; + + for (l = signal_data->handlers; l != NULL; l = l_next) + { + handler_data = (GaimSignalHandlerData *)l->data; + l_next = l->next; + + if (handler_data->handle == handle) + { + g_free(handler_data); + + signal_data->handler_count--; + signal_data->handlers = g_list_remove(signal_data->handlers, + handler_data); + } + } +} + +static void +disconnect_handle_from_instance(void *instance, + GaimInstanceData *instance_data, + void *handle) +{ + g_hash_table_foreach(instance_data->signals, + (GHFunc)disconnect_handle_from_signals, handle); +} + +void +gaim_signals_disconnect_by_handle(void *handle) +{ + g_return_if_fail(handle != NULL); + + g_hash_table_foreach(instance_table, + (GHFunc)disconnect_handle_from_instance, handle); +} + +void +gaim_signal_emit(void *instance, const char *signal, ...) +{ + va_list args; + + g_return_if_fail(instance != NULL); + g_return_if_fail(signal != NULL); + + va_start(args, signal); + gaim_signal_emit_vargs(instance, signal, args); + va_end(args); +} + +void +gaim_signal_emit_vargs(void *instance, const char *signal, va_list args) +{ + GaimInstanceData *instance_data; + GaimSignalData *signal_data; + GaimSignalHandlerData *handler_data; + GList *l, *l_next; + va_list tmp; + + g_return_if_fail(instance != NULL); + g_return_if_fail(signal != NULL); + + instance_data = + (GaimInstanceData *)g_hash_table_lookup(instance_table, instance); + + g_return_if_fail(instance_data != NULL); + + signal_data = + (GaimSignalData *)g_hash_table_lookup(instance_data->signals, signal); + + if (signal_data == NULL) + { + gaim_debug(GAIM_DEBUG_ERROR, "signals", + "Signal data for %s not found!\n", signal); + return; + } + + for (l = signal_data->handlers; l != NULL; l = l_next) + { + l_next = l->next; + + handler_data = (GaimSignalHandlerData *)l->data; + + /* This is necessary because a va_list may only be + * evaluated once */ + G_VA_COPY(tmp, args); + + if (handler_data->use_vargs) + { + ((void (*)(va_list, void *))handler_data->cb)(tmp, + handler_data->data); + } + else + { + signal_data->marshal(handler_data->cb, tmp, + handler_data->data, NULL); + } + + va_end(tmp); + } + +#ifdef HAVE_DBUS + gaim_dbus_signal_emit_gaim(signal, signal_data->num_values, + signal_data->values, args); +#endif /* HAVE_DBUS */ + +} + +void * +gaim_signal_emit_return_1(void *instance, const char *signal, ...) +{ + void *ret_val; + va_list args; + + g_return_val_if_fail(instance != NULL, NULL); + g_return_val_if_fail(signal != NULL, NULL); + + va_start(args, signal); + ret_val = gaim_signal_emit_vargs_return_1(instance, signal, args); + va_end(args); + + return ret_val; +} + +void * +gaim_signal_emit_vargs_return_1(void *instance, const char *signal, + va_list args) +{ + GaimInstanceData *instance_data; + GaimSignalData *signal_data; + GaimSignalHandlerData *handler_data; + GList *l, *l_next; + va_list tmp; + + g_return_val_if_fail(instance != NULL, NULL); + g_return_val_if_fail(signal != NULL, NULL); + + instance_data = + (GaimInstanceData *)g_hash_table_lookup(instance_table, instance); + + g_return_val_if_fail(instance_data != NULL, NULL); + + signal_data = + (GaimSignalData *)g_hash_table_lookup(instance_data->signals, signal); + + if (signal_data == NULL) + { + gaim_debug(GAIM_DEBUG_ERROR, "signals", + "Signal data for %s not found!\n", signal); + return 0; + } + +#ifdef HAVE_DBUS + G_VA_COPY(tmp, args); + gaim_dbus_signal_emit_gaim(signal, signal_data->num_values, + signal_data->values, tmp); + va_end(tmp); +#endif /* HAVE_DBUS */ + + for (l = signal_data->handlers; l != NULL; l = l_next) + { + void *ret_val = NULL; + + l_next = l->next; + + handler_data = (GaimSignalHandlerData *)l->data; + + G_VA_COPY(tmp, args); + if (handler_data->use_vargs) + { + ret_val = ((void *(*)(va_list, void *))handler_data->cb)( + tmp, handler_data->data); + } + else + { + signal_data->marshal(handler_data->cb, tmp, + handler_data->data, &ret_val); + } + va_end(tmp); + + if (ret_val != NULL) + return ret_val; + } + + return NULL; +} + +void +gaim_signals_init() +{ + g_return_if_fail(instance_table == NULL); + + instance_table = + g_hash_table_new_full(g_direct_hash, g_direct_equal, + NULL, (GDestroyNotify)destroy_instance_data); +} + +void +gaim_signals_uninit() +{ + g_return_if_fail(instance_table != NULL); + + g_hash_table_destroy(instance_table); + instance_table = NULL; +} + +/************************************************************************** + * Marshallers + **************************************************************************/ +void +gaim_marshal_VOID(GaimCallback cb, va_list args, void *data, + void **return_val) +{ + ((void (*)(void *))cb)(data); +} + +void +gaim_marshal_VOID__INT(GaimCallback cb, va_list args, void *data, + void **return_val) +{ + gint arg1 = va_arg(args, gint); + + ((void (*)(gint, void *))cb)(arg1, data); +} + +void +gaim_marshal_VOID__INT_INT(GaimCallback cb, va_list args, void *data, + void **return_val) +{ + gint arg1 = va_arg(args, gint); + gint arg2 = va_arg(args, gint); + + ((void (*)(gint, gint, void *))cb)(arg1, arg2, data); +} + +void +gaim_marshal_VOID__POINTER(GaimCallback cb, va_list args, void *data, + void **return_val) +{ + void *arg1 = va_arg(args, void *); + + ((void (*)(void *, void *))cb)(arg1, data); +} + +void +gaim_marshal_VOID__POINTER_UINT(GaimCallback cb, va_list args, + void *data, void **return_val) +{ + void *arg1 = va_arg(args, void *); + guint arg2 = va_arg(args, guint); + + ((void (*)(void *, guint, void *))cb)(arg1, arg2, data); +} + +void gaim_marshal_VOID__POINTER_INT_INT(GaimCallback cb, va_list args, + void *data, void **return_val) +{ + void *arg1 = va_arg(args, void *); + gint arg2 = va_arg(args, gint); + gint arg3 = va_arg(args, gint); + + ((void (*)(void *, gint, gint, void *))cb)(arg1, arg2, arg3, data); +} + +void +gaim_marshal_VOID__POINTER_POINTER(GaimCallback cb, va_list args, + void *data, void **return_val) +{ + void *arg1 = va_arg(args, void *); + void *arg2 = va_arg(args, void *); + + ((void (*)(void *, void *, void *))cb)(arg1, arg2, data); +} + +void +gaim_marshal_VOID__POINTER_POINTER_UINT(GaimCallback cb, va_list args, + void *data, void **return_val) +{ + void *arg1 = va_arg(args, void *); + void *arg2 = va_arg(args, void *); + guint arg3 = va_arg(args, guint); + + ((void (*)(void *, void *, guint, void *))cb)(arg1, arg2, arg3, data); +} + +void +gaim_marshal_VOID__POINTER_POINTER_UINT_UINT(GaimCallback cb, va_list args, + void *data, void **return_val) +{ + void *arg1 = va_arg(args, void *); + void *arg2 = va_arg(args, void *); + guint arg3 = va_arg(args, guint); + guint arg4 = va_arg(args, guint); + + ((void (*)(void *, void *, guint, guint, void *))cb)(arg1, arg2, arg3, arg4, data); +} + +void +gaim_marshal_VOID__POINTER_POINTER_POINTER(GaimCallback cb, va_list args, + void *data, void **return_val) +{ + void *arg1 = va_arg(args, void *); + void *arg2 = va_arg(args, void *); + void *arg3 = va_arg(args, void *); + + ((void (*)(void *, void *, void *, void *))cb)(arg1, arg2, arg3, data); +} + +void +gaim_marshal_VOID__POINTER_POINTER_POINTER_POINTER(GaimCallback cb, + va_list args, + void *data, + void **return_val) +{ + void *arg1 = va_arg(args, void *); + void *arg2 = va_arg(args, void *); + void *arg3 = va_arg(args, void *); + void *arg4 = va_arg(args, void *); + + ((void (*)(void *, void *, void *, void *, void *))cb)(arg1, arg2, arg3, arg4, data); +} + +void +gaim_marshal_VOID__POINTER_POINTER_POINTER_POINTER_POINTER(GaimCallback cb, + va_list args, + void *data, + void **return_val) +{ + void *arg1 = va_arg(args, void *); + void *arg2 = va_arg(args, void *); + void *arg3 = va_arg(args, void *); + void *arg4 = va_arg(args, void *); + void *arg5 = va_arg(args, void *); + + ((void (*)(void *, void *, void *, void *, void *, void *))cb)(arg1, arg2, arg3, arg4, arg5, data); +} + +void +gaim_marshal_VOID__POINTER_POINTER_POINTER_UINT(GaimCallback cb, + va_list args, + void *data, + void **return_val) +{ + void *arg1 = va_arg(args, void *); + void *arg2 = va_arg(args, void *); + void *arg3 = va_arg(args, void *); + guint arg4 = va_arg(args, guint); + + ((void (*)(void *, void *, void *, guint, void *))cb)(arg1, arg2, arg3, arg4, data); +} + +void +gaim_marshal_VOID__POINTER_POINTER_POINTER_POINTER_UINT(GaimCallback cb, + va_list args, + void *data, + void **return_val) +{ + void *arg1 = va_arg(args, void *); + void *arg2 = va_arg(args, void *); + void *arg3 = va_arg(args, void *); + void *arg4 = va_arg(args, void *); + guint arg5 = va_arg(args, guint); + + ((void (*)(void *, void *, void *, void *, guint, void *))cb)(arg1, arg2, arg3, arg4, arg5, data); +} + +void +gaim_marshal_VOID__POINTER_POINTER_POINTER_UINT_UINT(GaimCallback cb, + va_list args, + void *data, + void **return_val) +{ + void *arg1 = va_arg(args, void *); + void *arg2 = va_arg(args, void *); + void *arg3 = va_arg(args, void *); + guint arg4 = va_arg(args, guint); + guint arg5 = va_arg(args, guint); + + ((void (*)(void *, void *, void *, guint, guint, void *))cb)( + arg1, arg2, arg3, arg4, arg5, data); +} + +void +gaim_marshal_INT__INT(GaimCallback cb, va_list args, void *data, + void **return_val) +{ + gint ret_val; + gint arg1 = va_arg(args, gint); + + ret_val = ((gint (*)(gint, void *))cb)(arg1, data); + + if (return_val != NULL) + *return_val = GINT_TO_POINTER(ret_val); +} + +void +gaim_marshal_INT__INT_INT(GaimCallback cb, va_list args, void *data, + void **return_val) +{ + gint ret_val; + gint arg1 = va_arg(args, gint); + gint arg2 = va_arg(args, gint); + + ret_val = ((gint (*)(gint, gint, void *))cb)(arg1, arg2, data); + + if (return_val != NULL) + *return_val = GINT_TO_POINTER(ret_val); +} + + +void +gaim_marshal_INT__POINTER_POINTER_POINTER_POINTER_POINTER( + GaimCallback cb, va_list args, void *data, void **return_val) +{ + gint ret_val; + void *arg1 = va_arg(args, void *); + void *arg2 = va_arg(args, void *); + void *arg3 = va_arg(args, void *); + void *arg4 = va_arg(args, void *); + void *arg5 = va_arg(args, void *); + + ret_val = + ((gint (*)(void *, void *, void *, void *, void *, void *))cb)( + arg1, arg2, arg3, arg4, arg5, data); + + if (return_val != NULL) + *return_val = GINT_TO_POINTER(ret_val); +} + +void +gaim_marshal_BOOLEAN__POINTER(GaimCallback cb, va_list args, void *data, + void **return_val) +{ + gboolean ret_val; + void *arg1 = va_arg(args, void *); + + ret_val = ((gboolean (*)(void *, void *))cb)(arg1, data); + + if (return_val != NULL) + *return_val = GINT_TO_POINTER(ret_val); +} + +void +gaim_marshal_BOOLEAN__POINTER_POINTER(GaimCallback cb, va_list args, + void *data, void **return_val) +{ + gboolean ret_val; + void *arg1 = va_arg(args, void *); + void *arg2 = va_arg(args, void *); + + ret_val = ((gboolean (*)(void *, void *, void *))cb)(arg1, arg2, data); + + if (return_val != NULL) + *return_val = GINT_TO_POINTER(ret_val); +} + +void +gaim_marshal_BOOLEAN__POINTER_POINTER_POINTER(GaimCallback cb, va_list args, + void *data, void **return_val) +{ + gboolean ret_val; + void *arg1 = va_arg(args, void *); + void *arg2 = va_arg(args, void *); + void *arg3 = va_arg(args, void *); + + ret_val = ((gboolean (*)(void *, void *, void *, void *))cb)(arg1, arg2, + arg3, data); + + if (return_val != NULL) + *return_val = GINT_TO_POINTER(ret_val); +} + +void +gaim_marshal_BOOLEAN__POINTER_POINTER_UINT(GaimCallback cb, + va_list args, + void *data, + void **return_val) +{ + gboolean ret_val; + void *arg1 = va_arg(args, void *); + void *arg2 = va_arg(args, void *); + guint arg3 = va_arg(args, guint); + + ret_val = ((gboolean (*)(void *, void *, guint, void *))cb)( + arg1, arg2, arg3, data); + + if (return_val != NULL) + *return_val = GINT_TO_POINTER(ret_val); +} + +void +gaim_marshal_BOOLEAN__POINTER_POINTER_POINTER_UINT(GaimCallback cb, + va_list args, + void *data, + void **return_val) +{ + gboolean ret_val; + void *arg1 = va_arg(args, void *); + void *arg2 = va_arg(args, void *); + void *arg3 = va_arg(args, void *); + guint arg4 = va_arg(args, guint); + + ret_val = ((gboolean (*)(void *, void *, void *, guint, void *))cb)( + arg1, arg2, arg3, arg4, data); + + if (return_val != NULL) + *return_val = GINT_TO_POINTER(ret_val); +} + +void +gaim_marshal_BOOLEAN__POINTER_POINTER_POINTER_POINTER(GaimCallback cb, + va_list args, + void *data, + void **return_val) +{ + gboolean ret_val; + void *arg1 = va_arg(args, void *); + void *arg2 = va_arg(args, void *); + void *arg3 = va_arg(args, void *); + void *arg4 = va_arg(args, void *); + + ret_val = ((gboolean (*)(void *, void *, void *, void *, void *))cb)( + arg1, arg2, arg3, arg4, data); + + if (return_val != NULL) + *return_val = GINT_TO_POINTER(ret_val); +} + +void +gaim_marshal_BOOLEAN__POINTER_POINTER_POINTER_POINTER_POINTER( + GaimCallback cb, va_list args, void *data, void **return_val) +{ + gboolean ret_val; + void *arg1 = va_arg(args, void *); + void *arg2 = va_arg(args, void *); + void *arg3 = va_arg(args, void *); + void *arg4 = va_arg(args, void *); + void *arg5 = va_arg(args, void *); + + ret_val = + ((gboolean (*)(void *, void *, void *, void *, void *, void *))cb)( + arg1, arg2, arg3, arg4, arg5, data); + + if (return_val != NULL) + *return_val = GINT_TO_POINTER(ret_val); +} + +void +gaim_marshal_BOOLEAN__INT_POINTER(GaimCallback cb, va_list args, void *data, + void **return_val) +{ + gboolean ret_val; + gint arg1 = va_arg(args, gint); + void *arg2 = va_arg(args, void *); + + ret_val = ((gboolean (*)(gint, void *, void *))cb)(arg1, arg2, data); + + if (return_val != NULL) + *return_val = GINT_TO_POINTER(ret_val); +} + +void +gaim_marshal_POINTER__POINTER_INT( + GaimCallback cb, va_list args, void *data, + void **return_val) +{ + gpointer ret_val; + void *arg1 = va_arg(args, void *); + gint arg2 = va_arg(args, gint); + + ret_val = ((gpointer(*)(void *, gint, void *))cb)(arg1, arg2, data); + + if (return_val != NULL) + *return_val = ret_val; +} + +void +gaim_marshal_POINTER__POINTER_INT64( + GaimCallback cb, va_list args, void *data, + void **return_val) +{ + gpointer ret_val; + void *arg1 = va_arg(args, void *); + gint64 arg2 = va_arg(args, gint64); + + ret_val = ((gpointer(*)(void *, gint64, void *))cb)(arg1, arg2, data); + + if (return_val != NULL) + *return_val = ret_val; +} + +void +gaim_marshal_POINTER__POINTER_POINTER(GaimCallback cb, va_list args, void *data, + void **return_val) +{ + gpointer ret_val; + void *arg1 = va_arg(args, void *); + void *arg2 = va_arg(args, void *); + + ret_val = ((gpointer (*)(void *, void *, void *))cb)(arg1, arg2, data); + + if (return_val != NULL) + *return_val = ret_val; +}