Mercurial > pidgin
annotate src/signals.c @ 7863:6ee2fe9bb74e
[gaim-migrate @ 8517]
"Patch 2: ssl-plugins.patch
Other plugins might need to use the NSS/GNUTLS libraries,
which shouldn't be initialized multiple times in the same
thread (at least NSS says this is a bad thing to do).
This patch
enables other plugins to load either the NSS or
GNUTLS plugin,
and
a) have them init on load, rather when sslconn inits them
b) have them not stomp on each other if the other one has
already loaded." --Bill Tompkins (obobo)
committer: Tailor Script <tailor@pidgin.im>
author | Luke Schierer <lschiere@pidgin.im> |
---|---|
date | Sun, 14 Dec 2003 16:46:28 +0000 |
parents | 191e5b9a249b |
children | 07dc83303503 |
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 * | |
7 * Copyright (C) 2003 Christian Hammond <chipx86@gnupdate.org> | |
8 * | |
9 * This program is free software; you can redistribute it and/or modify | |
10 * it under the terms of the GNU General Public License as published by | |
11 * the Free Software Foundation; either version 2 of the License, or | |
12 * (at your option) any later version. | |
13 * | |
14 * This program is distributed in the hope that it will be useful, | |
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
17 * GNU General Public License for more details. | |
18 * | |
19 * You should have received a copy of the GNU General Public License | |
20 * along with this program; if not, write to the Free Software | |
21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
22 */ | |
23 #include "internal.h" | |
24 | |
25 #include "debug.h" | |
26 #include "signals.h" | |
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
27 #include "value.h" |
6485 | 28 |
29 typedef struct | |
30 { | |
31 void *instance; | |
32 | |
33 GHashTable *signals; | |
34 size_t signal_count; | |
35 | |
36 gulong next_signal_id; | |
37 | |
38 } GaimInstanceData; | |
39 | |
40 typedef struct | |
41 { | |
42 gulong id; | |
43 | |
44 GaimSignalMarshalFunc marshal; | |
45 | |
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
46 int num_values; |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
47 GaimValue **values; |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
48 GaimValue *ret_value; |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
49 |
6485 | 50 GList *handlers; |
51 size_t handler_count; | |
52 | |
53 gulong next_handler_id; | |
54 | |
55 } GaimSignalData; | |
56 | |
57 typedef struct | |
58 { | |
59 gulong id; | |
60 GaimCallback cb; | |
61 void *handle; | |
62 void *data; | |
6547
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
63 gboolean use_vargs; |
6485 | 64 |
65 } GaimSignalHandlerData; | |
66 | |
67 static GHashTable *instance_table = NULL; | |
68 | |
69 static void | |
70 destroy_instance_data(GaimInstanceData *instance_data) | |
71 { | |
72 g_hash_table_destroy(instance_data->signals); | |
73 | |
74 g_free(instance_data); | |
75 } | |
76 | |
77 static void | |
78 destroy_signal_data(GaimSignalData *signal_data) | |
79 { | |
80 GaimSignalHandlerData *handler_data; | |
81 GList *l; | |
82 | |
83 for (l = signal_data->handlers; l != NULL; l = l->next) | |
84 { | |
85 handler_data = (GaimSignalHandlerData *)l->data; | |
86 | |
87 g_free(l->data); | |
88 } | |
89 | |
90 g_list_free(signal_data->handlers); | |
91 | |
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
92 if (signal_data->values != NULL) |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
93 { |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
94 int i; |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
95 |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
96 for (i = 0; i < signal_data->num_values; i++) |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
97 gaim_value_destroy((GaimValue *)signal_data->values[i]); |
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 g_free(signal_data->values); |
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 |
6485 | 102 g_free(signal_data); |
103 } | |
104 | |
105 gulong | |
106 gaim_signal_register(void *instance, const char *signal, | |
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
107 GaimSignalMarshalFunc marshal, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
108 GaimValue *ret_value, int num_values, ...) |
6485 | 109 { |
110 GaimInstanceData *instance_data; | |
111 GaimSignalData *signal_data; | |
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
112 va_list args; |
6485 | 113 |
114 g_return_val_if_fail(instance != NULL, 0); | |
115 g_return_val_if_fail(signal != NULL, 0); | |
116 g_return_val_if_fail(marshal != NULL, 0); | |
117 | |
118 instance_data = | |
119 (GaimInstanceData *)g_hash_table_lookup(instance_table, instance); | |
120 | |
121 if (instance_data == NULL) | |
122 { | |
123 instance_data = g_new0(GaimInstanceData, 1); | |
124 | |
125 instance_data->instance = instance; | |
126 instance_data->next_signal_id = 1; | |
127 | |
128 instance_data->signals = | |
129 g_hash_table_new_full(g_str_hash, g_str_equal, g_free, | |
130 (GDestroyNotify)destroy_signal_data); | |
131 | |
132 g_hash_table_insert(instance_table, instance, instance_data); | |
133 } | |
134 | |
135 signal_data = g_new0(GaimSignalData, 1); | |
136 signal_data->id = instance_data->next_signal_id; | |
137 signal_data->marshal = marshal; | |
138 signal_data->next_handler_id = 1; | |
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
139 signal_data->ret_value = ret_value; |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
140 signal_data->num_values = num_values; |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
141 |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
142 if (num_values > 0) |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
143 { |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
144 int i; |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
145 |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
146 signal_data->values = g_new0(GaimValue *, num_values); |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
147 |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
148 va_start(args, 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 for (i = 0; i < num_values; i++) |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
151 signal_data->values[i] = va_arg(args, GaimValue *); |
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_end(args); |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
154 } |
6485 | 155 |
156 g_hash_table_insert(instance_data->signals, | |
157 g_strdup(signal), signal_data); | |
158 | |
159 instance_data->next_signal_id++; | |
160 instance_data->signal_count++; | |
161 | |
162 return signal_data->id; | |
163 } | |
164 | |
165 void | |
166 gaim_signal_unregister(void *instance, const char *signal) | |
167 { | |
168 GaimInstanceData *instance_data; | |
169 | |
170 g_return_if_fail(instance != NULL); | |
171 g_return_if_fail(signal != NULL); | |
172 | |
173 instance_data = | |
174 (GaimInstanceData *)g_hash_table_lookup(instance_table, instance); | |
175 | |
176 g_return_if_fail(instance_data != NULL); | |
177 | |
178 g_hash_table_remove(instance_data->signals, signal); | |
179 | |
180 instance_data->signal_count--; | |
181 | |
182 if (instance_data->signal_count == 0) | |
183 { | |
184 /* Unregister the instance. */ | |
185 g_hash_table_remove(instance_table, instance); | |
186 } | |
187 } | |
188 | |
189 void | |
190 gaim_signals_unregister_by_instance(void *instance) | |
191 { | |
192 gboolean found; | |
193 | |
194 g_return_if_fail(instance != NULL); | |
195 | |
196 found = g_hash_table_remove(instance_table, instance); | |
197 | |
198 /* | |
199 * Makes things easier (more annoying?) for developers who don't have | |
200 * things registering and unregistering in the right order :) | |
201 */ | |
202 g_return_if_fail(found); | |
203 } | |
204 | |
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
205 void |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
206 gaim_signal_get_values(void *instance, const char *signal, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
207 GaimValue **ret_value, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
208 int *num_values, GaimValue ***values) |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
209 { |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
210 GaimInstanceData *instance_data; |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
211 GaimSignalData *signal_data; |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
212 |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
213 g_return_if_fail(instance != NULL); |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
214 g_return_if_fail(signal != NULL); |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
215 g_return_if_fail(num_values != NULL); |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
216 g_return_if_fail(values != NULL); |
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 /* Get the instance data */ |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
219 instance_data = |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
220 (GaimInstanceData *)g_hash_table_lookup(instance_table, instance); |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
221 |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
222 g_return_if_fail(instance_data != NULL); |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
223 |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
224 /* Get the signal data */ |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
225 signal_data = |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
226 (GaimSignalData *)g_hash_table_lookup(instance_data->signals, signal); |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
227 |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
228 g_return_if_fail(signal_data != NULL); |
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 *num_values = signal_data->num_values; |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
231 *values = signal_data->values; |
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 if (ret_value != NULL) |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
234 *ret_value = signal_data->ret_value; |
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 |
6547
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
237 static gulong |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
238 signal_connect_common(void *instance, const char *signal, void *handle, |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
239 GaimCallback func, void *data, gboolean use_vargs) |
6485 | 240 { |
241 GaimInstanceData *instance_data; | |
242 GaimSignalData *signal_data; | |
243 GaimSignalHandlerData *handler_data; | |
244 | |
245 g_return_val_if_fail(instance != NULL, 0); | |
246 g_return_val_if_fail(signal != NULL, 0); | |
247 g_return_val_if_fail(handle != NULL, 0); | |
248 g_return_val_if_fail(func != NULL, 0); | |
249 | |
250 /* Get the instance data */ | |
251 instance_data = | |
252 (GaimInstanceData *)g_hash_table_lookup(instance_table, instance); | |
253 | |
254 g_return_val_if_fail(instance_data != NULL, 0); | |
255 | |
256 /* Get the signal data */ | |
257 signal_data = | |
258 (GaimSignalData *)g_hash_table_lookup(instance_data->signals, signal); | |
259 | |
260 if (signal_data == NULL) | |
261 { | |
262 gaim_debug(GAIM_DEBUG_ERROR, "signals", | |
263 "Signal data for %s not found!\n", signal); | |
264 return 0; | |
265 } | |
266 | |
267 /* Create the signal handler data */ | |
268 handler_data = g_new0(GaimSignalHandlerData, 1); | |
6547
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
269 handler_data->id = signal_data->next_handler_id; |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
270 handler_data->cb = func; |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
271 handler_data->handle = handle; |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
272 handler_data->data = data; |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
273 handler_data->use_vargs = use_vargs; |
6485 | 274 |
275 signal_data->handlers = g_list_append(signal_data->handlers, handler_data); | |
276 signal_data->handler_count++; | |
277 signal_data->next_handler_id++; | |
278 | |
279 return handler_data->id; | |
280 } | |
6553
9e4fa4853cfe
[gaim-migrate @ 7075]
Christian Hammond <chipx86@chipx86.com>
parents:
6547
diff
changeset
|
281 |
6547
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
282 gulong |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
283 gaim_signal_connect(void *instance, const char *signal, void *handle, |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
284 GaimCallback func, void *data) |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
285 { |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
286 return signal_connect_common(instance, signal, handle, func, data, FALSE); |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
287 } |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
288 |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
289 gulong |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
290 gaim_signal_connect_vargs(void *instance, const char *signal, void *handle, |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
291 GaimCallback func, void *data) |
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 return signal_connect_common(instance, signal, handle, func, data, TRUE); |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
294 } |
6485 | 295 |
296 void | |
297 gaim_signal_disconnect(void *instance, const char *signal, | |
298 void *handle, GaimCallback func) | |
299 { | |
300 GaimInstanceData *instance_data; | |
301 GaimSignalData *signal_data; | |
302 GaimSignalHandlerData *handler_data; | |
303 GList *l; | |
304 gboolean found = FALSE; | |
305 | |
306 g_return_if_fail(instance != NULL); | |
307 g_return_if_fail(signal != NULL); | |
308 g_return_if_fail(handle != NULL); | |
309 g_return_if_fail(func != NULL); | |
310 | |
311 /* Get the instance data */ | |
312 instance_data = | |
313 (GaimInstanceData *)g_hash_table_lookup(instance_table, instance); | |
314 | |
315 g_return_if_fail(instance_data != NULL); | |
316 | |
317 /* Get the signal data */ | |
318 signal_data = | |
319 (GaimSignalData *)g_hash_table_lookup(instance_data->signals, signal); | |
320 | |
321 if (signal_data == NULL) | |
322 { | |
323 gaim_debug(GAIM_DEBUG_ERROR, "signals", | |
324 "Signal data for %s not found!\n", signal); | |
325 return; | |
326 } | |
327 | |
328 /* Find the handler data. */ | |
329 for (l = signal_data->handlers; l != NULL; l = l->next) | |
330 { | |
331 handler_data = (GaimSignalHandlerData *)l->data; | |
332 | |
333 if (handler_data->handle == handle && handler_data->cb == func) | |
334 { | |
335 g_free(handler_data); | |
336 | |
337 signal_data->handlers = g_list_remove(signal_data->handlers, | |
338 handler_data); | |
339 signal_data->handler_count--; | |
340 | |
341 found = TRUE; | |
342 | |
343 break; | |
344 } | |
345 } | |
346 | |
347 /* See note somewhere about this actually helping developers.. */ | |
348 g_return_if_fail(found); | |
349 } | |
350 | |
351 /* | |
352 * TODO: Make this all more efficient by storing a list of handlers, keyed | |
353 * to a handle. | |
354 */ | |
355 static void | |
356 disconnect_handle_from_signals(const char *signal, | |
357 GaimSignalData *signal_data, void *handle) | |
358 { | |
359 GList *l, *l_next; | |
360 GaimSignalHandlerData *handler_data; | |
361 | |
362 for (l = signal_data->handlers; l != NULL; l = l_next) | |
363 { | |
364 handler_data = (GaimSignalHandlerData *)l->data; | |
365 l_next = l->next; | |
366 | |
367 if (handler_data->handle == handle) | |
368 { | |
369 g_free(handler_data); | |
370 | |
371 signal_data->handler_count--; | |
372 signal_data->handlers = g_list_remove(signal_data->handlers, | |
373 handler_data); | |
374 } | |
375 } | |
376 } | |
377 | |
378 static void | |
379 disconnect_handle_from_instance(void *instance, | |
380 GaimInstanceData *instance_data, | |
381 void *handle) | |
382 { | |
383 g_hash_table_foreach(instance_data->signals, | |
384 (GHFunc)disconnect_handle_from_signals, handle); | |
385 } | |
386 | |
387 void | |
388 gaim_signals_disconnect_by_handle(void *handle) | |
389 { | |
390 g_return_if_fail(handle != NULL); | |
391 | |
392 g_hash_table_foreach(instance_table, | |
393 (GHFunc)disconnect_handle_from_instance, handle); | |
394 } | |
395 | |
396 void | |
397 gaim_signal_emit(void *instance, const char *signal, ...) | |
398 { | |
399 va_list args; | |
400 | |
7584
9e93a4bf1934
[gaim-migrate @ 8202]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
401 g_return_if_fail(instance != NULL); |
9e93a4bf1934
[gaim-migrate @ 8202]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
402 g_return_if_fail(signal != NULL); |
9e93a4bf1934
[gaim-migrate @ 8202]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
403 |
6485 | 404 va_start(args, signal); |
405 gaim_signal_emit_vargs(instance, signal, args); | |
406 va_end(args); | |
407 } | |
408 | |
409 void | |
410 gaim_signal_emit_vargs(void *instance, const char *signal, va_list args) | |
411 { | |
412 GaimInstanceData *instance_data; | |
413 GaimSignalData *signal_data; | |
414 GaimSignalHandlerData *handler_data; | |
415 GList *l; | |
416 | |
417 g_return_if_fail(instance != NULL); | |
418 g_return_if_fail(signal != NULL); | |
419 | |
420 instance_data = | |
421 (GaimInstanceData *)g_hash_table_lookup(instance_table, instance); | |
422 | |
423 g_return_if_fail(instance_data != NULL); | |
424 | |
425 signal_data = | |
426 (GaimSignalData *)g_hash_table_lookup(instance_data->signals, signal); | |
427 | |
428 if (signal_data == NULL) | |
429 { | |
430 gaim_debug(GAIM_DEBUG_ERROR, "signals", | |
431 "Signal data for %s not found!\n", signal); | |
432 return; | |
433 } | |
434 | |
435 for (l = signal_data->handlers; l != NULL; l = l->next) | |
436 { | |
437 handler_data = (GaimSignalHandlerData *)l->data; | |
438 | |
6547
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
439 if (handler_data->use_vargs) |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
440 { |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
441 ((void (*)(va_list, void *))handler_data->cb)(args, |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
442 handler_data->data); |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
443 } |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
444 else |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
445 { |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
446 signal_data->marshal(handler_data->cb, args, |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
447 handler_data->data, NULL); |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
448 } |
6485 | 449 } |
450 } | |
451 | |
452 void * | |
453 gaim_signal_emit_return_1(void *instance, const char *signal, ...) | |
454 { | |
455 void *ret_val; | |
456 va_list args; | |
457 | |
7597
191e5b9a249b
[gaim-migrate @ 8218]
Christian Hammond <chipx86@chipx86.com>
parents:
7585
diff
changeset
|
458 g_return_val_if_fail(instance != NULL, NULL); |
191e5b9a249b
[gaim-migrate @ 8218]
Christian Hammond <chipx86@chipx86.com>
parents:
7585
diff
changeset
|
459 g_return_val_if_fail(signal != NULL, NULL); |
7585
404f4a4b81da
[gaim-migrate @ 8203]
Christian Hammond <chipx86@chipx86.com>
parents:
7584
diff
changeset
|
460 |
6485 | 461 va_start(args, signal); |
462 ret_val = gaim_signal_emit_vargs_return_1(instance, signal, args); | |
463 va_end(args); | |
464 | |
465 return ret_val; | |
466 } | |
467 | |
468 void * | |
469 gaim_signal_emit_vargs_return_1(void *instance, const char *signal, | |
470 va_list args) | |
471 { | |
472 GaimInstanceData *instance_data; | |
473 GaimSignalData *signal_data; | |
474 GaimSignalHandlerData *handler_data; | |
475 void *ret_val = NULL; | |
476 GList *l; | |
477 | |
478 g_return_val_if_fail(instance != NULL, NULL); | |
479 g_return_val_if_fail(signal != NULL, NULL); | |
480 | |
481 instance_data = | |
482 (GaimInstanceData *)g_hash_table_lookup(instance_table, instance); | |
483 | |
484 g_return_val_if_fail(instance_data != NULL, NULL); | |
485 | |
486 signal_data = | |
487 (GaimSignalData *)g_hash_table_lookup(instance_data->signals, signal); | |
488 | |
489 if (signal_data == NULL) | |
490 { | |
491 gaim_debug(GAIM_DEBUG_ERROR, "signals", | |
492 "Signal data for %s not found!\n", signal); | |
493 return 0; | |
494 } | |
495 | |
496 for (l = signal_data->handlers; l != NULL; l = l->next) | |
497 { | |
498 handler_data = (GaimSignalHandlerData *)l->data; | |
499 | |
6547
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
500 if (handler_data->use_vargs) |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
501 { |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
502 ret_val = ((void *(*)(va_list, void *))handler_data->cb)( |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
503 args, handler_data->data); |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
504 } |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
505 else |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
506 { |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
507 signal_data->marshal(handler_data->cb, args, |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
508 handler_data->data, &ret_val); |
adf168f002ad
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
509 } |
6485 | 510 } |
511 | |
512 return ret_val; | |
513 } | |
514 | |
515 void | |
516 gaim_signals_init() | |
517 { | |
518 g_return_if_fail(instance_table == NULL); | |
519 | |
520 instance_table = | |
521 g_hash_table_new_full(g_direct_hash, g_direct_equal, | |
522 NULL, (GDestroyNotify)destroy_instance_data); | |
523 } | |
524 | |
525 void | |
526 gaim_signals_uninit() | |
527 { | |
528 g_return_if_fail(instance_table != NULL); | |
529 | |
530 g_hash_table_destroy(instance_table); | |
531 instance_table = NULL; | |
532 } | |
533 | |
534 /************************************************************************** | |
535 * Marshallers | |
536 **************************************************************************/ | |
537 void | |
538 gaim_marshal_VOID(GaimCallback cb, va_list args, void *data, | |
539 void **return_val) | |
540 { | |
541 ((void (*)(void *))cb)(data); | |
542 } | |
543 | |
544 void | |
6822
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
545 gaim_marshal_VOID__INT(GaimCallback cb, va_list args, void *data, |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
546 void **return_val) |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
547 { |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
548 gint arg1 = va_arg(args, gint); |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
549 |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
550 ((void (*)(gint, void *))cb)(arg1, data); |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
551 } |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
552 |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
553 void |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
554 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
|
555 void **return_val) |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
556 { |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
557 gint arg1 = va_arg(args, gint); |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
558 gint arg2 = va_arg(args, gint); |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
559 |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
560 ((void (*)(gint, gint, void *))cb)(arg1, arg2, data); |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
561 } |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
562 |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
563 void |
6485 | 564 gaim_marshal_VOID__POINTER(GaimCallback cb, va_list args, void *data, |
565 void **return_val) | |
566 { | |
6505 | 567 void *arg1 = va_arg(args, void *); |
568 | |
569 ((void (*)(void *, void *))cb)(arg1, data); | |
6485 | 570 } |
571 | |
572 void | |
573 gaim_marshal_VOID__POINTER_POINTER(GaimCallback cb, va_list args, | |
574 void *data, void **return_val) | |
575 { | |
6505 | 576 void *arg1 = va_arg(args, void *); |
577 void *arg2 = va_arg(args, void *); | |
578 | |
579 ((void (*)(void *, void *, void *))cb)(arg1, arg2, data); | |
6485 | 580 } |
581 | |
582 void | |
583 gaim_marshal_VOID__POINTER_POINTER_UINT(GaimCallback cb, va_list args, | |
584 void *data, void **return_val) | |
585 { | |
6505 | 586 void *arg1 = va_arg(args, void *); |
587 void *arg2 = va_arg(args, void *); | |
588 guint arg3 = va_arg(args, guint); | |
589 | |
590 ((void (*)(void *, void *, guint, void *))cb)(arg1, arg2, arg3, data); | |
6485 | 591 } |
592 | |
593 void | |
594 gaim_marshal_VOID__POINTER_POINTER_POINTER(GaimCallback cb, va_list args, | |
595 void *data, void **return_val) | |
596 { | |
6505 | 597 void *arg1 = va_arg(args, void *); |
598 void *arg2 = va_arg(args, void *); | |
599 void *arg3 = va_arg(args, void *); | |
600 | |
601 ((void (*)(void *, void *, void *, void *))cb)(arg1, arg2, arg3, data); | |
6485 | 602 } |
603 | |
604 void | |
605 gaim_marshal_VOID__POINTER_POINTER_POINTER_POINTER(GaimCallback cb, | |
606 va_list args, | |
607 void *data, | |
608 void **return_val) | |
609 { | |
6505 | 610 void *arg1 = va_arg(args, void *); |
611 void *arg2 = va_arg(args, void *); | |
612 void *arg3 = va_arg(args, void *); | |
613 void *arg4 = va_arg(args, void *); | |
614 | |
615 ((void (*)(void *, void *, void *, void *, void *))cb)(arg1, arg2, arg3, arg4, data); | |
6485 | 616 } |
6509 | 617 |
618 void | |
619 gaim_marshal_VOID__POINTER_POINTER_POINTER_UINT(GaimCallback cb, | |
620 va_list args, | |
621 void *data, | |
622 void **return_val) | |
623 { | |
624 void *arg1 = va_arg(args, void *); | |
625 void *arg2 = va_arg(args, void *); | |
626 void *arg3 = va_arg(args, void *); | |
627 guint arg4 = va_arg(args, guint); | |
628 | |
629 ((void (*)(void *, void *, void *, guint, void *))cb)(arg1, arg2, arg3, arg4, data); | |
630 } | |
631 | |
6485 | 632 void |
633 gaim_marshal_VOID__POINTER_POINTER_POINTER_UINT_UINT(GaimCallback cb, | |
634 va_list args, | |
635 void *data, | |
636 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 guint arg4 = va_arg(args, guint); | |
642 guint arg5 = va_arg(args, guint); | |
643 | |
6485 | 644 ((void (*)(void *, void *, void *, guint, guint, void *))cb)( |
6505 | 645 arg1, arg2, arg3, arg4, arg5, data); |
6485 | 646 } |
647 | |
648 void | |
6822
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
649 gaim_marshal_INT__INT(GaimCallback cb, va_list args, void *data, |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
650 void **return_val) |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
651 { |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
652 gint ret_val; |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
653 gint arg1 = va_arg(args, gint); |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
654 |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
655 ret_val = ((gint (*)(gint, void *))cb)(arg1, data); |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
656 |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
657 if (return_val != NULL) |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
658 *return_val = GINT_TO_POINTER(ret_val); |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
659 } |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
660 |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
661 void |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
662 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
|
663 void **return_val) |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
664 { |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
665 gint ret_val; |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
666 gint arg1 = va_arg(args, gint); |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
667 gint arg2 = va_arg(args, gint); |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
668 |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
669 ret_val = ((gint (*)(gint, gint, void *))cb)(arg1, arg2, data); |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
670 |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
671 if (return_val != NULL) |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
672 *return_val = GINT_TO_POINTER(ret_val); |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
673 } |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
674 |
7dba3e17cb21
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
675 void |
6485 | 676 gaim_marshal_BOOLEAN__POINTER(GaimCallback cb, va_list args, void *data, |
677 void **return_val) | |
678 { | |
679 gboolean ret_val; | |
6505 | 680 void *arg1 = va_arg(args, void *); |
6485 | 681 |
6505 | 682 ret_val = ((gboolean (*)(void *, void *))cb)(arg1, data); |
6485 | 683 |
684 if (return_val != NULL) | |
685 *return_val = GINT_TO_POINTER(ret_val); | |
686 } | |
687 | |
688 void | |
689 gaim_marshal_BOOLEAN__POINTER_POINTER(GaimCallback cb, va_list args, | |
690 void *data, void **return_val) | |
691 { | |
692 gboolean ret_val; | |
6505 | 693 void *arg1 = va_arg(args, void *); |
694 void *arg2 = va_arg(args, void *); | |
6485 | 695 |
6505 | 696 ret_val = ((gboolean (*)(void *, void *, void *))cb)(arg1, arg2, data); |
6485 | 697 |
698 if (return_val != NULL) | |
699 *return_val = GINT_TO_POINTER(ret_val); | |
700 } | |
701 | |
702 void | |
6509 | 703 gaim_marshal_BOOLEAN__POINTER_POINTER_POINTER(GaimCallback cb, va_list args, |
704 void *data, void **return_val) | |
705 { | |
706 gboolean ret_val; | |
707 void *arg1 = va_arg(args, void *); | |
708 void *arg2 = va_arg(args, void *); | |
709 void *arg3 = va_arg(args, void *); | |
710 | |
711 ret_val = ((gboolean (*)(void *, void *, void *, void *))cb)(arg1, arg2, | |
712 arg3, data); | |
713 | |
714 if (return_val != NULL) | |
715 *return_val = GINT_TO_POINTER(ret_val); | |
716 } | |
717 | |
718 void | |
719 gaim_marshal_BOOLEAN__POINTER_POINTER_UINT(GaimCallback cb, | |
720 va_list args, | |
721 void *data, | |
722 void **return_val) | |
723 { | |
724 gboolean ret_val; | |
725 void *arg1 = va_arg(args, void *); | |
726 void *arg2 = va_arg(args, void *); | |
727 guint arg3 = va_arg(args, guint); | |
728 | |
729 ret_val = ((gboolean (*)(void *, void *, guint, void *))cb)( | |
730 arg1, arg2, arg3, data); | |
731 | |
732 if (return_val != NULL) | |
733 *return_val = GINT_TO_POINTER(ret_val); | |
734 } | |
735 | |
736 void | |
6485 | 737 gaim_marshal_BOOLEAN__POINTER_POINTER_POINTER_UINT(GaimCallback cb, |
738 va_list args, | |
739 void *data, | |
740 void **return_val) | |
741 { | |
742 gboolean ret_val; | |
6505 | 743 void *arg1 = va_arg(args, void *); |
744 void *arg2 = va_arg(args, void *); | |
745 void *arg3 = va_arg(args, void *); | |
746 guint arg4 = va_arg(args, guint); | |
6485 | 747 |
748 ret_val = ((gboolean (*)(void *, void *, void *, guint, void *))cb)( | |
6505 | 749 arg1, arg2, arg3, arg4, data); |
6485 | 750 |
751 if (return_val != NULL) | |
752 *return_val = GINT_TO_POINTER(ret_val); | |
753 } | |
754 | |
755 void | |
756 gaim_marshal_BOOLEAN__POINTER_POINTER_POINTER_POINTER(GaimCallback cb, | |
757 va_list args, | |
758 void *data, | |
759 void **return_val) | |
760 { | |
761 gboolean ret_val; | |
6505 | 762 void *arg1 = va_arg(args, void *); |
763 void *arg2 = va_arg(args, void *); | |
764 void *arg3 = va_arg(args, void *); | |
765 void *arg4 = va_arg(args, void *); | |
6485 | 766 |
767 ret_val = ((gboolean (*)(void *, void *, void *, void *, void *))cb)( | |
6505 | 768 arg1, arg2, arg3, arg4, data); |
6485 | 769 |
770 if (return_val != NULL) | |
771 *return_val = GINT_TO_POINTER(ret_val); | |
772 } | |
773 | |
774 void | |
775 gaim_marshal_BOOLEAN__POINTER_POINTER_POINTER_POINTER_POINTER( | |
776 GaimCallback cb, va_list args, void *data, void **return_val) | |
777 { | |
778 gboolean ret_val; | |
6505 | 779 void *arg1 = va_arg(args, void *); |
780 void *arg2 = va_arg(args, void *); | |
781 void *arg3 = va_arg(args, void *); | |
782 void *arg4 = va_arg(args, void *); | |
783 void *arg5 = va_arg(args, void *); | |
6485 | 784 |
785 ret_val = | |
786 ((gboolean (*)(void *, void *, void *, void *, void *, void *))cb)( | |
6505 | 787 arg1, arg2, arg3, arg4, arg5, data); |
6485 | 788 |
789 if (return_val != NULL) | |
790 *return_val = GINT_TO_POINTER(ret_val); | |
791 } |