First vmail support
[hcoop/domtool2.git] / src / msg.sml
index faced87..d0d917c 100644 (file)
@@ -41,6 +41,41 @@ fun recvAcl bio =
        (SOME user, SOME class, SOME value) => SOME {user = user, class = class, value = value}
       | _ => NONE
 
+fun sendList f (bio, ls) =
+    (app (fn x =>
+            (OpenSSL.writeInt (bio, 1);
+             f (bio, x))) ls;
+     OpenSSL.writeInt (bio, 0))
+
+fun recvList f bio =
+    let
+       fun loop ls =
+           case OpenSSL.readInt bio of
+               SOME 0 => SOME (rev ls)
+             | SOME 1 =>
+               (case f bio of
+                    SOME x => loop (x :: ls)
+                  | NONE => NONE)
+             | _ => NONE
+    in
+       loop []
+    end
+
+fun sendOption f (bio, opt) =
+    case opt of
+       NONE => OpenSSL.writeInt (bio, 0)
+      | SOME x => (OpenSSL.writeInt (bio, 1);
+                  f (bio, x))
+
+fun recvOption f bio =
+    case OpenSSL.readInt bio of
+       SOME 0 => SOME NONE
+      | SOME 1 =>
+       (case f bio of
+            SOME x => SOME (SOME x)
+          | NONE => NONE)
+      | _ => NONE
+
 fun send (bio, m) =
     case m of
        MsgOk => OpenSSL.writeInt (bio, 1)
@@ -62,22 +97,43 @@ fun send (bio, m) =
       | MsgListPerms user => (OpenSSL.writeInt (bio, 8);
                              OpenSSL.writeString (bio, user))
       | MsgPerms classes => (OpenSSL.writeInt (bio, 9);
-                            app (fn (class, values) =>
-                                    (OpenSSL.writeInt (bio, 1);
-                                     OpenSSL.writeString (bio, class);
-                                     app (fn value =>
-                                             (OpenSSL.writeInt (bio, 1);
-                                              OpenSSL.writeString (bio, value))) values;
-                                     OpenSSL.writeInt (bio, 0))) classes;
-                            OpenSSL.writeInt (bio, 0))
+                            sendList (fn (bio, (class, values)) =>
+                                         (OpenSSL.writeString (bio, class);
+                                          sendList OpenSSL.writeString (bio, values)))
+                                     (bio, classes))
       | MsgWhoHas {class, value} => (OpenSSL.writeInt (bio, 10);
                                     OpenSSL.writeString (bio, class);
                                     OpenSSL.writeString (bio, value))
       | MsgWhoHasResponse users => (OpenSSL.writeInt (bio, 11);
-                                   app (fn user =>
-                                           (OpenSSL.writeInt (bio, 1);
-                                            OpenSSL.writeString (bio, user))) users;
-                                   OpenSSL.writeInt (bio, 0))
+                                   sendList OpenSSL.writeString (bio, users))
+      | MsgMultiConfig codes => (OpenSSL.writeInt (bio, 12);
+                                sendList OpenSSL.writeString (bio, codes))
+      | MsgRmdom doms => (OpenSSL.writeInt (bio, 13);
+                         sendList OpenSSL.writeString (bio, doms))
+      | MsgRegenerate => OpenSSL.writeInt (bio, 14)
+      | MsgRmuser dom => (OpenSSL.writeInt (bio, 15);
+                         OpenSSL.writeString (bio, dom))
+      | MsgCreateDbUser {dbtype, passwd} => (OpenSSL.writeInt (bio, 16);
+                                            OpenSSL.writeString (bio, dbtype);
+                                            sendOption OpenSSL.writeString (bio, passwd))
+      | MsgCreateDbTable {dbtype, dbname} => (OpenSSL.writeInt (bio, 17);
+                                             OpenSSL.writeString (bio, dbtype);
+                                             OpenSSL.writeString (bio, dbname))
+      | MsgNewMailbox {domain, user, passwd, mailbox} =>
+       (OpenSSL.writeInt (bio, 18);
+        OpenSSL.writeString (bio, domain);
+        OpenSSL.writeString (bio, user);
+        OpenSSL.writeString (bio, passwd);
+        OpenSSL.writeString (bio, mailbox))
+      | MsgPasswdMailbox {domain, user, passwd} =>
+       (OpenSSL.writeInt (bio, 19);
+        OpenSSL.writeString (bio, domain);
+        OpenSSL.writeString (bio, user);
+        OpenSSL.writeString (bio, passwd))
+      | MsgRmMailbox {domain, user} =>
+       (OpenSSL.writeInt (bio, 20);
+        OpenSSL.writeString (bio, domain);
+        OpenSSL.writeString (bio, user))
 
 fun checkIt v =
     case v of
