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);
}