}
if (is_literal) {
- cprintf("{%d}\r\n%s", strlen(buf), buf);
+ cprintf("{%ld}\r\n%s", (long)strlen(buf), buf);
} else {
cprintf("\"%s\"", buf);
}
}
/*
- * Convert a struct quickroom to an IMAP-compatible mailbox name.
+ * Convert a struct ctdlroom to an IMAP-compatible mailbox name.
*/
-void imap_mailboxname(char *buf, int bufsize, struct quickroom *qrbuf)
+void imap_mailboxname(char *buf, int bufsize, struct ctdlroom *qrbuf)
{
struct floor *fl;
+ int i;
/*
- * For mailboxes, just do it straight...
+ * For mailboxes, just do it straight.
+ * Also handle Kolab-compatible groupware folder names.
*/
if (qrbuf->QRflags & QR_MAILBOX) {
safestrncpy(buf, qrbuf->QRname, bufsize);
strcpy(buf, &buf[11]);
- if (!strcasecmp(buf, MAILROOM))
+ if (!strcasecmp(buf, MAILROOM)) {
strcpy(buf, "INBOX");
+ }
+ if (!strcasecmp(buf, USERCALENDARROOM)) {
+ sprintf(buf, "INBOX|%s", USERCALENDARROOM);
+ }
+ if (!strcasecmp(buf, USERCONTACTSROOM)) {
+ sprintf(buf, "INBOX|%s", USERCONTACTSROOM);
+ }
+ if (!strcasecmp(buf, USERTASKSROOM)) {
+ sprintf(buf, "INBOX|%s", USERTASKSROOM);
+ }
+ if (!strcasecmp(buf, USERNOTESROOM)) {
+ sprintf(buf, "INBOX|%s", USERNOTESROOM);
+ }
}
/*
* Otherwise, prefix the floor name as a "public folders" moniker
fl->f_name,
qrbuf->QRname);
}
+
+ /*
+ * Replace delimiter characters with "|" for pseudo-folder-delimiting
+ */
+ for (i=0; i<strlen(buf); ++i) {
+ if (buf[i] == FDELIM) buf[i] = '|';
+ }
}
int imap_roomname(char *rbuf, int bufsize, char *foldername)
{
int levels;
- char buf[SIZ];
+ char floorname[SIZ];
+ char roomname[SIZ];
int i;
struct floor *fl;
+ int ret = (-1);
- if (foldername == NULL)
- return (-1);
+ if (foldername == NULL) return(-1);
levels = num_parms(foldername);
- /* When we can support hierarchial mailboxes, take this out. */
- if (levels > 2)
- return (-1);
-
/*
* Convert the crispy idiot's reserved names to our reserved names.
+ * Also handle Kolab-compatible groupware folder names.
*/
if (!strcasecmp(foldername, "INBOX")) {
safestrncpy(rbuf, MAILROOM, bufsize);
- return (0 | IR_MAILBOX);
+ ret = (0 | IR_MAILBOX);
+ }
+ else if ( (!strncasecmp(foldername, "INBOX", 5))
+ && (!strcasecmp(&foldername[6], USERCALENDARROOM)) ) {
+ safestrncpy(rbuf, USERCALENDARROOM, bufsize);
+ ret = (0 | IR_MAILBOX);
+ }
+ else if ( (!strncasecmp(foldername, "INBOX", 5))
+ && (!strcasecmp(&foldername[6], USERCONTACTSROOM)) ) {
+ safestrncpy(rbuf, USERCONTACTSROOM, bufsize);
+ ret = (0 | IR_MAILBOX);
}
- if (levels > 1) {
- extract(buf, foldername, 0);
+ else if ( (!strncasecmp(foldername, "INBOX", 5))
+ && (!strcasecmp(&foldername[6], USERTASKSROOM)) ) {
+ safestrncpy(rbuf, USERTASKSROOM, bufsize);
+ ret = (0 | IR_MAILBOX);
+ }
+ else if ( (!strncasecmp(foldername, "INBOX", 5))
+ && (!strcasecmp(&foldername[6], USERNOTESROOM)) ) {
+ safestrncpy(rbuf, USERNOTESROOM, bufsize);
+ ret = (0 | IR_MAILBOX);
+ }
+ else if (levels > 1) {
+ extract(floorname, foldername, 0);
+ strcpy(roomname, &foldername[strlen(floorname)+1]);
for (i = 0; i < MAXFLOORS; ++i) {
fl = cgetfloor(i);
if (fl->f_flags & F_INUSE) {
- if (!strcasecmp(buf, fl->f_name)) {
- extract(rbuf, foldername, 1);
- return (i);
+ if (!strcasecmp(floorname, fl->f_name)) {
+ strcpy(rbuf, roomname);
+ ret = i;
}
}
}
- /* since we don't allow multi-level yet, fail.
- extract(rbuf, buf, 1);
- return(0);
- */
- return (-1);
+ if (ret < 0) {
+ /* No subfolderificationalisticism on this one... */
+ safestrncpy(rbuf, foldername, bufsize);
+ ret = (0 | IR_MAILBOX);
+ }
+
+ }
+ else {
+ safestrncpy(rbuf, foldername, bufsize);
+ ret = (0 | IR_MAILBOX);
+ }
+
+ /* Undelimiterizationalize the room name (change '|') */
+ for (i=0; i<strlen(rbuf); ++i) {
+ if (rbuf[i] == '|') rbuf[i] = FDELIM;
}
- safestrncpy(rbuf, foldername, bufsize);
- return (0 | IR_MAILBOX);
+
+
+/*** This doesn't work.
+ char buf[SIZ];
+ if (ret & IR_MAILBOX) {
+ if (atol(rbuf) == 0L) {
+ strcpy(buf, rbuf);
+ sprintf(rbuf, "%010ld.%s", CC->user.usernum, buf);
+ }
+ }
+ ***/
+
+ lprintf(9, "(That translates to \"%s\")\n", rbuf);
+ return(ret);
}
}
return (do_imap_match(mailboxname, pattern) == WILDMAT_TRUE);
}
+
+
+
+/*
+ * Compare an IMAP date string (date only, no time) to the date found in
+ * a Unix timestamp.
+ */
+int imap_datecmp(char *datestr, time_t msgtime) {
+ char daystr[SIZ];
+ char monthstr[SIZ];
+ char yearstr[SIZ];
+ int i;
+ int day, month, year;
+ int msgday, msgmonth, msgyear;
+ struct tm msgtm;
+
+ if (datestr == NULL) return(0);
+
+ /* Expecting a date in the form dd-Mmm-yyyy */
+ extract_token(daystr, datestr, 0, '-');
+ extract_token(monthstr, datestr, 1, '-');
+ extract_token(yearstr, datestr, 2, '-');
+
+ day = atoi(daystr);
+ year = atoi(yearstr);
+ month = 0;
+ for (i=0; i<12; ++i) {
+ if (!strcasecmp(monthstr, ascmonths[i])) {
+ month = i;
+ }
+ }
+
+ /* Extract day/month/year from message timestamp */
+ memcpy(&msgtm, localtime(&msgtime), sizeof(struct tm));
+ msgday = msgtm.tm_mday;
+ msgmonth = msgtm.tm_mon;
+ msgyear = msgtm.tm_year + 1900;
+
+ /* Now start comparing */
+
+ if (year < msgyear) return(+1);
+ if (year > msgyear) return(-1);
+
+ if (month < msgmonth) return(+1);
+ if (month > msgmonth) return(-1);
+
+ if (day < msgday) return(+1);
+ if (day > msgday) return(-1);
+
+ return(0);
+}