Mercurial > pidgin
annotate src/signals.c @ 11157:f068eaabe332
[gaim-migrate @ 13242]
Patch submitted to gaim-devel...
"Marcin Owsiany sent you a draft advisory regarding multiple libgadu
vulnerabilities. "Fortunately" gaim contains an extremely old version of
libgadu and is affected only by memory alignment bug, which cannot be
exploited on x86. No other critical vulnerabilities are known in gaim's
version of libgadu.
You'll find the patch in attachment.
Regards,
Wojtek Kaniewski
ekg/libgadu maintainer"
committer: Tailor Script <tailor@pidgin.im>
author | Richard Laager <rlaager@wiktel.com> |
---|---|
date | Mon, 25 Jul 2005 21:20:14 +0000 |
parents | 1c5398ccbeb0 |
children | ebb02ea3c789 |
rev | line source |
---|---|
6485 | 1 /** |
6488
e5e8d21bd4d8
[gaim-migrate @ 7002]
Christian Hammond <chipx86@chipx86.com>
parents:
6485
diff
changeset
|
2 * @file signals.c Signal API |
6485 | 3 * @ingroup core |
4 * | |
5 * gaim | |
6 * | |
8046 | 7 * Gaim is the legal property of its developers, whose names are too numerous |
8 * to list here. Please refer to the COPYRIGHT file distributed with this | |
9 * source distribution. | |
6485 | 10 * |
11 * This program is free software; you can redistribute it and/or modify | |
12 * it under the terms of the GNU General Public License as published by | |
13 * the Free Software Foundation; either version 2 of the License, or | |
14 * (at your option) any later version. | |
15 * | |
16 * This program is distributed in the hope that it will be useful, | |
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
19 * GNU General Public License for more details. | |
20 * | |
21 * You should have received a copy of the GNU General Public License | |
22 * along with this program; if not, write to the Free Software | |
23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
24 */ | |
25 #include "internal.h" | |
26 | |
11080 | 27 #include "dbus-maybe.h" |
6485 | 28 #include "debug.h" |
29 #include "signals.h" | |
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
30 #include "value.h" |
6485 | 31 |
9127 | 32 /* must include this to use G_VA_COPY */ |
33 #include <string.h> | |
34 | |
6485 | 35 typedef struct |
36 { | |
37 void *instance; | |
38 | |
39 GHashTable *signals; | |
40 size_t signal_count; | |
41 | |
42 gulong next_signal_id; | |
43 | |
44 } GaimInstanceData; | |
45 | |
46 typedef struct | |
47 { | |
48 gulong id; | |
49 | |
50 GaimSignalMarshalFunc marshal; | |
51 | |
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
52 int num_values; |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
53 GaimValue **values; |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
54 GaimValue *ret_value; |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
55 |
6485 | 56 GList *handlers; |
57 size_t handler_count; | |
58 | |
59 gulong next_handler_id; | |
60 } GaimSignalData; | |
61 | |
62 typedef struct | |
63 { | |
64 gulong id; | |
65 GaimCallback cb; | |
66 void *handle; | |
67 void *data; | |
6547
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
68 gboolean use_vargs; |
10656 | 69 int priority; |
6485 | 70 |
71 } GaimSignalHandlerData; | |
72 | |
73 static GHashTable *instance_table = NULL; | |
74 | |
75 static void | |
76 destroy_instance_data(GaimInstanceData *instance_data) | |
77 { | |
78 g_hash_table_destroy(instance_data->signals); | |
79 | |
80 g_free(instance_data); | |
81 } | |
82 | |
83 static void | |
84 destroy_signal_data(GaimSignalData *signal_data) | |
85 { | |
86 GaimSignalHandlerData *handler_data; | |
87 GList *l; | |
88 | |
89 for (l = signal_data->handlers; l != NULL; l = l->next) | |
90 { | |
91 handler_data = (GaimSignalHandlerData *)l->data; | |
92 | |
93 g_free(l->data); | |
94 } | |
95 | |
96 g_list_free(signal_data->handlers); | |
97 | |
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
98 if (signal_data->values != NULL) |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
99 { |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
100 int i; |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
101 |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
102 for (i = 0; i < signal_data->num_values; i++) |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
103 gaim_value_destroy((GaimValue *)signal_data->values[i]); |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
104 |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
105 g_free(signal_data->values); |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
106 } |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
107 |
10542 | 108 if (signal_data->ret_value != NULL) |
109 gaim_value_destroy(signal_data->ret_value); | |
6485 | 110 g_free(signal_data); |
111 } | |
112 | |
113 gulong | |
114 gaim_signal_register(void *instance, const char *signal, | |
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
115 GaimSignalMarshalFunc marshal, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
116 GaimValue *ret_value, int num_values, ...) |
6485 | 117 { |
118 GaimInstanceData *instance_data; | |
119 GaimSignalData *signal_data; | |
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
120 va_list args; |
6485 | 121 |
122 g_return_val_if_fail(instance != NULL, 0); | |
123 g_return_val_if_fail(signal != NULL, 0); | |
124 g_return_val_if_fail(marshal != NULL, 0); | |
125 | |
126 instance_data = | |
127 (GaimInstanceData *)g_hash_table_lookup(instance_table, instance); | |
128 | |
129 if (instance_data == NULL) | |
130 { | |
131 instance_data = g_new0(GaimInstanceData, 1); | |
132 | |
133 instance_data->instance = instance; | |
134 instance_data->next_signal_id = 1; | |
135 | |
136 instance_data->signals = | |
137 g_hash_table_new_full(g_str_hash, g_str_equal, g_free, | |
138 (GDestroyNotify)destroy_signal_data); | |
139 | |
140 g_hash_table_insert(instance_table, instance, instance_data); | |
141 } | |
142 | |
143 signal_data = g_new0(GaimSignalData, 1); | |
144 signal_data->id = instance_data->next_signal_id; | |
145 signal_data->marshal = marshal; | |
146 signal_data->next_handler_id = 1; | |
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
147 signal_data->ret_value = ret_value; |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
148 signal_data->num_values = num_values; |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
149 |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
150 if (num_values > 0) |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
151 { |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
152 int i; |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
153 |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
154 signal_data->values = g_new0(GaimValue *, num_values); |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
155 |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
156 va_start(args, num_values); |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
157 |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
158 for (i = 0; i < num_values; i++) |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
159 signal_data->values[i] = va_arg(args, GaimValue *); |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
160 |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
161 va_end(args); |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
162 } |
6485 | 163 |
164 g_hash_table_insert(instance_data->signals, | |
165 g_strdup(signal), signal_data); | |
166 | |
167 instance_data->next_signal_id++; | |
168 instance_data->signal_count++; | |
169 | |
170 return signal_data->id; | |
171 } | |
172 | |
173 void | |
174 gaim_signal_unregister(void *instance, const char *signal) | |
175 { | |
176 GaimInstanceData *instance_data; | |
177 | |
178 g_return_if_fail(instance != NULL); | |
179 g_return_if_fail(signal != NULL); | |
180 | |
181 instance_data = | |
182 (GaimInstanceData *)g_hash_table_lookup(instance_table, instance); | |
183 | |
184 g_return_if_fail(instance_data != NULL); | |
185 | |
186 g_hash_table_remove(instance_data->signals, signal); | |
187 | |
188 instance_data->signal_count--; | |
189 | |
190 if (instance_data->signal_count == 0) | |
191 { | |
192 /* Unregister the instance. */ | |
193 g_hash_table_remove(instance_table, instance); | |
194 } | |
195 } | |
196 | |
197 void | |
198 gaim_signals_unregister_by_instance(void *instance) | |
199 { | |
200 gboolean found; | |
201 | |
202 g_return_if_fail(instance != NULL); | |
203 | |
204 found = g_hash_table_remove(instance_table, instance); | |
205 | |
206 /* | |
207 * Makes things easier (more annoying?) for developers who don't have | |
208 * things registering and unregistering in the right order :) | |
209 */ | |
210 g_return_if_fail(found); | |
211 } | |
212 | |
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
213 void |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
214 gaim_signal_get_values(void *instance, const char *signal, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
215 GaimValue **ret_value, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
216 int *num_values, GaimValue ***values) |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
217 { |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
218 GaimInstanceData *instance_data; |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
219 GaimSignalData *signal_data; |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
220 |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
221 g_return_if_fail(instance != NULL); |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
222 g_return_if_fail(signal != NULL); |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
223 g_return_if_fail(num_values != NULL); |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
224 g_return_if_fail(values != NULL); |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
225 |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
226 /* Get the instance data */ |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
227 instance_data = |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
228 (GaimInstanceData *)g_hash_table_lookup(instance_table, instance); |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
229 |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
230 g_return_if_fail(instance_data != NULL); |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
231 |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
232 /* Get the signal data */ |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
233 signal_data = |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
234 (GaimSignalData *)g_hash_table_lookup(instance_data->signals, signal); |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
235 |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
236 g_return_if_fail(signal_data != NULL); |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
237 |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
238 *num_values = signal_data->num_values; |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
239 *values = signal_data->values; |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
240 |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
241 if (ret_value != NULL) |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
242 *ret_value = signal_data->ret_value; |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
243 } |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
244 |
10656 | 245 static gint handler_priority(void * a, void * b) { |
246 GaimSignalHandlerData *ah = (GaimSignalHandlerData*)a; | |
247 GaimSignalHandlerData *bh = (GaimSignalHandlerData*)b; | |
248 if (ah->priority > bh->priority) return 1; | |
249 if (ah->priority < bh->priority) return -1; | |
250 return 0; | |
251 } | |
252 | |
6547
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
253 static gulong |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
254 signal_connect_common(void *instance, const char *signal, void *handle, |
10656 | 255 GaimCallback func, void *data, int priority, gboolean use_vargs) |
6485 | 256 { |
257 GaimInstanceData *instance_data; | |
258 GaimSignalData *signal_data; | |
259 GaimSignalHandlerData *handler_data; | |
260 | |
261 g_return_val_if_fail(instance != NULL, 0); | |
262 g_return_val_if_fail(signal != NULL, 0); | |
263 g_return_val_if_fail(handle != NULL, 0); | |
264 g_return_val_if_fail(func != NULL, 0); | |
265 | |
266 /* Get the instance data */ | |
267 instance_data = | |
268 (GaimInstanceData *)g_hash_table_lookup(instance_table, instance); | |
269 | |
270 g_return_val_if_fail(instance_data != NULL, 0); | |
271 | |
272 /* Get the signal data */ | |
273 signal_data = | |
274 (GaimSignalData *)g_hash_table_lookup(instance_data->signals, signal); | |
275 | |
276 if (signal_data == NULL) | |
277 { | |
278 gaim_debug(GAIM_DEBUG_ERROR, "signals", | |
279 "Signal data for %s not found!\n", signal); | |
280 return 0; | |
281 } | |
282 | |
283 /* Create the signal handler data */ | |
284 handler_data = g_new0(GaimSignalHandlerData, 1); | |
6547
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
285 handler_data->id = signal_data->next_handler_id; |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
286 handler_data->cb = func; |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
287 handler_data->handle = handle; |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
288 handler_data->data = data; |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
289 handler_data->use_vargs = use_vargs; |
10656 | 290 handler_data->priority = priority; |
10758 | 291 |
10656 | 292 signal_data->handlers = g_list_insert_sorted(signal_data->handlers, handler_data, (GCompareFunc)handler_priority); |
6485 | 293 signal_data->handler_count++; |
294 signal_data->next_handler_id++; | |
295 | |
296 return handler_data->id; | |
297 } | |
6553
9e4fa4853cfe
[gaim-migrate @ 7075]
Christian Hammond <chipx86@chipx86.com>
parents:
6547
diff
changeset
|
298 |
6547
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
299 gulong |
10656 | 300 gaim_signal_connect_priority(void *instance, const char *signal, void *handle, |
301 GaimCallback func, void *data, int priority) | |
302 { | |
303 return signal_connect_common(instance, signal, handle, func, data, priority, FALSE); | |
304 } | |
305 | |
306 gulong | |
6547
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
307 gaim_signal_connect(void *instance, const char *signal, void *handle, |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
308 GaimCallback func, void *data) |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
309 { |
10656 | 310 return signal_connect_common(instance, signal, handle, func, data, GAIM_SIGNAL_PRIORITY_DEFAULT, FALSE); |
311 } | |
312 | |
313 gulong | |
314 gaim_signal_connect_priority_vargs(void *instance, const char *signal, void *handle, | |
315 GaimCallback func, void *data, int priority) | |
316 { | |
317 return signal_connect_common(instance, signal, handle, func, data, priority, TRUE); | |
6547
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
318 } |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
319 |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
320 gulong |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
321 gaim_signal_connect_vargs(void *instance, const char *signal, void *handle, |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
322 GaimCallback func, void *data) |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
323 { |
10656 | 324 return signal_connect_common(instance, signal, handle, func, data, GAIM_SIGNAL_PRIORITY_DEFAULT, TRUE); |
6547
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
325 } |
6485 | 326 |
327 void | |
328 gaim_signal_disconnect(void *instance, const char *signal, | |
329 void *handle, GaimCallback func) | |
330 { | |
331 GaimInstanceData *instance_data; | |
332 GaimSignalData *signal_data; | |
333 GaimSignalHandlerData *handler_data; | |
334 GList *l; | |
335 gboolean found = FALSE; | |
336 | |
337 g_return_if_fail(instance != NULL); | |
338 g_return_if_fail(signal != NULL); | |
339 g_return_if_fail(handle != NULL); | |
340 g_return_if_fail(func != NULL); | |
341 | |
342 /* Get the instance data */ | |
343 instance_data = | |
344 (GaimInstanceData *)g_hash_table_lookup(instance_table, instance); | |
345 | |
346 g_return_if_fail(instance_data != NULL); | |
347 | |
348 /* Get the signal data */ | |
349 signal_data = | |
350 (GaimSignalData *)g_hash_table_lookup(instance_data->signals, signal); | |
351 | |
352 if (signal_data == NULL) | |
353 { | |
354 gaim_debug(GAIM_DEBUG_ERROR, "signals", | |
355 "Signal data for %s not found!\n", signal); | |
356 return; | |
357 } | |
358 | |
359 /* Find the handler data. */ | |
360 for (l = signal_data->handlers; l != NULL; l = l->next) | |
361 { | |
362 handler_data = (GaimSignalHandlerData *)l->data; | |
363 | |
364 if (handler_data->handle == handle && handler_data->cb == func) | |
365 { | |
366 g_free(handler_data); | |
367 | |
368 signal_data->handlers = g_list_remove(signal_data->handlers, | |
369 handler_data); | |
370 signal_data->handler_count--; | |
371 | |
372 found = TRUE; | |
373 | |
374 break; | |
375 } | |
376 } | |
377 | |
378 /* See note somewhere about this actually helping developers.. */ | |
379 g_return_if_fail(found); | |
380 } | |
381 | |
382 /* | |
383 * TODO: Make this all more efficient by storing a list of handlers, keyed | |
384 * to a handle. | |
385 */ | |
386 static void | |
387 disconnect_handle_from_signals(const char *signal, | |
388 GaimSignalData *signal_data, void *handle) | |
389 { | |
390 GList *l, *l_next; | |
391 GaimSignalHandlerData *handler_data; | |
392 | |
393 for (l = signal_data->handlers; l != NULL; l = l_next) | |
394 { | |
395 handler_data = (GaimSignalHandlerData *)l->data; | |
396 l_next = l->next; | |
397 | |
398 if (handler_data->handle == handle) | |
399 { | |
400 g_free(handler_data); | |
401 | |
402 signal_data->handler_count--; | |
403 signal_data->handlers = g_list_remove(signal_data->handlers, | |
404 handler_data); | |
405 } | |
406 } | |
407 } | |
408 | |
409 static void | |
410 disconnect_handle_from_instance(void *instance, | |
411 GaimInstanceData *instance_data, | |
412 void *handle) | |
413 { | |
414 g_hash_table_foreach(instance_data->signals, | |
415 (GHFunc)disconnect_handle_from_signals, handle); | |
416 } | |
417 | |
418 void | |
419 gaim_signals_disconnect_by_handle(void *handle) | |
420 { | |
421 g_return_if_fail(handle != NULL); | |
422 | |
423 g_hash_table_foreach(instance_table, | |
424 (GHFunc)disconnect_handle_from_instance, handle); | |
425 } | |
426 | |
427 void | |
428 gaim_signal_emit(void *instance, const char *signal, ...) | |
429 { | |
430 va_list args; | |
431 | |
7584
9e93a4bf1934
[gaim-migrate @ 8202]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
432 g_return_if_fail(instance != NULL); |
9e93a4bf1934
[gaim-migrate @ 8202]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
433 g_return_if_fail(signal != NULL); |
9e93a4bf1934
[gaim-migrate @ 8202]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
434 |
6485 | 435 va_start(args, signal); |
436 gaim_signal_emit_vargs(instance, signal, args); | |
437 va_end(args); | |
438 } | |
439 | |
440 void | |
441 gaim_signal_emit_vargs(void *instance, const char *signal, va_list args) | |
442 { | |
443 GaimInstanceData *instance_data; | |
444 GaimSignalData *signal_data; | |
445 GaimSignalHandlerData *handler_data; | |
8004
07dc83303503
[gaim-migrate @ 8681]
Christian Hammond <chipx86@chipx86.com>
parents:
7597
diff
changeset
|
446 GList *l, *l_next; |
8090 | 447 va_list tmp; |
6485 | 448 |
449 g_return_if_fail(instance != NULL); | |
450 g_return_if_fail(signal != NULL); | |
451 | |
452 instance_data = | |
453 (GaimInstanceData *)g_hash_table_lookup(instance_table, instance); | |
454 | |
455 g_return_if_fail(instance_data != NULL); | |
456 | |
457 signal_data = | |
458 (GaimSignalData *)g_hash_table_lookup(instance_data->signals, signal); | |
459 | |
460 if (signal_data == NULL) | |
461 { | |
462 gaim_debug(GAIM_DEBUG_ERROR, "signals", | |
463 "Signal data for %s not found!\n", signal); | |
464 return; | |
465 } | |
466 | |
8004
07dc83303503
[gaim-migrate @ 8681]
Christian Hammond <chipx86@chipx86.com>
parents:
7597
diff
changeset
|
467 for (l = signal_data->handlers; l != NULL; l = l_next) |
6485 | 468 { |
8004
07dc83303503
[gaim-migrate @ 8681]
Christian Hammond <chipx86@chipx86.com>
parents:
7597
diff
changeset
|
469 l_next = l->next; |
07dc83303503
[gaim-migrate @ 8681]
Christian Hammond <chipx86@chipx86.com>
parents:
7597
diff
changeset
|
470 |
6485 | 471 handler_data = (GaimSignalHandlerData *)l->data; |
472 | |
8090 | 473 /* This is necessary because a va_list may only be |
474 * evaluated once */ | |
8142 | 475 G_VA_COPY(tmp, args); |
8090 | 476 |
6547
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
477 if (handler_data->use_vargs) |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
478 { |
8090 | 479 ((void (*)(va_list, void *))handler_data->cb)(tmp, |
6547
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
480 handler_data->data); |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
481 } |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
482 else |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
483 { |
8090 | 484 signal_data->marshal(handler_data->cb, tmp, |
6547
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
485 handler_data->data, NULL); |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
486 } |
8090 | 487 |
488 va_end(tmp); | |
6485 | 489 } |
11080 | 490 |
491 #ifdef HAVE_DBUS | |
11146 | 492 gaim_dbus_signal_emit_gaim(gaim_dbus_object, signal, |
11080 | 493 signal_data->num_values, |
494 signal_data->values, args); | |
495 #endif /* HAVE_DBUS */ | |
496 | |
6485 | 497 } |
498 | |
499 void * | |
500 gaim_signal_emit_return_1(void *instance, const char *signal, ...) | |
501 { | |
502 void *ret_val; | |
503 va_list args; | |
504 | |
7597
191e5b9a249b
[gaim-migrate @ 8218]
Christian Hammond <chipx86@chipx86.com>
parents:
7585
diff
changeset
|
505 g_return_val_if_fail(instance != NULL, NULL); |
191e5b9a249b
[gaim-migrate @ 8218]
Christian Hammond <chipx86@chipx86.com>
parents:
7585
diff
changeset
|
506 g_return_val_if_fail(signal != NULL, NULL); |
7585
404f4a4b81da
[gaim-migrate @ 8203]
Christian Hammond <chipx86@chipx86.com>
parents:
7584
diff
changeset
|
507 |
6485 | 508 va_start(args, signal); |
509 ret_val = gaim_signal_emit_vargs_return_1(instance, signal, args); | |
510 va_end(args); | |
511 | |
512 return ret_val; | |
513 } | |
514 | |
515 void * | |
516 gaim_signal_emit_vargs_return_1(void *instance, const char *signal, | |
517 va_list args) | |
518 { | |
519 GaimInstanceData *instance_data; | |
520 GaimSignalData *signal_data; | |
521 GaimSignalHandlerData *handler_data; | |
8004
07dc83303503
[gaim-migrate @ 8681]
Christian Hammond <chipx86@chipx86.com>
parents:
7597
diff
changeset
|
522 GList *l, *l_next; |
8140 | 523 va_list tmp; |
6485 | 524 |
525 g_return_val_if_fail(instance != NULL, NULL); | |
526 g_return_val_if_fail(signal != NULL, NULL); | |
527 | |
528 instance_data = | |
529 (GaimInstanceData *)g_hash_table_lookup(instance_table, instance); | |
530 | |
531 g_return_val_if_fail(instance_data != NULL, NULL); | |
532 | |
533 signal_data = | |
534 (GaimSignalData *)g_hash_table_lookup(instance_data->signals, signal); | |
535 | |
536 if (signal_data == NULL) | |
537 { | |
538 gaim_debug(GAIM_DEBUG_ERROR, "signals", | |
539 "Signal data for %s not found!\n", signal); | |
540 return 0; | |
541 } | |
542 | |
11080 | 543 #ifdef HAVE_DBUS |
11146 | 544 gaim_dbus_signal_emit_gaim(gaim_dbus_object, signal, |
11080 | 545 signal_data->num_values, |
546 signal_data->values, args); | |
547 #endif /* HAVE_DBUS */ | |
548 | |
8004
07dc83303503
[gaim-migrate @ 8681]
Christian Hammond <chipx86@chipx86.com>
parents:
7597
diff
changeset
|
549 for (l = signal_data->handlers; l != NULL; l = l_next) |
6485 | 550 { |
10789
0caa9827edf5
[gaim-migrate @ 12431]
Luke Schierer <lschiere@pidgin.im>
parents:
10758
diff
changeset
|
551 void *ret_val = NULL; |
0caa9827edf5
[gaim-migrate @ 12431]
Luke Schierer <lschiere@pidgin.im>
parents:
10758
diff
changeset
|
552 |
8004
07dc83303503
[gaim-migrate @ 8681]
Christian Hammond <chipx86@chipx86.com>
parents:
7597
diff
changeset
|
553 l_next = l->next; |
07dc83303503
[gaim-migrate @ 8681]
Christian Hammond <chipx86@chipx86.com>
parents:
7597
diff
changeset
|
554 |
6485 | 555 handler_data = (GaimSignalHandlerData *)l->data; |
556 | |
8142 | 557 G_VA_COPY(tmp, args); |
6547
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
558 if (handler_data->use_vargs) |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
559 { |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
560 ret_val = ((void *(*)(va_list, void *))handler_data->cb)( |
8140 | 561 tmp, handler_data->data); |
6547
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
562 } |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
563 else |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
564 { |
8140 | 565 signal_data->marshal(handler_data->cb, tmp, |
6547
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
566 handler_data->data, &ret_val); |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
567 } |
8140 | 568 va_end(tmp); |
10789
0caa9827edf5
[gaim-migrate @ 12431]
Luke Schierer <lschiere@pidgin.im>
parents:
10758
diff
changeset
|
569 |
0caa9827edf5
[gaim-migrate @ 12431]
Luke Schierer <lschiere@pidgin.im>
parents:
10758
diff
changeset
|
570 if (ret_val != NULL) |
0caa9827edf5
[gaim-migrate @ 12431]
Luke Schierer <lschiere@pidgin.im>
parents:
10758
diff
changeset
|
571 return ret_val; |
6485 | 572 } |
573 | |
10789
0caa9827edf5
[gaim-migrate @ 12431]
Luke Schierer <lschiere@pidgin.im>
parents:
10758
diff
changeset
|
574 return NULL; |
6485 | 575 } |
576 | |
577 void | |
578 gaim_signals_init() | |
579 { | |
580 g_return_if_fail(instance_table == NULL); | |
581 | |
11033
50224ac8184d
[gaim-migrate @ 12919]
Etan Reisner <pidgin@unreliablesource.net>
parents:
10789
diff
changeset
|
582 gaim_debug_register_category("signals"); |
50224ac8184d
[gaim-migrate @ 12919]
Etan Reisner <pidgin@unreliablesource.net>
parents:
10789
diff
changeset
|
583 |
6485 | 584 instance_table = |
585 g_hash_table_new_full(g_direct_hash, g_direct_equal, | |
586 NULL, (GDestroyNotify)destroy_instance_data); | |
587 } | |
588 | |
589 void | |
590 gaim_signals_uninit() | |
591 { | |
592 g_return_if_fail(instance_table != NULL); | |
593 | |
594 g_hash_table_destroy(instance_table); | |
595 instance_table = NULL; | |
11033
50224ac8184d
[gaim-migrate @ 12919]
Etan Reisner <pidgin@unreliablesource.net>
parents:
10789
diff
changeset
|
596 |
50224ac8184d
[gaim-migrate @ 12919]
Etan Reisner <pidgin@unreliablesource.net>
parents:
10789
diff
changeset
|
597 gaim_debug_unregister_category("signals"); |
6485 | 598 } |
599 | |
600 /************************************************************************** | |
601 * Marshallers | |
602 **************************************************************************/ | |
603 void | |
604 gaim_marshal_VOID(GaimCallback cb, va_list args, void *data, | |
605 void **return_val) | |
606 { | |
607 ((void (*)(void *))cb)(data); | |
608 } | |
609 | |
610 void | |
6822
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
611 gaim_marshal_VOID__INT(GaimCallback cb, va_list args, void *data, |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
612 void **return_val) |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
613 { |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
614 gint arg1 = va_arg(args, gint); |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
615 |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
616 ((void (*)(gint, void *))cb)(arg1, data); |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
617 } |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
618 |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
619 void |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
620 gaim_marshal_VOID__INT_INT(GaimCallback cb, va_list args, void *data, |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
621 void **return_val) |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
622 { |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
623 gint arg1 = va_arg(args, gint); |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
624 gint arg2 = va_arg(args, gint); |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
625 |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
626 ((void (*)(gint, gint, void *))cb)(arg1, arg2, data); |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
627 } |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
628 |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
629 void |
6485 | 630 gaim_marshal_VOID__POINTER(GaimCallback cb, va_list args, void *data, |
631 void **return_val) | |
632 { | |
6505 | 633 void *arg1 = va_arg(args, void *); |
634 | |
635 ((void (*)(void *, void *))cb)(arg1, data); | |
6485 | 636 } |
637 | |
638 void | |
9734 | 639 gaim_marshal_VOID__POINTER_UINT(GaimCallback cb, va_list args, |
640 void *data, void **return_val) | |
641 { | |
642 void *arg1 = va_arg(args, void *); | |
643 guint arg2 = va_arg(args, guint); | |
644 | |
645 ((void (*)(void *, guint, void *))cb)(arg1, arg2, data); | |
646 } | |
647 | |
648 void | |
6485 | 649 gaim_marshal_VOID__POINTER_POINTER(GaimCallback cb, va_list args, |
650 void *data, void **return_val) | |
651 { | |
6505 | 652 void *arg1 = va_arg(args, void *); |
653 void *arg2 = va_arg(args, void *); | |
654 | |
655 ((void (*)(void *, void *, void *))cb)(arg1, arg2, data); | |
6485 | 656 } |
657 | |
658 void | |
659 gaim_marshal_VOID__POINTER_POINTER_UINT(GaimCallback cb, va_list args, | |
660 void *data, void **return_val) | |
661 { | |
6505 | 662 void *arg1 = va_arg(args, void *); |
663 void *arg2 = va_arg(args, void *); | |
664 guint arg3 = va_arg(args, guint); | |
665 | |
666 ((void (*)(void *, void *, guint, void *))cb)(arg1, arg2, arg3, data); | |
6485 | 667 } |
668 | |
669 void | |
9554 | 670 gaim_marshal_VOID__POINTER_POINTER_UINT_UINT(GaimCallback cb, va_list args, |
671 void *data, void **return_val) | |
672 { | |
673 void *arg1 = va_arg(args, void *); | |
674 void *arg2 = va_arg(args, void *); | |
675 guint arg3 = va_arg(args, guint); | |
676 guint arg4 = va_arg(args, guint); | |
677 | |
678 ((void (*)(void *, void *, guint, guint, void *))cb)(arg1, arg2, arg3, arg4, data); | |
679 } | |
680 | |
681 void | |
6485 | 682 gaim_marshal_VOID__POINTER_POINTER_POINTER(GaimCallback cb, va_list args, |
683 void *data, void **return_val) | |
684 { | |
6505 | 685 void *arg1 = va_arg(args, void *); |
686 void *arg2 = va_arg(args, void *); | |
687 void *arg3 = va_arg(args, void *); | |
688 | |
689 ((void (*)(void *, void *, void *, void *))cb)(arg1, arg2, arg3, data); | |
6485 | 690 } |
691 | |
692 void | |
693 gaim_marshal_VOID__POINTER_POINTER_POINTER_POINTER(GaimCallback cb, | |
694 va_list args, | |
695 void *data, | |
696 void **return_val) | |
697 { | |
6505 | 698 void *arg1 = va_arg(args, void *); |
699 void *arg2 = va_arg(args, void *); | |
700 void *arg3 = va_arg(args, void *); | |
701 void *arg4 = va_arg(args, void *); | |
702 | |
703 ((void (*)(void *, void *, void *, void *, void *))cb)(arg1, arg2, arg3, arg4, data); | |
6485 | 704 } |
6509 | 705 |
706 void | |
9514 | 707 gaim_marshal_VOID__POINTER_POINTER_POINTER_POINTER_POINTER(GaimCallback cb, |
708 va_list args, | |
709 void *data, | |
710 void **return_val) | |
711 { | |
712 void *arg1 = va_arg(args, void *); | |
713 void *arg2 = va_arg(args, void *); | |
714 void *arg3 = va_arg(args, void *); | |
715 void *arg4 = va_arg(args, void *); | |
716 void *arg5 = va_arg(args, void *); | |
717 | |
718 ((void (*)(void *, void *, void *, void *, void *, void *))cb)(arg1, arg2, arg3, arg4, arg5, data); | |
719 } | |
720 | |
721 void | |
6509 | 722 gaim_marshal_VOID__POINTER_POINTER_POINTER_UINT(GaimCallback cb, |
723 va_list args, | |
724 void *data, | |
725 void **return_val) | |
726 { | |
727 void *arg1 = va_arg(args, void *); | |
728 void *arg2 = va_arg(args, void *); | |
729 void *arg3 = va_arg(args, void *); | |
730 guint arg4 = va_arg(args, guint); | |
731 | |
732 ((void (*)(void *, void *, void *, guint, void *))cb)(arg1, arg2, arg3, arg4, data); | |
733 } | |
734 | |
6485 | 735 void |
10104 | 736 gaim_marshal_VOID__POINTER_POINTER_POINTER_POINTER_UINT(GaimCallback cb, |
737 va_list args, | |
738 void *data, | |
739 void **return_val) | |
740 { | |
741 void *arg1 = va_arg(args, void *); | |
742 void *arg2 = va_arg(args, void *); | |
743 void *arg3 = va_arg(args, void *); | |
744 void *arg4 = va_arg(args, void *); | |
745 guint arg5 = va_arg(args, guint); | |
746 | |
747 ((void (*)(void *, void *, void *, void *, guint, void *))cb)(arg1, arg2, arg3, arg4, arg5, data); | |
748 } | |
749 | |
750 void | |
6485 | 751 gaim_marshal_VOID__POINTER_POINTER_POINTER_UINT_UINT(GaimCallback cb, |
752 va_list args, | |
753 void *data, | |
754 void **return_val) | |
755 { | |
6505 | 756 void *arg1 = va_arg(args, void *); |
757 void *arg2 = va_arg(args, void *); | |
758 void *arg3 = va_arg(args, void *); | |
759 guint arg4 = va_arg(args, guint); | |
760 guint arg5 = va_arg(args, guint); | |
761 | |
6485 | 762 ((void (*)(void *, void *, void *, guint, guint, void *))cb)( |
6505 | 763 arg1, arg2, arg3, arg4, arg5, data); |
6485 | 764 } |
765 | |
766 void | |
6822
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
767 gaim_marshal_INT__INT(GaimCallback cb, va_list args, void *data, |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
768 void **return_val) |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
769 { |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
770 gint ret_val; |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
771 gint arg1 = va_arg(args, gint); |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
772 |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
773 ret_val = ((gint (*)(gint, void *))cb)(arg1, data); |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
774 |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
775 if (return_val != NULL) |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
776 *return_val = GINT_TO_POINTER(ret_val); |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
777 } |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
778 |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
779 void |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
780 gaim_marshal_INT__INT_INT(GaimCallback cb, va_list args, void *data, |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
781 void **return_val) |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
782 { |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
783 gint ret_val; |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
784 gint arg1 = va_arg(args, gint); |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
785 gint arg2 = va_arg(args, gint); |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
786 |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
787 ret_val = ((gint (*)(gint, gint, void *))cb)(arg1, arg2, data); |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
788 |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
789 if (return_val != NULL) |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
790 *return_val = GINT_TO_POINTER(ret_val); |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
791 } |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
792 |
11064
e4459e8ccfb5
[gaim-migrate @ 13035]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
793 |
e4459e8ccfb5
[gaim-migrate @ 13035]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
794 void |
e4459e8ccfb5
[gaim-migrate @ 13035]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
795 gaim_marshal_INT__POINTER_POINTER_POINTER_POINTER_POINTER( |
e4459e8ccfb5
[gaim-migrate @ 13035]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
796 GaimCallback cb, va_list args, void *data, void **return_val) |
e4459e8ccfb5
[gaim-migrate @ 13035]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
797 { |
e4459e8ccfb5
[gaim-migrate @ 13035]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
798 gint ret_val; |
e4459e8ccfb5
[gaim-migrate @ 13035]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
799 void *arg1 = va_arg(args, void *); |
e4459e8ccfb5
[gaim-migrate @ 13035]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
800 void *arg2 = va_arg(args, void *); |
e4459e8ccfb5
[gaim-migrate @ 13035]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
801 void *arg3 = va_arg(args, void *); |
e4459e8ccfb5
[gaim-migrate @ 13035]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
802 void *arg4 = va_arg(args, void *); |
e4459e8ccfb5
[gaim-migrate @ 13035]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
803 void *arg5 = va_arg(args, void *); |
e4459e8ccfb5
[gaim-migrate @ 13035]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
804 |
e4459e8ccfb5
[gaim-migrate @ 13035]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
805 ret_val = |
e4459e8ccfb5
[gaim-migrate @ 13035]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
806 ((gint (*)(void *, void *, void *, void *, void *, void *))cb)( |
e4459e8ccfb5
[gaim-migrate @ 13035]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
807 arg1, arg2, arg3, arg4, arg5, data); |
e4459e8ccfb5
[gaim-migrate @ 13035]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
808 |
e4459e8ccfb5
[gaim-migrate @ 13035]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
809 if (return_val != NULL) |
e4459e8ccfb5
[gaim-migrate @ 13035]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
810 *return_val = GINT_TO_POINTER(ret_val); |
e4459e8ccfb5
[gaim-migrate @ 13035]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
811 } |
e4459e8ccfb5
[gaim-migrate @ 13035]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
812 |
6822
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
813 void |
6485 | 814 gaim_marshal_BOOLEAN__POINTER(GaimCallback cb, va_list args, void *data, |
815 void **return_val) | |
816 { | |
817 gboolean ret_val; | |
6505 | 818 void *arg1 = va_arg(args, void *); |
6485 | 819 |
6505 | 820 ret_val = ((gboolean (*)(void *, void *))cb)(arg1, data); |
6485 | 821 |
822 if (return_val != NULL) | |
823 *return_val = GINT_TO_POINTER(ret_val); | |
824 } | |
825 | |
826 void | |
827 gaim_marshal_BOOLEAN__POINTER_POINTER(GaimCallback cb, va_list args, | |
828 void *data, void **return_val) | |
829 { | |
830 gboolean ret_val; | |
6505 | 831 void *arg1 = va_arg(args, void *); |
832 void *arg2 = va_arg(args, void *); | |
6485 | 833 |
6505 | 834 ret_val = ((gboolean (*)(void *, void *, void *))cb)(arg1, arg2, data); |
6485 | 835 |
836 if (return_val != NULL) | |
837 *return_val = GINT_TO_POINTER(ret_val); | |
838 } | |
839 | |
840 void | |
6509 | 841 gaim_marshal_BOOLEAN__POINTER_POINTER_POINTER(GaimCallback cb, va_list args, |
842 void *data, void **return_val) | |
843 { | |
844 gboolean ret_val; | |
845 void *arg1 = va_arg(args, void *); | |
846 void *arg2 = va_arg(args, void *); | |
847 void *arg3 = va_arg(args, void *); | |
848 | |
849 ret_val = ((gboolean (*)(void *, void *, void *, void *))cb)(arg1, arg2, | |
850 arg3, data); | |
851 | |
852 if (return_val != NULL) | |
853 *return_val = GINT_TO_POINTER(ret_val); | |
854 } | |
855 | |
856 void | |
857 gaim_marshal_BOOLEAN__POINTER_POINTER_UINT(GaimCallback cb, | |
858 va_list args, | |
859 void *data, | |
860 void **return_val) | |
861 { | |
862 gboolean ret_val; | |
863 void *arg1 = va_arg(args, void *); | |
864 void *arg2 = va_arg(args, void *); | |
865 guint arg3 = va_arg(args, guint); | |
866 | |
867 ret_val = ((gboolean (*)(void *, void *, guint, void *))cb)( | |
868 arg1, arg2, arg3, data); | |
869 | |
870 if (return_val != NULL) | |
871 *return_val = GINT_TO_POINTER(ret_val); | |
872 } | |
873 | |
874 void | |
6485 | 875 gaim_marshal_BOOLEAN__POINTER_POINTER_POINTER_UINT(GaimCallback cb, |
876 va_list args, | |
877 void *data, | |
878 void **return_val) | |
879 { | |
880 gboolean ret_val; | |
6505 | 881 void *arg1 = va_arg(args, void *); |
882 void *arg2 = va_arg(args, void *); | |
883 void *arg3 = va_arg(args, void *); | |
884 guint arg4 = va_arg(args, guint); | |
6485 | 885 |
886 ret_val = ((gboolean (*)(void *, void *, void *, guint, void *))cb)( | |
6505 | 887 arg1, arg2, arg3, arg4, data); |
6485 | 888 |
889 if (return_val != NULL) | |
890 *return_val = GINT_TO_POINTER(ret_val); | |
891 } | |
892 | |
893 void | |
894 gaim_marshal_BOOLEAN__POINTER_POINTER_POINTER_POINTER(GaimCallback cb, | |
895 va_list args, | |
896 void *data, | |
897 void **return_val) | |
898 { | |
899 gboolean ret_val; | |
6505 | 900 void *arg1 = va_arg(args, void *); |
901 void *arg2 = va_arg(args, void *); | |
902 void *arg3 = va_arg(args, void *); | |
903 void *arg4 = va_arg(args, void *); | |
6485 | 904 |
905 ret_val = ((gboolean (*)(void *, void *, void *, void *, void *))cb)( | |
6505 | 906 arg1, arg2, arg3, arg4, data); |
6485 | 907 |
908 if (return_val != NULL) | |
909 *return_val = GINT_TO_POINTER(ret_val); | |
910 } | |
911 | |
912 void | |
913 gaim_marshal_BOOLEAN__POINTER_POINTER_POINTER_POINTER_POINTER( | |
914 GaimCallback cb, va_list args, void *data, void **return_val) | |
915 { | |
916 gboolean ret_val; | |
6505 | 917 void *arg1 = va_arg(args, void *); |
918 void *arg2 = va_arg(args, void *); | |
919 void *arg3 = va_arg(args, void *); | |
920 void *arg4 = va_arg(args, void *); | |
921 void *arg5 = va_arg(args, void *); | |
6485 | 922 |
923 ret_val = | |
924 ((gboolean (*)(void *, void *, void *, void *, void *, void *))cb)( | |
6505 | 925 arg1, arg2, arg3, arg4, arg5, data); |
6485 | 926 |
927 if (return_val != NULL) | |
928 *return_val = GINT_TO_POINTER(ret_val); | |
929 } |