LIST sorta working but broken
authoradam <adam@megacz.com>
Sat, 12 Jun 2004 07:34:55 +0000 (07:34 +0000)
committeradam <adam@megacz.com>
Sat, 12 Jun 2004 07:34:55 +0000 (07:34 +0000)
darcs-hash:20040612073455-5007d-f4780596c31e964fb837be1d87a420bebb8f829b.gz

src/org/ibex/mail/protocol/IMAP.java
src/org/ibex/mail/target/FileBasedMailbox.java
src/org/ibex/mail/target/Mailbox.java

index 04d7194..50b2803 100644 (file)
@@ -84,15 +84,41 @@ public class IMAP extends MessageProtocol {
 
         private boolean auth(String user, String pass) { /* FEATURE */ return user.equals("megacz") && pass.equals("pass"); }
 
-        // FEATURE: manage subscriptions
-        public void lsub(Mailbox m, String s) {
-            star("LSUB () \".\" INBOX");
-        }
-
-        // FIXME
-        public void list(Mailbox m, String s) {
-            //star("LIST () \".\" INBOX");
-            star("LIST () \".\" users.megacz.imap");
+        public void lsub(String start, String ref) { list(start, ref); }   // FEATURE: manage subscriptions
+        public void list(String start, String ref) {
+            if (ref.length() == 0) { star("LIST () \".\" \"\""); return; }
+            if (start.startsWith(".")) return;
+            String[] children = (start.length() == 0 ? root : getMailbox(start, false)).children();
+            for(int i=0; i<children.length; i++) {
+                String s = children[i], pre = ref;
+                boolean stop = true;
+                while(true) {
+                    int percent = pre.indexOf('%'), star = pre.indexOf('*'), dot = pre.indexOf('.');
+                    if (s.length() == 0 && pre.length() == 0) {
+                        star("LIST () \".\" \""+(start + (start.length() > 0 ? "." : "") + children[i])+"\"");
+                        break;
+                    } else if (pre.length() == 0) {
+                        break;
+                    } else if (percent != 0 && star != 0 && dot != 0) {
+                        if (s.length() == 0 || s.charAt(0) != pre.charAt(0)) break;
+                        s = s.substring(1); pre = pre.substring(1);
+                    } else if (pre.charAt(0) == '.') {
+                        if (s.length() == 0) list(start + (start.length() > 0 ? "." : "") + children[i], pre.substring(1));
+                        break;
+                    } else if (pre.charAt(0) == '%') {
+                        star("LIST () \".\" \""+(start + (start.length() > 0 ? "." : "") + children[i])+"\"");
+                        list(start + (start.length() > 0 ? "." : "") + children[i], pre.substring(1));
+                        // FIXME this isn't right
+                        pre = pre.substring(1);
+                    } else if (pre.charAt(0) == '*') {
+                        // FIXME need to iterate
+                        star("LIST () \".\" \""+(start + (start.length() > 0 ? "." : "") + children[i])+"\"");
+                        list(start + (start.length() > 0 ? "." : "") + children[i], pre);
+                        pre = pre.substring(1);
+                   }
+                }
+            }
+            // FIXME: \Noselect
         }
 
         public void copy(final Query q, Mailbox to) { for(Mailbox.Iterator it=selected.iterator(q);it.next();) to.add(it.cur()); }
@@ -250,8 +276,8 @@ public class IMAP extends MessageProtocol {
                     String command = atom();
                     if (command.equalsIgnoreCase("UID"))             { uid = true; command = atom(); }
                     if (command.equalsIgnoreCase("AUTHENTICATE"))    { login(astring(), astring()); }
-                    else if (command.equalsIgnoreCase("LIST"))         list(mailbox(), mailboxPattern()); 
-                    else if (command.equalsIgnoreCase("LSUB"))         lsub(mailbox(), mailboxPattern()); 
+                    else if (command.equalsIgnoreCase("LIST"))         list(q(), q()); 
+                    else if (command.equalsIgnoreCase("LSUB"))         lsub(q(), q()); 
                     else if (command.equalsIgnoreCase("SUBSCRIBE"))   { /* FIXME */ }
                     else if (command.equalsIgnoreCase("UNSUBSCRIBE")) { /* FIXME */ }
                     else if (command.equalsIgnoreCase("CAPABILITY")) { capability(); }
@@ -271,8 +297,8 @@ public class IMAP extends MessageProtocol {
                                                                              parseFetchRequest(l()), uid);
                     else if (command.equalsIgnoreCase("STATUS"))       status(mailbox(), l());
                     else                                     throw new Exn.Bad("unrecognized command \"" + command + "\"");
-                    pw.println(tag + " OK uid " + command + " Completed.");
-                    System.err.println(tag + " OK uid " + command + " Completed.");
+                    pw.println(tag + " OK " + command + " Completed.");
+                    System.err.println(tag + " OK " + command + " Completed.");
                 } catch (Exn.Bad b) { pw.println(tag + " Bad " + b.toString()); System.err.println(tag + " Bad " + b.toString()); b.printStackTrace();
                 } catch (Exn.No n) {  pw.println(tag + " OK " + n.toString()); System.err.println(tag + " OK " + n.toString());
                 }
index 5952406..c0fd74b 100644 (file)
@@ -38,6 +38,19 @@ public class FileBasedMailbox extends Mailbox.Default {
 
     public Mailbox          slash(String name, boolean create) {
         return FileBasedMailbox.getFileBasedMailbox(path + slash + name, create); }
+
+    public String[] children() {
+        Vec vec = new Vec();
+        String[] list = new File(path).list();
+        for(int i=0; i<list.length; i++) {
+            if (!(new File(path + slash + list[i]).isDirectory())) continue;
+            vec.addElement(list[i]);
+        }
+        String[] ret = new String[vec.size()];
+        vec.copyInto(ret);
+        return ret;
+    }
+
     public Mailbox.Iterator iterator() { return new FileBasedMailbox.Iterator(); }
     public int              uidValidity() { return (int)(new File(path).lastModified() & 0xffffffL); }
 
index 5e3e67f..e2307a1 100644 (file)
@@ -25,6 +25,7 @@ public abstract class Mailbox extends Target {
     public abstract void             rename(String newName);
     public abstract void             destroy();
     public abstract Mailbox          slash(String name, boolean create);
+    public abstract String[]         children();
 
 
     // Thunks ////////////////////////////////////////////////////////////////////////////
@@ -43,6 +44,7 @@ public abstract class Mailbox extends Target {
         public void rename(String newName) { throw new MailException("not supported"); }
         public void  destroy() { throw new MailException("not supported"); }
         public Mailbox slash(String name, boolean create) { throw new MailException("not supported"); }
+        public String[] children() { return new String[] { }; }
         public void move(Query q, Mailbox dest) {
             for(Mailbox.Iterator it = iterator(q);it.next();) { dest.add(it.cur()); it.delete(); }
         }