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