]> git.notmuchmail.org Git - notmuch/commitdiff
Improve handling of message/rfc822 parts by adding a new header_message_part function...
authorJameson Graef Rollins <jrollins@finestructure.net>
Mon, 6 Jun 2011 00:29:28 +0000 (17:29 -0700)
committerDavid Bremner <bremner@debian.org>
Tue, 6 Sep 2011 01:58:52 +0000 (22:58 -0300)
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).

notmuch-client.h
notmuch-reply.c
notmuch-show.c
show-message.c

index 63be33741a212ac2ed03434418373c1481faff76..b50cb38b335afe819b989f2e94d9be2c5492c7ba 100644 (file)
@@ -63,6 +63,7 @@ typedef struct notmuch_show_format {
     const char *header_start;
     void (*header) (const void *ctx,
                    notmuch_message_t *message);
+    void (*header_message_part) (GMimeMessage *message);
     const char *header_end;
     const char *body_start;
     void (*part_start) (GMimeObject *part,
index 362e19872f6061192fbf2280f45ae7fd4eb8019f..f4b1a61b7f34410f5e79a8b82af5aceda15cb41c 100644 (file)
 #include "gmime-filter-reply.h"
 #include "gmime-filter-headers.h"
 
+static void
+reply_headers_message_part (GMimeMessage *message);
+
 static void
 reply_part_content (GMimeObject *part);
 
 static const notmuch_show_format_t format_reply = {
     "",
        "", NULL,
-           "", NULL, "",
+           "", NULL, reply_headers_message_part, ">\n",
            "",
                NULL,
                NULL,
@@ -62,6 +65,28 @@ show_reply_headers (GMimeMessage *message)
     }
 }
 
+static void
+reply_headers_message_part (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
 reply_part_content (GMimeObject *part)
 {
@@ -95,6 +120,10 @@ reply_part_content (GMimeObject *part)
        if (stream_stdout)
            g_object_unref(stream_stdout);
     }
+    else if (g_mime_content_type_is_type (content_type, "message", "rfc822"))
+    {
+       /* Output nothing, since rfc822 subparts will be handled individually. */
+    }
     else
     {
        if (disposition &&
index fb7430081f2600cbf3747652b227c182866553e2..dbb1efb97f5954438d6d274f8bc5b7fb9cfb68c9 100644 (file)
@@ -28,6 +28,9 @@ static void
 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,
@@ -62,6 +65,9 @@ static void
 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)
 {
@@ -345,6 +352,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)
 {
@@ -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 ("}");
 }
index 7a4bbc25807981f2772c3eb6916f73a83811345b..d83f04ecc553264bd42b28867e5154c33966b4f2 100644 (file)
@@ -149,9 +149,21 @@ show_message_part (GMimeObject *part,
        if (selected)
            state->in_zone = 1;
 
+       if (selected || (!selected && state->in_zone)) {
+           fputs (format->header_start, stdout);
+           if (format->header_message_part)
+               format->header_message_part (mime_message);
+           fputs (format->header_end, stdout);
+
+           fputs (format->body_start, stdout);
+       }
+
        show_message_part (g_mime_message_get_mime_part (mime_message),
                           state, format, params, TRUE);
 
+       if (selected || (!selected && state->in_zone))
+           fputs (format->body_end, stdout);
+
        if (selected)
            state->in_zone = 0;
     }