[2822] in BarnOwl Developers

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

[PATCH] Build reply commands from scratch on outgoing zwrites

daemon@ATHENA.MIT.EDU (David Benjamin)
Wed Dec 15 02:29:16 2010

From: David Benjamin <davidben@MIT.EDU>
To: barnowl-dev@mit.edu
Date: Wed, 15 Dec 2010 02:29:09 -0500
In-Reply-To: <1292398149-9937-1-git-send-email-davidben@mit.edu>

We currently reuse the original zwrite line which is problematic when
the user passed -m. Instead regenerates the zwrite line from the
parsed owl_zwrite.
---
 message.c                          |   18 ++++++++++++++
 perl/lib/BarnOwl/Message/Zephyr.pm |    2 +-
 zwrite.c                           |   45 ++++++++++++++++++++++++++++++++++++
 3 files changed, 64 insertions(+), 1 deletions(-)

diff --git a/message.c b/message.c
index 2ab9051..8aab470 100644
--- a/message.c
+++ b/message.c
@@ -483,6 +483,18 @@ void owl_message_set_zwriteline(owl_message *m, const char *line)
   owl_message_set_attribute(m, "zwriteline", line);
 }
 
+const char *owl_message_get_replyline(const owl_message *m)
+{
+  const char *z = owl_message_get_attribute_value(m, "replyline");
+  if (!z) return "";
+  return z;
+}
+
+void owl_message_set_replyline(owl_message *m, const char *line)
+{
+  owl_message_set_attribute(m, "replyline", line);
+}
+
 int owl_message_is_delete(const owl_message *m)
 {
   if (m == NULL) return(0);
@@ -963,6 +975,7 @@ void owl_message_create_from_zwrite(owl_message *m, const owl_zwrite *z, const c
 {
   int ret;
   char hostbuff[5000];
+  char *replyline;
   
   owl_message_init(m);
 
@@ -983,6 +996,11 @@ void owl_message_create_from_zwrite(owl_message *m, const owl_zwrite *z, const c
   if(z->zwriteline) {
     owl_message_set_zwriteline(m, z->zwriteline);
   }
+
+  replyline = owl_zwrite_get_replyline(z);
+  owl_message_set_replyline(m, replyline);
+  owl_free(replyline);
+
   owl_message_set_body(m, body);
   owl_message_set_zsig(m, owl_zwrite_get_zsig(z));
   
diff --git a/perl/lib/BarnOwl/Message/Zephyr.pm b/perl/lib/BarnOwl/Message/Zephyr.pm
index 83fabba..94a309d 100644
--- a/perl/lib/BarnOwl/Message/Zephyr.pm
+++ b/perl/lib/BarnOwl/Message/Zephyr.pm
@@ -137,7 +137,7 @@ sub replycmd {
     $sender = 0 unless defined $sender;
     my ($class, $instance, $to, $cc);
     if($self->is_outgoing) {
-        return $self->{zwriteline};
+        return $self->{replyline};
     }
 
     if($sender && $self->opcode eq WEBZEPHYR_OPCODE) {
diff --git a/zwrite.c b/zwrite.c
index 3412ef8..7d7d480 100644
--- a/zwrite.c
+++ b/zwrite.c
@@ -389,3 +389,48 @@ void owl_zwrite_cleanup(owl_zwrite *z)
   if (z->message) owl_free(z->message);
   if (z->zsig) owl_free(z->zsig);
 }
+
+/*
+ * Returns a zwrite line suitable for replying, specifically the
+ * message field is stripped out. Result should be freed with
+ * owl_free.
+ */
+char *owl_zwrite_get_replyline(const owl_zwrite *z)
+{
+  /* Match ordering in zwrite help. */
+  GString *buf = g_string_new("");
+  int i;
+
+  /* Disturbingly, it is apparently possible to z->cmd to be null if
+   * owl_zwrite_create_from_line got something starting with -. And we
+   * can't kill it because this is exported to perl. */
+  owl_string_append_quoted_arg(buf, z->cmd ? z->cmd : "zwrite");
+  if (z->noping) {
+    g_string_append(buf, " -n");
+  }
+  if (z->cc) {
+    g_string_append(buf, " -C");
+  }
+  if (strcmp(z->class, "message")) {
+    g_string_append(buf, " -c ");
+    owl_string_append_quoted_arg(buf, z->class);
+  }
+  if (strcmp(z->inst, "personal")) {
+    g_string_append(buf, " -i ");
+    owl_string_append_quoted_arg(buf, z->inst);
+  }
+  if (z->realm && z->realm[0] != '\0') {
+    g_string_append(buf, " -r ");
+    owl_string_append_quoted_arg(buf, z->realm);
+  }
+  if (z->opcode && z->opcode[0] != '\0') {
+    g_string_append(buf, " -O ");
+    owl_string_append_quoted_arg(buf, z->opcode);
+  }
+  for (i = 0; i < owl_list_get_size(&(z->recips)); i++) {
+    g_string_append_c(buf, ' ');
+    owl_string_append_quoted_arg(buf, owl_list_get_element(&(z->recips), i));
+  }
+
+  return g_string_free(buf, FALSE);
+}
-- 
1.7.3.3.399.g06ddf


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