Mon, 16 Apr 2007 00:43:53 +0000
Commit a proper copy of this binary file. The old one was corrupted,
probably due to missing SVN attributes.
This was retrieved from the following URL, though we may have it in CVS:
http://dev.openwengo.com/trac/openwengo/trac.cgi/browser/vendors/gaim/trunk/doc/oscar/On_Sending_Files_via_OSCAR.odt?rev=4273
| 6520 | 1 | #include "perl-common.h" |
| 2 | #include "perl-handlers.h" | |
| 3 | ||
| 4 | #include "debug.h" | |
|
6549
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
5 | #include "signals.h" |
| 6520 | 6 | |
| 12882 | 7 | extern PerlInterpreter *my_perl; |
| 8 | static GList *cmd_handlers = NULL; | |
|
6549
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
9 | static GList *signal_handlers = NULL; |
| 12882 | 10 | static GList *timeout_handlers = NULL; |
| 6520 | 11 | |
|
12165
9f2d7e6b8707
[gaim-migrate @ 14466]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
11170
diff
changeset
|
12 | /* perl < 5.8.0 doesn't define PERL_MAGIC_ext */ |
|
9f2d7e6b8707
[gaim-migrate @ 14466]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
11170
diff
changeset
|
13 | #ifndef PERL_MAGIC_ext |
|
9f2d7e6b8707
[gaim-migrate @ 14466]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
11170
diff
changeset
|
14 | #define PERL_MAGIC_ext '~' |
|
9f2d7e6b8707
[gaim-migrate @ 14466]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
11170
diff
changeset
|
15 | #endif |
|
9f2d7e6b8707
[gaim-migrate @ 14466]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
11170
diff
changeset
|
16 | |
| 12803 | 17 | void |
| 12988 | 18 | gaim_perl_plugin_action_cb(GaimPluginAction *action) |
| 12803 | 19 | { |
| 12988 | 20 | SV **callback; |
| 21 | HV *hv = NULL; | |
| 22 | gchar *hvname; | |
| 23 | GaimPlugin *plugin; | |
| 24 | GaimPerlScript *gps; | |
| 12803 | 25 | dSP; |
| 12988 | 26 | |
| 27 | plugin = action->plugin; | |
| 28 | gps = (GaimPerlScript *)plugin->info->extra_info; | |
| 29 | hvname = g_strdup_printf("%s::plugin_actions", gps->package); | |
| 30 | hv = get_hv(hvname, FALSE); | |
| 31 | g_free(hvname); | |
| 32 | ||
| 33 | if (hv == NULL) | |
| 34 | croak("No plugin_actions hash found in \"%s\" plugin.", gaim_plugin_get_name(plugin)); | |
| 35 | ||
| 12803 | 36 | ENTER; |
| 37 | SAVETMPS; | |
| 12988 | 38 | |
| 39 | callback = hv_fetch(hv, action->label, strlen(action->label), 0); | |
| 11170 | 40 | |
| 12988 | 41 | if (callback == NULL || *callback == NULL) |
| 42 | croak("No plugin_action function named \"%s\" in \"%s\" plugin.", action->label, gaim_plugin_get_name(plugin)); | |
| 11170 | 43 | |
| 12988 | 44 | PUSHMARK(sp); |
| 45 | XPUSHs(gaim_perl_bless_object(gps->plugin, "Gaim::Plugin")); | |
| 12803 | 46 | PUTBACK; |
| 11170 | 47 | |
| 12988 | 48 | call_sv(*callback, G_VOID | G_DISCARD); |
| 12803 | 49 | SPAGAIN; |
| 11170 | 50 | |
| 12803 | 51 | PUTBACK; |
| 52 | FREETMPS; | |
| 53 | LEAVE; | |
| 11170 | 54 | } |
| 55 | ||
| 12803 | 56 | GList * |
| 12988 | 57 | gaim_perl_plugin_actions(GaimPlugin *plugin, gpointer context) |
| 12803 | 58 | { |
| 12988 | 59 | GList *l = NULL; |
| 60 | GaimPerlScript *gps; | |
| 61 | int i = 0, count = 0; | |
| 62 | dSP; | |
| 63 | ||
| 64 | gps = (GaimPerlScript *)plugin->info->extra_info; | |
| 65 | ||
| 66 | ENTER; | |
| 67 | SAVETMPS; | |
| 68 | ||
| 69 | PUSHMARK(SP); | |
| 70 | XPUSHs(sv_2mortal(gaim_perl_bless_object(plugin, "Gaim::Plugin"))); | |
| 71 | /* XXX This *will* cease working correctly if context gets changed to | |
| 72 | * ever be able to hold anything other than a GaimConnection */ | |
| 73 | if (context != NULL) | |
| 74 | XPUSHs(sv_2mortal(gaim_perl_bless_object(context, "Gaim::Connection"))); | |
| 75 | else | |
| 76 | XPUSHs(&PL_sv_undef); | |
| 77 | PUTBACK; | |
| 78 | ||
| 79 | count = call_pv(gps->plugin_action_sub, G_ARRAY); | |
| 11170 | 80 | |
| 12988 | 81 | SPAGAIN; |
| 82 | ||
| 83 | if (count == 0) | |
| 84 | croak("The plugin_actions sub didn't return anything.\n"); | |
| 85 | ||
| 86 | for (i = 0; i < count; i++) { | |
| 87 | SV *sv; | |
| 88 | gchar *label; | |
| 89 | GaimPluginAction *act = NULL; | |
| 11170 | 90 | |
| 12988 | 91 | sv = POPs; |
| 92 | label = SvPV_nolen(sv); | |
| 93 | /* XXX I think this leaks, but doing it without the strdup | |
| 94 | * just showed garbage */ | |
| 95 | act = gaim_plugin_action_new(g_strdup(label), gaim_perl_plugin_action_cb); | |
| 96 | l = g_list_append(l, act); | |
| 97 | } | |
| 98 | ||
| 99 | PUTBACK; | |
| 100 | FREETMPS; | |
| 101 | LEAVE; | |
| 102 | ||
| 103 | return l; | |
| 11170 | 104 | } |
| 105 | ||
| 12803 | 106 | GtkWidget * |
| 107 | gaim_perl_gtk_get_plugin_frame(GaimPlugin *plugin) | |
| 108 | { | |
| 11170 | 109 | SV * sv; |
| 12874 | 110 | int count; |
| 11170 | 111 | MAGIC *mg; |
| 12874 | 112 | GtkWidget *ret; |
| 113 | GaimPerlScript *gps; | |
| 11170 | 114 | dSP; |
| 12874 | 115 | |
| 116 | gps = (GaimPerlScript *)plugin->info->extra_info; | |
| 11170 | 117 | |
| 118 | ENTER; | |
| 119 | SAVETMPS; | |
| 120 | ||
| 12874 | 121 | count = call_pv(gps->gtk_prefs_sub, G_SCALAR | G_NOARGS); |
| 11170 | 122 | if (count != 1) |
| 123 | croak("call_pv: Did not return the correct number of values.\n"); | |
| 12803 | 124 | |
| 11170 | 125 | /* the frame was created in a perl sub and is returned */ |
| 126 | SPAGAIN; | |
| 127 | ||
| 128 | /* We have a Gtk2::Frame on top of the stack */ | |
| 12803 | 129 | sv = POPs; |
| 11170 | 130 | |
| 12874 | 131 | /* The magic field hides the pointer to the actual GtkWidget */ |
| 11170 | 132 | mg = mg_find(SvRV(sv), PERL_MAGIC_ext); |
| 133 | ret = (GtkWidget *)mg->mg_ptr; | |
| 134 | ||
| 135 | PUTBACK; | |
| 136 | FREETMPS; | |
| 12803 | 137 | LEAVE; |
| 138 | ||
| 11170 | 139 | return ret; |
| 140 | } | |
| 141 | ||
| 12803 | 142 | GaimPluginPrefFrame * |
| 143 | gaim_perl_get_plugin_frame(GaimPlugin *plugin) | |
| 144 | { | |
| 145 | /* Sets up the Perl Stack for our call back into the script to run the | |
| 146 | * plugin_pref... sub */ | |
| 12872 | 147 | int count; |
| 148 | GaimPerlScript *gps; | |
| 11123 | 149 | GaimPluginPrefFrame *ret_frame; |
| 150 | dSP; | |
| 151 | ||
| 12872 | 152 | gps = (GaimPerlScript *)plugin->info->extra_info; |
| 153 | ||
| 11123 | 154 | ENTER; |
| 155 | SAVETMPS; | |
| 12803 | 156 | /* Some perl magic to run perl_plugin_pref_frame_SV perl sub and |
| 157 | * return the frame */ | |
| 11123 | 158 | PUSHMARK(SP); |
| 159 | PUTBACK; | |
| 160 | ||
| 12872 | 161 | count = call_pv(gps->prefs_sub, G_SCALAR | G_NOARGS); |
| 11123 | 162 | |
| 163 | SPAGAIN; | |
| 164 | ||
| 165 | if (count != 1) | |
| 166 | croak("call_pv: Did not return the correct number of values.\n"); | |
| 167 | /* the frame was created in a perl sub and is returned */ | |
| 168 | ret_frame = (GaimPluginPrefFrame *)gaim_perl_ref_object(POPs); | |
| 169 | ||
| 170 | /* Tidy up the Perl stack */ | |
| 171 | PUTBACK; | |
| 172 | FREETMPS; | |
| 173 | LEAVE; | |
| 12871 | 174 | |
| 11123 | 175 | return ret_frame; |
| 176 | } | |
| 6520 | 177 | |
| 178 | static void | |
| 179 | destroy_timeout_handler(GaimPerlTimeoutHandler *handler) | |
| 180 | { | |
| 181 | timeout_handlers = g_list_remove(timeout_handlers, handler); | |
| 182 | ||
|
6568
5c8c70b63dc3
[gaim-migrate @ 7090]
Christian Hammond <chipx86@chipx86.com>
parents:
6567
diff
changeset
|
183 | if (handler->callback != NULL) |
|
5c8c70b63dc3
[gaim-migrate @ 7090]
Christian Hammond <chipx86@chipx86.com>
parents:
6567
diff
changeset
|
184 | SvREFCNT_dec(handler->callback); |
|
5c8c70b63dc3
[gaim-migrate @ 7090]
Christian Hammond <chipx86@chipx86.com>
parents:
6567
diff
changeset
|
185 | |
|
5c8c70b63dc3
[gaim-migrate @ 7090]
Christian Hammond <chipx86@chipx86.com>
parents:
6567
diff
changeset
|
186 | if (handler->data != NULL) |
|
5c8c70b63dc3
[gaim-migrate @ 7090]
Christian Hammond <chipx86@chipx86.com>
parents:
6567
diff
changeset
|
187 | SvREFCNT_dec(handler->data); |
|
5c8c70b63dc3
[gaim-migrate @ 7090]
Christian Hammond <chipx86@chipx86.com>
parents:
6567
diff
changeset
|
188 | |
| 6520 | 189 | g_free(handler); |
| 190 | } | |
| 191 | ||
|
6549
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
192 | static void |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
193 | destroy_signal_handler(GaimPerlSignalHandler *handler) |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
194 | { |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
195 | signal_handlers = g_list_remove(signal_handlers, handler); |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
196 | |
|
6567
761a1feb5561
[gaim-migrate @ 7089]
Christian Hammond <chipx86@chipx86.com>
parents:
6566
diff
changeset
|
197 | if (handler->callback != NULL) |
|
761a1feb5561
[gaim-migrate @ 7089]
Christian Hammond <chipx86@chipx86.com>
parents:
6566
diff
changeset
|
198 | SvREFCNT_dec(handler->callback); |
|
761a1feb5561
[gaim-migrate @ 7089]
Christian Hammond <chipx86@chipx86.com>
parents:
6566
diff
changeset
|
199 | |
|
761a1feb5561
[gaim-migrate @ 7089]
Christian Hammond <chipx86@chipx86.com>
parents:
6566
diff
changeset
|
200 | if (handler->data != NULL) |
|
761a1feb5561
[gaim-migrate @ 7089]
Christian Hammond <chipx86@chipx86.com>
parents:
6566
diff
changeset
|
201 | SvREFCNT_dec(handler->data); |
|
761a1feb5561
[gaim-migrate @ 7089]
Christian Hammond <chipx86@chipx86.com>
parents:
6566
diff
changeset
|
202 | |
|
6549
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
203 | g_free(handler->signal); |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
204 | g_free(handler); |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
205 | } |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
206 | |
| 6520 | 207 | static int |
| 208 | perl_timeout_cb(gpointer data) | |
| 209 | { | |
| 210 | GaimPerlTimeoutHandler *handler = (GaimPerlTimeoutHandler *)data; | |
| 211 | ||
| 212 | dSP; | |
| 213 | ENTER; | |
| 214 | SAVETMPS; | |
| 215 | PUSHMARK(sp); | |
|
6568
5c8c70b63dc3
[gaim-migrate @ 7090]
Christian Hammond <chipx86@chipx86.com>
parents:
6567
diff
changeset
|
216 | XPUSHs((SV *)handler->data); |
| 6520 | 217 | PUTBACK; |
|
6568
5c8c70b63dc3
[gaim-migrate @ 7090]
Christian Hammond <chipx86@chipx86.com>
parents:
6567
diff
changeset
|
218 | call_sv(handler->callback, G_EVAL | G_SCALAR); |
| 6520 | 219 | SPAGAIN; |
| 220 | ||
| 221 | PUTBACK; | |
| 222 | FREETMPS; | |
| 223 | LEAVE; | |
| 224 | ||
| 225 | destroy_timeout_handler(handler); | |
| 226 | ||
| 227 | return 0; | |
| 228 | } | |
| 229 | ||
|
6921
3d49b89fc920
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
230 | typedef void *DATATYPE; |
|
3d49b89fc920
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
231 | |
|
6549
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
232 | static void * |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
233 | perl_signal_cb(va_list args, void *data) |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
234 | { |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
235 | GaimPerlSignalHandler *handler = (GaimPerlSignalHandler *)data; |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
236 | void *ret_val = NULL; |
|
6566
61eb35202526
[gaim-migrate @ 7088]
Christian Hammond <chipx86@chipx86.com>
parents:
6554
diff
changeset
|
237 | int i; |
|
6549
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
238 | int count; |
|
6566
61eb35202526
[gaim-migrate @ 7088]
Christian Hammond <chipx86@chipx86.com>
parents:
6554
diff
changeset
|
239 | int value_count; |
|
61eb35202526
[gaim-migrate @ 7088]
Christian Hammond <chipx86@chipx86.com>
parents:
6554
diff
changeset
|
240 | GaimValue *ret_value, **values; |
|
6919
2fd7ce2393f7
[gaim-migrate @ 7466]
Christian Hammond <chipx86@chipx86.com>
parents:
6568
diff
changeset
|
241 | SV **sv_args; |
|
6921
3d49b89fc920
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
242 | DATATYPE **copy_args; |
|
3d49b89fc920
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
243 | STRLEN na; |
|
6549
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
244 | |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
245 | dSP; |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
246 | ENTER; |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
247 | SAVETMPS; |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
248 | PUSHMARK(sp); |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
249 | |
|
6566
61eb35202526
[gaim-migrate @ 7088]
Christian Hammond <chipx86@chipx86.com>
parents:
6554
diff
changeset
|
250 | gaim_signal_get_values(handler->instance, handler->signal, |
| 12804 | 251 | &ret_value, &value_count, &values); |
|
6566
61eb35202526
[gaim-migrate @ 7088]
Christian Hammond <chipx86@chipx86.com>
parents:
6554
diff
changeset
|
252 | |
|
6921
3d49b89fc920
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
253 | sv_args = g_new(SV *, value_count); |
|
3d49b89fc920
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
254 | copy_args = g_new(void **, value_count); |
|
6919
2fd7ce2393f7
[gaim-migrate @ 7466]
Christian Hammond <chipx86@chipx86.com>
parents:
6568
diff
changeset
|
255 | |
| 12803 | 256 | for (i = 0; i < value_count; i++) { |
| 12804 | 257 | sv_args[i] = gaim_perl_sv_from_vargs(values[i], |
| 258 | (va_list*)&args, | |
| 259 | ©_args[i]); | |
|
6549
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
260 | |
|
6920
4f4931b005cb
[gaim-migrate @ 7467]
Christian Hammond <chipx86@chipx86.com>
parents:
6919
diff
changeset
|
261 | XPUSHs(sv_args[i]); |
|
6566
61eb35202526
[gaim-migrate @ 7088]
Christian Hammond <chipx86@chipx86.com>
parents:
6554
diff
changeset
|
262 | } |
|
61eb35202526
[gaim-migrate @ 7088]
Christian Hammond <chipx86@chipx86.com>
parents:
6554
diff
changeset
|
263 | |
|
6549
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
264 | XPUSHs((SV *)handler->data); |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
265 | |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
266 | PUTBACK; |
|
6567
761a1feb5561
[gaim-migrate @ 7089]
Christian Hammond <chipx86@chipx86.com>
parents:
6566
diff
changeset
|
267 | |
| 12803 | 268 | if (ret_value != NULL) { |
|
6921
3d49b89fc920
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
269 | count = call_sv(handler->callback, G_EVAL | G_SCALAR); |
|
6567
761a1feb5561
[gaim-migrate @ 7089]
Christian Hammond <chipx86@chipx86.com>
parents:
6566
diff
changeset
|
270 | |
|
761a1feb5561
[gaim-migrate @ 7089]
Christian Hammond <chipx86@chipx86.com>
parents:
6566
diff
changeset
|
271 | SPAGAIN; |
|
6549
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
272 | |
|
6567
761a1feb5561
[gaim-migrate @ 7089]
Christian Hammond <chipx86@chipx86.com>
parents:
6566
diff
changeset
|
273 | if (count != 1) |
|
761a1feb5561
[gaim-migrate @ 7089]
Christian Hammond <chipx86@chipx86.com>
parents:
6566
diff
changeset
|
274 | croak("Uh oh! call_sv returned %i != 1", i); |
|
761a1feb5561
[gaim-migrate @ 7089]
Christian Hammond <chipx86@chipx86.com>
parents:
6566
diff
changeset
|
275 | else |
|
6920
4f4931b005cb
[gaim-migrate @ 7467]
Christian Hammond <chipx86@chipx86.com>
parents:
6919
diff
changeset
|
276 | ret_val = gaim_perl_data_from_sv(ret_value, POPs); |
| 12803 | 277 | } else { |
|
6567
761a1feb5561
[gaim-migrate @ 7089]
Christian Hammond <chipx86@chipx86.com>
parents:
6566
diff
changeset
|
278 | call_sv(handler->callback, G_SCALAR); |
|
6549
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
279 | |
|
6921
3d49b89fc920
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
280 | SPAGAIN; |
|
3d49b89fc920
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
281 | } |
|
3d49b89fc920
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
282 | |
| 12803 | 283 | if (SvTRUE(ERRSV)) { |
| 284 | gaim_debug_error("perl", | |
| 285 | "Perl function exited abnormally: %s\n", | |
| 286 | SvPV(ERRSV, na)); | |
|
6921
3d49b89fc920
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
287 | } |
|
3d49b89fc920
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
288 | |
|
6919
2fd7ce2393f7
[gaim-migrate @ 7466]
Christian Hammond <chipx86@chipx86.com>
parents:
6568
diff
changeset
|
289 | /* See if any parameters changed. */ |
| 12803 | 290 | for (i = 0; i < value_count; i++) { |
| 291 | if (gaim_value_is_outgoing(values[i])) { | |
| 292 | switch (gaim_value_get_type(values[i])) { | |
|
6921
3d49b89fc920
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
293 | case GAIM_TYPE_BOOLEAN: |
|
3d49b89fc920
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
294 | *((gboolean *)copy_args[i]) = SvIV(sv_args[i]); |
|
3d49b89fc920
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
295 | break; |
|
3d49b89fc920
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
296 | |
|
3d49b89fc920
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
297 | case GAIM_TYPE_INT: |
|
3d49b89fc920
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
298 | *((int *)copy_args[i]) = SvIV(sv_args[i]); |
|
3d49b89fc920
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
299 | break; |
|
3d49b89fc920
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
300 | |
|
3d49b89fc920
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
301 | case GAIM_TYPE_UINT: |
|
3d49b89fc920
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
302 | *((unsigned int *)copy_args[i]) = SvUV(sv_args[i]); |
|
3d49b89fc920
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
303 | break; |
|
3d49b89fc920
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
304 | |
|
3d49b89fc920
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
305 | case GAIM_TYPE_LONG: |
|
3d49b89fc920
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
306 | *((long *)copy_args[i]) = SvIV(sv_args[i]); |
|
3d49b89fc920
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
307 | break; |
|
3d49b89fc920
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
308 | |
|
3d49b89fc920
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
309 | case GAIM_TYPE_ULONG: |
|
3d49b89fc920
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
310 | *((unsigned long *)copy_args[i]) = SvUV(sv_args[i]); |
|
3d49b89fc920
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
311 | break; |
|
3d49b89fc920
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
312 | |
|
3d49b89fc920
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
313 | case GAIM_TYPE_INT64: |
|
3d49b89fc920
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
314 | *((gint64 *)copy_args[i]) = SvIV(sv_args[i]); |
|
3d49b89fc920
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
315 | break; |
|
3d49b89fc920
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
316 | |
|
3d49b89fc920
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
317 | case GAIM_TYPE_UINT64: |
|
3d49b89fc920
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
318 | *((guint64 *)copy_args[i]) = SvUV(sv_args[i]); |
|
3d49b89fc920
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
319 | break; |
|
3d49b89fc920
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
320 | |
|
3d49b89fc920
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
321 | case GAIM_TYPE_STRING: |
| 12803 | 322 | if (strcmp(*((char **)copy_args[i]), SvPVX(sv_args[i]))) { |
|
6925
ace22b159921
[gaim-migrate @ 7472]
Christian Hammond <chipx86@chipx86.com>
parents:
6924
diff
changeset
|
323 | g_free(*((char **)copy_args[i])); |
|
ace22b159921
[gaim-migrate @ 7472]
Christian Hammond <chipx86@chipx86.com>
parents:
6924
diff
changeset
|
324 | *((char **)copy_args[i]) = |
|
ace22b159921
[gaim-migrate @ 7472]
Christian Hammond <chipx86@chipx86.com>
parents:
6924
diff
changeset
|
325 | g_strdup(SvPV(sv_args[i], na)); |
|
ace22b159921
[gaim-migrate @ 7472]
Christian Hammond <chipx86@chipx86.com>
parents:
6924
diff
changeset
|
326 | } |
|
6921
3d49b89fc920
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
327 | break; |
|
3d49b89fc920
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
328 | |
|
3d49b89fc920
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
329 | case GAIM_TYPE_POINTER: |
|
3d49b89fc920
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
330 | *((void **)copy_args[i]) = (void *)SvIV(sv_args[i]); |
|
3d49b89fc920
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
331 | break; |
|
3d49b89fc920
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
332 | |
|
3d49b89fc920
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
333 | case GAIM_TYPE_BOXED: |
|
3d49b89fc920
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
334 | *((void **)copy_args[i]) = (void *)SvIV(sv_args[i]); |
|
3d49b89fc920
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
335 | break; |
|
3d49b89fc920
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
336 | |
|
3d49b89fc920
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
337 | default: |
|
3d49b89fc920
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
338 | break; |
|
3d49b89fc920
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
339 | } |
|
3d49b89fc920
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
340 | |
|
3d49b89fc920
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
341 | #if 0 |
|
6920
4f4931b005cb
[gaim-migrate @ 7467]
Christian Hammond <chipx86@chipx86.com>
parents:
6919
diff
changeset
|
342 | *((void **)copy_args[i]) = gaim_perl_data_from_sv(values[i], |
|
4f4931b005cb
[gaim-migrate @ 7467]
Christian Hammond <chipx86@chipx86.com>
parents:
6919
diff
changeset
|
343 | sv_args[i]); |
|
6921
3d49b89fc920
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
344 | #endif |
|
6919
2fd7ce2393f7
[gaim-migrate @ 7466]
Christian Hammond <chipx86@chipx86.com>
parents:
6568
diff
changeset
|
345 | } |
|
2fd7ce2393f7
[gaim-migrate @ 7466]
Christian Hammond <chipx86@chipx86.com>
parents:
6568
diff
changeset
|
346 | } |
|
2fd7ce2393f7
[gaim-migrate @ 7466]
Christian Hammond <chipx86@chipx86.com>
parents:
6568
diff
changeset
|
347 | |
|
6921
3d49b89fc920
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
348 | PUTBACK; |
|
6549
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
349 | FREETMPS; |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
350 | LEAVE; |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
351 | |
|
6919
2fd7ce2393f7
[gaim-migrate @ 7466]
Christian Hammond <chipx86@chipx86.com>
parents:
6568
diff
changeset
|
352 | g_free(sv_args); |
|
6920
4f4931b005cb
[gaim-migrate @ 7467]
Christian Hammond <chipx86@chipx86.com>
parents:
6919
diff
changeset
|
353 | g_free(copy_args); |
|
6919
2fd7ce2393f7
[gaim-migrate @ 7466]
Christian Hammond <chipx86@chipx86.com>
parents:
6568
diff
changeset
|
354 | |
|
2fd7ce2393f7
[gaim-migrate @ 7466]
Christian Hammond <chipx86@chipx86.com>
parents:
6568
diff
changeset
|
355 | gaim_debug_misc("perl", "ret_val = %p\n", ret_val); |
|
2fd7ce2393f7
[gaim-migrate @ 7466]
Christian Hammond <chipx86@chipx86.com>
parents:
6568
diff
changeset
|
356 | |
|
6549
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
357 | return ret_val; |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
358 | } |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
359 | |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
360 | static GaimPerlSignalHandler * |
|
6567
761a1feb5561
[gaim-migrate @ 7089]
Christian Hammond <chipx86@chipx86.com>
parents:
6566
diff
changeset
|
361 | find_signal_handler(GaimPlugin *plugin, void *instance, const char *signal) |
|
6549
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
362 | { |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
363 | GaimPerlSignalHandler *handler; |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
364 | GList *l; |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
365 | |
| 12803 | 366 | for (l = signal_handlers; l != NULL; l = l->next) { |
|
6549
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
367 | handler = (GaimPerlSignalHandler *)l->data; |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
368 | |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
369 | if (handler->plugin == plugin && |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
370 | handler->instance == instance && |
| 12803 | 371 | !strcmp(handler->signal, signal)) { |
|
6549
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
372 | return handler; |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
373 | } |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
374 | } |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
375 | |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
376 | return NULL; |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
377 | } |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
378 | |
| 6520 | 379 | void |
|
6568
5c8c70b63dc3
[gaim-migrate @ 7090]
Christian Hammond <chipx86@chipx86.com>
parents:
6567
diff
changeset
|
380 | gaim_perl_timeout_add(GaimPlugin *plugin, int seconds, SV *callback, SV *data) |
| 6520 | 381 | { |
| 382 | GaimPerlTimeoutHandler *handler; | |
| 383 | ||
| 12803 | 384 | if (plugin == NULL) { |
|
6549
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
385 | croak("Invalid handle in adding perl timeout handler.\n"); |
| 6520 | 386 | return; |
| 387 | } | |
| 388 | ||
| 389 | handler = g_new0(GaimPerlTimeoutHandler, 1); | |
| 390 | ||
|
6568
5c8c70b63dc3
[gaim-migrate @ 7090]
Christian Hammond <chipx86@chipx86.com>
parents:
6567
diff
changeset
|
391 | handler->plugin = plugin; |
|
5c8c70b63dc3
[gaim-migrate @ 7090]
Christian Hammond <chipx86@chipx86.com>
parents:
6567
diff
changeset
|
392 | handler->callback = (callback != NULL && callback != &PL_sv_undef |
| 13017 | 393 | ? newSVsv(callback) : NULL); |
|
6568
5c8c70b63dc3
[gaim-migrate @ 7090]
Christian Hammond <chipx86@chipx86.com>
parents:
6567
diff
changeset
|
394 | handler->data = (data != NULL && data != &PL_sv_undef |
| 13017 | 395 | ? newSVsv(data) : NULL); |
| 6520 | 396 | |
| 397 | timeout_handlers = g_list_append(timeout_handlers, handler); | |
|
6568
5c8c70b63dc3
[gaim-migrate @ 7090]
Christian Hammond <chipx86@chipx86.com>
parents:
6567
diff
changeset
|
398 | |
| 6520 | 399 | handler->iotag = g_timeout_add(seconds * 1000, perl_timeout_cb, handler); |
| 400 | } | |
| 401 | ||
| 402 | void | |
| 403 | gaim_perl_timeout_clear_for_plugin(GaimPlugin *plugin) | |
| 404 | { | |
| 405 | GaimPerlTimeoutHandler *handler; | |
| 406 | GList *l, *l_next; | |
| 407 | ||
| 12803 | 408 | for (l = timeout_handlers; l != NULL; l = l_next) { |
| 6520 | 409 | l_next = l->next; |
| 410 | ||
| 411 | handler = (GaimPerlTimeoutHandler *)l->data; | |
| 412 | ||
| 413 | if (handler->plugin == plugin) | |
| 414 | destroy_timeout_handler(handler); | |
| 415 | } | |
| 416 | } | |
| 417 | ||
| 418 | void | |
| 419 | gaim_perl_timeout_clear(void) | |
| 420 | { | |
|
6549
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
421 | while (timeout_handlers != NULL) |
| 6520 | 422 | destroy_timeout_handler(timeout_handlers->data); |
| 423 | } | |
| 424 | ||
|
6549
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
425 | void |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
426 | gaim_perl_signal_connect(GaimPlugin *plugin, void *instance, |
| 12803 | 427 | const char *signal, SV *callback, SV *data) |
|
6549
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
428 | { |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
429 | GaimPerlSignalHandler *handler; |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
430 | |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
431 | handler = g_new0(GaimPerlSignalHandler, 1); |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
432 | handler->plugin = plugin; |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
433 | handler->instance = instance; |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
434 | handler->signal = g_strdup(signal); |
| 12803 | 435 | handler->callback = (callback != NULL && |
| 436 | callback != &PL_sv_undef ? newSVsv(callback) | |
| 437 | : NULL); | |
| 438 | handler->data = (data != NULL && | |
| 439 | data != &PL_sv_undef ? newSVsv(data) : NULL); | |
|
6549
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
440 | |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
441 | signal_handlers = g_list_append(signal_handlers, handler); |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
442 | |
| 12803 | 443 | gaim_signal_connect_vargs(instance, signal, plugin, |
| 444 | GAIM_CALLBACK(perl_signal_cb), handler); | |
|
6549
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
445 | } |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
446 | |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
447 | void |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
448 | gaim_perl_signal_disconnect(GaimPlugin *plugin, void *instance, |
| 12803 | 449 | const char *signal) |
|
6549
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
450 | { |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
451 | GaimPerlSignalHandler *handler; |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
452 | |
|
6567
761a1feb5561
[gaim-migrate @ 7089]
Christian Hammond <chipx86@chipx86.com>
parents:
6566
diff
changeset
|
453 | handler = find_signal_handler(plugin, instance, signal); |
|
6549
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
454 | |
| 12803 | 455 | if (handler == NULL) { |
|
6549
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
456 | croak("Invalid signal handler information in " |
| 12803 | 457 | "disconnecting a perl signal handler.\n"); |
|
6549
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
458 | return; |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
459 | } |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
460 | |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
461 | destroy_signal_handler(handler); |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
462 | } |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
463 | |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
464 | void |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
465 | gaim_perl_signal_clear_for_plugin(GaimPlugin *plugin) |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
466 | { |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
467 | GaimPerlSignalHandler *handler; |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
468 | GList *l, *l_next; |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
469 | |
| 12803 | 470 | for (l = signal_handlers; l != NULL; l = l_next) { |
|
6549
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
471 | l_next = l->next; |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
472 | |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
473 | handler = (GaimPerlSignalHandler *)l->data; |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
474 | |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
475 | if (handler->plugin == plugin) |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
476 | destroy_signal_handler(handler); |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
477 | } |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
478 | } |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
479 | |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
480 | void |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
481 | gaim_perl_signal_clear(void) |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
482 | { |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
483 | while (signal_handlers != NULL) |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
484 | destroy_signal_handler(signal_handlers->data); |
|
8e6ba2a45698
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
485 | } |
| 12882 | 486 | |
| 487 | static GaimCmdRet | |
| 488 | perl_cmd_cb(GaimConversation *conv, const gchar *command, | |
| 489 | gchar **args, gchar **error, void *data) | |
| 490 | { | |
| 491 | int i = 0, count, ret_value = GAIM_CMD_RET_OK; | |
| 492 | SV *cmdSV, *tmpSV, *convSV; | |
| 493 | GaimPerlCmdHandler *handler = (GaimPerlCmdHandler *)data; | |
| 494 | ||
| 495 | dSP; | |
| 496 | ENTER; | |
| 497 | SAVETMPS; | |
| 498 | PUSHMARK(SP); | |
| 499 | ||
| 500 | /* Push the conversation onto the perl stack */ | |
| 501 | convSV = sv_2mortal(gaim_perl_bless_object(conv, "Gaim::Conversation")); | |
| 502 | XPUSHs(convSV); | |
| 503 | ||
| 504 | /* Push the command string onto the perl stack */ | |
| 505 | cmdSV = newSVpv(command, 0); | |
| 506 | cmdSV = sv_2mortal(cmdSV); | |
| 507 | XPUSHs(cmdSV); | |
| 508 | ||
| 509 | /* Push the data onto the perl stack */ | |
| 510 | XPUSHs((SV *)handler->data); | |
| 511 | ||
| 512 | /* Push any arguments we may have */ | |
| 513 | for (i = 0; args[i] != NULL; i++) { | |
| 514 | /* XXX The mortality of these created SV's should prevent | |
| 515 | * memory issues, if I read/understood everything correctly... | |
| 516 | */ | |
| 517 | tmpSV = newSVpv(args[i], 0); | |
| 518 | tmpSV = sv_2mortal(tmpSV); | |
| 519 | XPUSHs(tmpSV); | |
| 520 | } | |
| 521 | ||
| 522 | PUTBACK; | |
| 523 | count = call_sv(handler->callback, G_EVAL|G_SCALAR); | |
| 524 | ||
| 525 | if (count != 1) | |
| 526 | croak("call_sv: Did not return the correct number of values.\n"); | |
| 527 | ||
| 528 | SPAGAIN; | |
| 529 | ||
| 530 | ret_value = POPi; | |
| 531 | ||
| 532 | PUTBACK; | |
| 533 | FREETMPS; | |
| 534 | LEAVE; | |
| 535 | ||
| 536 | return ret_value; | |
| 537 | } | |
| 538 | ||
| 539 | GaimCmdId | |
| 540 | gaim_perl_cmd_register(GaimPlugin *plugin, const gchar *command, | |
| 541 | const gchar *args, GaimCmdPriority priority, | |
| 542 | GaimCmdFlag flag, const gchar *prpl_id, SV *callback, | |
| 543 | const gchar *helpstr, SV *data) | |
| 544 | { | |
| 545 | GaimPerlCmdHandler *handler; | |
| 546 | ||
| 547 | handler = g_new0(GaimPerlCmdHandler, 1); | |
| 548 | handler->plugin = plugin; | |
| 549 | handler->cmd = g_strdup(command); | |
| 550 | handler->prpl_id = g_strdup(prpl_id); | |
| 551 | ||
| 552 | if (callback != NULL && callback != &PL_sv_undef) | |
| 553 | handler->callback = newSVsv(callback); | |
| 554 | else | |
| 555 | handler->callback = NULL; | |
| 556 | ||
| 557 | if (data != NULL && data != &PL_sv_undef) | |
| 558 | handler->data = newSVsv(data); | |
| 559 | else | |
| 560 | handler->data = NULL; | |
| 561 | ||
| 562 | cmd_handlers = g_list_append(cmd_handlers, handler); | |
| 563 | ||
| 564 | handler->id = gaim_cmd_register(command, args, priority, flag, prpl_id, | |
| 565 | GAIM_CMD_FUNC(perl_cmd_cb), helpstr, | |
| 566 | handler); | |
| 567 | ||
| 568 | return handler->id; | |
| 569 | } | |
| 570 | ||
| 571 | static void | |
| 572 | destroy_cmd_handler(GaimPerlCmdHandler *handler) | |
| 573 | { | |
| 574 | cmd_handlers = g_list_remove(cmd_handlers, handler); | |
| 575 | ||
| 576 | if (handler->callback != NULL) | |
| 577 | SvREFCNT_dec(handler->callback); | |
| 578 | ||
| 579 | if (handler->data != NULL) | |
| 580 | SvREFCNT_dec(handler->data); | |
| 581 | ||
| 582 | g_free(handler->cmd); | |
| 583 | g_free(handler->prpl_id); | |
| 584 | g_free(handler); | |
| 585 | } | |
| 586 | ||
| 587 | void | |
| 588 | gaim_perl_cmd_clear_for_plugin(GaimPlugin *plugin) | |
| 589 | { | |
| 590 | GList *l, *l_next; | |
| 591 | ||
| 592 | for (l = cmd_handlers; l != NULL; l = l_next) { | |
| 593 | GaimPerlCmdHandler *handler = (GaimPerlCmdHandler *)l->data; | |
| 594 | ||
| 595 | l_next = l->next; | |
| 596 | ||
| 597 | if (handler->plugin == plugin) | |
| 598 | destroy_cmd_handler(handler); | |
| 599 | } | |
| 600 | } | |
| 601 | ||
| 602 | static GaimPerlCmdHandler * | |
| 603 | find_cmd_handler(GaimCmdId id) | |
| 604 | { | |
| 605 | GList *l; | |
| 606 | ||
| 607 | for (l = cmd_handlers; l != NULL; l = l->next) { | |
| 608 | GaimPerlCmdHandler *handler = (GaimPerlCmdHandler *)l->data; | |
| 609 | ||
| 610 | if (handler->id == id) | |
| 611 | return handler; | |
| 612 | } | |
| 613 | ||
| 614 | return NULL; | |
| 615 | } | |
| 616 | ||
| 617 | void | |
| 618 | gaim_perl_cmd_unregister(GaimCmdId id) | |
| 619 | { | |
| 620 | GaimPerlCmdHandler *handler; | |
| 621 | ||
| 622 | handler = find_cmd_handler(id); | |
| 623 | ||
| 624 | if (handler == NULL) { | |
| 625 | croak("Invalid command id in removing a perl command handler.\n"); | |
| 626 | return; | |
| 627 | } | |
| 628 | ||
| 629 | gaim_cmd_unregister(id); | |
| 630 | destroy_cmd_handler(handler); | |
| 631 | } |