Mercurial > pidgin.yaz
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 } |