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