import java.text.*;
import java.io.*;
+// FEATURE: IDLE extension for blackberries
+
// FIXME: this is valid LSUB "" asdfdas%*%*%*%*SFEFGWEF
// FIXME: be very careful about where/when we quotify stuff
// FIXME: 'UID FOO 100:*' must match at least one message even if all UIDs less than 100
}
}
- public String[] capability() { return new String[] { "IMAP4rev1" , "UNSELECT", "ID" }; }
+ public String[] capability() { return new String[] { "IMAP4rev1" , "UNSELECT" /*, "ID"*/ }; }
public Hashtable id(Hashtable clientId) {
Hashtable response = new Hashtable();
response.put("name", IMAP.class.getName());
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(((lastuid=uid)
- ? Query.uid(token().set(maxn(uid)))
- : Query.imapNumber(token().set(maxn(uid)))),
- lastfetch=token().lx(), 0, 0, 0, uid, 0); break;
+ case FETCH: selected(); lastuid = uid; fetch((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;
Date arrival = new Date();
Parser.Token t = token();
if (t.type == t.LIST) { flags = t.flags(); t = token(); }
- if (t.type != t.QUOTED) { arrival = t.datetime(); t = token(); }
+ Parser.Token t2 = token(false);
+ if (t2 != null) { arrival = t.datetime(); t = t2; }
api.append(m, flags, arrival, t.q());
break; }
case STORE: {
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); }
+ } catch (Server.No n) { println(tag==null?"* BAD Invalid tag":(tag+" No " + n.toString())); Log.warn(this,n);
+ } finally {
+ //Log.warn(this, conn.dumpLog()+"\n");
+ }
}
private Parser.Token[] lastfetch = null; // hack
t = new Parser.Token[] { parser.token("FLAGS"), parser.token("INTERNALDATE"),
parser.token("RFC822.SIZE") };
}
+ boolean looked_at_body = false;
for(int i=0; i<t.length; i++) {
if (r.length() > initlen) r.append(" ");
if (t[i] == null || t[i].s == null) continue;
} 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.imapNumber(new int[] { num, num }), Mailbox.Flag.SEEN, false, false);
+ looked_at_body = true;
if (i >= t.length - 1 || t[i+1].type != Parser.Token.LIST) {
spec |= BODYSTRUCTURE;
if (e) { r.append(" "); r.append(Printer.bodystructure(m)); } continue;
- //{ if (e) { r.append(" "); r.append(Printer.qq(m.body)); } continue; }
+ //if (e) { r.append(" "); r.append(Printer.qq(m.getBody().getStream())); } continue;
}
Fountain payload = Fountain.Util.create("");
r.append("[");
if (e) { r.append("] "); r.append(Printer.qq(payload.getStream())); }
}
}
+ if ((spec & PEEK) == 0 && looked_at_body && e)
+ api.addFlags(Query.imapNumber(new int[] { num, num }), Mailbox.Flag.SEEN, false, false);
if (e) {
r.append(")");
println("* " + r.toString());
}
public Date datetime() {
if (type != QUOTED) bad("Expected quoted datetime");
- try { return new SimpleDateFormat("dd-MM-yyyy hh:mm:ss zzzz").parse(s.trim());
+ try { return new SimpleDateFormat("dd-MMM-yyyy hh:mm:ss zzzz").parse(s.trim());
} catch (ParseException p) { throw new Server.Bad("invalid datetime format " + s + " : " + p); }
}
public String atom() {
")";
}
+ // FIXME: ugly
+ public static String qq(Stream stream) {
+ StringBuffer sb = new StringBuffer();
+ stream.transcribe(sb);
+ return qq(sb.toString());
+ }
public static String qq(String s) {
StringBuffer ret = new StringBuffer();
ret.append('{');