Revision 54aea252 lib/filters/textcontent-filter.c

b/lib/filters/textcontent-filter.c
5 5
#include "textcontent-filter.h"
6 6

  
7 7

  
8
static char *xfilter_rfc822_to_text(const XMessageData *data)
8
static XMessageData *xfilter_rfc822_to_text(const XMessageData *data)
9 9
{
10 10
	const char *rfc822content;
11
	const char *p, *eolp;
11
	const char *p, *eolp, *prev_eolp = NULL, *vp = NULL;
12
	XMessageData *newdata;
13
	XMessageAttr attr = -1;
14
	GString *from, *to, *cc, *subject;
12 15

  
13 16
	p = rfc822content = xfilter_message_data_get_content(data);
14 17
	if (!rfc822content)
15 18
		return NULL;
16 19

  
17
	/* find empty line */
20
	from = g_string_new("");
21
	to = g_string_new("");
22
	cc = g_string_new("");
23
	subject = g_string_new("");
24

  
25
	/* parse headers */
18 26
	while (*p) {
19 27
		eolp = strchr(p, '\n');
20
		if (!eolp)
21
			return g_strdup("");
28
		if (!eolp) {
29
			p = NULL;
30
			break;
31
		}
22 32
		if (p == eolp || (*p == '\r' && p + 1 == eolp)) {
23 33
			p = eolp + 1;
24 34
			break;
25 35
		}
36

  
37
		if (!g_ascii_isspace(*p)) {
38
			if (vp && vp < prev_eolp) {
39
				switch (attr) {
40
				case XM_FROM:
41
					if (from->len > 0)
42
						g_string_append_c(from, ' ');
43
					g_string_append_len(from, vp, prev_eolp - vp);
44
					break;
45
				case XM_TO:
46
					if (to->len > 0)
47
						g_string_append_c(to, ' ');
48
					g_string_append_len(to, vp, prev_eolp - vp);
49
					break;
50
				case XM_CC:
51
					if (cc->len > 0)
52
						g_string_append_c(cc, ' ');
53
					g_string_append_len(cc, vp, prev_eolp - vp);
54
					break;
55
				case XM_SUBJECT:
56
					if (subject->len > 0)
57
						g_string_append_c(subject, ' ');
58
					g_string_append_len(subject, vp, prev_eolp - vp);
59
					break;
60
				default:
61
					break;
62
				}
63
				attr = -1;
64
				vp = NULL;
65
			}
66

  
67
			if (!g_ascii_strncasecmp(p, "From:", 5)) {
68
				attr = XM_FROM;
69
				vp = p + 5;
70
			} else if (!g_ascii_strncasecmp(p, "To:", 3)) {
71
				attr = XM_TO;
72
				vp = p + 3;
73
			} else if (!g_ascii_strncasecmp(p, "Cc:", 3)) {
74
				attr = XM_CC;
75
				vp = p + 3;
76
			} else if (!g_ascii_strncasecmp(p, "Subject:", 8)) {
77
				attr = XM_SUBJECT;
78
				vp = p + 8;
79
			}
80
		}
81

  
82
		prev_eolp = eolp;
26 83
		p = eolp + 1;
27 84
	}
28 85

  
29
	return g_strdup(p);
86
	newdata = xfilter_message_data_new(p ? p : "", "text/plain");
87
	if (from->len)
88
		xfilter_message_data_set_attribute(newdata, XM_FROM, from->str, FALSE);
89
	if (to->len)
90
		xfilter_message_data_set_attribute(newdata, XM_TO, to->str, FALSE);
91
	if (cc->len)
92
		xfilter_message_data_set_attribute(newdata, XM_CC, cc->str, FALSE);
93
	if (subject->len)
94
		xfilter_message_data_set_attribute(newdata, XM_SUBJECT, subject->str, FALSE);
95

  
96
	g_string_free(subject, TRUE);
97
	g_string_free(cc, TRUE);
98
	g_string_free(to, TRUE);
99
	g_string_free(from, TRUE);
100

  
101
	return newdata;
30 102
}
31 103

  
32 104
static XFilterStatus xfilter_content_func(XFilter *filter, const XMessageData *data, XFilterResult *result)
33 105
{
34 106
	const char *mime_type;
35 107
	const char *content;
36
	char *new_content;
37 108
	XMessageData *newdata;
38 109

  
39 110
	g_return_val_if_fail(result != NULL, XF_ERROR);
......
47 118
		newdata = xfilter_message_data_new(content, "text/plain");
48 119
		xfilter_result_set_message_data(result, newdata);
49 120
	} else if (!g_strcasecmp(mime_type, "message/rfc822")) {
50
		new_content = xfilter_rfc822_to_text(data);
51
		newdata = xfilter_message_data_new(new_content, "text/plain");
121
		newdata = xfilter_rfc822_to_text(data);
52 122
		xfilter_result_set_message_data(result, newdata);
53
		g_free(new_content);
123
		g_print("from:%s\n", xfilter_message_data_get_attribute(newdata, XM_FROM));
124
		g_print("to:%s\n", xfilter_message_data_get_attribute(newdata, XM_TO));
125
		g_print("cc:%s\n", xfilter_message_data_get_attribute(newdata, XM_CC));
126
		g_print("subject:%s\n", xfilter_message_data_get_attribute(newdata, XM_SUBJECT));
54 127
	} else
55 128
		return XF_UNSUPPORTED_TYPE;
56 129

  

Also available in: Unified diff