Mailbox inbox = null;
Mailbox selected = null;
- MailboxTree root = null;
+ MailTree root = null;
Mailbox selected() { if (selected == null) throw new Bad("no mailbox selected"); return selected; }
final Login auth;
final Client client;
private Mailbox mailbox(String name, boolean create) { return mailbox(name, create, true); }
private Mailbox mailbox(String name, boolean create, boolean throwexn) {
if (name.equalsIgnoreCase("inbox")) return inbox;
- MailboxTree mt = mailboxTree(name, create, throwexn);
- return mt==null ? null : mt.getMailbox();
+ if (name.equalsIgnoreCase("trash")) name = "trash";
+ MailTree mt = mailboxTree(name, create, throwexn);
+ Mailbox ret = mt==null ? null : mt.getMailbox();
+ if (ret==null && throwexn) throw new Server.No("no such mailbox " + name);
+ return ret;
}
- private MailboxTree mailboxTree(String name, boolean create) { return mailboxTree(name, create, true); }
- private MailboxTree mailboxTree(String name, boolean create, boolean throwexn) {
- MailboxTree m = root;
+ private MailTree mailboxTree(String name, boolean create) { return mailboxTree(name, create, true); }
+ private MailTree mailboxTree(String name, boolean create, boolean throwexn) {
+ MailTree m = root;
for(StringTokenizer st = new StringTokenizer(name, sep + ""); st.hasMoreTokens();)
if ((m = m.slash(st.nextToken(), create)) == null) {
if (throwexn) throw new Server.No("no such mailbox " + name);
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;
- MailboxTree phant = mailboxTree(kid, false, false);
+ MailTree phant = mailboxTree(kid, false, false);
if (phant != null) {
boolean phantom = phant.getMailbox()==null;
while(true) {
public void unselect() { selected = null; }
public void delete(String m0) { mailboxTree(dirname(m0),false).rmdir(basename(m0)); }
+
public void rename(String from0, String to) {
Mailbox from = mailbox(from0, false);
if (from.equals(inbox)) { from.copy(Query.all(), mailbox(to, true)); }
else if (to.equalsIgnoreCase("inbox")) { from.copy(Query.all(), mailbox(to, true)); delete(from0); }
- else mailboxTree(dirname(from0), false).rename(dirname(from0), mailboxTree(dirname(to), false), basename(to));
+ else mailboxTree(dirname(from0), false)
+ .rename(dirname(from0),
+ mailboxTree(dirname(to),
+ true /* required by IMAP */),
+ basename(to));
}
public void create(String m) { mailbox(m, true, false); }
int ret = 0;
Mailbox mb = selected();
if (mb == null) return 0;
- for(Mailbox.Iterator it = mb.iterator(); it.next(); ) ret = it.uid();
- return ret;
+ return mb.maxuid();
}
public int unseen(String mailbox) { return mailbox(mailbox, false).count(Query.not(Query.seen())); }
public int recent(String mailbox) { return mailbox(mailbox, false).count(Query.recent()); }
Vec.Int vec = new Vec.Int();
for(Mailbox.Iterator it = selected().iterator(q); it.next();) {
vec.addElement(uid ? it.uid() : it.imapNumber());
- it.setFlags(it.getFlags() & ~Mailbox.Flag.RECENT);
+ if ((it.getFlags() & Mailbox.Flag.RECENT) != 0)
+ it.setFlags(it.getFlags() & ~Mailbox.Flag.RECENT);
}
return vec.dump();
}
public void fetch(Query q, int spec, String[] headers, int start, int end, boolean uid) {
for(Mailbox.Iterator it = selected().iterator(q); it.next(); ) {
- Message message = ((spec & (BODYSTRUCTURE | ENVELOPE | INTERNALDATE | FIELDS | FIELDSNOT | RFC822 |
- RFC822TEXT | RFC822SIZE | HEADERNOT | HEADER)) != 0) ? it.cur() : null;
+ Message message =
+ ((spec & (BODYSTRUCTURE | RFC822 | RFC822TEXT | RFC822SIZE)) != 0)
+ ? it.cur()
+ : ((spec & (ENVELOPE | INTERNALDATE | FIELDS | FIELDSNOT | RFC822SIZE | HEADERNOT | HEADER)) != 0)
+ ? Message.newMessage(Fountain.Util.concat(it.head(), Fountain.Util.create("\r\n\r\n")))
+ : null;
+ if (message != null) Log.warn("spec", spec);
long size = message == null ? 0 : message.getLength();
client.fetch(it.imapNumber(), it.getFlags(), (int)size, message, it.uid());
it.setFlags(it.getFlags() & ~Mailbox.Flag.RECENT);
public static class Listener implements Client {
String selectedName = null;
Mailbox inbox = null;
- MailboxTree root = null;
+ MailTree root = null;
Server api;
Parser parser = null;
Connection conn = null;
} else {
Account account = (Account)ret;
((MailboxWrapper)api).root = root = account.getMailbox(IMAP.class);
- MailboxTree ibt = root.slash("INBOX", false);
+ MailTree ibt = root.slash("inbox", false);
Mailbox ib = ibt==null ? null : ibt.getMailbox();
((MailboxWrapper)api).inbox = inbox = ib;
}
lastfetch = t;
int spec = 0; // spec; see constants for flags
+ int start = 0, len = 0;
String[] headers = null;
- int start = -1, end = -1;
StringBuffer r = new StringBuffer();
if (e) { r.append(num); r.append(" FETCH ("); }
int initlen = r.length();
else if (s.equals("HEADER.FIELDS.NOT")) { spec |= FIELDSNOT; payload=Fountain.Util.create(headers(r,t[i].l()[1].sl(),true,m,e)); }
else if (s.equals("MIME")) { throw new Server.Bad("MIME not supported"); }
else throw new Server.Bad("unknown section type " + s);
+
if (i<t.length - 1 && (t[i+1].s != null && t[i+1].s.startsWith("<"))) {
i++;
s = t[i].s.substring(1, t[i].s.indexOf('>'));
int dot = s.indexOf('.');
start = dot == -1 ? Integer.parseInt(s) : Integer.parseInt(s.substring(0, s.indexOf('.')));
- end = dot == -1 ? -1 : Integer.parseInt(s.substring(s.indexOf('.') + 1));
+ len = dot == -1 ? -1 : Integer.parseInt(s.substring(s.indexOf('.') + 1));
if (e) {
- //payload = payload.substring(start, Math.min(end+1,payload.getLength())); r.append("<"+start+">");
- // FIXME
- throw new RuntimeException("this had to be disabled");
+ if (start == 0 && len == -1) {
+ } else if (len == -1) {
+ payload = Fountain.Util.subFountain(payload, start);
+ } else {
+ len = (int)Math.min(len, payload.getLength()-start);
+ payload = Fountain.Util.subFountain(payload, start, len);
+ }
+ r.append("]");
+ r.append("<"+start+"> ");
}
+ } else {
+ if (e) r.append("] ");
}
- if (e) { r.append("] "); r.append(Printer.qq(payload.getStream())); }
+ if (e) r.append(Printer.qq(payload.getStream()));
}
}
if ((spec & PEEK) == 0 && looked_at_body && e)
r.append(")");
println("* " + r.toString());
} else {
- api.fetch(q, spec, headers, start, end, uid);
+ api.fetch(q, spec, headers, start, (len==-1?0:len), uid);
}
}