[gmime] Added support for the MMDF format
- From: Jeffrey Stedfast <fejj src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gmime] Added support for the MMDF format
- Date: Mon, 13 Mar 2017 00:50:05 +0000 (UTC)
commit 7bcfac9dd27ed90deeb5a5f3c0376637acb8a46d
Author: Jeffrey Stedfast <jestedfa microsoft com>
Date: Sun Mar 12 20:44:40 2017 -0400
Added support for the MMDF format
Based on a patch by Stephen Gildea
Fixes bug #382120
gmime/gmime-parser.c | 41 ++++++++++++++++++++++++++++++++++++-----
gmime/gmime-parser.h | 3 ++-
2 files changed, 38 insertions(+), 6 deletions(-)
---
diff --git a/gmime/gmime-parser.c b/gmime/gmime-parser.c
index 77a7863..7a77628 100644
--- a/gmime/gmime-parser.c
+++ b/gmime/gmime-parser.c
@@ -113,6 +113,7 @@ enum {
GMIME_PARSER_STATE_ERROR = -1,
GMIME_PARSER_STATE_INIT,
GMIME_PARSER_STATE_FROM,
+ GMIME_PARSER_STATE_AAAA,
GMIME_PARSER_STATE_MESSAGE_HEADERS,
GMIME_PARSER_STATE_HEADERS,
GMIME_PARSER_STATE_HEADERS_END,
@@ -182,6 +183,9 @@ struct _GMimeParserPrivate {
static const char MBOX_BOUNDARY[6] = "From ";
#define MBOX_BOUNDARY_LEN 5
+static const char MMDF_BOUNDARY[6] = "\1\1\1\1";
+#define MMDF_BOUNDARY_LEN 4
+
static void
parser_push_boundary (GMimeParser *parser, const char *boundary)
{
@@ -199,6 +203,10 @@ parser_push_boundary (GMimeParser *parser, const char *boundary)
s->boundary = g_strdup (boundary);
s->boundarylen = MBOX_BOUNDARY_LEN;
s->boundarylenfinal = MBOX_BOUNDARY_LEN;
+ } else if (boundary == MMDF_BOUNDARY) {
+ s->boundary = g_strdup (boundary);
+ s->boundarylen = MMDF_BOUNDARY_LEN;
+ s->boundarylenfinal = MMDF_BOUNDARY_LEN;
} else {
s->boundary = g_strdup_printf ("--%s--", boundary);
s->boundarylen = strlen (boundary) + 2;
@@ -746,7 +754,7 @@ g_mime_parser_eos (GMimeParser *parser)
}
static int
-parser_step_from (GMimeParser *parser)
+parser_step_marker (GMimeParser *parser, const char *marker, size_t marker_len)
{
struct _GMimeParserPrivate *priv = parser->priv;
register char *inptr;
@@ -788,10 +796,12 @@ parser_step_from (GMimeParser *parser)
len = (size_t) (inptr - start);
inptr++;
- if (len >= 5 && !strncmp (start, "From ", 5)) {
+ if (len >= marker_len && !strncmp (start, marker, marker_len)) {
priv->from_offset = parser_offset (priv, start);
- g_byte_array_append (priv->from_line, (unsigned char *) start, len);
- goto got_from;
+
+ if (priv->format == GMIME_FORMAT_MBOX)
+ g_byte_array_append (priv->from_line, (unsigned char *) start, len);
+ goto got_marker;
}
}
@@ -799,7 +809,7 @@ parser_step_from (GMimeParser *parser)
left = 0;
} while (1);
- got_from:
+ got_marker:
priv->state = GMIME_PARSER_STATE_MESSAGE_HEADERS;
@@ -808,6 +818,18 @@ parser_step_from (GMimeParser *parser)
return 0;
}
+static int
+parser_step_from (GMimeParser *parser)
+{
+ return parser_step_marker (parser, MBOX_BOUNDARY, MBOX_BOUNDARY_LEN);
+}
+
+static int
+parser_step_mmdf (GMimeParser *parser)
+{
+ return parser_step_marker (parser, MMDF_BOUNDARY, MMDF_BOUNDARY_LEN);
+}
+
#ifdef ALLOC_NEAREST_POW2
static inline size_t
nearest_pow (size_t num)
@@ -1272,6 +1294,8 @@ parser_step (GMimeParser *parser)
priv->message_headers_end = -1;
if (priv->format == GMIME_FORMAT_MBOX)
priv->state = GMIME_PARSER_STATE_FROM;
+ else if (priv->format == GMIME_FORMAT_MMDF)
+ priv->state = GMIME_PARSER_STATE_AAAA;
else
priv->state = GMIME_PARSER_STATE_MESSAGE_HEADERS;
break;
@@ -1280,6 +1304,11 @@ parser_step (GMimeParser *parser)
priv->message_headers_end = -1;
parser_step_from (parser);
break;
+ case GMIME_PARSER_STATE_AAAA:
+ priv->message_headers_begin = -1;
+ priv->message_headers_end = -1;
+ parser_step_mmdf (parser);
+ break;
case GMIME_PARSER_STATE_MESSAGE_HEADERS:
case GMIME_PARSER_STATE_HEADERS:
parser_step_headers (parser);
@@ -1959,6 +1988,8 @@ parser_construct_message (GMimeParser *parser, GMimeParserOptions *options)
parser_push_boundary (parser, MBOX_BOUNDARY);
if (priv->respect_content_length && content_length < ULONG_MAX)
priv->bounds->content_end = parser_offset (priv, NULL) + content_length;
+ } else if (priv->format == GMIME_FORMAT_MMDF) {
+ parser_push_boundary (parser, MMDF_BOUNDARY);
}
content_type = parser_content_type (parser, NULL);
diff --git a/gmime/gmime-parser.h b/gmime/gmime-parser.h
index 6e22436..f7b6254 100644
--- a/gmime/gmime-parser.h
+++ b/gmime/gmime-parser.h
@@ -54,7 +54,8 @@ typedef struct _GMimeParserClass GMimeParserClass;
**/
typedef enum {
GMIME_FORMAT_MESSAGE,
- GMIME_FORMAT_MBOX
+ GMIME_FORMAT_MBOX,
+ GMIME_FORMAT_MMDF
} GMimeFormat;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]