Tue, 04 Jan 2011 06:55:30 +0000
Remove trailing whitespace
| 11660 | 1 | #include "mono-glue.h" |
| 2 | #include "mono-helper.h" | |
| 3 | #include "debug.h" | |
| 4 | #include "blist.h" | |
| 5 | #include "signals.h" | |
| 6 | #include "value.h" | |
| 7 | ||
| 8 | typedef struct { | |
| 9 | MonoObject *func; | |
| 10 | char *signal; | |
| 15884 | 11 | PurpleValue **values; |
| 12 | PurpleValue *ret_value; | |
| 11660 | 13 | int num_vals; |
| 14 | } SignalData; | |
| 15 | ||
| 15884 | 16 | static PurpleCallback get_callback(SignalData *sig_data); |
| 11660 | 17 | |
| 18 | static gpointer dispatch_callback(SignalData *sig_data, int num_vals, ...) | |
| 19 | { | |
| 20 | MonoArray *array; | |
| 21 | MonoObject *obj; | |
| 22 | int i; | |
| 23 | gpointer meth_args[1]; | |
| 15884 | 24 | gpointer purple_obj; |
|
31294
73607ab89c6f
Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents:
15884
diff
changeset
|
25 | |
| 11660 | 26 | va_list args; |
|
31294
73607ab89c6f
Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents:
15884
diff
changeset
|
27 | |
| 11660 | 28 | va_start(args, num_vals); |
|
31294
73607ab89c6f
Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents:
15884
diff
changeset
|
29 | |
|
11980
fe5c2c58508c
[gaim-migrate @ 14273]
Eoin Coffey <ecoffey@soc.pidgin.im>
parents:
11952
diff
changeset
|
30 | array = mono_array_new(ml_get_domain(), mono_get_object_class(), num_vals); |
|
31294
73607ab89c6f
Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents:
15884
diff
changeset
|
31 | |
| 11660 | 32 | for (i = 0; i < num_vals; i++) { |
| 15884 | 33 | if (purple_value_get_type(sig_data->values[i]) == PURPLE_TYPE_SUBTYPE) { |
| 34 | purple_obj = va_arg(args, gpointer); | |
| 35 | obj = ml_object_from_purple_subtype(purple_value_get_subtype(sig_data->values[i]), purple_obj); | |
| 11660 | 36 | mono_array_set(array, MonoObject*, i, obj); |
| 37 | } else { | |
| 15884 | 38 | purple_obj = va_arg(args, gpointer); |
| 39 | obj = ml_object_from_purple_type(purple_value_get_type(sig_data->values[i]), purple_obj); | |
| 11660 | 40 | mono_array_set(array, MonoObject*, i, obj); |
| 41 | } | |
| 42 | } | |
|
31294
73607ab89c6f
Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents:
15884
diff
changeset
|
43 | |
| 11660 | 44 | va_end(args); |
|
31294
73607ab89c6f
Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents:
15884
diff
changeset
|
45 | |
| 11660 | 46 | meth_args[0] = array; |
|
31294
73607ab89c6f
Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents:
15884
diff
changeset
|
47 | |
|
73607ab89c6f
Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents:
15884
diff
changeset
|
48 | return ml_delegate_invoke(sig_data->func, meth_args); |
| 11660 | 49 | } |
| 50 | ||
| 51 | static void cb_void__pointer(void *arg1, void *data) | |
| 52 | { | |
|
31294
73607ab89c6f
Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents:
15884
diff
changeset
|
53 | dispatch_callback((SignalData*)data, ((SignalData*)data)->num_vals, arg1); |
| 11660 | 54 | } |
| 55 | ||
|
11980
fe5c2c58508c
[gaim-migrate @ 14273]
Eoin Coffey <ecoffey@soc.pidgin.im>
parents:
11952
diff
changeset
|
56 | static void cb_void__pointer_pointer_pointer(void *arg1, void *arg2, void *arg3, void *data) |
|
fe5c2c58508c
[gaim-migrate @ 14273]
Eoin Coffey <ecoffey@soc.pidgin.im>
parents:
11952
diff
changeset
|
57 | { |
|
31294
73607ab89c6f
Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents:
15884
diff
changeset
|
58 | dispatch_callback((SignalData*)data, ((SignalData*)data)->num_vals, arg1, arg2, arg3); |
|
11980
fe5c2c58508c
[gaim-migrate @ 14273]
Eoin Coffey <ecoffey@soc.pidgin.im>
parents:
11952
diff
changeset
|
59 | } |
|
fe5c2c58508c
[gaim-migrate @ 14273]
Eoin Coffey <ecoffey@soc.pidgin.im>
parents:
11952
diff
changeset
|
60 | |
|
fe5c2c58508c
[gaim-migrate @ 14273]
Eoin Coffey <ecoffey@soc.pidgin.im>
parents:
11952
diff
changeset
|
61 | |
| 15884 | 62 | int purple_signal_connect_glue(MonoObject* h, MonoObject *plugin, MonoString *signal, MonoObject *func) |
| 11660 | 63 | { |
| 64 | char *sig; | |
| 65 | void **instance = NULL; | |
| 66 | SignalData *sig_data; | |
| 15884 | 67 | PurpleMonoPlugin *mplug; |
|
11980
fe5c2c58508c
[gaim-migrate @ 14273]
Eoin Coffey <ecoffey@soc.pidgin.im>
parents:
11952
diff
changeset
|
68 | MonoClass *klass; |
|
31294
73607ab89c6f
Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents:
15884
diff
changeset
|
69 | |
| 11660 | 70 | sig = mono_string_to_utf8(signal); |
| 15884 | 71 | purple_debug(PURPLE_DEBUG_INFO, "mono", "connecting signal: %s\n", sig); |
|
31294
73607ab89c6f
Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents:
15884
diff
changeset
|
72 | |
| 11660 | 73 | instance = (void*)mono_object_unbox(h); |
|
31294
73607ab89c6f
Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents:
15884
diff
changeset
|
74 | |
| 11660 | 75 | sig_data = g_new0(SignalData, 1); |
|
31294
73607ab89c6f
Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents:
15884
diff
changeset
|
76 | |
| 11660 | 77 | sig_data->func = func; |
| 78 | sig_data->signal = sig; | |
|
31294
73607ab89c6f
Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents:
15884
diff
changeset
|
79 | |
| 15884 | 80 | purple_signal_get_values(*instance, sig, &sig_data->ret_value, &sig_data->num_vals, &sig_data->values); |
|
31294
73607ab89c6f
Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents:
15884
diff
changeset
|
81 | |
|
11980
fe5c2c58508c
[gaim-migrate @ 14273]
Eoin Coffey <ecoffey@soc.pidgin.im>
parents:
11952
diff
changeset
|
82 | klass = mono_object_get_class(plugin); |
|
31294
73607ab89c6f
Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents:
15884
diff
changeset
|
83 | |
|
11980
fe5c2c58508c
[gaim-migrate @ 14273]
Eoin Coffey <ecoffey@soc.pidgin.im>
parents:
11952
diff
changeset
|
84 | mplug = ml_find_plugin_by_class(klass); |
|
31294
73607ab89c6f
Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents:
15884
diff
changeset
|
85 | |
|
11980
fe5c2c58508c
[gaim-migrate @ 14273]
Eoin Coffey <ecoffey@soc.pidgin.im>
parents:
11952
diff
changeset
|
86 | mplug->signal_data = g_list_append(mplug->signal_data, (gpointer)sig_data); |
| 11660 | 87 | |
| 15884 | 88 | return purple_signal_connect(*instance, sig, (gpointer)klass, get_callback(sig_data), (gpointer)sig_data); |
| 11660 | 89 | } |
| 90 | ||
| 15884 | 91 | static int determine_index(PurpleType type) |
| 11660 | 92 | { |
| 93 | switch (type) { | |
| 15884 | 94 | case PURPLE_TYPE_SUBTYPE: |
| 95 | case PURPLE_TYPE_STRING: | |
| 96 | case PURPLE_TYPE_OBJECT: | |
| 97 | case PURPLE_TYPE_POINTER: | |
| 98 | case PURPLE_TYPE_BOXED: | |
| 11660 | 99 | return 1; |
| 100 | break; | |
| 101 | default: | |
| 102 | return type; | |
| 103 | break; | |
| 104 | } | |
| 105 | } | |
| 106 | ||
|
31294
73607ab89c6f
Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents:
15884
diff
changeset
|
107 | static gpointer callbacks[]= { |
| 11660 | 108 | NULL, |
| 109 | cb_void__pointer, | |
|
11980
fe5c2c58508c
[gaim-migrate @ 14273]
Eoin Coffey <ecoffey@soc.pidgin.im>
parents:
11952
diff
changeset
|
110 | NULL, |
|
fe5c2c58508c
[gaim-migrate @ 14273]
Eoin Coffey <ecoffey@soc.pidgin.im>
parents:
11952
diff
changeset
|
111 | cb_void__pointer_pointer_pointer |
| 11660 | 112 | }; |
| 113 | ||
| 15884 | 114 | static int callbacks_array_size = sizeof(callbacks) / sizeof(PurpleCallback); |
|
31294
73607ab89c6f
Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents:
15884
diff
changeset
|
115 | |
| 11660 | 116 | |
| 15884 | 117 | static PurpleCallback get_callback(SignalData *sig_data) |
| 11660 | 118 | { |
| 119 | int i, index = 0; | |
| 120 | ||
| 121 | if (sig_data->ret_value == NULL) | |
| 122 | index = 0; | |
| 123 | else | |
| 15884 | 124 | index = determine_index(purple_value_get_type(sig_data->ret_value)); |
|
31294
73607ab89c6f
Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents:
15884
diff
changeset
|
125 | |
| 11660 | 126 | for (i = 0; i < sig_data->num_vals; i++) { |
| 15884 | 127 | index += determine_index(purple_value_get_type(sig_data->values[i])); |
| 11660 | 128 | } |
|
31294
73607ab89c6f
Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents:
15884
diff
changeset
|
129 | |
| 15884 | 130 | purple_debug(PURPLE_DEBUG_INFO, "mono", "get_callback index = %d\n", index); |
|
31294
73607ab89c6f
Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents:
15884
diff
changeset
|
131 | |
| 11660 | 132 | if (index >= callbacks_array_size || callbacks[index] == NULL) { |
| 15884 | 133 | purple_debug(PURPLE_DEBUG_ERROR, "mono", "couldn't find a callback function for signal: %s\n", sig_data->signal); |
| 11660 | 134 | return NULL; |
| 135 | } | |
|
31294
73607ab89c6f
Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents:
15884
diff
changeset
|
136 | |
| 15884 | 137 | purple_debug(PURPLE_DEBUG_MISC, "mono", "using callback at index: %d\n", index); |
| 138 | return PURPLE_CALLBACK(callbacks[index]); | |
| 11660 | 139 | } |