[852] in BarnOwl Developers

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

[D-O-H] r842 - branches/barnowl_sqlite/owl

daemon@ATHENA.MIT.EDU (nelhage@MIT.EDU)
Thu Oct 29 18:10:24 2009

Resent-From: nelhage@mit.edu
Resent-To: barnowl-dev-mtg@charon.mit.edu
To: dirty-owl-hackers@mit.edu
From: nelhage@MIT.EDU
Reply-to: dirty-owl-hackers@MIT.EDU
Date: Fri, 11 Jan 2008 22:50:22 -0500 (EST)

Author: nelhage
Date: 2008-01-11 22:50:21 -0500 (Fri, 11 Jan 2008)
New Revision: 842

Modified:
   branches/barnowl_sqlite/owl/aim.c
   branches/barnowl_sqlite/owl/buddylist.c
   branches/barnowl_sqlite/owl/functions.c
   branches/barnowl_sqlite/owl/message.c
   branches/barnowl_sqlite/owl/owl.h
   branches/barnowl_sqlite/owl/perlconfig.c
   branches/barnowl_sqlite/owl/zephyr.c
Log:
Abstract over message creation. Trust me, I'm going somewhere with this.

Modified: branches/barnowl_sqlite/owl/aim.c
===================================================================
--- branches/barnowl_sqlite/owl/aim.c	2008-01-12 03:40:17 UTC (rev 841)
+++ branches/barnowl_sqlite/owl/aim.c	2008-01-12 03:50:21 UTC (rev 842)
@@ -1459,7 +1459,7 @@
   stripmsg=owl_text_htmlstrip(realmsg);
   wrapmsg=owl_text_wordwrap(stripmsg, 70);
   nz_screenname=owl_aim_normalize_screenname(userinfo->sn);
