major simplifications to Iterator api
[org.ibex.mail.git] / src / org / ibex / mail / protocol / IMAP.java
index 5b98105..848feb2 100644 (file)
@@ -172,14 +172,14 @@ public class IMAP {
 
         public void copy(Query q, String to) { copy(q, mailbox(to, false)); }
         /*  */ void copy(Query q, Mailbox to) {
-            for(Mailbox.Iterator it=selected().iterator(q);it.next();) to.add(it.cur(), it.flags() | Mailbox.Flag.RECENT); }
+            for(Mailbox.Iterator it=selected().iterator(q);it.next();) to.insert(it.cur(), it.getFlags() | Mailbox.Flag.RECENT); }
 
         public void unselect() { selected = null; }
         public void delete(String m0) { delete(mailbox(m0,false)); }
         public void delete(Mailbox m) { if (!m.equals(inbox)) m.destroy(false); else throw new Bad("can't delete inbox"); }
         public void create(String m) { mailbox(m, true, false); }
         public void append(String m,int f,Date a,String b) { try {
-            mailbox(m,false).add(Message.newMessage(new Fountain.StringFountain(b)),f|Mailbox.Flag.RECENT);
+            mailbox(m,false).insert(Message.newMessage(new Fountain.StringFountain(b)), f | Mailbox.Flag.RECENT);
         } catch (Message.Malformed e) { throw new No(e.getMessage()); } }
         public void check() { }
         public void noop() { }
@@ -208,7 +208,7 @@ public class IMAP {
             Vec.Int vec = new Vec.Int();
             for(Mailbox.Iterator it = selected().iterator(q); it.next();) {
                 vec.addElement(uid ? it.uid() : it.imapNumber());
-                it.recent(false);
+                it.setFlag(Mailbox.Flag.RECENT, false);
             }
             return vec.dump();
         }
@@ -216,18 +216,19 @@ public class IMAP {
         public void setFlags(Query q, int f, boolean uid, boolean silent)    { doFlags(q, f, uid, 0, silent); }
         public void addFlags(Query q, int f, boolean uid, boolean silent)    { doFlags(q, f, uid, 1, silent); }
         public void removeFlags(Query q, int f, boolean uid, boolean silent) { doFlags(q, f, uid, -1, silent); }
-
         private void doFlags(Query q, int flags, boolean uid, int style, boolean silent) {
             for(Mailbox.Iterator it = selected().iterator(q);it.next();) {
-                boolean recent = it.recent();
+                boolean recent = it.getFlag(Mailbox.Flag.RECENT);
                 try { throw new Exception("flags " + flags); } catch (Exception e) { Log.error(this, e); }
-                if (style == -1)     it.removeFlags(flags);
-                else if (style == 0) it.setFlags(flags);
-                else if (style == 1) it.addFlags(flags);
-                it.recent(recent);
-                if (!silent) client.fetch(it.imapNumber(), it.flags(), -1, null, it.uid());
+                for(int flag : Mailbox.Flag.all)
+                    if (style == -1)     { if ((flags & flag)!=0) it.setFlag(flag, false); }
+                    else if (style == 0) { it.setFlag(flag, ((flags & flag)!=0)); }
+                    else if (style == 1) { if ((flags & flag)!=0) it.setFlag(flag, true); }
+                it.setFlag(Mailbox.Flag.RECENT, recent);
+                if (!silent) client.fetch(it.imapNumber(), flags(it), -1, null, it.uid());
             }
-        }            
+        }
+
         public void rename(String from0, String to) {
             Mailbox from = mailbox(from0, false);
             if (from.equals(inbox))                { from.copy(Query.all(), mailbox(to, true)); }
@@ -239,12 +240,19 @@ public class IMAP {
                 Message message = ((spec & (BODYSTRUCTURE | ENVELOPE | INTERNALDATE | FIELDS | FIELDSNOT | RFC822 |
                                             RFC822TEXT | RFC822SIZE | HEADERNOT | HEADER)) != 0) ? it.cur() : null;
                 int size = message == null ? 0 : message.getLength();
-                client.fetch(it.imapNumber(), it.flags(), size, message, it.uid());
-                it.recent(false);
+                client.fetch(it.imapNumber(), flags(it), size, message, it.uid());
+                it.setFlag(Mailbox.Flag.RECENT, false);
             }
         }
     }
 
+    private static int flags(Mailbox.Iterator it) {
+        int ret = 0;
+        for(int flag : Mailbox.Flag.all)
+            if (it.getFlag(flag))
+                ret |= flag;
+        return ret;
+    }
 
     // Single Session Handler //////////////////////////////////////////////////////////////////////////////
 
@@ -782,12 +790,12 @@ public class IMAP {
             }
             static String flags(Mailbox.Iterator it) {
                 return
-                    (it.deleted()  ? "\\Deleted "  : "") +
-                    (it.seen()     ? "\\Seen "     : "") +
-                    (it.flagged()  ? "\\Flagged "  : "") +
-                    (it.draft()    ? "\\Draft "    : "") +
-                    (it.answered() ? "\\Answered " : "") +
-                    (it.recent()   ? "\\Recent "   : "");
+                    (it.getFlag(Mailbox.Flag.DELETED)  ? "\\Deleted "  : "") +
+                    (it.getFlag(Mailbox.Flag.SEEN)     ? "\\Seen "     : "") +
+                    (it.getFlag(Mailbox.Flag.FLAGGED)  ? "\\Flagged "  : "") +
+                    (it.getFlag(Mailbox.Flag.DRAFT)    ? "\\Draft "    : "") +
+                    (it.getFlag(Mailbox.Flag.ANSWERED) ? "\\Answered " : "") +
+                    (it.getFlag(Mailbox.Flag.RECENT)   ? "\\Recent "   : "");
         }
         static String flags(int flags) {
             String ret = "(" +