pass entire format structure to various show_message functions

Various show_message* functions require formatting functions, which
were previously being passed individually as arguments.  Since we will
need to be needing to passing in more formatting function in the
future (ie. for crypto support), we here modify things so that we just
pass in the entire format structure.  This will make things much
simpler down the line as we need to pass in new format functions.

We move the show_format structure into notmuch-client.c as
notmuch_show_format.  This also affects notmuch-reply.c, so we create
a mostly-empty format_reply to pass the reply_part function to
show_message_body.
This commit is contained in:
Jameson Graef Rollins 2011-05-20 11:45:33 -07:00 committed by Carl Worth
parent 8b9fc33d99
commit dcdb843094
4 changed files with 68 additions and 46 deletions

View file

@ -54,6 +54,27 @@
#define STRINGIFY(s) STRINGIFY_(s) #define STRINGIFY(s) STRINGIFY_(s)
#define STRINGIFY_(s) #s #define STRINGIFY_(s) #s
typedef struct notmuch_show_format {
const char *message_set_start;
const char *message_start;
void (*message) (const void *ctx,
notmuch_message_t *message,
int indent);
const char *header_start;
void (*header) (const void *ctx,
notmuch_message_t *message);
const char *header_end;
const char *body_start;
void (*part) (GMimeObject *part,
int *part_count,
int first);
void (*part_end) (GMimeObject *part);
const char *body_end;
const char *message_end;
const char *message_set_sep;
const char *message_set_end;
} notmuch_show_format_t;
/* There's no point in continuing when we've detected that we've done /* There's no point in continuing when we've detected that we've done
* something wrong internally (as opposed to the user passing in a * something wrong internally (as opposed to the user passing in a
* bogus value). * bogus value).
@ -133,8 +154,7 @@ query_string_from_args (void *ctx, int argc, char *argv[]);
notmuch_status_t notmuch_status_t
show_message_body (const char *filename, show_message_body (const char *filename,
void (*show_part) (GMimeObject *part, int *part_count, int first), const notmuch_show_format_t *format);
void (*show_part_end) (GMimeObject *part));
notmuch_status_t notmuch_status_t
show_one_part (const char *filename, int part); show_one_part (const char *filename, int part);

View file

@ -24,6 +24,20 @@
#include "gmime-filter-reply.h" #include "gmime-filter-reply.h"
#include "gmime-filter-headers.h" #include "gmime-filter-headers.h"
static void
reply_part (GMimeObject *part,
unused (int *part_count),
unused (int first));
static const notmuch_show_format_t format_reply = {
NULL,
NULL, NULL,
NULL, NULL, NULL,
NULL, reply_part, NULL, NULL,
NULL, NULL,
NULL
};
static void static void
reply_part_content (GMimeObject *part) reply_part_content (GMimeObject *part)
{ {
@ -72,12 +86,13 @@ show_reply_headers (GMimeMessage *message)
} }
static void static void
reply_part (GMimeObject *part, int *part_count, unused (int first)) reply_part (GMimeObject *part,
unused (int *part_count),
unused (int first))
{ {
GMimeContentDisposition *disposition; GMimeContentDisposition *disposition;
GMimeContentType *content_type; GMimeContentType *content_type;
(void) part_count;
disposition = g_mime_object_get_content_disposition (part); disposition = g_mime_object_get_content_disposition (part);
if (disposition && if (disposition &&
strcmp (disposition->disposition, GMIME_DISPOSITION_ATTACHMENT) == 0) strcmp (disposition->disposition, GMIME_DISPOSITION_ATTACHMENT) == 0)
@ -447,6 +462,7 @@ notmuch_reply_format_default(void *ctx, notmuch_config_t *config, notmuch_query_
notmuch_message_t *message; notmuch_message_t *message;
const char *subject, *from_addr = NULL; const char *subject, *from_addr = NULL;
const char *in_reply_to, *orig_references, *references; const char *in_reply_to, *orig_references, *references;
const notmuch_show_format_t *format = &format_reply;
for (messages = notmuch_query_search_messages (query); for (messages = notmuch_query_search_messages (query);
notmuch_messages_valid (messages); notmuch_messages_valid (messages);
@ -506,7 +522,7 @@ notmuch_reply_format_default(void *ctx, notmuch_config_t *config, notmuch_query_
notmuch_message_get_header (message, "from")); notmuch_message_get_header (message, "from"));
show_message_body (notmuch_message_get_filename (message), show_message_body (notmuch_message_get_filename (message),
reply_part, NULL); format);
notmuch_message_destroy (message); notmuch_message_destroy (message);
} }

View file

@ -20,26 +20,6 @@
#include "notmuch-client.h" #include "notmuch-client.h"
typedef struct show_format {
const char *message_set_start;
const char *message_start;
void (*message) (const void *ctx,
notmuch_message_t *message,
int indent);
const char *header_start;
void (*header) (const void *ctx,
notmuch_message_t *message);
const char *header_end;
const char *body_start;
void (*part) (GMimeObject *part,
int *part_count, int first);
void (*part_end) (GMimeObject *part);
const char *body_end;
const char *message_end;
const char *message_set_sep;
const char *message_set_end;
} show_format_t;
static void static void
format_message_text (unused (const void *ctx), format_message_text (unused (const void *ctx),
notmuch_message_t *message, notmuch_message_t *message,
@ -56,7 +36,7 @@ format_part_text (GMimeObject *part,
static void static void
format_part_end_text (GMimeObject *part); format_part_end_text (GMimeObject *part);
static const 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, "\fheader}\n",
@ -81,7 +61,7 @@ format_part_json (GMimeObject *part,
static void static void
format_part_end_json (GMimeObject *part); format_part_end_json (GMimeObject *part);
static const 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, "}",
@ -95,7 +75,7 @@ format_message_mbox (const void *ctx,
notmuch_message_t *message, notmuch_message_t *message,
unused (int indent)); unused (int indent));
static const show_format_t format_mbox = { static const notmuch_show_format_t format_mbox = {
"", "",
"", format_message_mbox, "", format_message_mbox,
"", NULL, "", "", NULL, "",
@ -515,7 +495,10 @@ format_part_end_json (GMimeObject *part)
} }
static void static void
show_message (void *ctx, const show_format_t *format, notmuch_message_t *message, int indent) show_message (void *ctx,
const notmuch_show_format_t *format,
notmuch_message_t *message,
int indent)
{ {
fputs (format->message_start, stdout); fputs (format->message_start, stdout);
if (format->message) if (format->message)
@ -529,7 +512,7 @@ show_message (void *ctx, const show_format_t *format, notmuch_message_t *message
fputs (format->body_start, stdout); fputs (format->body_start, stdout);
if (format->part) if (format->part)
show_message_body (notmuch_message_get_filename (message), show_message_body (notmuch_message_get_filename (message),
format->part, format->part_end); format);
fputs (format->body_end, stdout); fputs (format->body_end, stdout);
fputs (format->message_end, stdout); fputs (format->message_end, stdout);
@ -537,7 +520,10 @@ show_message (void *ctx, const show_format_t *format, notmuch_message_t *message
static void static void
show_messages (void *ctx, const show_format_t *format, notmuch_messages_t *messages, int indent, show_messages (void *ctx,
const notmuch_show_format_t *format,
notmuch_messages_t *messages,
int indent,
notmuch_bool_t entire_thread) notmuch_bool_t entire_thread)
{ {
notmuch_message_t *message; notmuch_message_t *message;
@ -631,7 +617,7 @@ do_show_raw (unused(void *ctx), notmuch_query_t *query)
static int static int
do_show (void *ctx, do_show (void *ctx,
notmuch_query_t *query, notmuch_query_t *query,
const show_format_t *format, const notmuch_show_format_t *format,
int entire_thread) int entire_thread)
{ {
notmuch_threads_t *threads; notmuch_threads_t *threads;
@ -676,7 +662,7 @@ notmuch_show_command (void *ctx, unused (int argc), unused (char *argv[]))
notmuch_query_t *query; notmuch_query_t *query;
char *query_string; char *query_string;
char *opt; char *opt;
const show_format_t *format = &format_text; const notmuch_show_format_t *format = &format_text;
int entire_thread = 0; int entire_thread = 0;
int i; int i;
int raw = 0; int raw = 0;

View file

@ -25,8 +25,7 @@
static void static void
show_message_part (GMimeObject *part, show_message_part (GMimeObject *part,
int *part_count, int *part_count,
void (*show_part) (GMimeObject *part, int *part_count, int first), const notmuch_show_format_t *format,
void (*show_part_end) (GMimeObject *part),
int first) int first)
{ {
if (GMIME_IS_MULTIPART (part)) { if (GMIME_IS_MULTIPART (part)) {
@ -34,15 +33,15 @@ show_message_part (GMimeObject *part,
int i; int i;
*part_count = *part_count + 1; *part_count = *part_count + 1;
(*show_part) (part, part_count, first); format->part (part, part_count, first);
for (i = 0; i < g_mime_multipart_get_count (multipart); i++) { for (i = 0; i < g_mime_multipart_get_count (multipart); i++) {
show_message_part (g_mime_multipart_get_part (multipart, i), show_message_part (g_mime_multipart_get_part (multipart, i),
part_count, show_part, show_part_end, i == 0); part_count, format, i == 0);
} }
if (show_part_end) if (format->part_end)
(*show_part_end) (part); format->part_end (part);
return; return;
} }
@ -53,7 +52,7 @@ show_message_part (GMimeObject *part,
mime_message = g_mime_message_part_get_message (GMIME_MESSAGE_PART (part)); mime_message = g_mime_message_part_get_message (GMIME_MESSAGE_PART (part));
show_message_part (g_mime_message_get_mime_part (mime_message), show_message_part (g_mime_message_get_mime_part (mime_message),
part_count, show_part, show_part_end, first); part_count, format, first);
return; return;
} }
@ -66,15 +65,14 @@ show_message_part (GMimeObject *part,
*part_count = *part_count + 1; *part_count = *part_count + 1;
(*show_part) (part, part_count, first); format->part (part, part_count, first);
if (show_part_end) if (format->part_end)
(*show_part_end) (part); format->part_end (part);
} }
notmuch_status_t notmuch_status_t
show_message_body (const char *filename, show_message_body (const char *filename,
void (*show_part) (GMimeObject *part, int *part_count, int first), const notmuch_show_format_t *format)
void (*show_part_end) (GMimeObject *part))
{ {
GMimeStream *stream = NULL; GMimeStream *stream = NULL;
GMimeParser *parser = NULL; GMimeParser *parser = NULL;
@ -98,7 +96,9 @@ show_message_body (const char *filename,
mime_message = g_mime_parser_construct_message (parser); mime_message = g_mime_parser_construct_message (parser);
show_message_part (g_mime_message_get_mime_part (mime_message), show_message_part (g_mime_message_get_mime_part (mime_message),
&part_count, show_part, show_part_end, TRUE); &part_count,
format,
TRUE);
DONE: DONE:
if (mime_message) if (mime_message)