blob: fa84e7125aa6e6258fecbdb6e15032ed075eb53c [file] [log] [blame]
open Thrift
module P = Protocol
let get_byte i b = 255 land (i lsr (8*b))
let get_byte64 i b = 255 land (Int64.to_int (Int64.shift_right i (8*b)))
let tv = P.t_type_to_i
let vt = P.t_type_of_i
let comp_int b n =
let s = ref 0l in
let sb = 32 - 8*n in
for i=0 to (n-1) do
s:= Int32.logor !s (Int32.shift_left (Int32.of_int (int_of_char b.[i])) (8*(n-1-i)))
done;
Int32.to_int (Int32.shift_right (Int32.shift_left !s sb) sb)
let comp_int64 b n =
let s = ref 0L in
for i=0 to (n-1) do
s:=Int64.logor !s (Int64.shift_left (Int64.of_int (int_of_char b.[i])) (8*(n-1-i)))
done;
!s
let version_mask = 0xffff0000
let version_1 = 0x80010000
class t trans =
object (self)
inherit P.t trans
val ibyte = String.create 8
method writeBool b =
ibyte.[0] <- char_of_int (if b then 1 else 0);
trans#write ibyte 0 1
method writeByte i =
ibyte.[0] <- char_of_int (get_byte i 0);
trans#write ibyte 0 1
method writeI16 i =
let gb = get_byte i in
ibyte.[1] <- char_of_int (gb 0);
ibyte.[0] <- char_of_int (gb 1);
trans#write ibyte 0 2
method writeI32 i =
let gb = get_byte i in
for i=0 to 3 do
ibyte.[3-i] <- char_of_int (gb i)
done;
trans#write ibyte 0 4
method writeI64 i=
let gb = get_byte64 i in
for i=0 to 7 do
ibyte.[7-i] <- char_of_int (gb i)
done;
trans#write ibyte 0 8
method writeDouble d =
self#writeI64 (Int64.bits_of_float d)
method writeString s=
let n = String.length s in
self#writeI32(n);
trans#write s 0 n
method writeBinary a = self#writeString a
method writeMessageBegin (n,t,s) =
self#writeI32 (version_1 lor (P.message_type_to_i t));
self#writeString n;
self#writeI32 s
method writeMessageEnd = ()
method writeStructBegin s = ()
method writeStructEnd = ()
method writeFieldBegin (n,t,i) =
self#writeByte (tv t);
self#writeI16 i
method writeFieldEnd = ()
method writeFieldStop =
self#writeByte (tv (Protocol.T_STOP))
method writeMapBegin (k,v,s) =
self#writeByte (tv k);
self#writeByte (tv v);
self#writeI32 s
method writeMapEnd = ()
method writeListBegin (t,s) =
self#writeByte (tv t);
self#writeI32 s
method writeListEnd = ()
method writeSetBegin (t,s) =
self#writeByte (tv t);
self#writeI32 s
method writeSetEnd = ()
method readByte =
ignore (trans#readAll ibyte 0 1);
(comp_int ibyte 1)
method readI16 =
ignore (trans#readAll ibyte 0 2);
comp_int ibyte 2
method readI32 =
ignore (trans#readAll ibyte 0 4);
comp_int ibyte 4
method readI64 =
ignore (trans#readAll ibyte 0 8);
comp_int64 ibyte 8
method readDouble =
Int64.float_of_bits (self#readI64)
method readBool =
self#readByte = 1
method readString =
let sz = self#readI32 in
let buf = String.create sz in
ignore (trans#readAll buf 0 sz);
buf
method readBinary = self#readString
method readMessageBegin =
let ver = self#readI32 in
if (ver land version_mask != version_1) then
(print_int ver;
raise (P.E (P.BAD_VERSION, "Missing version identifier")))
else
let s = self#readString in
let mt = P.message_type_of_i (ver land 0xFF) in
(s,mt, self#readI32)
method readMessageEnd = ()
method readStructBegin =
""
method readStructEnd = ()
method readFieldBegin =
let t = (vt (self#readByte))
in
if t != P.T_STOP then
("",t,self#readI16)
else ("",t,0);
method readFieldEnd = ()
method readMapBegin =
let kt = vt (self#readByte) in
let vt = vt (self#readByte) in
(kt,vt, self#readI32)
method readMapEnd = ()
method readListBegin =
let t = vt (self#readByte) in
(t,self#readI32)
method readListEnd = ()
method readSetBegin =
let t = vt (self#readByte) in
(t, self#readI32);
method readSetEnd = ()
end
class factory =
object
inherit P.factory
method getProtocol tr = new t tr
end