source: perlglue.xs @ dd16bdd

barnowl_perlaimdebianrelease-1.4release-1.5release-1.6release-1.7release-1.8release-1.9
Last change on this file since dd16bdd was dd16bdd, checked in by Nelson Elhage <nelhage@mit.edu>, 14 years ago
Initial support for creating and injecting messages into the display. Note that at the moment, you can easily segfault owl from perl by injecting messages that don't contain fields owl assumes they will.
  • Property mode set to 100644
File size: 2.4 KB
Line 
1/* -*- mode: c; indent-tabs-mode: t; c-basic-offset: 8 -*- */
2static const char fileIdent[] = "$Id$";
3
4#ifdef HAVE_LIBZEPHYR
5#include <zephyr/zephyr.h>
6#endif
7#include <EXTERN.h>
8
9#define OWL_PERL
10#include "owl.h"
11SV *owl_perlconfig_curmessage2hashref(void);
12
13MODULE = owl            PACKAGE = owl           
14
15char *
16command(cmd)
17        char *cmd
18        PREINIT:
19                char *rv = NULL;
20        CODE:
21                rv = owl_function_command(cmd);
22                RETVAL = rv;   
23        OUTPUT:
24                RETVAL
25        CLEANUP:
26                if (rv) owl_free(rv);
27
28SV *
29getcurmsg()
30        CODE:
31                ST(0) = owl_perlconfig_curmessage2hashref();
32
33int
34getnumcols()
35        CODE:
36                RETVAL = owl_global_get_cols(&g);
37        OUTPUT:
38                RETVAL
39
40char *
41zephyr_getrealm()
42        CODE:
43                RETVAL = owl_zephyr_get_realm();
44        OUTPUT:
45                RETVAL
46
47char *
48zephyr_getsender()
49        CODE:
50                RETVAL = owl_zephyr_get_sender();
51        OUTPUT:
52                RETVAL
53
54void
55zephyr_zwrite(cmd,msg)
56        char *cmd
57        char *msg
58        PREINIT:
59                int i;
60        CODE:
61                i = owl_zwrite_create_and_send_from_line(cmd, msg);
62
63char *
64ztext_stylestrip(ztext)
65        char *ztext
66        PREINIT:
67                char *rv = NULL;
68        CODE:
69                rv = owl_function_ztext_stylestrip(ztext);
70                RETVAL = rv;
71        OUTPUT:
72                RETVAL
73        CLEANUP:
74                if (rv) owl_free(rv);
75
76void
77new_command_internal(name, func, summary, usage, description)
78        char *name
79        SV *func
80        char *summary
81        char *usage
82        char *description
83        PREINIT:
84                owl_cmd cmd;
85        CODE:
86                SvREFCNT_inc(func);
87                cmd.name = name;
88                cmd.cmd_perl = func;
89                cmd.summary = summary;
90                cmd.usage = usage;
91                cmd.description = description;
92                cmd.validctx = OWL_CTX_ANY;
93                cmd.cmd_aliased_to = NULL;
94                cmd.cmd_args_fn = NULL;
95                cmd.cmd_v_fn = NULL;
96                cmd.cmd_i_fn = NULL;
97                cmd.cmd_ctxargs_fn = NULL;
98                cmd.cmd_ctxv_fn = NULL;
99                cmd.cmd_ctxi_fn = NULL;
100                owl_cmddict_add_cmd(owl_global_get_cmddict(&g), &cmd);
101
102void queue_message(msg)
103        SV *msg
104        PREINIT:
105                char * key;
106                char * val;
107                owl_message *m;
108                HV * hash;
109                HE * ent;
110                I32 count;
111                I32 len;
112        CODE:
113                if(!SvROK(msg) || SvTYPE(SvRV(msg)) != SVt_PVHV) {
114                        croak("Usage: owl::queue_message($message)");
115                }
116               
117                hash = (HV*)SvRV(msg);
118                m = owl_malloc(sizeof(owl_message));
119                owl_message_init(m);
120               
121                count = hv_iterinit(hash);
122                while((ent = hv_iternext(hash))) {
123                        key = hv_iterkey(ent, &len);
124                        val = SvPV_nolen(hv_iterval(hash, ent));
125                        if(!strcmp(key, "type")) {
126                                owl_message_set_type(m, owl_message_parse_type(val));
127                        } else if(!strcmp(key, "direction")) {
128                                owl_message_set_direction(m, owl_message_parse_direction(val));
129                        } else {
130                                owl_message_set_attribute(m, key, val);
131                        }
132                }
133
134                owl_global_messagequeue_addmsg(&g, m);
Note: See TracBrowser for help on using the repository browser.