mirror of
https://git.notmuchmail.org/git/notmuch
synced 2024-11-22 02:48:08 +01:00
d61cef374b
This removes all of the MIME traversal logic from show_message_body and leaves only its interaction with the format callbacks. Besides isolating concerns, since traversal happens behind a trivial interface, there is now much less code duplication in show_message_part. Also, this uses mime_node_seek_dfs to start at the requested part, eliminating all of the logic about parts being selected or being in_zone (and reducing the "show state" to only a part counter). notmuch_show_params_t no longer needs to be passed through the recursion because the only two fields that mattered (related to crypto) are now handled by the MIME tree. The few remaining complexities in show_message_part highlight irregularities in the format callbacks with respect to top-level messages and embedded message parts. Since this is a rewrite, the diff is not very enlightening. It's easier to look at the old code and the new code side-by-side.
102 lines
2.9 KiB
C
102 lines
2.9 KiB
C
/* notmuch - Not much of an email program, (just index and search)
|
|
*
|
|
* Copyright © 2009 Carl Worth
|
|
* Copyright © 2009 Keith Packard
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see http://www.gnu.org/licenses/ .
|
|
*
|
|
* Authors: Carl Worth <cworth@cworth.org>
|
|
* Keith Packard <keithp@keithp.com>
|
|
*/
|
|
|
|
#include "notmuch-client.h"
|
|
|
|
typedef struct show_message_state {
|
|
int part_count;
|
|
} show_message_state_t;
|
|
|
|
static void
|
|
show_message_part (mime_node_t *node,
|
|
show_message_state_t *state,
|
|
const notmuch_show_format_t *format,
|
|
int first)
|
|
{
|
|
/* Formatters expect the envelope for embedded message parts */
|
|
GMimeObject *part = node->envelope_part ?
|
|
GMIME_OBJECT (node->envelope_part) : node->part;
|
|
int i;
|
|
|
|
if (!first)
|
|
fputs (format->part_sep, stdout);
|
|
|
|
/* Format this part */
|
|
if (format->part_start)
|
|
format->part_start (part, &(state->part_count));
|
|
|
|
if (node->decrypt_attempted && format->part_encstatus)
|
|
format->part_encstatus (node->decrypt_success);
|
|
|
|
if (node->verify_attempted && format->part_sigstatus)
|
|
format->part_sigstatus (node->sig_validity);
|
|
|
|
format->part_content (part);
|
|
|
|
if (node->envelope_part) {
|
|
fputs (format->header_start, stdout);
|
|
if (format->header_message_part)
|
|
format->header_message_part (GMIME_MESSAGE (node->part));
|
|
fputs (format->header_end, stdout);
|
|
|
|
fputs (format->body_start, stdout);
|
|
}
|
|
|
|
/* Recurse over the children */
|
|
state->part_count += 1;
|
|
for (i = 0; i < node->nchildren; i++)
|
|
show_message_part (mime_node_child (node, i), state, format, i == 0);
|
|
|
|
/* Finish this part */
|
|
if (node->envelope_part)
|
|
fputs (format->body_end, stdout);
|
|
|
|
if (format->part_end)
|
|
format->part_end (part);
|
|
}
|
|
|
|
notmuch_status_t
|
|
show_message_body (notmuch_message_t *message,
|
|
const notmuch_show_format_t *format,
|
|
notmuch_show_params_t *params)
|
|
{
|
|
notmuch_status_t ret;
|
|
show_message_state_t state;
|
|
mime_node_t *root, *part;
|
|
|
|
ret = mime_node_open (NULL, message, params->cryptoctx, params->decrypt,
|
|
&root);
|
|
if (ret)
|
|
return ret;
|
|
|
|
/* The caller of show_message_body has already handled the
|
|
* outermost envelope, so skip it. */
|
|
state.part_count = MAX (params->part, 1);
|
|
|
|
part = mime_node_seek_dfs (root, state.part_count);
|
|
if (part)
|
|
show_message_part (part, &state, format, TRUE);
|
|
|
|
talloc_free (root);
|
|
|
|
return NOTMUCH_STATUS_SUCCESS;
|
|
}
|