| 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) { |
| 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 } |