package betty16.lec2.smtp;
import static betty16.lec2.smtp.Smtp.Smtp.Smtp.C;
import static betty16.lec2.smtp.Smtp.Smtp.Smtp.S;
import static betty16.lec2.smtp.Smtp.Smtp.Smtp._220;
import static betty16.lec2.smtp.Smtp.Smtp.Smtp._250;
import static betty16.lec2.smtp.Smtp.Smtp.Smtp._250d;
import org.scribble.net.Buf;
import org.scribble.net.scribsock.LinearSocket;
import org.scribble.net.session.SSLSocketChannelWrapper;
import org.scribble.net.session.MPSTEndpoint;
import org.scribble.net.session.SocketChannelEndpoint;
import betty16.lec2.smtp.Smtp.Smtp.Smtp;
import betty16.lec2.smtp.Smtp.Smtp.channels.C.EndSocket;
import betty16.lec2.smtp.Smtp.Smtp.channels.C.Smtp_C_1;
import betty16.lec2.smtp.Smtp.Smtp.channels.C.Smtp_C_2;
import betty16.lec2.smtp.Smtp.Smtp.channels.C.Smtp_C_3;
import betty16.lec2.smtp.Smtp.Smtp.channels.C.Smtp_C_3_Cases;
import betty16.lec2.smtp.Smtp.Smtp.channels.C.Smtp_C_4;
import betty16.lec2.smtp.Smtp.Smtp.channels.C.Smtp_C_6;
import betty16.lec2.smtp.Smtp.Smtp.channels.C.Smtp_C_7;
import betty16.lec2.smtp.Smtp.Smtp.channels.C.Smtp_C_7_Cases;
import betty16.lec2.smtp.Smtp.Smtp.channels.C.Smtp_C_8;
import betty16.lec2.smtp.Smtp.Smtp.roles.C;
import betty16.lec2.smtp.message.SmtpMessageFormatter;
import betty16.lec2.smtp.message.client.Ehlo;
import betty16.lec2.smtp.message.client.Quit;
import betty16.lec2.smtp.message.client.StartTls;
public class SmtpC1
{
public static void main(String[] args) throws Exception {
String host = "smtp.cc.ic.ac.uk";
int port = 25;
Smtp smtp = new Smtp();
try (MPSTEndpoint<Smtp, C> client = new MPSTEndpoint<>(smtp, C, new SmtpMessageFormatter())) {
client.connect(S, SocketChannelEndpoint::new, host, port);
new SmtpC1().run(new Smtp_C_1(client));
}
}
private EndSocket run(Smtp_C_1 c1) throws Exception {
return
doInit(
doStartTls(
doInit(c1.async(S, _220)))
)
.send(S, new Quit());
}
private Smtp_C_4 doInit(Smtp_C_2 c2) throws Exception {
Smtp_C_3 c3 = c2.send(S, new Ehlo("test"));
Buf<Object> buf = new Buf<>();
while (true) {
Smtp_C_3_Cases cases = c3.branch(S);
switch (cases.getOp()) {
case _250d: c3 = cases.receive(S, _250d, buf); System.out.print(buf.val); break;
case _250: return printlnBuf(cases.receive(S, _250, buf), buf);
}
}
}
private Smtp_C_6 doStartTls(Smtp_C_4 c4) throws Exception {
return
LinearSocket.wrapClient(
c4.send(S, new StartTls())
.async(S, _220)
, S, SSLSocketChannelWrapper::new);
}
private Smtp_C_8 doInit(Smtp_C_6 c6) throws Exception {
Smtp_C_7 c7 = c6.send(S, new Ehlo("test"));
Buf<Object> buf = new Buf<>();
while (true) {
Smtp_C_7_Cases cases = c7.branch(S);
switch (cases.getOp()) {
case _250d: c7 = cases.receive(S, _250d, buf); System.out.print(buf.val); break;
case _250: return printlnBuf(cases.receive(S, _250, buf), buf);
}
}
}
private static <S, B extends Buf<?>> S printlnBuf(S s, B b) {
System.out.println(b.val);
return s;
}
}