Skip to content

Commit 5c4acb2

Browse files
committed
midb: respect setting \Answered, \Flagged, $Forwarded during M-INST
Fixes: gromox-0~666
1 parent 12cb649 commit 5c4acb2

File tree

1 file changed

+26
-0
lines changed

1 file changed

+26
-0
lines changed

exch/midb/mail_engine.cpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2129,6 +2129,9 @@ static int me_minst(int argc, char **argv, int sockd) try
21292129

21302130
uint8_t b_unsent = strchr(argv[4], midb_flag::unsent) != nullptr;
21312131
uint8_t b_read = strchr(argv[4], midb_flag::seen) != nullptr;
2132+
uint8_t b_answered = strchr(argv[4], midb_flag::answered) != nullptr;
2133+
uint8_t b_flagged = strchr(argv[4], midb_flag::flagged) != nullptr;
2134+
uint8_t b_forwarded = strchr(argv[4], midb_flag::forwarded) != nullptr;
21322135
std::string pbuff;
21332136
if (!exmdb_client->imapfile_read(argv[1], "eml", argv[3], &pbuff)) {
21342137
mlog(LV_ERR, "E-2071: imapfile_read %s/eml/%s failed", argv[1], argv[3]);
@@ -2185,6 +2188,22 @@ static int me_minst(int argc, char **argv, int sockd) try
21852188
if (pmsgctnt->proplist.set(PR_MESSAGE_FLAGS, &tmp_flags) != ecSuccess)
21862189
return MIDB_E_NO_MEMORY;
21872190
}
2191+
if (b_answered) {
2192+
const uint32_t val = MAIL_ICON_REPLIED;
2193+
if (pmsgctnt->proplist.set(PR_ICON_INDEX, &val) != ecSuccess)
2194+
return MIDB_E_NO_MEMORY;
2195+
} else if (b_forwarded) {
2196+
const uint32_t val = MAIL_ICON_FORWARDED;
2197+
if (pmsgctnt->proplist.set(PR_ICON_INDEX, &val) != ecSuccess)
2198+
return MIDB_E_NO_MEMORY;
2199+
}
2200+
if (b_flagged) {
2201+
static constexpr uint32_t val = followupFlagged, icon = olRedFlagIcon;
2202+
if (pmsgctnt->proplist.set(PR_FLAG_STATUS, &val) != ecSuccess ||
2203+
pmsgctnt->proplist.set(PR_FOLLOWUP_ICON, &icon) != ecSuccess)
2204+
return MIDB_E_NO_MEMORY;
2205+
}
2206+
21882207
if (!exmdb_client->allocate_message_id(argv[1],
21892208
rop_util_make_eid_ex(1, folder_id), &message_id) ||
21902209
!exmdb_client->allocate_cn(argv[1], &change_num))
@@ -3112,6 +3131,8 @@ static int me_psflg(int argc, char **argv, int sockd) try
31123131
/*
31133132
* The backnotification (msg_modified) arrives belatedly, so we UPDATE
31143133
* the table here already.
3134+
* (This does not integrate with msg_added at all. If msg_added arrives
3135+
* belatedly, UPDATE will update 0 rows.)
31153136
*/
31163137
std::string qstr = "UPDATE messages SET ";
31173138
bool set_answered = strchr(argv[4], midb_flag::answered) != nullptr;
@@ -3589,6 +3610,11 @@ static void notif_msg_added(IDB_ITEM *pidb,
35893610
if (pstmt == nullptr)
35903611
return;
35913612
if (pstmt.step() == SQLITE_ROW) {
3613+
/*
3614+
* Get back the flags we temporarily put down during
3615+
* M-INST, especially e.g. \Deleted which is not
3616+
* transferred to MAPI.
3617+
*/
35923618
flags_buff = znul(pstmt.col_text(1));
35933619
gx_strlcpy(mid_string, pstmt.col_text(0), std::size(mid_string));
35943620
str = mid_string;

0 commit comments

Comments
 (0)