blob: 1a9130f345a8b2d088042c9f6984aa444cbfe0a2 [file] [log] [blame]
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;;