blob: 2155be656068c46655481f1aa290ba1117970c79 [file] [log] [blame]
Christopher Piro094823a2007-07-18 00:26:12 +00001%%% Copyright (c) 2007- Facebook
2%%% Distributed under the Thrift Software License
Christopher Piroc2e37c72007-11-15 06:26:30 +00003%%%
Christopher Piro094823a2007-07-18 00:26:12 +00004%%% See accompanying file LICENSE or visit the Thrift site at:
5%%% http://developers.facebook.com/thrift/
6
7-module(tBinaryProtocol).
8
9-include("oop.hrl").
10
11-include("thrift.hrl").
12-include("protocol/tProtocolException.hrl").
13-include("protocol/tBinaryProtocol.hrl").
14
15-behavior(oop).
16
17-export([attr/4, super/0, inspect/1]).
18
19-export([
20 new/1,
21
22 writeMessageBegin/4,
23 writeFieldBegin/4, writeFieldStop/1,
24 writeMapBegin/4,
25 writeListBegin/3,
26 writeSetBegin/3,
27
Christopher Piroc2e37c72007-11-15 06:26:30 +000028 writeBool/2, writeByte/2, writeI16/2, writeI32/2,
29 writeI64/2, writeDouble/2, writeString/2,
Christopher Piro094823a2007-07-18 00:26:12 +000030
Christopher Piroc2e37c72007-11-15 06:26:30 +000031 readMessageBegin/1,
32 readFieldBegin/1,
33 readMapBegin/1,
34 readListBegin/1,
35 readSetBegin/1,
Christopher Piro094823a2007-07-18 00:26:12 +000036
Christopher Piroc2e37c72007-11-15 06:26:30 +000037 readBool/1, readByte/1, readI16/1, readI32/1,
Christopher Piro094823a2007-07-18 00:26:12 +000038 readI64/1, readDouble/1, readString/1
39]).
40
41%%%
42%%% define attributes
43%%% 'super' is required unless ?MODULE is a base class
44%%%
45
46?DEFINE_ATTR(super).
Christopher Piroc2e37c72007-11-15 06:26:30 +000047
Christopher Piro094823a2007-07-18 00:26:12 +000048%%%
49%%% behavior callbacks
50%%%
Christopher Piroc2e37c72007-11-15 06:26:30 +000051
Christopher Piro094823a2007-07-18 00:26:12 +000052%%% super() -> SuperModule = atom()
53%%% | none
54
55super() ->
56 tProtocol.
57
58%%% inspect(This) -> string()
59
60inspect(_This) ->
61 "".
62
63%%%
64%%% class methods
65%%%
66
67new(Trans) ->
68 Super = (super()):new(Trans),
69 #?MODULE{super=Super}.
70
71%%%
72%%% instance methods
73%%%
74
75writeMessageBegin(This, Name, Type, Seqid) ->
76 ?L1(writeI32, ?VERSION_1 bor Type),
77 ?L1(writeString, Name),
78 ?L1(writeI32, Seqid),
79 ok.
80
81writeFieldBegin(This, _Name, Type, Id) ->
82 ?L1(writeByte, Type),
83 ?L1(writeI16, Id),
84 ok.
85
86writeFieldStop(This) ->
87 ?L1(writeByte, ?tType_STOP),
88 ok.
89
90writeMapBegin(This, Ktype, Vtype, Size) ->
91 ?L1(writeByte, Ktype),
92 ?L1(writeByte, Vtype),
93 ?L1(writeI32, Size),
94 ok.
95
96writeListBegin(This, Etype, Size) ->
97 ?L1(writeByte, Etype),
98 ?L1(writeI32, Size),
99 ok.
100
101writeSetBegin(This, Etype, Size) ->
102 ?L1(writeByte, Etype),
103 ?L1(writeI32, Size),
104 ok.
105
106%
107
Christopher Piroaa934512008-01-30 01:39:01 +0000108writeBool(This, true) ->
109 ?L1(writeByte, 1);
110writeBool(This, false) ->
111 ?L1(writeByte, 0).
Christopher Piro094823a2007-07-18 00:26:12 +0000112
Christopher Piroaa934512008-01-30 01:39:01 +0000113writeByte(This, Byte) when is_integer(Byte) ->
Christopher Piro094823a2007-07-18 00:26:12 +0000114 Trans = oop:get(This, trans),
Christopher Piroaa934512008-01-30 01:39:01 +0000115 ?R1(Trans, effectful_write, <<Byte:8/big>>).
Christopher Piro094823a2007-07-18 00:26:12 +0000116
Christopher Piroaa934512008-01-30 01:39:01 +0000117writeI16(This, I16) when is_integer(I16) ->
Christopher Piro094823a2007-07-18 00:26:12 +0000118 Trans = oop:get(This, trans),
Christopher Piroaa934512008-01-30 01:39:01 +0000119 ?R1(Trans, effectful_write, <<I16:16/big>>).
Christopher Piro094823a2007-07-18 00:26:12 +0000120
Christopher Piroaa934512008-01-30 01:39:01 +0000121writeI32(This, I32) when is_integer(I32) ->
Christopher Piro094823a2007-07-18 00:26:12 +0000122 Trans = oop:get(This, trans),
Christopher Piroaa934512008-01-30 01:39:01 +0000123 ?R1(Trans, effectful_write, <<I32:32/big>>).
Christopher Piro094823a2007-07-18 00:26:12 +0000124
Christopher Piroaa934512008-01-30 01:39:01 +0000125writeI64(This, I64) when is_integer(I64) ->
Christopher Piro094823a2007-07-18 00:26:12 +0000126 Trans = oop:get(This, trans),
Christopher Piroaa934512008-01-30 01:39:01 +0000127 ?R1(Trans, effectful_write, <<I64:64/big>>).
Christopher Piro094823a2007-07-18 00:26:12 +0000128
Christopher Piroaa934512008-01-30 01:39:01 +0000129writeDouble(This, Double) when is_float(Double) ->
Christopher Piro094823a2007-07-18 00:26:12 +0000130 Trans = oop:get(This, trans),
eletuchy7d2ab9f2008-02-27 19:56:52 +0000131 ?R1(Trans, effectful_write, <<Double:64/float-big>>).
Christopher Piro094823a2007-07-18 00:26:12 +0000132
Christopher Piroaa934512008-01-30 01:39:01 +0000133writeString(This, Str) when is_list(Str) -> % [char()] or iolist()
Christopher Piro094823a2007-07-18 00:26:12 +0000134 Trans = oop:get(This, trans),
Christopher Piroaa934512008-01-30 01:39:01 +0000135 Data = list_to_binary(Str),
136 ?L1(writeI32, size(Data)),
137 ?R1(Trans, effectful_write, Data);
138
139writeString(This, Binary) when is_binary(Binary) ->
140 Trans = oop:get(This, trans),
141 ?L1(writeI32, size(Binary)),
142 ?R1(Trans, effectful_write, Binary).
Christopher Piro094823a2007-07-18 00:26:12 +0000143
Christopher Pirode11d852007-11-18 02:10:20 +0000144%%
Christopher Piro094823a2007-07-18 00:26:12 +0000145
146readMessageBegin(This) ->
147 Version = ?L0(readI32),
Christopher Piroc2e37c72007-11-15 06:26:30 +0000148 if
149 (Version band ?VERSION_MASK) /= ?VERSION_1 ->
Christopher Pirode11d852007-11-18 02:10:20 +0000150 tException:throw(tProtocolException, [?tProtocolException_BAD_VERSION, "Missing version identifier"]);
Christopher Piroc2e37c72007-11-15 06:26:30 +0000151 true -> ok
Christopher Piro094823a2007-07-18 00:26:12 +0000152 end,
153 Type = Version band 16#000000ff,
154 Name = ?L0(readString),
155 Seqid = ?L0(readI32),
156 { Name, Type, Seqid }.
157
158readFieldBegin(This) ->
159 Type = ?L0(readByte),
Christopher Piroc2e37c72007-11-15 06:26:30 +0000160 case Type of
161 ?tType_STOP ->
162 { nil, Type, 0 }; % WATCH
163 _ ->
164 Id = ?L0(readI16),
165 { nil, Type, Id }
Christopher Piro094823a2007-07-18 00:26:12 +0000166 end.
167
168readMapBegin(This) ->
169 Ktype = ?L0(readByte),
170 Vtype = ?L0(readByte),
171 Size = ?L0(readI32),
172 { Ktype, Vtype, Size }.
173
174readListBegin(This) ->
175 Etype = ?L0(readByte),
176 Size = ?L0(readI32),
177 { Etype, Size }.
178
179readSetBegin(This) ->
180 Etype = ?L0(readByte),
181 Size = ?L0(readI32),
182 { Etype, Size }.
183
Christopher Pirode11d852007-11-18 02:10:20 +0000184%%
Christopher Piro094823a2007-07-18 00:26:12 +0000185
186readBool(This) ->
187 Byte = ?L0(readByte),
188 (Byte /= 0).
189
190readByte(This) ->
191 Trans = oop:get(This, trans),
192 <<Val:8/integer-signed-big, _/binary>> = ?R1(Trans, readAll, 1),
193 Val.
194
195readI16(This) ->
196 Trans = oop:get(This, trans),
197 <<Val:16/integer-signed-big, _/binary>> = ?R1(Trans, readAll, 2),
198 Val.
199
200readI32(This) ->
201 Trans = oop:get(This, trans),
202 <<Val:32/integer-signed-big, _/binary>> = ?R1(Trans, readAll, 4),
203 Val.
204
205readI64(This) ->
206 Trans = oop:get(This, trans),
207 <<Val:64/integer-signed-big, _/binary>> = ?R1(Trans, readAll, 8),
208 Val.
209
210readDouble(This) ->
211 Trans = oop:get(This, trans),
212 <<Val:64/float-signed-big, _/binary>> = ?R1(Trans, readAll, 8),
213 Val.
214
215readString(This) ->
216 Trans = oop:get(This, trans),
217 Sz = ?L0(readI32),
218 binary_to_list(?R1(Trans, readAll, Sz)).