[2822] in BarnOwl Developers
[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