comparison 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
comparison
equal deleted inserted replaced
11979:717cbb3115bc 11980:67fbd2ff4c4e
25 25
26 va_list args; 26 va_list args;
27 27
28 va_start(args, num_vals); 28 va_start(args, num_vals);
29 29
30 array = mono_array_new(mono_loader_get_domain(), mono_get_object_class(), num_vals); 30 array = mono_array_new(ml_get_domain(), mono_get_object_class(), num_vals);
31 31
32 for (i = 0; i < num_vals; i++) { 32 for (i = 0; i < num_vals; i++) {
33 if (gaim_value_get_type(sig_data->values[i]) == GAIM_TYPE_SUBTYPE) { 33 if (gaim_value_get_type(sig_data->values[i]) == GAIM_TYPE_SUBTYPE) {
34 gaim_obj = va_arg(args, gpointer); 34 gaim_obj = va_arg(args, gpointer);
35 obj = mono_loader_object_from_gaim_subtype(gaim_value_get_subtype(sig_data->values[i]), gaim_obj); 35 obj = ml_object_from_gaim_subtype(gaim_value_get_subtype(sig_data->values[i]), gaim_obj);
36 mono_array_set(array, MonoObject*, i, obj); 36 mono_array_set(array, MonoObject*, i, obj);
37 } else { 37 } else {
38 gaim_obj = va_arg(args, gpointer); 38 gaim_obj = va_arg(args, gpointer);
39 obj = mono_loader_object_from_gaim_type(gaim_value_get_type(sig_data->values[i]), gaim_obj); 39 obj = ml_object_from_gaim_type(gaim_value_get_type(sig_data->values[i]), gaim_obj);
40 mono_array_set(array, MonoObject*, i, obj); 40 mono_array_set(array, MonoObject*, i, obj);
41 } 41 }
42 } 42 }
43 43
44 va_end(args); 44 va_end(args);
45 45
46 meth_args[0] = array; 46 meth_args[0] = array;
47 47
48 return mono_loader_delegate_invoke(sig_data->func, meth_args); 48 return ml_delegate_invoke(sig_data->func, meth_args);
49 } 49 }
50 50
51 static void cb_void__pointer(void *arg1, void *data) 51 static void cb_void__pointer(void *arg1, void *data)
52 { 52 {
53 dispatch_callback((SignalData*)data, ((SignalData*)data)->num_vals, arg1); 53 dispatch_callback((SignalData*)data, ((SignalData*)data)->num_vals, arg1);
54
55 } 54 }
55
56 static void cb_void__pointer_pointer_pointer(void *arg1, void *arg2, void *arg3, void *data)
57 {
58 dispatch_callback((SignalData*)data, ((SignalData*)data)->num_vals, arg1, arg2, arg3);
59 }
60
56 61
57 int gaim_signal_connect_glue(MonoObject* h, MonoObject *plugin, MonoString *signal, MonoObject *func) 62 int gaim_signal_connect_glue(MonoObject* h, MonoObject *plugin, MonoString *signal, MonoObject *func)
58 { 63 {
59 char *sig; 64 char *sig;
60 void **instance = NULL; 65 void **instance = NULL;
61 SignalData *sig_data; 66 SignalData *sig_data;
67 GaimMonoPlugin *mplug;
68 MonoClass *klass;
62 69
63 sig = mono_string_to_utf8(signal); 70 sig = mono_string_to_utf8(signal);
64 gaim_debug(GAIM_DEBUG_INFO, "mono", "connecting signal: %s\n", sig); 71 gaim_debug(GAIM_DEBUG_INFO, "mono", "connecting signal: %s\n", sig);
65 72
66 instance = (void*)mono_object_unbox(h); 73 instance = (void*)mono_object_unbox(h);
67 74
68 sig_data = g_new0(SignalData, 1); 75 sig_data = g_new0(SignalData, 1);
69 76
70 sig_data->func = func; 77 sig_data->func = func;
71 sig_data->signal = sig; 78 sig_data->signal = sig;
72 79
73 gaim_signal_get_values(*instance, sig, &sig_data->ret_value, &sig_data->num_vals, &sig_data->values); 80 gaim_signal_get_values(*instance, sig, &sig_data->ret_value, &sig_data->num_vals, &sig_data->values);
81
82 klass = mono_object_get_class(plugin);
83
84 mplug = ml_find_plugin_by_class(klass);
85
86 mplug->signal_data = g_list_append(mplug->signal_data, (gpointer)sig_data);
74 87
75 return gaim_signal_connect(*instance, sig, (gpointer)mono_object_get_class(plugin), get_callback(sig_data), (gpointer)sig_data); 88 return gaim_signal_connect(*instance, sig, (gpointer)klass, get_callback(sig_data), (gpointer)sig_data);
76 } 89 }
77 90
78 static int determine_index(GaimType type) 91 static int determine_index(GaimType type)
79 { 92 {
80 switch (type) { 93 switch (type) {
92 } 105 }
93 106
94 static gpointer callbacks[]= { 107 static gpointer callbacks[]= {
95 NULL, 108 NULL,
96 cb_void__pointer, 109 cb_void__pointer,
110 NULL,
111 cb_void__pointer_pointer_pointer
97 }; 112 };
98 113
99 static int callbacks_array_size = sizeof(callbacks) / sizeof(GaimCallback); 114 static int callbacks_array_size = sizeof(callbacks) / sizeof(GaimCallback);
100 115
101 116
104 int i, index = 0; 119 int i, index = 0;
105 120
106 if (sig_data->ret_value == NULL) 121 if (sig_data->ret_value == NULL)
107 index = 0; 122 index = 0;
108 else 123 else
109 index = gaim_value_get_type(sig_data->ret_value); 124 index = determine_index(gaim_value_get_type(sig_data->ret_value));
110 125
111 for (i = 0; i < sig_data->num_vals; i++) { 126 for (i = 0; i < sig_data->num_vals; i++) {
112 index += determine_index(gaim_value_get_type(sig_data->values[i])); 127 index += determine_index(gaim_value_get_type(sig_data->values[i]));
113 } 128 }
129
130 gaim_debug(GAIM_DEBUG_INFO, "mono", "get_callback index = %d\n", index);
114 131
115 if (index >= callbacks_array_size || callbacks[index] == NULL) { 132 if (index >= callbacks_array_size || callbacks[index] == NULL) {
116 gaim_debug(GAIM_DEBUG_ERROR, "mono", "couldn't find a callback function for signal: %s\n", sig_data->signal); 133 gaim_debug(GAIM_DEBUG_ERROR, "mono", "couldn't find a callback function for signal: %s\n", sig_data->signal);
117 return NULL; 134 return NULL;
118 } 135 }