Author: dbkr
Date: 2006-08-13 01:07:04 +0000 (Sun, 13 Aug 2006)
New Revision: 10059

Modified:
   trunk/apps/Freemail/src/freemail/MessageBank.java
   trunk/apps/Freemail/src/freemail/imap/IMAPHandler.java
   trunk/apps/Freemail/src/freemail/imap/IMAPMessage.java
Log:
Better handling of quoting in IMAP commands. Allow spaces in IMAP folder names, 
and general IMAP folder fixes.


Modified: trunk/apps/Freemail/src/freemail/MessageBank.java
===================================================================
--- trunk/apps/Freemail/src/freemail/MessageBank.java   2006-08-12 23:44:27 UTC 
(rev 10058)
+++ trunk/apps/Freemail/src/freemail/MessageBank.java   2006-08-13 01:07:04 UTC 
(rev 10059)
@@ -123,14 +123,17 @@
        }

        public MessageBank getSubFolder(String name) {
-               if (!name.matches("[\\w_]*")) return null;
+               if (!name.matches("[\\w\\s_]*")) return null;

                File targetdir = new File(this.dir, name);
+               if (!targetdir.exists()) {
+                       return null;
+               }
                return new MessageBank(targetdir);
        }

        public MessageBank makeSubFolder(String name) {
-               if (!name.matches("[\\w_]*")) return null;
+               if (!name.matches("[\\w\\s_]*")) return null;

                File targetdir = new File(this.dir, name);

@@ -146,7 +149,7 @@
                if (targetdir.exists()) {
                        return null;
                }
-                                  
+                  
                if (targetdir.mkdir()) {
                        return new MessageBank(targetdir);
                }

Modified: trunk/apps/Freemail/src/freemail/imap/IMAPHandler.java
===================================================================
--- trunk/apps/Freemail/src/freemail/imap/IMAPHandler.java      2006-08-12 
23:44:27 UTC (rev 10058)
+++ trunk/apps/Freemail/src/freemail/imap/IMAPHandler.java      2006-08-13 
01:07:04 UTC (rev 10059)
@@ -924,10 +924,15 @@
                int i;
                MessageBank tempmb = this.inbox;
                for (i = 1; i < mbparts.length; i++) {
-                       tempmb = tempmb.makeSubFolder(mbparts[i]);
-                       if (tempmb == null) {
-                               this.reply(msg, "NO couldn't create mailbox");
-                               return;
+                       MessageBank existingmb = 
tempmb.getSubFolder(mbparts[i]);
+                       if (existingmb != null) {
+                               tempmb = existingmb;
+                       } else {
+                               tempmb = tempmb.makeSubFolder(mbparts[i]);
+                               if (tempmb == null) {
+                                       this.reply(msg, "NO couldn't create 
mailbox");
+                                       return;
+                               }
                        }
                }
                this.reply(msg, "OK Mailbox created");

Modified: trunk/apps/Freemail/src/freemail/imap/IMAPMessage.java
===================================================================
--- trunk/apps/Freemail/src/freemail/imap/IMAPMessage.java      2006-08-12 
23:44:27 UTC (rev 10058)
+++ trunk/apps/Freemail/src/freemail/imap/IMAPMessage.java      2006-08-13 
01:07:04 UTC (rev 10059)
@@ -1,6 +1,8 @@
 package freemail.imap;

 import java.util.Vector;
+import java.util.Stack;
+import java.util.Arrays;

 public class IMAPMessage {
        public final String tag;
@@ -8,7 +10,10 @@
        public final String[] args;

        IMAPMessage(String raw) throws IMAPBadMessageException {
-               String[] parts = doSplit(raw, '[', ']');
+               char[] a1 = {'[', '"'};
+               char[] a2 = {']', '"'};
+               
+               String[] parts = doSplit(raw, a1, a2);
                if (parts.length < 2) {
                        throw new IMAPBadMessageException();
                }
@@ -22,24 +27,42 @@
                }
        }

-       // split on spaces that aren't between two square given characters
        public static String[] doSplit(String in, char c1, char c2) {
-               boolean in_brackets = false;
+               char[] a1 = new char[1];
+               a1[0] = c1;
+               char[] a2 = new char[1];
+               a2[0] = c2;
+               return doSplit(in, a1, a2);
+       }
+       
+       // split on spaces that aren't between two given characters
+       public static String[] doSplit(String in, char[] c1, char[] c2) {
                Vector parts = new Vector();
                StringBuffer buf = new StringBuffer("");
+               Stack context = new Stack();

                for (int i = 0; i < in.length(); i++) {
                        char c = in.charAt(i);

-                       if (c == c1) {
-                               in_brackets = true;
+                       int pos = -1;
+                       for (int j = 0; j < c1.length; j++) {
+                               if (c1[j] == c) {
+                                       pos = j;
+                                       break;
+                               }
+                       }
+                       
+                       if (!context.empty() && c == 
((Character)context.peek()).charValue()) {
+                               context.pop();
                                buf.append(c);
-                       } else if (c == c2) {
-                               in_brackets = false;
+                       } else if (pos >= 0) {
+                               context.push(new Character(c2[pos]));
                                buf.append(c);
-                       } else if (c == ' ' && !in_brackets) {
+                       } else if (c == ' ' && context.empty()) {
                                parts.add(buf.toString());
                                buf = new StringBuffer("");
+                       } else if (context.empty()) {
+                               buf.append(c);
                        } else buf.append(c);
                }



Reply via email to