mirror of
https://git.notmuchmail.org/git/notmuch
synced 2024-11-21 18:38:08 +01:00
show/reply: Unify the code that extracts text parts
Previously, show and reply had separate implementations of decoding and printing text parts. Now both use show's implementation, which was more complete. Show's implementation has been extended with an option to add reply quoting to the extracted part (this is implemented as a named flag to avoid naked booleans, even though it's the only flag it can take).
This commit is contained in:
parent
ee1180018e
commit
ea4fd50f45
3 changed files with 31 additions and 28 deletions
|
@ -197,6 +197,14 @@ format_part_json (const void *ctx, mime_node_t *node, notmuch_bool_t first);
|
||||||
void
|
void
|
||||||
format_headers_json (const void *ctx, GMimeMessage *message, notmuch_bool_t reply);
|
format_headers_json (const void *ctx, GMimeMessage *message, notmuch_bool_t reply);
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
NOTMUCH_SHOW_TEXT_PART_REPLY = 1 << 0,
|
||||||
|
} notmuch_show_text_part_flags;
|
||||||
|
|
||||||
|
void
|
||||||
|
show_text_part_content (GMimeObject *part, GMimeStream *stream_out,
|
||||||
|
notmuch_show_text_part_flags flags);
|
||||||
|
|
||||||
char *
|
char *
|
||||||
json_quote_chararray (const void *ctx, const char *str, const size_t len);
|
json_quote_chararray (const void *ctx, const char *str, const size_t len);
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,6 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "notmuch-client.h"
|
#include "notmuch-client.h"
|
||||||
#include "gmime-filter-reply.h"
|
|
||||||
#include "gmime-filter-headers.h"
|
#include "gmime-filter-headers.h"
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -106,29 +105,10 @@ reply_part_content (GMimeObject *part)
|
||||||
else if (g_mime_content_type_is_type (content_type, "text", "*") &&
|
else if (g_mime_content_type_is_type (content_type, "text", "*") &&
|
||||||
!g_mime_content_type_is_type (content_type, "text", "html"))
|
!g_mime_content_type_is_type (content_type, "text", "html"))
|
||||||
{
|
{
|
||||||
GMimeStream *stream_stdout = NULL, *stream_filter = NULL;
|
GMimeStream *stream_stdout = g_mime_stream_file_new (stdout);
|
||||||
GMimeDataWrapper *wrapper;
|
g_mime_stream_file_set_owner (GMIME_STREAM_FILE (stream_stdout), FALSE);
|
||||||
const char *charset;
|
show_text_part_content (part, stream_stdout, NOTMUCH_SHOW_TEXT_PART_REPLY);
|
||||||
|
g_object_unref(stream_stdout);
|
||||||
charset = g_mime_object_get_content_type_parameter (part, "charset");
|
|
||||||
stream_stdout = g_mime_stream_file_new (stdout);
|
|
||||||
if (stream_stdout) {
|
|
||||||
g_mime_stream_file_set_owner (GMIME_STREAM_FILE (stream_stdout), FALSE);
|
|
||||||
stream_filter = g_mime_stream_filter_new(stream_stdout);
|
|
||||||
if (charset) {
|
|
||||||
g_mime_stream_filter_add(GMIME_STREAM_FILTER(stream_filter),
|
|
||||||
g_mime_filter_charset_new(charset, "UTF-8"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
g_mime_stream_filter_add(GMIME_STREAM_FILTER(stream_filter),
|
|
||||||
g_mime_filter_reply_new(TRUE));
|
|
||||||
wrapper = g_mime_part_get_content_object (GMIME_PART (part));
|
|
||||||
if (wrapper && stream_filter)
|
|
||||||
g_mime_data_wrapper_write_to_stream (wrapper, stream_filter);
|
|
||||||
if (stream_filter)
|
|
||||||
g_object_unref(stream_filter);
|
|
||||||
if (stream_stdout)
|
|
||||||
g_object_unref(stream_stdout);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "notmuch-client.h"
|
#include "notmuch-client.h"
|
||||||
|
#include "gmime-filter-reply.h"
|
||||||
|
|
||||||
static notmuch_status_t
|
static notmuch_status_t
|
||||||
format_part_text (const void *ctx, mime_node_t *node,
|
format_part_text (const void *ctx, mime_node_t *node,
|
||||||
|
@ -246,14 +247,18 @@ format_headers_json (const void *ctx, GMimeMessage *message, notmuch_bool_t repl
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Write a MIME text part out to the given stream.
|
/* Write a MIME text part out to the given stream.
|
||||||
|
*
|
||||||
|
* If (flags & NOTMUCH_SHOW_TEXT_PART_REPLY), this prepends "> " to
|
||||||
|
* each output line.
|
||||||
*
|
*
|
||||||
* Both line-ending conversion (CRLF->LF) and charset conversion ( ->
|
* Both line-ending conversion (CRLF->LF) and charset conversion ( ->
|
||||||
* UTF-8) will be performed, so it is inappropriate to call this
|
* UTF-8) will be performed, so it is inappropriate to call this
|
||||||
* function with a non-text part. Doing so will trigger an internal
|
* function with a non-text part. Doing so will trigger an internal
|
||||||
* error.
|
* error.
|
||||||
*/
|
*/
|
||||||
static void
|
void
|
||||||
show_text_part_content (GMimeObject *part, GMimeStream *stream_out)
|
show_text_part_content (GMimeObject *part, GMimeStream *stream_out,
|
||||||
|
notmuch_show_text_part_flags flags)
|
||||||
{
|
{
|
||||||
GMimeContentType *content_type = g_mime_object_get_content_type (GMIME_OBJECT (part));
|
GMimeContentType *content_type = g_mime_object_get_content_type (GMIME_OBJECT (part));
|
||||||
GMimeStream *stream_filter = NULL;
|
GMimeStream *stream_filter = NULL;
|
||||||
|
@ -286,6 +291,16 @@ show_text_part_content (GMimeObject *part, GMimeStream *stream_out)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (flags & NOTMUCH_SHOW_TEXT_PART_REPLY) {
|
||||||
|
GMimeFilter *reply_filter;
|
||||||
|
reply_filter = g_mime_filter_reply_new (TRUE);
|
||||||
|
if (reply_filter) {
|
||||||
|
g_mime_stream_filter_add (GMIME_STREAM_FILTER (stream_filter),
|
||||||
|
reply_filter);
|
||||||
|
g_object_unref (reply_filter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
wrapper = g_mime_part_get_content_object (GMIME_PART (part));
|
wrapper = g_mime_part_get_content_object (GMIME_PART (part));
|
||||||
if (wrapper && stream_filter)
|
if (wrapper && stream_filter)
|
||||||
g_mime_data_wrapper_write_to_stream (wrapper, stream_filter);
|
g_mime_data_wrapper_write_to_stream (wrapper, stream_filter);
|
||||||
|
@ -532,7 +547,7 @@ format_part_text (const void *ctx, mime_node_t *node,
|
||||||
{
|
{
|
||||||
GMimeStream *stream_stdout = g_mime_stream_file_new (stdout);
|
GMimeStream *stream_stdout = g_mime_stream_file_new (stdout);
|
||||||
g_mime_stream_file_set_owner (GMIME_STREAM_FILE (stream_stdout), FALSE);
|
g_mime_stream_file_set_owner (GMIME_STREAM_FILE (stream_stdout), FALSE);
|
||||||
show_text_part_content (node->part, stream_stdout);
|
show_text_part_content (node->part, stream_stdout, 0);
|
||||||
g_object_unref(stream_stdout);
|
g_object_unref(stream_stdout);
|
||||||
} else {
|
} else {
|
||||||
printf ("Non-text part: %s\n",
|
printf ("Non-text part: %s\n",
|
||||||
|
@ -624,7 +639,7 @@ format_part_json (const void *ctx, mime_node_t *node, notmuch_bool_t first)
|
||||||
} else if (g_mime_content_type_is_type (content_type, "text", "*")) {
|
} else if (g_mime_content_type_is_type (content_type, "text", "*")) {
|
||||||
GMimeStream *stream_memory = g_mime_stream_mem_new ();
|
GMimeStream *stream_memory = g_mime_stream_mem_new ();
|
||||||
GByteArray *part_content;
|
GByteArray *part_content;
|
||||||
show_text_part_content (node->part, stream_memory);
|
show_text_part_content (node->part, stream_memory, 0);
|
||||||
part_content = g_mime_stream_mem_get_byte_array (GMIME_STREAM_MEM (stream_memory));
|
part_content = g_mime_stream_mem_get_byte_array (GMIME_STREAM_MEM (stream_memory));
|
||||||
|
|
||||||
printf (", \"content\": %s", json_quote_chararray (local, (char *) part_content->data, part_content->len));
|
printf (", \"content\": %s", json_quote_chararray (local, (char *) part_content->data, part_content->len));
|
||||||
|
|
Loading…
Reference in a new issue