aboutsummaryrefslogtreecommitdiffstats
path: root/camel/camel-mime-parser.h
blob: 0f637e3a90bd97ec31e4edf24de185b91830824f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
/*
 *  Copyright (C) 2000 Ximian Inc.
 *
 *  Authors: Michael Zucchi <notzed@ximian.com>
 *
 *  This program is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Library General Public License
 *  as published by the Free Software Foundation; either version 2 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 Library General Public License for more details.
 *
 *  You should have received a copy of the GNU Library General Public
 *  License along with this program; if not, write to the Free Software
 *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */

#ifndef _CAMEL_MIME_PARSER_H
#define _CAMEL_MIME_PARSER_H

#include <camel/camel-object.h>

#include <camel/camel-mime-utils.h>
#include <camel/camel-mime-filter.h>
#include <camel/camel-stream.h>

#define CAMEL_MIME_PARSER(obj)         CAMEL_CHECK_CAST (obj, camel_mime_parser_get_type (), CamelMimeParser)
#define CAMEL_MIME_PARSER_CLASS(klass) CAMEL_CHECK_CLASS_CAST (klass, camel_mime_parser_get_type (), CamelMimeParserClass)
#define CAMEL_IS_MIME_PARSER(obj)      CAMEL_CHECK_TYPE (obj, camel_mime_parser_get_type ())

typedef struct _CamelMimeParserClass CamelMimeParserClass;

/* NOTE: if you add more states, you may need to bump the
   start of the END tags to 16 or 32, etc - so they are
   the same as the matching start tag, with a bit difference */
enum _header_state {
    HSCAN_INITIAL,
    HSCAN_PRE_FROM,     /* data before a 'From' line */
    HSCAN_FROM,     /* got 'From' line */
    HSCAN_HEADER,       /* toplevel header */
    HSCAN_BODY,     /* scanning body of message */
    HSCAN_MULTIPART,    /* got multipart header */
    HSCAN_MESSAGE,      /* rfc822 message */

    HSCAN_PART,     /* part of a multipart */

    HSCAN_END = 8,      /* bit mask for 'end' flags */

    HSCAN_EOF = 8,      /* end of file */
    HSCAN_PRE_FROM_END, /* pre from end */
    HSCAN_FROM_END,     /* end of whole from bracket */
    HSCAN_HEADER_END,   /* dummy value */
    HSCAN_BODY_END,     /* end of message */
    HSCAN_MULTIPART_END,    /* end of multipart  */
    HSCAN_MESSAGE_END,  /* end of message */

};

struct _CamelMimeParser {
    CamelObject parent;

    struct _CamelMimeParserPrivate *priv;
};

struct _CamelMimeParserClass {
    CamelObjectClass parent_class;

    void (*message)(CamelMimeParser *, void *headers);
    void (*part)(CamelMimeParser *);
    void (*content)(CamelMimeParser *);
};

guint       camel_mime_parser_get_type  (void);
CamelMimeParser      *camel_mime_parser_new (void);

/* using an fd will be a little faster, but not much (over a simple stream) */
int     camel_mime_parser_init_with_fd(CamelMimeParser *, int fd);
int     camel_mime_parser_init_with_stream(CamelMimeParser *m, CamelStream *stream);

/* get the stream or fd back of the parser */
CamelStream    *camel_mime_parser_stream(CamelMimeParser *m);
int     camel_mime_parser_fd(CamelMimeParser *m);

/* scan 'From' separators? */
void camel_mime_parser_scan_from(CamelMimeParser *, int);
/* Do we want to know about the pre-from data? */
void camel_mime_parser_scan_pre_from(CamelMimeParser *, int);

/* what headers to save, MUST include ^Content-Type: */
int camel_mime_parser_set_header_regex(CamelMimeParser *m, char *matchstr);

/* normal interface */
enum _header_state camel_mime_parser_step(CamelMimeParser *, char **, int *);
void camel_mime_parser_unstep(CamelMimeParser *);
void camel_mime_parser_drop_step(CamelMimeParser *m);
enum _header_state camel_mime_parser_state(CamelMimeParser *);

/* read through the parser */
int camel_mime_parser_read(CamelMimeParser *m, const char **databuffer, int len);

/* get content type for the current part/header */
struct _header_content_type *camel_mime_parser_content_type(CamelMimeParser *);

/* get/change raw header by name */
const char *camel_mime_parser_header(CamelMimeParser *, const char *, int *offset);

/* get all raw headers. READ ONLY! */
struct _header_raw *camel_mime_parser_headers_raw(CamelMimeParser *);

/* get multipart pre/postface */
const char *camel_mime_parser_preface(CamelMimeParser *m);
const char *camel_mime_parser_postface(CamelMimeParser *m);

/* return the from line content */
const char *camel_mime_parser_from_line(CamelMimeParser *m);

/* add a processing filter for body contents */
int camel_mime_parser_filter_add(CamelMimeParser *, CamelMimeFilter *);
void camel_mime_parser_filter_remove(CamelMimeParser *, int);

/* these should be used with caution, because the state will not
   track the seeked position */
/* FIXME: something to bootstrap the state? */
off_t camel_mime_parser_tell(CamelMimeParser *);
off_t camel_mime_parser_seek(CamelMimeParser *, off_t, int);

off_t camel_mime_parser_tell_start_headers(CamelMimeParser *);
off_t camel_mime_parser_tell_start_from(CamelMimeParser *);

#endif /* ! _CAMEL_MIME_PARSER_H */