|  | 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;; |