aboutsummaryrefslogtreecommitdiffhomepage
path: root/notmuch-show.c
diff options
context:
space:
mode:
authorGravatar Jameson Graef Rollins <jrollins@finestructure.net>2011-06-05 17:29:28 -0700
committerGravatar David Bremner <bremner@debian.org>2011-09-05 22:58:52 -0300
commit12de016686351b78631546299ed35cced01f1e77 (patch)
tree8ef581a63a329005a8b4681a060ba4e86bc531aa /notmuch-show.c
parentc8598d9a99ca003cd905b4b28d16bda2b9ca785b (diff)
Improve handling of message/rfc822 parts by adding a new header_message_part function to the formating structure.
This new function takes a GMimeMessage as input, and outputs the formatted headers. This allows for message/rfc822 parts to be formatted on output in a similar way to full messages (see previous patch that overhauls the multipart test for more info).
Diffstat (limited to 'notmuch-show.c')
-rw-r--r--notmuch-show.c88
1 files changed, 76 insertions, 12 deletions
diff --git a/notmuch-show.c b/notmuch-show.c
index fb743008..dbb1efb9 100644
--- a/notmuch-show.c
+++ b/notmuch-show.c
@@ -29,6 +29,9 @@ format_headers_text (const void *ctx,
notmuch_message_t *message);
static void
+format_headers_message_part_text (GMimeMessage *message);
+
+static void
format_part_start_text (GMimeObject *part,
int *part_count);
@@ -41,7 +44,7 @@ format_part_end_text (GMimeObject *part);
static const notmuch_show_format_t format_text = {
"",
"\fmessage{ ", format_message_text,
- "\fheader{\n", format_headers_text, "\fheader}\n",
+ "\fheader{\n", format_headers_text, format_headers_message_part_text, "\fheader}\n",
"\fbody{\n",
format_part_start_text,
NULL,
@@ -63,6 +66,9 @@ format_headers_json (const void *ctx,
notmuch_message_t *message);
static void
+format_headers_message_part_json (GMimeMessage *message);
+
+static void
format_part_start_json (unused (GMimeObject *part),
int *part_count);
@@ -81,7 +87,7 @@ format_part_end_json (GMimeObject *part);
static const notmuch_show_format_t format_json = {
"[",
"{", format_message_json,
- ", \"headers\": {", format_headers_json, "}",
+ "\"headers\": {", format_headers_json, format_headers_message_part_json, "}",
", \"body\": [",
format_part_start_json,
format_part_encstatus_json,
@@ -102,7 +108,7 @@ format_message_mbox (const void *ctx,
static const notmuch_show_format_t format_mbox = {
"",
"", format_message_mbox,
- "", NULL, "",
+ "", NULL, NULL, "",
"",
NULL,
NULL,
@@ -121,7 +127,7 @@ format_part_content_raw (GMimeObject *part);
static const notmuch_show_format_t format_raw = {
"",
"", NULL,
- "", NULL, "",
+ "", NULL, format_headers_message_part_text, "\n",
"",
NULL,
NULL,
@@ -216,7 +222,7 @@ format_message_json (const void *ctx, notmuch_message_t *message, unused (int in
json_quote_str (ctx_quote, notmuch_tags_get (tags)));
first = 0;
}
- printf("]");
+ printf("], ");
talloc_free (ctx_quote);
}
@@ -326,6 +332,7 @@ format_message_mbox (const void *ctx,
fclose (file);
}
+
static void
format_headers_text (const void *ctx, notmuch_message_t *message)
{
@@ -346,6 +353,27 @@ format_headers_text (const void *ctx, notmuch_message_t *message)
}
static void
+format_headers_message_part_text (GMimeMessage *message)
+{
+ InternetAddressList *recipients;
+ const char *recipients_string;
+
+ printf ("From: %s\n", g_mime_message_get_sender (message));
+ recipients = g_mime_message_get_recipients (message, GMIME_RECIPIENT_TYPE_TO);
+ recipients_string = internet_address_list_to_string (recipients, 0);
+ if (recipients_string)
+ printf ("To: %s\n",
+ recipients_string);
+ recipients = g_mime_message_get_recipients (message, GMIME_RECIPIENT_TYPE_CC);
+ recipients_string = internet_address_list_to_string (recipients, 0);
+ if (recipients_string)
+ printf ("Cc: %s\n",
+ recipients_string);
+ printf ("Subject: %s\n", g_mime_message_get_subject (message));
+ printf ("Date: %s\n", g_mime_message_get_date_as_string (message));
+}
+
+static void
format_headers_json (const void *ctx, notmuch_message_t *message)
{
const char *headers[] = {
@@ -374,6 +402,40 @@ format_headers_json (const void *ctx, notmuch_message_t *message)
talloc_free (ctx_quote);
}
+static void
+format_headers_message_part_json (GMimeMessage *message)
+{
+ void *ctx = talloc_new (NULL);
+ void *ctx_quote = talloc_new (ctx);
+ InternetAddressList *recipients;
+ const char *recipients_string;
+
+ printf ("%s: %s",
+ json_quote_str (ctx_quote, "From"),
+ json_quote_str (ctx_quote, g_mime_message_get_sender (message)));
+ recipients = g_mime_message_get_recipients (message, GMIME_RECIPIENT_TYPE_TO);
+ recipients_string = internet_address_list_to_string (recipients, 0);
+ if (recipients_string)
+ printf (", %s: %s",
+ json_quote_str (ctx_quote, "To"),
+ json_quote_str (ctx_quote, recipients_string));
+ recipients = g_mime_message_get_recipients (message, GMIME_RECIPIENT_TYPE_CC);
+ recipients_string = internet_address_list_to_string (recipients, 0);
+ if (recipients_string)
+ printf (", %s: %s",
+ json_quote_str (ctx_quote, "Cc"),
+ json_quote_str (ctx_quote, recipients_string));
+ printf (", %s: %s",
+ json_quote_str (ctx_quote, "Subject"),
+ json_quote_str (ctx_quote, g_mime_message_get_subject (message)));
+ printf (", %s: %s",
+ json_quote_str (ctx_quote, "Date"),
+ json_quote_str (ctx_quote, g_mime_message_get_date_as_string (message)));
+
+ talloc_free (ctx_quote);
+ talloc_free (ctx);
+}
+
/* Write a MIME text part out to the given stream.
*
* Both line-ending conversion (CRLF->LF) and charset conversion ( ->
@@ -616,11 +678,14 @@ format_part_content_json (GMimeObject *part)
printf (", \"content\": %s", json_quote_chararray (ctx, (char *) part_content->data, part_content->len));
}
- else if (g_mime_content_type_is_type (content_type, "multipart", "*") ||
- g_mime_content_type_is_type (content_type, "message", "rfc822"))
+ else if (g_mime_content_type_is_type (content_type, "multipart", "*"))
{
printf (", \"content\": [");
}
+ else if (g_mime_content_type_is_type (content_type, "message", "rfc822"))
+ {
+ printf (", \"content\": [{");
+ }
talloc_free (ctx);
if (stream_memory)
@@ -630,13 +695,12 @@ format_part_content_json (GMimeObject *part)
static void
format_part_end_json (GMimeObject *part)
{
- GMimeContentType *content_type;
-
- content_type = g_mime_object_get_content_type (GMIME_OBJECT (part));
+ GMimeContentType *content_type = g_mime_object_get_content_type (GMIME_OBJECT (part));
- if (g_mime_content_type_is_type (content_type, "multipart", "*") ||
- g_mime_content_type_is_type (content_type, "message", "rfc822"))
+ if (g_mime_content_type_is_type (content_type, "multipart", "*"))
printf ("]");
+ else if (g_mime_content_type_is_type (content_type, "message", "rfc822"))
+ printf ("}]");
printf ("}");
}