// FIXME this is evil
public static String getBodyString(Message m) {
StringBuffer sb = new StringBuffer();
- m.getStream().transcribe(sb);
+ m.getBody().getStream().transcribe(sb);
return sb.toString();
}
public void lsub(String start, String ref) { list(start, ref, true); }
public void list(String start, String ref) { list(start, ref, false); }
public void list(String start, String ref, boolean lsub) {
+
+ // FIXME this might be wrong
+ if (ref.equalsIgnoreCase("inbox")) { client.list(sep,"inbox",lsub,false); return; }
+
if (ref.length() == 0) { client.list(sep, start, lsub, false); return; }
while (start.endsWith(""+sep)) start = start.substring(0, start.length() - 1);
if (ref.endsWith("%")) ref = ref + sep;
for(int i=0; i<children.length; i++) {
String s = children[i], pre = ref, kid = start + (start.length() > 0 ? sep+"" : "") + s;
if (mailbox(kid, false) == null) continue;
- boolean phantom = mailbox(kid, false).phantom();
- while(true) {
- if (pre.length() == 0) {
- if (s.length() == 0) client.list(sep, kid, lsub, phantom);
- } else switch(pre.charAt(0)) {
- case sep: if (s.length() == 0) list(kid, pre.substring(1), lsub); break;
- case '%': client.list(sep,kid,lsub,phantom);pre=pre.substring(1); s = ""; continue;
- case '*': client.list(sep,kid,lsub,phantom);list(kid,pre,lsub);pre=pre.substring(1); break;
- default: if (s.length()==0) break;
- if (s.charAt(0) != pre.charAt(0)) break;
- s = s.substring(1); pre = pre.substring(1); continue;
+ Mailbox phant = mailbox(kid, false, false);
+ if (phant != null) {
+ boolean phantom = phant.phantom();
+ while(true) {
+ if (pre.length() == 0) {
+ if (s.length() == 0) client.list(sep, kid, lsub, phantom);
+ } else switch(pre.charAt(0)) {
+ case sep: if (s.length() == 0) list(kid, pre.substring(1), lsub); break;
+ case '%': client.list(sep,kid,lsub,phantom);pre=pre.substring(1); s = ""; continue;
+ case '*': client.list(sep,kid,lsub,phantom);list(kid,pre,lsub);pre=pre.substring(1); break;
+ default: if (s.length()==0) break;
+ if (s.charAt(0) != pre.charAt(0)) break;
+ s = s.substring(1); pre = pre.substring(1); continue;
+ }
+ break;
}
- break;
}
}
}
public int count(String mailbox) { return mailbox(mailbox, false).count(Query.all()); }
public int count() { return selected().count(Query.all()); }
public int uidNext(String mailbox) { return mailbox(mailbox, false).uidNext(); }
- public int uidValidity(String mailbox) { return mailbox(mailbox, false).uidValidity(); }
- public void select(String mailbox, boolean examineOnly) {
- selected = mailbox(mailbox, false);
- }
+ public int uidValidity(String mailbox) { return Math.abs(mailbox(mailbox, false).uidValidity()); }
+ public void select(String mailbox, boolean examineOnly) { selected = mailbox(mailbox, false); }
public int[] search(Query q, boolean uid) {
Vec.Int vec = new Vec.Int();
for(Mailbox.Iterator it = selected().iterator(q); it.next();) {
- vec.addElement(uid ? it.uid() : it.num());
+ vec.addElement(uid ? it.uid() : it.imapNumber());
it.recent(false);
}
return vec.dump();
else if (style == 0) it.setFlags(flags);
else if (style == 1) it.addFlags(flags);
it.recent(recent);
- if (!silent) client.fetch(it.num(), it.flags(), -1, null, it.uid());
+ if (!silent) client.fetch(it.imapNumber(), it.flags(), -1, null, it.uid());
}
}
public void rename(String from0, String to) {
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.num(), it.flags(), size, message, it.uid());
+ client.fetch(it.imapNumber(), it.flags(), size, message, it.uid());
it.recent(false);
}
}
parser = new Parser(conn);
conn.setTimeout(30 * 60 * 1000);
println("* OK " + conn.vhost + " " + IMAP.class.getName() + " IMAP4rev1 [RFC3501] v" + version + " server ready");
- for(String tag = null;; newline()) try {
+ for(String tag = null;;) try {
conn.flush();
boolean uid = false;
tag = null; Parser.Token tok = token(); if (tok == null) return; tag = tok.astring();
case SUBSCRIBE: api.subscribe(token().astring()); break;
case UNSUBSCRIBE: api.unsubscribe(token().astring()); break;
case RENAME: api.rename(token().astring(), token().astring()); break;
- case COPY: selected(); api.copy(Query.set(uid, token().set(maxn(uid))), token().astring()); break;
case DELETE: api.delete(token().atom()); break;
case CHECK: selected(); api.check(); break;
case NOOP: api.noop(); break;
case EXPUNGE: selected(); api.expunge(); break;
case UNSELECT: selected(); api.unselect(); selected = false; break;
case CREATE: api.create(token().astring()); break;
- case FETCH: selected(); fetch(Query.set(lastuid=uid, token().set(maxn(uid))),
+ case FETCH: selected(); fetch(((lastuid=uid)
+ ? Query.uid(token().set(maxn(uid)))
+ : Query.imapNumber(token().set(maxn(uid)))),
lastfetch=token().lx(), 0, 0, 0, uid, 0); break;
+ case COPY: selected(); api.copy(uid
+ ? Query.uid(token().set(maxn(uid)))
+ : Query.imapNumber(token().set(maxn(uid))), token().astring()); break;
case SEARCH: {
selected();
int[] result = api.search(query(maxn(uid)), uid);
break; }
case STORE: {
selected();
- Query q = uid ? Query.uid(token().set(maxn(uid))) : Query.num(token().set(maxn(uid)));
+ Query q = uid ? Query.uid(token().set(maxn(uid))) : Query.imapNumber(token().set(maxn(uid)));
String s = token().atom().toUpperCase();
int flags = token().flags();
if (s.equals("FLAGS")) api.setFlags(q, flags, uid, false);
}
println(tag+" OK "+command+" Completed. " +
(commandKey == LOGIN ? ("[CAPABILITY "+Printer.join(" ", api.capability())+"]") : ""));
- Log.error("[imap]", conn.dumpLog());
- } catch (Server.Bad b) { println(tag==null ? "* BAD Invalid tag":(tag + " Bad " + b.toString()));
- } catch (Server.No n) { println(tag==null?"* BAD Invalid tag":(tag+" No " + n.toString())); }
+ try {
+ newline();
+ } catch (Stream.EOF e) {
+ Log.info(this, "connection closed");
+ return;
+ }
+ } catch (Server.Bad b) { println(tag==null ? "* BAD Invalid tag":(tag + " Bad " + b.toString())); Log.warn(this,b);
+ } catch (Server.No n) { println(tag==null?"* BAD Invalid tag":(tag+" No " + n.toString())); Log.warn(this,n); }
}
private Parser.Token[] lastfetch = null; // hack
} else if (!(s.equals("BODY.PEEK") || s.equals("BODY"))) { throw new Server.No("unknown fetch argument: " + s);
} else {
if (s.equalsIgnoreCase("BODY.PEEK")) spec |= PEEK;
- //else if (e) api.addFlags(Query.num(new int[] { num, num }), Mailbox.Flag.SEEN, false, false);
+ //else if (e) api.addFlags(Query.imapNumber(new int[] { num, num }), Mailbox.Flag.SEEN, false, false);
if (i >= t.length - 1 || t[i+1].type != Parser.Token.LIST) {
spec |= BODYSTRUCTURE;
if (e) { r.append(" "); r.append(Printer.bodystructure(m)); } continue;
Parser.Token t = token(false);
if (t == null) break;
if (t.type == t.LIST) throw new Server.No("nested queries not yet supported FIXME");
- else if (t.type == t.SET) return Query.num(t.set(max));
+ else if (t.type == t.SET) return Query.imapNumber(t.set(max));
s = t.atom().toUpperCase();
if (s.equals("NOT")) return Query.not(query(max, maxuid));
if (s.equals("OR")) return Query.or(query(max, maxuid), query(max, maxuid)); // FIXME parse rest of list
}
}
- public void newline() {
- while (stream.peekc() == '\r' || stream.peekc() == '\n' || stream.peekc() == ' ') {
- for(char c = stream.peekc(); c == ' ';) { stream.getc(); c = stream.peekc(); };
- for(char c = stream.peekc(); c == '\r' || c == '\n';) { stream.getc(); c = stream.peekc(); };
- }
- }
+ public void newline() { stream.readln(); }
public Token token() { return token(true); }
public Token token(boolean freak) {