Skip to content

Commit

Permalink
more extensible retrieval
Browse files Browse the repository at this point in the history
  • Loading branch information
azinman committed May 11, 2012
1 parent 68ba395 commit 0d80717
Show file tree
Hide file tree
Showing 2 changed files with 84 additions and 8 deletions.
Expand Up @@ -31,6 +31,8 @@ public interface MailClient {
*/
boolean connect(DisconnectListener listener);

void setDisconnectListener(DisconnectListener listener);

/**
* Logs out of the current IMAP session and releases all resources, including
* executor services.
Expand Down Expand Up @@ -185,8 +187,10 @@ ListenableFuture<Set<String>> addOrRemoveGmailLabels(Folder folder, int imapUid,
* <b>NOTE: you must call {@link #open(String)} first.</b>
*/
public ListenableFuture<List<Message>> fetch(Folder folder, int start, int end);
public ListenableFuture<List<Message>> fetch(Folder folder, List<Integer> seqs);
public ListenableFuture<List<Message>> fetchUids(Folder folder, List<Integer> uids);
public ListenableFuture<List<MessageStatus>> fetchUidsHeaders(Folder folder, List<Integer> uids);
public ListenableFuture<List<MessageStatus>> fetchUidsHeaders(Folder folder, Collection<Integer> uids);
public ListenableFuture<List<MessageStatus>> fetchHeaders(Folder folder, Collection<Integer> seqs);

/**
* Watches a folder for changes. This is an implementation of the IMAP IDLE command and
Expand Down
Expand Up @@ -151,6 +151,12 @@ public void operationComplete(ChannelFuture future) throws Exception {
return login();
}

@Override
public void setDisconnectListener(DisconnectListener listener) {
this.disconnectListener = listener;
}


private boolean login() {
try {
channel.write(". CAPABILITY\r\n");
Expand Down Expand Up @@ -619,6 +625,38 @@ public ListenableFuture<List<Message>> fetch(Folder folder, int start, int end)
return valueFuture;
}

@Override
public ListenableFuture<List<Message>> fetch(Folder folder, List<Integer> seqs) {
Preconditions.checkState(mailClientHandler.isLoggedIn(),
"Can't execute command because client is not logged in");
Preconditions.checkState(!mailClientHandler.idleRequested.get(),
"Can't execute command while idling (are you watching a folder?)");

checkCurrentFolder(folder);
SettableFuture<List<Message>> valueFuture = SettableFuture.create();

StringBuilder argsBuilder = new StringBuilder();
// Emit ranges.
boolean isFirst = true;
for (Integer seq : seqs) {
if (isFirst) {
isFirst = false;
} else {
argsBuilder.append(',');
}
argsBuilder.append(seq);
}
argsBuilder.append(" (FLAGS INTERNALDATE UID");
if (config.useGmailExtensions()) {
argsBuilder.append(" X-GM-MSGID X-GM-THRID X-GM-LABELS");
}
argsBuilder.append(" BODY.PEEK[])");
send(Command.FETCH_BODY, argsBuilder.toString(), valueFuture);

return valueFuture;
}


@Override
public ListenableFuture<Message> fetchUid(Folder folder, int uid) {
Preconditions.checkState(mailClientHandler.isLoggedIn(), "Can't execute command because client is not logged in");
Expand Down Expand Up @@ -647,14 +685,12 @@ public ListenableFuture<List<Message>> fetchUids(Folder folder, List<Integer> ui

StringBuilder argsBuilder = new StringBuilder();
// Emit ranges.
// argsBuilder.append('(');
for (int i = 0; i < uids.size(); i++) {
int uid = uids.get(i);
argsBuilder.append(uid);
if (i < uids.size() - 1)
argsBuilder.append(',');
}
// argsBuilder.append(')');
argsBuilder.append(" (FLAGS INTERNALDATE UID");
if (config.useGmailExtensions()) {
argsBuilder.append(" X-GM-MSGID X-GM-THRID X-GM-LABELS");
Expand All @@ -667,7 +703,40 @@ public ListenableFuture<List<Message>> fetchUids(Folder folder, List<Integer> ui


@Override
public ListenableFuture<List<MessageStatus>> fetchUidsHeaders(Folder folder, List<Integer> uids) {
public ListenableFuture<List<MessageStatus>> fetchHeaders(Folder folder, Collection<Integer> seqs) {
Preconditions.checkState(mailClientHandler.isLoggedIn(),
"Can't execute command because client is not logged in");
Preconditions.checkState(!mailClientHandler.idleRequested.get(),
"Can't execute command while idling (are you watching a folder?)");

checkCurrentFolder(folder);
SettableFuture<List<MessageStatus>> valueFuture = SettableFuture.create();

StringBuilder argsBuilder = new StringBuilder();
// Emit ranges.
boolean isFirst = true;
for (Integer seq : seqs) {
if (isFirst) {
isFirst = false;
} else {
argsBuilder.append(',');
}
argsBuilder.append(seq);
}
argsBuilder.append(" (RFC822.SIZE FLAGS INTERNALDATE ENVELOPE UID");
if (config.useGmailExtensions()) {
argsBuilder.append(" X-GM-MSGID X-GM-THRID X-GM-LABELS");
}
argsBuilder.append(")");

send(Command.FETCH_HEADERS, argsBuilder.toString(), valueFuture);

return valueFuture;
}


@Override
public ListenableFuture<List<MessageStatus>> fetchUidsHeaders(Folder folder, Collection<Integer> uids) {
Preconditions.checkState(mailClientHandler.isLoggedIn(),
"Can't execute command because client is not logged in");
Preconditions.checkState(!mailClientHandler.idleRequested.get(),
Expand All @@ -679,11 +748,14 @@ public ListenableFuture<List<MessageStatus>> fetchUidsHeaders(Folder folder, Lis
StringBuilder argsBuilder = new StringBuilder();
// Emit ranges.
// argsBuilder.append('(');
for (int i = 0; i < uids.size(); i++) {
int uid = uids.get(i);
argsBuilder.append(uid);
if (i < uids.size() - 1)
boolean isFirst = true;
for (Integer uid : uids) {
if (isFirst) {
isFirst = false;
} else {
argsBuilder.append(',');
}
argsBuilder.append(uid);
}
// argsBuilder.append(')');
argsBuilder.append(" (RFC822.SIZE FLAGS INTERNALDATE ENVELOPE UID");
Expand Down

0 comments on commit 0d80717

Please sign in to comment.