| -- |
| -- Licensed to the Apache Software Foundation (ASF) under one |
| -- or more contributor license agreements. See the NOTICE file |
| -- distributed with this work for additional information |
| -- regarding copyright ownership. The ASF licenses this file |
| -- to you under the Apache License, Version 2.0 (the |
| -- "License"); you may not use this file except in compliance |
| -- with the License. You may obtain a copy of the License at |
| -- |
| -- http://www.apache.org/licenses/LICENSE-2.0 |
| -- |
| -- Unless required by applicable law or agreed to in writing, |
| -- software distributed under the License is distributed on an |
| -- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| -- KIND, either express or implied. See the License for the |
| -- specific language governing permissions and limitations |
| -- under the License. |
| -- |
| |
| require 'Thrift' |
| |
| TProtocolException = TException:new { |
| UNKNOWN = 0, |
| INVALID_DATA = 1, |
| NEGATIVE_SIZE = 2, |
| SIZE_LIMIT = 3, |
| BAD_VERSION = 4, |
| INVALID_PROTOCOL = 5, |
| DEPTH_LIMIT = 6, |
| errorCode = 0, |
| __type = 'TProtocolException' |
| } |
| function TProtocolException:__errorCodeToString() |
| if self.errorCode == self.INVALID_DATA then |
| return 'Invalid data' |
| elseif self.errorCode == self.NEGATIVE_SIZE then |
| return 'Negative size' |
| elseif self.errorCode == self.SIZE_LIMIT then |
| return 'Size limit' |
| elseif self.errorCode == self.BAD_VERSION then |
| return 'Bad version' |
| elseif self.errorCode == self.INVALID_PROTOCOL then |
| return 'Invalid protocol' |
| elseif self.errorCode == self.DEPTH_LIMIT then |
| return 'Exceeded size limit' |
| else |
| return 'Default (unknown)' |
| end |
| end |
| |
| TProtocolBase = __TObject:new{ |
| __type = 'TProtocolBase', |
| trans |
| } |
| |
| function TProtocolBase:new(obj) |
| if ttype(obj) ~= 'table' then |
| error(ttype(self) .. 'must be initialized with a table') |
| end |
| |
| -- Ensure a transport is provided |
| if not obj.trans then |
| error('You must provide ' .. ttype(self) .. ' with a trans') |
| end |
| |
| return __TObject.new(self, obj) |
| end |
| |
| function TProtocolBase:writeMessageBegin(name, ttype, seqid) end |
| function TProtocolBase:writeMessageEnd() end |
| function TProtocolBase:writeStructBegin(name) end |
| function TProtocolBase:writeStructEnd() end |
| function TProtocolBase:writeFieldBegin(name, ttype, id) end |
| function TProtocolBase:writeFieldEnd() end |
| function TProtocolBase:writeFieldStop() end |
| function TProtocolBase:writeMapBegin(ktype, vtype, size) end |
| function TProtocolBase:writeMapEnd() end |
| function TProtocolBase:writeListBegin(ttype, size) end |
| function TProtocolBase:writeListEnd() end |
| function TProtocolBase:writeSetBegin(ttype, size) end |
| function TProtocolBase:writeSetEnd() end |
| function TProtocolBase:writeBool(bool) end |
| function TProtocolBase:writeByte(byte) end |
| function TProtocolBase:writeI16(i16) end |
| function TProtocolBase:writeI32(i32) end |
| function TProtocolBase:writeI64(i64) end |
| function TProtocolBase:writeDouble(dub) end |
| function TProtocolBase:writeString(str) end |
| function TProtocolBase:readMessageBegin() end |
| function TProtocolBase:readMessageEnd() end |
| function TProtocolBase:readStructBegin() end |
| function TProtocolBase:readStructEnd() end |
| function TProtocolBase:readFieldBegin() end |
| function TProtocolBase:readFieldEnd() end |
| function TProtocolBase:readMapBegin() end |
| function TProtocolBase:readMapEnd() end |
| function TProtocolBase:readListBegin() end |
| function TProtocolBase:readListEnd() end |
| function TProtocolBase:readSetBegin() end |
| function TProtocolBase:readSetEnd() end |
| function TProtocolBase:readBool() end |
| function TProtocolBase:readByte() end |
| function TProtocolBase:readI16() end |
| function TProtocolBase:readI32() end |
| function TProtocolBase:readI64() end |
| function TProtocolBase:readDouble() end |
| function TProtocolBase:readString() end |
| |
| function TProtocolBase:skip(ttype) |
| if ttype == TType.BOOL then |
| self:readBool() |
| elseif ttype == TType.BYTE then |
| self:readByte() |
| elseif ttype == TType.I16 then |
| self:readI16() |
| elseif ttype == TType.I32 then |
| self:readI32() |
| elseif ttype == TType.I64 then |
| self:readI64() |
| elseif ttype == TType.DOUBLE then |
| self:readDouble() |
| elseif ttype == TType.STRING then |
| self:readString() |
| elseif ttype == TType.STRUCT then |
| local name = self:readStructBegin() |
| while true do |
| local name, ttype, id = self:readFieldBegin() |
| if ttype == TType.STOP then |
| break |
| end |
| self:skip(ttype) |
| self:readFieldEnd() |
| end |
| self:readStructEnd() |
| elseif ttype == TType.MAP then |
| local kttype, vttype, size = self:readMapBegin() |
| for i = 1, size, 1 do |
| self:skip(kttype) |
| self:skip(vttype) |
| end |
| self:readMapEnd() |
| elseif ttype == TType.SET then |
| local ettype, size = self:readSetBegin() |
| for i = 1, size, 1 do |
| self:skip(ettype) |
| end |
| self:readSetEnd() |
| elseif ttype == TType.LIST then |
| local ettype, size = self:readListBegin() |
| for i = 1, size, 1 do |
| self:skip(ettype) |
| end |
| self:readListEnd() |
| else |
| terror(TProtocolException:new{ |
| message = 'Invalid data' |
| }) |
| end |
| end |
| |
| TProtocolFactory = __TObject:new{ |
| __type = 'TProtocolFactory', |
| } |
| function TProtocolFactory:getProtocol(trans) end |