[232] in BarnOwl Developers

home help back first fref pref prev next nref lref last post

[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;
 


home help back first fref pref prev next nref lref last post