Subversion Repositories SmartDukaan

Rev

Rev 30 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
30 ashish 1
#
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
9
#
10
#   http://www.apache.org/licenses/LICENSE-2.0
11
#
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
17
# under the License.
18
#
19
 
20
from TProtocol import *
21
from struct import pack, unpack
22
 
23
class TBinaryProtocol(TProtocolBase):
24
 
25
  """Binary implementation of the Thrift protocol driver."""
26
 
27
  # NastyHaxx. Python 2.4+ on 32-bit machines forces hex constants to be
28
  # positive, converting this into a long. If we hardcode the int value
29
  # instead it'll stay in 32 bit-land.
30
 
31
  # VERSION_MASK = 0xffff0000
32
  VERSION_MASK = -65536
33
 
34
  # VERSION_1 = 0x80010000
35
  VERSION_1 = -2147418112
36
 
37
  TYPE_MASK = 0x000000ff
38
 
39
  def __init__(self, trans, strictRead=False, strictWrite=True):
40
    TProtocolBase.__init__(self, trans)
41
    self.strictRead = strictRead
42
    self.strictWrite = strictWrite
43
 
44
  def writeMessageBegin(self, name, type, seqid):
45
    if self.strictWrite:
46
      self.writeI32(TBinaryProtocol.VERSION_1 | type)
47
      self.writeString(name)
48
      self.writeI32(seqid)
49
    else:
50
      self.writeString(name)
51
      self.writeByte(type)
52
      self.writeI32(seqid)
53
 
54
  def writeMessageEnd(self):
55
    pass
56
 
57
  def writeStructBegin(self, name):
58
    pass
59
 
60
  def writeStructEnd(self):
61
    pass
62
 
63
  def writeFieldBegin(self, name, type, id):
64
    self.writeByte(type)
65
    self.writeI16(id)
66
 
67
  def writeFieldEnd(self):
68
    pass
69
 
70
  def writeFieldStop(self):
71
    self.writeByte(TType.STOP);
72
 
73
  def writeMapBegin(self, ktype, vtype, size):
74
    self.writeByte(ktype)
75
    self.writeByte(vtype)
76
    self.writeI32(size)
77
 
78
  def writeMapEnd(self):
79
    pass
80
 
81
  def writeListBegin(self, etype, size):
82
    self.writeByte(etype)
83
    self.writeI32(size)
84
 
85
  def writeListEnd(self):
86
    pass
87
 
88
  def writeSetBegin(self, etype, size):
89
    self.writeByte(etype)
90
    self.writeI32(size)
91
 
92
  def writeSetEnd(self):
93
    pass
94
 
95
  def writeBool(self, bool):
96
    if bool:
97
      self.writeByte(1)
98
    else:
99
      self.writeByte(0)
100
 
101
  def writeByte(self, byte):
102
    buff = pack("!b", byte)
103
    self.trans.write(buff)
104
 
105
  def writeI16(self, i16):
106
    buff = pack("!h", i16)
107
    self.trans.write(buff)
108
 
109
  def writeI32(self, i32):
110
    buff = pack("!i", i32)
111
    self.trans.write(buff)
112
 
113
  def writeI64(self, i64):
114
    buff = pack("!q", i64)
115
    self.trans.write(buff)
116
 
117
  def writeDouble(self, dub):
118
    buff = pack("!d", dub)
119
    self.trans.write(buff)
120
 
121
  def writeString(self, str):
122
    self.writeI32(len(str))
123
    self.trans.write(str)
124
 
125
  def readMessageBegin(self):
126
    sz = self.readI32()
127
    if sz < 0:
128
      version = sz & TBinaryProtocol.VERSION_MASK
129
      if version != TBinaryProtocol.VERSION_1:
130
        raise TProtocolException(type=TProtocolException.BAD_VERSION, message='Bad version in readMessageBegin: %d' % (sz))
131
      type = sz & TBinaryProtocol.TYPE_MASK
