mbox-sync-update.c revision 1e76a5b92f9d82d557f81f080f3dfad1c9d8f200
c25356d5978632df6203437e1953bcb29e0c736fTimo Sirainen/* Copyright (C) 2004 Timo Sirainen */
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen/* Line length when to wrap X-IMAP, X-IMAPbase and X-Keywords headers to next
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen line. Keep this pretty long, as after we wrap we lose compatibility with
d6c5ceea8521b92d10e51a59da00c792f6140b1dTimo Sirainenstatic void status_flags_append(struct mbox_sync_mail_context *ctx,
d6c5ceea8521b92d10e51a59da00c792f6140b1dTimo Sirainen if ((ctx->mail.flags & flags_list[i].flag) != 0)
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainenvoid mbox_sync_move_buffer(struct mbox_sync_mail_context *ctx,
79fcd3f95a6266cc62ceaa753e56dd4456ab7c4bTimo Sirainen /* FIXME: if (diff < ctx->space && pos < ctx->offset) then
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen move the data only up to space offset and give/take the
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen space from there. update header_last_change accordingly.
e82e363e7a6917f470412d629db6c5b1f5891a35Timo Sirainen (except pos and offset can't be compared directly) */
e82e363e7a6917f470412d629db6c5b1f5891a35Timo Sirainen for (i = 0; i < MBOX_HDR_COUNT; i++) {
d10a370b2614712d9cb6a1dd8625f62a071b6377Timo Sirainen i_assert(ctx->mail.offset + ctx->mail.space <=
d10a370b2614712d9cb6a1dd8625f62a071b6377Timo Sirainen ctx->mail.offset > ctx->hdr_offset + pos + have);
d10a370b2614712d9cb6a1dd8625f62a071b6377Timo Sirainen if (ctx->mail.offset > ctx->hdr_offset + pos) {
d10a370b2614712d9cb6a1dd8625f62a071b6377Timo Sirainen /* free space offset moves */
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainenstatic void status_flags_replace(struct mbox_sync_mail_context *ctx, size_t pos,
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen unsigned char *data;
d10a370b2614712d9cb6a1dd8625f62a071b6377Timo Sirainen /* how many bytes do we need? */
d10a370b2614712d9cb6a1dd8625f62a071b6377Timo Sirainen for (i = 0, need = 0; flags_list[i].chr != 0; i++) {
e82e363e7a6917f470412d629db6c5b1f5891a35Timo Sirainen if ((ctx->mail.flags & flags_list[i].flag) != 0)
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen /* how many bytes do we have now? */
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen data = buffer_get_modifiable_data(ctx->header, &size);
d6c5ceea8521b92d10e51a59da00c792f6140b1dTimo Sirainen /* see if this is unknown flag for us */
2cfe9983ce7a6280636ee12beccc2e865111967bTimo Sirainen /* save this one */
51cbc45fc1ac5dde29bc2adbb175945df1b4f7d4Timo Sirainen /* @UNSAFE */
51cbc45fc1ac5dde29bc2adbb175945df1b4f7d4Timo Sirainen data = buffer_get_space_unsafe(ctx->header, pos, need);
51cbc45fc1ac5dde29bc2adbb175945df1b4f7d4Timo Sirainen for (i = 0, need = 0; flags_list[i].chr != 0; i++) {
51cbc45fc1ac5dde29bc2adbb175945df1b4f7d4Timo Sirainen if ((ctx->mail.flags & flags_list[i].flag) != 0)
d6c5ceea8521b92d10e51a59da00c792f6140b1dTimo Sirainenkeywords_append(struct mbox_sync_context *sync_ctx, string_t *dest,
d6c5ceea8521b92d10e51a59da00c792f6140b1dTimo Sirainen const ARRAY_TYPE(keyword_indexes) *keyword_indexes_arr)
3a985b4f3481d7061ee0c6ace3a5bb0bcbcb67adTimo Sirainen const char *const *keyword_names;
923eb3dde28e4d8841c14fd6b4a69635b7070c3eTimo Sirainen const unsigned int *keyword_indexes;
e82e363e7a6917f470412d629db6c5b1f5891a35Timo Sirainen keyword_names = array_get(sync_ctx->mbox->ibox.keyword_names,
e82e363e7a6917f470412d629db6c5b1f5891a35Timo Sirainen keyword_indexes = array_get(keyword_indexes_arr, &idx_count);
e82e363e7a6917f470412d629db6c5b1f5891a35Timo Sirainen for (i = 0, last_break = str_len(dest); i < idx_count; i++) {
e82e363e7a6917f470412d629db6c5b1f5891a35Timo Sirainen i_assert(keyword_indexes[i] < keywords_count);
e82e363e7a6917f470412d629db6c5b1f5891a35Timo Sirainen /* wrap the line whenever it gets too long */
e82e363e7a6917f470412d629db6c5b1f5891a35Timo Sirainen if (str_len(dest) - last_break < KEYWORD_WRAP_LINE_LENGTH) {
d6c5ceea8521b92d10e51a59da00c792f6140b1dTimo Sirainen str_append(dest, keyword_names[keyword_indexes[i]]);
306b3f41b05da642d87e7ca7a1496efce9f5902fTimo Sirainenkeywords_append_all(struct mbox_sync_mail_context *ctx, string_t *dest)
16834f18f903048c772112838c015051642a0e77Timo Sirainen const char *const *names;
16834f18f903048c772112838c015051642a0e77Timo Sirainen const unsigned char *p;
16834f18f903048c772112838c015051642a0e77Timo Sirainen unsigned int i, count;
last_break = 0;
for (i = 0; i < count; i++) {
if (new_hdr_size > 0 &&
const char *hdr, *p;
if (p == NULL) {
t_push();
t_pop();
t_push();
t_pop();
t_push();
t_pop();
bool keywords_changed;
if (keywords_changed)