package io.vertx.ext.mail.impl;
import io.vertx.core.AsyncResult;
import io.vertx.core.Future;
import io.vertx.core.Handler;
import io.vertx.core.impl.logging.Logger;
import io.vertx.core.impl.logging.LoggerFactory;
import io.vertx.ext.mail.MailConfig;
import io.vertx.ext.mail.impl.sasl.AuthOperationFactory;
class SMTPStarter {
private static final Logger log = LoggerFactory.getLogger(SMTPStarter.class);
private final SMTPConnection connection;
private final String hostname;
private final MailConfig config;
private final AuthOperationFactory authOperationFactory;
private final Handler<AsyncResult<Void>> handler;
SMTPStarter(SMTPConnection connection, MailConfig config, String hostname, AuthOperationFactory authOperationFactory, Handler<AsyncResult<Void>> handler) {
this.connection = connection;
this.hostname = hostname;
this.config = config;
this.authOperationFactory = authOperationFactory;
this.handler = handler;
}
void start() {
log.debug("connection.openConnection");
connection.openConnection(config, this::serverGreeting, this::handleError);
}
private void serverGreeting(String message) {
log.debug("SMTPInitialDialogue");
new SMTPInitialDialogue(connection, config, hostname, v -> doAuthentication(), this::handleError).start(message);
}
private void doAuthentication() {
log.debug("SMTPAuthentication");
new SMTPAuthentication(connection, config, this.authOperationFactory, v -> handler.handle(Future.succeededFuture(null)), this::handleError).start();
}
private void handleError(Throwable throwable) {
log.debug("handleError:" + throwable);
if (connection != null) {
connection.setBroken();
}
handler.handle(Future.failedFuture(throwable));
}
}