* Support IMAP \Answered flag
authorArt Cancro <ajc@citadel.org>
Sun, 30 Nov 2003 03:43:35 +0000 (03:43 +0000)
committerArt Cancro <ajc@citadel.org>
Sun, 30 Nov 2003 03:43:35 +0000 (03:43 +0000)
citadel/ChangeLog
citadel/citadel.h
citadel/imap_fetch.c
citadel/imap_store.c
citadel/msgbase.c
citadel/msgbase.h
citadel/serv_imap.c
citadel/serv_vandelay.c
citadel/server.h
citadel/user_ops.c

index 878295f6ff86523b8abeec9786f8ea8e2f98121f..01d17996034734120c0bd2ddbae67de34b4d4e88 100644 (file)
@@ -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 <bryant@cs.usm.maine.edu>
 
 Fri Jul 10 1998 Art Cancro <ajc@uncensored.citadel.org>
        * Initial CVS import
-
index d64eadee3180de113311c5f8507a0719bb84477f..3d2434bea06a6395d60295a786a1fa497ed69381 100644 (file)
@@ -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 */
index 199a0bb0dda1f1e5296e1670cda8d10707eba875..d0b9ebf2bca97bc36740e5b1b4a2ef2de2886682 100644 (file)
@@ -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);
        }
 }
 
index 8ba5ba5e713d348128f65eb167b702ca27be2626..ec8e845f9df27df0ed4994ecb9bf18dea5096a42 100644 (file)
@@ -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;
+                       }
                }
        }
 
index e832cad06691d0af92ec0be4f9ff73c7bc48b6bb..11c7b634c3580b90d8dd06b2c488f576360fd290 100644 (file)
@@ -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; i<num_msgs; ++i) {
@@ -338,7 +346,7 @@ void CtdlSetSeen(long target_msgnum, int target_setting) {
                        is_seen = target_setting;
                }
                else {
-                       if (is_msg_in_mset(vbuf.v_seen, msglist[i])) {
+                       if (is_msg_in_mset(vset, msglist[i])) {
                                is_seen = 1;
                        }
                }
@@ -374,8 +382,11 @@ void CtdlSetSeen(long target_msgnum, int target_setting) {
                was_seen = is_seen;
        }
 
-       safestrncpy(vbuf.v_seen, newseen, SIZ);
-       lprintf(9, " after optimize: %s\n", vbuf.v_seen);
+       /* Decide which message set we're manipulating */
+       if (which_set == ctdlsetseen_seen) strcpy(vbuf.v_seen, newseen);
+       if (which_set == ctdlsetseen_answered) strcpy(vbuf.v_answered, newseen);
+
+       lprintf(9, " after optimize: %s\n", newseen);
        phree(msglist);
        CtdlSetRelationship(&vbuf, &CC->user, &CC->room);
 }
index 41236b8639d48404f6aa932c12623fed6af9a90a..cc3f3c96ff22ac330cc619b2d7d795fcfe7096ed 100644 (file)
@@ -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 */
index b8d5acc930d28d18072995d14f7b368cebb0611b..2b03d9b6ba587a712ea38eee6d4735f4f00a9226 100644 (file)
@@ -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],
index 50583c5fc1b70cdab8a6affdebb43c7ef03fa667..5167d67924a015cd0d7a630f47fcf71164328a23 100644 (file)
@@ -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<strlen(buf); ++i) if (!isdigit(buf[i])) is_textual_seen = 1;
        if (is_textual_seen)    strcpy(vbuf.v_seen, buf);
 
+       client_gets(vbuf.v_answered);
        client_gets(buf);       vbuf.v_flags = atoi(buf);
        client_gets(buf);       vbuf.v_view = atoi(buf);
        put_visit(&vbuf);
index 4b9a3ffe8ca09d2d1e419a4e548e98703abfdf0a..b83a8079a3e881d59efd300206094bfd55e03b73 100644 (file)
@@ -415,6 +415,7 @@ struct visit {
        long v_lastseen;
        unsigned int v_flags;
        char v_seen[SIZ];
+       char v_answered[SIZ];
        int v_view;
 };
 
index 93957ce2938a65a651a5dd3193a9e7e39ec521f6..9cd7b0be4b141794ed0d702e8e99800a2923a6cc 100644 (file)
@@ -1066,7 +1066,7 @@ void cmd_seen(char *argbuf) {
        target_msgnum = extract_long(argbuf, 0);
        target_setting = extract_int(argbuf, 1);
 
-       CtdlSetSeen(target_msgnum, target_setting);
+       CtdlSetSeen(target_msgnum, target_setting, ctdlsetseen_seen);
        cprintf("%d OK\n", CIT_OK);
 }
 
@@ -1078,7 +1078,7 @@ void cmd_gtsn(char *argbuf) {
                return;
        }
 
-       CtdlGetSeen(buf);
+       CtdlGetSeen(buf, ctdlsetseen_seen);
        cprintf("%d %s\n", CIT_OK, buf);
 }