| SOME 1 => SOME true
| _ => NONE
+fun sendQuery (bio, q) =
+ case q of
+ QApt s => (OpenSSL.writeInt (bio, 0);
+ OpenSSL.writeString (bio, s))
+ | QCron s => (OpenSSL.writeInt (bio, 1);
+ OpenSSL.writeString (bio, s))
+ | QFtp s => (OpenSSL.writeInt (bio, 2);
+ OpenSSL.writeString (bio, s))
+ | QTrustedPath s => (OpenSSL.writeInt (bio, 3);
+ OpenSSL.writeString (bio, s))
+
+fun recvQuery bio =
+ case OpenSSL.readInt bio of
+ SOME n =>
+ (case n of
+ 0 => Option.map QApt (OpenSSL.readString bio)
+ | 1 => Option.map QCron (OpenSSL.readString bio)
+ | 2 => Option.map QFtp (OpenSSL.readString bio)
+ | 3 => Option.map QTrustedPath (OpenSSL.readString bio)
+ | _ => NONE)
+ | NONE => NONE
+
fun send (bio, m) =
case m of
MsgOk => OpenSSL.writeInt (bio, 1)
| MsgSaSet (addr, b) => (OpenSSL.writeInt (bio, 25);
OpenSSL.writeString (bio, addr);
sendBool (bio, b))
+ | MsgSmtpLogReq domain => (OpenSSL.writeInt (bio, 26);
+ OpenSSL.writeString (bio, domain))
+ | MsgSmtpLogRes domain => (OpenSSL.writeInt (bio, 27);
+ OpenSSL.writeString (bio, domain))
+ | MsgDbPasswd {dbtype, passwd} => (OpenSSL.writeInt (bio, 28);
+ OpenSSL.writeString (bio, dbtype);
+ OpenSSL.writeString (bio, passwd))
+ | MsgShutdown => OpenSSL.writeInt (bio, 29)
+ | MsgYes => OpenSSL.writeInt (bio, 30)
+ | MsgNo => OpenSSL.writeInt (bio, 31)
+ | MsgQuery q => (OpenSSL.writeInt (bio, 32);
+ sendQuery (bio, q))
fun checkIt v =
case v of
| 25 => (case (OpenSSL.readString bio, recvBool bio) of
(SOME user, SOME b) => SOME (MsgSaSet (user, b))
| _ => NONE)
+ | 26 => Option.map MsgSmtpLogReq (OpenSSL.readString bio)
+ | 27 => Option.map MsgSmtpLogRes (OpenSSL.readString bio)
+ | 28 => (case (OpenSSL.readString bio, OpenSSL.readString bio) of
+ (SOME dbtype, SOME passwd) =>
+ SOME (MsgDbPasswd {dbtype = dbtype, passwd = passwd})
+ | _ => NONE)
+ | 29 => SOME MsgShutdown
+ | 30 => SOME MsgYes
+ | 31 => SOME MsgNo
+ | 32 => Option.map MsgQuery (recvQuery bio)
| _ => NONE)
end