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;