Package mireka.pop.command

Source Code of mireka.pop.command.RetrCommand

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();
        }
    }
}
TOP

Related Classes of mireka.pop.command.RetrCommand

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.