Mercurial > pidgin
annotate plugins/perl/perl-handlers.c @ 13875:eb20e674ccf2
[gaim-migrate @ 16349]
Three changes:
1. When you try to sign on with an oscar screen name that
is not valid ("123abc" for example), the PRPL will set
gc->wants_to_die to TRUE so that the account will not
be auto-reconnected.
2. When we get an AIM userinfo packet about someone in
our buddy list, if the person has some kind of screen
name formatting set ("Mark Doliner" instead of
"markdoliner") then we set the buddies server_nick to
that formatted name.
3. Add a "Get AIM Info" to the context menu for ICQ
buddies who are in the buddy list of an ICQ user.
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Mon, 26 Jun 2006 09:03:54 +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 } |