Mercurial > pidgin
comparison plugins/perl/perl-handlers.c @ 6919:1aa771990188
[gaim-migrate @ 7466]
Added support for return values in perl plugin signal callbacks, and for
modifying parameters, in theory (but apparently not in practice. Darn you
perl! Darn you to Dell!)
committer: Tailor Script <tailor@pidgin.im>
author | Christian Hammond <chipx86@chipx86.com> |
---|---|
date | Tue, 23 Sep 2003 22:35:00 +0000 |
parents | 33486b749aa9 |
children | 13f78c350cd3 |
comparison
equal
deleted
inserted
replaced
6918:d4b53b3d20eb | 6919:1aa771990188 |
---|---|
68 void *ret_val = NULL; | 68 void *ret_val = NULL; |
69 int i; | 69 int i; |
70 int count; | 70 int count; |
71 int value_count; | 71 int value_count; |
72 GaimValue *ret_value, **values; | 72 GaimValue *ret_value, **values; |
73 SV **sv_args; | |
74 STRLEN na; | |
73 | 75 |
74 dSP; | 76 dSP; |
75 ENTER; | 77 ENTER; |
76 SAVETMPS; | 78 SAVETMPS; |
77 PUSHMARK(sp); | 79 PUSHMARK(sp); |
78 | 80 |
79 gaim_signal_get_values(handler->instance, handler->signal, | 81 gaim_signal_get_values(handler->instance, handler->signal, |
80 &ret_value, &value_count, &values); | 82 &ret_value, &value_count, &values); |
81 | 83 |
84 sv_args = g_new(SV *, value_count); | |
85 | |
82 for (i = 0; i < value_count; i++) | 86 for (i = 0; i < value_count; i++) |
83 { | 87 { |
84 SV *sv = gaim_perl_sv_from_vargs(values[i], args); | 88 SV *sv = gaim_perl_sv_from_vargs(values[i], args); |
85 | 89 |
86 gaim_debug(GAIM_DEBUG_INFO, "perl", "Pushing arg %p\n", sv); | 90 sv_args[i] = sv; |
87 | 91 |
88 XPUSHs(sv); | 92 XPUSHs(sv); |
89 } | 93 } |
90 | 94 |
91 gaim_debug(GAIM_DEBUG_INFO, "perl", "Pushing data %p\n", handler->data); | |
92 XPUSHs((SV *)handler->data); | 95 XPUSHs((SV *)handler->data); |
93 | 96 |
94 PUTBACK; | 97 PUTBACK; |
95 | 98 |
96 if (ret_value != NULL) | 99 if (ret_value != NULL) |
100 SPAGAIN; | 103 SPAGAIN; |
101 | 104 |
102 if (count != 1) | 105 if (count != 1) |
103 croak("Uh oh! call_sv returned %i != 1", i); | 106 croak("Uh oh! call_sv returned %i != 1", i); |
104 else | 107 else |
105 ret_val = POPs; | 108 { |
109 SV *temp_ret_val = POPs; | |
110 | |
111 switch (gaim_value_get_type(ret_value)) | |
112 { | |
113 case GAIM_TYPE_BOOLEAN: | |
114 ret_val = (void *)SvIV(temp_ret_val); | |
115 break; | |
116 | |
117 case GAIM_TYPE_INT: | |
118 ret_val = (void *)SvIV(temp_ret_val); | |
119 break; | |
120 | |
121 case GAIM_TYPE_UINT: | |
122 ret_val = (void *)SvUV(temp_ret_val); | |
123 break; | |
124 | |
125 case GAIM_TYPE_LONG: | |
126 ret_val = (void *)SvIV(temp_ret_val); | |
127 break; | |
128 | |
129 case GAIM_TYPE_ULONG: | |
130 ret_val = (void *)SvUV(temp_ret_val); | |
131 break; | |
132 | |
133 case GAIM_TYPE_INT64: | |
134 ret_val = (void *)SvIV(temp_ret_val); | |
135 break; | |
136 | |
137 case GAIM_TYPE_UINT64: | |
138 ret_val = (void *)SvUV(temp_ret_val); | |
139 break; | |
140 | |
141 case GAIM_TYPE_STRING: | |
142 ret_val = (void *)SvPV(temp_ret_val, na); | |
143 break; | |
144 | |
145 case GAIM_TYPE_POINTER: | |
146 ret_val = (void *)SvIV(temp_ret_val); | |
147 break; | |
148 | |
149 case GAIM_TYPE_BOXED: | |
150 ret_val = (void *)SvIV(temp_ret_val); | |
151 break; | |
152 | |
153 default: | |
154 ret_val = NULL; | |
155 } | |
156 } | |
106 } | 157 } |
107 else | 158 else |
108 call_sv(handler->callback, G_SCALAR); | 159 call_sv(handler->callback, G_SCALAR); |
109 | 160 |
161 /* See if any parameters changed. */ | |
162 for (i = 0; i < value_count; i++) | |
163 { | |
164 if (gaim_value_is_outgoing(values[i])) | |
165 { | |
166 switch (gaim_value_get_type(values[i])) | |
167 { | |
168 case GAIM_TYPE_BOOLEAN: | |
169 *va_arg(args, gboolean *) = SvIV(sv_args[i]); | |
170 break; | |
171 | |
172 case GAIM_TYPE_INT: | |
173 *va_arg(args, int *) = SvIV(sv_args[i]); | |
174 break; | |
175 | |
176 case GAIM_TYPE_UINT: | |
177 *va_arg(args, unsigned int *) = SvUV(sv_args[i]); | |
178 break; | |
179 | |
180 case GAIM_TYPE_LONG: | |
181 *va_arg(args, long *) = SvIV(sv_args[i]); | |
182 break; | |
183 | |
184 case GAIM_TYPE_ULONG: | |
185 *va_arg(args, unsigned long *) = SvUV(sv_args[i]); | |
186 break; | |
187 | |
188 case GAIM_TYPE_INT64: | |
189 *va_arg(args, gint64 *) = SvIV(sv_args[i]); | |
190 break; | |
191 | |
192 case GAIM_TYPE_UINT64: | |
193 *va_arg(args, guint64 *) = SvUV(sv_args[i]); | |
194 break; | |
195 | |
196 case GAIM_TYPE_STRING: | |
197 /* XXX Memory leak! */ | |
198 *va_arg(args, char **) = SvPV(sv_args[i], na); | |
199 break; | |
200 | |
201 case GAIM_TYPE_POINTER: | |
202 /* XXX Possible memory leak! */ | |
203 *va_arg(args, void **) = (void *)SvIV(sv_args[i]); | |
204 break; | |
205 | |
206 case GAIM_TYPE_BOXED: | |
207 /* Uh.. I dunno. Try this? Likely won't work. Heh. */ | |
208 /* XXX Possible memory leak! */ | |
209 *va_arg(args, void **) = (void *)SvIV(sv_args[i]); | |
210 break; | |
211 | |
212 default: | |
213 return FALSE; | |
214 } | |
215 } | |
216 } | |
217 | |
110 FREETMPS; | 218 FREETMPS; |
111 LEAVE; | 219 LEAVE; |
220 | |
221 g_free(sv_args); | |
222 | |
223 gaim_debug_misc("perl", "ret_val = %p\n", ret_val); | |
112 | 224 |
113 return ret_val; | 225 return ret_val; |
114 } | 226 } |
115 | 227 |
116 static GaimPerlSignalHandler * | 228 static GaimPerlSignalHandler * |