[443] in BarnOwl Developers
[D-O-H] r573 - in trunk: . owl
daemon@ATHENA.MIT.EDU (nelhage@MIT.EDU)
Thu Oct 29 18:06:13 2009
Resent-From: nelhage@mit.edu
Resent-To: barnowl-dev-mtg@charon.mit.edu
Date: Mon, 29 Jan 2007 21:54:41 -0500
To: dirty-owl-hackers@mit.edu
From: nelhage@MIT.EDU
Reply-To: dirty-owl-hackers@MIT.EDU
Author: nelhage
Date: 2007-01-29 21:54:41 -0500 (Mon, 29 Jan 2007)
New Revision: 573
Modified:
trunk/
trunk/owl/message.c
trunk/owl/owl.h
trunk/owl/perlconfig.c
trunk/owl/perlglue.xs
Log:
r18206@phanatique: nelhage | 2007-01-29 21:54:30 -0500
Making message type into a string
Property changes on: trunk
___________________________________________________________________
Name: svk:merge
- bb873fd7-8e23-0410-944a-99ec44c633eb:/branches/owl/filter-rewrite:15925
bb873fd7-8e23-0410-944a-99ec44c633eb:/local/d-o-h/trunk:18202
+ bb873fd7-8e23-0410-944a-99ec44c633eb:/branches/owl/filter-rewrite:15925
bb873fd7-8e23-0410-944a-99ec44c633eb:/local/d-o-h/trunk:18206
Modified: trunk/owl/message.c
===================================================================
--- trunk/owl/message.c 2007-01-26 22:42:07 UTC (rev 572)
+++ trunk/owl/message.c 2007-01-30 02:54:41 UTC (rev 573)
@@ -15,7 +15,6 @@
void owl_message_init(owl_message *m)
{
m->id=owl_global_get_nextmsgid(&g);
- m->type=OWL_MESSAGE_TYPE_GENERIC;
owl_message_set_direction_none(m);
m->delete=0;
m->hostname=owl_strdup("");
@@ -323,85 +322,65 @@
void owl_message_set_type_admin(owl_message *m)
{
- m->type=OWL_MESSAGE_TYPE_ADMIN;
+ owl_message_set_attribute(m, "type", "admin");
}
void owl_message_set_type_loopback(owl_message *m)
{
- m->type=OWL_MESSAGE_TYPE_LOOPBACK;
+ owl_message_set_attribute(m, "type", "loopback");
}
void owl_message_set_type_zephyr(owl_message *m)
{
- m->type=OWL_MESSAGE_TYPE_ZEPHYR;
+ owl_message_set_attribute(m, "type", "zephyr");
}
void owl_message_set_type_aim(owl_message *m)
{
- m->type=OWL_MESSAGE_TYPE_AIM;
+ owl_message_set_attribute(m, "type", "aim");
}
-void owl_message_set_type(owl_message *m, int type)
+void owl_message_set_type(owl_message *m, char* type)
{
- m->type=type;
+ owl_message_set_attribute(m, "type", type);
}
+
+int owl_message_is_type(owl_message *m, char *type) {
+ char * t = owl_message_get_attribute_value(m, "type");
+ if(!t) return 0;
+ return !strcmp(t, type);
+}
int owl_message_is_type_admin(owl_message *m)
{
- if (m->type==OWL_MESSAGE_TYPE_ADMIN) return(1);
- return(0);
+ return owl_message_is_type(m, "admin");
}
int owl_message_is_type_generic(owl_message *m)
{
- if (m->type==OWL_MESSAGE_TYPE_GENERIC) return(1);
- return(0);
+ char * t = owl_message_get_attribute_value(m, "type");
+ return (t == NULL);
}
int owl_message_is_type_zephyr(owl_message *m)
{
- if (m->type==OWL_MESSAGE_TYPE_ZEPHYR) return(1);
- return(0);
+ return owl_message_is_type(m, "zephyr");
}
int owl_message_is_type_aim(owl_message *m)
{
- if (m->type==OWL_MESSAGE_TYPE_AIM) return(1);
- return(0);
+ return owl_message_is_type(m, "aim");
}
+/* XXX TODO: deprecate this */
int owl_message_is_type_jabber(owl_message *m)
{
- if (m->type==OWL_MESSAGE_TYPE_JABBER) return(1);
-
- return(0);
+ return owl_message_is_type(m, "jabber");
}
-int owl_message_is_type_icq(owl_message *m)
-{
- if (m->type==OWL_MESSAGE_TYPE_ICQ) return(1);
-
- return(0);
-}
-
-int owl_message_is_type_yahoo(owl_message *m)
-{
- if (m->type==OWL_MESSAGE_TYPE_YAHOO) return(1);
-
- return(0);
-}
-
-int owl_message_is_type_msn(owl_message *m)
-{
- if (m->type==OWL_MESSAGE_TYPE_MSN) return(1);
-
- return(0);
-}
-
int owl_message_is_type_loopback(owl_message *m)
{
- if (m->type==OWL_MESSAGE_TYPE_LOOPBACK) return(1);
- return(0);
+ return owl_message_is_type(m, "loopback");
}
int owl_message_is_pseudo(owl_message *m)
@@ -665,52 +644,13 @@
}
char *owl_message_get_type(owl_message *m) {
- switch (m->type) {
- case OWL_MESSAGE_TYPE_ADMIN:
- return("admin");
- case OWL_MESSAGE_TYPE_ZEPHYR:
- return("zephyr");
- case OWL_MESSAGE_TYPE_GENERIC:
- return("generic");
- case OWL_MESSAGE_TYPE_AIM:
- return("aim");
- case OWL_MESSAGE_TYPE_JABBER:
- return("jabber");
- case OWL_MESSAGE_TYPE_ICQ:
- return("icq");
- case OWL_MESSAGE_TYPE_YAHOO:
- return("yahoo");
- case OWL_MESSAGE_TYPE_MSN:
- return("msn");
- case OWL_MESSAGE_TYPE_LOOPBACK:
- return("loopback");
- default:
- return("unknown");
+ char * type = owl_message_get_attribute_value(m, "type");
+ if(!type) {
+ return "generic";
}
+ return type;
}
-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:
Modified: trunk/owl/owl.h
===================================================================
--- trunk/owl/owl.h 2007-01-26 22:42:07 UTC (rev 572)
+++ trunk/owl/owl.h 2007-01-30 02:54:41 UTC (rev 573)
@@ -108,16 +108,6 @@
#define OWL_PROTOCOL_YAHOO 4
#define OWL_PROTOCOL_MSN 5
-#define OWL_MESSAGE_TYPE_ADMIN 0
-#define OWL_MESSAGE_TYPE_GENERIC 1
-#define OWL_MESSAGE_TYPE_ZEPHYR 2
-#define OWL_MESSAGE_TYPE_AIM 3
-#define OWL_MESSAGE_TYPE_JABBER 4
-#define OWL_MESSAGE_TYPE_ICQ 5
-#define OWL_MESSAGE_TYPE_YAHOO 6
-#define OWL_MESSAGE_TYPE_MSN 7
-#define OWL_MESSAGE_TYPE_LOOPBACK 8
-
#define OWL_MESSAGE_DIRECTION_NONE 0
#define OWL_MESSAGE_DIRECTION_IN 1
#define OWL_MESSAGE_DIRECTION_OUT 2
@@ -333,7 +323,6 @@
typedef struct _owl_message {
int id;
- int type;
int direction;
#ifdef HAVE_LIBZEPHYR
ZNotice_t notice;
Modified: trunk/owl/perlconfig.c
===================================================================
--- trunk/owl/perlconfig.c 2007-01-26 22:42:07 UTC (rev 572)
+++ trunk/owl/perlconfig.c 2007-01-30 02:54:41 UTC (rev 573)
@@ -25,11 +25,11 @@
}
}
-SV *owl_perlconfig_message2hashref(owl_message *m) /*noproto*/
+SV *owl_perlconfig_message2hashref(owl_message *m)
{
HV *h;
SV *hr;
- char *ptr, *blessas;
+ char *ptr, *blessas, *type;
int i, j;
owl_pair *pair;
@@ -85,18 +85,19 @@
hv_store(h, "deleted", strlen("deleted"), newSViv(owl_message_is_delete(m)),0);
hv_store(h, "private", strlen("private"), newSViv(owl_message_is_private(m)),0);
- if (owl_message_is_type_zephyr(m)) blessas = "BarnOwl::Message::Zephyr";
- else if (owl_message_is_type_aim(m)) blessas = "BarnOwl::Message::AIM";
- else if (owl_message_is_type_jabber(m)) blessas = "BarnOwl::Message::Jabber";
- else if (owl_message_is_type_admin(m)) blessas = "BarnOwl::Message::Admin";
- else if (owl_message_is_type_generic(m)) blessas = "BarnOwl::Message::Generic";
- else blessas = "BarnOwl::Message";
+ type = owl_message_get_type(m);
+ if(!type) type = "generic";
+ type = owl_strdup(type);
+ type[0] = toupper(type[0]);
+ blessas = owl_sprintf("BarnOwl::Message::%s", type);
hr = sv_2mortal(newRV_noinc((SV*)h));
- return sv_bless(hr, gv_stashpv(blessas,0));
+ hr = sv_bless(hr, gv_stashpv(blessas,0));
+ owl_free(type);
+ owl_free(blessas);
+ return hr;
}
-
SV *owl_perlconfig_curmessage2hashref(void) /*noproto*/
{
int curmsg;
@@ -109,7 +110,56 @@
return owl_perlconfig_message2hashref(owl_view_get_element(v, curmsg));
}
+/* XXX TODO: Messages should round-trip properly between
+ message2hashref and hashref2message. Currently we lose
+ zephyr-specific properties stored in the ZNotice_t
+ */
+owl_message * owl_perlconfig_hashref2message(SV *msg)
+{
+ owl_message * m;
+ HE * ent;
+ I32 count, len;
+ char *key,*val;
+ HV * hash;
+ 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, val);
+ } else if(!strcmp(key, "direction")) {
+ owl_message_set_direction(m, owl_message_parse_direction(val));
+ } else if(!strcmp(key, "private")) {
+ SV * v = hv_iterval(hash, ent);
+ if(SvTRUE(v)) {
+ owl_message_set_isprivate(m);
+ }
+ } else if (!strcmp(key, "hostname")) {
+ owl_message_set_hostname(m, val);
+ } else if (!strcmp(key, "zwriteline")) {
+ owl_message_set_zwriteline(m, val);
+ } else if (!strcmp(key, "time")) {
+ m->timestr = owl_strdup(val);
+ struct tm tm;
+ strptime(val, "%a %b %d %T %Y", &tm);
+ m->time = mktime(&tm);
+ } else {
+ owl_message_set_attribute(m, key, val);
+ }
+ }
+ if(owl_message_is_type_admin(m)) {
+ if(!owl_message_get_attribute_value(m, "adminheader"))
+ owl_message_set_attribute(m, "adminheader", "");
+ }
+ return m;
+}
+
/* Calls in a scalar context, passing it a hash reference.
If return value is non-null, caller must free. */
char *owl_perlconfig_call_with_message(char *subname, owl_message *m)
Modified: trunk/owl/perlglue.xs
===================================================================
--- trunk/owl/perlglue.xs 2007-01-26 22:42:07 UTC (rev 572)
+++ trunk/owl/perlglue.xs 2007-01-30 02:54:41 UTC (rev 573)
@@ -116,54 +116,15 @@
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);
+ m = owl_perlconfig_hashref2message(msg);
- 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 if(!strcmp(key, "private")) {
- SV * v = hv_iterval(hash, ent);
- if(SvTRUE(v)) {
- owl_message_set_isprivate(m);
- }
- } else if (!strcmp(key, "hostname")) {
- owl_message_set_hostname(m, val);
- } else if (!strcmp(key, "zwriteline")) {
- owl_message_set_zwriteline(m, val);
- } else if (!strcmp(key, "time")) {
- m->timestr = owl_strdup(val);
- struct tm tm;
- strptime(val, "%a %b %d %T %Y", &tm);
- m->time = mktime(&tm);
- } else {
- owl_message_set_attribute(m, key, val);
- }
- }
- if(owl_message_is_type_admin(m)) {
- if(!owl_message_get_attribute_value(m, "adminheader"))
- owl_message_set_attribute(m, "adminheader", "");
- }
-
owl_global_messagequeue_addmsg(&g, m);
}