package mireka.pop.command;
import java.io.IOException;
import java.io.InputStream;
import mireka.pop.Command;
import mireka.pop.CommandParser;
import mireka.pop.IllegalSessionStateException;
import mireka.pop.Pop3Exception;
import mireka.pop.Session;
import mireka.pop.SessionState;
import mireka.pop.store.ScanListing;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.subethamail.smtp.io.DotTerminatedOutputStream;
import org.subethamail.smtp.io.ExtraDotOutputStream;
public class RetrCommand implements Command {
private final Logger logger = LoggerFactory.getLogger(RetrCommand.class);
private final Session session;
public RetrCommand(Session session) {
this.session = session;
}
@Override
public void execute(CommandParser commandParser) throws IOException,
Pop3Exception {
if (session.getSessionState() != SessionState.TRANSACTION)
throw new IllegalSessionStateException();
int messageNumber = commandParser.parseSingleNumericArgument();
ScanListing scanListing =
session.getMaildrop().getScanListing(messageNumber);
InputStream mailAsStream =
session.getMaildrop().getMailAsStream(messageNumber);
try {
session.getThread().sendResponse(
"+OK " + scanListing.length + " octets");
DotTerminatedOutputStream dotTerminatedOutputStream =
new DotTerminatedOutputStream(session.getThread()
.getOutputStream());
ExtraDotOutputStream dotOutputStream =
new ExtraDotOutputStream(dotTerminatedOutputStream);
byte[] buffer = new byte[4096];
int cRead;
while (-1 != (cRead = mailAsStream.read(buffer))) {
dotOutputStream.write(buffer, 0, cRead);
}
dotOutputStream.flush();
dotTerminatedOutputStream.writeTerminatingSequence();
dotTerminatedOutputStream.flush();
logger.debug("Message sent");
} finally {
mailAsStream.close();
}
}
}