]> code.citadel.org Git - citadel.git/blobdiff - citadel/imap_tools.c
* The groupware folders "Calendar", "Contacts", "Notes", and "Tasks" are
[citadel.git] / citadel / imap_tools.c
index bf8f28f15f3d633d38cd037a64713a9c7ecce3e2..9215873aa0b1fb88a6dc2ff554971e00f0be02fe 100644 (file)
@@ -89,21 +89,35 @@ int imap_parameterize(char **args, char *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
@@ -116,10 +130,10 @@ void imap_mailboxname(char *buf, int bufsize, struct quickroom *qrbuf)
        }
 
        /*
-        * Replace "/" characters with "|" for pseudo-folder-delimiting
+        * Replace delimiter characters with "|" for pseudo-folder-delimiting
         */
        for (i=0; i<strlen(buf); ++i) {
-               if (buf[i] == '/') buf[i] = '|';
+               if (buf[i] == FDELIM) buf[i] = '|';
        }
 }
 
@@ -149,13 +163,33 @@ int imap_roomname(char *rbuf, int bufsize, char *foldername)
 
        /*
         * 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);
                ret = (0 | IR_MAILBOX);
        }
-
-       if (levels > 1) {
+       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);
+       }
+       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) {
@@ -168,9 +202,11 @@ int imap_roomname(char *rbuf, int bufsize, char *foldername)
                        }
                }
 
-               /* No subfolderificationalisticism on this one... */
-               strcpy(rbuf, roomname);
-               ret = 0;
+               if (ret < 0) {
+                       /* No subfolderificationalisticism on this one... */
+                       safestrncpy(rbuf, foldername, bufsize);
+                       ret = (0 | IR_MAILBOX);
+               }
 
        }
        else {
@@ -178,11 +214,23 @@ int imap_roomname(char *rbuf, int bufsize, char *foldername)
                ret = (0 | IR_MAILBOX);
        }
 
-       /* Undelimiterizationalize the room name (change '|' to '/') */
+       /* Undelimiterizationalize the room name (change '|') */
        for (i=0; i<strlen(rbuf); ++i) {
-               if (rbuf[i] == '|') rbuf[i] = '/';
+               if (rbuf[i] == '|') rbuf[i] = FDELIM;
+       }
+
+
+/*** 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);
 }
 
@@ -360,3 +408,54 @@ int imap_mailbox_matches_pattern(char *pattern, char *mailboxname)
        }
        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);
+}