mbox-sync-update.c revision 08fa343b3aace9343da3195686c65c5326eda207
bcb4e51a409d94ae670de96afb8483a4f7855294Stephan Bosch/* Copyright (C) 2004 Timo Sirainen */
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainenstatic void status_flags_append(struct mbox_sync_mail_context *ctx,
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen if ((ctx->mail.flags & flags_list[i].flag) != 0)
6523f54d1521edf894880f2d45e75cef5dd31c3dTimo Sirainenvoid mbox_sync_move_buffer(struct mbox_sync_mail_context *ctx,
da7f1a07f583df8905684a7b78469960afd7c78dPhil Carmody /* FIXME: if (diff < ctx->space && pos < ctx->offset) then
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen move the data only up to space offset and give/take the
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen space from there. update header_last_change accordingly.
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen (except pos and offset can't be compared directly) */
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen for (i = 0; i < MBOX_HDR_COUNT; i++) {
93a7d1ee4b518b5c85f9721dc6539e4dab6aae00Timo Sirainenstatic void status_flags_replace(struct mbox_sync_mail_context *ctx, size_t pos,
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen unsigned char *data;
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen /* how many bytes do we need? */
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen for (i = 0, need = 0; flags_list[i].chr != 0; i++) {
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen if ((ctx->mail.flags & flags_list[i].flag) != 0)
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen /* how many bytes do we have now? */
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen data = buffer_get_modifyable_data(ctx->header, &size);
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen /* see if this is unknown flag for us */
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen /* save this one */
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen /* @UNSAFE */
ba8498efbf886ca8b69fdb20c0ba2f5dba9416e3Timo Sirainen data = buffer_get_space_unsafe(ctx->header, pos, need);
93a7d1ee4b518b5c85f9721dc6539e4dab6aae00Timo Sirainen for (i = 0, need = 0; flags_list[i].chr != 0; i++) {
f7f25f9e1a38678d0e97d2e609beac16285fac6bTimo Sirainen if ((ctx->mail.flags & flags_list[i].flag) != 0)
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainenstatic void keywords_append(struct mbox_sync_mail_context *ctx,
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainenstatic void mbox_sync_add_missing_headers(struct mbox_sync_mail_context *ctx)
04052d7cacaa866a3f00afb4e104fa46c04c1dd7Timo Sirainen old_hdr_size = ctx->body_offset - ctx->hdr_offset;
cd75c360f244c96b9ee10e01ee3a66fad13183c8Timo Sirainen str_data(ctx->header)[new_hdr_size-1] != '\n') {
559f278a4c54d9fa7e0f2e96ebceda30562f9009Timo Sirainen /* broken header - doesn't end with \n. fix it. */
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen ctx->hdr_pos[MBOX_HDR_X_IMAPBASE] == (size_t)-1) {
544a727de8ab0e6c55cab18a7ee475fffdf5eff3Timo Sirainen ctx->hdr_pos[MBOX_HDR_X_IMAPBASE] = str_len(ctx->header);
04052d7cacaa866a3f00afb4e104fa46c04c1dd7Timo Sirainen //FIXME:keywords_append(ctx, all_keywords);
559f278a4c54d9fa7e0f2e96ebceda30562f9009Timo Sirainen if (ctx->hdr_pos[MBOX_HDR_X_UID] == (size_t)-1 && !ctx->pseudo) {
559f278a4c54d9fa7e0f2e96ebceda30562f9009Timo Sirainen ctx->hdr_pos[MBOX_HDR_X_UID] = str_len(ctx->header);
559f278a4c54d9fa7e0f2e96ebceda30562f9009Timo Sirainen str_printfa(ctx->header, "%u\n", ctx->mail.uid);
3cf67672fdc87583cb23ce088c95bb5dee60e74dTimo Sirainen if (ctx->hdr_pos[MBOX_HDR_STATUS] == (size_t)-1 &&
3cf67672fdc87583cb23ce088c95bb5dee60e74dTimo Sirainen ctx->hdr_pos[MBOX_HDR_STATUS] = str_len(ctx->header);
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen if (ctx->hdr_pos[MBOX_HDR_X_STATUS] == (size_t)-1 &&
544a727de8ab0e6c55cab18a7ee475fffdf5eff3Timo Sirainen (ctx->mail.flags & XSTATUS_FLAGS_MASK) != 0) {
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen ctx->hdr_pos[MBOX_HDR_X_STATUS] = str_len(ctx->header);
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen for (i = 0; i < INDEX_KEYWORDS_BYTE_COUNT; i++) {
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen if (ctx->hdr_pos[MBOX_HDR_X_KEYWORDS] == (size_t)-1 && have_keywords) {
04052d7cacaa866a3f00afb4e104fa46c04c1dd7Timo Sirainen ctx->hdr_pos[MBOX_HDR_X_KEYWORDS] = str_len(ctx->header);
cd75c360f244c96b9ee10e01ee3a66fad13183c8Timo Sirainen ctx->mail.body_size >= MBOX_MIN_CONTENT_LENGTH_SIZE) {
cd75c360f244c96b9ee10e01ee3a66fad13183c8Timo Sirainen str_printfa(ctx->header, "Content-Length: %"PRIuUOFF_T"\n",
cd75c360f244c96b9ee10e01ee3a66fad13183c8Timo Sirainenstatic void mbox_sync_update_status(struct mbox_sync_mail_context *ctx)
cd75c360f244c96b9ee10e01ee3a66fad13183c8Timo Sirainen if (ctx->hdr_pos[MBOX_HDR_STATUS] != (size_t)-1) {
b484ab4b55b0d5341f2f4dd98a655a75f0bf1275Timo Sirainen status_flags_replace(ctx, ctx->hdr_pos[MBOX_HDR_STATUS],
7744586e3e0fd60158abfbb03a233d3bd8d6c48bTimo Sirainenstatic void mbox_sync_update_xstatus(struct mbox_sync_mail_context *ctx)
1b823b2b7790a1e1b7974fcf11a4c48a28e70f37Timo Sirainen if (ctx->hdr_pos[MBOX_HDR_X_STATUS] != (size_t)-1) {
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen status_flags_replace(ctx, ctx->hdr_pos[MBOX_HDR_X_STATUS],
9dd1c256910f1fb42823116a641e7edb3ad11970Timo Sirainenstatic void mbox_sync_update_xkeywords(struct mbox_sync_mail_context *ctx)
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainenstatic void mbox_sync_update_line(struct mbox_sync_mail_context *ctx,
401b0787fff2dc986a5321ddb32acb1947ff66b0Timo Sirainen const char *hdr, *p;
7744586e3e0fd60158abfbb03a233d3bd8d6c48bTimo Sirainen /* shouldn't really happen, but allow anyway.. */
50e20db49f29917fe9adcf1b56b11badf28bd0e4Timo Sirainen mbox_sync_move_buffer(ctx, pos, str_len(new_line), p - hdr + 1);
50e20db49f29917fe9adcf1b56b11badf28bd0e4Timo Sirainen buffer_copy(ctx->header, pos, new_line, 0, (size_t)-1);
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainenstatic void mbox_sync_update_x_imap_base(struct mbox_sync_mail_context *ctx)
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen ctx->hdr_pos[MBOX_HDR_X_IMAPBASE] == (size_t)-1 ||
50e20db49f29917fe9adcf1b56b11badf28bd0e4Timo Sirainen ctx->sync_ctx->update_base_uid_last < ctx->sync_ctx->base_uid_last)
203bb272804e4394ae07103cdc8ce67041ba21a1Aki Tuomi /* update uid-last field in X-IMAPbase */
203bb272804e4394ae07103cdc8ce67041ba21a1Aki Tuomi str_printfa(str, "%u %010u", ctx->sync_ctx->base_uid_validity,
203bb272804e4394ae07103cdc8ce67041ba21a1Aki Tuomi //FIXME:keywords_append(ctx, all_keywords);
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen mbox_sync_update_line(ctx, ctx->hdr_pos[MBOX_HDR_X_IMAPBASE], str);
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainenstatic void mbox_sync_update_x_uid(struct mbox_sync_mail_context *ctx)
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen if (ctx->hdr_pos[MBOX_HDR_X_UID] == (size_t)-1 ||
f01eb1f51d618633c0189be9ab60a774f47fb7dfTimo Sirainen mbox_sync_update_line(ctx, ctx->hdr_pos[MBOX_HDR_X_UID], str);
401b0787fff2dc986a5321ddb32acb1947ff66b0Timo Sirainenvoid mbox_sync_update_header(struct mbox_sync_mail_context *ctx,
e42b74025f8d02ee7aa476897a3f44e25bb8fc10Aki Tuomi memcpy(old_keywords, ctx->mail.keywords, sizeof(old_keywords));
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen for (i = 0; i < size; i++) {
062ea54b7775d0c92ed67b9b1f4d93fa8ec80c84Timo Sirainen if (sync[i].type != MAIL_INDEX_SYNC_TYPE_FLAGS)
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen mail_index_sync_flags_apply(&sync[i], &ctx->mail.flags,
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen /* keep our old recent flag. especially because we use it
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen negatively as non-recent */
203bb272804e4394ae07103cdc8ce67041ba21a1Aki Tuomi ctx->mail.flags = (ctx->mail.flags & ~MAIL_RECENT) |
401b0787fff2dc986a5321ddb32acb1947ff66b0Timo Sirainenvoid mbox_sync_update_header_from(struct mbox_sync_mail_context *ctx,
ca5b3ec5331545b46ec1f1c4ecfa1302ddb10653Timo Sirainen ctx->mail.flags = (ctx->mail.flags & ~STATUS_FLAGS_MASK) |
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen ctx->mail.flags = (ctx->mail.flags & ~XSTATUS_FLAGS_MASK) |
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen if (memcmp(ctx->mail.keywords, mail->keywords,