-  m=owl_malloc(sizeof(owl_message));
+  m=owl_message_new();
   owl_message_create_aim(m,
 			 nz_screenname,
 			 owl_global_get_aim_screenname(&g),

Modified: branches/barnowl_sqlite/owl/buddylist.c
===================================================================
--- branches/barnowl_sqlite/owl/buddylist.c	2008-01-12 03:40:17 UTC (rev 841)
+++ branches/barnowl_sqlite/owl/buddylist.c	2008-01-12 03:50:21 UTC (rev 842)
@@ -53,7 +53,7 @@
     if (!owl_timer_is_expired(owl_global_get_aim_login_timer(&g))) return;
 
     /* if not, create the login message */
-    m=owl_malloc(sizeof(owl_message));
+    m=owl_message_new();
     owl_message_create_aim(m,
 			   screenname,
 			   owl_global_get_aim_screenname(&g),
@@ -72,7 +72,7 @@
   owl_message *m;
 
   if (owl_buddylist_is_aim_buddy_loggedin(bl, screenname)) {
-    m=owl_malloc(sizeof(owl_message));
+    m=owl_message_new();
     owl_message_create_aim(m,
 			   screenname,
 			   owl_global_get_aim_screenname(&g),

Modified: branches/barnowl_sqlite/owl/functions.c
===================================================================
--- branches/barnowl_sqlite/owl/functions.c	2008-01-12 03:40:17 UTC (rev 841)
+++ branches/barnowl_sqlite/owl/functions.c	2008-01-12 03:50:21 UTC (rev 842)
@@ -170,7 +170,7 @@
 {
   owl_message *m;
 
-  m=owl_malloc(sizeof(owl_message));
+  m=owl_message_new();
   owl_message_create_admin(m, header, body);
   
   /* add it to the global list and current view */
@@ -202,7 +202,7 @@
   owl_zwrite_create_from_line(&z, zwriteline);
 
   /* create the message */
-  m=owl_malloc(sizeof(owl_message));
+  m=owl_message_new();
   owl_message_create_from_zwriteline(m, zwriteline, body, zsig);
   owl_zwrite_free(&z);
 
@@ -221,7 +221,7 @@
   /* error if we're not logged into aim */
   if (!owl_global_is_aimloggedin(&g)) return(NULL);
   
-  m=owl_malloc(sizeof(owl_message));
+  m=owl_message_new();
   owl_message_create_aim(m,
 			 owl_global_get_aim_screenname(&g),
 			 to,
@@ -240,7 +240,7 @@
   owl_message *m;
 
   /* create the message */
-  m=owl_malloc(sizeof(owl_message));
+  m=owl_message_new();
   owl_message_create_loopback(m, body);
   owl_message_set_direction_out(m);
 
@@ -524,7 +524,7 @@
 
   /* create a message and put it on the message queue.  This simulates
    * an incoming message */
-  min=owl_malloc(sizeof(owl_message));
+  min=owl_message_new();
   mout=owl_function_make_outgoing_loopback(msg);
 
   if (owl_global_is_displayoutgoing(&g)) {
@@ -3648,7 +3648,7 @@
       if ((numlocs>0) && !owl_zbuddylist_contains_user(zbl, user)) {
 	/* Send a PSEUDO LOGIN! */
 	if (notify) {
-	  m=owl_malloc(sizeof(owl_message));
+	  m=owl_message_new();
 	  owl_message_create_pseudo_zlogin(m, 0, user, location[0].host, location[0].time, location[0].tty);
 	  owl_global_messagequeue_addmsg(&g, m);
 	}
@@ -3663,7 +3663,7 @@
     } else if ((ret==ZERR_NOLOCATIONS) && owl_zbuddylist_contains_user(zbl, user)) {
       /* Send a PSEUDO LOGOUT! */
       if (notify) {
-	m=owl_malloc(sizeof(owl_message));
+	m=owl_message_new();
 	owl_message_create_pseudo_zlogin(m, 1, user, "", "", "");
 	owl_global_messagequeue_addmsg(&g, m);
       }

Modified: branches/barnowl_sqlite/owl/message.c
===================================================================
--- branches/barnowl_sqlite/owl/message.c	2008-01-12 03:40:17 UTC (rev 841)
+++ branches/barnowl_sqlite/owl/message.c	2008-01-12 03:50:21 UTC (rev 842)
@@ -15,27 +15,10 @@
 static owl_fmtext_cache fmtext_cache[OWL_FMTEXT_CACHE_SIZE];
 static owl_fmtext_cache * fmtext_cache_next = fmtext_cache;
 
-void owl_message_init_fmtext_cache ()
-{
-    int i;
-    for(i = 0; i < OWL_FMTEXT_CACHE_SIZE; i++) {
-        owl_fmtext_init_null(&(fmtext_cache[i].fmtext));
-        fmtext_cache[i].message = NULL;
-    }
+owl_message *owl_message_new() {
+  return (owl_message*)owl_malloc(sizeof(owl_message));
 }
 
-owl_fmtext_cache * owl_message_next_fmtext() /*noproto*/
-{
-    owl_fmtext_cache * f = fmtext_cache_next;
-    if(fmtext_cache_next->message != NULL) {
-        owl_message_invalidate_format(fmtext_cache_next->message);
-    }
-    fmtext_cache_next++;
-    if(fmtext_cache_next - fmtext_cache == OWL_FMTEXT_CACHE_SIZE)
-        fmtext_cache_next = fmtext_cache;
-    return f;
-}
-
 void owl_message_init(owl_message *m)
 {
   m->id=owl_global_get_nextmsgid(&g);
@@ -130,37 +113,10 @@
   }
 }
 
-void owl_message_invalidate_format(owl_message *m)
-{
-  if(m->fmtext) {
-    m->fmtext->message = NULL;
-    owl_fmtext_clear(&(m->fmtext->fmtext));
-    m->fmtext=NULL;
-  }
+int owl_message_get_id(owl_message *m) {
+  return m->id;
 }
 
-owl_fmtext *owl_message_get_fmtext(owl_message *m)
-{
-  owl_message_format(m);
-  return(&(m->fmtext->fmtext));
-}
-
-void owl_message_format(owl_message *m)
-{
-  owl_style *s;
-  owl_view *v;
-
-  if (!m->fmtext) {
-    m->fmtext = owl_message_next_fmtext();
-    m->fmtext->message = m;
-    /* for now we assume there's just the one view and use that style */
-    v=owl_global_get_current_view(&g);
-    s=owl_view_get_style(v);
-
-    owl_style_get_formattext(s, &(m->fmtext->fmtext), m);
-  }
-}
-
 void owl_message_set_class(owl_message *m, char *class)
 {
   owl_message_set_attribute(m, "class", class);
@@ -419,12 +375,6 @@
   return(0);
 }
 
-char *owl_message_get_text(owl_message *m)
-{
-  owl_message_format(m);
-  return(owl_fmtext_get_text(&(m->fmtext->fmtext)));
-}
-
 void owl_message_set_direction_in(owl_message *m)
 {
   m->direction=OWL_MESSAGE_DIRECTION_IN;
@@ -463,13 +413,6 @@
   return(0);
 }
 
-int owl_message_get_numlines(owl_message *m)
-{
-  if (m == NULL) return(0);
-  owl_message_format(m);
-  return(owl_fmtext_num_lines(&(m->fmtext->fmtext)));
-}
-
 void owl_message_mark_delete(owl_message *m)
 {
   if (m == NULL) return;
@@ -524,35 +467,6 @@
   return(m->hostname);
 }
 
-void owl_message_curs_waddstr(owl_message *m, WINDOW *win, int aline, int bline, int acol, int bcol, int fgcolor, int bgcolor)
-{
-  owl_fmtext a, b;
-
-  /* this will ensure that our cached copy is up to date */
-  owl_message_format(m);
-
-  owl_fmtext_init_null(&a);
-  owl_fmtext_init_null(&b);
-  
-  owl_fmtext_truncate_lines(&(m->fmtext->fmtext), aline, bline-aline+1, &a);
-  owl_fmtext_truncate_cols(&a, acol, bcol, &b);
-  if (fgcolor!=OWL_COLOR_DEFAULT) {
-    owl_fmtext_colorize(&b, fgcolor);
-  }
-  if (bgcolor!=OWL_COLOR_DEFAULT) {
-    owl_fmtext_colorizebg(&b, bgcolor);
-  }
-
-  if (owl_global_is_search_active(&g)) {
-    owl_fmtext_search_and_highlight(&b, owl_global_get_search_string(&g));
-  }
-      
-  owl_fmtext_curs_waddstr(&b, win);
-
-  owl_fmtext_free(&a);
-  owl_fmtext_free(&b);
-}
-
 int owl_message_is_personal(owl_message *m)
 {
   owl_filter * f = owl_global_get_filter(&g, "personal");
@@ -701,11 +615,6 @@
   return(out);
 }
 
-int owl_message_get_id(owl_message *m)
-{
-  return(m->id);
-}
-
 char *owl_message_get_type(owl_message *m) {
   char * type = owl_message_get_attribute_value(m, "type");
   if(!type) {
@@ -759,9 +668,7 @@
 int owl_message_search(owl_message *m, char *string)
 {
 
-  owl_message_format(m); /* is this necessary? */
-  
-  return (owl_fmtext_search(&(m->fmtext->fmtext), string));
+  return (owl_fmtext_search(owl_message_get_fmtext(m), string));
 }
 
 
@@ -1059,3 +966,115 @@
  
   owl_message_invalidate_format(m);
 }
+
+
+/**********************************************************************
+ * Functions related to message styling and formatting
+ **********************************************************************/
+
+#define NO_MESSAGE (-1);
+void owl_message_init_fmtext_cache ()
+{
+    int i;
+    for(i = 0; i < OWL_FMTEXT_CACHE_SIZE; i++) {
+        owl_fmtext_init_null(&(fmtext_cache[i].fmtext));
+        fmtext_cache[i].message_id = NO_MESSAGE;
+    }
+}
+
+owl_fmtext_cache * owl_message_next_fmtext() /*noproto*/
+{
+    owl_fmtext_cache * f = fmtext_cache_next;
+    fmtext_cache_next++;
+    if(fmtext_cache_next - fmtext_cache == OWL_FMTEXT_CACHE_SIZE)
+        fmtext_cache_next = fmtext_cache;
+    owl_fmtext_clear(&(f->fmtext));
+    f->message_id = NO_MESSAGE;
+    return f;
+}
+
+void owl_message_invalidate_format(owl_message *m)
+{
+  owl_fmtext_cache * fmtext = owl_message_get_fmtext_cache(m);
+  if(fmtext) {
+    fmtext->message_id = NO_MESSAGE;
+    owl_fmtext_clear(&(m->fmtext->fmtext));
+    owl_message_set_fmtext_cache(m, NULL);
+  }
+}
+
+owl_fmtext_cache *owl_message_get_fmtext_cache(owl_message *m)
+{
+  return m->fmtext;
+}
+
+void owl_message_set_fmtext_cache(owl_message *m, owl_fmtext_cache *fm)
+{
+  m->fmtext = fm;
+}
+
+owl_fmtext *owl_message_get_fmtext(owl_message *m)
+{
+  owl_message_format(m);
+  return(&(owl_message_get_fmtext_cache(m)->fmtext));
+}
+
+void owl_message_format(owl_message *m)
+{
+  owl_style *s;
+  owl_view *v;
+  owl_fmtext_cache *fm;
+
+  fm = owl_message_get_fmtext_cache(m);
+
+  if (!fm || fm->message_id != owl_message_get_id(m)) {
+    fm = owl_message_next_fmtext();
+    owl_message_set_fmtext_cache(m, fm);
+    fm->message_id = owl_message_get_id(m);
+    /* for now we assume there's just the one view and use that style */
+    v=owl_global_get_current_view(&g);
+    s=owl_view_get_style(v);
+
+    owl_style_get_formattext(s, &(fm->fmtext), m);
+  }
+}
+
+char *owl_message_get_text(owl_message *m)
+{
+  return(owl_fmtext_get_text(owl_message_get_fmtext(m)));
+}
+
+int owl_message_get_numlines(owl_message *m)
+{
+  if (m == NULL) return(0);
+  return(owl_fmtext_num_lines(owl_message_get_fmtext(m)));
+}
+
+void owl_message_curs_waddstr(owl_message *m, WINDOW *win, int aline, int bline, int acol, int bcol, int fgcolor, int bgcolor)
+{
+  owl_fmtext a, b;
+
+  owl_fmtext *fm = owl_message_get_fmtext(m);
+
+  owl_fmtext_init_null(&a);
+  owl_fmtext_init_null(&b);
+  
+  owl_fmtext_truncate_lines(fm, aline, bline-aline+1, &a);
+  owl_fmtext_truncate_cols(&a, acol, bcol, &b);
+  if (fgcolor!=OWL_COLOR_DEFAULT) {
+    owl_fmtext_colorize(&b, fgcolor);
+  }
+  if (bgcolor!=OWL_COLOR_DEFAULT) {
+    owl_fmtext_colorizebg(&b, bgcolor);
+  }
+
+  if (owl_global_is_search_active(&g)) {
+    owl_fmtext_search_and_highlight(&b, owl_global_get_search_string(&g));
+  }
+      
+  owl_fmtext_curs_waddstr(&b, win);
+
+  owl_fmtext_free(&a);
+  owl_fmtext_free(&b);
+}
+

Modified: branches/barnowl_sqlite/owl/owl.h
===================================================================
--- branches/barnowl_sqlite/owl/owl.h	2008-01-12 03:40:17 UTC (rev 841)
+++ branches/barnowl_sqlite/owl/owl.h	2008-01-12 03:50:21 UTC (rev 842)
@@ -334,6 +334,7 @@
 
 struct _owl_fmtext_cache;
 
+// typedef SV owl_message;
 typedef struct _owl_message {
   int id;
   int direction;
@@ -343,7 +344,7 @@
   struct _owl_fmtext_cache * fmtext;
   int delete;
   char *hostname;
-  owl_list attributes;            /* this is a list of pairs */
+  owl_list attributes;            // this is a list of pairs 
   char *timestr;
   time_t time;
   char *zwriteline;
@@ -353,7 +354,7 @@
 /* We cache the saved fmtexts for the last bunch of messages we
    rendered */
 typedef struct _owl_fmtext_cache {
-    owl_message * message;
+    int message_id;
     owl_fmtext fmtext;
 } owl_fmtext_cache;
 

Modified: branches/barnowl_sqlite/owl/perlconfig.c
===================================================================
--- branches/barnowl_sqlite/owl/perlconfig.c	2008-01-12 03:40:17 UTC (rev 841)
+++ branches/barnowl_sqlite/owl/perlconfig.c	2008-01-12 03:50:21 UTC (rev 842)
@@ -140,7 +140,7 @@
 
   hash = (HV*)SvRV(msg);
 
-  m = owl_malloc(sizeof(owl_message));
+  m = owl_message_new();
   owl_message_init(m);
 
   count = hv_iterinit(hash);

Modified: branches/barnowl_sqlite/owl/zephyr.c
===================================================================
--- branches/barnowl_sqlite/owl/zephyr.c	2008-01-12 03:40:17 UTC (rev 841)
+++ branches/barnowl_sqlite/owl/zephyr.c	2008-01-12 03:50:21 UTC (rev 842)
@@ -564,7 +564,7 @@
   } else if (!strcmp(retnotice->z_message, ZSRVACK_NOTSENT)) {
     #define BUFFLEN 1024
     if (retnotice->z_recipient == NULL
-        || *retnotice->z_recipient == NULL
+        || *retnotice->z_recipient == 0
         || *retnotice->z_recipient == '@') {
       char buff[BUFFLEN];
       owl_function_error("No one subscribed to class %s", retnotice->z_class);
@@ -1097,7 +1097,7 @@
       }
 
       /* create the new message */
-      m=owl_malloc(sizeof(owl_message));
+      m=owl_message_new();
       owl_message_create_from_znotice(m, &notice);
 
       owl_global_messagequeue_addmsg(&g, m);


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