diff --git a/src/agents/imap/fetch.c b/src/agents/imap/fetch.c index 8b90007..bf24efa 100644 --- a/src/agents/imap/fetch.c +++ b/src/agents/imap/fetch.c @@ -1666,7 +1666,8 @@ FetchFlagResponderBodyHeaderFields(void *param1, void *param2, void *param3) return(STATUS_ABORT); } - if (ConnWrite(session->client.conn, " {0}\r\n", sizeof(" {0}\r\n") - 1) != -1) { + if (ConnWrite(session->client.conn, " {2}\r\n\r\n", + sizeof(" {2}\r\n\r\n") - 1) != -1) { MemFree(resultHeader); return(STATUS_CONTINUE); } @@ -3308,26 +3309,21 @@ __inline static long SetMessageSeenFlag(ImapSession *session, FetchStruct *FetchRequest) { long ccode; + unsigned long oldFlags; unsigned long newFlags; - char *ptr; - - if (NMAPSendCommandF(session->store.conn, "FLAG %" PRIx64 " +%lu\r\n", FetchRequest->message->guid, (unsigned long)STORE_MSG_FLAG_SEEN) != -1) { - ccode = NMAPReadResponse(session->store.conn, session->store.response, sizeof(session->store.response), TRUE); - if (ccode == 1000) { - if (!(FetchRequest->flags & F_FLAGS)) { - /* This fetch request does allow flags responses, but we have to wait for later to send them to the client */ - ptr = strchr(session->store.response, ' '); - if (ptr) { - newFlags = atol(ptr + 1); - RememberFlags(session->folder.selected.events.flags, FetchRequest->message->guid, newFlags); - } - } - return(STATUS_CONTINUE); - } - return(CheckForNMAPCommError(ccode)); + oldFlags = FetchRequest->message->flags; + newFlags = oldFlags; + ccode = StoreMessageFlag(session->store.conn, + FetchRequest->message->guid, "+", + STORE_MSG_FLAG_SEEN, &newFlags); + if (ccode == STATUS_CONTINUE) { + FetchRequest->message->flags = newFlags; + if (!(FetchRequest->flags & F_FLAGS) && newFlags != oldFlags) + RememberFlags(session->folder.selected.events.flags, + FetchRequest->message->guid, newFlags); } - return(STATUS_NMAP_COMM_ERROR); + return ccode; } __inline static long @@ -3490,8 +3486,12 @@ SendResponseForMessage(ImapSession *session, FetchStruct *FetchRequest) if (FetchRequest->flags & (F_BINARY | F_BINARY_SIZE)) ccode = PrepareBinaryResults(session, FetchRequest); if (ccode == STATUS_CONTINUE && - (ccode = SetSeenFlag(session, FetchRequest)) == STATUS_CONTINUE) + (ccode = SetSeenFlag(session, FetchRequest)) == STATUS_CONTINUE) { ccode = SendResponseForFetchFlags(session, FetchRequest); + if (ccode == STATUS_CONTINUE && + !(FetchRequest->flags & F_FLAGS)) + ccode = EventsSend(session, STORE_EVENT_FLAG); + } } BinaryResultsFree(FetchRequest); MessageDetailsFree(&(FetchRequest->messageDetail));