whohas
[hcoop/domtool2.git] / src / msg.sml
index 43b6386..faced87 100644 (file)
@@ -57,6 +57,27 @@ fun send (bio, m) =
       | MsgDoFiles => OpenSSL.writeInt (bio, 5)
       | MsgGrant acl => (OpenSSL.writeInt (bio, 6);
                         sendAcl (bio, acl))
+      | MsgRevoke acl => (OpenSSL.writeInt (bio, 7);
+                         sendAcl (bio, acl))
+      | 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))
+      | 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))
 
 fun checkIt v =
     case v of
@@ -85,6 +106,51 @@ fun recv bio =
                   | 6 => (case recvAcl bio of
                               SOME acl => SOME (MsgGrant acl)
                             | _ => NONE)
+                  | 7 => (case recvAcl bio of
+                              SOME acl => SOME (MsgRevoke acl)
+                            | _ => NONE)
+                  | 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
+                  | 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
                   | _ => NONE)
         
 end