Mercurial > pidgin.yaz
diff plugins/mono/loader/signal-glue.c @ 11980:67fbd2ff4c4e
[gaim-migrate @ 14273]
Mono cleanup patch from Eoin Coffey
First, I changed mono_loader_ to ml_, since I was
getting sick of typing mono_loader_ :-D
Moved the mono runtime init and deinit code out of
mono.c into ml_init and ml_uninit in mono-helper.c
Added api/Status.cs and loader/status-glue.c so the
.net api now knows very little (as in the 'id') of
statuses.
committer: Tailor Script <tailor@pidgin.im>
author | Gary Kramlich <grim@reaperworld.com> |
---|---|
date | Sat, 05 Nov 2005 02:09:30 +0000 |
parents | 565d2e437c04 |
children |
line wrap: on
line diff
--- a/plugins/mono/loader/signal-glue.c Sat Nov 05 01:57:00 2005 +0000 +++ b/plugins/mono/loader/signal-glue.c Sat Nov 05 02:09:30 2005 +0000 @@ -27,16 +27,16 @@ va_start(args, num_vals); - array = mono_array_new(mono_loader_get_domain(), mono_get_object_class(), num_vals); + array = mono_array_new(ml_get_domain(), mono_get_object_class(), num_vals); for (i = 0; i < num_vals; i++) { if (gaim_value_get_type(sig_data->values[i]) == GAIM_TYPE_SUBTYPE) { gaim_obj = va_arg(args, gpointer); - obj = mono_loader_object_from_gaim_subtype(gaim_value_get_subtype(sig_data->values[i]), gaim_obj); + obj = ml_object_from_gaim_subtype(gaim_value_get_subtype(sig_data->values[i]), gaim_obj); mono_array_set(array, MonoObject*, i, obj); } else { gaim_obj = va_arg(args, gpointer); - obj = mono_loader_object_from_gaim_type(gaim_value_get_type(sig_data->values[i]), gaim_obj); + obj = ml_object_from_gaim_type(gaim_value_get_type(sig_data->values[i]), gaim_obj); mono_array_set(array, MonoObject*, i, obj); } } @@ -45,34 +45,47 @@ meth_args[0] = array; - return mono_loader_delegate_invoke(sig_data->func, meth_args); + return ml_delegate_invoke(sig_data->func, meth_args); } static void cb_void__pointer(void *arg1, void *data) { - dispatch_callback((SignalData*)data, ((SignalData*)data)->num_vals, arg1); - + dispatch_callback((SignalData*)data, ((SignalData*)data)->num_vals, arg1); } +static void cb_void__pointer_pointer_pointer(void *arg1, void *arg2, void *arg3, void *data) +{ + dispatch_callback((SignalData*)data, ((SignalData*)data)->num_vals, arg1, arg2, arg3); +} + + int gaim_signal_connect_glue(MonoObject* h, MonoObject *plugin, MonoString *signal, MonoObject *func) { char *sig; void **instance = NULL; SignalData *sig_data; + GaimMonoPlugin *mplug; + MonoClass *klass; sig = mono_string_to_utf8(signal); gaim_debug(GAIM_DEBUG_INFO, "mono", "connecting signal: %s\n", sig); instance = (void*)mono_object_unbox(h); - + sig_data = g_new0(SignalData, 1); sig_data->func = func; sig_data->signal = sig; gaim_signal_get_values(*instance, sig, &sig_data->ret_value, &sig_data->num_vals, &sig_data->values); + + klass = mono_object_get_class(plugin); + + mplug = ml_find_plugin_by_class(klass); + + mplug->signal_data = g_list_append(mplug->signal_data, (gpointer)sig_data); - return gaim_signal_connect(*instance, sig, (gpointer)mono_object_get_class(plugin), get_callback(sig_data), (gpointer)sig_data); + return gaim_signal_connect(*instance, sig, (gpointer)klass, get_callback(sig_data), (gpointer)sig_data); } static int determine_index(GaimType type) @@ -94,6 +107,8 @@ static gpointer callbacks[]= { NULL, cb_void__pointer, + NULL, + cb_void__pointer_pointer_pointer }; static int callbacks_array_size = sizeof(callbacks) / sizeof(GaimCallback); @@ -106,12 +121,14 @@ if (sig_data->ret_value == NULL) index = 0; else - index = gaim_value_get_type(sig_data->ret_value); + index = determine_index(gaim_value_get_type(sig_data->ret_value)); for (i = 0; i < sig_data->num_vals; i++) { index += determine_index(gaim_value_get_type(sig_data->values[i])); } + gaim_debug(GAIM_DEBUG_INFO, "mono", "get_callback index = %d\n", index); + if (index >= callbacks_array_size || callbacks[index] == NULL) { gaim_debug(GAIM_DEBUG_ERROR, "mono", "couldn't find a callback function for signal: %s\n", sig_data->signal); return NULL;