132
      name = self.readString()
133
      seqid = self.readI32()
134
    else:
135
      if self.strictRead:
136
        raise TProtocolException(type=TProtocolException.BAD_VERSION, message='No protocol version header')
137
      name = self.trans.readAll(sz)
138
      type = self.readByte()
139
      seqid = self.readI32()
140
    return (name, type, seqid)
141
 
142
  def readMessageEnd(self):
143
    pass
144
 
145
  def readStructBegin(self):
146
    pass
147
 
148
  def readStructEnd(self):
149
    pass
150
 
151
  def readFieldBegin(self):
152
    type = self.readByte()
153
    if type == TType.STOP:
154
      return (None, type, 0)
155
    id = self.readI16()
156
    return (None, type, id)
157
 
158
  def readFieldEnd(self):
159
    pass
160
 
161
  def readMapBegin(self):
162
    ktype = self.readByte()
163
    vtype = self.readByte()
164
    size = self.readI32()
165
    return (ktype, vtype, size)
166
 
167
  def readMapEnd(self):
168
    pass
169
 
170
  def readListBegin(self):
171
    etype = self.readByte()
172
    size = self.readI32()
173
    return (etype, size)
174
 
175
  def readListEnd(self):
176
    pass
177
 
178
  def readSetBegin(self):
179
    etype = self.readByte()
180
    size = self.readI32()
181
    return (etype, size)
182
 
183
  def readSetEnd(self):
184
    pass
185
 
186
  def readBool(self):
187
    byte = self.readByte()
188
    if byte == 0:
189
      return False
190
    return True
191
 
192
  def readByte(self):
193
    buff = self.trans.readAll(1)
194
    val, = unpack('!b', buff)
195
    return val
196
 
197
  def readI16(self):
198
    buff = self.trans.readAll(2)
199
    val, = unpack('!h', buff)
200
    return val
201
 
202
  def readI32(self):
203
    buff = self.trans.readAll(4)
204
    val, = unpack('!i', buff)
205
    return val
206
 
207
  def readI64(self):
208
    buff = self.trans.readAll(8)
209
    val, = unpack('!q', buff)
210
    return val
211
 
212
  def readDouble(self):
213
    buff = self.trans.readAll(8)
214
    val, = unpack('!d', buff)
215
    return val
216
 
217
  def readString(self):
218
    len = self.readI32()
219
    str = self.trans.readAll(len)
220
    return str
221
 
222
 
223
class TBinaryProtocolFactory:
224
  def __init__(self, strictRead=False, strictWrite=True):
225
    self.strictRead = strictRead
226
    self.strictWrite = strictWrite
227
 
228
  def getProtocol(self, trans):
229
    prot = TBinaryProtocol(trans, self.strictRead, self.strictWrite)
230
    return prot
231
 
232
 
233
class TBinaryProtocolAccelerated(TBinaryProtocol):
234
 
235
  """C-Accelerated version of TBinaryProtocol.
236
 
237
  This class does not override any of TBinaryProtocol's methods,
238
  but the generated code recognizes it directly and will call into
239
  our C module to do the encoding, bypassing this object entirely.
240
  We inherit from TBinaryProtocol so that the normal TBinaryProtocol
241
  encoding can happen if the fastbinary module doesn't work for some
242
  reason.  (TODO(dreiss): Make this happen sanely in more cases.)
243
 
244
  In order to take advantage of the C module, just use
245
  TBinaryProtocolAccelerated instead of TBinaryProtocol.
246
 
247
  NOTE:  This code was contributed by an external developer.
248
         The internal Thrift team has reviewed and tested it,
249
         but we cannot guarantee that it is production-ready.
250
         Please feel free to report bugs and/or success stories
251
         to the public mailing list.
252
  """
253
 
254
  pass
255
 
256
 
257
class TBinaryProtocolAcceleratedFactory:
258
  def getProtocol(self, trans):
259
    return TBinaryProtocolAccelerated(trans)