Lines Matching refs:mail_ctx
130 struct mbox_sync_mail_context *mail_ctx)
140 i_zero(mail_ctx);
141 mail_ctx->sync_ctx = sync_ctx;
142 mail_ctx->seq = ++sync_ctx->seq;
143 mail_ctx->header = sync_ctx->header;
145 mail_ctx->mail.from_offset =
147 if (istream_raw_mbox_get_header_offset(sync_ctx->input, &mail_ctx->mail.offset) < 0) {
149 "Couldn't get header offset for seq=%u", mail_ctx->seq);
153 if (mbox_sync_parse_next_mail(sync_ctx->input, mail_ctx) < 0)
158 i_assert(sync_ctx->input->v_offset != mail_ctx->mail.from_offset ||
162 mail_ctx->content_length,
163 &mail_ctx->mail.body_size) < 0) {
165 "Couldn't get body size for seq=%u", mail_ctx->seq);
168 i_assert(mail_ctx->mail.body_size < OFF_T_MAX);
170 if ((mail_ctx->mail.flags & MAIL_RECENT) != 0 &&
171 !mail_ctx->mail.pseudo) {
174 mail_ctx->need_rewrite = TRUE;
176 mail_ctx->recent = TRUE;
305 mbox_sync_update_index_keywords(struct mbox_sync_mail_context *mail_ctx)
307 struct mbox_sync_context *sync_ctx = mail_ctx->sync_ctx;
311 keywords = !array_is_created(&mail_ctx->mail.keywords) ?
314 &mail_ctx->mail.keywords);
321 mbox_sync_update_md5_if_changed(struct mbox_sync_mail_context *mail_ctx)
323 struct mbox_sync_context *sync_ctx = mail_ctx->sync_ctx;
329 memcmp(mail_ctx->hdr_md5_sum, ext_data, 16) != 0) {
332 mail_ctx->hdr_md5_sum, NULL);
336 static void mbox_sync_get_dirty_flags(struct mbox_sync_mail_context *mail_ctx,
339 struct mbox_sync_context *sync_ctx = mail_ctx->sync_ctx;
345 mail_ctx->mail.flags &= ~MAIL_INDEX_MAIL_FLAG_DIRTY;
349 mbox_flags = mail_ctx->mail.flags & MAIL_FLAGS_NONRECENT;
351 mail_ctx->need_rewrite = TRUE;
352 mail_ctx->mail.flags = (mail_ctx->mail.flags & MAIL_RECENT) |
360 if (!index_keyword_array_cmp(&idx_keywords, &mail_ctx->mail.keywords)) {
361 mail_ctx->need_rewrite = TRUE;
362 mail_ctx->mail.flags |= MAIL_INDEX_MAIL_FLAG_DIRTY;
364 if (!array_is_created(&mail_ctx->mail.keywords)) {
365 p_array_init(&mail_ctx->mail.keywords,
369 array_clear(&mail_ctx->mail.keywords);
370 array_append_array(&mail_ctx->mail.keywords, &idx_keywords);
374 static void mbox_sync_update_flags(struct mbox_sync_mail_context *mail_ctx,
377 struct mbox_sync_context *sync_ctx = mail_ctx->sync_ctx;
379 struct mbox_sync_mail *mail = &mail_ctx->mail;
388 mbox_sync_get_dirty_flags(mail_ctx, rec);
404 mail_ctx->need_rewrite = TRUE;
409 box->v.sync_notify(box, mail_ctx->mail.uid,
414 static void mbox_sync_update_index(struct mbox_sync_mail_context *mail_ctx,
417 struct mbox_sync_context *sync_ctx = mail_ctx->sync_ctx;
418 struct mbox_sync_mail *mail = &mail_ctx->mail;
426 } else if (mail_ctx->need_rewrite) {
436 mbox_sync_update_index_keywords(mail_ctx);
441 mail_ctx->hdr_md5_sum, NULL);
465 mbox_sync_update_index_keywords(mail_ctx);
469 mbox_sync_update_md5_if_changed(mail_ctx);
472 if (!mail_ctx->recent) {
603 static void mbox_sync_handle_expunge(struct mbox_sync_mail_context *mail_ctx)
605 struct mbox_sync_context *sync_ctx = mail_ctx->sync_ctx;
609 box->v.sync_notify(box, mail_ctx->mail.uid,
612 mail_index_expunge(sync_ctx->t, mail_ctx->mail.idx_seq);
614 mail_ctx->mail.expunged = TRUE;
615 mail_ctx->mail.offset = mail_ctx->mail.from_offset;
616 mail_ctx->mail.space =
617 mail_ctx->body_offset - mail_ctx->mail.from_offset +
618 mail_ctx->mail.body_size;
619 mail_ctx->mail.body_size = 0;
620 mail_ctx->mail.uid = 0;
625 mail_ctx->mail.space++;
627 mail_ctx->mail.space++;
635 sync_ctx->expunged_space += mail_ctx->mail.space;
638 static int mbox_sync_handle_header(struct mbox_sync_mail_context *mail_ctx)
640 struct mbox_sync_context *sync_ctx = mail_ctx->sync_ctx;
649 orig_from_offset = mail_ctx->mail.from_offset;
654 mail_ctx->mail.from_offset++;
656 mail_ctx->mail.from_offset++;
658 postlf_from_offset = mail_ctx->mail.from_offset;
661 if (mbox_read_from_line(mail_ctx) < 0)
663 i_assert(mail_ctx->mail.from_offset + move_diff != 1 &&
664 mail_ctx->mail.from_offset + move_diff != 2);
666 mbox_sync_update_header(mail_ctx);
667 ret = mbox_sync_try_rewrite(mail_ctx, move_diff);
674 i_assert((off_t)mail_ctx->mail.from_offset >=
676 mail_ctx->mail.from_offset += move_diff;
677 mail_ctx->mail.offset += move_diff;
678 if (mbox_write_from_line(mail_ctx) < 0)
684 mail_ctx->mail.from_offset = orig_from_offset;
687 } else if (mail_ctx->need_rewrite) {
688 mbox_sync_update_header(mail_ctx);
693 mail_ctx->dirty = TRUE;
697 if ((ret = mbox_sync_try_rewrite(mail_ctx, 0)) < 0)
718 mail_ctx->mail.from_offset = postlf_from_offset;
723 mail_ctx->mail.from_offset -
729 i_assert(sync_ctx->space_diff < -mail_ctx->mail.space);
739 mbox_sync_handle_missing_space(struct mbox_sync_mail_context *mail_ctx)
741 struct mbox_sync_context *sync_ctx = mail_ctx->sync_ctx;
746 i_assert(mail_ctx->mail.uid == 0 || mail_ctx->mail.space > 0 ||
747 mail_ctx->mail.offset == mail_ctx->hdr_offset);
749 if (array_is_created(&mail_ctx->mail.keywords)) {
754 array_count(&mail_ctx->mail.keywords));
755 array_append_array(&keywords_copy, &mail_ctx->mail.keywords);
756 mail_ctx->mail.keywords = keywords_copy;
758 array_append(&sync_ctx->mails, &mail_ctx->mail, 1);
760 sync_ctx->space_diff += mail_ctx->mail.space;
764 mail_ctx->mail.space);
771 if (mail_ctx->mail.uid == 0) {
776 i_assert(mail_ctx->mail.space >= sync_ctx->space_diff);
779 needed_space = mail_ctx->mail.space - sync_ctx->space_diff;
784 mail_ctx->mail.space - move_diff;
786 move_diff = mail_ctx->mail.space;
793 end_offset = mail_ctx->mail.from_offset;
799 end_offset = mail_ctx->body_offset;
807 last_seq == sync_ctx->seq ? mail_ctx : NULL,
814 /* mail_ctx may contain wrong data after rewrite, so make sure we
816 i_zero(mail_ctx);
990 struct mbox_sync_mail_context *mail_ctx)
996 mail_ctx->imapbase_rewrite = TRUE;
997 mail_ctx->need_rewrite = TRUE;
1004 mail_ctx->imapbase_rewrite = TRUE;
1005 mail_ctx->need_rewrite = TRUE;
1010 struct mbox_sync_mail_context *mail_ctx)
1023 mbox_sync_hdr_update(sync_ctx, mail_ctx);
1028 struct mbox_sync_mail_context *mail_ctx,
1055 while ((ret = mbox_sync_read_next_mail(sync_ctx, mail_ctx)) > 0) {
1056 uid = mail_ctx->mail.uid;
1058 if (mail_ctx->seq == 1) {
1059 if (mbox_sync_imapbase(sync_ctx, mail_ctx)) {
1065 if (mail_ctx->mail.uid_broken && partial) {
1077 if (mail_ctx->mail.uid_broken)
1080 if (mail_ctx->mail.pseudo)
1093 !mail_ctx->mail.pseudo &&
1102 mail_ctx->hdr_md5_sum, &rec);
1104 uid = mail_ctx->mail.uid = rec->uid;
1111 mail_ctx->mail.pseudo ? 1 : uid,
1114 if (mail_ctx->mail.pseudo) {
1125 if (uid == 0 && !mail_ctx->mail.pseudo) {
1143 mail_ctx->need_rewrite = TRUE;
1144 mail_ctx->mail.uid = sync_ctx->next_uid++;
1146 sync_ctx->prev_msg_uid = mail_ctx->mail.uid;
1148 if (!mail_ctx->mail.pseudo)
1149 mail_ctx->mail.idx_seq = sync_ctx->idx_seq;
1152 if (!mail_ctx->mail.pseudo) T_BEGIN {
1153 mbox_sync_update_flags(mail_ctx, rec);
1155 if (mbox_sync_handle_header(mail_ctx) < 0)
1159 mbox_sync_handle_expunge(mail_ctx);
1162 if (!mail_ctx->mail.pseudo) {
1164 mbox_sync_update_index(mail_ctx, rec);
1170 mail_ctx->mail.body_size) < 0)
1175 if (mbox_sync_handle_missing_space(mail_ctx) < 0)
1184 mail_ctx->body_offset -
1186 mail_ctx->body_offset,
1187 mail_ctx->mail.body_size) < 0)
1311 struct mbox_sync_mail_context *mail_ctx)
1354 if (mail_ctx->have_eoh && !mail_ctx->updated)
1355 str_append_c(mail_ctx->header, '\n');
1364 if (mbox_sync_rewrite(sync_ctx, mail_ctx, file_size,
1601 struct mbox_sync_mail_context mail_ctx;
1645 ret = mbox_sync_loop(sync_ctx, &mail_ctx, partial);
1668 if (mbox_sync_handle_eof_updates(sync_ctx, &mail_ctx) < 0)