Thu, 24 Oct 2013 03:37:02 +0530
Merged default branch
| 11660 | 1 | #include "mono-glue.h" |
| 2 | #include "mono-helper.h" | |
| 3 | #include "debug.h" | |
|
34706
02cb08146888
Renamed blist.[ch] to buddylist.[ch]
Ankit Vani <a@nevitus.org>
parents:
31294
diff
changeset
|
4 | #include "buddylist.h" |
| 11660 | 5 | #include "signals.h" |
| 6 | ||
| 7 | typedef struct { | |
| 8 | MonoObject *func; | |
| 9 | char *signal; | |
|
35008
e3277f6c9c03
Removed the use of PurpleValue/PurpleType from mono
Ankit Vani <a@nevitus.org>
parents:
34800
diff
changeset
|
10 | GType *types; |
|
e3277f6c9c03
Removed the use of PurpleValue/PurpleType from mono
Ankit Vani <a@nevitus.org>
parents:
34800
diff
changeset
|
11 | GType ret_type; |
| 11660 | 12 | int num_vals; |
| 13 | } SignalData; | |
| 14 | ||
| 15884 | 15 | static PurpleCallback get_callback(SignalData *sig_data); |
| 11660 | 16 | |
| 17 | static gpointer dispatch_callback(SignalData *sig_data, int num_vals, ...) | |
| 18 | { | |
| 19 | MonoArray *array; | |
| 20 | MonoObject *obj; | |
| 21 | int i; | |
| 22 | gpointer meth_args[1]; | |
| 15884 | 23 | gpointer purple_obj; |
|
31294
73607ab89c6f
Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents:
15884
diff
changeset
|
24 | |
| 11660 | 25 | va_list args; |
|
31294
73607ab89c6f
Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents:
15884
diff
changeset
|
26 | |
| 11660 | 27 | va_start(args, num_vals); |
|
31294
73607ab89c6f
Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents:
15884
diff
changeset
|
28 | |
|
11980
fe5c2c58508c
[gaim-migrate @ 14273]
Eoin Coffey <ecoffey@soc.pidgin.im>
parents:
11952
diff
changeset
|
29 | 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
|
30 | |
| 11660 | 31 | for (i = 0; i < num_vals; i++) { |
|
35008
e3277f6c9c03
Removed the use of PurpleValue/PurpleType from mono
Ankit Vani <a@nevitus.org>
parents:
34800
diff
changeset
|
32 | purple_obj = va_arg(args, gpointer); |
|
e3277f6c9c03
Removed the use of PurpleValue/PurpleType from mono
Ankit Vani <a@nevitus.org>
parents:
34800
diff
changeset
|
33 | obj = ml_object_from_purple_type(sig_data->types[i], purple_obj); |
|
e3277f6c9c03
Removed the use of PurpleValue/PurpleType from mono
Ankit Vani <a@nevitus.org>
parents:
34800
diff
changeset
|
34 | mono_array_set(array, MonoObject*, i, obj); |
| 11660 | 35 | } |
|
31294
73607ab89c6f
Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents:
15884
diff
changeset
|
36 | |
| 11660 | 37 | va_end(args); |
|
31294
73607ab89c6f
Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents:
15884
diff
changeset
|
38 | |
| 11660 | 39 | meth_args[0] = array; |
|
31294
73607ab89c6f
Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents:
15884
diff
changeset
|
40 | |
|
73607ab89c6f
Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents:
15884
diff
changeset
|
41 | return ml_delegate_invoke(sig_data->func, meth_args); |
| 11660 | 42 | } |
| 43 | ||
| 44 | static void cb_void__pointer(void *arg1, void *data) | |
| 45 | { | |
|
31294
73607ab89c6f
Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents:
15884
diff
changeset
|
46 | dispatch_callback((SignalData*)data, ((SignalData*)data)->num_vals, arg1); |
| 11660 | 47 | } |
| 48 | ||
|
11980
fe5c2c58508c
[gaim-migrate @ 14273]
Eoin Coffey <ecoffey@soc.pidgin.im>
parents:
11952
diff
changeset
|
49 | 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
|
50 | { |
|
31294
73607ab89c6f
Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents:
15884
diff
changeset
|
51 | 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
|
52 | } |
|
fe5c2c58508c
[gaim-migrate @ 14273]
Eoin Coffey <ecoffey@soc.pidgin.im>
parents:
11952
diff
changeset
|
53 | |
|
fe5c2c58508c
[gaim-migrate @ 14273]
Eoin Coffey <ecoffey@soc.pidgin.im>
parents:
11952
diff
changeset
|
54 | |
| 15884 | 55 | int purple_signal_connect_glue(MonoObject* h, MonoObject *plugin, MonoString *signal, MonoObject *func) |
| 11660 | 56 | { |
| 57 | char *sig; | |
| 58 | void **instance = NULL; | |
| 59 | SignalData *sig_data; | |
| 15884 | 60 | PurpleMonoPlugin *mplug; |
|
11980
fe5c2c58508c
[gaim-migrate @ 14273]
Eoin Coffey <ecoffey@soc.pidgin.im>
parents:
11952
diff
changeset
|
61 | MonoClass *klass; |
|
31294
73607ab89c6f
Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents:
15884
diff
changeset
|
62 | |
| 11660 | 63 | sig = mono_string_to_utf8(signal); |
| 15884 | 64 | 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
|
65 | |
| 11660 | 66 | instance = (void*)mono_object_unbox(h); |
|
31294
73607ab89c6f
Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents:
15884
diff
changeset
|
67 | |
| 11660 | 68 | sig_data = g_new0(SignalData, 1); |
|
31294
73607ab89c6f
Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents:
15884
diff
changeset
|
69 | |
| 11660 | 70 | sig_data->func = func; |
| 71 | sig_data->signal = sig; | |
|
31294
73607ab89c6f
Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents:
15884
diff
changeset
|
72 | |
|
35008
e3277f6c9c03
Removed the use of PurpleValue/PurpleType from mono
Ankit Vani <a@nevitus.org>
parents:
34800
diff
changeset
|
73 | purple_signal_get_types(*instance, sig, &sig_data->ret_type, &sig_data->num_vals, &sig_data->types); |
|
31294
73607ab89c6f
Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents:
15884
diff
changeset
|
74 | |
|
11980
fe5c2c58508c
[gaim-migrate @ 14273]
Eoin Coffey <ecoffey@soc.pidgin.im>
parents:
11952
diff
changeset
|
75 | klass = mono_object_get_class(plugin); |
|
31294
73607ab89c6f
Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents:
15884
diff
changeset
|
76 | |
|
11980
fe5c2c58508c
[gaim-migrate @ 14273]
Eoin Coffey <ecoffey@soc.pidgin.im>
parents:
11952
diff
changeset
|
77 | mplug = ml_find_plugin_by_class(klass); |
|
31294
73607ab89c6f
Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents:
15884
diff
changeset
|
78 | |
|
11980
fe5c2c58508c
[gaim-migrate @ 14273]
Eoin Coffey <ecoffey@soc.pidgin.im>
parents:
11952
diff
changeset
|
79 | mplug->signal_data = g_list_append(mplug->signal_data, (gpointer)sig_data); |
| 11660 | 80 | |
| 15884 | 81 | return purple_signal_connect(*instance, sig, (gpointer)klass, get_callback(sig_data), (gpointer)sig_data); |
| 11660 | 82 | } |
| 83 | ||
|
35008
e3277f6c9c03
Removed the use of PurpleValue/PurpleType from mono
Ankit Vani <a@nevitus.org>
parents:
34800
diff
changeset
|
84 | static int determine_index(GType type) |
| 11660 | 85 | { |
| 86 | switch (type) { | |
|
35008
e3277f6c9c03
Removed the use of PurpleValue/PurpleType from mono
Ankit Vani <a@nevitus.org>
parents:
34800
diff
changeset
|
87 | case G_TYPE_STRING: |
|
e3277f6c9c03
Removed the use of PurpleValue/PurpleType from mono
Ankit Vani <a@nevitus.org>
parents:
34800
diff
changeset
|
88 | case G_TYPE_POINTER: |
| 11660 | 89 | return 1; |
| 90 | break; | |
| 91 | default: | |
|
35008
e3277f6c9c03
Removed the use of PurpleValue/PurpleType from mono
Ankit Vani <a@nevitus.org>
parents:
34800
diff
changeset
|
92 | if (G_TYPE_IS_OBJECT(type) || G_TYPE_IS_BOXED(type)) |
|
e3277f6c9c03
Removed the use of PurpleValue/PurpleType from mono
Ankit Vani <a@nevitus.org>
parents:
34800
diff
changeset
|
93 | return 1; |
| 11660 | 94 | return type; |
| 95 | break; | |
| 96 | } | |
| 97 | } | |
| 98 | ||
|
31294
73607ab89c6f
Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents:
15884
diff
changeset
|
99 | static gpointer callbacks[]= { |
| 11660 | 100 | NULL, |
| 101 | cb_void__pointer, | |
|
11980
fe5c2c58508c
[gaim-migrate @ 14273]
Eoin Coffey <ecoffey@soc.pidgin.im>
parents:
11952
diff
changeset
|
102 | NULL, |
|
fe5c2c58508c
[gaim-migrate @ 14273]
Eoin Coffey <ecoffey@soc.pidgin.im>
parents:
11952
diff
changeset
|
103 | cb_void__pointer_pointer_pointer |
| 11660 | 104 | }; |
| 105 | ||
| 15884 | 106 | static int callbacks_array_size = sizeof(callbacks) / sizeof(PurpleCallback); |
|
31294
73607ab89c6f
Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents:
15884
diff
changeset
|
107 | |
| 11660 | 108 | |
| 15884 | 109 | static PurpleCallback get_callback(SignalData *sig_data) |
| 11660 | 110 | { |
| 111 | int i, index = 0; | |
| 112 | ||
|
35008
e3277f6c9c03
Removed the use of PurpleValue/PurpleType from mono
Ankit Vani <a@nevitus.org>
parents:
34800
diff
changeset
|
113 | if (sig_data->ret_type == NULL) |
| 11660 | 114 | index = 0; |
| 115 | else | |
|
35008
e3277f6c9c03
Removed the use of PurpleValue/PurpleType from mono
Ankit Vani <a@nevitus.org>
parents:
34800
diff
changeset
|
116 | index = determine_index(sig_data->ret_type); |
|
31294
73607ab89c6f
Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents:
15884
diff
changeset
|
117 | |
| 11660 | 118 | for (i = 0; i < sig_data->num_vals; i++) { |
|
35008
e3277f6c9c03
Removed the use of PurpleValue/PurpleType from mono
Ankit Vani <a@nevitus.org>
parents:
34800
diff
changeset
|
119 | index += determine_index(sig_data->types[i]); |
| 11660 | 120 | } |
|
31294
73607ab89c6f
Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents:
15884
diff
changeset
|
121 | |
| 15884 | 122 | 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
|
123 | |
| 11660 | 124 | if (index >= callbacks_array_size || callbacks[index] == NULL) { |
| 15884 | 125 | purple_debug(PURPLE_DEBUG_ERROR, "mono", "couldn't find a callback function for signal: %s\n", sig_data->signal); |
| 11660 | 126 | return NULL; |
| 127 | } | |
|
31294
73607ab89c6f
Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents:
15884
diff
changeset
|
128 | |
| 15884 | 129 | purple_debug(PURPLE_DEBUG_MISC, "mono", "using callback at index: %d\n", index); |
| 130 | return PURPLE_CALLBACK(callbacks[index]); | |
| 11660 | 131 | } |