Mercurial > pidgin.yaz
annotate plugins/perl/perl-handlers.c @ 13854:a4c30c1d9de8
[gaim-migrate @ 16313]
Unnecessary variables are bad, mmkay.
committer: Tailor Script <tailor@pidgin.im>
author | Sadrul Habib Chowdhury <imadil@gmail.com> |
---|---|
date | Fri, 23 Jun 2006 00:57:30 +0000 |
parents | ba9946650bf7 |
children |
rev | line source |
---|---|
6520 | 1 #include "perl-common.h" |
2 #include "perl-handlers.h" | |
3 | |
4 #include "debug.h" | |
6549
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
5 #include "signals.h" |
6520 | 6 |
12882
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
7 extern PerlInterpreter *my_perl; |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
8 static GList *cmd_handlers = NULL; |
6549
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
9 static GList *signal_handlers = NULL; |
12882
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
10 static GList *timeout_handlers = NULL; |
6520 | 11 |
12165 | 12 /* perl < 5.8.0 doesn't define PERL_MAGIC_ext */ |
13 #ifndef PERL_MAGIC_ext | |
14 #define PERL_MAGIC_ext '~' | |
15 #endif | |
16 | |
12803
050b29b7232a
[gaim-migrate @ 15150]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12165
diff
changeset
|
17 void |
12988
b457aa723bab
[gaim-migrate @ 15341]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12882
diff
changeset
|
18 gaim_perl_plugin_action_cb(GaimPluginAction *action) |
12803
050b29b7232a
[gaim-migrate @ 15150]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12165
diff
changeset
|
19 { |
12988
b457aa723bab
[gaim-migrate @ 15341]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12882
diff
changeset
|
20 SV **callback; |
b457aa723bab
[gaim-migrate @ 15341]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12882
diff
changeset
|
21 HV *hv = NULL; |
b457aa723bab
[gaim-migrate @ 15341]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12882
diff
changeset
|
22 gchar *hvname; |
b457aa723bab
[gaim-migrate @ 15341]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12882
diff
changeset
|
23 GaimPlugin *plugin; |
b457aa723bab
[gaim-migrate @ 15341]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12882
diff
changeset
|
24 GaimPerlScript *gps; |
12803
050b29b7232a
[gaim-migrate @ 15150]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12165
diff
changeset
|
25 dSP; |
12988
b457aa723bab
[gaim-migrate @ 15341]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12882
diff
changeset
|
26 |
b457aa723bab
[gaim-migrate @ 15341]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12882
diff
changeset
|
27 plugin = action->plugin; |
b457aa723bab
[gaim-migrate @ 15341]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12882
diff
changeset
|
28 gps = (GaimPerlScript *)plugin->info->extra_info; |
b457aa723bab
[gaim-migrate @ 15341]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12882
diff
changeset
|
29 hvname = g_strdup_printf("%s::plugin_actions", gps->package); |
b457aa723bab
[gaim-migrate @ 15341]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12882
diff
changeset
|
30 hv = get_hv(hvname, FALSE); |
b457aa723bab
[gaim-migrate @ 15341]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12882
diff
changeset
|
31 g_free(hvname); |
b457aa723bab
[gaim-migrate @ 15341]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12882
diff
changeset
|
32 |
b457aa723bab
[gaim-migrate @ 15341]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12882
diff
changeset
|
33 if (hv == NULL) |
b457aa723bab
[gaim-migrate @ 15341]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12882
diff
changeset
|
34 croak("No plugin_actions hash found in \"%s\" plugin.", gaim_plugin_get_name(plugin)); |
b457aa723bab
[gaim-migrate @ 15341]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12882
diff
changeset
|
35 |
12803
050b29b7232a
[gaim-migrate @ 15150]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12165
diff
changeset
|
36 ENTER; |
050b29b7232a
[gaim-migrate @ 15150]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12165
diff
changeset
|
37 SAVETMPS; |
12988
b457aa723bab
[gaim-migrate @ 15341]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12882
diff
changeset
|
38 |
b457aa723bab
[gaim-migrate @ 15341]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12882
diff
changeset
|
39 callback = hv_fetch(hv, action->label, strlen(action->label), 0); |
11170 | 40 |
12988
b457aa723bab
[gaim-migrate @ 15341]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12882
diff
changeset
|
41 if (callback == NULL || *callback == NULL) |
b457aa723bab
[gaim-migrate @ 15341]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12882
diff
changeset
|
42 croak("No plugin_action function named \"%s\" in \"%s\" plugin.", action->label, gaim_plugin_get_name(plugin)); |
11170 | 43 |
12988
b457aa723bab
[gaim-migrate @ 15341]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12882
diff
changeset
|
44 PUSHMARK(sp); |
b457aa723bab
[gaim-migrate @ 15341]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12882
diff
changeset
|
45 XPUSHs(gaim_perl_bless_object(gps->plugin, "Gaim::Plugin")); |
12803
050b29b7232a
[gaim-migrate @ 15150]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12165
diff
changeset
|
46 PUTBACK; |
11170 | 47 |
12988
b457aa723bab
[gaim-migrate @ 15341]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12882
diff
changeset
|
48 call_sv(*callback, G_VOID | G_DISCARD); |
12803
050b29b7232a
[gaim-migrate @ 15150]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12165
diff
changeset
|
49 SPAGAIN; |
11170 | 50 |
12803
050b29b7232a
[gaim-migrate @ 15150]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12165
diff
changeset
|
51 PUTBACK; |
050b29b7232a
[gaim-migrate @ 15150]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12165
diff
changeset
|
52 FREETMPS; |
050b29b7232a
[gaim-migrate @ 15150]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12165
diff
changeset
|
53 LEAVE; |
11170 | 54 } |
55 | |
12803
050b29b7232a
[gaim-migrate @ 15150]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12165
diff
changeset
|
56 GList * |
12988
b457aa723bab
[gaim-migrate @ 15341]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12882
diff
changeset
|
57 gaim_perl_plugin_actions(GaimPlugin *plugin, gpointer context) |
12803
050b29b7232a
[gaim-migrate @ 15150]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12165
diff
changeset
|
58 { |
12988
b457aa723bab
[gaim-migrate @ 15341]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12882
diff
changeset
|
59 GList *l = NULL; |
b457aa723bab
[gaim-migrate @ 15341]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12882
diff
changeset
|
60 GaimPerlScript *gps; |
b457aa723bab
[gaim-migrate @ 15341]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12882
diff
changeset
|
61 int i = 0, count = 0; |
b457aa723bab
[gaim-migrate @ 15341]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12882
diff
changeset
|
62 dSP; |
b457aa723bab
[gaim-migrate @ 15341]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12882
diff
changeset
|
63 |
b457aa723bab
[gaim-migrate @ 15341]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12882
diff
changeset
|
64 gps = (GaimPerlScript *)plugin->info->extra_info; |
b457aa723bab
[gaim-migrate @ 15341]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12882
diff
changeset
|
65 |
b457aa723bab
[gaim-migrate @ 15341]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12882
diff
changeset
|
66 ENTER; |
b457aa723bab
[gaim-migrate @ 15341]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12882
diff
changeset
|
67 SAVETMPS; |
b457aa723bab
[gaim-migrate @ 15341]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12882
diff
changeset
|
68 |
b457aa723bab
[gaim-migrate @ 15341]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12882
diff
changeset
|
69 PUSHMARK(SP); |
b457aa723bab
[gaim-migrate @ 15341]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12882
diff
changeset
|
70 XPUSHs(sv_2mortal(gaim_perl_bless_object(plugin, "Gaim::Plugin"))); |
b457aa723bab
[gaim-migrate @ 15341]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12882
diff
changeset
|
71 /* XXX This *will* cease working correctly if context gets changed to |
b457aa723bab
[gaim-migrate @ 15341]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12882
diff
changeset
|
72 * ever be able to hold anything other than a GaimConnection */ |
b457aa723bab
[gaim-migrate @ 15341]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12882
diff
changeset
|
73 if (context != NULL) |
b457aa723bab
[gaim-migrate @ 15341]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12882
diff
changeset
|
74 XPUSHs(sv_2mortal(gaim_perl_bless_object(context, "Gaim::Connection"))); |
b457aa723bab
[gaim-migrate @ 15341]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12882
diff
changeset
|
75 else |
b457aa723bab
[gaim-migrate @ 15341]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12882
diff
changeset
|
76 XPUSHs(&PL_sv_undef); |
b457aa723bab
[gaim-migrate @ 15341]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12882
diff
changeset
|
77 PUTBACK; |
b457aa723bab
[gaim-migrate @ 15341]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12882
diff
changeset
|
78 |
b457aa723bab
[gaim-migrate @ 15341]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12882
diff
changeset
|
79 count = call_pv(gps->plugin_action_sub, G_ARRAY); |
11170 | 80 |
12988
b457aa723bab
[gaim-migrate @ 15341]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12882
diff
changeset
|
81 SPAGAIN; |
b457aa723bab
[gaim-migrate @ 15341]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12882
diff
changeset
|
82 |
b457aa723bab
[gaim-migrate @ 15341]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12882
diff
changeset
|
83 if (count == 0) |
b457aa723bab
[gaim-migrate @ 15341]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12882
diff
changeset
|
84 croak("The plugin_actions sub didn't return anything.\n"); |
b457aa723bab
[gaim-migrate @ 15341]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12882
diff
changeset
|
85 |
b457aa723bab
[gaim-migrate @ 15341]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12882
diff
changeset
|
86 for (i = 0; i < count; i++) { |
b457aa723bab
[gaim-migrate @ 15341]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12882
diff
changeset
|
87 SV *sv; |
b457aa723bab
[gaim-migrate @ 15341]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12882
diff
changeset
|
88 gchar *label; |
b457aa723bab
[gaim-migrate @ 15341]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12882
diff
changeset
|
89 GaimPluginAction *act = NULL; |
11170 | 90 |
12988
b457aa723bab
[gaim-migrate @ 15341]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12882
diff
changeset
|
91 sv = POPs; |
b457aa723bab
[gaim-migrate @ 15341]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12882
diff
changeset
|
92 label = SvPV_nolen(sv); |
b457aa723bab
[gaim-migrate @ 15341]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12882
diff
changeset
|
93 /* XXX I think this leaks, but doing it without the strdup |
b457aa723bab
[gaim-migrate @ 15341]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12882
diff
changeset
|
94 * just showed garbage */ |
b457aa723bab
[gaim-migrate @ 15341]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12882
diff
changeset
|
95 act = gaim_plugin_action_new(g_strdup(label), gaim_perl_plugin_action_cb); |
13353
ba9946650bf7
[gaim-migrate @ 15725]
Richard Laager <rlaager@wiktel.com>
parents:
13190
diff
changeset
|
96 l = g_list_prepend(l, act); |
12988
b457aa723bab
[gaim-migrate @ 15341]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12882
diff
changeset
|
97 } |
b457aa723bab
[gaim-migrate @ 15341]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12882
diff
changeset
|
98 |
b457aa723bab
[gaim-migrate @ 15341]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12882
diff
changeset
|
99 PUTBACK; |
b457aa723bab
[gaim-migrate @ 15341]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12882
diff
changeset
|
100 FREETMPS; |
b457aa723bab
[gaim-migrate @ 15341]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12882
diff
changeset
|
101 LEAVE; |
b457aa723bab
[gaim-migrate @ 15341]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12882
diff
changeset
|
102 |
b457aa723bab
[gaim-migrate @ 15341]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12882
diff
changeset
|
103 return l; |
11170 | 104 } |
105 | |
12803
050b29b7232a
[gaim-migrate @ 15150]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12165
diff
changeset
|
106 GtkWidget * |
050b29b7232a
[gaim-migrate @ 15150]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12165
diff
changeset
|
107 gaim_perl_gtk_get_plugin_frame(GaimPlugin *plugin) |
050b29b7232a
[gaim-migrate @ 15150]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12165
diff
changeset
|
108 { |
11170 | 109 SV * sv; |
12874
e65a7a7eabaf
[gaim-migrate @ 15226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12872
diff
changeset
|
110 int count; |
11170 | 111 MAGIC *mg; |
12874
e65a7a7eabaf
[gaim-migrate @ 15226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12872
diff
changeset
|
112 GtkWidget *ret; |
e65a7a7eabaf
[gaim-migrate @ 15226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12872
diff
changeset
|
113 GaimPerlScript *gps; |
11170 | 114 dSP; |
12874
e65a7a7eabaf
[gaim-migrate @ 15226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12872
diff
changeset
|
115 |
e65a7a7eabaf
[gaim-migrate @ 15226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12872
diff
changeset
|
116 gps = (GaimPerlScript *)plugin->info->extra_info; |
11170 | 117 |
118 ENTER; | |
119 SAVETMPS; | |
120 | |
12874
e65a7a7eabaf
[gaim-migrate @ 15226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12872
diff
changeset
|
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
050b29b7232a
[gaim-migrate @ 15150]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12165
diff
changeset
|
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
050b29b7232a
[gaim-migrate @ 15150]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12165
diff
changeset
|
129 sv = POPs; |
11170 | 130 |
12874
e65a7a7eabaf
[gaim-migrate @ 15226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12872
diff
changeset
|
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
050b29b7232a
[gaim-migrate @ 15150]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12165
diff
changeset
|
137 LEAVE; |
050b29b7232a
[gaim-migrate @ 15150]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12165
diff
changeset
|
138 |
11170 | 139 return ret; |
140 } | |
141 | |
12803
050b29b7232a
[gaim-migrate @ 15150]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12165
diff
changeset
|
142 GaimPluginPrefFrame * |
050b29b7232a
[gaim-migrate @ 15150]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12165
diff
changeset
|
143 gaim_perl_get_plugin_frame(GaimPlugin *plugin) |
050b29b7232a
[gaim-migrate @ 15150]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12165
diff
changeset
|
144 { |
050b29b7232a
[gaim-migrate @ 15150]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12165
diff
changeset
|
145 /* Sets up the Perl Stack for our call back into the script to run the |
050b29b7232a
[gaim-migrate @ 15150]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12165
diff
changeset
|
146 * plugin_pref... sub */ |
12872
59ff3e1c874e
[gaim-migrate @ 15224]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12871
diff
changeset
|
147 int count; |
59ff3e1c874e
[gaim-migrate @ 15224]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12871
diff
changeset
|
148 GaimPerlScript *gps; |
11123 | 149 GaimPluginPrefFrame *ret_frame; |
150 dSP; | |
151 | |
12872
59ff3e1c874e
[gaim-migrate @ 15224]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12871
diff
changeset
|
152 gps = (GaimPerlScript *)plugin->info->extra_info; |
59ff3e1c874e
[gaim-migrate @ 15224]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12871
diff
changeset
|
153 |
11123 | 154 ENTER; |
155 SAVETMPS; | |
12803
050b29b7232a
[gaim-migrate @ 15150]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12165
diff
changeset
|
156 /* Some perl magic to run perl_plugin_pref_frame_SV perl sub and |
050b29b7232a
[gaim-migrate @ 15150]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12165
diff
changeset
|
157 * return the frame */ |
11123 | 158 PUSHMARK(SP); |
159 PUTBACK; | |
160 | |
12872
59ff3e1c874e
[gaim-migrate @ 15224]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12871
diff
changeset
|
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
2422097a7a5e
[gaim-migrate @ 15223]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12804
diff
changeset
|
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
33486b749aa9
[gaim-migrate @ 7090]
Christian Hammond <chipx86@chipx86.com>
parents:
6567
diff
changeset
|
183 if (handler->callback != NULL) |
33486b749aa9
[gaim-migrate @ 7090]
Christian Hammond <chipx86@chipx86.com>
parents:
6567
diff
changeset
|
184 SvREFCNT_dec(handler->callback); |
33486b749aa9
[gaim-migrate @ 7090]
Christian Hammond <chipx86@chipx86.com>
parents:
6567
diff
changeset
|
185 |
33486b749aa9
[gaim-migrate @ 7090]
Christian Hammond <chipx86@chipx86.com>
parents:
6567
diff
changeset
|
186 if (handler->data != NULL) |
33486b749aa9
[gaim-migrate @ 7090]
Christian Hammond <chipx86@chipx86.com>
parents:
6567
diff
changeset
|
187 SvREFCNT_dec(handler->data); |
33486b749aa9
[gaim-migrate @ 7090]
Christian Hammond <chipx86@chipx86.com>
parents:
6567
diff
changeset
|
188 |
6520 | 189 g_free(handler); |
190 } | |
191 | |
6549
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
192 static void |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
193 destroy_signal_handler(GaimPerlSignalHandler *handler) |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
194 { |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
195 signal_handlers = g_list_remove(signal_handlers, handler); |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
196 |
6567
6e25e1e08ffb
[gaim-migrate @ 7089]
Christian Hammond <chipx86@chipx86.com>
parents:
6566
diff
changeset
|
197 if (handler->callback != NULL) |
6e25e1e08ffb
[gaim-migrate @ 7089]
Christian Hammond <chipx86@chipx86.com>
parents:
6566
diff
changeset
|
198 SvREFCNT_dec(handler->callback); |
6e25e1e08ffb
[gaim-migrate @ 7089]
Christian Hammond <chipx86@chipx86.com>
parents:
6566
diff
changeset
|
199 |
6e25e1e08ffb
[gaim-migrate @ 7089]
Christian Hammond <chipx86@chipx86.com>
parents:
6566
diff
changeset
|
200 if (handler->data != NULL) |
6e25e1e08ffb
[gaim-migrate @ 7089]
Christian Hammond <chipx86@chipx86.com>
parents:
6566
diff
changeset
|
201 SvREFCNT_dec(handler->data); |
6e25e1e08ffb
[gaim-migrate @ 7089]
Christian Hammond <chipx86@chipx86.com>
parents:
6566
diff
changeset
|
202 |
6549
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
203 g_free(handler->signal); |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
204 g_free(handler); |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
205 } |
ed796f756237
[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
33486b749aa9
[gaim-migrate @ 7090]
Christian Hammond <chipx86@chipx86.com>
parents:
6567
diff
changeset
|
216 XPUSHs((SV *)handler->data); |
6520 | 217 PUTBACK; |
6568
33486b749aa9
[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
11d05ddf30a3
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
230 typedef void *DATATYPE; |
11d05ddf30a3
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
231 |
6549
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
232 static void * |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
233 perl_signal_cb(va_list args, void *data) |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
234 { |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
235 GaimPerlSignalHandler *handler = (GaimPerlSignalHandler *)data; |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
236 void *ret_val = NULL; |
6566
f6c2a7b5afa7
[gaim-migrate @ 7088]
Christian Hammond <chipx86@chipx86.com>
parents:
6554
diff
changeset
|
237 int i; |
6549
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
238 int count; |
6566
f6c2a7b5afa7
[gaim-migrate @ 7088]
Christian Hammond <chipx86@chipx86.com>
parents:
6554
diff
changeset
|
239 int value_count; |
f6c2a7b5afa7
[gaim-migrate @ 7088]
Christian Hammond <chipx86@chipx86.com>
parents:
6554
diff
changeset
|
240 GaimValue *ret_value, **values; |
6919
1aa771990188
[gaim-migrate @ 7466]
Christian Hammond <chipx86@chipx86.com>
parents:
6568
diff
changeset
|
241 SV **sv_args; |
6921
11d05ddf30a3
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
242 DATATYPE **copy_args; |
11d05ddf30a3
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
243 STRLEN na; |
6549
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
244 |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
245 dSP; |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
246 ENTER; |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
247 SAVETMPS; |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
248 PUSHMARK(sp); |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
249 |
6566
f6c2a7b5afa7
[gaim-migrate @ 7088]
Christian Hammond <chipx86@chipx86.com>
parents:
6554
diff
changeset
|
250 gaim_signal_get_values(handler->instance, handler->signal, |
12804
86d67bd4ef24
[gaim-migrate @ 15151]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12803
diff
changeset
|
251 &ret_value, &value_count, &values); |
6566
f6c2a7b5afa7
[gaim-migrate @ 7088]
Christian Hammond <chipx86@chipx86.com>
parents:
6554
diff
changeset
|
252 |
6921
11d05ddf30a3
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
253 sv_args = g_new(SV *, value_count); |
11d05ddf30a3
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
254 copy_args = g_new(void **, value_count); |
6919
1aa771990188
[gaim-migrate @ 7466]
Christian Hammond <chipx86@chipx86.com>
parents:
6568
diff
changeset
|
255 |
12803
050b29b7232a
[gaim-migrate @ 15150]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12165
diff
changeset
|
256 for (i = 0; i < value_count; i++) { |
12804
86d67bd4ef24
[gaim-migrate @ 15151]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12803
diff
changeset
|
257 sv_args[i] = gaim_perl_sv_from_vargs(values[i], |
86d67bd4ef24
[gaim-migrate @ 15151]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12803
diff
changeset
|
258 (va_list*)&args, |
86d67bd4ef24
[gaim-migrate @ 15151]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12803
diff
changeset
|
259 ©_args[i]); |
6549
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
260 |
6920
13f78c350cd3
[gaim-migrate @ 7467]
Christian Hammond <chipx86@chipx86.com>
parents:
6919
diff
changeset
|
261 XPUSHs(sv_args[i]); |
6566
f6c2a7b5afa7
[gaim-migrate @ 7088]
Christian Hammond <chipx86@chipx86.com>
parents:
6554
diff
changeset
|
262 } |
f6c2a7b5afa7
[gaim-migrate @ 7088]
Christian Hammond <chipx86@chipx86.com>
parents:
6554
diff
changeset
|
263 |
6549
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
264 XPUSHs((SV *)handler->data); |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
265 |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
266 PUTBACK; |
6567
6e25e1e08ffb
[gaim-migrate @ 7089]
Christian Hammond <chipx86@chipx86.com>
parents:
6566
diff
changeset
|
267 |
12803
050b29b7232a
[gaim-migrate @ 15150]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12165
diff
changeset
|
268 if (ret_value != NULL) { |
6921
11d05ddf30a3
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
269 count = call_sv(handler->callback, G_EVAL | G_SCALAR); |
6567
6e25e1e08ffb
[gaim-migrate @ 7089]
Christian Hammond <chipx86@chipx86.com>
parents:
6566
diff
changeset
|
270 |
6e25e1e08ffb
[gaim-migrate @ 7089]
Christian Hammond <chipx86@chipx86.com>
parents:
6566
diff
changeset
|
271 SPAGAIN; |
6549
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
272 |
6567
6e25e1e08ffb
[gaim-migrate @ 7089]
Christian Hammond <chipx86@chipx86.com>
parents:
6566
diff
changeset
|
273 if (count != 1) |
6e25e1e08ffb
[gaim-migrate @ 7089]
Christian Hammond <chipx86@chipx86.com>
parents:
6566
diff
changeset
|
274 croak("Uh oh! call_sv returned %i != 1", i); |
6e25e1e08ffb
[gaim-migrate @ 7089]
Christian Hammond <chipx86@chipx86.com>
parents:
6566
diff
changeset
|
275 else |
6920
13f78c350cd3
[gaim-migrate @ 7467]
Christian Hammond <chipx86@chipx86.com>
parents:
6919
diff
changeset
|
276 ret_val = gaim_perl_data_from_sv(ret_value, POPs); |
12803
050b29b7232a
[gaim-migrate @ 15150]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12165
diff
changeset
|
277 } else { |
6567
6e25e1e08ffb
[gaim-migrate @ 7089]
Christian Hammond <chipx86@chipx86.com>
parents:
6566
diff
changeset
|
278 call_sv(handler->callback, G_SCALAR); |
6549
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
279 |
6921
11d05ddf30a3
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
280 SPAGAIN; |
11d05ddf30a3
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
281 } |
11d05ddf30a3
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
282 |
12803
050b29b7232a
[gaim-migrate @ 15150]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12165
diff
changeset
|
283 if (SvTRUE(ERRSV)) { |
050b29b7232a
[gaim-migrate @ 15150]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12165
diff
changeset
|
284 gaim_debug_error("perl", |
050b29b7232a
[gaim-migrate @ 15150]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12165
diff
changeset
|
285 "Perl function exited abnormally: %s\n", |
050b29b7232a
[gaim-migrate @ 15150]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12165
diff
changeset
|
286 SvPV(ERRSV, na)); |
6921
11d05ddf30a3
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
287 } |
11d05ddf30a3
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
288 |
6919
1aa771990188
[gaim-migrate @ 7466]
Christian Hammond <chipx86@chipx86.com>
parents:
6568
diff
changeset
|
289 /* See if any parameters changed. */ |
12803
050b29b7232a
[gaim-migrate @ 15150]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12165
diff
changeset
|
290 for (i = 0; i < value_count; i++) { |
050b29b7232a
[gaim-migrate @ 15150]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12165
diff
changeset
|
291 if (gaim_value_is_outgoing(values[i])) { |
050b29b7232a
[gaim-migrate @ 15150]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12165
diff
changeset
|
292 switch (gaim_value_get_type(values[i])) { |
6921
11d05ddf30a3
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
293 case GAIM_TYPE_BOOLEAN: |
11d05ddf30a3
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
294 *((gboolean *)copy_args[i]) = SvIV(sv_args[i]); |
11d05ddf30a3
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
295 break; |
11d05ddf30a3
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
296 |
11d05ddf30a3
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
297 case GAIM_TYPE_INT: |
11d05ddf30a3
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
298 *((int *)copy_args[i]) = SvIV(sv_args[i]); |
11d05ddf30a3
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
299 break; |
11d05ddf30a3
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
300 |
11d05ddf30a3
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
301 case GAIM_TYPE_UINT: |
11d05ddf30a3
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
302 *((unsigned int *)copy_args[i]) = SvUV(sv_args[i]); |
11d05ddf30a3
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
303 break; |
11d05ddf30a3
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
304 |
11d05ddf30a3
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
305 case GAIM_TYPE_LONG: |
11d05ddf30a3
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
306 *((long *)copy_args[i]) = SvIV(sv_args[i]); |
11d05ddf30a3
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
307 break; |
11d05ddf30a3
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
308 |
11d05ddf30a3
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
309 case GAIM_TYPE_ULONG: |
11d05ddf30a3
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
310 *((unsigned long *)copy_args[i]) = SvUV(sv_args[i]); |
11d05ddf30a3
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
311 break; |
11d05ddf30a3
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
312 |
11d05ddf30a3
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
313 case GAIM_TYPE_INT64: |
11d05ddf30a3
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
314 *((gint64 *)copy_args[i]) = SvIV(sv_args[i]); |
11d05ddf30a3
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
315 break; |
11d05ddf30a3
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
316 |
11d05ddf30a3
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
317 case GAIM_TYPE_UINT64: |
11d05ddf30a3
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
318 *((guint64 *)copy_args[i]) = SvUV(sv_args[i]); |
11d05ddf30a3
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
319 break; |
11d05ddf30a3
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
320 |
11d05ddf30a3
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
321 case GAIM_TYPE_STRING: |
12803
050b29b7232a
[gaim-migrate @ 15150]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12165
diff
changeset
|
322 if (strcmp(*((char **)copy_args[i]), SvPVX(sv_args[i]))) { |
6925
3ec6aac0ff67
[gaim-migrate @ 7472]
Christian Hammond <chipx86@chipx86.com>
parents:
6924
diff
changeset
|
323 g_free(*((char **)copy_args[i])); |
3ec6aac0ff67
[gaim-migrate @ 7472]
Christian Hammond <chipx86@chipx86.com>
parents:
6924
diff
changeset
|
324 *((char **)copy_args[i]) = |
3ec6aac0ff67
[gaim-migrate @ 7472]
Christian Hammond <chipx86@chipx86.com>
parents:
6924
diff
changeset
|
325 g_strdup(SvPV(sv_args[i], na)); |
3ec6aac0ff67
[gaim-migrate @ 7472]
Christian Hammond <chipx86@chipx86.com>
parents:
6924
diff
changeset
|
326 } |
6921
11d05ddf30a3
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
327 break; |
11d05ddf30a3
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
328 |
11d05ddf30a3
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
329 case GAIM_TYPE_POINTER: |
11d05ddf30a3
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
330 *((void **)copy_args[i]) = (void *)SvIV(sv_args[i]); |
11d05ddf30a3
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
331 break; |
11d05ddf30a3
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
332 |
11d05ddf30a3
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
333 case GAIM_TYPE_BOXED: |
11d05ddf30a3
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
334 *((void **)copy_args[i]) = (void *)SvIV(sv_args[i]); |
11d05ddf30a3
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
335 break; |
11d05ddf30a3
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
336 |
11d05ddf30a3
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
337 default: |
11d05ddf30a3
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
338 break; |
11d05ddf30a3
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
339 } |
11d05ddf30a3
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
340 |
11d05ddf30a3
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
341 #if 0 |
6920
13f78c350cd3
[gaim-migrate @ 7467]
Christian Hammond <chipx86@chipx86.com>
parents:
6919
diff
changeset
|
342 *((void **)copy_args[i]) = gaim_perl_data_from_sv(values[i], |
13f78c350cd3
[gaim-migrate @ 7467]
Christian Hammond <chipx86@chipx86.com>
parents:
6919
diff
changeset
|
343 sv_args[i]); |
6921
11d05ddf30a3
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
344 #endif |
6919
1aa771990188
[gaim-migrate @ 7466]
Christian Hammond <chipx86@chipx86.com>
parents:
6568
diff
changeset
|
345 } |
1aa771990188
[gaim-migrate @ 7466]
Christian Hammond <chipx86@chipx86.com>
parents:
6568
diff
changeset
|
346 } |
1aa771990188
[gaim-migrate @ 7466]
Christian Hammond <chipx86@chipx86.com>
parents:
6568
diff
changeset
|
347 |
6921
11d05ddf30a3
[gaim-migrate @ 7468]
Christian Hammond <chipx86@chipx86.com>
parents:
6920
diff
changeset
|
348 PUTBACK; |
6549
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
349 FREETMPS; |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
350 LEAVE; |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
351 |
6919
1aa771990188
[gaim-migrate @ 7466]
Christian Hammond <chipx86@chipx86.com>
parents:
6568
diff
changeset
|
352 g_free(sv_args); |
6920
13f78c350cd3
[gaim-migrate @ 7467]
Christian Hammond <chipx86@chipx86.com>
parents:
6919
diff
changeset
|
353 g_free(copy_args); |
6919
1aa771990188
[gaim-migrate @ 7466]
Christian Hammond <chipx86@chipx86.com>
parents:
6568
diff
changeset
|
354 |
1aa771990188
[gaim-migrate @ 7466]
Christian Hammond <chipx86@chipx86.com>
parents:
6568
diff
changeset
|
355 gaim_debug_misc("perl", "ret_val = %p\n", ret_val); |
1aa771990188
[gaim-migrate @ 7466]
Christian Hammond <chipx86@chipx86.com>
parents:
6568
diff
changeset
|
356 |
6549
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
357 return ret_val; |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
358 } |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
359 |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
360 static GaimPerlSignalHandler * |
6567
6e25e1e08ffb
[gaim-migrate @ 7089]
Christian Hammond <chipx86@chipx86.com>
parents:
6566
diff
changeset
|
361 find_signal_handler(GaimPlugin *plugin, void *instance, const char *signal) |
6549
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
362 { |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
363 GaimPerlSignalHandler *handler; |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
364 GList *l; |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
365 |
12803
050b29b7232a
[gaim-migrate @ 15150]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12165
diff
changeset
|
366 for (l = signal_handlers; l != NULL; l = l->next) { |
6549
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
367 handler = (GaimPerlSignalHandler *)l->data; |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
368 |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
369 if (handler->plugin == plugin && |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
370 handler->instance == instance && |
12803
050b29b7232a
[gaim-migrate @ 15150]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12165
diff
changeset
|
371 !strcmp(handler->signal, signal)) { |
6549
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
372 return handler; |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
373 } |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
374 } |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
375 |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
376 return NULL; |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
377 } |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
378 |
6520 | 379 void |
6568
33486b749aa9
[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
050b29b7232a
[gaim-migrate @ 15150]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12165
diff
changeset
|
384 if (plugin == NULL) { |
6549
ed796f756237
[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
33486b749aa9
[gaim-migrate @ 7090]
Christian Hammond <chipx86@chipx86.com>
parents:
6567
diff
changeset
|
391 handler->plugin = plugin; |
33486b749aa9
[gaim-migrate @ 7090]
Christian Hammond <chipx86@chipx86.com>
parents:
6567
diff
changeset
|
392 handler->callback = (callback != NULL && callback != &PL_sv_undef |
13017
7fdd1c0c585c
[gaim-migrate @ 15370]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12988
diff
changeset
|
393 ? newSVsv(callback) : NULL); |
6568
33486b749aa9
[gaim-migrate @ 7090]
Christian Hammond <chipx86@chipx86.com>
parents:
6567
diff
changeset
|
394 handler->data = (data != NULL && data != &PL_sv_undef |
13017
7fdd1c0c585c
[gaim-migrate @ 15370]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12988
diff
changeset
|
395 ? newSVsv(data) : NULL); |
6520 | 396 |
397 timeout_handlers = g_list_append(timeout_handlers, handler); | |
6568
33486b749aa9
[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
050b29b7232a
[gaim-migrate @ 15150]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12165
diff
changeset
|
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
ed796f756237
[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
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
425 void |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
426 gaim_perl_signal_connect(GaimPlugin *plugin, void *instance, |
13190
60b863ecd89b
[gaim-migrate @ 15553]
Etan Reisner <pidgin@unreliablesource.net>
parents:
13017
diff
changeset
|
427 const char *signal, SV *callback, SV *data, |
60b863ecd89b
[gaim-migrate @ 15553]
Etan Reisner <pidgin@unreliablesource.net>
parents:
13017
diff
changeset
|
428 int priority) |
6549
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
429 { |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
430 GaimPerlSignalHandler *handler; |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
431 |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
432 handler = g_new0(GaimPerlSignalHandler, 1); |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
433 handler->plugin = plugin; |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
434 handler->instance = instance; |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
435 handler->signal = g_strdup(signal); |
12803
050b29b7232a
[gaim-migrate @ 15150]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12165
diff
changeset
|
436 handler->callback = (callback != NULL && |
050b29b7232a
[gaim-migrate @ 15150]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12165
diff
changeset
|
437 callback != &PL_sv_undef ? newSVsv(callback) |
050b29b7232a
[gaim-migrate @ 15150]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12165
diff
changeset
|
438 : NULL); |
050b29b7232a
[gaim-migrate @ 15150]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12165
diff
changeset
|
439 handler->data = (data != NULL && |
050b29b7232a
[gaim-migrate @ 15150]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12165
diff
changeset
|
440 data != &PL_sv_undef ? newSVsv(data) : NULL); |
6549
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
441 |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
442 signal_handlers = g_list_append(signal_handlers, handler); |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
443 |
13190
60b863ecd89b
[gaim-migrate @ 15553]
Etan Reisner <pidgin@unreliablesource.net>
parents:
13017
diff
changeset
|
444 gaim_signal_connect_priority_vargs(instance, signal, plugin, |
60b863ecd89b
[gaim-migrate @ 15553]
Etan Reisner <pidgin@unreliablesource.net>
parents:
13017
diff
changeset
|
445 GAIM_CALLBACK(perl_signal_cb), |
60b863ecd89b
[gaim-migrate @ 15553]
Etan Reisner <pidgin@unreliablesource.net>
parents:
13017
diff
changeset
|
446 handler, priority); |
6549
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
447 } |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
448 |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
449 void |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
450 gaim_perl_signal_disconnect(GaimPlugin *plugin, void *instance, |
12803
050b29b7232a
[gaim-migrate @ 15150]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12165
diff
changeset
|
451 const char *signal) |
6549
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
452 { |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
453 GaimPerlSignalHandler *handler; |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
454 |
6567
6e25e1e08ffb
[gaim-migrate @ 7089]
Christian Hammond <chipx86@chipx86.com>
parents:
6566
diff
changeset
|
455 handler = find_signal_handler(plugin, instance, signal); |
6549
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
456 |
12803
050b29b7232a
[gaim-migrate @ 15150]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12165
diff
changeset
|
457 if (handler == NULL) { |
6549
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
458 croak("Invalid signal handler information in " |
12803
050b29b7232a
[gaim-migrate @ 15150]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12165
diff
changeset
|
459 "disconnecting a perl signal handler.\n"); |
6549
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
460 return; |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
461 } |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
462 |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
463 destroy_signal_handler(handler); |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
464 } |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
465 |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
466 void |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
467 gaim_perl_signal_clear_for_plugin(GaimPlugin *plugin) |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
468 { |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
469 GaimPerlSignalHandler *handler; |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
470 GList *l, *l_next; |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
471 |
12803
050b29b7232a
[gaim-migrate @ 15150]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12165
diff
changeset
|
472 for (l = signal_handlers; l != NULL; l = l_next) { |
6549
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
473 l_next = l->next; |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
474 |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
475 handler = (GaimPerlSignalHandler *)l->data; |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
476 |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
477 if (handler->plugin == plugin) |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
478 destroy_signal_handler(handler); |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
479 } |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
480 } |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
481 |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
482 void |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
483 gaim_perl_signal_clear(void) |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
484 { |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
485 while (signal_handlers != NULL) |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
486 destroy_signal_handler(signal_handlers->data); |
ed796f756237
[gaim-migrate @ 7071]
Christian Hammond <chipx86@chipx86.com>
parents:
6520
diff
changeset
|
487 } |
12882
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
488 |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
489 static GaimCmdRet |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
490 perl_cmd_cb(GaimConversation *conv, const gchar *command, |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
491 gchar **args, gchar **error, void *data) |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
492 { |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
493 int i = 0, count, ret_value = GAIM_CMD_RET_OK; |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
494 SV *cmdSV, *tmpSV, *convSV; |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
495 GaimPerlCmdHandler *handler = (GaimPerlCmdHandler *)data; |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
496 |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
497 dSP; |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
498 ENTER; |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
499 SAVETMPS; |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
500 PUSHMARK(SP); |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
501 |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
502 /* Push the conversation onto the perl stack */ |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
503 convSV = sv_2mortal(gaim_perl_bless_object(conv, "Gaim::Conversation")); |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
504 XPUSHs(convSV); |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
505 |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
506 /* Push the command string onto the perl stack */ |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
507 cmdSV = newSVpv(command, 0); |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
508 cmdSV = sv_2mortal(cmdSV); |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
509 XPUSHs(cmdSV); |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
510 |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
511 /* Push the data onto the perl stack */ |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
512 XPUSHs((SV *)handler->data); |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
513 |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
514 /* Push any arguments we may have */ |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
515 for (i = 0; args[i] != NULL; i++) { |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
516 /* XXX The mortality of these created SV's should prevent |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
517 * memory issues, if I read/understood everything correctly... |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
518 */ |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
519 tmpSV = newSVpv(args[i], 0); |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
520 tmpSV = sv_2mortal(tmpSV); |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
521 XPUSHs(tmpSV); |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
522 } |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
523 |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
524 PUTBACK; |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
525 count = call_sv(handler->callback, G_EVAL|G_SCALAR); |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
526 |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
527 if (count != 1) |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
528 croak("call_sv: Did not return the correct number of values.\n"); |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
529 |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
530 SPAGAIN; |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
531 |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
532 ret_value = POPi; |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
533 |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
534 PUTBACK; |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
535 FREETMPS; |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
536 LEAVE; |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
537 |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
538 return ret_value; |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
539 } |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
540 |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
541 GaimCmdId |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
542 gaim_perl_cmd_register(GaimPlugin *plugin, const gchar *command, |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
543 const gchar *args, GaimCmdPriority priority, |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
544 GaimCmdFlag flag, const gchar *prpl_id, SV *callback, |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
545 const gchar *helpstr, SV *data) |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
546 { |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
547 GaimPerlCmdHandler *handler; |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
548 |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
549 handler = g_new0(GaimPerlCmdHandler, 1); |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
550 handler->plugin = plugin; |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
551 handler->cmd = g_strdup(command); |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
552 handler->prpl_id = g_strdup(prpl_id); |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
553 |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
554 if (callback != NULL && callback != &PL_sv_undef) |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
555 handler->callback = newSVsv(callback); |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
556 else |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
557 handler->callback = NULL; |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
558 |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
559 if (data != NULL && data != &PL_sv_undef) |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
560 handler->data = newSVsv(data); |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
561 else |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
562 handler->data = NULL; |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
563 |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
564 cmd_handlers = g_list_append(cmd_handlers, handler); |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
565 |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
566 handler->id = gaim_cmd_register(command, args, priority, flag, prpl_id, |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
567 GAIM_CMD_FUNC(perl_cmd_cb), helpstr, |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
568 handler); |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
569 |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
570 return handler->id; |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
571 } |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
572 |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
573 static void |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
574 destroy_cmd_handler(GaimPerlCmdHandler *handler) |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
575 { |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
576 cmd_handlers = g_list_remove(cmd_handlers, handler); |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
577 |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
578 if (handler->callback != NULL) |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
579 SvREFCNT_dec(handler->callback); |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
580 |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
581 if (handler->data != NULL) |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
582 SvREFCNT_dec(handler->data); |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
583 |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
584 g_free(handler->cmd); |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
585 g_free(handler->prpl_id); |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
586 g_free(handler); |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
587 } |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
588 |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
589 void |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
590 gaim_perl_cmd_clear_for_plugin(GaimPlugin *plugin) |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
591 { |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
592 GList *l, *l_next; |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
593 |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
594 for (l = cmd_handlers; l != NULL; l = l_next) { |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
595 GaimPerlCmdHandler *handler = (GaimPerlCmdHandler *)l->data; |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
596 |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
597 l_next = l->next; |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
598 |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
599 if (handler->plugin == plugin) |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
600 destroy_cmd_handler(handler); |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
601 } |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
602 } |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
603 |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
604 static GaimPerlCmdHandler * |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
605 find_cmd_handler(GaimCmdId id) |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
606 { |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
607 GList *l; |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
608 |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
609 for (l = cmd_handlers; l != NULL; l = l->next) { |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
610 GaimPerlCmdHandler *handler = (GaimPerlCmdHandler *)l->data; |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
611 |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
612 if (handler->id == id) |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
613 return handler; |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
614 } |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
615 |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
616 return NULL; |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
617 } |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
618 |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
619 void |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
620 gaim_perl_cmd_unregister(GaimCmdId id) |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
621 { |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
622 GaimPerlCmdHandler *handler; |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
623 |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
624 handler = find_cmd_handler(id); |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
625 |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
626 if (handler == NULL) { |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
627 croak("Invalid command id in removing a perl command handler.\n"); |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
628 return; |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
629 } |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
630 |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
631 gaim_cmd_unregister(id); |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
632 destroy_cmd_handler(handler); |
e1603fd610fa
[gaim-migrate @ 15234]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12874
diff
changeset
|
633 } |