blob: b82af73d65b348bb2db8b5d330a0461314d4564e [file] [log] [blame]
Christopher Piro2f5afce2007-06-29 07:17:33 +00001-module(tBinaryProtocol).
2
3-include("thrift/thrift.hrl").
4-include("thrift/protocol/tBinaryProtocol.hrl").
5-include("thrift/protocol/tProtocolException.hrl").
6
7-export([
8 new/1,
9 trans/1,
10 skip/2,
11
12 writeMessageBegin/4, writeMessageEnd/1,
13 writeStructBegin/2, writeStructEnd/1,
14 writeFieldBegin/4, writeFieldEnd/1, writeFieldStop/1,
15 writeMapBegin/4, writeMapEnd/1,
16 writeListBegin/3, writeListEnd/1,
17 writeSetBegin/3, writeSetEnd/1,
18
19 writeBool/2, writeByte/2, writeI16/2, writeI32/2,
20 writeI64/2, writeDouble/2, writeString/2,
21
22 readMessageBegin/1, readMessageEnd/1,
23 readStructBegin/1, readStructEnd/1,
24 readFieldBegin/1, readFieldEnd/1,
25 readMapBegin/1, readMapEnd/1,
26 readListBegin/1, readListEnd/1,
27 readSetBegin/1, readSetEnd/1,
28
29 readBool/1, readByte/1, readI16/1, readI32/1,
30 readI64/1, readDouble/1, readString/1
31]).
32
33new(Trans) ->
34 #tBinaryProtocol{trans=Trans}.
35
36trans(This) -> % accessor
37 ?ATTR(trans).
38
39skip(This, Type) ->
40 tProtocol:skip(This, Type).
41
42writeMessageBegin(This, Name, Type, Seqid) ->
43 writeI32(This, ?VERSION_1 bor Type),
44 writeString(This, Name),
45 writeI32(This, Seqid).
46
47writeMessageEnd(This) ->
48 This, % suppress unused warnings
49 ok.
50
51writeStructBegin(This, Name) ->
52 This, Name, % suppress unused warnings
53 ok.
54
55writeStructEnd(This) ->
56 This, % suppress unused warnings
57 ok.
58
59writeFieldBegin(This, Name, Type, Id) ->
60 Name,
61 writeByte(This, Type),
62 writeI16(This, Id).
63
64writeFieldEnd(This) ->
65 This, % suppress unused warnings
66 ok.
67
68writeFieldStop(This) ->
69 writeByte(This, ?tType_STOP).
70
71writeMapBegin(This, Ktype, Vtype, Size) ->
72 writeByte(This, Ktype),
73 writeByte(This, Vtype),
74 writeI32(This, Size).
75
76writeMapEnd(This) ->
77 This, % suppress unused warnings
78 ok.
79
80writeListBegin(This, Etype, Size) ->
81 writeByte(This, Etype),
82 writeI32(This, Size).
83
84writeListEnd(This) ->
85 This, % suppress unused warnings
86 ok.
87
88writeSetBegin(This, Etype, Size) ->
89 writeByte(This, Etype),
90 writeI32(This, Size).
91
92writeSetEnd(This) ->
93 This, % suppress unused warnings
94 ok.
95
96%
97
98writeBool(This, Bool) ->
99 if Bool -> % true
100 writeByte(This, 1);
101 true -> % false
102 writeByte(This, 0)
103 end.
104
105writeByte(This, Byte) ->
106 Trans = This#tBinaryProtocol.trans,
107 ?M1(Trans, write, binary_to_list(<<Byte:8/big>>)).
108
109writeI16(This, I16) ->
110 Trans = This#tBinaryProtocol.trans,
111 ?M1(Trans, write, binary_to_list(<<I16:16/big>>)).
112
113writeI32(This, I32) ->
114 Trans = This#tBinaryProtocol.trans,
115 ?M1(Trans, write, binary_to_list(<<I32:32/big>>)).
116
117writeI64(This, I64) ->
118 Trans = This#tBinaryProtocol.trans,
119 ?M1(Trans, write, binary_to_list(<<I64:64/big>>)).
120
121writeDouble(This, Double) ->
122 Trans = This#tBinaryProtocol.trans,
123 ?M1(Trans, write, binary_to_list(<<Double:64/big>>)).
124
125writeString(This, Str) ->
126 Trans = This#tBinaryProtocol.trans,
127 writeI32(This, length(Str)),
128 ?M1(Trans, write, Str).
129
130%
131
132readMessageBegin(This) ->
133 Version = readI32(This),
134 if
135 (Version band ?VERSION_MASK) /= ?VERSION_1 ->
136 throw(tProtocolException:new(?tProtocolException_BAD_VERSION,
137 "Missing version identifier"));
138 true -> ok
139 end,
140 Type = Version band 16#000000ff,
141 Name = readString(This),
142 Seqid = readI32(This),
143 { Name, Type, Seqid }.
144
145readMessageEnd(This) ->
146 This, % suppress unused warnings
147 ok.
148
149readStructBegin(This) ->
150 This, % suppress unused warnings
151 ok.
152
153readStructEnd(This) ->
154 This, % suppress unused warnings
155 ok.
156
157readFieldBegin(This) ->
158 Type = readByte(This),
159 if Type == ?tType_STOP ->
160 { nil, Type, 0 }; % WATCH
161 true ->
162 Id = readI16(This),
163 { nil, Type, Id }
164 end.
165
166readFieldEnd(This) ->
167 This, % suppress unused warnings
168 ok.
169
170readMapBegin(This) ->
171 Ktype = readByte(This),
172 Vtype = readByte(This),
173 Size = readI32(This),
174 { Ktype, Vtype, Size }.
175
176readMapEnd(This) ->
177 This, % suppress unused warnings
178 ok.
179
180readListBegin(This) ->
181 Etype = readByte(This),
182 Size = readI32(This),
183 { Etype, Size }.
184
185readListEnd(This) ->
186 This, % suppress unused warnings
187 ok.
188
189readSetBegin(This) ->
190 Etype = readByte(This),
191 Size = readI32(This),
192 { Etype, Size }.
193
194readSetEnd(This) ->
195 This, % suppress unused warnings
196 ok.
197
198% WATCH everything ... who knows what of this will work
199
200readBool(This) ->
201 Byte = readByte(This),
202 (Byte /= 0).
203
204readByte(This) ->
205 Trans = This#tBinaryProtocol.trans,
206 <<Val:8/integer-signed-big, _/binary>> = ?M1(Trans, readAll, 1),
207 Val.
208
209readI16(This) ->
210 Trans = This#tBinaryProtocol.trans,
211 <<Val:16/integer-signed-big, _/binary>> = ?M1(Trans, readAll, 2),
212 Val.
213
214readI32(This) ->
215 Trans = This#tBinaryProtocol.trans,
216 <<Val:32/integer-signed-big, _/binary>> = ?M1(Trans, readAll, 4),
217 Val.
218
219readI64(This) ->
220 Trans = This#tBinaryProtocol.trans,
221 <<Val:64/integer-signed-big, _/binary>> = ?M1(Trans, readAll, 8),
222 Val.
223
224readDouble(This) ->
225 Trans = This#tBinaryProtocol.trans,
226 <<Val:64/float-signed-big, _/binary>> = ?M1(Trans, readAll, 8),
227 Val.
228
229readString(This) ->
230 Trans = This#tBinaryProtocol.trans,
231 Sz = readI32(This),
232 binary_to_list(?M1(Trans, readAll, Sz)).