minor fixup to FileBasedMailbox
[org.ibex.mail.git] / src / org / ibex / mail / target / Mailbox.java
index cb75b69..e4266c3 100644 (file)
@@ -10,12 +10,19 @@ import java.text.*;
 /** abstract superclass for mailboxes, which store messages along with their flags */
 public abstract class Mailbox extends Target {
 
+    public Object get(Object key) {
+       if (key instanceof String) return slash((String)key, true);
+       return null;
+    }
+
     public static final String STORAGE_ROOT =
         System.getProperty("ibex.mail.root", File.separatorChar + "var" + File.separatorChar + "org.ibex.mail");
 
 
     // Required Methods //////////////////////////////////////////////////////////////////////////////
 
+    /** phantom mailboxes merely contain others; like the alt.binaries in alt.binaries.warez */
+    public abstract boolean          phantom();
     public abstract Mailbox.Iterator iterator(Query q);
     public abstract void             add(Message message);
     public abstract void             add(Message message, int flags);
@@ -23,9 +30,8 @@ public abstract class Mailbox extends Target {
     public abstract void             copy(Query q, Mailbox dest);
     public abstract int              count(Query q);
     public abstract int              uidNext();
-    public abstract int              uidValidity();
     public abstract void             rename(String newName);      /* FIXME: IMAP semantics require creating parent dirs */
-    public abstract void             destroy();
+    public abstract void             destroy(boolean recursive);
     public abstract Mailbox          slash(String name, boolean create);
     public abstract String[]         children();
 
@@ -38,19 +44,37 @@ public abstract class Mailbox extends Target {
 
     // Default Implementation //////////////////////////////////////////////////////////////////////////////
 
+    private int randomUidValidity = new Random().nextInt();
+    public  int uidValidity()  { return randomUidValidity; }
+
     /** default, inefficient implementation of Mailbox; only requires a few methods to be implemented */
     public static abstract class Default extends Mailbox {
         public Mailbox.Iterator iterator(Query q) { return new Mailbox.Iterator.QueryIterator(q, this); }
+        public boolean phantom() { return false; }
         public void copy(Query q, Mailbox dest) { for(Mailbox.Iterator it = iterator(q); it.next();) dest.add(it.cur()); }
         public int count(Query q) { int count = 0; for(Mailbox.Iterator it = iterator(q); it.next();) count++; return count; }
         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 void  destroy(boolean recursive) { throw new MailException("not supported"); }
+        public Mailbox slash(String name, boolean create) { return null; }
         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(); }
         }
         public static abstract class Iterator implements Mailbox.Iterator {
+            public boolean seen() { return false; }
+            public boolean deleted() { return false; }
+            public boolean flagged() { return false; }
+            public boolean draft() { return false; }
+            public boolean answered() { return false; }
+            public boolean recent() { return false; }
+            public void    seen(boolean on) { }
+            public void    deleted(boolean on) { }
+            public void    flagged(boolean on) { }
+            public void    draft(boolean on) { }
+            public void    answered(boolean on) { }
+            public void    recent(boolean on) { }
+            public void    set(String key, String val) { throw new MailException("not supported"); }
+            public String  get(String key) { throw new MailException("not supported"); }
             public int flags() {
                 return 
                     (deleted() ? Flag.DELETED : 0) |
@@ -87,26 +111,31 @@ public abstract class Mailbox extends Target {
     // Iterator Definition //////////////////////////////////////////////////////////////////////////////
 
     public static interface Iterator {
-        public abstract int flags();
         public abstract Message cur();
+        public abstract MIME.Headers head();
         public abstract boolean next();
         public abstract int     uid();
         public abstract int     num();
         public abstract void    delete();
+
         public abstract void    set(String key, String val);
         public abstract String  get(String key);
+
         public abstract boolean seen();
         public abstract boolean deleted();
         public abstract boolean flagged();
         public abstract boolean draft();
         public abstract boolean answered();
         public abstract boolean recent();
+
         public abstract void    seen(boolean on);
         public abstract void    deleted(boolean on);
         public abstract void    flagged(boolean on);
         public abstract void    draft(boolean on);
         public abstract void    answered(boolean on);
         public abstract void    recent(boolean on);
+
+        public abstract int     flags();
         public abstract void    addFlags(int flags);
         public abstract void    removeFlags(int flags);
         public abstract void    setFlags(int flags);
@@ -115,6 +144,7 @@ public abstract class Mailbox extends Target {
             private Iterator it;
             public Wrapper(Iterator it) { this.it = it; }
             public Message cur() { return it.cur(); }
+            public MIME.Headers head() { return it.head(); }
             public boolean next() { return it.next(); }
             public int     uid() { return it.uid(); }
             public int     flags() { return it.flags(); }
@@ -142,7 +172,34 @@ public abstract class Mailbox extends Target {
         class QueryIterator extends Mailbox.Iterator.Wrapper {
             Query q;
             public QueryIterator(Query q, Mailbox m) { super(m.iterator()); this.q = q; }
-            public boolean next() { do { if (!super.next()) return false; } while(!q.match(this)); return true; }
+            public boolean next() {
+               if (q == null) return false;
+               do { if (!super.next()) return false; } while(!q.match(this)); return true; }
+        }
+
+        public static class NullIterator extends Mailbox.Default.Iterator {
+            public NullIterator() { }
+            public Message cur() { return null; }
+            public MIME.Headers head() { return null; }
+            public boolean next() { return false; }
+            public int     uid() { return 0; }
+            public int     flags() { return 0; }
+            public int     num() { return 0; }
+            public void    set(String key, String val) { }
+            public String  get(String key) { return null; }
+            public void    delete() { }
+            public boolean seen() { return false; }
+            public boolean deleted() { return false; }
+            public boolean flagged() { return false; }
+            public boolean draft() { return false; }
+            public boolean answered() { return false; }
+            public boolean recent() { return false; }
+            public void    seen(boolean on) { }
+            public void    deleted(boolean on) { }
+            public void    flagged(boolean on) { }
+            public void    draft(boolean on) { }
+            public void    answered(boolean on) { }
+            public void    recent(boolean on) { }
         }
     }