Mercurial > pidgin
comparison libpurple/plugins/perl/common/Request.xs @ 22696:3a41eb457605
Use the same fix for Purple::Util::fetch_url (from 4b6378d5e) for
Purple::Request:: functions as well. This allows the callbacks to be
specified both as coderefs or as strings (name of the callback function).
author | Sadrul Habib Chowdhury <imadil@gmail.com> |
---|---|
date | Wed, 23 Apr 2008 02:29:39 +0000 |
parents | dccfd999ffe7 |
children | e3f30a73a793 |
comparison
equal
deleted
inserted
replaced
22695:01b5c9ed85e7 | 22696:3a41eb457605 |
---|---|
13 va_list actions | 13 va_list actions |
14 */ | 14 */ |
15 | 15 |
16 | 16 |
17 typedef struct { | 17 typedef struct { |
18 char *cancel_cb; | 18 SV *ok_fun; |
19 char *ok_cb; | 19 SV *cancel_fun; |
20 } PurplePerlRequestData; | 20 } PurplePerlRequestData; |
21 | |
22 static void | |
23 purple_perl_request_data_free(PurplePerlRequestData *ppr) | |
24 { | |
25 if (ppr->ok_fun) | |
26 SvREFCNT_dec(ppr->ok_fun); | |
27 if (ppr->cancel_fun) | |
28 SvREFCNT_dec(ppr->cancel_fun); | |
29 g_free(ppr); | |
30 } | |
21 | 31 |
22 /********************************************************/ | 32 /********************************************************/ |
23 /* */ | 33 /* */ |
24 /* Callback function that calls a perl subroutine */ | 34 /* Callback function that calls a perl subroutine */ |
25 /* */ | 35 /* */ |
37 SAVETMPS; | 47 SAVETMPS; |
38 PUSHMARK(sp); | 48 PUSHMARK(sp); |
39 | 49 |
40 XPUSHs(purple_perl_bless_object(fields, "Purple::Request::Fields")); | 50 XPUSHs(purple_perl_bless_object(fields, "Purple::Request::Fields")); |
41 PUTBACK; | 51 PUTBACK; |
42 | 52 call_sv(gpr->ok_fun, G_EVAL | G_SCALAR); |
43 call_pv(gpr->ok_cb, G_EVAL | G_SCALAR); | |
44 SPAGAIN; | 53 SPAGAIN; |
45 | 54 |
46 PUTBACK; | 55 PUTBACK; |
47 FREETMPS; | 56 FREETMPS; |
48 LEAVE; | 57 LEAVE; |
49 | 58 |
50 g_free(gpr->ok_cb); | 59 purple_perl_request_data_free(gpr); |
51 g_free(gpr->cancel_cb); | |
52 g_free(gpr); | |
53 } | 60 } |
54 | 61 |
55 static void | 62 static void |
56 purple_perl_request_cancel_cb(void * data, PurpleRequestFields *fields) | 63 purple_perl_request_cancel_cb(void * data, PurpleRequestFields *fields) |
57 { | 64 { |
58 | |
59 PurplePerlRequestData *gpr = (PurplePerlRequestData *)data; | 65 PurplePerlRequestData *gpr = (PurplePerlRequestData *)data; |
60 | 66 |
61 dSP; | 67 dSP; |
62 ENTER; | 68 ENTER; |
63 SAVETMPS; | 69 SAVETMPS; |
64 PUSHMARK(sp); | 70 PUSHMARK(sp); |
65 | 71 |
66 XPUSHs(purple_perl_bless_object(fields, "Purple::Request::Fields")); | 72 XPUSHs(purple_perl_bless_object(fields, "Purple::Request::Fields")); |
67 PUTBACK; | 73 PUTBACK; |
68 call_pv(gpr->cancel_cb, G_EVAL | G_SCALAR); | 74 call_sv(gpr->cancel_fun, G_EVAL | G_SCALAR); |
69 SPAGAIN; | 75 SPAGAIN; |
70 | 76 |
71 PUTBACK; | 77 PUTBACK; |
72 FREETMPS; | 78 FREETMPS; |
73 LEAVE; | 79 LEAVE; |
74 | 80 |
75 g_free(gpr->ok_cb); | 81 purple_perl_request_data_free(gpr); |
76 g_free(gpr->cancel_cb); | |
77 g_free(gpr); | |
78 } | 82 } |
79 | 83 |
80 MODULE = Purple::Request PACKAGE = Purple::Request PREFIX = purple_request_ | 84 MODULE = Purple::Request PACKAGE = Purple::Request PREFIX = purple_request_ |
81 PROTOTYPES: ENABLE | 85 PROTOTYPES: ENABLE |
82 | 86 |
129 SV * ok_cb | 133 SV * ok_cb |
130 const char * cancel_text | 134 const char * cancel_text |
131 SV * cancel_cb | 135 SV * cancel_cb |
132 CODE: | 136 CODE: |
133 PurplePerlRequestData *gpr; | 137 PurplePerlRequestData *gpr; |
134 STRLEN len; | |
135 char *basename; | 138 char *basename; |
136 | 139 |
137 basename = g_path_get_basename(handle->path); | 140 basename = g_path_get_basename(handle->path); |
138 purple_perl_normalize_script_name(basename); | 141 purple_perl_normalize_script_name(basename); |
139 gpr = g_new(PurplePerlRequestData, 1); | 142 gpr = g_new(PurplePerlRequestData, 1); |
140 gpr->ok_cb = g_strdup_printf("Purple::Script::%s::%s", basename, SvPV(ok_cb, len)); | 143 gpr->ok_fun = purple_perl_sv_from_fun(handle, ok_cb); |
141 gpr->cancel_cb = g_strdup_printf("Purple::Script::%s::%s", basename, SvPV(cancel_cb, len)); | 144 gpr->cancel_fun = purple_perl_sv_from_fun(handle, cancel_cb); |
142 g_free(basename); | 145 g_free(basename); |
143 | 146 |
144 RETVAL = purple_request_input(handle, title, primary, secondary, default_value, multiline, masked, hint, ok_text, G_CALLBACK(purple_perl_request_ok_cb), cancel_text, G_CALLBACK(purple_perl_request_cancel_cb), NULL, NULL, NULL, gpr); | 147 RETVAL = purple_request_input(handle, title, primary, secondary, default_value, multiline, masked, hint, ok_text, G_CALLBACK(purple_perl_request_ok_cb), cancel_text, G_CALLBACK(purple_perl_request_cancel_cb), NULL, NULL, NULL, gpr); |
145 OUTPUT: | 148 OUTPUT: |
146 RETVAL | 149 RETVAL |
153 gboolean savedialog | 156 gboolean savedialog |
154 SV * ok_cb | 157 SV * ok_cb |
155 SV * cancel_cb | 158 SV * cancel_cb |
156 CODE: | 159 CODE: |
157 PurplePerlRequestData *gpr; | 160 PurplePerlRequestData *gpr; |
158 STRLEN len; | |
159 char *basename; | 161 char *basename; |
160 | 162 |
161 basename = g_path_get_basename(handle->path); | 163 basename = g_path_get_basename(handle->path); |
162 purple_perl_normalize_script_name(basename); | 164 purple_perl_normalize_script_name(basename); |
163 gpr = g_new(PurplePerlRequestData, 1); | 165 gpr = g_new(PurplePerlRequestData, 1); |
164 gpr->ok_cb = g_strdup_printf("Purple::Script::%s::%s", basename, SvPV(ok_cb, len)); | 166 gpr->ok_fun = purple_perl_sv_from_fun(handle, ok_cb); |
165 gpr->cancel_cb = g_strdup_printf("Purple::Script::%s::%s", basename, SvPV(cancel_cb, len)); | 167 gpr->cancel_fun = purple_perl_sv_from_fun(handle, cancel_cb); |
166 g_free(basename); | 168 g_free(basename); |
167 | 169 |
168 RETVAL = purple_request_file(handle, title, filename, savedialog, G_CALLBACK(purple_perl_request_ok_cb), G_CALLBACK(purple_perl_request_cancel_cb), NULL, NULL, NULL, gpr); | 170 RETVAL = purple_request_file(handle, title, filename, savedialog, G_CALLBACK(purple_perl_request_ok_cb), G_CALLBACK(purple_perl_request_cancel_cb), NULL, NULL, NULL, gpr); |
169 OUTPUT: | 171 OUTPUT: |
170 RETVAL | 172 RETVAL |
180 SV * ok_cb | 182 SV * ok_cb |
181 const char * cancel_text | 183 const char * cancel_text |
182 SV * cancel_cb | 184 SV * cancel_cb |
183 CODE: | 185 CODE: |
184 PurplePerlRequestData *gpr; | 186 PurplePerlRequestData *gpr; |
185 STRLEN len; | |
186 char *basename; | 187 char *basename; |
187 | 188 |
188 basename = g_path_get_basename(handle->path); | 189 basename = g_path_get_basename(handle->path); |
189 purple_perl_normalize_script_name(basename); | 190 purple_perl_normalize_script_name(basename); |
190 gpr = g_new(PurplePerlRequestData, 1); | 191 gpr = g_new(PurplePerlRequestData, 1); |
191 gpr->ok_cb = g_strdup_printf("Purple::Script::%s::%s", basename, SvPV(ok_cb, len)); | 192 gpr->ok_fun = purple_perl_sv_from_fun(handle, ok_cb); |
192 gpr->cancel_cb = g_strdup_printf("Purple::Script::%s::%s", basename, SvPV(cancel_cb, len)); | 193 gpr->cancel_fun = purple_perl_sv_from_fun(handle, cancel_cb); |
193 g_free(basename); | 194 g_free(basename); |
194 | 195 |
195 RETVAL = purple_request_fields(handle, title, primary, secondary, fields, ok_text, G_CALLBACK(purple_perl_request_ok_cb), cancel_text, G_CALLBACK(purple_perl_request_cancel_cb), NULL, NULL, NULL, gpr); | 196 RETVAL = purple_request_fields(handle, title, primary, secondary, fields, ok_text, G_CALLBACK(purple_perl_request_ok_cb), cancel_text, G_CALLBACK(purple_perl_request_cancel_cb), NULL, NULL, NULL, gpr); |
196 OUTPUT: | 197 OUTPUT: |
197 RETVAL | 198 RETVAL |