blob: 44433d6a982aa4809b87c44bed92cf783b4f4f34 [file] [log] [blame]
iproctor9a41a0c2007-07-16 21:59:24 +00001open Thrift
2
3module P = Protocol
4
5let get_byte i b = 255 land (i lsr (8*b))
6let get_byte64 i b = 255 land (Int64.to_int (Int64.shift_right i (8*b)))
7
8
9let tv = P.t_type_to_i
10let vt = P.t_type_of_i
11
12
13let comp_int b n =
14 let s = ref 0 in
15 let sb = Sys.word_size - 8*n in
16 for i=0 to (n-1) do
17 s:=!s lor ((int_of_char b.[i]) lsl (8*(n-1-i)))
18 done;
19 s:=(!s lsl sb) asr sb;
20 !s
21
22let comp_int64 b n =
23 let s = ref 0L in
24 for i=0 to (n-1) do
25 s:=Int64.logor !s (Int64.shift_left (Int64.of_int (int_of_char b.[i])) (8*(n-1-i)))
26 done;
27 !s
28
29class t trans =
30object (self)
31 inherit P.t trans
32 val ibyte = String.create 8
33 method writeBool b =
34 ibyte.[0] <- char_of_int (if b then 1 else 0);
35 trans#write ibyte 0 1
36 method writeByte i =
37 ibyte.[0] <- char_of_int (get_byte i 0);
38 trans#write ibyte 0 1
39 method writeI16 i =
40 let gb = get_byte i in
41 ibyte.[1] <- char_of_int (gb 0);
42 ibyte.[0] <- char_of_int (gb 1);
43 trans#write ibyte 0 2
44 method writeI32 i =
45 let gb = get_byte i in
46 for i=0 to 3 do
47 ibyte.[3-i] <- char_of_int (gb i)
48 done;
49 trans#write ibyte 0 4
50 method writeI64 i=
51 let gb = get_byte64 i in
52 for i=0 to 7 do
53 ibyte.[7-i] <- char_of_int (gb i)
54 done;
55 trans#write ibyte 0 8
56 method writeDouble d =
57 self#writeI64 (Int64.bits_of_float d)
58 method writeString s=
59 let n = String.length s in
60 self#writeI32(n);
61 trans#write s 0 n
62 method writeBinary a = self#writeString a
63 method writeMessageBegin (n,t,s) =
64 self#writeString n;
65 self#writeByte (P.message_type_to_i t);
66 self#writeI32 s
67 method writeMessageEnd = ()
68 method writeStructBegin s = ()
69 method writeStructEnd = ()
70 method writeFieldBegin (n,t,i) =
71 self#writeByte (tv t);
72 self#writeI16 i
73 method writeFieldEnd = ()
74 method writeFieldStop =
75 self#writeByte (tv (Protocol.T_STOP))
76 method writeMapBegin (k,v,s) =
77 self#writeByte (tv k);
78 self#writeByte (tv v);
79 self#writeI32 s
80 method writeMapEnd = ()
81 method writeListBegin (t,s) =
82 self#writeByte (tv t);
83 self#writeI32 s
84 method writeListEnd = ()
85 method writeSetBegin (t,s) =
86 self#writeByte (tv t);
87 self#writeI32 s
88 method writeSetEnd = ()
89 method readByte =
90 ignore (trans#readAll ibyte 0 1);
91 (comp_int ibyte 1)
92 method readI16 =
93 ignore (trans#readAll ibyte 0 2);
94 comp_int ibyte 2
95 method readI32 =
96 ignore (trans#readAll ibyte 0 4);
97 comp_int ibyte 4
98 method readI64 =
99 ignore (trans#readAll ibyte 0 8);
100 comp_int64 ibyte 8
101 method readDouble =
102 Int64.float_of_bits (self#readI64)
103 method readBool =
104 self#readByte = 1
105 method readString =
106 let sz = self#readI32 in
107 let buf = String.create sz in
108 ignore (trans#readAll buf 0 sz);
109 buf
110 method readBinary = self#readString
111 method readMessageBegin =
112 let s = self#readString in
113 let mt = P.message_type_of_i (self#readByte) in
114 (s,mt, self#readI32)
115 method readMessageEnd = ()
116 method readStructBegin =
117 ""
118 method readStructEnd = ()
119 method readFieldBegin =
120 let t = (vt (self#readByte))
121 in
122 if t != P.T_STOP then
123 ("",t,self#readI16)
124 else ("",t,0);
125 method readFieldEnd = ()
126 method readMapBegin =
127 let kt = vt (self#readByte) in
128 let vt = vt (self#readByte) in
129 (kt,vt, self#readI32)
130 method readMapEnd = ()
131 method readListBegin =
132 let t = vt (self#readByte) in
133 (t,self#readI32)
134 method readListEnd = ()
135 method readSetBegin =
136 let t = vt (self#readByte) in
137 (t, self#readI32);
138 method readSetEnd = ()
139end
140
141class factory =
142object
143 inherit P.factory
144 method getProtocol tr = new t tr
145end