From 7bc456633c823055472401576b646aecb33031eb Mon Sep 17 00:00:00 2001 From: Art Cancro Date: Sun, 30 Nov 2003 03:43:35 +0000 Subject: [PATCH] * Support IMAP \Answered flag --- citadel/ChangeLog | 4 +++- citadel/citadel.h | 6 +++--- citadel/imap_fetch.c | 7 ++++++- citadel/imap_store.c | 13 ++++++++++++- citadel/msgbase.c | 27 +++++++++++++++++++-------- citadel/msgbase.h | 12 ++++++++++-- citadel/serv_imap.c | 8 ++++++-- citadel/serv_vandelay.c | 2 ++ citadel/server.h | 1 + citadel/user_ops.c | 4 ++-- 10 files changed, 64 insertions(+), 20 deletions(-) diff --git a/citadel/ChangeLog b/citadel/ChangeLog index 878295f6f..01d179960 100644 --- a/citadel/ChangeLog +++ b/citadel/ChangeLog @@ -1,4 +1,7 @@ $Log$ + Revision 611.10 2003/11/30 03:43:34 ajc + * Support IMAP \Answered flag + Revision 611.9 2003/11/22 03:30:14 ajc * Commented out the call to the 'high speed download' function and uncommented the call to the original 'chatty' download function. Some @@ -5092,4 +5095,3 @@ Sat Jul 11 00:20:48 EDT 1998 Nathan Bryant Fri Jul 10 1998 Art Cancro * Initial CVS import - diff --git a/citadel/citadel.h b/citadel/citadel.h index d64eadee3..3d2434bea 100644 --- a/citadel/citadel.h +++ b/citadel/citadel.h @@ -32,7 +32,7 @@ extern "C" { /* * Text description of this software */ -#define CITADEL "Citadel/UX 6.11" +#define CITADEL "Citadel/UX 6.12" /* * REV_LEVEL is the current version number (multiplied by 100 to avoid having @@ -44,9 +44,9 @@ extern "C" { * usually more strict because you're not really supposed to dump/load and * upgrade at the same time. */ -#define REV_LEVEL 611 /* This version */ +#define REV_LEVEL 612 /* This version */ #define REV_MIN 591 /* Oldest compatible database */ -#define EXPORT_REV_MIN 609 /* Oldest compatible export files */ +#define EXPORT_REV_MIN 612 /* Oldest compatible export files */ #define SERVER_TYPE 0 /* zero for stock Citadel/UX; other developers please obtain SERVER_TYPE codes for your implementations */ diff --git a/citadel/imap_fetch.c b/citadel/imap_fetch.c index 199a0bb0d..d0b9ebf2b 100644 --- a/citadel/imap_fetch.c +++ b/citadel/imap_fetch.c @@ -82,6 +82,11 @@ void imap_fetch_flags(int seq) { cprintf("\\Seen"); ++num_flags_printed; } + if (IMAP->flags[seq] & IMAP_ANSWERED) { + if (num_flags_printed > 0) cprintf(" "); + cprintf("\\Answered"); + ++num_flags_printed; + } cprintf(")"); } @@ -558,7 +563,7 @@ void imap_fetch_body(long msgnum, char *item, int is_peek, /* Mark this message as "seen" *unless* this is a "peek" operation */ if (is_peek == 0) { - CtdlSetSeen(msgnum, 1); + CtdlSetSeen(msgnum, 1, ctdlsetseen_seen); } } diff --git a/citadel/imap_store.c b/citadel/imap_store.c index 8ba5ba5e7..ec8e845f9 100644 --- a/citadel/imap_store.c +++ b/citadel/imap_store.c @@ -82,7 +82,15 @@ void imap_do_store_msg(int seq, char *oper, unsigned int bits_to_twiddle) { if (bits_to_twiddle & IMAP_SEEN) { CtdlSetSeen(IMAP->msgids[seq], - ((IMAP->flags[seq] & IMAP_SEEN) ? 1 : 0) ); + ((IMAP->flags[seq] & IMAP_SEEN) ? 1 : 0), + ctdlsetseen_seen + ); + } + if (bits_to_twiddle & IMAP_ANSWERED) { + CtdlSetSeen(IMAP->msgids[seq], + ((IMAP->flags[seq] & IMAP_ANSWERED) ? 1 : 0), + ctdlsetseen_answered + ); } /* 'silent' is actually the value returned from a strncasecmp() so @@ -134,6 +142,9 @@ void imap_do_store(int num_items, char **itemlist) { if (!strcasecmp(flag, "\\Seen")) { bits_to_twiddle |= IMAP_SEEN; } + if (!strcasecmp(flag, "\\Answered")) { + bits_to_twiddle |= IMAP_ANSWERED; + } } } diff --git a/citadel/msgbase.c b/citadel/msgbase.c index e832cad06..11c7b634c 100644 --- a/citadel/msgbase.c +++ b/citadel/msgbase.c @@ -288,21 +288,24 @@ int CtdlMsgCmp(struct CtdlMessage *msg, struct CtdlMessage *template) { /* * Retrieve the "seen" message list for the current room. */ -void CtdlGetSeen(char *buf) { +void CtdlGetSeen(char *buf, int which_set) { struct visit vbuf; /* Learn about the user and room in question */ CtdlGetRelationship(&vbuf, &CC->user, &CC->room); - safestrncpy(buf, vbuf.v_seen, SIZ); + if (which_set == ctdlsetseen_seen) + safestrncpy(buf, vbuf.v_seen, SIZ); + if (which_set == ctdlsetseen_answered) + safestrncpy(buf, vbuf.v_answered, SIZ); } /* - * Manipulate the "seen msgs" string. + * Manipulate the "seen msgs" string (or other message set strings) */ -void CtdlSetSeen(long target_msgnum, int target_setting) { +void CtdlSetSeen(long target_msgnum, int target_setting, int which_set) { char newseen[SIZ]; struct cdbdata *cdbfr; int i; @@ -313,6 +316,7 @@ void CtdlSetSeen(long target_msgnum, int target_setting) { struct visit vbuf; long *msglist; int num_msgs = 0; + char vset[SIZ]; /* Learn about the user and room in question */ CtdlGetRelationship(&vbuf, &CC->user, &CC->room); @@ -328,7 +332,11 @@ void CtdlSetSeen(long target_msgnum, int target_setting) { return; /* No messages at all? No further action. */ } - lprintf(9, "before optimize: %s\n", vbuf.v_seen); + /* Decide which message set we're manipulating */ + if (which_set == ctdlsetseen_seen) strcpy(vset, vbuf.v_seen); + if (which_set == ctdlsetseen_answered) strcpy(vset, vbuf.v_answered); + + lprintf(9, "before optimize: %s\n", vset); strcpy(newseen, ""); for (i=0; iuser, &CC->room); } diff --git a/citadel/msgbase.h b/citadel/msgbase.h index 41236b863..cc3f3c96f 100644 --- a/citadel/msgbase.h +++ b/citadel/msgbase.h @@ -124,9 +124,17 @@ int CtdlOutputPreLoadedMsg(struct CtdlMessage *, int CtdlCopyMsgToRoom(long msgnum, char *dest); int CtdlDoIHavePermissionToDeleteMessagesFromThisRoom(void); int CtdlDoIHavePermissionToPostInThisRoom(char *errmsgbuf, size_t n); -void CtdlSetSeen(long target_msgnum, int target_setting); + + +/* values for which_set */ +enum { + ctdlsetseen_seen, + ctdlsetseen_answered +}; +void CtdlSetSeen(long target_msgnum, int target_setting, int which_set); +void CtdlGetSeen(char *buf, int which_set); + struct recptypes *validate_recipients(char *recipients); -void CtdlGetSeen(char *buf); struct CtdlMessage *CtdlMakeMessage( struct ctdluser *author, /* author's user structure */ char *recipient, /* NULL if it's not mail */ diff --git a/citadel/serv_imap.c b/citadel/serv_imap.c index b8d5acc93..2b03d9b6b 100644 --- a/citadel/serv_imap.c +++ b/citadel/serv_imap.c @@ -123,6 +123,9 @@ void imap_set_seen_flags(void) { if (is_msg_in_mset(vbuf.v_seen, IMAP->msgids[i])) { IMAP->flags[i] |= IMAP_SEEN; } + if (is_msg_in_mset(vbuf.v_answered, IMAP->msgids[i])) { + IMAP->flags[i] |= IMAP_ANSWERED; + } } } } @@ -528,8 +531,9 @@ void imap_select(int num_parms, char *parms[]) { /* FIXME ... much more info needs to be supplied here */ cprintf("* %d EXISTS\r\n", msgs); cprintf("* %d RECENT\r\n", new); - cprintf("* FLAGS (\\Deleted \\Seen)\r\n"); - cprintf("* OK [PERMANENTFLAGS (\\Deleted \\Seen)] permanent flags\r\n"); + cprintf("* FLAGS (\\Deleted \\Seen \\Answered)\r\n"); + cprintf("* OK [PERMANENTFLAGS (\\Deleted \\Seen \\Answered)] " + "permanent flags\r\n"); cprintf("* OK [UIDVALIDITY 0] UIDs valid\r\n"); cprintf("%s OK [%s] %s completed\r\n", parms[0], diff --git a/citadel/serv_vandelay.c b/citadel/serv_vandelay.c index 50583c5fc..5167d6792 100644 --- a/citadel/serv_vandelay.c +++ b/citadel/serv_vandelay.c @@ -177,6 +177,7 @@ void artv_export_visits(void) { cprintf("%ld\n", vbuf.v_lastseen); } + cprintf("%s\n", vbuf.v_answered); cprintf("%u\n", vbuf.v_flags); cprintf("%d\n", vbuf.v_view); } @@ -448,6 +449,7 @@ void artv_import_visit(void) { for (i=0; i