[232] in BarnOwl Developers
[D-O-H] r408 - trunk/owl
daemon@ATHENA.MIT.EDU (nelhage@MIT.EDU)
Thu Oct 29 18:03:57 2009
Resent-From: nelhage@mit.edu
Resent-To: barnowl-dev-mtg@charon.mit.edu
Date: Fri, 27 Oct 2006 01:19:55 -0400
To: dirty-owl-hackers@MIT.EDU
From: nelhage@MIT.EDU
Reply-To: dirty-owl-hackers@MIT.EDU
Author: nelhage
Date: 2006-10-27 01:19:54 -0400 (Fri, 27 Oct 2006)
New Revision: 408
Modified:
trunk/owl/message.c
trunk/owl/perlglue.xs
trunk/owl/perlwrap.pm
Log:
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.
Modified: trunk/owl/message.c
===================================================================
--- trunk/owl/message.c 2006-10-27 02:08:54 UTC (rev 407)
+++ trunk/owl/message.c 2006-10-27 05:19:54 UTC (rev 408)
@@ -340,6 +340,11 @@
{
m->type=OWL_MESSAGE_TYPE_AIM;
}
+
+void owl_message_set_type(owl_message *m, int type)
+{
+ m->type=type;
+}
int owl_message_is_type_admin(owl_message *m)
{
@@ -397,6 +402,11 @@
m->direction=OWL_MESSAGE_DIRECTION_NONE;
}
+void owl_message_set_direction(owl_message *m, int direction)
+{
+ m->direction=direction;
+}
+
int owl_message_is_direction_in(owl_message *m)
{
if (m->direction==OWL_MESSAGE_DIRECTION_IN) return(1);
@@ -630,6 +640,28 @@
}
}
+int owl_message_parse_type(char *type) {
+ if(!strcmp(type, "admin")) {
+ return OWL_MESSAGE_TYPE_ADMIN;
+ } else if(!strcmp(type, "zephyr")) {
+ return OWL_MESSAGE_TYPE_ZEPHYR;
+ } if(!strcmp(type, "aim")) {
+ return OWL_MESSAGE_TYPE_AIM;
+ } else if(!strcmp(type, "jabber")) {
+ return OWL_MESSAGE_TYPE_JABBER;
+ } else if(!strcmp(type, "icq")) {
+ return OWL_MESSAGE_TYPE_ICQ;
+ } else if(!strcmp(type, "yahoo")) {
+ return OWL_MESSAGE_TYPE_YAHOO;
+ } else if(!strcmp(type, "msn")) {
+ return OWL_MESSAGE_TYPE_MSN;
+ } else if(!strcmp(type, "loopback")) {
+ return OWL_MESSAGE_TYPE_LOOPBACK;
+ } else {
+ return OWL_MESSAGE_TYPE_GENERIC;
+ }
+}
+
char *owl_message_get_direction(owl_message *m) {
switch (m->direction) {
case OWL_MESSAGE_DIRECTION_IN:
@@ -643,6 +675,17 @@
}
}
+int owl_message_parse_direction(char *d) {
+ if(!strcmp(d, "in")) {
+ return OWL_MESSAGE_DIRECTION_IN;
+ } else if(!strcmp(d, "out")) {
+ return OWL_MESSAGE_DIRECTION_OUT;
+ } else {
+ return OWL_MESSAGE_DIRECTION_NONE;
+ }
+}
+
+
char *owl_message_get_login(owl_message *m) {
if (owl_message_is_login(m)) {
return "login";
@@ -653,6 +696,7 @@
}
}
+
char *owl_message_get_header(owl_message *m) {
return owl_message_get_attribute_value(m, "adminheader");
}
Modified: trunk/owl/perlglue.xs
===================================================================
--- trunk/owl/perlglue.xs 2006-10-27 02:08:54 UTC (rev 407)
+++ trunk/owl/perlglue.xs 2006-10-27 05:19:54 UTC (rev 408)
@@ -1,3 +1,4 @@
+/* -*- mode: c; indent-tabs-mode: t; c-basic-offset: 8 -*- */
static const char fileIdent[] = "$Id$";
#ifdef HAVE_LIBZEPHYR
@@ -89,7 +90,6 @@
cmd.usage = usage;
cmd.description = description;
cmd.validctx = OWL_CTX_ANY;
-
cmd.cmd_aliased_to = NULL;
cmd.cmd_args_fn = NULL;
cmd.cmd_v_fn = NULL;
@@ -97,5 +97,38 @@
cmd.cmd_ctxargs_fn = NULL;
cmd.cmd_ctxv_fn = NULL;
cmd.cmd_ctxi_fn = NULL;
+ owl_cmddict_add_cmd(owl_global_get_cmddict(&g), &cmd);
- owl_cmddict_add_cmd(owl_global_get_cmddict(&g), &cmd);
+void queue_message(msg)
+ SV *msg
+ PREINIT:
+ char * key;
+ char * val;
+ owl_message *m;
+ HV * hash;
+ HE * ent;
+ I32 count;
+ I32 len;
+ CODE:
+ if(!SvROK(msg) || SvTYPE(SvRV(msg)) != SVt_PVHV) {
+ croak("Usage: owl::queue_message($message)");
+ }
+
+ hash = (HV*)SvRV(msg);
+ m = owl_malloc(sizeof(owl_message));
+ owl_message_init(m);
+
+ count = hv_iterinit(hash);
+ while((ent = hv_iternext(hash))) {
+ key = hv_iterkey(ent, &len);
+ val = SvPV_nolen(hv_iterval(hash, ent));
+ if(!strcmp(key, "type")) {
+ owl_message_set_type(m, owl_message_parse_type(val));
+ } else if(!strcmp(key, "direction")) {
+ owl_message_set_direction(m, owl_message_parse_direction(val));
+ } else {
+ owl_message_set_attribute(m, key, val);
+ }
+ }
+
+ owl_global_messagequeue_addmsg(&g, m);
Modified: trunk/owl/perlwrap.pm
===================================================================
--- trunk/owl/perlwrap.pm 2006-10-27 02:08:54 UTC (rev 407)
+++ trunk/owl/perlwrap.pm 2006-10-27 05:19:54 UTC (rev 408)
@@ -61,6 +61,15 @@
package owl::Message;
+sub new {
+ my $class = shift;
+ my %args = (@_);
+ if($class eq __PACKAGE__ && $args{type}) {
+ $class = "owl::Message::" . ucfirst $args{type};
+ }
+ return bless {%args}, $class;
+}
+
sub type { return shift->{"type"}; }
sub direction { return shift->{"direction"}; }
sub time { return shift->{"time"}; }
@@ -83,6 +92,7 @@
sub is_aim { return (shift->{"type"} eq "aim"); }
sub is_admin { return (shift->{"type"} eq "admin"); }
sub is_generic { return (shift->{"type"} eq "generic"); }
+sub is_jabber { return (shift->{"type"} eq "jabber"); }
# These are overridden by appropriate message types
sub is_ping { return 0; }
@@ -250,6 +260,13 @@
#####################################################################
#####################################################################
+package owl::Message::Jabber;
+
+@ISA = qw( owl::Message );
+
+#####################################################################
+#####################################################################
+
# switch to package main when we're done
package main;