(* HCoop Domtool (http://hcoop.sourceforge.net/) * Copyright (c) 2006, Adam Chlipala * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *) (* Network messages *) structure Msg :> MSG = struct open OpenSSL MsgTypes Slave val a2i = fn Add => 0 | Delete => 1 | Modify => 2 val i2a = fn 0 => Add | 1 => Delete | 2 => Modify | _ => raise OpenSSL.OpenSSL "Bad action number to deserialize" fun send (bio, m) = case m of MsgOk => OpenSSL.writeInt (bio, 1) | MsgError s => (OpenSSL.writeInt (bio, 2); OpenSSL.writeString (bio, s)) | MsgConfig s => (OpenSSL.writeInt (bio, 3); OpenSSL.writeString (bio, s)) | MsgFile {action, domain, dir, file} => (OpenSSL.writeInt (bio, 4); OpenSSL.writeInt (bio, a2i action); OpenSSL.writeString (bio, domain); OpenSSL.writeString (bio, dir); OpenSSL.writeString (bio, file)) | MsgDoFiles => OpenSSL.writeInt (bio, 5) fun checkIt v = case v of NONE => raise OpenSSL.OpenSSL "Bad Msg format" | _ => v fun recv bio = case OpenSSL.readInt bio of NONE => NONE | SOME n => checkIt (case n of 1 => SOME MsgOk | 2 => Option.map MsgError (OpenSSL.readString bio) | 3 => Option.map MsgConfig (OpenSSL.readString bio) | 4 => (case (OpenSSL.readInt bio, OpenSSL.readString bio, OpenSSL.readString bio, OpenSSL.readString bio) of (SOME action, SOME domain, SOME dir, SOME file) => SOME (MsgFile {action = i2a action, domain = domain, dir = dir, file = file}) | _ => NONE) | 5 => SOME MsgDoFiles | _ => NONE) end