| exception Break;; | 
 | exception Thrift_error;; | 
 | exception Field_empty of string;; | 
 |  | 
 | class t_exn = | 
 | object | 
 |   val mutable message = "" | 
 |   method get_message = message | 
 |   method set_message s = message <- s | 
 | end;; | 
 |  | 
 | module Transport = | 
 | struct | 
 |   type exn_type = | 
 |       | UNKNOWN | 
 |       | NOT_OPEN | 
 |       | ALREADY_OPEN | 
 |       | TIMED_OUT | 
 |       | END_OF_FILE;; | 
 |  | 
 |   exception E of exn_type * string | 
 |  | 
 |   class virtual t = | 
 |   object (self) | 
 |     method virtual isOpen : bool | 
 |     method virtual opn : unit | 
 |     method virtual close : unit | 
 |     method virtual read : string -> int -> int -> int | 
 |     method readAll buf off len = | 
 |       let got = ref 0 in | 
 |       let ret = ref 0 in | 
 |         while !got < len do | 
 |           ret := self#read buf (off+(!got)) (len - (!got)); | 
 |           if !ret <= 0 then | 
 |             raise (E (UNKNOWN, "Cannot read. Remote side has closed.")); | 
 |           got := !got + !ret | 
 |         done; | 
 |         !got | 
 |     method virtual write : string -> int -> int -> unit | 
 |     method virtual flush : unit | 
 |   end | 
 |  | 
 |   class factory = | 
 |   object | 
 |     method getTransport (t : t) = t | 
 |   end | 
 |  | 
 |   class virtual server_t = | 
 |   object (self) | 
 |     method virtual listen : unit | 
 |     method accept = self#acceptImpl | 
 |     method virtual close : unit | 
 |     method virtual acceptImpl : t | 
 |   end | 
 |  | 
 | end;; | 
 |  | 
 |  | 
 |  | 
 | module Protocol = | 
 | struct | 
 |   type t_type = | 
 |       | T_STOP | 
 |       | T_VOID | 
 |       | T_BOOL | 
 |       | T_BYTE | 
 |       | T_I08 | 
 |       | T_I16 | 
 |       | T_I32 | 
 |       | T_U64 | 
 |       | T_I64 | 
 |       | T_DOUBLE | 
 |       | T_STRING | 
 |       | T_UTF7 | 
 |       | T_STRUCT | 
 |       | T_MAP | 
 |       | T_SET | 
 |       | T_LIST | 
 |       | T_UTF8 | 
 |       | T_UTF16 | 
 |  | 
 |   let t_type_to_i = function | 
 |       T_STOP       -> 0 | 
 |     | T_VOID       -> 1 | 
 |     | T_BOOL       -> 2 | 
 |     | T_BYTE       -> 3 | 
 |     | T_I08        -> 3 | 
 |     | T_I16        -> 6 | 
 |     | T_I32        -> 8 | 
 |     | T_U64        -> 9 | 
 |     | T_I64        -> 10 | 
 |     | T_DOUBLE     -> 4 | 
 |     | T_STRING     -> 11 | 
 |     | T_UTF7       -> 11 | 
 |     | T_STRUCT     -> 12 | 
 |     | T_MAP        -> 13 | 
 |     | T_SET        -> 14 | 
 |     | T_LIST       -> 15 | 
 |     | T_UTF8       -> 16 | 
 |     | T_UTF16      -> 17 | 
 |  | 
 |   let t_type_of_i = function | 
 |       0 -> T_STOP | 
 |     | 1 -> T_VOID | 
 |     | 2 -> T_BOOL | 
 |     | 3 ->  T_BYTE | 
 |     | 6-> T_I16 | 
 |     | 8 -> T_I32 | 
 |     | 9 -> T_U64 | 
 |     | 10 -> T_I64 | 
 |     | 4 -> T_DOUBLE | 
 |     | 11 -> T_STRING | 
 |     | 12 -> T_STRUCT | 
 |     | 13 -> T_MAP | 
 |     | 14 -> T_SET | 
 |     | 15 -> T_LIST | 
 |     | 16 -> T_UTF8 | 
 |     | 17 -> T_UTF16 | 
 |     | _ -> raise Thrift_error | 
 |  | 
 |   type message_type = | 
 |     | CALL | 
 |     | REPLY | 
 |     | EXCEPTION | 
 |  | 
 |   let message_type_to_i = function | 
 |     | CALL -> 1 | 
 |     | REPLY -> 2 | 
 |     | EXCEPTION -> 3 | 
 |  | 
 |   let message_type_of_i = function | 
 |     | 1 -> CALL | 
 |     | 2 -> REPLY | 
 |     | 3 -> EXCEPTION | 
 |     | _ -> raise Thrift_error | 
 |  | 
 |   class virtual t (trans: Transport.t) = | 
 |   object (self) | 
 |     val mutable trans_ = trans | 
 |     method getTransport = trans_ | 
 |       (* writing methods *) | 
 |     method virtual writeMessageBegin : string * message_type * int -> unit | 
 |     method virtual writeMessageEnd : unit | 
 |     method virtual writeStructBegin : string -> unit | 
 |     method virtual writeStructEnd : unit | 
 |     method virtual writeFieldBegin : string * t_type * int -> unit | 
 |     method virtual writeFieldEnd : unit | 
 |     method virtual writeFieldStop : unit | 
 |     method virtual writeMapBegin : t_type * t_type * int -> unit | 
 |     method virtual writeMapEnd : unit | 
 |     method virtual writeListBegin : t_type * int -> unit | 
 |     method virtual writeListEnd : unit | 
 |     method virtual writeSetBegin : t_type * int -> unit | 
 |     method virtual writeSetEnd : unit | 
 |     method virtual writeBool : bool -> unit | 
 |     method virtual writeByte : int -> unit | 
 |     method virtual writeI16 : int -> unit | 
 |     method virtual writeI32 : int -> unit | 
 |     method virtual writeI64 : Int64.t -> unit | 
 |     method virtual writeDouble : float -> unit | 
 |     method virtual writeString : string -> unit | 
 |     method virtual writeBinary : string -> unit | 
 |       (* reading methods *) | 
 |     method virtual readMessageBegin : string * message_type * int | 
 |     method virtual readMessageEnd : unit | 
 |     method virtual readStructBegin : string | 
 |     method virtual readStructEnd : unit | 
 |     method virtual readFieldBegin : string * t_type * int | 
 |     method virtual readFieldEnd : unit | 
 |     method virtual readMapBegin : t_type * t_type * int | 
 |     method virtual readMapEnd : unit | 
 |     method virtual readListBegin : t_type * int | 
 |     method virtual readListEnd : unit | 
 |     method virtual readSetBegin : t_type * int | 
 |     method virtual readSetEnd : unit | 
 |     method virtual readBool : bool | 
 |     method virtual readByte : int | 
 |     method virtual readI16 : int | 
 |     method virtual readI32: int | 
 |     method virtual readI64 : Int64.t | 
 |     method virtual readDouble : float | 
 |     method virtual readString : string | 
 |     method virtual readBinary : string | 
 |         (* skippage *) | 
 |     method skip typ = | 
 |       match typ with | 
 |         | T_STOP -> () | 
 |         | T_VOID -> () | 
 |         | T_BOOL -> ignore self#readBool | 
 |         | T_BYTE | 
 |         | T_I08 -> ignore self#readByte | 
 |         | T_I16 -> ignore self#readI16 | 
 |         | T_I32 -> ignore self#readI32 | 
 |         | T_U64 | 
 |         | T_I64 -> ignore self#readI64 | 
 |         | T_DOUBLE -> ignore self#readDouble | 
 |         | T_STRING -> ignore self#readString | 
 |         | T_UTF7 -> () | 
 |         | T_STRUCT -> ignore ((ignore self#readStructBegin); | 
 |                               (try | 
 |                                    while true do | 
 |                                      let (_,t,_) = self#readFieldBegin in | 
 |                                        if t = T_STOP then | 
 |                                          raise Break | 
 |                                        else | 
 |                                          (self#skip t; | 
 |                                           self#readFieldEnd) | 
 |                                    done | 
 |                                with Break -> ()); | 
 |                               self#readStructEnd) | 
 |         | T_MAP -> ignore (let (k,v,s) = self#readMapBegin in | 
 |                              for i=0 to s do | 
 |                                self#skip k; | 
 |                                self#skip v; | 
 |                              done; | 
 |                              self#readMapEnd) | 
 |         | T_SET -> ignore (let (t,s) = self#readSetBegin in | 
 |                              for i=0 to s do | 
 |                                self#skip t | 
 |                              done; | 
 |                              self#readSetEnd) | 
 |         | T_LIST -> ignore (let (t,s) = self#readListBegin in | 
 |                               for i=0 to s do | 
 |                                 self#skip t | 
 |                               done; | 
 |                               self#readListEnd) | 
 |         | T_UTF8 -> () | 
 |         | T_UTF16 -> () | 
 |   end | 
 |  | 
 |   class virtual factory = | 
 |   object | 
 |     method virtual getProtocol : Transport.t -> t | 
 |   end | 
 |  | 
 |   type exn_type = | 
 |       | UNKNOWN | 
 |       | INVALID_DATA | 
 |       | NEGATIVE_SIZE | 
 |       | SIZE_LIMIT | 
 |       | BAD_VERSION | 
 |  | 
 |   exception E of exn_type * string;; | 
 |  | 
 | end;; | 
 |  | 
 |  | 
 | module Processor = | 
 | struct | 
 |   class virtual t = | 
 |   object | 
 |     method virtual process : Protocol.t -> Protocol.t -> bool | 
 |   end;; | 
 |  | 
 |   class factory (processor : t) = | 
 |   object | 
 |     val processor_ = processor | 
 |     method getProcessor (trans : Transport.t) = processor_ | 
 |   end;; | 
 | end | 
 |  | 
 |  | 
 | (* Ugly *) | 
 | module Application_Exn = | 
 | struct | 
 |   type typ= | 
 |       | UNKNOWN | 
 |       | UNKNOWN_METHOD | 
 |       | INVALID_MESSAGE_TYPE | 
 |       | WRONG_METHOD_NAME | 
 |       | BAD_SEQUENCE_ID | 
 |       | MISSING_RESULT | 
 |  | 
 |   let typ_of_i = function | 
 |       0 -> UNKNOWN | 
 |     | 1 -> UNKNOWN_METHOD | 
 |     | 2 -> INVALID_MESSAGE_TYPE | 
 |     | 3 -> WRONG_METHOD_NAME | 
 |     | 4 -> BAD_SEQUENCE_ID | 
 |     | 5 -> MISSING_RESULT | 
 |     | _ -> raise Thrift_error;; | 
 |   let typ_to_i = function | 
 |     | UNKNOWN -> 0 | 
 |     | UNKNOWN_METHOD -> 1 | 
 |     | INVALID_MESSAGE_TYPE -> 2 | 
 |     | WRONG_METHOD_NAME -> 3 | 
 |     | BAD_SEQUENCE_ID -> 4 | 
 |     | MISSING_RESULT -> 5 | 
 |  | 
 |   class t = | 
 |   object (self) | 
 |     inherit t_exn | 
 |     val mutable typ = UNKNOWN | 
 |     method get_type = typ | 
 |     method set_type t = typ <- t | 
 |     method write (oprot : Protocol.t) = | 
 |       oprot#writeStructBegin "TApplicationExeception"; | 
 |       if self#get_message != "" then | 
 |         (oprot#writeFieldBegin ("message",Protocol.T_STRING, 1); | 
 |          oprot#writeString self#get_message; | 
 |          oprot#writeFieldEnd) | 
 |       else (); | 
 |       oprot#writeFieldBegin ("type",Protocol.T_I32,2); | 
 |       oprot#writeI32 (typ_to_i typ); | 
 |       oprot#writeFieldEnd; | 
 |       oprot#writeFieldStop; | 
 |       oprot#writeStructEnd | 
 |   end;; | 
 |  | 
 |   let create typ msg = | 
 |     let e = new t in | 
 |       e#set_type typ; | 
 |     e#set_message msg; | 
 |     e | 
 |  | 
 |   let read (iprot : Protocol.t) = | 
 |     let msg = ref "" in | 
 |     let typ = ref 0 in | 
 |       ignore iprot#readStructBegin; | 
 |       (try | 
 |            while true do | 
 |              let (name,ft,id) =iprot#readFieldBegin in | 
 |                if ft = Protocol.T_STOP then | 
 |                  raise Break | 
 |                else (); | 
 |                (match id with | 
 |              | 1 -> (if ft = Protocol.T_STRING then | 
 |                          msg := (iprot#readString) | 
 |                      else | 
 |                          iprot#skip ft) | 
 |              | 2 -> (if ft = Protocol.T_I32 then | 
 |                          typ := iprot#readI32 | 
 |                      else | 
 |                          iprot#skip ft) | 
 |              | _ -> iprot#skip ft); | 
 |                iprot#readFieldEnd | 
 |       done | 
 |        with Break -> ()); | 
 |       iprot#readStructEnd; | 
 |       let e = new t in | 
 |         e#set_type (typ_of_i !typ); | 
 |         e#set_message !msg; | 
 |         e;; | 
 |  | 
 |   exception E of t | 
 | end;; |