|  | # | 
|  | # 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. | 
|  | # | 
|  |  | 
|  | from TProtocol import * | 
|  | from struct import pack, unpack | 
|  |  | 
|  | class TBinaryProtocol(TProtocolBase): | 
|  |  | 
|  | """Binary implementation of the Thrift protocol driver.""" | 
|  |  | 
|  | # NastyHaxx. Python 2.4+ on 32-bit machines forces hex constants to be | 
|  | # positive, converting this into a long. If we hardcode the int value | 
|  | # instead it'll stay in 32 bit-land. | 
|  |  | 
|  | # VERSION_MASK = 0xffff0000 | 
|  | VERSION_MASK = -65536 | 
|  |  | 
|  | # VERSION_1 = 0x80010000 | 
|  | VERSION_1 = -2147418112 | 
|  |  | 
|  | TYPE_MASK = 0x000000ff | 
|  |  | 
|  | def __init__(self, trans, strictRead=False, strictWrite=True): | 
|  | TProtocolBase.__init__(self, trans) | 
|  | self.strictRead = strictRead | 
|  | self.strictWrite = strictWrite | 
|  |  | 
|  | def writeMessageBegin(self, name, type, seqid): | 
|  | if self.strictWrite: | 
|  | self.writeI32(TBinaryProtocol.VERSION_1 | type) | 
|  | self.writeString(name) | 
|  | self.writeI32(seqid) | 
|  | else: | 
|  | self.writeString(name) | 
|  | self.writeByte(type) | 
|  | self.writeI32(seqid) | 
|  |  | 
|  | def writeMessageEnd(self): | 
|  | pass | 
|  |  | 
|  | def writeStructBegin(self, name): | 
|  | pass | 
|  |  | 
|  | def writeStructEnd(self): | 
|  | pass | 
|  |  | 
|  | def writeFieldBegin(self, name, type, id): | 
|  | self.writeByte(type) | 
|  | self.writeI16(id) | 
|  |  | 
|  | def writeFieldEnd(self): | 
|  | pass | 
|  |  | 
|  | def writeFieldStop(self): | 
|  | self.writeByte(TType.STOP); | 
|  |  | 
|  | def writeMapBegin(self, ktype, vtype, size): | 
|  | self.writeByte(ktype) | 
|  | self.writeByte(vtype) | 
|  | self.writeI32(size) | 
|  |  | 
|  | def writeMapEnd(self): | 
|  | pass | 
|  |  | 
|  | def writeListBegin(self, etype, size): | 
|  | self.writeByte(etype) | 
|  | self.writeI32(size) | 
|  |  | 
|  | def writeListEnd(self): | 
|  | pass | 
|  |  | 
|  | def writeSetBegin(self, etype, size): | 
|  | self.writeByte(etype) | 
|  | self.writeI32(size) | 
|  |  | 
|  | def writeSetEnd(self): | 
|  | pass | 
|  |  | 
|  | def writeBool(self, bool): | 
|  | if bool: | 
|  | self.writeByte(1) | 
|  | else: | 
|  | self.writeByte(0) | 
|  |  | 
|  | def writeByte(self, byte): | 
|  | buff = pack("!b", byte) | 
|  | self.trans.write(buff) | 
|  |  | 
|  | def writeI16(self, i16): | 
|  | buff = pack("!h", i16) | 
|  | self.trans.write(buff) | 
|  |  | 
|  | def writeI32(self, i32): | 
|  | buff = pack("!i", i32) | 
|  | self.trans.write(buff) | 
|  |  | 
|  | def writeI64(self, i64): | 
|  | buff = pack("!q", i64) | 
|  | self.trans.write(buff) | 
|  |  | 
|  | def writeDouble(self, dub): | 
|  | buff = pack("!d", dub) | 
|  | self.trans.write(buff) | 
|  |  | 
|  | def writeString(self, str): | 
|  | self.writeI32(len(str)) | 
|  | self.trans.write(str) | 
|  |  | 
|  | def readMessageBegin(self): | 
|  | sz = self.readI32() | 
|  | if sz < 0: | 
|  | version = sz & TBinaryProtocol.VERSION_MASK | 
|  | if version != TBinaryProtocol.VERSION_1: | 
|  | raise TProtocolException(type=TProtocolException.BAD_VERSION, message='Bad version in readMessageBegin: %d' % (sz)) | 
|  | type = sz & TBinaryProtocol.TYPE_MASK | 
|  | name = self.readString() | 
|  | seqid = self.readI32() | 
|  | else: | 
|  | if self.strictRead: | 
|  | raise TProtocolException(type=TProtocolException.BAD_VERSION, message='No protocol version header') | 
|  | name = self.trans.readAll(sz) | 
|  | type = self.readByte() | 
|  | seqid = self.readI32() | 
|  | return (name, type, seqid) | 
|  |  | 
|  | def readMessageEnd(self): | 
|  | pass | 
|  |  | 
|  | def readStructBegin(self): | 
|  | pass | 
|  |  | 
|  | def readStructEnd(self): | 
|  | pass | 
|  |  | 
|  | def readFieldBegin(self): | 
|  | type = self.readByte() | 
|  | if type == TType.STOP: | 
|  | return (None, type, 0) | 
|  | id = self.readI16() | 
|  | return (None, type, id) | 
|  |  | 
|  | def readFieldEnd(self): | 
|  | pass | 
|  |  | 
|  | def readMapBegin(self): | 
|  | ktype = self.readByte() | 
|  | vtype = self.readByte() | 
|  | size = self.readI32() | 
|  | return (ktype, vtype, size) | 
|  |  | 
|  | def readMapEnd(self): | 
|  | pass | 
|  |  | 
|  | def readListBegin(self): | 
|  | etype = self.readByte() | 
|  | size = self.readI32() | 
|  | return (etype, size) | 
|  |  | 
|  | def readListEnd(self): | 
|  | pass | 
|  |  | 
|  | def readSetBegin(self): | 
|  | etype = self.readByte() | 
|  | size = self.readI32() | 
|  | return (etype, size) | 
|  |  | 
|  | def readSetEnd(self): | 
|  | pass | 
|  |  | 
|  | def readBool(self): | 
|  | byte = self.readByte() | 
|  | if byte == 0: | 
|  | return False | 
|  | return True | 
|  |  | 
|  | def readByte(self): | 
|  | buff = self.trans.readAll(1) | 
|  | val, = unpack('!b', buff) | 
|  | return val | 
|  |  | 
|  | def readI16(self): | 
|  | buff = self.trans.readAll(2) | 
|  | val, = unpack('!h', buff) | 
|  | return val | 
|  |  | 
|  | def readI32(self): | 
|  | buff = self.trans.readAll(4) | 
|  | val, = unpack('!i', buff) | 
|  | return val | 
|  |  | 
|  | def readI64(self): | 
|  | buff = self.trans.readAll(8) | 
|  | val, = unpack('!q', buff) | 
|  | return val | 
|  |  | 
|  | def readDouble(self): | 
|  | buff = self.trans.readAll(8) | 
|  | val, = unpack('!d', buff) | 
|  | return val | 
|  |  | 
|  | def readString(self): | 
|  | len = self.readI32() | 
|  | str = self.trans.readAll(len) | 
|  | return str | 
|  |  | 
|  |  | 
|  | class TBinaryProtocolFactory: | 
|  | def __init__(self, strictRead=False, strictWrite=True): | 
|  | self.strictRead = strictRead | 
|  | self.strictWrite = strictWrite | 
|  |  | 
|  | def getProtocol(self, trans): | 
|  | prot = TBinaryProtocol(trans, self.strictRead, self.strictWrite) | 
|  | return prot | 
|  |  | 
|  |  | 
|  | class TBinaryProtocolAccelerated(TBinaryProtocol): | 
|  |  | 
|  | """C-Accelerated version of TBinaryProtocol. | 
|  |  | 
|  | This class does not override any of TBinaryProtocol's methods, | 
|  | but the generated code recognizes it directly and will call into | 
|  | our C module to do the encoding, bypassing this object entirely. | 
|  | We inherit from TBinaryProtocol so that the normal TBinaryProtocol | 
|  | encoding can happen if the fastbinary module doesn't work for some | 
|  | reason.  (TODO(dreiss): Make this happen sanely in more cases.) | 
|  |  | 
|  | In order to take advantage of the C module, just use | 
|  | TBinaryProtocolAccelerated instead of TBinaryProtocol. | 
|  |  | 
|  | NOTE:  This code was contributed by an external developer. | 
|  | The internal Thrift team has reviewed and tested it, | 
|  | but we cannot guarantee that it is production-ready. | 
|  | Please feel free to report bugs and/or success stories | 
|  | to the public mailing list. | 
|  | """ | 
|  |  | 
|  | pass | 
|  |  | 
|  |  | 
|  | class TBinaryProtocolAcceleratedFactory: | 
|  | def getProtocol(self, trans): | 
|  | return TBinaryProtocolAccelerated(trans) |