source: perlglue.xs @ ba4d1ad

Last change on this file since ba4d1ad was 923c3f6, checked in by Alex Dehnert <adehnert@mit.edu>, 13 years ago
Export zephyr_zcrypt function to Perl The currently available infrastructure doesn't appear to allow sending multi-line zcrypted zephyrs from Perl (or at least not reasonably).
  • Property mode set to 100644
File size: 10.5 KB
Line 
1/* -*- mode: c; indent-tabs-mode: t; c-basic-offset: 8 -*- */
2#define OWL_PERL
3#include "owl.h"
4
5#define SV_IS_CODEREF(sv) (SvROK((sv)) && SvTYPE(SvRV((sv))) == SVt_PVCV)
6
7typedef char utf8;
8
9        /*************************************************************
10         * NOTE
11         *************************************************************
12         * These functions, when they are intended to be user-visible,
13         * are documented in perl/lib/BarnOwl.pm. If you add functions
14         * to this file, add the appropriate documentation there!
15         *
16         * If the function is simple enough, we simply define its
17         * entire functionality here in XS. If, however, it needs
18         * complex argument processing or something, we define a
19         * simple version here that takes arguments in as flat a
20         * manner as possible, to simplify the XS code, put it in
21         * BarnOwl::Internal::, and write a perl wrapper in BarnOwl.pm
22         * that munges the arguments as appropriate and calls the
23         * internal version.
24         */
25
26MODULE = BarnOwl                PACKAGE = BarnOwl
27
28const utf8 *
29command(cmd, ...)
30        const char *cmd
31        PREINIT:
32                char *rv = NULL;
33                const char **argv;
34                int i;
35        CODE:
36        {
37                if (items == 1) {
38                        rv = owl_function_command(cmd);
39                } else {
40                        /* Ensure this is NULL-terminated. */
41                        argv = g_new0(const char *, items + 1);
42                        argv[0] = cmd;
43                        for(i = 1; i < items; i++) {
44                                argv[i] = SvPV_nolen(ST(i));
45                        }
46                        rv = owl_function_command_argv(argv, items);
47                        g_free(argv);
48                }
49                RETVAL = rv;
50        }
51        OUTPUT:
52                RETVAL
53        CLEANUP:
54                g_free(rv);
55
56SV *
57getcurmsg()
58        CODE:
59                RETVAL = owl_perlconfig_curmessage2hashref();
60        OUTPUT:
61                RETVAL
62
63int
64getnumcols()
65        CODE:
66                RETVAL = owl_global_get_cols(&g);
67        OUTPUT:
68                RETVAL
69               
70time_t
71getidletime()
72        CODE:
73                RETVAL = owl_global_get_idletime(&g);
74        OUTPUT:
75                RETVAL
76
77const utf8 *
78zephyr_getrealm()
79        CODE:
80                RETVAL = owl_zephyr_get_realm();
81        OUTPUT:
82                RETVAL
83
84const utf8 *
85zephyr_getsender()
86        CODE:
87                RETVAL = owl_zephyr_get_sender();
88        OUTPUT:
89                RETVAL
90
91void
92zephyr_zwrite(cmd,msg)
93        const char *cmd
94        const char *msg
95        PREINIT:
96                int i;
97        CODE:
98                i = owl_zwrite_create_and_send_from_line(cmd, msg);
99
100int
101zephyr_zcrypt(cmd,msg)
102        const char *cmd
103        const char *msg
104        PREINIT:
105                owl_zwrite z;
106                int rv;
107        CODE:
108                rv=owl_zwrite_create_from_line(&z, cmd);
109                if (rv) {
110                } else {
111                        owl_function_zcrypt(&z, msg);
112                }
113                RETVAL = rv;
114        OUTPUT:
115                RETVAL
116
117const utf8 *
118ztext_stylestrip(ztext)
119        const char *ztext
120        PREINIT:
121                char *rv = NULL;
122        CODE:
123                rv = owl_function_ztext_stylestrip(ztext);
124                RETVAL = rv;
125        OUTPUT:
126                RETVAL
127        CLEANUP:
128                g_free(rv);
129
130const utf8 *
131zephyr_smartstrip_user(in)
132        const char *in
133        PREINIT:
134                char *rv = NULL;
135        CODE:
136        {
137                rv = owl_zephyr_smartstripped_user(in);
138                RETVAL = rv;
139        }
140        OUTPUT:
141                RETVAL
142        CLEANUP:
143                g_free(rv);
144
145const utf8 *
146zephyr_getsubs()
147        PREINIT:
148                char *rv = NULL;
149        CODE:
150                rv = owl_zephyr_getsubs();
151                RETVAL = rv;
152    OUTPUT:
153                RETVAL
154    CLEANUP:
155                g_free(rv);
156
157SV *
158queue_message(msg)
159        SV *msg
160        PREINIT:
161                owl_message *m;
162        CODE:
163        {
164                if(!SvROK(msg) || SvTYPE(SvRV(msg)) != SVt_PVHV) {
165                        croak("Usage: BarnOwl::queue_message($message)");
166                }
167
168                m = owl_perlconfig_hashref2message(msg);
169
170                owl_global_messagequeue_addmsg(&g, m);
171
172                RETVAL = owl_perlconfig_message2hashref(m);
173        }
174        OUTPUT:
175                RETVAL
176
177void
178admin_message(header, body)
179        const char *header
180        const char *body
181        CODE:
182        {
183                owl_function_adminmsg(header, body);           
184        }
185
186
187const char * 
188get_data_dir ()
189        CODE:
190                RETVAL = owl_get_datadir();
191        OUTPUT:
192        RETVAL
193
194const char * 
195get_config_dir ()
196        CODE:
197                RETVAL = owl_global_get_confdir(&g);
198        OUTPUT:
199        RETVAL 
200
201void
202popless_text(text) 
203        const char *text
204        CODE:
205        {
206                owl_function_popless_text(text);
207        }
208
209void
210popless_ztext(text) 
211        const char *text
212        CODE:
213        {
214                owl_fmtext fm;
215                owl_fmtext_init_null(&fm);
216                owl_fmtext_append_ztext(&fm, text);
217                owl_function_popless_fmtext(&fm);
218                owl_fmtext_cleanup(&fm);
219        }
220
221void
222error(text) 
223        const char *text
224        CODE:
225        {
226                owl_function_error("%s", text);
227        }
228
229void
230debug(text)
231        const char *text
232        CODE:
233        {
234                owl_function_debugmsg("%s", text);
235        }
236
237void
238message(text)
239        const char *text
240        CODE:
241        {
242                owl_function_makemsg("%s", text);
243        }
244
245void
246create_style(name, object)
247     const char *name
248     SV  *object
249     PREINIT:
250                owl_style *s;
251     CODE:
252        {
253                s = g_new(owl_style, 1);
254                owl_style_create_perl(s, name, newSVsv(object));
255                owl_global_add_style(&g, s);
256        }
257
258int
259getnumcolors()
260        CODE:
261                RETVAL = owl_function_get_color_count();
262        OUTPUT:
263                RETVAL
264
265void
266_remove_filter(filterName)
267        const char *filterName
268        CODE:
269        {
270                /* Don't delete the current view, or the 'all' filter */
271                if (strcmp(filterName, owl_view_get_filtname(owl_global_get_current_view(&g)))
272                    && strcmp(filterName, "all")) {
273                        owl_global_remove_filter(&g,filterName);
274                }
275        }
276
277const utf8 *
278wordwrap(in, cols)
279        const char *in
280        int cols
281        PREINIT:
282                char *rv = NULL;
283        CODE:
284                rv = owl_text_wordwrap(in, cols);
285                RETVAL = rv;   
286        OUTPUT:
287                RETVAL
288        CLEANUP:
289                g_free(rv);
290
291AV*
292all_filters()
293        PREINIT:
294                GPtrArray *fl;
295        CODE:
296        {
297                fl = owl_dict_get_keys(&g.filters);
298                RETVAL = owl_new_av(fl, (SV*(*)(const void*))owl_new_sv);
299                sv_2mortal((SV*)RETVAL);
300                owl_ptr_array_free(fl, g_free);
301        }
302        OUTPUT:
303                RETVAL
304
305AV*
306all_styles()
307        PREINIT:
308                GPtrArray *l;
309        CODE:
310        {
311                l = owl_global_get_style_names(&g);
312                RETVAL = owl_new_av(l, (SV*(*)(const void*))owl_new_sv);
313                sv_2mortal((SV*)RETVAL);
314        }
315        OUTPUT:
316                RETVAL
317        CLEANUP:
318                owl_ptr_array_free(l, g_free);
319
320
321AV*
322all_variables()
323        PREINIT:
324                GPtrArray *l;
325        CODE:
326        {
327                l = owl_dict_get_keys(owl_global_get_vardict(&g));
328                RETVAL = owl_new_av(l, (SV*(*)(const void*))owl_new_sv);
329                sv_2mortal((SV*)RETVAL);
330        }
331        OUTPUT:
332                RETVAL
333        CLEANUP:
334                owl_ptr_array_free(l, g_free);
335
336
337AV*
338all_keymaps()
339        PREINIT:
340                GPtrArray *l;
341                const owl_keyhandler *kh;
342        CODE:
343        {
344                kh = owl_global_get_keyhandler(&g);
345                l = owl_keyhandler_get_keymap_names(kh);
346                RETVAL = owl_new_av(l, (SV*(*)(const void*))owl_new_sv);
347                sv_2mortal((SV*)RETVAL);
348        }
349        OUTPUT:
350                RETVAL
351        CLEANUP:
352                owl_ptr_array_free(l, g_free);
353
354void
355redisplay()
356        CODE:
357        {
358                owl_messagelist_invalidate_formats(owl_global_get_msglist(&g));
359                owl_function_calculate_topmsg(OWL_DIRECTION_DOWNWARDS);
360                owl_mainwin_redisplay(owl_global_get_mainwin(&g));
361        }
362
363const char *
364get_zephyr_variable(name)
365        const char *name;
366        CODE:
367                RETVAL = owl_zephyr_get_variable(name);
368        OUTPUT:
369                RETVAL
370
371const utf8 *
372skiptokens(str, n)
373        const char *str;
374        int n;
375        CODE:
376                RETVAL = skiptokens(str, n);
377        OUTPUT:
378                RETVAL
379
380
381MODULE = BarnOwl                PACKAGE = BarnOwl::Zephyr
382
383int
384have_zephyr()
385        CODE:
386                RETVAL = owl_global_is_havezephyr(&g);
387        OUTPUT:
388                RETVAL
389
390MODULE = BarnOwl                PACKAGE = BarnOwl::Internal
391
392
393void
394new_command(name, func, summary, usage, description)
395        char *name
396        SV *func
397        char *summary
398        char *usage
399        char *description
400        PREINIT:
401                owl_cmd cmd;
402        CODE:
403        {
404                if(!SV_IS_CODEREF(func)) {
405                        croak("Command function must be a coderef!");
406                }
407                cmd.name = name;
408                cmd.cmd_perl = newSVsv(func);
409                cmd.summary = summary;
410                cmd.usage = usage;
411                cmd.description = description;
412                cmd.validctx = OWL_CTX_ANY;
413                cmd.cmd_aliased_to = NULL;
414                cmd.cmd_args_fn = NULL;
415                cmd.cmd_v_fn = NULL;
416                cmd.cmd_i_fn = NULL;
417                cmd.cmd_ctxargs_fn = NULL;
418                cmd.cmd_ctxv_fn = NULL;
419                cmd.cmd_ctxi_fn = NULL;
420                owl_cmddict_add_cmd(owl_global_get_cmddict(&g), &cmd);
421           }
422
423void
424new_variable_string(name, ival, summ, desc)
425        const char * name
426        const char * ival
427        const char * summ
428        const char * desc
429        CODE:
430        owl_variable_dict_newvar_string(owl_global_get_vardict(&g),
431                                        name,
432                                        summ,
433                                        desc,
434                                        ival);
435
436void
437new_variable_int(name, ival, summ, desc)
438        const char * name
439        int ival
440        const char * summ
441        const char * desc
442        CODE:
443        owl_variable_dict_newvar_int(owl_global_get_vardict(&g),
444                                     name,
445                                     summ,
446                                     desc,
447                                     ival);
448
449void
450new_variable_bool(name, ival, summ, desc)
451        const char * name
452        int ival
453        const char * summ
454        const char * desc
455        CODE:
456        owl_variable_dict_newvar_bool(owl_global_get_vardict(&g),
457                                      name,
458                                      summ,
459                                      desc,
460                                      ival);
461
462void
463start_edit(edit_type, line, callback)
464        const char *edit_type
465        const char *line
466        SV *callback
467        PREINIT:
468                owl_editwin *e;
469        CODE:
470        {
471                if (!SV_IS_CODEREF(callback))
472                        croak("Callback must be a subref");
473
474                if (!strcmp(edit_type, "question"))
475                        e = owl_function_start_question(line);
476                else if (!strcmp(edit_type, "password"))
477                        e = owl_function_start_password(line);
478                else if (!strcmp(edit_type, "edit_win"))
479                        e = owl_function_start_edit_win(line);
480                else
481                        croak("edit_type must be one of 'password', 'question', 'edit_win', not '%s'", edit_type);
482
483                owl_editwin_set_cbdata(e, newSVsv(callback), owl_perlconfig_dec_refcnt);
484                owl_editwin_set_callback(e, owl_perlconfig_edit_callback);
485        }
486
487MODULE = BarnOwl                PACKAGE = BarnOwl::Editwin
488
489int
490replace(count, string)
491        int count;
492        const char *string;
493        PREINIT:
494                owl_editwin *e;
495        CODE:
496                e = owl_global_current_typwin(&g);
497                if (e) {
498                        RETVAL = owl_editwin_replace(e, count, string);
499                } else {
500                        RETVAL = 0;
501                }
502        OUTPUT:
503                RETVAL
504
505int
506point_move(delta)
507        int delta;
508        PREINIT:
509                owl_editwin *e;
510        CODE:
511                e = owl_global_current_typwin(&g);
512                if (e) {
513                        RETVAL = owl_editwin_point_move(e, delta);
514                } else {
515                        RETVAL = 0;
516                }
517        OUTPUT:
518                RETVAL
519
520int
521replace_region(string)
522        const char *string;
523        PREINIT:
524                owl_editwin *e;
525        CODE:
526                e = owl_global_current_typwin(&g);
527                if (e) {
528                        RETVAL = owl_editwin_replace_region(e, string);
529                } else {
530                        RETVAL = 0;
531                }
532        OUTPUT:
533                RETVAL
534
535const utf8 *
536get_region()
537        PREINIT:
538                char *region;
539                owl_editwin *e;
540        CODE:
541                e = owl_global_current_typwin(&g);
542                if (e) {
543                        region = owl_editwin_get_region(owl_global_current_typwin(&g));
544                } else {
545                        region = NULL;
546                }
547                RETVAL = region;
548        OUTPUT:
549                RETVAL
550        CLEANUP:
551                g_free(region);
552
553SV *
554save_excursion(sub)
555        SV *sub;
556        PROTOTYPE: &
557        PREINIT:
558                int count;
559                owl_editwin *e;
560                owl_editwin_excursion *x;
561        CODE:
562        {
563                e = owl_global_current_typwin(&g);
564                if(!e)
565                        croak("The edit window is not currently active!");
566
567                x = owl_editwin_begin_excursion(owl_global_current_typwin(&g));
568                PUSHMARK(SP);
569                count = call_sv(sub, G_SCALAR|G_EVAL|G_NOARGS);
570                SPAGAIN;
571                owl_editwin_end_excursion(owl_global_current_typwin(&g), x);
572
573                if(SvTRUE(ERRSV)) {
574                        croak(NULL);
575                }
576
577                if(count == 1)
578                        RETVAL = SvREFCNT_inc(POPs);
579                else
580                        XSRETURN_UNDEF;
581
582        }
583        OUTPUT:
584                RETVAL
585
586int
587current_column()
588        PREINIT:
589                owl_editwin *e;
590        CODE:
591                e = owl_global_current_typwin(&g);
592                if (e) {
593                        RETVAL = owl_editwin_current_column(e);
594                } else {
595                        RETVAL = 0;
596                }
597        OUTPUT:
598                RETVAL
599
600int
601point()
602        PREINIT:
603                owl_editwin *e;
604        CODE:
605                e = owl_global_current_typwin(&g);
606                if (e) {
607                        RETVAL = owl_editwin_get_point(e);
608                } else {
609                        RETVAL = 0;
610                }
611        OUTPUT:
612                RETVAL
613
614int
615mark()
616        PREINIT:
617                owl_editwin *e;
618        CODE:
619                e = owl_global_current_typwin(&g);
620                if (e) {
621                        RETVAL = owl_editwin_get_mark(e);
622                } else {
623                        RETVAL = 0;
624                }
625        OUTPUT:
626                RETVAL
Note: See TracBrowser for help on using the repository browser.