Mercurial > pidgin
annotate src/signals.c @ 10182:4085b2cda8f1
[gaim-migrate @ 11297]
Remove some away message pref stuff from prefs.c. It's going to have to
change eventually. This gets rid of the gdk assert warning or whatever it
was when closing prefs.
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Sun, 14 Nov 2004 21:01:27 +0000 |
parents | 60db14d54914 |
children | edf8c0a8e60b |
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 | |
9734 | 592 gaim_marshal_VOID__POINTER_UINT(GaimCallback cb, va_list args, |
593 void *data, void **return_val) | |
594 { | |
595 void *arg1 = va_arg(args, void *); | |
596 guint arg2 = va_arg(args, guint); | |
597 | |
598 ((void (*)(void *, guint, void *))cb)(arg1, arg2, data); | |
599 } | |
600 | |
601 void | |
6485 | 602 gaim_marshal_VOID__POINTER_POINTER(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 | |
608 ((void (*)(void *, void *, void *))cb)(arg1, arg2, data); | |
6485 | 609 } |
610 | |
611 void | |
612 gaim_marshal_VOID__POINTER_POINTER_UINT(GaimCallback cb, va_list args, | |
613 void *data, void **return_val) | |
614 { | |
6505 | 615 void *arg1 = va_arg(args, void *); |
616 void *arg2 = va_arg(args, void *); | |
617 guint arg3 = va_arg(args, guint); | |
618 | |
619 ((void (*)(void *, void *, guint, void *))cb)(arg1, arg2, arg3, data); | |
6485 | 620 } |
621 | |
622 void | |
9554 | 623 gaim_marshal_VOID__POINTER_POINTER_UINT_UINT(GaimCallback cb, va_list args, |
624 void *data, void **return_val) | |
625 { | |
626 void *arg1 = va_arg(args, void *); | |
627 void *arg2 = va_arg(args, void *); | |
628 guint arg3 = va_arg(args, guint); | |
629 guint arg4 = va_arg(args, guint); | |
630 | |
631 ((void (*)(void *, void *, guint, guint, void *))cb)(arg1, arg2, arg3, arg4, data); | |
632 } | |
633 | |
634 void | |
6485 | 635 gaim_marshal_VOID__POINTER_POINTER_POINTER(GaimCallback cb, va_list args, |
636 void *data, void **return_val) | |
637 { | |
6505 | 638 void *arg1 = va_arg(args, void *); |
639 void *arg2 = va_arg(args, void *); | |
640 void *arg3 = va_arg(args, void *); | |
641 | |
642 ((void (*)(void *, void *, void *, void *))cb)(arg1, arg2, arg3, data); | |
6485 | 643 } |
644 | |
645 void | |
646 gaim_marshal_VOID__POINTER_POINTER_POINTER_POINTER(GaimCallback cb, | |
647 va_list args, | |
648 void *data, | |
649 void **return_val) | |
650 { | |
6505 | 651 void *arg1 = va_arg(args, void *); |
652 void *arg2 = va_arg(args, void *); | |
653 void *arg3 = va_arg(args, void *); | |
654 void *arg4 = va_arg(args, void *); | |
655 | |
656 ((void (*)(void *, void *, void *, void *, void *))cb)(arg1, arg2, arg3, arg4, data); | |
6485 | 657 } |
6509 | 658 |
659 void | |
9514 | 660 gaim_marshal_VOID__POINTER_POINTER_POINTER_POINTER_POINTER(GaimCallback cb, |
661 va_list args, | |
662 void *data, | |
663 void **return_val) | |
664 { | |
665 void *arg1 = va_arg(args, void *); | |
666 void *arg2 = va_arg(args, void *); | |
667 void *arg3 = va_arg(args, void *); | |
668 void *arg4 = va_arg(args, void *); | |
669 void *arg5 = va_arg(args, void *); | |
670 | |
671 ((void (*)(void *, void *, void *, void *, void *, void *))cb)(arg1, arg2, arg3, arg4, arg5, data); | |
672 } | |
673 | |
674 void | |
6509 | 675 gaim_marshal_VOID__POINTER_POINTER_POINTER_UINT(GaimCallback cb, |
676 va_list args, | |
677 void *data, | |
678 void **return_val) | |
679 { | |
680 void *arg1 = va_arg(args, void *); | |
681 void *arg2 = va_arg(args, void *); | |
682 void *arg3 = va_arg(args, void *); | |
683 guint arg4 = va_arg(args, guint); | |
684 | |
685 ((void (*)(void *, void *, void *, guint, void *))cb)(arg1, arg2, arg3, arg4, data); | |
686 } | |
687 | |
6485 | 688 void |
10104 | 689 gaim_marshal_VOID__POINTER_POINTER_POINTER_POINTER_UINT(GaimCallback cb, |
690 va_list args, | |
691 void *data, | |
692 void **return_val) | |
693 { | |
694 void *arg1 = va_arg(args, void *); | |
695 void *arg2 = va_arg(args, void *); | |
696 void *arg3 = va_arg(args, void *); | |
697 void *arg4 = va_arg(args, void *); | |
698 guint arg5 = va_arg(args, guint); | |
699 | |
700 ((void (*)(void *, void *, void *, void *, guint, void *))cb)(arg1, arg2, arg3, arg4, arg5, data); | |
701 } | |
702 | |
703 void | |
6485 | 704 gaim_marshal_VOID__POINTER_POINTER_POINTER_UINT_UINT(GaimCallback cb, |
705 va_list args, | |
706 void *data, | |
707 void **return_val) | |
708 { | |
6505 | 709 void *arg1 = va_arg(args, void *); |
710 void *arg2 = va_arg(args, void *); | |
711 void *arg3 = va_arg(args, void *); | |
712 guint arg4 = va_arg(args, guint); | |
713 guint arg5 = va_arg(args, guint); | |
714 | |
6485 | 715 ((void (*)(void *, void *, void *, guint, guint, void *))cb)( |
6505 | 716 arg1, arg2, arg3, arg4, arg5, data); |
6485 | 717 } |
718 | |
719 void | |
6822
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
720 gaim_marshal_INT__INT(GaimCallback cb, va_list args, void *data, |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
721 void **return_val) |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
722 { |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
723 gint ret_val; |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
724 gint arg1 = va_arg(args, gint); |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
725 |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
726 ret_val = ((gint (*)(gint, void *))cb)(arg1, data); |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
727 |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
728 if (return_val != NULL) |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
729 *return_val = GINT_TO_POINTER(ret_val); |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
730 } |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
731 |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
732 void |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
733 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
|
734 void **return_val) |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
735 { |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
736 gint ret_val; |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
737 gint arg1 = va_arg(args, gint); |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
738 gint arg2 = va_arg(args, gint); |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
739 |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
740 ret_val = ((gint (*)(gint, gint, void *))cb)(arg1, arg2, data); |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
741 |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
742 if (return_val != NULL) |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
743 *return_val = GINT_TO_POINTER(ret_val); |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
744 } |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
745 |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
746 void |
6485 | 747 gaim_marshal_BOOLEAN__POINTER(GaimCallback cb, va_list args, void *data, |
748 void **return_val) | |
749 { | |
750 gboolean ret_val; | |
6505 | 751 void *arg1 = va_arg(args, void *); |
6485 | 752 |
6505 | 753 ret_val = ((gboolean (*)(void *, void *))cb)(arg1, data); |
6485 | 754 |
755 if (return_val != NULL) | |
756 *return_val = GINT_TO_POINTER(ret_val); | |
757 } | |
758 | |
759 void | |
760 gaim_marshal_BOOLEAN__POINTER_POINTER(GaimCallback cb, va_list args, | |
761 void *data, void **return_val) | |
762 { | |
763 gboolean ret_val; | |
6505 | 764 void *arg1 = va_arg(args, void *); |
765 void *arg2 = va_arg(args, void *); | |
6485 | 766 |
6505 | 767 ret_val = ((gboolean (*)(void *, void *, void *))cb)(arg1, arg2, data); |
6485 | 768 |
769 if (return_val != NULL) | |
770 *return_val = GINT_TO_POINTER(ret_val); | |
771 } | |
772 | |
773 void | |
6509 | 774 gaim_marshal_BOOLEAN__POINTER_POINTER_POINTER(GaimCallback cb, va_list args, |
775 void *data, void **return_val) | |
776 { | |
777 gboolean ret_val; | |
778 void *arg1 = va_arg(args, void *); | |
779 void *arg2 = va_arg(args, void *); | |
780 void *arg3 = va_arg(args, void *); | |
781 | |
782 ret_val = ((gboolean (*)(void *, void *, void *, void *))cb)(arg1, arg2, | |
783 arg3, data); | |
784 | |
785 if (return_val != NULL) | |
786 *return_val = GINT_TO_POINTER(ret_val); | |
787 } | |
788 | |
789 void | |
790 gaim_marshal_BOOLEAN__POINTER_POINTER_UINT(GaimCallback cb, | |
791 va_list args, | |
792 void *data, | |
793 void **return_val) | |
794 { | |
795 gboolean ret_val; | |
796 void *arg1 = va_arg(args, void *); | |
797 void *arg2 = va_arg(args, void *); | |
798 guint arg3 = va_arg(args, guint); | |
799 | |
800 ret_val = ((gboolean (*)(void *, void *, guint, void *))cb)( | |
801 arg1, arg2, arg3, data); | |
802 | |
803 if (return_val != NULL) | |
804 *return_val = GINT_TO_POINTER(ret_val); | |
805 } | |
806 | |
807 void | |
6485 | 808 gaim_marshal_BOOLEAN__POINTER_POINTER_POINTER_UINT(GaimCallback cb, |
809 va_list args, | |
810 void *data, | |
811 void **return_val) | |
812 { | |
813 gboolean ret_val; | |
6505 | 814 void *arg1 = va_arg(args, void *); |
815 void *arg2 = va_arg(args, void *); | |
816 void *arg3 = va_arg(args, void *); | |
817 guint arg4 = va_arg(args, guint); | |
6485 | 818 |
819 ret_val = ((gboolean (*)(void *, void *, void *, guint, void *))cb)( | |
6505 | 820 arg1, arg2, arg3, arg4, 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_POINTER_POINTER(GaimCallback cb, | |
828 va_list args, | |
829 void *data, | |
830 void **return_val) | |
831 { | |
832 gboolean ret_val; | |
6505 | 833 void *arg1 = va_arg(args, void *); |
834 void *arg2 = va_arg(args, void *); | |
835 void *arg3 = va_arg(args, void *); | |
836 void *arg4 = va_arg(args, void *); | |
6485 | 837 |
838 ret_val = ((gboolean (*)(void *, void *, void *, void *, void *))cb)( | |
6505 | 839 arg1, arg2, arg3, arg4, data); |
6485 | 840 |
841 if (return_val != NULL) | |
842 *return_val = GINT_TO_POINTER(ret_val); | |
843 } | |
844 | |
845 void | |
846 gaim_marshal_BOOLEAN__POINTER_POINTER_POINTER_POINTER_POINTER( | |
847 GaimCallback cb, va_list args, void *data, void **return_val) | |
848 { | |
849 gboolean ret_val; | |
6505 | 850 void *arg1 = va_arg(args, void *); |
851 void *arg2 = va_arg(args, void *); | |
852 void *arg3 = va_arg(args, void *); | |
853 void *arg4 = va_arg(args, void *); | |
854 void *arg5 = va_arg(args, void *); | |
6485 | 855 |
856 ret_val = | |
857 ((gboolean (*)(void *, void *, void *, void *, void *, void *))cb)( | |
6505 | 858 arg1, arg2, arg3, arg4, arg5, data); |
6485 | 859 |
860 if (return_val != NULL) | |
861 *return_val = GINT_TO_POINTER(ret_val); | |
862 } |