]> code.citadel.org Git - citadel.git/blobdiff - citadel/imap_tools.c
*** empty log message ***
[citadel.git] / citadel / imap_tools.c
index c205dbd35bbfc07909e159e2c2a32c36a68cfa37..f0299f3bea104cf16b94c3195c141d84bf27ca62 100644 (file)
@@ -41,7 +41,7 @@ void imap_strout(char *buf)
        }
 
        if (is_literal) {
-               cprintf("{%d}\r\n%s", strlen(buf), buf);
+               cprintf("{%ld}\r\n%s", (long)strlen(buf), buf);
        } else {
                cprintf("\"%s\"", buf);
        }
@@ -89,11 +89,12 @@ int imap_parameterize(char **args, char *buf)
 }
 
 /*
- * Convert a struct quickroom to an IMAP-compatible mailbox name.
+ * Convert a struct room to an IMAP-compatible mailbox name.
  */
-void imap_mailboxname(char *buf, int bufsize, struct quickroom *qrbuf)
+void imap_mailboxname(char *buf, int bufsize, struct room *qrbuf)
 {
        struct floor *fl;
+       int i;
 
        /*
         * For mailboxes, just do it straight...
@@ -113,6 +114,13 @@ void imap_mailboxname(char *buf, int bufsize, struct quickroom *qrbuf)
                         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] = '|';
+       }
 }
 
 
@@ -130,45 +138,65 @@ void imap_mailboxname(char *buf, int bufsize, struct quickroom *qrbuf)
 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.
         */
        if (!strcasecmp(foldername, "INBOX")) {
                safestrncpy(rbuf, MAILROOM, bufsize);
-               return (0 | IR_MAILBOX);
+               ret = (0 | IR_MAILBOX);
        }
-       if (levels > 1) {
-               extract(buf, foldername, 0);
+       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);
+               }
+
        }
-       safestrncpy(rbuf, foldername, bufsize);
-       return (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;
+       }
+
+
+/*** 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);
 }