r1319@opsdev009 (orig r70531): cpiro | 2007-11-17 18:10:20 -0800
[amiethrift.git] / lib / erl / src / protocol / tBinaryProtocol.erl
blobefcfd779423fc2fc12b5ecdf1ac897504e02dbc5
1 %%% Copyright (c) 2007- Facebook
2 %%% Distributed under the Thrift Software License
3 %%%
4 %%% See accompanying file LICENSE or visit the Thrift site at:
5 %%% http://developers.facebook.com/thrift/
7 -module(tBinaryProtocol).
9 -include("oop.hrl").
11 -include("thrift.hrl").
12 -include("protocol/tProtocolException.hrl").
13 -include("protocol/tBinaryProtocol.hrl").
15 -behavior(oop).
17 -export([attr/4, super/0, inspect/1]).
19 -export([
20 new/1,
22 writeMessageBegin/4,
23 writeFieldBegin/4, writeFieldStop/1,
24 writeMapBegin/4,
25 writeListBegin/3,
26 writeSetBegin/3,
28 writeBool/2, writeByte/2, writeI16/2, writeI32/2,
29 writeI64/2, writeDouble/2, writeString/2,
31 readMessageBegin/1,
32 readFieldBegin/1,
33 readMapBegin/1,
34 readListBegin/1,
35 readSetBegin/1,
37 readBool/1, readByte/1, readI16/1, readI32/1,
38 readI64/1, readDouble/1, readString/1
39 ]).
41 %%%
42 %%% define attributes
43 %%% 'super' is required unless ?MODULE is a base class
44 %%%
46 ?DEFINE_ATTR(super).
48 %%%
49 %%% behavior callbacks
50 %%%
52 %%% super() -> SuperModule = atom()
53 %%% | none
55 super() ->
56 tProtocol.
58 %%% inspect(This) -> string()
60 inspect(_This) ->
61 "".
63 %%%
64 %%% class methods
65 %%%
67 new(Trans) ->
68 Super = (super()):new(Trans),
69 #?MODULE{super=Super}.
71 %%%
72 %%% instance methods
73 %%%
75 writeMessageBegin(This, Name, Type, Seqid) ->
76 ?L1(writeI32, ?VERSION_1 bor Type),
77 ?L1(writeString, Name),
78 ?L1(writeI32, Seqid),
79 ok.
81 writeFieldBegin(This, _Name, Type, Id) ->
82 ?L1(writeByte, Type),
83 ?L1(writeI16, Id),
84 ok.
86 writeFieldStop(This) ->
87 ?L1(writeByte, ?tType_STOP),
88 ok.
90 writeMapBegin(This, Ktype, Vtype, Size) ->
91 ?L1(writeByte, Ktype),
92 ?L1(writeByte, Vtype),
93 ?L1(writeI32, Size),
94 ok.
96 writeListBegin(This, Etype, Size) ->
97 ?L1(writeByte, Etype),
98 ?L1(writeI32, Size),
99 ok.
101 writeSetBegin(This, Etype, Size) ->
102 ?L1(writeByte, Etype),
103 ?L1(writeI32, Size),
108 writeBool(This, Bool) ->
109 case Bool of
110 true -> ?L1(writeByte, 1);
111 false -> ?L1(writeByte, 0)
112 end.
114 writeByte(This, Byte) ->
115 Trans = oop:get(This, trans),
116 ?R1(Trans, effectful_write, binary_to_list(<<Byte:8/big>>)).
118 writeI16(This, I16) ->
119 Trans = oop:get(This, trans),
120 ?R1(Trans, effectful_write, binary_to_list(<<I16:16/big>>)).
122 writeI32(This, I32) ->
123 Trans = oop:get(This, trans),
124 ?R1(Trans, effectful_write, binary_to_list(<<I32:32/big>>)).
126 writeI64(This, I64) ->
127 Trans = oop:get(This, trans),
128 ?R1(Trans, effectful_write, binary_to_list(<<I64:64/big>>)).
130 writeDouble(This, Double) ->
131 Trans = oop:get(This, trans),
132 ?R1(Trans, effectful_write, binary_to_list(<<Double:64/big>>)).
134 writeString(This, Str) ->
135 Trans = oop:get(This, trans),
136 ?L1(writeI32, length(Str)),
137 ?R1(Trans, effectful_write, Str).
141 readMessageBegin(This) ->
142 Version = ?L0(readI32),
144 (Version band ?VERSION_MASK) /= ?VERSION_1 ->
145 tException:throw(tProtocolException, [?tProtocolException_BAD_VERSION, "Missing version identifier"]);
146 true -> ok
147 end,
148 Type = Version band 16#000000ff,
149 Name = ?L0(readString),
150 Seqid = ?L0(readI32),
151 { Name, Type, Seqid }.
153 readFieldBegin(This) ->
154 Type = ?L0(readByte),
155 case Type of
156 ?tType_STOP ->
157 { nil, Type, 0 }; % WATCH
158 _ ->
159 Id = ?L0(readI16),
160 { nil, Type, Id }
161 end.
163 readMapBegin(This) ->
164 Ktype = ?L0(readByte),
165 Vtype = ?L0(readByte),
166 Size = ?L0(readI32),
167 { Ktype, Vtype, Size }.
169 readListBegin(This) ->
170 Etype = ?L0(readByte),
171 Size = ?L0(readI32),
172 { Etype, Size }.
174 readSetBegin(This) ->
175 Etype = ?L0(readByte),
176 Size = ?L0(readI32),
177 { Etype, Size }.
181 readBool(This) ->
182 Byte = ?L0(readByte),
183 (Byte /= 0).
185 readByte(This) ->
186 Trans = oop:get(This, trans),
187 <<Val:8/integer-signed-big, _/binary>> = ?R1(Trans, readAll, 1),
188 Val.
190 readI16(This) ->
191 Trans = oop:get(This, trans),
192 <<Val:16/integer-signed-big, _/binary>> = ?R1(Trans, readAll, 2),
193 Val.
195 readI32(This) ->
196 Trans = oop:get(This, trans),
197 <<Val:32/integer-signed-big, _/binary>> = ?R1(Trans, readAll, 4),
198 Val.
200 readI64(This) ->
201 Trans = oop:get(This, trans),
202 <<Val:64/integer-signed-big, _/binary>> = ?R1(Trans, readAll, 8),
203 Val.
205 readDouble(This) ->
206 Trans = oop:get(This, trans),
207 <<Val:64/float-signed-big, _/binary>> = ?R1(Trans, readAll, 8),
208 Val.
210 readString(This) ->
211 Trans = oop:get(This, trans),
212 Sz = ?L0(readI32),
213 binary_to_list(?R1(Trans, readAll, Sz)).