[PATCH v2 1/3] Add 'compose' command

Felipe Contreras felipe.contreras at gmail.com
Wed Apr 18 05:39:11 PDT 2012


Signed-off-by: Felipe Contreras <felipe.contreras at ngmail.com>
---
 Makefile.local    |    1 +
 notmuch-client.h  |    3 ++
 notmuch-compose.c |  111 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 notmuch.c         |    5 +++
 4 files changed, 120 insertions(+)
 create mode 100644 notmuch-compose.c

diff --git a/Makefile.local b/Makefile.local
index 53b4a0d..2c15ec2 100644
--- a/Makefile.local
+++ b/Makefile.local
@@ -279,6 +279,7 @@ notmuch_client_srcs =		\
 	gmime-filter-headers.c	\
 	hooks.c			\
 	notmuch.c		\
+	notmuch-compose.c	\
 	notmuch-config.c	\
 	notmuch-count.c		\
 	notmuch-dump.c		\
diff --git a/notmuch-client.h b/notmuch-client.h
index 19b7f01..1146cd1 100644
--- a/notmuch-client.h
+++ b/notmuch-client.h
@@ -126,6 +126,9 @@ int
 notmuch_reply_command (void *ctx, int argc, char *argv[]);
 
 int
+notmuch_compose_command (void *ctx, int argc, char *argv[]);
+
+int
 notmuch_restore_command (void *ctx, int argc, char *argv[]);
 
 int
diff --git a/notmuch-compose.c b/notmuch-compose.c
new file mode 100644
index 0000000..ac5ea95
--- /dev/null
+++ b/notmuch-compose.c
@@ -0,0 +1,111 @@
+/* notmuch - Not much of an email program, (just index and search)
+ *
+ * Copyright © 2009 Carl Worth
+ * Copyright © 2009 Keith Packard
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see http://www.gnu.org/licenses/ .
+ *
+ * Authors: Carl Worth <cworth at cworth.org>
+ *	    Keith Packard <keithp at keithp.com>
+ *	    Felipe Contreras <felipe.contreras at gmail.com>
+ */
+
+#include "notmuch-client.h"
+#include "gmime-filter-headers.h"
+
+static void
+show_message_headers (GMimeMessage *message)
+{
+    GMimeStream *stream_stdout = NULL, *stream_filter = NULL;
+
+    stream_stdout = g_mime_stream_file_new (stdout);
+    if (stream_stdout) {
+	g_mime_stream_file_set_owner (GMIME_STREAM_FILE (stream_stdout), FALSE);
+	stream_filter = g_mime_stream_filter_new(stream_stdout);
+	if (stream_filter) {
+		g_mime_stream_filter_add(GMIME_STREAM_FILTER(stream_filter),
+					 g_mime_filter_headers_new());
+		g_mime_object_write_to_stream(GMIME_OBJECT(message), stream_filter);
+		g_object_unref(stream_filter);
+	}
+	g_object_unref(stream_stdout);
+    }
+}
+
+static int
+notmuch_compose (void *ctx, notmuch_config_t *config)
+{
+    GMimeMessage *msg;
+    const char *from_addr = NULL;
+    const char *message_id, *user_agent;
+    char *simple_from;
+
+    /* The 1 means we want headers in a "pretty" order. */
+    msg = g_mime_message_new (1);
+    if (msg == NULL) {
+	fprintf (stderr, "Out of memory\n");
+	return 1;
+    }
+
+    g_mime_message_set_subject (msg, "");
+
+    g_mime_object_set_header (GMIME_OBJECT (msg), "To", "");
+
+    if (from_addr == NULL)
+	from_addr = notmuch_config_get_user_primary_email (config);
+
+    simple_from = talloc_strdup (ctx, from_addr);
+
+    from_addr = talloc_asprintf (ctx, "%s <%s>",
+				 notmuch_config_get_user_name (config),
+				 from_addr);
+    g_mime_object_set_header (GMIME_OBJECT (msg),
+			      "From", from_addr);
+
+    g_mime_object_set_header (GMIME_OBJECT (msg), "Bcc",
+			      notmuch_config_get_user_primary_email (config));
+
+    user_agent = talloc_asprintf (ctx, "notmuch %s",
+				  STRINGIFY(NOTMUCH_VERSION));
+    g_mime_object_set_header (GMIME_OBJECT (msg),
+			      "User-Agent", user_agent);
+
+    message_id = talloc_asprintf (ctx, "<%lu-notmuch-%s>",
+				  time(NULL),
+				  simple_from);
+    g_mime_object_set_header (GMIME_OBJECT (msg),
+			      "Message-ID", message_id);
+    talloc_free (simple_from);
+
+    show_message_headers (msg);
+
+    g_object_unref (G_OBJECT (msg));
+
+    return 0;
+}
+
+int
+notmuch_compose_command (void *ctx, unused (int argc), unused (char *argv[]))
+{
+    notmuch_config_t *config;
+    int ret = 0;
+
+    config = notmuch_config_open (ctx, NULL, NULL);
+    if (config == NULL)
+	return 1;
+
+    ret = notmuch_compose (ctx, config);
+
+    return ret;
+}
diff --git a/notmuch.c b/notmuch.c
index 477a09c..2b500d7 100644
--- a/notmuch.c
+++ b/notmuch.c
@@ -65,6 +65,11 @@ static command_t commands[] = {
     { "reply", notmuch_reply_command,
       "[options...] <search-terms> [...]",
       "Construct a reply template for a set of messages." },
+    { "compose", notmuch_compose_command,
+	NULL,
+	"Constructs an empty message.",
+	"\tConstructs a new empty message filling basic headers such as\n"
+	"\tFrom:, User-Agent: and Message-ID:." },
     { "tag", notmuch_tag_command,
       "+<tag>|-<tag> [...] [--] <search-terms> [...]" ,
       "Add/remove tags for all messages matching the search terms." },
-- 
1.7.10



More information about the notmuch mailing list