@@ -112,45 +168,46 @@ fun recv bio =
                   | 8 => (case OpenSSL.readString bio of
                               SOME user => SOME (MsgListPerms user)
                             | _ => NONE)
-                  | 9 => let
-                        fun loop classes =
-                            case OpenSSL.readInt bio of
-                                SOME 0 => SOME (MsgPerms (rev classes))
-                              | SOME 1 =>
-                                (case OpenSSL.readString bio of
-                                     SOME class =>
-                                     let
-                                         fun loop' values =
-                                             case OpenSSL.readInt bio of
-                                                 SOME 0 => loop ((class, rev values) :: classes)
-                                               | SOME 1 =>
-                                                 (case OpenSSL.readString bio of
-                                                      SOME value => loop' (value :: values)
-                                                    | NONE => NONE)
-                                               | _ => NONE
-                                     in
-                                         loop' []
-                                     end
-                                   | NONE => NONE)
-                              | _ => NONE
-                    in
-                        loop []
-                    end
+                  | 9 => Option.map MsgPerms
+                                    (recvList (fn bio =>
+                                                  case (OpenSSL.readString bio,
+                                                        recvList OpenSSL.readString bio) of
+                                                      (SOME class, SOME values) => SOME (class, values)
+                                                    | _ => NONE) bio)
                   | 10 => (case (OpenSSL.readString bio, OpenSSL.readString bio) of
                                (SOME class, SOME value) => SOME (MsgWhoHas {class = class, value = value})
                              | _ => NONE)
-                  | 11 => let
-                        fun loop users =
-                            case OpenSSL.readInt bio of
-                                SOME 0 => SOME (MsgWhoHasResponse (rev users))
-                              | SOME 1 =>
-                                (case OpenSSL.readString bio of
-                                     SOME user => loop (user :: users)
-                                   | NONE => NONE)
-                              | _ => NONE
-                    in
-                        loop []
-                    end
+                  | 11 => Option.map MsgWhoHasResponse
+                          (recvList OpenSSL.readString bio)
+                  | 12 => Option.map MsgMultiConfig
+                          (recvList OpenSSL.readString bio)
+                  | 13 => Option.map MsgRmdom (recvList OpenSSL.readString bio)
+                  | 14 => SOME MsgRegenerate
+                  | 15 => Option.map MsgRmuser (OpenSSL.readString bio)
+                  | 16 => (case (OpenSSL.readString bio, recvOption OpenSSL.readString bio) of
+                               (SOME dbtype, SOME passwd) =>
+                               SOME (MsgCreateDbUser {dbtype = dbtype, passwd = passwd})
+                             | _ => NONE)
+                  | 17 => (case (OpenSSL.readString bio, OpenSSL.readString bio) of
+                               (SOME dbtype, SOME dbname) =>
+                               SOME (MsgCreateDbTable {dbtype = dbtype, dbname = dbname})
+                             | _ => NONE)
+                  | 18 => (case (OpenSSL.readString bio, OpenSSL.readString bio,
+                                 OpenSSL.readString bio, OpenSSL.readString bio) of
+                               (SOME domain, SOME user, SOME passwd, SOME mailbox) =>
+                               SOME (MsgNewMailbox {domain = domain, user = user,
+                                                    passwd = passwd, mailbox = mailbox})
+                             | _ => NONE)
+                  | 19 => (case (OpenSSL.readString bio, OpenSSL.readString bio,
+                                 OpenSSL.readString bio) of
+                               (SOME domain, SOME user, SOME passwd) =>
+                               SOME (MsgPasswdMailbox {domain = domain, user = user,
+                                                       passwd = passwd})
+                             | _ => NONE)
+                  | 20 => (case (OpenSSL.readString bio, OpenSSL.readString bio) of
+                               (SOME domain, SOME user) =>
+                               SOME (MsgRmMailbox {domain = domain, user = user})
+                             | _ => NONE)
                   | _ => NONE)
         
 end