From 9d2d7111c33d5b206eaa027dde113626b0fbf073 Mon Sep 17 00:00:00 2001 From: adam Date: Sat, 12 Jun 2004 07:34:55 +0000 Subject: [PATCH] LIST sorta working but broken darcs-hash:20040612073455-5007d-f4780596c31e964fb837be1d87a420bebb8f829b.gz --- src/org/ibex/mail/protocol/IMAP.java | 52 ++++++++++++++++++------ src/org/ibex/mail/target/FileBasedMailbox.java | 13 ++++++ src/org/ibex/mail/target/Mailbox.java | 2 + 3 files changed, 54 insertions(+), 13 deletions(-) diff --git a/src/org/ibex/mail/protocol/IMAP.java b/src/org/ibex/mail/protocol/IMAP.java index 04d7194..50b2803 100644 --- a/src/org/ibex/mail/protocol/IMAP.java +++ b/src/org/ibex/mail/protocol/IMAP.java @@ -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 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()); } diff --git a/src/org/ibex/mail/target/FileBasedMailbox.java b/src/org/ibex/mail/target/FileBasedMailbox.java index 5952406..c0fd74b 100644 --- a/src/org/ibex/mail/target/FileBasedMailbox.java +++ b/src/org/ibex/mail/target/FileBasedMailbox.java @@ -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