/**
*
*/
package fr.cedrik.email.pop3.commands;
import java.io.IOException;
import java.util.Iterator;
import org.springframework.mail.MailParseException;
import fr.cedrik.email.MessagesMetaData;
import fr.cedrik.email.pop3.Context;
import fr.cedrik.email.pop3.POP3Command;
import fr.cedrik.email.pop3.ResponseStatus;
import fr.cedrik.email.spi.Message;
import fr.cedrik.util.IteratorChain;
/**
* @author Cédrik LIME
*/
public class RETR extends BasePOP3Command implements POP3Command {
public RETR() {
}
@Override
public Iterator<String> call(Context context) throws IOException {
int requestedMessageNumber = -1;
try {
requestedMessageNumber = Integer.parseInt(context.inputArgs);
} catch (NumberFormatException noInput) {
return new IteratorChain<String>(ResponseStatus.NEGATIVE.toString("no such message"));
}
MessagesMetaData<? extends Message> messages = context.remoteSession.getMessagesMetaData();
if (requestedMessageNumber > messages.entries.size()) {
return new IteratorChain<String>(ResponseStatus.NEGATIVE.toString("no such message, only " + messages.entries.size() + " messages in maildrop"));
}
// TODO may NOT refer to a message marked as deleted
Message message = messages.entries.get(requestedMessageNumber-1);
Iterator<String> mimeMessage;
try {
mimeMessage = context.remoteSession.getMessageMIME(message);
} catch (MailParseException mpe) {
mimeMessage = null;
}
if (mimeMessage == null) {
return new IteratorChain<String>(ResponseStatus.NEGATIVE.toString("unknown error: can not retrieve message"));
} else {
return new IteratorChain<String>(
ResponseStatus.POSITIVE.toString("message " + requestedMessageNumber + " (" + message.getId() + ") follows (" + message.getSize() + " octets)"),
mimeMessage);
}
}
}