2 -- Licensed to the Apache Software Foundation (ASF) under one
3 -- or more contributor license agreements. See the NOTICE file
4 -- distributed with this work for additional information
5 -- regarding copyright ownership. The ASF licenses this file
6 -- to you under the Apache License, Version 2.0 (the
7 -- "License"); you may not use this file except in compliance
8 -- with the License. You may obtain a copy of the License at
10 -- http://www.apache.org/licenses/LICENSE-2.0
12 -- Unless required by applicable law or agreed to in writing,
13 -- software distributed under the License is distributed on an
14 -- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 -- KIND, either express or implied. See the License for the
16 -- specific language governing permissions and limitations
22 require 'libluabitwise'
24 TBinaryProtocol = __TObject.new(TProtocolBase, {
25 __type = 'TBinaryProtocol',
26 VERSION_MASK = -65536, -- 0xffff0000
27 VERSION_1 = -2147418112, -- 0x80010000
28 TYPE_MASK = 0x000000ff,
33 function TBinaryProtocol:writeMessageBegin(name, ttype, seqid)
34 if self.strictWrite then
35 self:writeI32(libluabitwise.bor(TBinaryProtocol.VERSION_1, ttype))
36 self:writeString(name)
39 self:writeString(name)
45 function TBinaryProtocol:writeMessageEnd()
48 function TBinaryProtocol:writeStructBegin(name)
51 function TBinaryProtocol:writeStructEnd()
54 function TBinaryProtocol:writeFieldBegin(name, ttype, id)
59 function TBinaryProtocol:writeFieldEnd()
62 function TBinaryProtocol:writeFieldStop()
63 self:writeByte(TType.STOP);
66 function TBinaryProtocol:writeMapBegin(ktype, vtype, size)
72 function TBinaryProtocol:writeMapEnd()
75 function TBinaryProtocol:writeListBegin(etype, size)
80 function TBinaryProtocol:writeListEnd()
83 function TBinaryProtocol:writeSetBegin(etype, size)
88 function TBinaryProtocol:writeSetEnd()
91 function TBinaryProtocol:writeBool(bool)
99 function TBinaryProtocol:writeByte(byte)
100 local buff = libluabpack.bpack('c', byte)
101 self.trans:write(buff)
104 function TBinaryProtocol:writeI16(i16)
105 local buff = libluabpack.bpack('s', i16)
106 self.trans:write(buff)
109 function TBinaryProtocol:writeI32(i32)
110 local buff = libluabpack.bpack('i', i32)
111 self.trans:write(buff)
114 function TBinaryProtocol:writeI64(i64)
115 local buff = libluabpack.bpack('l', i64)
116 self.trans:write(buff)
119 function TBinaryProtocol:writeDouble(dub)
120 local buff = libluabpack.bpack('d', dub)
121 self.trans:write(buff)
124 function TBinaryProtocol:writeString(str)
126 self:writeI32(string.len(str))
127 self.trans:write(str)
130 function TBinaryProtocol:readMessageBegin()
131 local sz, ttype, name, seqid = self:readI32()
133 local version = libluabitwise.band(sz, TBinaryProtocol.VERSION_MASK)
134 if version ~= TBinaryProtocol.VERSION_1 then
135 terror(TProtocolException:new{
136 message = 'Bad version in readMessageBegin: ' .. sz
139 ttype = libluabitwise.band(sz, TBinaryProtocol.TYPE_MASK)
140 name = self:readString()
141 seqid = self:readI32()
143 if self.strictRead then
144 terror(TProtocolException:new{message = 'No protocol version header'})
146 name = self.trans:readAll(sz)
147 ttype = self:readByte()
148 seqid = self:readI32()
150 return name, ttype, seqid
153 function TBinaryProtocol:readMessageEnd()
156 function TBinaryProtocol:readStructBegin()
160 function TBinaryProtocol:readStructEnd()
163 function TBinaryProtocol:readFieldBegin()
164 local ttype = self:readByte()
165 if ttype == TType.STOP then
168 local id = self:readI16()
169 return nil, ttype, id
172 function TBinaryProtocol:readFieldEnd()
175 function TBinaryProtocol:readMapBegin()
176 local ktype = self:readByte()
177 local vtype = self:readByte()
178 local size = self:readI32()
179 return ktype, vtype, size
182 function TBinaryProtocol:readMapEnd()
185 function TBinaryProtocol:readListBegin()
186 local etype = self:readByte()
187 local size = self:readI32()
191 function TBinaryProtocol:readListEnd()
194 function TBinaryProtocol:readSetBegin()
195 local etype = self:readByte()
196 local size = self:readI32()
200 function TBinaryProtocol:readSetEnd()
203 function TBinaryProtocol:readBool()
204 local byte = self:readByte()
211 function TBinaryProtocol:readByte()
212 local buff = self.trans:readAll(1)
213 local val = libluabpack.bunpack('c', buff)
217 function TBinaryProtocol:readI16()
218 local buff = self.trans:readAll(2)
219 local val = libluabpack.bunpack('s', buff)
223 function TBinaryProtocol:readI32()
224 local buff = self.trans:readAll(4)
225 local val = libluabpack.bunpack('i', buff)
229 function TBinaryProtocol:readI64()
230 local buff = self.trans:readAll(8)
231 local val = libluabpack.bunpack('l', buff)
235 function TBinaryProtocol:readDouble()
236 local buff = self.trans:readAll(8)
237 local val = libluabpack.bunpack('d', buff)
241 function TBinaryProtocol:readString()
242 local len = self:readI32()
243 local str = self.trans:readAll(len)
247 TBinaryProtocolFactory = TProtocolFactory:new{
248 __type = 'TBinaryProtocolFactory',
252 function TBinaryProtocolFactory:getProtocol(trans)
253 -- TODO Enforce that this must be a transport class (ie not a bool)
255 terror(TProtocolException:new{
256 message = 'Must supply a transport to ' .. ttype(self)
259 return TBinaryProtocol:new{
261 strictRead = self.strictRead,