Blame src/em-format/e-mail-parser-multipart-digest.c

Packit Service de44cd
/*
Packit Service de44cd
 * e-mail-parser-multipart-digest.c
Packit Service de44cd
 *
Packit Service de44cd
 * This program is free software; you can redistribute it and/or modify it
Packit Service de44cd
 * under the terms of the GNU Lesser General Public License as published by
Packit Service de44cd
 * the Free Software Foundation.
Packit Service de44cd
 *
Packit Service de44cd
 * This program is distributed in the hope that it will be useful, but
Packit Service de44cd
 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
Packit Service de44cd
 * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
Packit Service de44cd
 * for more details.
Packit Service de44cd
 *
Packit Service de44cd
 * You should have received a copy of the GNU Lesser General Public License
Packit Service de44cd
 * along with this program; if not, see <http://www.gnu.org/licenses/>.
Packit Service de44cd
 *
Packit Service de44cd
 */
Packit Service de44cd
Packit Service de44cd
#include "evolution-config.h"
Packit Service de44cd
Packit Service de44cd
#include <string.h>
Packit Service de44cd
Packit Service de44cd
#include <e-util/e-util.h>
Packit Service de44cd
Packit Service de44cd
#include "e-mail-parser-extension.h"
Packit Service de44cd
Packit Service de44cd
typedef EMailParserExtension EMailParserMultipartDigest;
Packit Service de44cd
typedef EMailParserExtensionClass EMailParserMultipartDigestClass;
Packit Service de44cd
Packit Service de44cd
GType e_mail_parser_multipart_digest_get_type (void);
Packit Service de44cd
Packit Service de44cd
G_DEFINE_TYPE (
Packit Service de44cd
	EMailParserMultipartDigest,
Packit Service de44cd
	e_mail_parser_multipart_digest,
Packit Service de44cd
	E_TYPE_MAIL_PARSER_EXTENSION)
Packit Service de44cd
Packit Service de44cd
static const gchar *parser_mime_types[] = {
Packit Service de44cd
	"multipart/digest",
Packit Service de44cd
	NULL
Packit Service de44cd
};
Packit Service de44cd
Packit Service de44cd
static gboolean
Packit Service de44cd
empe_mp_digest_parse (EMailParserExtension *extension,
Packit Service de44cd
                      EMailParser *parser,
Packit Service de44cd
                      CamelMimePart *part,
Packit Service de44cd
                      GString *part_id,
Packit Service de44cd
                      GCancellable *cancellable,
Packit Service de44cd
                      GQueue *out_mail_parts)
Packit Service de44cd
{
Packit Service de44cd
	CamelMultipart *mp;
Packit Service de44cd
	gint i, nparts, len;
Packit Service de44cd
Packit Service de44cd
	mp = (CamelMultipart *) camel_medium_get_content ((CamelMedium *) part);
Packit Service de44cd
Packit Service de44cd
	if (!CAMEL_IS_MULTIPART (mp))
Packit Service de44cd
		return e_mail_parser_parse_part_as (
Packit Service de44cd
			parser, part, part_id,
Packit Service de44cd
			"application/vnd.evolution.source",
Packit Service de44cd
			cancellable, out_mail_parts);
Packit Service de44cd
Packit Service de44cd
	len = part_id->len;
Packit Service de44cd
	nparts = camel_multipart_get_number (mp);
Packit Service de44cd
	for (i = 0; i < nparts; i++) {
Packit Service de44cd
		CamelMimePart *subpart;
Packit Service de44cd
		CamelContentType *ct;
Packit Service de44cd
		gchar *cts;
Packit Service de44cd
Packit Service de44cd
		subpart = camel_multipart_get_part (mp, i);
Packit Service de44cd
Packit Service de44cd
		if (!subpart)
Packit Service de44cd
			continue;
Packit Service de44cd
Packit Service de44cd
		g_string_append_printf (part_id, ".digest.%d", i);
Packit Service de44cd
Packit Service de44cd
		ct = camel_mime_part_get_content_type (subpart);
Packit Service de44cd
Packit Service de44cd
		/* According to RFC this shouldn't happen, but who knows... */
Packit Service de44cd
		if (ct && !camel_content_type_is (ct, "message", "rfc822")) {
Packit Service de44cd
			cts = camel_content_type_simple (ct);
Packit Service de44cd
Packit Service de44cd
			e_mail_parser_parse_part_as (
Packit Service de44cd
				parser, subpart, part_id, cts,
Packit Service de44cd
				cancellable, out_mail_parts);
Packit Service de44cd
Packit Service de44cd
			g_free (cts);
Packit Service de44cd
		} else {
Packit Service de44cd
			GQueue work_queue = G_QUEUE_INIT;
Packit Service de44cd
			EMailPart *mail_part;
Packit Service de44cd
			gboolean wrap_as_attachment;
Packit Service de44cd
Packit Service de44cd
			e_mail_parser_parse_part_as (
Packit Service de44cd
				parser, subpart, part_id, "message/rfc822",
Packit Service de44cd
				cancellable, &work_queue);
Packit Service de44cd
Packit Service de44cd
			mail_part = g_queue_peek_head (&work_queue);
Packit Service de44cd
Packit Service de44cd
			wrap_as_attachment =
Packit Service de44cd
				(mail_part != NULL) &&
Packit Service de44cd
				!e_mail_part_get_is_attachment (mail_part);
Packit Service de44cd
Packit Service de44cd
			/* Force the message to be collapsable */
Packit Service de44cd
			if (wrap_as_attachment)
Packit Service de44cd
				e_mail_parser_wrap_as_attachment (
Packit Service de44cd
					parser, subpart, part_id, &work_queue);
Packit Service de44cd
Packit Service de44cd
			mail_part = g_queue_peek_head (&work_queue);
Packit Service de44cd
Packit Service de44cd
			/* Force the message to be expanded */
Packit Service de44cd
			if (mail_part != NULL)
Packit Service de44cd
				mail_part->force_inline = TRUE;
Packit Service de44cd
Packit Service de44cd
			e_queue_transfer (&work_queue, out_mail_parts);
Packit Service de44cd
		}
Packit Service de44cd
Packit Service de44cd
		g_string_truncate (part_id, len);
Packit Service de44cd
	}
Packit Service de44cd
Packit Service de44cd
	return TRUE;
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static void
Packit Service de44cd
e_mail_parser_multipart_digest_class_init (EMailParserExtensionClass *class)
Packit Service de44cd
{
Packit Service de44cd
	class->mime_types = parser_mime_types;
Packit Service de44cd
	class->priority = G_PRIORITY_LOW;
Packit Service de44cd
	class->flags = E_MAIL_PARSER_EXTENSION_COMPOUND_TYPE;
Packit Service de44cd
	class->parse = empe_mp_digest_parse;
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static void
Packit Service de44cd
e_mail_parser_multipart_digest_init (EMailParserExtension *extension)
Packit Service de44cd
{
Packit Service de44cd
}