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
RevLine 
[dd16bdd]1/* -*- mode: c; indent-tabs-mode: t; c-basic-offset: 8 -*- */
[1152d45]2#define OWL_PERL
3#include "owl.h"
[8ee73f8d]4
[db8b00b]5#define SV_IS_CODEREF(sv) (SvROK((sv)) && SvTYPE(SvRV((sv))) == SVt_PVCV)
6
[39e81f7]7typedef char utf8;
8
[74fc22a]9        /*************************************************************
10         * NOTE
11         *************************************************************
12         * These functions, when they are intended to be user-visible,
[fd8dfe7]13         * are documented in perl/lib/BarnOwl.pm. If you add functions
14         * to this file, add the appropriate documentation there!
[74fc22a]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
[25cccdc]20         * manner as possible, to simplify the XS code, put it in
[952f137]21         * BarnOwl::Internal::, and write a perl wrapper in BarnOwl.pm
[25cccdc]22         * that munges the arguments as appropriate and calls the
23         * internal version.
[74fc22a]24         */
[8ee73f8d]25
[65fea01]26MODULE = BarnOwl                PACKAGE = BarnOwl
27
[39e81f7]28const utf8 *
[c4ba74d]29command(cmd, ...)
[e19eb97]30        const char *cmd
[8ee73f8d]31        PREINIT:
32                char *rv = NULL;
[e19eb97]33                const char **argv;
[c4ba74d]34                int i;
[8ee73f8d]35        CODE:
[c4ba74d]36        {
37                if (items == 1) {
38                        rv = owl_function_command(cmd);
39                } else {
[6a71113]40                        /* Ensure this is NULL-terminated. */
41                        argv = g_new0(const char *, items + 1);
[c4ba74d]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);
[ddbbcffa]47                        g_free(argv);
[c4ba74d]48                }
49                RETVAL = rv;
50        }
[8ee73f8d]51        OUTPUT:
52                RETVAL
53        CLEANUP:
[3b8a563]54                g_free(rv);
[8ee73f8d]55
[f1e629d]56SV *
57getcurmsg()
58        CODE:
[19bab8e]59                RETVAL = owl_perlconfig_curmessage2hashref();
60        OUTPUT:
61                RETVAL
[f1e629d]62
63int
64getnumcols()
65        CODE:
66                RETVAL = owl_global_get_cols(&g);
67        OUTPUT:
68                RETVAL
[7f792c1]69               
70time_t
71getidletime()
72        CODE:
73                RETVAL = owl_global_get_idletime(&g);
74        OUTPUT:
75                RETVAL
[f1e629d]76
[39e81f7]77const utf8 *
[f1e629d]78zephyr_getrealm()
79        CODE:
[8a54409]80                RETVAL = owl_zephyr_get_realm();
[f1e629d]81        OUTPUT:
82                RETVAL
83
[39e81f7]84const utf8 *
[f1e629d]85zephyr_getsender()
86        CODE:
[8a54409]87                RETVAL = owl_zephyr_get_sender();
[f1e629d]88        OUTPUT:
89                RETVAL
90
[e1c4636]91void
[f1e629d]92zephyr_zwrite(cmd,msg)
[e19eb97]93        const char *cmd
94        const char *msg
[e1c4636]95        PREINIT:
96                int i;
97        CODE:
98                i = owl_zwrite_create_and_send_from_line(cmd, msg);
99
[923c3f6]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
[39e81f7]117const utf8 *
[e1c4636]118ztext_stylestrip(ztext)
[e19eb97]119        const char *ztext
[e1c4636]120        PREINIT:
121                char *rv = NULL;
122        CODE:
[1fd0b25]123                rv = owl_function_ztext_stylestrip(ztext);
[e1c4636]124                RETVAL = rv;
125        OUTPUT:
126                RETVAL
127        CLEANUP:
[3b8a563]128                g_free(rv);
[e1c4636]129
[39e81f7]130const utf8 *
[740d5f7]131zephyr_smartstrip_user(in)
[e19eb97]132        const char *in
[740d5f7]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:
[ddbbcffa]143                g_free(rv);
[740d5f7]144
[39e81f7]145const utf8 *
[acb13bb]146zephyr_getsubs()
147        PREINIT:
148                char *rv = NULL;
149        CODE:
150                rv = owl_zephyr_getsubs();
151                RETVAL = rv;
152    OUTPUT:
153                RETVAL
154    CLEANUP:
[3b8a563]155                g_free(rv);
[acb13bb]156
[a130fc5]157SV *
[5791bf7]158queue_message(msg)
[dd16bdd]159        SV *msg
160        PREINIT:
161                owl_message *m;
162        CODE:
[1b6b2f3]163        {
[dd16bdd]164                if(!SvROK(msg) || SvTYPE(SvRV(msg)) != SVt_PVHV) {
[3066d23]165                        croak("Usage: BarnOwl::queue_message($message)");
[dd16bdd]166                }
[17eed9c]167
[30678ae]168                m = owl_perlconfig_hashref2message(msg);
[dd16bdd]169
170                owl_global_messagequeue_addmsg(&g, m);
[a130fc5]171
172                RETVAL = owl_perlconfig_message2hashref(m);
[1b6b2f3]173        }
[a130fc5]174        OUTPUT:
175                RETVAL
[db8b00b]176
[5791bf7]177void
178admin_message(header, body)
[e19eb97]179        const char *header
180        const char *body
[1c2e0b3]181        CODE:
182        {
183                owl_function_adminmsg(header, body);           
184        }
185
[6b3f797]186
[e19eb97]187const char * 
[6b3f797]188get_data_dir ()
189        CODE:
[ba6c8bd]190                RETVAL = owl_get_datadir();
[6b3f797]191        OUTPUT:
192        RETVAL
[b6a253c]193
[e19eb97]194const char * 
[b363d83]195get_config_dir ()
196        CODE:
[ba6c8bd]197                RETVAL = owl_global_get_confdir(&g);
[b363d83]198        OUTPUT:
199        RETVAL 
200
[b6a253c]201void
202popless_text(text) 
[e19eb97]203        const char *text
[b6a253c]204        CODE:
205        {
206                owl_function_popless_text(text);
207        }
208
209void
210popless_ztext(text) 
[e19eb97]211        const char *text
[b6a253c]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);
[7ab0020]218                owl_fmtext_cleanup(&fm);
[b6a253c]219        }
[0ff2528]220
221void
222error(text) 
[e19eb97]223        const char *text
[0ff2528]224        CODE:
225        {
226                owl_function_error("%s", text);
227        }
[b6c067a]228
229void
[eede1bf]230debug(text)
[e19eb97]231        const char *text
[eede1bf]232        CODE:
233        {
234                owl_function_debugmsg("%s", text);
235        }
236
237void
[747d6a5]238message(text)
[e19eb97]239        const char *text
[747d6a5]240        CODE:
241        {
242                owl_function_makemsg("%s", text);
243        }
244
245void
[b67ab6b]246create_style(name, object)
[e19eb97]247     const char *name
[864ed35]248     SV  *object
[b6c067a]249     PREINIT:
250                owl_style *s;
251     CODE:
252        {
[96828e4]253                s = g_new(owl_style, 1);
[fde6d80]254                owl_style_create_perl(s, name, newSVsv(object));
[b6c067a]255                owl_global_add_style(&g, s);
256        }
[c2c5c77]257
258int
259getnumcolors()
260        CODE:
261                RETVAL = owl_function_get_color_count();
262        OUTPUT:
263                RETVAL
264
265void
266_remove_filter(filterName)
[e19eb97]267        const char *filterName
[c2c5c77]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        }
[f6b319c]276
[39e81f7]277const utf8 *
[f6b319c]278wordwrap(in, cols)
[e19eb97]279        const char *in
[f6b319c]280        int cols
281        PREINIT:
282                char *rv = NULL;
283        CODE:
[a695a68]284                rv = owl_text_wordwrap(in, cols);
[f6b319c]285                RETVAL = rv;   
286        OUTPUT:
287                RETVAL
288        CLEANUP:
[3b8a563]289                g_free(rv);
[a695a68]290
[d77e909]291AV*
292all_filters()
293        PREINIT:
[ce68f23]294                GPtrArray *fl;
[d77e909]295        CODE:
296        {
[ce68f23]297                fl = owl_dict_get_keys(&g.filters);
298                RETVAL = owl_new_av(fl, (SV*(*)(const void*))owl_new_sv);
[d77e909]299                sv_2mortal((SV*)RETVAL);
[ce68f23]300                owl_ptr_array_free(fl, g_free);
[d77e909]301        }
302        OUTPUT:
303                RETVAL
304
[3ff3d86]305AV*
306all_styles()
307        PREINIT:
[ce68f23]308                GPtrArray *l;
[3ff3d86]309        CODE:
310        {
[ce68f23]311                l = owl_global_get_style_names(&g);
312                RETVAL = owl_new_av(l, (SV*(*)(const void*))owl_new_sv);
[3ff3d86]313                sv_2mortal((SV*)RETVAL);
314        }
315        OUTPUT:
316                RETVAL
317        CLEANUP:
[ce68f23]318                owl_ptr_array_free(l, g_free);
[3ff3d86]319
320
321AV*
322all_variables()
323        PREINIT:
[ce68f23]324                GPtrArray *l;
[3ff3d86]325        CODE:
326        {
[ce68f23]327                l = owl_dict_get_keys(owl_global_get_vardict(&g));
328                RETVAL = owl_new_av(l, (SV*(*)(const void*))owl_new_sv);
[fe7616e]329                sv_2mortal((SV*)RETVAL);
330        }
331        OUTPUT:
332                RETVAL
333        CLEANUP:
[ce68f23]334                owl_ptr_array_free(l, g_free);
[fe7616e]335
336
337AV*
338all_keymaps()
339        PREINIT:
[ce68f23]340                GPtrArray *l;
[fe7616e]341                const owl_keyhandler *kh;
342        CODE:
343        {
344                kh = owl_global_get_keyhandler(&g);
[ce68f23]345                l = owl_keyhandler_get_keymap_names(kh);
346                RETVAL = owl_new_av(l, (SV*(*)(const void*))owl_new_sv);
[3ff3d86]347                sv_2mortal((SV*)RETVAL);
348        }
349        OUTPUT:
350                RETVAL
351        CLEANUP:
[ce68f23]352                owl_ptr_array_free(l, g_free);
[3ff3d86]353
[4df918b]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
[fbadb37]363const char *
[bb79a52]364get_zephyr_variable(name)
[9cb03bf]365        const char *name;
[bb79a52]366        CODE:
[fbadb37]367                RETVAL = owl_zephyr_get_variable(name);
[bb79a52]368        OUTPUT:
369                RETVAL
370
[39e81f7]371const utf8 *
[9e5b5fd]372skiptokens(str, n)
373        const char *str;
374        int n;
375        CODE:
376                RETVAL = skiptokens(str, n);
377        OUTPUT:
378                RETVAL
379
380
[6f0fbe9]381MODULE = BarnOwl                PACKAGE = BarnOwl::Zephyr
382
383int
384have_zephyr()
385        CODE:
386                RETVAL = owl_global_is_havezephyr(&g);
387        OUTPUT:
388                RETVAL
[9e5b5fd]389
[25cccdc]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;
[2fec14b]408                cmd.cmd_perl = newSVsv(func);
[25cccdc]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)
[e19eb97]425        const char * name
426        const char * ival
427        const char * summ
428        const char * desc
[a695a68]429        CODE:
430        owl_variable_dict_newvar_string(owl_global_get_vardict(&g),
431                                        name,
432                                        summ,
433                                        desc,
434                                        ival);
435
436void
[25cccdc]437new_variable_int(name, ival, summ, desc)
[e19eb97]438        const char * name
[a695a68]439        int ival
[e19eb97]440        const char * summ
441        const char * desc
[a695a68]442        CODE:
443        owl_variable_dict_newvar_int(owl_global_get_vardict(&g),
444                                     name,
445                                     summ,
446                                     desc,
447                                     ival);
448
449void
[25cccdc]450new_variable_bool(name, ival, summ, desc)
[e19eb97]451        const char * name
[a695a68]452        int ival
[e19eb97]453        const char * summ
454        const char * desc
[a695a68]455        CODE:
456        owl_variable_dict_newvar_bool(owl_global_get_vardict(&g),
457                                      name,
458                                      summ,
459                                      desc,
460                                      ival);
[1631825]461
[e89ec48]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
[0190c4d]487MODULE = BarnOwl                PACKAGE = BarnOwl::Editwin
488
[77f605d]489int
490replace(count, string)
491        int count;
[e19eb97]492        const char *string;
[38cc669]493        PREINIT:
494                owl_editwin *e;
[77f605d]495        CODE:
[818f19c]496                e = owl_global_current_typwin(&g);
[38cc669]497                if (e) {
498                        RETVAL = owl_editwin_replace(e, count, string);
499                } else {
500                        RETVAL = 0;
501                }
[77f605d]502        OUTPUT:
503                RETVAL
504
505int
506point_move(delta)
507        int delta;
[38cc669]508        PREINIT:
509                owl_editwin *e;
[77f605d]510        CODE:
[818f19c]511                e = owl_global_current_typwin(&g);
[38cc669]512                if (e) {
513                        RETVAL = owl_editwin_point_move(e, delta);
514                } else {
515                        RETVAL = 0;
516                }
[77f605d]517        OUTPUT:
518                RETVAL
[a88f35a]519
520int
521replace_region(string)
[e19eb97]522        const char *string;
[38cc669]523        PREINIT:
524                owl_editwin *e;
[a88f35a]525        CODE:
[818f19c]526                e = owl_global_current_typwin(&g);
[38cc669]527                if (e) {
528                        RETVAL = owl_editwin_replace_region(e, string);
529                } else {
530                        RETVAL = 0;
531                }
[a88f35a]532        OUTPUT:
533                RETVAL
534
[39e81f7]535const utf8 *
[d41294a]536get_region()
537        PREINIT:
538                char *region;
[38cc669]539                owl_editwin *e;
[d41294a]540        CODE:
[818f19c]541                e = owl_global_current_typwin(&g);
[38cc669]542                if (e) {
[818f19c]543                        region = owl_editwin_get_region(owl_global_current_typwin(&g));
[38cc669]544                } else {
545                        region = NULL;
546                }
[d41294a]547                RETVAL = region;
548        OUTPUT:
549                RETVAL
550        CLEANUP:
[ddbbcffa]551                g_free(region);
[d41294a]552
[a88f35a]553SV *
554save_excursion(sub)
555        SV *sub;
556        PROTOTYPE: &
557        PREINIT:
558                int count;
[38cc669]559                owl_editwin *e;
[a88f35a]560                owl_editwin_excursion *x;
561        CODE:
562        {
[818f19c]563                e = owl_global_current_typwin(&g);
[38cc669]564                if(!e)
565                        croak("The edit window is not currently active!");
566
[818f19c]567                x = owl_editwin_begin_excursion(owl_global_current_typwin(&g));
[6dc2d6b]568                PUSHMARK(SP);
[a88f35a]569                count = call_sv(sub, G_SCALAR|G_EVAL|G_NOARGS);
[6dc2d6b]570                SPAGAIN;
[818f19c]571                owl_editwin_end_excursion(owl_global_current_typwin(&g), x);
[a88f35a]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
[d41294a]585
586int
587current_column()
[38cc669]588        PREINIT:
589                owl_editwin *e;
[d41294a]590        CODE:
[818f19c]591                e = owl_global_current_typwin(&g);
[38cc669]592                if (e) {
593                        RETVAL = owl_editwin_current_column(e);
594                } else {
595                        RETVAL = 0;
596                }
[d41294a]597        OUTPUT:
598                RETVAL
599
600int
601point()
[38cc669]602        PREINIT:
603                owl_editwin *e;
[d41294a]604        CODE:
[818f19c]605                e = owl_global_current_typwin(&g);
[38cc669]606                if (e) {
607                        RETVAL = owl_editwin_get_point(e);
608                } else {
609                        RETVAL = 0;
610                }
[d41294a]611        OUTPUT:
612                RETVAL
613
614int
615mark()
[38cc669]616        PREINIT:
617                owl_editwin *e;
[d41294a]618        CODE:
[818f19c]619                e = owl_global_current_typwin(&g);
[38cc669]620                if (e) {
621                        RETVAL = owl_editwin_get_mark(e);
622                } else {
623                        RETVAL = 0;
624                }
[d41294a]625        OUTPUT:
626                RETVAL
Note: See TracBrowser for help on using the repository browser.