fix updating cached message flags in imap_set_msg_flags()

while this (currently) doesn't really matter (as all flag changes are
calculated before any are actually submitted), msg's flags should not
be updated before set_msg_flags() has actually succeeded.

as a side effect, this does away with the redundancy elimination and
pulling uid from msg (which were both unused since 19128f158).
This commit is contained in:
Oswald Buddenhagen 2022-02-09 14:01:28 +01:00
parent 698f9ff173
commit a652043934

View File

@ -658,12 +658,16 @@ imap_refcounted_new_cmd( imap_cmd_refcounted_state_t *sts )
return &cmd->gen; return &cmd->gen;
} }
#define DONE_REFCOUNTED_STATE(sts) \ #define DONE_REFCOUNTED_STATE_FINALIZE(sts, finalize) \
if (!--sts->ref_count) { \ if (!--sts->ref_count) { \
finalize \
sts->callback( sts->ret_val, sts->callback_aux ); \ sts->callback( sts->ret_val, sts->callback_aux ); \
free( sts ); \ free( sts ); \
} }
#define DONE_REFCOUNTED_STATE(sts) \
DONE_REFCOUNTED_STATE_FINALIZE(sts, )
#define DONE_REFCOUNTED_STATE_ARGS(sts, finalize, ...) \ #define DONE_REFCOUNTED_STATE_ARGS(sts, finalize, ...) \
if (!--sts->ref_count) { \ if (!--sts->ref_count) { \
finalize \ finalize \
@ -3040,6 +3044,8 @@ typedef union {
IMAP_CMD_REFCOUNTED_STATE IMAP_CMD_REFCOUNTED_STATE
void (*callback)( int sts, void *aux ); void (*callback)( int sts, void *aux );
void *callback_aux; void *callback_aux;
message_t *msg;
int add, del;
}; };
} imap_set_msg_flags_state_t; } imap_set_msg_flags_state_t;
@ -3065,23 +3071,16 @@ imap_set_msg_flags( store_t *gctx, message_t *msg, uint uid, int add, int del,
{ {
imap_store_t *ctx = (imap_store_t *)gctx; imap_store_t *ctx = (imap_store_t *)gctx;
if (msg) { assert( add || del );
uid = msg->uid; INIT_REFCOUNTED_STATE(imap_set_msg_flags_state_t, sts, cb, aux)
add &= ~msg->flags; sts->msg = msg;
del &= msg->flags; sts->add = add;
msg->flags |= add; sts->del = del;
msg->flags &= ~del; if (add)
} imap_flags_helper( ctx, uid, '+', add, sts );
if (add || del) { if (del)
INIT_REFCOUNTED_STATE(imap_set_msg_flags_state_t, sts, cb, aux) imap_flags_helper( ctx, uid, '-', del, sts );
if (add) imap_set_flags_p3( sts );
imap_flags_helper( ctx, uid, '+', add, sts );
if (del)
imap_flags_helper( ctx, uid, '-', del, sts );
imap_set_flags_p3( sts );
} else {
cb( DRV_OK, aux );
}
} }
static void static void
@ -3096,7 +3095,10 @@ imap_set_flags_p2( imap_store_t *ctx ATTR_UNUSED, imap_cmd_t *cmd, int response
static void static void
imap_set_flags_p3( imap_set_msg_flags_state_t *sts ) imap_set_flags_p3( imap_set_msg_flags_state_t *sts )
{ {
DONE_REFCOUNTED_STATE(sts) DONE_REFCOUNTED_STATE_FINALIZE(sts, {
if (sts->msg)
sts->msg->flags = (sts->msg->flags & ~sts->del) | sts->add;
})
} }
/******************* imap_close_box *******************/ /******************* imap_close_box *******************/