| NONE => NONE)
| _ => NONE
+fun sendBool (bio, b) =
+ if b then
+ OpenSSL.writeInt (bio, 1)
+ else
+ OpenSSL.writeInt (bio, 0)
+
+fun recvBool bio =
+ case OpenSSL.readInt bio of
+ SOME 0 => SOME false
+ | SOME 1 => SOME true
+ | _ => NONE
+
fun send (bio, m) =
case m of
MsgOk => OpenSSL.writeInt (bio, 1)
OpenSSL.writeString (bio, domain))
| MsgMailboxes users =>
(OpenSSL.writeInt (bio, 22);
- sendList OpenSSL.writeString (bio, users))
+ sendList (fn (bio, {user, mailbox}) =>
+ (OpenSSL.writeString (bio, user);
+ OpenSSL.writeString (bio, mailbox)))
+ (bio, users))
+ | MsgSaQuery addr => (OpenSSL.writeInt (bio, 23);
+ OpenSSL.writeString (bio, addr))
+ | MsgSaStatus b => (OpenSSL.writeInt (bio, 24);
+ sendBool (bio, b))
+ | 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))
fun checkIt v =
case v of
SOME (MsgRmMailbox {domain = domain, user = user})
| _ => NONE)
| 21 => Option.map MsgListMailboxes (OpenSSL.readString bio)
- | 22 => Option.map MsgMailboxes (recvList OpenSSL.readString bio)
+ | 22 => Option.map MsgMailboxes (recvList
+ (fn bio =>
+ case (OpenSSL.readString bio,
+ OpenSSL.readString bio) of
+ (SOME user, SOME mailbox) =>
+ SOME {user = user, mailbox = mailbox}
+ | _ => NONE)
+ bio)
+ | 23 => Option.map MsgSaQuery (OpenSSL.readString bio)
+ | 24 => Option.map MsgSaStatus (recvBool bio)
+ | 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)
| _ => NONE)
end