Mercurial > pidgin.yaz
annotate src/signals.c @ 9613:1b13160bf5a4
[gaim-migrate @ 10456]
"Okay, now it's better. Still should close #997210. Note
the list below is mostly the same as my initial comment and
replaces the former information.
1) Prevent a crash if you sign off and try to dequeue
messages from the away dialog. This was because we tried to
use the destroyed GaimConnection in a couple places to get
the prpl's name for the HTML logger and other conversation
data. We look up the information via the account instead.
2) Prevent a possible crash if gaim_gtkconv_write_conv is
called with who as NULL.
3) Prevent (null) or an empty string from being logged as
the sender's name if the sender no longer has an alias
because the
account is signed off." --Kevin Stange
committer: Tailor Script <tailor@pidgin.im>
author | Luke Schierer <lschiere@pidgin.im> |
---|---|
date | Thu, 29 Jul 2004 03:11:00 +0000 |
parents | 8b2451878e26 |
children | 676cf082d29c |
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 | |
27 #include "debug.h" | |
28 #include "signals.h" | |
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
29 #include "value.h" |
6485 | 30 |
9127 | 31 /* must include this to use G_VA_COPY */ |
32 #include <string.h> | |
33 | |
6485 | 34 typedef struct |
35 { | |
36 void *instance; | |
37 | |
38 GHashTable *signals; | |
39 size_t signal_count; | |
40 | |
41 gulong next_signal_id; | |
42 | |
43 } GaimInstanceData; | |
44 | |
45 typedef struct | |
46 { | |
47 gulong id; | |
48 | |
49 GaimSignalMarshalFunc marshal; | |
50 | |
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
51 int num_values; |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
52 GaimValue **values; |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
53 GaimValue *ret_value; |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
54 |
6485 | 55 GList *handlers; |
56 size_t handler_count; | |
57 | |
58 gulong next_handler_id; | |
59 | |
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; |
6485 | 69 |
70 } GaimSignalHandlerData; | |
71 | |
72 static GHashTable *instance_table = NULL; | |
73 | |
74 static void | |
75 destroy_instance_data(GaimInstanceData *instance_data) | |
76 { | |
77 g_hash_table_destroy(instance_data->signals); | |
78 | |
79 g_free(instance_data); | |
80 } | |
81 | |
82 static void | |
83 destroy_signal_data(GaimSignalData *signal_data) | |
84 { | |
85 GaimSignalHandlerData *handler_data; | |
86 GList *l; | |
87 | |
88 for (l = signal_data->handlers; l != NULL; l = l->next) | |
89 { | |
90 handler_data = (GaimSignalHandlerData *)l->data; | |
91 | |
92 g_free(l->data); | |
93 } | |
94 | |
95 g_list_free(signal_data->handlers); | |
96 | |
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
97 if (signal_data->values != NULL) |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
98 { |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
99 int i; |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
100 |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
101 for (i = 0; i < signal_data->num_values; i++) |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
102 gaim_value_destroy((GaimValue *)signal_data->values[i]); |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
103 |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
104 g_free(signal_data->values); |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
105 } |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
106 |
6485 | 107 g_free(signal_data); |
108 } | |
109 | |
110 gulong | |
111 gaim_signal_register(void *instance, const char *signal, | |
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
112 GaimSignalMarshalFunc marshal, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
113 GaimValue *ret_value, int num_values, ...) |
6485 | 114 { |
115 GaimInstanceData *instance_data; | |
116 GaimSignalData *signal_data; | |
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
117 va_list args; |
6485 | 118 |
119 g_return_val_if_fail(instance != NULL, 0); | |
120 g_return_val_if_fail(signal != NULL, 0); | |
121 g_return_val_if_fail(marshal != NULL, 0); | |
122 | |
123 instance_data = | |
124 (GaimInstanceData *)g_hash_table_lookup(instance_table, instance); | |
125 | |
126 if (instance_data == NULL) | |
127 { | |
128 instance_data = g_new0(GaimInstanceData, 1); | |
129 | |
130 instance_data->instance = instance; | |
131 instance_data->next_signal_id = 1; | |
132 | |
133 instance_data->signals = | |
134 g_hash_table_new_full(g_str_hash, g_str_equal, g_free, | |
135 (GDestroyNotify)destroy_signal_data); | |
136 | |
137 g_hash_table_insert(instance_table, instance, instance_data); | |
138 } | |
139 | |
140 signal_data = g_new0(GaimSignalData, 1); | |
141 signal_data->id = instance_data->next_signal_id; | |
142 signal_data->marshal = marshal; | |
143 signal_data->next_handler_id = 1; | |
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
144 signal_data->ret_value = ret_value; |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
145 signal_data->num_values = num_values; |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
146 |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
147 if (num_values > 0) |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
148 { |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
149 int i; |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
150 |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
151 signal_data->values = g_new0(GaimValue *, num_values); |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
152 |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
153 va_start(args, num_values); |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
154 |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
155 for (i = 0; i < num_values; i++) |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
156 signal_data->values[i] = va_arg(args, GaimValue *); |
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 va_end(args); |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
159 } |
6485 | 160 |
161 g_hash_table_insert(instance_data->signals, | |
162 g_strdup(signal), signal_data); | |
163 | |
164 instance_data->next_signal_id++; | |
165 instance_data->signal_count++; | |
166 | |
167 return signal_data->id; | |
168 } | |
169 | |
170 void | |
171 gaim_signal_unregister(void *instance, const char *signal) | |
172 { | |
173 GaimInstanceData *instance_data; | |
174 | |
175 g_return_if_fail(instance != NULL); | |
176 g_return_if_fail(signal != NULL); | |
177 | |
178 instance_data = | |
179 (GaimInstanceData *)g_hash_table_lookup(instance_table, instance); | |
180 | |
181 g_return_if_fail(instance_data != NULL); | |
182 | |
183 g_hash_table_remove(instance_data->signals, signal); | |
184 | |
185 instance_data->signal_count--; | |
186 | |
187 if (instance_data->signal_count == 0) | |
188 { | |
189 /* Unregister the instance. */ | |
190 g_hash_table_remove(instance_table, instance); | |
191 } | |
192 } | |
193 | |
194 void | |
195 gaim_signals_unregister_by_instance(void *instance) | |
196 { | |
197 gboolean found; | |
198 | |
199 g_return_if_fail(instance != NULL); | |
200 | |
201 found = g_hash_table_remove(instance_table, instance); | |
202 | |
203 /* | |
204 * Makes things easier (more annoying?) for developers who don't have | |
205 * things registering and unregistering in the right order :) | |
206 */ | |
207 g_return_if_fail(found); | |
208 } | |
209 | |
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
210 void |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
211 gaim_signal_get_values(void *instance, const char *signal, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
212 GaimValue **ret_value, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
213 int *num_values, GaimValue ***values) |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
214 { |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
215 GaimInstanceData *instance_data; |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
216 GaimSignalData *signal_data; |
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 g_return_if_fail(instance != NULL); |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
219 g_return_if_fail(signal != NULL); |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
220 g_return_if_fail(num_values != NULL); |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
221 g_return_if_fail(values != NULL); |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
222 |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
223 /* Get the instance data */ |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
224 instance_data = |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
225 (GaimInstanceData *)g_hash_table_lookup(instance_table, instance); |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
226 |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
227 g_return_if_fail(instance_data != NULL); |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
228 |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
229 /* Get the signal data */ |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
230 signal_data = |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
231 (GaimSignalData *)g_hash_table_lookup(instance_data->signals, signal); |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
232 |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
233 g_return_if_fail(signal_data != NULL); |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
234 |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
235 *num_values = signal_data->num_values; |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
236 *values = signal_data->values; |
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 if (ret_value != NULL) |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
239 *ret_value = signal_data->ret_value; |
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 |
6547
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
242 static gulong |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
243 signal_connect_common(void *instance, const char *signal, void *handle, |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
244 GaimCallback func, void *data, gboolean use_vargs) |
6485 | 245 { |
246 GaimInstanceData *instance_data; | |
247 GaimSignalData *signal_data; | |
248 GaimSignalHandlerData *handler_data; | |
249 | |
250 g_return_val_if_fail(instance != NULL, 0); | |
251 g_return_val_if_fail(signal != NULL, 0); | |
252 g_return_val_if_fail(handle != NULL, 0); | |
253 g_return_val_if_fail(func != NULL, 0); | |
254 | |
255 /* Get the instance data */ | |
256 instance_data = | |
257 (GaimInstanceData *)g_hash_table_lookup(instance_table, instance); | |
258 | |
259 g_return_val_if_fail(instance_data != NULL, 0); | |
260 | |
261 /* Get the signal data */ | |
262 signal_data = | |
263 (GaimSignalData *)g_hash_table_lookup(instance_data->signals, signal); | |
264 | |
265 if (signal_data == NULL) | |
266 { | |
267 gaim_debug(GAIM_DEBUG_ERROR, "signals", | |
268 "Signal data for %s not found!\n", signal); | |
269 return 0; | |
270 } | |
271 | |
272 /* Create the signal handler data */ | |
273 handler_data = g_new0(GaimSignalHandlerData, 1); | |
6547
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
274 handler_data->id = signal_data->next_handler_id; |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
275 handler_data->cb = func; |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
276 handler_data->handle = handle; |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
277 handler_data->data = data; |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
278 handler_data->use_vargs = use_vargs; |
6485 | 279 |
280 signal_data->handlers = g_list_append(signal_data->handlers, handler_data); | |
281 signal_data->handler_count++; | |
282 signal_data->next_handler_id++; | |
283 | |
284 return handler_data->id; | |
285 } | |
6553
9e4fa4853cfe
[gaim-migrate @ 7075]
Christian Hammond <chipx86@chipx86.com>
parents:
6547
diff
changeset
|
286 |
6547
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
287 gulong |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
288 gaim_signal_connect(void *instance, const char *signal, void *handle, |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
289 GaimCallback func, void *data) |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
290 { |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
291 return signal_connect_common(instance, signal, handle, func, data, FALSE); |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
292 } |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
293 |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
294 gulong |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
295 gaim_signal_connect_vargs(void *instance, const char *signal, void *handle, |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
296 GaimCallback func, void *data) |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
297 { |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
298 return signal_connect_common(instance, signal, handle, func, data, TRUE); |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
299 } |
6485 | 300 |
301 void | |
302 gaim_signal_disconnect(void *instance, const char *signal, | |
303 void *handle, GaimCallback func) | |
304 { | |
305 GaimInstanceData *instance_data; | |
306 GaimSignalData *signal_data; | |
307 GaimSignalHandlerData *handler_data; | |
308 GList *l; | |
309 gboolean found = FALSE; | |
310 | |
311 g_return_if_fail(instance != NULL); | |
312 g_return_if_fail(signal != NULL); | |
313 g_return_if_fail(handle != NULL); | |
314 g_return_if_fail(func != NULL); | |
315 | |
316 /* Get the instance data */ | |
317 instance_data = | |
318 (GaimInstanceData *)g_hash_table_lookup(instance_table, instance); | |
319 | |
320 g_return_if_fail(instance_data != NULL); | |
321 | |
322 /* Get the signal data */ | |
323 signal_data = | |
324 (GaimSignalData *)g_hash_table_lookup(instance_data->signals, signal); | |
325 | |
326 if (signal_data == NULL) | |
327 { | |
328 gaim_debug(GAIM_DEBUG_ERROR, "signals", | |
329 "Signal data for %s not found!\n", signal); | |
330 return; | |
331 } | |
332 | |
333 /* Find the handler data. */ | |
334 for (l = signal_data->handlers; l != NULL; l = l->next) | |
335 { | |
336 handler_data = (GaimSignalHandlerData *)l->data; | |
337 | |
338 if (handler_data->handle == handle && handler_data->cb == func) | |
339 { | |
340 g_free(handler_data); | |
341 | |
342 signal_data->handlers = g_list_remove(signal_data->handlers, | |
343 handler_data); | |
344 signal_data->handler_count--; | |
345 | |
346 found = TRUE; | |
347 | |
348 break; | |
349 } | |
350 } | |
351 | |
352 /* See note somewhere about this actually helping developers.. */ | |
353 g_return_if_fail(found); | |
354 } | |
355 | |
356 /* | |
357 * TODO: Make this all more efficient by storing a list of handlers, keyed | |
358 * to a handle. | |
359 */ | |
360 static void | |
361 disconnect_handle_from_signals(const char *signal, | |
362 GaimSignalData *signal_data, void *handle) | |
363 { | |
364 GList *l, *l_next; | |
365 GaimSignalHandlerData *handler_data; | |
366 | |
367 for (l = signal_data->handlers; l != NULL; l = l_next) | |
368 { | |
369 handler_data = (GaimSignalHandlerData *)l->data; | |
370 l_next = l->next; | |
371 | |
372 if (handler_data->handle == handle) | |
373 { | |
374 g_free(handler_data); | |
375 | |
376 signal_data->handler_count--; | |
377 signal_data->handlers = g_list_remove(signal_data->handlers, | |
378 handler_data); | |
379 } | |
380 } | |
381 } | |
382 | |
383 static void | |
384 disconnect_handle_from_instance(void *instance, | |
385 GaimInstanceData *instance_data, | |
386 void *handle) | |
387 { | |
388 g_hash_table_foreach(instance_data->signals, | |
389 (GHFunc)disconnect_handle_from_signals, handle); | |
390 } | |
391 | |
392 void | |
393 gaim_signals_disconnect_by_handle(void *handle) | |
394 { | |
395 g_return_if_fail(handle != NULL); | |
396 | |
397 g_hash_table_foreach(instance_table, | |
398 (GHFunc)disconnect_handle_from_instance, handle); | |
399 } | |
400 | |
401 void | |
402 gaim_signal_emit(void *instance, const char *signal, ...) | |
403 { | |
404 va_list args; | |
405 | |
7584
9e93a4bf1934
[gaim-migrate @ 8202]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
406 g_return_if_fail(instance != NULL); |
9e93a4bf1934
[gaim-migrate @ 8202]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
407 g_return_if_fail(signal != NULL); |
9e93a4bf1934
[gaim-migrate @ 8202]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
408 |
6485 | 409 va_start(args, signal); |
410 gaim_signal_emit_vargs(instance, signal, args); | |
411 va_end(args); | |
412 } | |
413 | |
414 void | |
415 gaim_signal_emit_vargs(void *instance, const char *signal, va_list args) | |
416 { | |
417 GaimInstanceData *instance_data; | |
418 GaimSignalData *signal_data; | |
419 GaimSignalHandlerData *handler_data; | |
8004
07dc83303503
[gaim-migrate @ 8681]
Christian Hammond <chipx86@chipx86.com>
parents:
7597
diff
changeset
|
420 GList *l, *l_next; |
8090 | 421 va_list tmp; |
6485 | 422 |
423 g_return_if_fail(instance != NULL); | |
424 g_return_if_fail(signal != NULL); | |
425 | |
426 instance_data = | |
427 (GaimInstanceData *)g_hash_table_lookup(instance_table, instance); | |
428 | |
429 g_return_if_fail(instance_data != NULL); | |
430 | |
431 signal_data = | |
432 (GaimSignalData *)g_hash_table_lookup(instance_data->signals, signal); | |
433 | |
434 if (signal_data == NULL) | |
435 { | |
436 gaim_debug(GAIM_DEBUG_ERROR, "signals", | |
437 "Signal data for %s not found!\n", signal); | |
438 return; | |
439 } | |
440 | |
8004
07dc83303503
[gaim-migrate @ 8681]
Christian Hammond <chipx86@chipx86.com>
parents:
7597
diff
changeset
|
441 for (l = signal_data->handlers; l != NULL; l = l_next) |
6485 | 442 { |
8004
07dc83303503
[gaim-migrate @ 8681]
Christian Hammond <chipx86@chipx86.com>
parents:
7597
diff
changeset
|
443 l_next = l->next; |
07dc83303503
[gaim-migrate @ 8681]
Christian Hammond <chipx86@chipx86.com>
parents:
7597
diff
changeset
|
444 |
6485 | 445 handler_data = (GaimSignalHandlerData *)l->data; |
446 | |
8090 | 447 /* This is necessary because a va_list may only be |
448 * evaluated once */ | |
8142 | 449 G_VA_COPY(tmp, args); |
8090 | 450 |
6547
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
451 if (handler_data->use_vargs) |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
452 { |
8090 | 453 ((void (*)(va_list, void *))handler_data->cb)(tmp, |
6547
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
454 handler_data->data); |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
455 } |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
456 else |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
457 { |
8090 | 458 signal_data->marshal(handler_data->cb, tmp, |
6547
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
459 handler_data->data, NULL); |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
460 } |
8090 | 461 |
462 va_end(tmp); | |
6485 | 463 } |
464 } | |
465 | |
466 void * | |
467 gaim_signal_emit_return_1(void *instance, const char *signal, ...) | |
468 { | |
469 void *ret_val; | |
470 va_list args; | |
471 | |
7597
191e5b9a249b
[gaim-migrate @ 8218]
Christian Hammond <chipx86@chipx86.com>
parents:
7585
diff
changeset
|
472 g_return_val_if_fail(instance != NULL, NULL); |
191e5b9a249b
[gaim-migrate @ 8218]
Christian Hammond <chipx86@chipx86.com>
parents:
7585
diff
changeset
|
473 g_return_val_if_fail(signal != NULL, NULL); |
7585
404f4a4b81da
[gaim-migrate @ 8203]
Christian Hammond <chipx86@chipx86.com>
parents:
7584
diff
changeset
|
474 |
6485 | 475 va_start(args, signal); |
476 ret_val = gaim_signal_emit_vargs_return_1(instance, signal, args); | |
477 va_end(args); | |
478 | |
479 return ret_val; | |
480 } | |
481 | |
482 void * | |
483 gaim_signal_emit_vargs_return_1(void *instance, const char *signal, | |
484 va_list args) | |
485 { | |
486 GaimInstanceData *instance_data; | |
487 GaimSignalData *signal_data; | |
488 GaimSignalHandlerData *handler_data; | |
489 void *ret_val = NULL; | |
8004
07dc83303503
[gaim-migrate @ 8681]
Christian Hammond <chipx86@chipx86.com>
parents:
7597
diff
changeset
|
490 GList *l, *l_next; |
8140 | 491 va_list tmp; |
6485 | 492 |
493 g_return_val_if_fail(instance != NULL, NULL); | |
494 g_return_val_if_fail(signal != NULL, NULL); | |
495 | |
496 instance_data = | |
497 (GaimInstanceData *)g_hash_table_lookup(instance_table, instance); | |
498 | |
499 g_return_val_if_fail(instance_data != NULL, NULL); | |
500 | |
501 signal_data = | |
502 (GaimSignalData *)g_hash_table_lookup(instance_data->signals, signal); | |
503 | |
504 if (signal_data == NULL) | |
505 { | |
506 gaim_debug(GAIM_DEBUG_ERROR, "signals", | |
507 "Signal data for %s not found!\n", signal); | |
508 return 0; | |
509 } | |
510 | |
8004
07dc83303503
[gaim-migrate @ 8681]
Christian Hammond <chipx86@chipx86.com>
parents:
7597
diff
changeset
|
511 for (l = signal_data->handlers; l != NULL; l = l_next) |
6485 | 512 { |
8004
07dc83303503
[gaim-migrate @ 8681]
Christian Hammond <chipx86@chipx86.com>
parents:
7597
diff
changeset
|
513 l_next = l->next; |
07dc83303503
[gaim-migrate @ 8681]
Christian Hammond <chipx86@chipx86.com>
parents:
7597
diff
changeset
|
514 |
6485 | 515 handler_data = (GaimSignalHandlerData *)l->data; |
516 | |
8142 | 517 G_VA_COPY(tmp, args); |
6547
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
518 if (handler_data->use_vargs) |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
519 { |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
520 ret_val = ((void *(*)(va_list, void *))handler_data->cb)( |
8140 | 521 tmp, handler_data->data); |
6547
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
522 } |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
523 else |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
524 { |
8140 | 525 signal_data->marshal(handler_data->cb, tmp, |
6547
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
526 handler_data->data, &ret_val); |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
527 } |
8140 | 528 va_end(tmp); |
6485 | 529 } |
530 | |
531 return ret_val; | |
532 } | |
533 | |
534 void | |
535 gaim_signals_init() | |
536 { | |
537 g_return_if_fail(instance_table == NULL); | |
538 | |
539 instance_table = | |
540 g_hash_table_new_full(g_direct_hash, g_direct_equal, | |
541 NULL, (GDestroyNotify)destroy_instance_data); | |
542 } | |
543 | |
544 void | |
545 gaim_signals_uninit() | |
546 { | |
547 g_return_if_fail(instance_table != NULL); | |
548 | |
549 g_hash_table_destroy(instance_table); | |
550 instance_table = NULL; | |
551 } | |
552 | |
553 /************************************************************************** | |
554 * Marshallers | |
555 **************************************************************************/ | |
556 void | |
557 gaim_marshal_VOID(GaimCallback cb, va_list args, void *data, | |
558 void **return_val) | |
559 { | |
560 ((void (*)(void *))cb)(data); | |
561 } | |
562 | |
563 void | |
6822
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
564 gaim_marshal_VOID__INT(GaimCallback cb, va_list args, void *data, |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
565 void **return_val) |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
566 { |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
567 gint arg1 = va_arg(args, gint); |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
568 |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
569 ((void (*)(gint, void *))cb)(arg1, data); |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
570 } |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
571 |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
572 void |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
573 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
|
574 void **return_val) |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
575 { |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
576 gint arg1 = va_arg(args, gint); |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
577 gint arg2 = va_arg(args, gint); |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
578 |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
579 ((void (*)(gint, gint, void *))cb)(arg1, arg2, data); |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
580 } |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
581 |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
582 void |
6485 | 583 gaim_marshal_VOID__POINTER(GaimCallback cb, va_list args, void *data, |
584 void **return_val) | |
585 { | |
6505 | 586 void *arg1 = va_arg(args, void *); |
587 | |
588 ((void (*)(void *, void *))cb)(arg1, data); | |
6485 | 589 } |
590 | |
591 void | |
592 gaim_marshal_VOID__POINTER_POINTER(GaimCallback cb, va_list args, | |
593 void *data, void **return_val) | |
594 { | |
6505 | 595 void *arg1 = va_arg(args, void *); |
596 void *arg2 = va_arg(args, void *); | |
597 | |
598 ((void (*)(void *, void *, void *))cb)(arg1, arg2, data); | |
6485 | 599 } |
600 | |
601 void | |
602 gaim_marshal_VOID__POINTER_POINTER_UINT(GaimCallback cb, va_list args, | |
603 void *data, void **return_val) | |
604 { | |
6505 | 605 void *arg1 = va_arg(args, void *); |
606 void *arg2 = va_arg(args, void *); | |
607 guint arg3 = va_arg(args, guint); | |
608 | |
609 ((void (*)(void *, void *, guint, void *))cb)(arg1, arg2, arg3, data); | |
6485 | 610 } |
611 | |
612 void | |
9554 | 613 gaim_marshal_VOID__POINTER_POINTER_UINT_UINT(GaimCallback cb, va_list args, |
614 void *data, void **return_val) | |
615 { | |
616 void *arg1 = va_arg(args, void *); | |
617 void *arg2 = va_arg(args, void *); | |
618 guint arg3 = va_arg(args, guint); | |
619 guint arg4 = va_arg(args, guint); | |
620 | |
621 ((void (*)(void *, void *, guint, guint, void *))cb)(arg1, arg2, arg3, arg4, data); | |
622 } | |
623 | |
624 void | |
6485 | 625 gaim_marshal_VOID__POINTER_POINTER_POINTER(GaimCallback cb, va_list args, |
626 void *data, void **return_val) | |
627 { | |
6505 | 628 void *arg1 = va_arg(args, void *); |
629 void *arg2 = va_arg(args, void *); | |
630 void *arg3 = va_arg(args, void *); | |
631 | |
632 ((void (*)(void *, void *, void *, void *))cb)(arg1, arg2, arg3, data); | |
6485 | 633 } |
634 | |
635 void | |
636 gaim_marshal_VOID__POINTER_POINTER_POINTER_POINTER(GaimCallback cb, | |
637 va_list args, | |
638 void *data, | |
639 void **return_val) | |
640 { | |
6505 | 641 void *arg1 = va_arg(args, void *); |
642 void *arg2 = va_arg(args, void *); | |
643 void *arg3 = va_arg(args, void *); | |
644 void *arg4 = va_arg(args, void *); | |
645 | |
646 ((void (*)(void *, void *, void *, void *, void *))cb)(arg1, arg2, arg3, arg4, data); | |
6485 | 647 } |
6509 | 648 |
649 void | |
9514 | 650 gaim_marshal_VOID__POINTER_POINTER_POINTER_POINTER_POINTER(GaimCallback cb, |
651 va_list args, | |
652 void *data, | |
653 void **return_val) | |
654 { | |
655 void *arg1 = va_arg(args, void *); | |
656 void *arg2 = va_arg(args, void *); | |
657 void *arg3 = va_arg(args, void *); | |
658 void *arg4 = va_arg(args, void *); | |
659 void *arg5 = va_arg(args, void *); | |
660 | |
661 ((void (*)(void *, void *, void *, void *, void *, void *))cb)(arg1, arg2, arg3, arg4, arg5, data); | |
662 } | |
663 | |
664 void | |
6509 | 665 gaim_marshal_VOID__POINTER_POINTER_POINTER_UINT(GaimCallback cb, |
666 va_list args, | |
667 void *data, | |
668 void **return_val) | |
669 { | |
670 void *arg1 = va_arg(args, void *); | |
671 void *arg2 = va_arg(args, void *); | |
672 void *arg3 = va_arg(args, void *); | |
673 guint arg4 = va_arg(args, guint); | |
674 | |
675 ((void (*)(void *, void *, void *, guint, void *))cb)(arg1, arg2, arg3, arg4, data); | |
676 } | |
677 | |
6485 | 678 void |
679 gaim_marshal_VOID__POINTER_POINTER_POINTER_UINT_UINT(GaimCallback cb, | |
680 va_list args, | |
681 void *data, | |
682 void **return_val) | |
683 { | |
6505 | 684 void *arg1 = va_arg(args, void *); |
685 void *arg2 = va_arg(args, void *); | |
686 void *arg3 = va_arg(args, void *); | |
687 guint arg4 = va_arg(args, guint); | |
688 guint arg5 = va_arg(args, guint); | |
689 | |
6485 | 690 ((void (*)(void *, void *, void *, guint, guint, void *))cb)( |
6505 | 691 arg1, arg2, arg3, arg4, arg5, data); |
6485 | 692 } |
693 | |
694 void | |
6822
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
695 gaim_marshal_INT__INT(GaimCallback cb, va_list args, void *data, |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
696 void **return_val) |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
697 { |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
698 gint ret_val; |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
699 gint arg1 = va_arg(args, gint); |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
700 |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
701 ret_val = ((gint (*)(gint, void *))cb)(arg1, data); |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
702 |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
703 if (return_val != NULL) |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
704 *return_val = GINT_TO_POINTER(ret_val); |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
705 } |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
706 |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
707 void |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
708 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
|
709 void **return_val) |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
710 { |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
711 gint ret_val; |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
712 gint arg1 = va_arg(args, gint); |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
713 gint arg2 = va_arg(args, gint); |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
714 |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
715 ret_val = ((gint (*)(gint, gint, void *))cb)(arg1, arg2, data); |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
716 |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
717 if (return_val != NULL) |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
718 *return_val = GINT_TO_POINTER(ret_val); |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
719 } |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
720 |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
721 void |
6485 | 722 gaim_marshal_BOOLEAN__POINTER(GaimCallback cb, va_list args, void *data, |
723 void **return_val) | |
724 { | |
725 gboolean ret_val; | |
6505 | 726 void *arg1 = va_arg(args, void *); |
6485 | 727 |
6505 | 728 ret_val = ((gboolean (*)(void *, void *))cb)(arg1, data); |
6485 | 729 |
730 if (return_val != NULL) | |
731 *return_val = GINT_TO_POINTER(ret_val); | |
732 } | |
733 | |
734 void | |
735 gaim_marshal_BOOLEAN__POINTER_POINTER(GaimCallback cb, va_list args, | |
736 void *data, void **return_val) | |
737 { | |
738 gboolean ret_val; | |
6505 | 739 void *arg1 = va_arg(args, void *); |
740 void *arg2 = va_arg(args, void *); | |
6485 | 741 |
6505 | 742 ret_val = ((gboolean (*)(void *, void *, void *))cb)(arg1, arg2, data); |
6485 | 743 |
744 if (return_val != NULL) | |
745 *return_val = GINT_TO_POINTER(ret_val); | |
746 } | |
747 | |
748 void | |
6509 | 749 gaim_marshal_BOOLEAN__POINTER_POINTER_POINTER(GaimCallback cb, va_list args, |
750 void *data, void **return_val) | |
751 { | |
752 gboolean ret_val; | |
753 void *arg1 = va_arg(args, void *); | |
754 void *arg2 = va_arg(args, void *); | |
755 void *arg3 = va_arg(args, void *); | |
756 | |
757 ret_val = ((gboolean (*)(void *, void *, void *, void *))cb)(arg1, arg2, | |
758 arg3, data); | |
759 | |
760 if (return_val != NULL) | |
761 *return_val = GINT_TO_POINTER(ret_val); | |
762 } | |
763 | |
764 void | |
765 gaim_marshal_BOOLEAN__POINTER_POINTER_UINT(GaimCallback cb, | |
766 va_list args, | |
767 void *data, | |
768 void **return_val) | |
769 { | |
770 gboolean ret_val; | |
771 void *arg1 = va_arg(args, void *); | |
772 void *arg2 = va_arg(args, void *); | |
773 guint arg3 = va_arg(args, guint); | |
774 | |
775 ret_val = ((gboolean (*)(void *, void *, guint, void *))cb)( | |
776 arg1, arg2, arg3, data); | |
777 | |
778 if (return_val != NULL) | |
779 *return_val = GINT_TO_POINTER(ret_val); | |
780 } | |
781 | |
782 void | |
6485 | 783 gaim_marshal_BOOLEAN__POINTER_POINTER_POINTER_UINT(GaimCallback cb, |
784 va_list args, | |
785 void *data, | |
786 void **return_val) | |
787 { | |
788 gboolean ret_val; | |
6505 | 789 void *arg1 = va_arg(args, void *); |
790 void *arg2 = va_arg(args, void *); | |
791 void *arg3 = va_arg(args, void *); | |
792 guint arg4 = va_arg(args, guint); | |
6485 | 793 |
794 ret_val = ((gboolean (*)(void *, void *, void *, guint, void *))cb)( | |
6505 | 795 arg1, arg2, arg3, arg4, data); |
6485 | 796 |
797 if (return_val != NULL) | |
798 *return_val = GINT_TO_POINTER(ret_val); | |
799 } | |
800 | |
801 void | |
802 gaim_marshal_BOOLEAN__POINTER_POINTER_POINTER_POINTER(GaimCallback cb, | |
803 va_list args, | |
804 void *data, | |
805 void **return_val) | |
806 { | |
807 gboolean ret_val; | |
6505 | 808 void *arg1 = va_arg(args, void *); |
809 void *arg2 = va_arg(args, void *); | |
810 void *arg3 = va_arg(args, void *); | |
811 void *arg4 = va_arg(args, void *); | |
6485 | 812 |
813 ret_val = ((gboolean (*)(void *, void *, void *, void *, void *))cb)( | |
6505 | 814 arg1, arg2, arg3, arg4, data); |
6485 | 815 |
816 if (return_val != NULL) | |
817 *return_val = GINT_TO_POINTER(ret_val); | |
818 } | |
819 | |
820 void | |
821 gaim_marshal_BOOLEAN__POINTER_POINTER_POINTER_POINTER_POINTER( | |
822 GaimCallback cb, va_list args, void *data, void **return_val) | |
823 { | |
824 gboolean ret_val; | |
6505 | 825 void *arg1 = va_arg(args, void *); |
826 void *arg2 = va_arg(args, void *); | |
827 void *arg3 = va_arg(args, void *); | |
828 void *arg4 = va_arg(args, void *); | |
829 void *arg5 = va_arg(args, void *); | |
6485 | 830 |
831 ret_val = | |
832 ((gboolean (*)(void *, void *, void *, void *, void *, void *))cb)( | |
6505 | 833 arg1, arg2, arg3, arg4, arg5, data); |
6485 | 834 |
835 if (return_val != NULL) | |
836 *return_val = GINT_TO_POINTER(ret_val); | |
837 } |