annotate src/lib-index/mbox/mbox-append.c @ 289:c020e1168cc3 HEAD

Ignore empty lines at beginning of mbox file.
author Timo Sirainen <tss@iki.fi>
date Sun, 22 Sep 2002 12:27:21 +0300
parents 54b3b82bd73e
children 3dcc2275b4ca
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1 /* Copyright (C) 2002 Timo Sirainen */
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "lib.h"
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
4 #include "ioloop.h"
22
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
5 #include "iobuffer.h"
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
6 #include "hex-binary.h"
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
7 #include "md5.h"
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
8 #include "mbox-index.h"
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9 #include "mail-index-util.h"
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
10
207
9f78db959fdc Broke saving new mail
Timo Sirainen <tss@iki.fi>
parents: 206
diff changeset
11 static MailIndexRecord *mail_index_record_append_begin(MailIndex *index,
9f78db959fdc Broke saving new mail
Timo Sirainen <tss@iki.fi>
parents: 206
diff changeset
12 time_t internal_date)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13 {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14 MailIndexRecord trec, *rec;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
15
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16 memset(&trec, 0, sizeof(MailIndexRecord));
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
17 trec.internal_date = internal_date;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
18
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
19 rec = &trec;
207
9f78db959fdc Broke saving new mail
Timo Sirainen <tss@iki.fi>
parents: 206
diff changeset
20 if (!index->append_begin(index, &rec))
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
21 return NULL;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
22
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
23 return rec;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
24 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
25
160
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents: 127
diff changeset
26 static void mbox_read_message(IOBuffer *inbuf)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
27 {
22
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
28 unsigned char *msg;
184
4223b9ed0c80 move size_t fixes
Timo Sirainen <tss@iki.fi>
parents: 180
diff changeset
29 size_t i, size, startpos;
78
0d8bfff71b80 yet more mbox fix fixes
Timo Sirainen <tss@iki.fi>
parents: 76
diff changeset
30 int lastmsg;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
31
22
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
32 /* read until "[\r]\nFrom " is found */
160
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents: 127
diff changeset
33 startpos = i = 0; lastmsg = TRUE;
232
9277e893304e s/io_buffer_read_data/io_buffer_read_data_blocking/ and fixed the various
Timo Sirainen <tss@iki.fi>
parents: 207
diff changeset
34 while (io_buffer_read_data_blocking(inbuf, &msg, &size, startpos) > 0) {
22
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
35 for (i = startpos; i < size; i++) {
160
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents: 127
diff changeset
36 if (msg[i] == ' ' && i >= 5) {
22
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
37 /* See if it's space after "From" */
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
38 if (msg[i-5] == '\n' && msg[i-4] == 'F' &&
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
39 msg[i-3] == 'r' && msg[i-2] == 'o' &&
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
40 msg[i-1] == 'm') {
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
41 /* yes, see if we had \r too */
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
42 i -= 5;
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
43 if (i > 0 && msg[i-1] == '\r')
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
44 i--;
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
45 break;
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
46 }
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
47 }
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
48 }
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
49
22
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
50 if (i < size) {
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
51 startpos = i;
78
0d8bfff71b80 yet more mbox fix fixes
Timo Sirainen <tss@iki.fi>
parents: 76
diff changeset
52 lastmsg = FALSE;
22
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
53 break;
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
54 }
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
55
232
9277e893304e s/io_buffer_read_data/io_buffer_read_data_blocking/ and fixed the various
Timo Sirainen <tss@iki.fi>
parents: 207
diff changeset
56 startpos = i < 7 ? i : 7;
9277e893304e s/io_buffer_read_data/io_buffer_read_data_blocking/ and fixed the various
Timo Sirainen <tss@iki.fi>
parents: 207
diff changeset
57 i -= startpos;
22
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
58
232
9277e893304e s/io_buffer_read_data/io_buffer_read_data_blocking/ and fixed the various
Timo Sirainen <tss@iki.fi>
parents: 207
diff changeset
59 io_buffer_skip(inbuf, i);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
60 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
61
78
0d8bfff71b80 yet more mbox fix fixes
Timo Sirainen <tss@iki.fi>
parents: 76
diff changeset
62 if (lastmsg && startpos > 0) {
76
8035cf09b913 mbox fixes
Timo Sirainen <tss@iki.fi>
parents: 50
diff changeset
63 /* end of file, remove the last [\r]\n */
79
d1407cb2b39b more fix fixes (maybe i should test these before committing :)
Timo Sirainen <tss@iki.fi>
parents: 78
diff changeset
64 msg = io_buffer_get_data(inbuf, &size);
d1407cb2b39b more fix fixes (maybe i should test these before committing :)
Timo Sirainen <tss@iki.fi>
parents: 78
diff changeset
65 if (size == startpos) {
d1407cb2b39b more fix fixes (maybe i should test these before committing :)
Timo Sirainen <tss@iki.fi>
parents: 78
diff changeset
66 if (msg[startpos-1] == '\n')
d1407cb2b39b more fix fixes (maybe i should test these before committing :)
Timo Sirainen <tss@iki.fi>
parents: 78
diff changeset
67 startpos--;
d1407cb2b39b more fix fixes (maybe i should test these before committing :)
Timo Sirainen <tss@iki.fi>
parents: 78
diff changeset
68 if (startpos > 0 && msg[startpos-1] == '\r')
d1407cb2b39b more fix fixes (maybe i should test these before committing :)
Timo Sirainen <tss@iki.fi>
parents: 78
diff changeset
69 startpos--;
d1407cb2b39b more fix fixes (maybe i should test these before committing :)
Timo Sirainen <tss@iki.fi>
parents: 78
diff changeset
70 }
76
8035cf09b913 mbox fixes
Timo Sirainen <tss@iki.fi>
parents: 50
diff changeset
71 }
8035cf09b913 mbox fixes
Timo Sirainen <tss@iki.fi>
parents: 50
diff changeset
72
22
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
73 io_buffer_skip(inbuf, startpos);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
74 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
75
22
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
76 static int mbox_index_append_next(MailIndex *index, IOBuffer *inbuf)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
77 {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
78 MailIndexRecord *rec;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
79 MailIndexUpdate *update;
22
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
80 MboxHeaderContext ctx;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
81 time_t internal_date;
82
438d5f258b01 maybe now?
Timo Sirainen <tss@iki.fi>
parents: 81
diff changeset
82 uoff_t abs_start_offset, stop_offset, old_size;
22
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
83 unsigned char *data, md5_digest[16];
184
4223b9ed0c80 move size_t fixes
Timo Sirainen <tss@iki.fi>
parents: 180
diff changeset
84 size_t size, pos;
196
95d21ab87eeb X-IMAPbase is now parsed correctly.
Timo Sirainen <tss@iki.fi>
parents: 184
diff changeset
85 int failed;
22
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
86
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
87 /* get the From-line */
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
88 pos = 0;
232
9277e893304e s/io_buffer_read_data/io_buffer_read_data_blocking/ and fixed the various
Timo Sirainen <tss@iki.fi>
parents: 207
diff changeset
89 while (io_buffer_read_data_blocking(inbuf, &data, &size, pos) > 0) {
22
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
90 for (; pos < size; pos++) {
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
91 if (data[pos] == '\n')
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
92 break;
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
93 }
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
94
22
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
95 if (pos < size)
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
96 break;
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
97 }
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
98
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
99 if (pos == size || size <= 5 || strncmp(data, "From ", 5) != 0) {
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
100 /* a) no \n found, or line too long
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
101 b) not a From-line */
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
102 index_set_error(index, "Error indexing mbox file %s: "
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
103 "From-line not found where expected",
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
104 index->mbox_path);
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
105 index->set_flags |= MAIL_INDEX_FLAG_FSCK;
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
106 return FALSE;
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
107 }
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
108
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
109 /* parse the From-line */
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
110 internal_date = mbox_from_parse_date(data, size);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
111 if (internal_date <= 0)
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
112 internal_date = ioloop_time;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
113
22
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
114 io_buffer_skip(inbuf, pos+1);
82
438d5f258b01 maybe now?
Timo Sirainen <tss@iki.fi>
parents: 81
diff changeset
115 abs_start_offset = inbuf->start_offset + inbuf->offset;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
116
22
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
117 /* now, find the ending "[\r]\nFrom " */
160
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents: 127
diff changeset
118 mbox_read_message(inbuf);
22
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
119 stop_offset = inbuf->offset;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
120
22
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
121 /* add message to index */
207
9f78db959fdc Broke saving new mail
Timo Sirainen <tss@iki.fi>
parents: 206
diff changeset
122 rec = mail_index_record_append_begin(index, internal_date);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
123 if (rec == NULL)
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
124 return FALSE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
125
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
126 update = index->update_begin(index, rec);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
127
104
a6d7ed739926 added index->lookup_field_raw() and update_field_raw(), changed mbox to save
Timo Sirainen <tss@iki.fi>
parents: 82
diff changeset
128 /* location = offset to beginning of headers in message */
a6d7ed739926 added index->lookup_field_raw() and update_field_raw(), changed mbox to save
Timo Sirainen <tss@iki.fi>
parents: 82
diff changeset
129 index->update_field_raw(update, FIELD_TYPE_LOCATION,
a6d7ed739926 added index->lookup_field_raw() and update_field_raw(), changed mbox to save
Timo Sirainen <tss@iki.fi>
parents: 82
diff changeset
130 &abs_start_offset, sizeof(uoff_t));
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
131
22
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
132 /* parse the header and cache wanted fields. get the message flags
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
133 from Status and X-Status fields. temporarily limit the buffer size
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
134 so the message body is parsed properly (FIXME: does this have
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
135 side effects?) */
180
38341ad6a9db partial changes to add X-IMAPbase parser update custom flags
Timo Sirainen <tss@iki.fi>
parents: 160
diff changeset
136 mbox_header_init_context(&ctx, index);
22
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
137
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
138 old_size = inbuf->size;
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
139 inbuf->size = stop_offset;
82
438d5f258b01 maybe now?
Timo Sirainen <tss@iki.fi>
parents: 81
diff changeset
140 io_buffer_seek(inbuf, abs_start_offset - inbuf->start_offset);
22
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
141
25
55e09f36d23d after a few times of trying to access uncached fields, they're cached the
Timo Sirainen <tss@iki.fi>
parents: 22
diff changeset
142 mail_index_update_headers(update, inbuf, 0, mbox_header_func, &ctx);
22
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
143
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
144 inbuf->size = old_size;
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
145 io_buffer_seek(inbuf, stop_offset);
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
146
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
147 /* save MD5 */
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
148 md5_final(&ctx.md5, md5_digest);
160
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents: 127
diff changeset
149 index->update_field_raw(update, FIELD_TYPE_MD5,
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents: 127
diff changeset
150 md5_digest, sizeof(md5_digest));
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
151
206
0bb7bf7266ab cleanups / reliability fixes
Timo Sirainen <tss@iki.fi>
parents: 196
diff changeset
152 if (!index->update_end(update))
196
95d21ab87eeb X-IMAPbase is now parsed correctly.
Timo Sirainen <tss@iki.fi>
parents: 184
diff changeset
153 failed = TRUE;
206
0bb7bf7266ab cleanups / reliability fixes
Timo Sirainen <tss@iki.fi>
parents: 196
diff changeset
154 else {
196
95d21ab87eeb X-IMAPbase is now parsed correctly.
Timo Sirainen <tss@iki.fi>
parents: 184
diff changeset
155 /* save message flags */
95d21ab87eeb X-IMAPbase is now parsed correctly.
Timo Sirainen <tss@iki.fi>
parents: 184
diff changeset
156 rec->msg_flags = ctx.flags;
95d21ab87eeb X-IMAPbase is now parsed correctly.
Timo Sirainen <tss@iki.fi>
parents: 184
diff changeset
157 mail_index_mark_flag_changes(index, rec, 0, rec->msg_flags);
95d21ab87eeb X-IMAPbase is now parsed correctly.
Timo Sirainen <tss@iki.fi>
parents: 184
diff changeset
158 failed = FALSE;
206
0bb7bf7266ab cleanups / reliability fixes
Timo Sirainen <tss@iki.fi>
parents: 196
diff changeset
159
207
9f78db959fdc Broke saving new mail
Timo Sirainen <tss@iki.fi>
parents: 206
diff changeset
160 if (!index->append_end(index, rec))
9f78db959fdc Broke saving new mail
Timo Sirainen <tss@iki.fi>
parents: 206
diff changeset
161 failed = TRUE;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
162 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
163
196
95d21ab87eeb X-IMAPbase is now parsed correctly.
Timo Sirainen <tss@iki.fi>
parents: 184
diff changeset
164 mbox_header_free_context(&ctx);
160
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents: 127
diff changeset
165
196
95d21ab87eeb X-IMAPbase is now parsed correctly.
Timo Sirainen <tss@iki.fi>
parents: 184
diff changeset
166 return !failed;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
167 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
168
22
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
169 int mbox_index_append(MailIndex *index, IOBuffer *inbuf)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
170 {
289
c020e1168cc3 Ignore empty lines at beginning of mbox file.
Timo Sirainen <tss@iki.fi>
parents: 267
diff changeset
171 if (inbuf->offset == inbuf->size) {
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
172 /* no new data */
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
173 return TRUE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
174 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
175
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
176 if (!index->set_lock(index, MAIL_LOCK_EXCLUSIVE))
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
177 return FALSE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
178
22
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
179 for (;;) {
80
2876947b8d38 more fixes
Timo Sirainen <tss@iki.fi>
parents: 79
diff changeset
180 if (inbuf->start_offset + inbuf->offset != 0) {
22
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
181 /* we're at the [\r]\n before the From-line,
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
182 skip it */
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
183 if (!mbox_skip_crlf(inbuf)) {
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
184 index_set_error(index,
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
185 "Error indexing mbox file %s: "
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
186 "LF not found where expected",
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
187 index->mbox_path);
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
188
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
189 index->set_flags |= MAIL_INDEX_FLAG_FSCK;
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
190 return FALSE;
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
191 }
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
192 }
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
193
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
194 if (inbuf->offset == inbuf->size)
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
195 break;
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
196
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
197 if (!mbox_index_append_next(index, inbuf))
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
198 return FALSE;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
199 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
200
22
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
201 return TRUE;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
202 }