$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
Fri Jul 10 1998 Art Cancro <ajc@uncensored.citadel.org>
* Initial CVS import
-
/*
* 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
* 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 */
cprintf("\\Seen");
++num_flags_printed;
}
+ if (IMAP->flags[seq] & IMAP_ANSWERED) {
+ if (num_flags_printed > 0) cprintf(" ");
+ cprintf("\\Answered");
+ ++num_flags_printed;
+ }
cprintf(")");
}
/* Mark this message as "seen" *unless* this is a "peek" operation */
if (is_peek == 0) {
- CtdlSetSeen(msgnum, 1);
+ CtdlSetSeen(msgnum, 1, ctdlsetseen_seen);
}
}
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
if (!strcasecmp(flag, "\\Seen")) {
bits_to_twiddle |= IMAP_SEEN;
}
+ if (!strcasecmp(flag, "\\Answered")) {
+ bits_to_twiddle |= IMAP_ANSWERED;
+ }
}
}
/*
* 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;
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);
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) {
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;
}
}
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);
}
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 */
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;
+ }
}
}
}
/* 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],
cprintf("%ld\n", vbuf.v_lastseen);
}
+ cprintf("%s\n", vbuf.v_answered);
cprintf("%u\n", vbuf.v_flags);
cprintf("%d\n", vbuf.v_view);
}
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);
long v_lastseen;
unsigned int v_flags;
char v_seen[SIZ];
+ char v_answered[SIZ];
int v_view;
};
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);
}
return;
}
- CtdlGetSeen(buf);
+ CtdlGetSeen(buf, ctdlsetseen_seen);
cprintf("%d %s\n", CIT_OK, buf);
}