X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=util%2Fgmime-extra.c;h=7562d9062a20ab1b1a2a9c917c3d4e9b56afe7f5;hp=bc1e3c4d94bb75b04c7b24c8e8816770a7e83434;hb=a6b0772b60d9191fcc291358eec3d78bfea31f1c;hpb=040c3236afcf95bead0324a48c2e0b9cd7934993 diff --git a/util/gmime-extra.c b/util/gmime-extra.c index bc1e3c4d..7562d906 100644 --- a/util/gmime-extra.c +++ b/util/gmime-extra.c @@ -1,127 +1,93 @@ #include "gmime-extra.h" #include +static GMimeStream * -g_mime_stream_stdout_new() -{ - GMimeStream *stream_stdout = NULL; - GMimeStream *stream_buffered = NULL; +_gzfile_maybe_filter (GMimeStream *file_stream) { + char buf[4]; + int bytes_read; - stream_stdout = g_mime_stream_pipe_new (STDOUT_FILENO); - if (!stream_stdout) + if ((bytes_read = g_mime_stream_read (file_stream, buf, sizeof (buf))) < 0) return NULL; - g_mime_stream_pipe_set_owner (GMIME_STREAM_PIPE (stream_stdout), FALSE); + if (g_mime_stream_reset (file_stream)) + return NULL; - stream_buffered = g_mime_stream_buffer_new (stream_stdout, GMIME_STREAM_BUFFER_BLOCK_WRITE); + /* check for gzipped input */ + if (bytes_read >= 2 && buf[0] == 0x1f && (unsigned char)buf[1] == 0x8b) { + GMimeStream *gzstream; + GMimeFilter *gzfilter; - g_object_unref (stream_stdout); + gzfilter = g_mime_filter_gzip_new (GMIME_FILTER_GZIP_MODE_UNZIP, 0); + if (! gzfilter) + return NULL; - return stream_buffered; -} + gzstream = g_mime_stream_filter_new (file_stream); + if (! gzstream) + return NULL; -/** - * copy a glib string into a talloc context, and free it. - */ -static char* -g_string_talloc_strdup (void *ctx, char *g_string) -{ - char *new_str = talloc_strdup (ctx, g_string); - g_free (g_string); - return new_str; + /* ignore filter id */ + (void)g_mime_stream_filter_add ((GMimeStreamFilter *)gzstream, gzfilter); + return gzstream; + } else { + return file_stream; + } } -#if (GMIME_MAJOR_VERSION < 3) - -const char * -g_mime_certificate_get_valid_userid (GMimeCertificate *cert) +GMimeStream * +g_mime_stream_gzfile_new (int fd) { - /* output user id only if validity is FULL or ULTIMATE. */ - /* note that gmime 2.6 is using the term "trust" here, which - * is WRONG. It's actually user id "validity". */ - const char *name = g_mime_certificate_get_name (cert); - if (name == NULL) - return name; - GMimeCertificateTrust trust = g_mime_certificate_get_trust (cert); - if (trust == GMIME_CERTIFICATE_TRUST_FULLY || trust == GMIME_CERTIFICATE_TRUST_ULTIMATE) - return name; - return NULL; -} + GMimeStream *file_stream; -char * -g_mime_message_get_address_string (GMimeMessage *message, GMimeRecipientType type) -{ - InternetAddressList *list = g_mime_message_get_recipients (message, type); - return internet_address_list_to_string (list, 0); -} + file_stream = g_mime_stream_fs_new (fd); + if (! file_stream) + return NULL; -inline InternetAddressList * -g_mime_message_get_addresses (GMimeMessage *message, GMimeRecipientType type) -{ - return g_mime_message_get_recipients (message, type); + return _gzfile_maybe_filter (file_stream); } -char * -g_mime_message_get_date_string (void *ctx, GMimeMessage *message) +GMimeStream * +g_mime_stream_gzfile_open (const char *filename) { - char *date = g_mime_message_get_date_as_string (message); - return g_string_talloc_strdup (ctx, date); -} + GMimeStream *file_stream; -InternetAddressList * -g_mime_message_get_from (GMimeMessage *message) -{ - return internet_address_list_parse_string (g_mime_message_get_sender (message)); -} + file_stream = g_mime_stream_fs_open (filename, 0, 0, NULL); + if (! file_stream) + return NULL; -const char * -g_mime_message_get_from_string (GMimeMessage *message) { - return g_mime_message_get_sender (message); + return _gzfile_maybe_filter (file_stream); } -InternetAddressList * -g_mime_message_get_reply_to_list (GMimeMessage *message) +GMimeStream * +g_mime_stream_stdout_new() { - const char *reply_to; + GMimeStream *stream_stdout = NULL; + GMimeStream *stream_buffered = NULL; - reply_to = g_mime_message_get_reply_to (message); - if (reply_to && *reply_to) - return internet_address_list_parse_string (reply_to); - else + stream_stdout = g_mime_stream_pipe_new (STDOUT_FILENO); + if (!stream_stdout) return NULL; -} -/** - * return talloc allocated reply-to string - */ -char * -g_mime_message_get_reply_to_string (void *ctx, GMimeMessage *message) -{ - return talloc_strdup(ctx, g_mime_message_get_reply_to (message)); -} + g_mime_stream_pipe_set_owner (GMIME_STREAM_PIPE (stream_stdout), FALSE); -gboolean -g_mime_signature_status_good (GMimeSignatureStatus status) { - return (status == GMIME_SIGNATURE_STATUS_GOOD); -} + stream_buffered = g_mime_stream_buffer_new (stream_stdout, GMIME_STREAM_BUFFER_BLOCK_WRITE); -gboolean -g_mime_signature_status_bad (GMimeSignatureStatus status) { - return (status == GMIME_SIGNATURE_STATUS_BAD); -} + g_object_unref (stream_stdout); -gboolean -g_mime_signature_status_error (GMimeSignatureError error) { - return (error != GMIME_SIGNATURE_ERROR_NONE); + return stream_buffered; } -gint64 -g_mime_utils_header_decode_date_unix (const char *date) { - return (gint64) g_mime_utils_header_decode_date (date, NULL); +/** + * copy a glib string into a talloc context, and free it. + */ +static char* +g_string_talloc_strdup (void *ctx, char *g_string) +{ + char *new_str = talloc_strdup (ctx, g_string); + g_free (g_string); + return new_str; } -#else /* GMime >= 3.0 */ - const char * g_mime_certificate_get_valid_userid (GMimeCertificate *cert) { @@ -223,5 +189,3 @@ g_mime_utils_header_decode_date_unix (const char *date) { return ret; } - -#endif