mirror of
https://git.notmuchmail.org/git/notmuch
synced 2024-11-21 18:38:08 +01:00
Break up format->part function into part_start and part_content functions.
Future improvements (eg. crypto support) will require adding new part header. By breaking up the output of part headers from the output of part content, we can easily out new part headers with new formatting functions.
This commit is contained in:
parent
757e06f74b
commit
d92146d3a6
4 changed files with 86 additions and 60 deletions
|
@ -65,8 +65,9 @@ typedef struct notmuch_show_format {
|
|||
notmuch_message_t *message);
|
||||
const char *header_end;
|
||||
const char *body_start;
|
||||
void (*part) (GMimeObject *part,
|
||||
void (*part_start) (GMimeObject *part,
|
||||
int *part_count);
|
||||
void (*part_content) (GMimeObject *part);
|
||||
void (*part_end) (GMimeObject *part);
|
||||
const char *part_sep;
|
||||
const char *body_end;
|
||||
|
|
|
@ -25,14 +25,18 @@
|
|||
#include "gmime-filter-headers.h"
|
||||
|
||||
static void
|
||||
reply_part (GMimeObject *part,
|
||||
unused (int *part_count));
|
||||
reply_part_content (GMimeObject *part);
|
||||
|
||||
static const notmuch_show_format_t format_reply = {
|
||||
"",
|
||||
"", NULL,
|
||||
"", NULL, "",
|
||||
"", reply_part, NULL, "", "",
|
||||
"",
|
||||
NULL,
|
||||
reply_part_content,
|
||||
NULL,
|
||||
"",
|
||||
"",
|
||||
"", "",
|
||||
""
|
||||
};
|
||||
|
@ -57,8 +61,7 @@ show_reply_headers (GMimeMessage *message)
|
|||
}
|
||||
|
||||
static void
|
||||
reply_part (GMimeObject *part,
|
||||
unused (int *part_count))
|
||||
reply_part_content (GMimeObject *part)
|
||||
{
|
||||
GMimeContentType *content_type = g_mime_object_get_content_type (GMIME_OBJECT (part));
|
||||
GMimeContentDisposition *disposition = g_mime_object_get_content_disposition (part);
|
||||
|
|
122
notmuch-show.c
122
notmuch-show.c
|
@ -29,9 +29,12 @@ format_headers_text (const void *ctx,
|
|||
notmuch_message_t *message);
|
||||
|
||||
static void
|
||||
format_part_text (GMimeObject *part,
|
||||
format_part_start_text (GMimeObject *part,
|
||||
int *part_count);
|
||||
|
||||
static void
|
||||
format_part_content_text (GMimeObject *part);
|
||||
|
||||
static void
|
||||
format_part_end_text (GMimeObject *part);
|
||||
|
||||
|
@ -39,7 +42,12 @@ static const notmuch_show_format_t format_text = {
|
|||
"",
|
||||
"\fmessage{ ", format_message_text,
|
||||
"\fheader{\n", format_headers_text, "\fheader}\n",
|
||||
"\fbody{\n", format_part_text, format_part_end_text, "", "\fbody}\n",
|
||||
"\fbody{\n",
|
||||
format_part_start_text,
|
||||
format_part_content_text,
|
||||
format_part_end_text,
|
||||
"",
|
||||
"\fbody}\n",
|
||||
"\fmessage}\n", "",
|
||||
""
|
||||
};
|
||||
|
@ -53,9 +61,12 @@ format_headers_json (const void *ctx,
|
|||
notmuch_message_t *message);
|
||||
|
||||
static void
|
||||
format_part_json (GMimeObject *part,
|
||||
format_part_start_json (unused (GMimeObject *part),
|
||||
int *part_count);
|
||||
|
||||
static void
|
||||
format_part_content_json (GMimeObject *part);
|
||||
|
||||
static void
|
||||
format_part_end_json (GMimeObject *part);
|
||||
|
||||
|
@ -63,7 +74,12 @@ static const notmuch_show_format_t format_json = {
|
|||
"[",
|
||||
"{", format_message_json,
|
||||
", \"headers\": {", format_headers_json, "}",
|
||||
", \"body\": [", format_part_json, format_part_end_json, ", ", "]",
|
||||
", \"body\": [",
|
||||
format_part_start_json,
|
||||
format_part_content_json,
|
||||
format_part_end_json,
|
||||
", ",
|
||||
"]",
|
||||
"}", ", ",
|
||||
"]"
|
||||
};
|
||||
|
@ -77,20 +93,29 @@ static const notmuch_show_format_t format_mbox = {
|
|||
"",
|
||||
"", format_message_mbox,
|
||||
"", NULL, "",
|
||||
"", NULL, NULL, "", "",
|
||||
"",
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
"",
|
||||
"",
|
||||
"", "",
|
||||
""
|
||||
};
|
||||
|
||||
static void
|
||||
format_part_raw (GMimeObject *part,
|
||||
unused (int *part_count));
|
||||
format_part_content_raw (GMimeObject *part);
|
||||
|
||||
static const notmuch_show_format_t format_raw = {
|
||||
"",
|
||||
"", NULL,
|
||||
"", NULL, "",
|
||||
"", format_part_raw, NULL, "", "",
|
||||
"",
|
||||
NULL,
|
||||
format_part_content_raw,
|
||||
NULL,
|
||||
"",
|
||||
"",
|
||||
"", "",
|
||||
""
|
||||
};
|
||||
|
@ -372,46 +397,41 @@ show_part_content (GMimeObject *part, GMimeStream *stream_out)
|
|||
}
|
||||
|
||||
static void
|
||||
format_part_text (GMimeObject *part, int *part_count)
|
||||
format_part_start_text (GMimeObject *part, int *part_count)
|
||||
{
|
||||
GMimeContentDisposition *disposition;
|
||||
GMimeContentType *content_type;
|
||||
GMimeContentDisposition *disposition = g_mime_object_get_content_disposition (part);
|
||||
|
||||
if (disposition &&
|
||||
strcmp (disposition->disposition, GMIME_DISPOSITION_ATTACHMENT) == 0)
|
||||
{
|
||||
printf ("\fattachment{ ID: %d", *part_count);
|
||||
|
||||
} else {
|
||||
|
||||
printf ("\fpart{ ID: %d", *part_count);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
format_part_content_text (GMimeObject *part)
|
||||
{
|
||||
GMimeContentDisposition *disposition = g_mime_object_get_content_disposition (part);
|
||||
GMimeContentType *content_type = g_mime_object_get_content_type (GMIME_OBJECT (part));
|
||||
GMimeStream *stream_stdout = g_mime_stream_file_new (stdout);
|
||||
|
||||
printf (", Content-type: %s\n", g_mime_content_type_to_string (content_type));
|
||||
|
||||
disposition = g_mime_object_get_content_disposition (part);
|
||||
if (disposition &&
|
||||
strcmp (disposition->disposition, GMIME_DISPOSITION_ATTACHMENT) == 0)
|
||||
{
|
||||
const char *filename = g_mime_part_get_filename (GMIME_PART (part));
|
||||
content_type = g_mime_object_get_content_type (GMIME_OBJECT (part));
|
||||
|
||||
printf ("\fattachment{ ID: %d, Content-type: %s\n",
|
||||
*part_count,
|
||||
g_mime_content_type_to_string (content_type));
|
||||
printf ("Attachment: %s (%s)\n", filename,
|
||||
g_mime_content_type_to_string (content_type));
|
||||
}
|
||||
|
||||
if (g_mime_content_type_is_type (content_type, "text", "*") &&
|
||||
!g_mime_content_type_is_type (content_type, "text", "html"))
|
||||
{
|
||||
GMimeStream *stream_stdout = g_mime_stream_file_new (stdout);
|
||||
g_mime_stream_file_set_owner (GMIME_STREAM_FILE (stream_stdout), FALSE);
|
||||
show_part_content (part, stream_stdout);
|
||||
g_object_unref(stream_stdout);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
content_type = g_mime_object_get_content_type (GMIME_OBJECT (part));
|
||||
|
||||
printf ("\fpart{ ID: %d, Content-type: %s\n",
|
||||
*part_count,
|
||||
g_mime_content_type_to_string (content_type));
|
||||
|
||||
if (g_mime_content_type_is_type (content_type, "text", "*") &&
|
||||
!g_mime_content_type_is_type (content_type, "text", "html"))
|
||||
{
|
||||
GMimeStream *stream_stdout = g_mime_stream_file_new (stdout);
|
||||
g_mime_stream_file_set_owner (GMIME_STREAM_FILE (stream_stdout), FALSE);
|
||||
show_part_content (part, stream_stdout);
|
||||
g_object_unref(stream_stdout);
|
||||
|
@ -447,27 +467,27 @@ format_part_end_text (GMimeObject *part)
|
|||
}
|
||||
|
||||
static void
|
||||
format_part_json (GMimeObject *part, int *part_count)
|
||||
format_part_start_json (unused (GMimeObject *part), int *part_count)
|
||||
{
|
||||
GMimeContentType *content_type;
|
||||
GMimeContentDisposition *disposition;
|
||||
void *ctx = talloc_new (NULL);
|
||||
printf ("{\"id\": %d", *part_count);
|
||||
}
|
||||
|
||||
static void
|
||||
format_part_content_json (GMimeObject *part)
|
||||
{
|
||||
GMimeContentType *content_type = g_mime_object_get_content_type (GMIME_OBJECT (part));
|
||||
GMimeStream *stream_memory = g_mime_stream_mem_new ();
|
||||
const char *cid = g_mime_object_get_content_id (part);
|
||||
void *ctx = talloc_new (NULL);
|
||||
GMimeContentDisposition *disposition = g_mime_object_get_content_disposition (part);
|
||||
GByteArray *part_content;
|
||||
const char *cid;
|
||||
|
||||
content_type = g_mime_object_get_content_type (GMIME_OBJECT (part));
|
||||
|
||||
printf ("{\"id\": %d, \"content-type\": %s",
|
||||
*part_count,
|
||||
printf (", \"content-type\": %s",
|
||||
json_quote_str (ctx, g_mime_content_type_to_string (content_type)));
|
||||
|
||||
cid = g_mime_object_get_content_id (part);
|
||||
if (cid != NULL)
|
||||
printf(", \"content-id\": %s",
|
||||
json_quote_str (ctx, cid));
|
||||
printf(", \"content-id\": %s", json_quote_str (ctx, cid));
|
||||
|
||||
disposition = g_mime_object_get_content_disposition (part);
|
||||
if (disposition &&
|
||||
strcmp (disposition->disposition, GMIME_DISPOSITION_ATTACHMENT) == 0)
|
||||
{
|
||||
|
@ -510,7 +530,7 @@ format_part_end_json (GMimeObject *part)
|
|||
}
|
||||
|
||||
static void
|
||||
format_part_raw (GMimeObject *part, unused (int *part_count))
|
||||
format_part_content_raw (GMimeObject *part)
|
||||
{
|
||||
GMimeStream *stream_stdout = g_mime_stream_file_new (stdout);
|
||||
g_mime_stream_file_set_owner (GMIME_STREAM_FILE (stream_stdout), FALSE);
|
||||
|
@ -538,7 +558,7 @@ show_message (void *ctx,
|
|||
fputs (format->body_start, stdout);
|
||||
}
|
||||
|
||||
if (format->part)
|
||||
if (format->part_content)
|
||||
show_message_body (notmuch_message_get_filename (message),
|
||||
format, params);
|
||||
|
||||
|
|
|
@ -49,7 +49,9 @@ show_message_part (GMimeObject *part,
|
|||
if (!first && (params->part <= 0 || state->in_zone))
|
||||
fputs (format->part_sep, stdout);
|
||||
|
||||
format->part (part, &(state->part_count));
|
||||
if (format->part_start)
|
||||
format->part_start (part, &(state->part_count));
|
||||
format->part_content (part);
|
||||
}
|
||||
|
||||
if (GMIME_IS_MULTIPART (part)) {
|
||||
|
|
Loading…
Reference in a new issue