Lines Matching refs:ctx

18 static void status_flags_append(struct mbox_sync_mail_context *ctx,
24 if ((ctx->mail.flags & flags_list[i].flag) != 0)
25 str_append_c(ctx->header, flags_list[i].chr);
29 void mbox_sync_move_buffer(struct mbox_sync_mail_context *ctx,
38 if (ctx->header_last_change < pos + have ||
39 ctx->header_last_change == (size_t)-1)
40 ctx->header_last_change = pos + have;
42 /* FIXME: if (diff < ctx->space && pos < ctx->offset) then
46 ctx->header_last_change = (size_t)-1;
48 if (ctx->hdr_pos[i] > pos &&
49 ctx->hdr_pos[i] != (size_t)-1)
50 ctx->hdr_pos[i] += diff;
53 if (ctx->mail.space > 0) {
54 i_assert(ctx->mail.offset + ctx->mail.space <=
55 ctx->hdr_offset + pos ||
56 ctx->mail.offset > ctx->hdr_offset + pos + have);
57 if (ctx->mail.offset > ctx->hdr_offset + pos) {
59 ctx->mail.offset += diff;
64 str_delete(ctx->header, pos, -diff);
66 ctx->header_last_change = (size_t)-1;
67 buffer_copy(ctx->header, pos + diff,
68 ctx->header, pos, (size_t)-1);
73 static void status_flags_replace(struct mbox_sync_mail_context *ctx, size_t pos,
80 ctx->mail.flags ^= MBOX_NONRECENT_KLUDGE;
82 if (ctx->header_first_change > pos)
83 ctx->header_first_change = pos;
87 if ((ctx->mail.flags & flags_list[i].flag) != 0)
92 data = buffer_get_modifiable_data(ctx->header, &size);
111 mbox_sync_move_buffer(ctx, pos, need, have);
114 data = buffer_get_space_unsafe(ctx->header, pos, need);
116 if ((ctx->mail.flags & flags_list[i].flag) != 0)
120 ctx->mail.flags ^= MBOX_NONRECENT_KLUDGE;
154 keywords_append_all(struct mbox_sync_mail_context *ctx, string_t *dest,
158 INDEX_STORAGE_CONTEXT(&ctx->sync_ctx->mbox->box);
188 static void mbox_sync_add_missing_headers(struct mbox_sync_mail_context *ctx)
192 new_hdr_size = str_len(ctx->header);
194 str_data(ctx->header)[new_hdr_size-1] != '\n') {
196 str_append_c(ctx->header, '\n');
199 if (ctx->sync_ctx->dest_first_mail &&
200 ctx->hdr_pos[MBOX_HDR_X_IMAPBASE] == (size_t)-1) {
201 i_assert(ctx->sync_ctx->base_uid_validity != 0);
203 str_append(ctx->header, "X-IMAPbase: ");
204 ctx->hdr_pos[MBOX_HDR_X_IMAPBASE] = str_len(ctx->header);
207 startpos = str_len(ctx->header);
208 str_printfa(ctx->header, "%u ",
209 ctx->sync_ctx->base_uid_validity);
211 ctx->last_uid_updated_value = ctx->sync_ctx->next_uid-1;
212 ctx->last_uid_value_start_pos = str_len(ctx->header) -
213 ctx->hdr_pos[MBOX_HDR_X_IMAPBASE];
214 ctx->imapbase_updated = TRUE;
215 str_printfa(ctx->header, "%010u", ctx->last_uid_updated_value);
217 keywords_append_all(ctx, ctx->header, startpos);
218 str_append_c(ctx->header, '\n');
221 if (ctx->hdr_pos[MBOX_HDR_X_UID] == (size_t)-1 && !ctx->mail.pseudo) {
222 str_append(ctx->header, "X-UID: ");
223 ctx->hdr_pos[MBOX_HDR_X_UID] = str_len(ctx->header);
224 str_printfa(ctx->header, "%u\n", ctx->mail.uid);
227 ctx->mail.flags ^= MBOX_NONRECENT_KLUDGE;
229 if (ctx->hdr_pos[MBOX_HDR_STATUS] == (size_t)-1 &&
230 (ctx->mail.flags & STATUS_FLAGS_MASK) != 0) {
231 str_append(ctx->header, "Status: ");
232 ctx->hdr_pos[MBOX_HDR_STATUS] = str_len(ctx->header);
233 status_flags_append(ctx, mbox_status_flags);
234 str_append_c(ctx->header, '\n');
237 if (ctx->hdr_pos[MBOX_HDR_X_STATUS] == (size_t)-1 &&
238 (ctx->mail.flags & XSTATUS_FLAGS_MASK) != 0) {
239 str_append(ctx->header, "X-Status: ");
240 ctx->hdr_pos[MBOX_HDR_X_STATUS] = str_len(ctx->header);
241 status_flags_append(ctx, mbox_xstatus_flags);
242 str_append_c(ctx->header, '\n');
245 ctx->mail.flags ^= MBOX_NONRECENT_KLUDGE;
247 if (ctx->hdr_pos[MBOX_HDR_X_KEYWORDS] == (size_t)-1 &&
248 array_is_created(&ctx->mail.keywords) &&
249 array_count(&ctx->mail.keywords) > 0) {
250 str_append(ctx->header, "X-Keywords: ");
251 ctx->hdr_pos[MBOX_HDR_X_KEYWORDS] = str_len(ctx->header);
252 keywords_append(ctx->sync_ctx, ctx->header,
253 &ctx->mail.keywords);
254 str_append_c(ctx->header, '\n');
257 if (ctx->content_length == (uoff_t)-1 &&
258 ctx->mail.body_size >= MBOX_MIN_CONTENT_LENGTH_SIZE) {
259 str_printfa(ctx->header, "Content-Length: %"PRIuUOFF_T"\n",
260 ctx->mail.body_size);
263 if (str_len(ctx->header) != new_hdr_size) {
264 if (ctx->header_first_change == (size_t)-1)
265 ctx->header_first_change = new_hdr_size;
266 ctx->header_last_change = (size_t)-1;
269 if (ctx->have_eoh)
270 str_append_c(ctx->header, '\n');
273 static void mbox_sync_update_status(struct mbox_sync_mail_context *ctx)
275 if (ctx->hdr_pos[MBOX_HDR_STATUS] != (size_t)-1) {
276 status_flags_replace(ctx, ctx->hdr_pos[MBOX_HDR_STATUS],
281 static void mbox_sync_update_xstatus(struct mbox_sync_mail_context *ctx)
283 if (ctx->hdr_pos[MBOX_HDR_X_STATUS] != (size_t)-1) {
284 status_flags_replace(ctx, ctx->hdr_pos[MBOX_HDR_X_STATUS],
289 static void mbox_sync_update_line(struct mbox_sync_mail_context *ctx,
295 if (ctx->header_first_change > pos)
296 ctx->header_first_change = pos;
299 hdr = p = str_c(ctx->header) + pos;
312 file_pos = pos + ctx->hdr_offset;
313 if (ctx->mail.space > 0 && ctx->mail.offset >= file_pos &&
314 ctx->mail.offset < file_pos + (p - hdr)) {
316 ctx->mail.offset = ctx->hdr_offset;
317 ctx->mail.space = 0;
320 mbox_sync_move_buffer(ctx, pos, str_len(new_line), p - hdr + 1);
321 buffer_copy(ctx->header, pos, new_line, 0, (size_t)-1);
324 static void mbox_sync_update_xkeywords(struct mbox_sync_mail_context *ctx)
328 if (ctx->hdr_pos[MBOX_HDR_X_KEYWORDS] == (size_t)-1)
332 if (array_is_created(&ctx->mail.keywords))
333 keywords_append(ctx->sync_ctx, str, &ctx->mail.keywords);
335 mbox_sync_update_line(ctx, ctx->hdr_pos[MBOX_HDR_X_KEYWORDS], str);
338 static void mbox_sync_update_x_imap_base(struct mbox_sync_mail_context *ctx)
340 struct mbox_sync_context *sync_ctx = ctx->sync_ctx;
346 ctx->hdr_pos[MBOX_HDR_X_IMAPBASE] == (size_t)-1)
349 if (!ctx->imapbase_rewrite) {
359 ctx->last_uid_updated_value = sync_ctx->next_uid-1;
360 ctx->last_uid_value_start_pos = str_len(str);
361 ctx->imapbase_updated = TRUE;
362 str_printfa(str, "%010u", ctx->last_uid_updated_value);
364 keywords_append_all(ctx, str, 0);
367 mbox_sync_update_line(ctx, ctx->hdr_pos[MBOX_HDR_X_IMAPBASE], str);
370 static void mbox_sync_update_x_uid(struct mbox_sync_mail_context *ctx)
374 if (ctx->hdr_pos[MBOX_HDR_X_UID] == (size_t)-1 ||
375 ctx->mail.uid == ctx->parsed_uid)
379 str_printfa(str, "%u\n", ctx->mail.uid);
380 mbox_sync_update_line(ctx, ctx->hdr_pos[MBOX_HDR_X_UID], str);
383 static void mbox_sync_update_header_real(struct mbox_sync_mail_context *ctx)
385 i_assert(ctx->mail.uid != 0 || ctx->mail.pseudo);
387 if (!ctx->sync_ctx->keep_recent)
388 ctx->mail.flags &= ~MAIL_RECENT;
390 mbox_sync_update_status(ctx);
391 mbox_sync_update_xstatus(ctx);
392 mbox_sync_update_xkeywords(ctx);
394 mbox_sync_update_x_imap_base(ctx);
395 mbox_sync_update_x_uid(ctx);
397 mbox_sync_add_missing_headers(ctx);
398 ctx->updated = TRUE;
401 void mbox_sync_update_header(struct mbox_sync_mail_context *ctx)
404 mbox_sync_update_header_real(ctx);
409 mbox_sync_update_header_from_real(struct mbox_sync_mail_context *ctx,
413 (ctx->mail.flags & STATUS_FLAGS_MASK) !=
415 (ctx->mail.flags & MAIL_RECENT) != 0) {
416 ctx->mail.flags = (ctx->mail.flags & ~STATUS_FLAGS_MASK) |
418 if (!ctx->sync_ctx->keep_recent)
419 ctx->mail.flags &= ~MAIL_RECENT;
420 mbox_sync_update_status(ctx);
423 (ctx->mail.flags & XSTATUS_FLAGS_MASK) !=
425 ctx->mail.flags = (ctx->mail.flags & ~XSTATUS_FLAGS_MASK) |
427 mbox_sync_update_xstatus(ctx);
432 if (array_is_created(&ctx->mail.keywords)) {
433 array_clear(&ctx->mail.keywords);
434 mbox_sync_update_xkeywords(ctx);
436 } else if (!array_is_created(&ctx->mail.keywords)) {
438 p_array_init(&ctx->mail.keywords,
439 ctx->sync_ctx->mail_keyword_pool,
441 array_append_array(&ctx->mail.keywords,
443 mbox_sync_update_xkeywords(ctx);
444 } else if (!array_cmp(&ctx->mail.keywords, &mail->keywords)) {
446 array_clear(&ctx->mail.keywords);
447 array_append_array(&ctx->mail.keywords,
449 mbox_sync_update_xkeywords(ctx);
452 i_assert(ctx->mail.uid == 0 || ctx->mail.uid == mail->uid);
453 ctx->mail.uid = mail->uid;
455 mbox_sync_update_x_imap_base(ctx);
456 mbox_sync_update_x_uid(ctx);
457 mbox_sync_add_missing_headers(ctx);
460 void mbox_sync_update_header_from(struct mbox_sync_mail_context *ctx,
464 mbox_sync_update_header_from_real(ctx, mail);