mirror of
https://git.notmuchmail.org/git/notmuch
synced 2024-11-28 05:34:11 +01:00
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).
This commit is contained in:
parent
c8598d9a99
commit
12de016686
4 changed files with 119 additions and 13 deletions
|
@ -63,6 +63,7 @@ typedef struct notmuch_show_format {
|
||||||
const char *header_start;
|
const char *header_start;
|
||||||
void (*header) (const void *ctx,
|
void (*header) (const void *ctx,
|
||||||
notmuch_message_t *message);
|
notmuch_message_t *message);
|
||||||
|
void (*header_message_part) (GMimeMessage *message);
|
||||||
const char *header_end;
|
const char *header_end;
|
||||||
const char *body_start;
|
const char *body_start;
|
||||||
void (*part_start) (GMimeObject *part,
|
void (*part_start) (GMimeObject *part,
|
||||||
|
|
|
@ -24,13 +24,16 @@
|
||||||
#include "gmime-filter-reply.h"
|
#include "gmime-filter-reply.h"
|
||||||
#include "gmime-filter-headers.h"
|
#include "gmime-filter-headers.h"
|
||||||
|
|
||||||
|
static void
|
||||||
|
reply_headers_message_part (GMimeMessage *message);
|
||||||
|
|
||||||
static void
|
static void
|
||||||
reply_part_content (GMimeObject *part);
|
reply_part_content (GMimeObject *part);
|
||||||
|
|
||||||
static const notmuch_show_format_t format_reply = {
|
static const notmuch_show_format_t format_reply = {
|
||||||
"",
|
"",
|
||||||
"", NULL,
|
"", NULL,
|
||||||
"", NULL, "",
|
"", NULL, reply_headers_message_part, ">\n",
|
||||||
"",
|
"",
|
||||||
NULL,
|
NULL,
|
||||||
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
|
static void
|
||||||
reply_part_content (GMimeObject *part)
|
reply_part_content (GMimeObject *part)
|
||||||
{
|
{
|
||||||
|
@ -95,6 +120,10 @@ reply_part_content (GMimeObject *part)
|
||||||
if (stream_stdout)
|
if (stream_stdout)
|
||||||
g_object_unref(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
|
else
|
||||||
{
|
{
|
||||||
if (disposition &&
|
if (disposition &&
|
||||||
|
|
|
@ -28,6 +28,9 @@ static void
|
||||||
format_headers_text (const void *ctx,
|
format_headers_text (const void *ctx,
|
||||||
notmuch_message_t *message);
|
notmuch_message_t *message);
|
||||||
|
|
||||||
|
static void
|
||||||
|
format_headers_message_part_text (GMimeMessage *message);
|
||||||
|
|
||||||
static void
|
static void
|
||||||
format_part_start_text (GMimeObject *part,
|
format_part_start_text (GMimeObject *part,
|
||||||
int *part_count);
|
int *part_count);
|
||||||
|
@ -41,7 +44,7 @@ format_part_end_text (GMimeObject *part);
|
||||||
static const notmuch_show_format_t format_text = {
|
static const notmuch_show_format_t format_text = {
|
||||||
"",
|
"",
|
||||||
"\fmessage{ ", format_message_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",
|
"\fbody{\n",
|
||||||
format_part_start_text,
|
format_part_start_text,
|
||||||
NULL,
|
NULL,
|
||||||
|
@ -62,6 +65,9 @@ static void
|
||||||
format_headers_json (const void *ctx,
|
format_headers_json (const void *ctx,
|
||||||
notmuch_message_t *message);
|
notmuch_message_t *message);
|
||||||
|
|
||||||
|
static void
|
||||||
|
format_headers_message_part_json (GMimeMessage *message);
|
||||||
|
|
||||||
static void
|
static void
|
||||||
format_part_start_json (unused (GMimeObject *part),
|
format_part_start_json (unused (GMimeObject *part),
|
||||||
int *part_count);
|
int *part_count);
|
||||||
|
@ -81,7 +87,7 @@ format_part_end_json (GMimeObject *part);
|
||||||
static const notmuch_show_format_t format_json = {
|
static const notmuch_show_format_t format_json = {
|
||||||
"[",
|
"[",
|
||||||
"{", format_message_json,
|
"{", format_message_json,
|
||||||
", \"headers\": {", format_headers_json, "}",
|
"\"headers\": {", format_headers_json, format_headers_message_part_json, "}",
|
||||||
", \"body\": [",
|
", \"body\": [",
|
||||||
format_part_start_json,
|
format_part_start_json,
|
||||||
format_part_encstatus_json,
|
format_part_encstatus_json,
|
||||||
|
@ -102,7 +108,7 @@ format_message_mbox (const void *ctx,
|
||||||
static const notmuch_show_format_t format_mbox = {
|
static const notmuch_show_format_t format_mbox = {
|
||||||
"",
|
"",
|
||||||
"", format_message_mbox,
|
"", format_message_mbox,
|
||||||
"", NULL, "",
|
"", NULL, NULL, "",
|
||||||
"",
|
"",
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
|
@ -121,7 +127,7 @@ format_part_content_raw (GMimeObject *part);
|
||||||
static const notmuch_show_format_t format_raw = {
|
static const notmuch_show_format_t format_raw = {
|
||||||
"",
|
"",
|
||||||
"", NULL,
|
"", NULL,
|
||||||
"", NULL, "",
|
"", NULL, format_headers_message_part_text, "\n",
|
||||||
"",
|
"",
|
||||||
NULL,
|
NULL,
|
||||||
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)));
|
json_quote_str (ctx_quote, notmuch_tags_get (tags)));
|
||||||
first = 0;
|
first = 0;
|
||||||
}
|
}
|
||||||
printf("]");
|
printf("], ");
|
||||||
talloc_free (ctx_quote);
|
talloc_free (ctx_quote);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -326,6 +332,7 @@ format_message_mbox (const void *ctx,
|
||||||
fclose (file);
|
fclose (file);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
format_headers_text (const void *ctx, notmuch_message_t *message)
|
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
|
static void
|
||||||
format_headers_json (const void *ctx, notmuch_message_t *message)
|
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);
|
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.
|
/* Write a MIME text part out to the given stream.
|
||||||
*
|
*
|
||||||
* Both line-ending conversion (CRLF->LF) and charset conversion ( ->
|
* 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));
|
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", "*") ||
|
else if (g_mime_content_type_is_type (content_type, "multipart", "*"))
|
||||||
g_mime_content_type_is_type (content_type, "message", "rfc822"))
|
|
||||||
{
|
{
|
||||||
printf (", \"content\": [");
|
printf (", \"content\": [");
|
||||||
}
|
}
|
||||||
|
else if (g_mime_content_type_is_type (content_type, "message", "rfc822"))
|
||||||
|
{
|
||||||
|
printf (", \"content\": [{");
|
||||||
|
}
|
||||||
|
|
||||||
talloc_free (ctx);
|
talloc_free (ctx);
|
||||||
if (stream_memory)
|
if (stream_memory)
|
||||||
|
@ -630,13 +695,12 @@ format_part_content_json (GMimeObject *part)
|
||||||
static void
|
static void
|
||||||
format_part_end_json (GMimeObject *part)
|
format_part_end_json (GMimeObject *part)
|
||||||
{
|
{
|
||||||
GMimeContentType *content_type;
|
GMimeContentType *content_type = g_mime_object_get_content_type (GMIME_OBJECT (part));
|
||||||
|
|
||||||
content_type = g_mime_object_get_content_type (GMIME_OBJECT (part));
|
if (g_mime_content_type_is_type (content_type, "multipart", "*"))
|
||||||
|
|
||||||
if (g_mime_content_type_is_type (content_type, "multipart", "*") ||
|
|
||||||
g_mime_content_type_is_type (content_type, "message", "rfc822"))
|
|
||||||
printf ("]");
|
printf ("]");
|
||||||
|
else if (g_mime_content_type_is_type (content_type, "message", "rfc822"))
|
||||||
|
printf ("}]");
|
||||||
|
|
||||||
printf ("}");
|
printf ("}");
|
||||||
}
|
}
|
||||||
|
|
|
@ -149,9 +149,21 @@ show_message_part (GMimeObject *part,
|
||||||
if (selected)
|
if (selected)
|
||||||
state->in_zone = 1;
|
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),
|
show_message_part (g_mime_message_get_mime_part (mime_message),
|
||||||
state, format, params, TRUE);
|
state, format, params, TRUE);
|
||||||
|
|
||||||
|
if (selected || (!selected && state->in_zone))
|
||||||
|
fputs (format->body_end, stdout);
|
||||||
|
|
||||||
if (selected)
|
if (selected)
|
||||||
state->in_zone = 0;
|
state->in_zone = 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue