| Mark Slee | 89e2bb8 | 2007-03-01 00:20:36 +0000 | [diff] [blame] | 1 | #!/usr/bin/env python | 
 | 2 | # | 
 | 3 | # Copyright (c) 2006- Facebook | 
 | 4 | # Distributed under the Thrift Software License | 
 | 5 | # | 
 | 6 | # See accompanying file LICENSE or visit the Thrift site at: | 
 | 7 | # http://developers.facebook.com/thrift/ | 
 | 8 |  | 
| Mark Slee | e74306a | 2007-02-21 05:38:12 +0000 | [diff] [blame] | 9 | from thrift.Thrift import * | 
| Mark Slee | cde2b61 | 2006-09-03 21:13:07 +0000 | [diff] [blame] | 10 |  | 
| Mark Slee | 92195ae | 2007-02-21 05:16:30 +0000 | [diff] [blame] | 11 | class TProtocolException(TException): | 
 | 12 |  | 
 | 13 |   """Custom Protocol Exception class""" | 
 | 14 |  | 
 | 15 |   UNKNOWN = 0 | 
 | 16 |   INVALID_DATA = 1 | 
 | 17 |   NEGATIVE_SIZE = 2 | 
 | 18 |   SIZE_LIMIT = 3 | 
| Mark Slee | 808454e | 2007-06-20 21:51:57 +0000 | [diff] [blame] | 19 |   BAD_VERSION = 4 | 
| Mark Slee | 92195ae | 2007-02-21 05:16:30 +0000 | [diff] [blame] | 20 |  | 
 | 21 |   def __init__(self, type=UNKNOWN, message=None): | 
 | 22 |     TException.__init__(self, message) | 
 | 23 |     self.type = type | 
 | 24 |  | 
| Mark Slee | cde2b61 | 2006-09-03 21:13:07 +0000 | [diff] [blame] | 25 | class TProtocolBase: | 
 | 26 |  | 
 | 27 |   """Base class for Thrift protocol driver.""" | 
 | 28 |  | 
| Aditya Agarwal | 5c46819 | 2007-02-06 01:14:33 +0000 | [diff] [blame] | 29 |   def __init__(self, trans): | 
 | 30 |     self.trans = trans | 
| Mark Slee | 4ac459f | 2006-10-25 21:39:01 +0000 | [diff] [blame] | 31 |  | 
 | 32 |   def writeMessageBegin(self, name, type, seqid): | 
| Mark Slee | cde2b61 | 2006-09-03 21:13:07 +0000 | [diff] [blame] | 33 |     pass | 
 | 34 |  | 
| Mark Slee | 4ac459f | 2006-10-25 21:39:01 +0000 | [diff] [blame] | 35 |   def writeMessageEnd(self): | 
| Mark Slee | cde2b61 | 2006-09-03 21:13:07 +0000 | [diff] [blame] | 36 |     pass | 
 | 37 |  | 
| Mark Slee | 4ac459f | 2006-10-25 21:39:01 +0000 | [diff] [blame] | 38 |   def writeStructBegin(self, name): | 
| Mark Slee | cde2b61 | 2006-09-03 21:13:07 +0000 | [diff] [blame] | 39 |     pass | 
 | 40 |  | 
| Mark Slee | 4ac459f | 2006-10-25 21:39:01 +0000 | [diff] [blame] | 41 |   def writeStructEnd(self): | 
| Mark Slee | cde2b61 | 2006-09-03 21:13:07 +0000 | [diff] [blame] | 42 |     pass | 
 | 43 |  | 
| Mark Slee | 4ac459f | 2006-10-25 21:39:01 +0000 | [diff] [blame] | 44 |   def writeFieldBegin(self, name, type, id): | 
| Mark Slee | cde2b61 | 2006-09-03 21:13:07 +0000 | [diff] [blame] | 45 |     pass | 
 | 46 |  | 
| Mark Slee | 4ac459f | 2006-10-25 21:39:01 +0000 | [diff] [blame] | 47 |   def writeFieldEnd(self): | 
| Mark Slee | cde2b61 | 2006-09-03 21:13:07 +0000 | [diff] [blame] | 48 |     pass | 
 | 49 |  | 
| Mark Slee | 4ac459f | 2006-10-25 21:39:01 +0000 | [diff] [blame] | 50 |   def writeFieldStop(self): | 
| Mark Slee | cde2b61 | 2006-09-03 21:13:07 +0000 | [diff] [blame] | 51 |     pass | 
 | 52 |  | 
| Mark Slee | 4ac459f | 2006-10-25 21:39:01 +0000 | [diff] [blame] | 53 |   def writeMapBegin(self, ktype, vtype, size): | 
| Mark Slee | cde2b61 | 2006-09-03 21:13:07 +0000 | [diff] [blame] | 54 |     pass | 
 | 55 |  | 
| Mark Slee | 4ac459f | 2006-10-25 21:39:01 +0000 | [diff] [blame] | 56 |   def writeMapEnd(self): | 
| Mark Slee | cde2b61 | 2006-09-03 21:13:07 +0000 | [diff] [blame] | 57 |     pass | 
 | 58 |  | 
| Mark Slee | 4ac459f | 2006-10-25 21:39:01 +0000 | [diff] [blame] | 59 |   def writeListBegin(self, etype, size): | 
| Mark Slee | cde2b61 | 2006-09-03 21:13:07 +0000 | [diff] [blame] | 60 |     pass | 
 | 61 |  | 
| Mark Slee | 4ac459f | 2006-10-25 21:39:01 +0000 | [diff] [blame] | 62 |   def writeListEnd(self): | 
| Mark Slee | cde2b61 | 2006-09-03 21:13:07 +0000 | [diff] [blame] | 63 |     pass | 
 | 64 |  | 
| Mark Slee | 4ac459f | 2006-10-25 21:39:01 +0000 | [diff] [blame] | 65 |   def writeSetBegin(self, etype, size): | 
| Mark Slee | cde2b61 | 2006-09-03 21:13:07 +0000 | [diff] [blame] | 66 |     pass | 
 | 67 |  | 
| Mark Slee | 4ac459f | 2006-10-25 21:39:01 +0000 | [diff] [blame] | 68 |   def writeSetEnd(self): | 
| Mark Slee | cde2b61 | 2006-09-03 21:13:07 +0000 | [diff] [blame] | 69 |     pass | 
 | 70 |  | 
| Mark Slee | 4ac459f | 2006-10-25 21:39:01 +0000 | [diff] [blame] | 71 |   def writeBool(self, bool): | 
| Mark Slee | cde2b61 | 2006-09-03 21:13:07 +0000 | [diff] [blame] | 72 |     pass | 
 | 73 |  | 
| Mark Slee | 4ac459f | 2006-10-25 21:39:01 +0000 | [diff] [blame] | 74 |   def writeByte(self, byte): | 
| Mark Slee | cde2b61 | 2006-09-03 21:13:07 +0000 | [diff] [blame] | 75 |     pass | 
 | 76 |  | 
| Mark Slee | 4ac459f | 2006-10-25 21:39:01 +0000 | [diff] [blame] | 77 |   def writeI16(self, i16): | 
| Mark Slee | cde2b61 | 2006-09-03 21:13:07 +0000 | [diff] [blame] | 78 |     pass | 
 | 79 |  | 
| Mark Slee | 4ac459f | 2006-10-25 21:39:01 +0000 | [diff] [blame] | 80 |   def writeI32(self, i32): | 
| Mark Slee | cde2b61 | 2006-09-03 21:13:07 +0000 | [diff] [blame] | 81 |     pass | 
 | 82 |  | 
| Mark Slee | 4ac459f | 2006-10-25 21:39:01 +0000 | [diff] [blame] | 83 |   def writeI64(self, i64): | 
| Mark Slee | cde2b61 | 2006-09-03 21:13:07 +0000 | [diff] [blame] | 84 |     pass | 
 | 85 |  | 
| Mark Slee | 4ac459f | 2006-10-25 21:39:01 +0000 | [diff] [blame] | 86 |   def writeDouble(self, dub): | 
| Mark Slee | c98d050 | 2006-09-06 02:42:25 +0000 | [diff] [blame] | 87 |     pass | 
 | 88 |  | 
| Mark Slee | 4ac459f | 2006-10-25 21:39:01 +0000 | [diff] [blame] | 89 |   def writeString(self, str): | 
| Mark Slee | cde2b61 | 2006-09-03 21:13:07 +0000 | [diff] [blame] | 90 |     pass | 
 | 91 |  | 
| Mark Slee | 4ac459f | 2006-10-25 21:39:01 +0000 | [diff] [blame] | 92 |   def readMessageBegin(self): | 
| Mark Slee | cde2b61 | 2006-09-03 21:13:07 +0000 | [diff] [blame] | 93 |     pass | 
 | 94 |  | 
| Mark Slee | 4ac459f | 2006-10-25 21:39:01 +0000 | [diff] [blame] | 95 |   def readMessageEnd(self): | 
| Mark Slee | cde2b61 | 2006-09-03 21:13:07 +0000 | [diff] [blame] | 96 |     pass | 
 | 97 |  | 
| Mark Slee | 4ac459f | 2006-10-25 21:39:01 +0000 | [diff] [blame] | 98 |   def readStructBegin(self): | 
| Mark Slee | cde2b61 | 2006-09-03 21:13:07 +0000 | [diff] [blame] | 99 |     pass | 
 | 100 |  | 
| Mark Slee | 4ac459f | 2006-10-25 21:39:01 +0000 | [diff] [blame] | 101 |   def readStructEnd(self): | 
| Mark Slee | cde2b61 | 2006-09-03 21:13:07 +0000 | [diff] [blame] | 102 |     pass | 
 | 103 |  | 
| Mark Slee | 4ac459f | 2006-10-25 21:39:01 +0000 | [diff] [blame] | 104 |   def readFieldBegin(self): | 
| Mark Slee | cde2b61 | 2006-09-03 21:13:07 +0000 | [diff] [blame] | 105 |     pass | 
 | 106 |  | 
| Mark Slee | 4ac459f | 2006-10-25 21:39:01 +0000 | [diff] [blame] | 107 |   def readFieldEnd(self): | 
| Mark Slee | cde2b61 | 2006-09-03 21:13:07 +0000 | [diff] [blame] | 108 |     pass | 
 | 109 |  | 
| Mark Slee | 4ac459f | 2006-10-25 21:39:01 +0000 | [diff] [blame] | 110 |   def readMapBegin(self): | 
| Mark Slee | cde2b61 | 2006-09-03 21:13:07 +0000 | [diff] [blame] | 111 |     pass | 
 | 112 |  | 
| Mark Slee | 4ac459f | 2006-10-25 21:39:01 +0000 | [diff] [blame] | 113 |   def readMapEnd(self): | 
| Mark Slee | cde2b61 | 2006-09-03 21:13:07 +0000 | [diff] [blame] | 114 |     pass | 
 | 115 |  | 
| Mark Slee | 4ac459f | 2006-10-25 21:39:01 +0000 | [diff] [blame] | 116 |   def readListBegin(self): | 
| Mark Slee | cde2b61 | 2006-09-03 21:13:07 +0000 | [diff] [blame] | 117 |     pass | 
 | 118 |  | 
| Mark Slee | 4ac459f | 2006-10-25 21:39:01 +0000 | [diff] [blame] | 119 |   def readListEnd(self): | 
| Mark Slee | cde2b61 | 2006-09-03 21:13:07 +0000 | [diff] [blame] | 120 |     pass | 
 | 121 |  | 
| Mark Slee | 4ac459f | 2006-10-25 21:39:01 +0000 | [diff] [blame] | 122 |   def readSetBegin(self): | 
| Mark Slee | cde2b61 | 2006-09-03 21:13:07 +0000 | [diff] [blame] | 123 |     pass | 
 | 124 |  | 
| Mark Slee | 4ac459f | 2006-10-25 21:39:01 +0000 | [diff] [blame] | 125 |   def readSetEnd(self): | 
| Mark Slee | cde2b61 | 2006-09-03 21:13:07 +0000 | [diff] [blame] | 126 |     pass | 
 | 127 |  | 
| Mark Slee | 4ac459f | 2006-10-25 21:39:01 +0000 | [diff] [blame] | 128 |   def readBool(self): | 
| Mark Slee | cde2b61 | 2006-09-03 21:13:07 +0000 | [diff] [blame] | 129 |     pass | 
 | 130 |  | 
| Mark Slee | 4ac459f | 2006-10-25 21:39:01 +0000 | [diff] [blame] | 131 |   def readByte(self): | 
| Mark Slee | cde2b61 | 2006-09-03 21:13:07 +0000 | [diff] [blame] | 132 |     pass | 
 | 133 |  | 
| Mark Slee | 4ac459f | 2006-10-25 21:39:01 +0000 | [diff] [blame] | 134 |   def readI16(self): | 
| Mark Slee | cde2b61 | 2006-09-03 21:13:07 +0000 | [diff] [blame] | 135 |     pass | 
 | 136 |  | 
| Mark Slee | 4ac459f | 2006-10-25 21:39:01 +0000 | [diff] [blame] | 137 |   def readI32(self): | 
| Mark Slee | cde2b61 | 2006-09-03 21:13:07 +0000 | [diff] [blame] | 138 |     pass | 
 | 139 |  | 
| Mark Slee | 4ac459f | 2006-10-25 21:39:01 +0000 | [diff] [blame] | 140 |   def readI64(self): | 
| Mark Slee | cde2b61 | 2006-09-03 21:13:07 +0000 | [diff] [blame] | 141 |     pass | 
 | 142 |  | 
| Mark Slee | 4ac459f | 2006-10-25 21:39:01 +0000 | [diff] [blame] | 143 |   def readDouble(self): | 
| Mark Slee | c98d050 | 2006-09-06 02:42:25 +0000 | [diff] [blame] | 144 |     pass | 
 | 145 |  | 
| Mark Slee | 4ac459f | 2006-10-25 21:39:01 +0000 | [diff] [blame] | 146 |   def readString(self): | 
| Mark Slee | cde2b61 | 2006-09-03 21:13:07 +0000 | [diff] [blame] | 147 |     pass | 
 | 148 |  | 
| Mark Slee | 4ac459f | 2006-10-25 21:39:01 +0000 | [diff] [blame] | 149 |   def skip(self, type): | 
| Mark Slee | cde2b61 | 2006-09-03 21:13:07 +0000 | [diff] [blame] | 150 |     if type == TType.STOP: | 
 | 151 |       return | 
 | 152 |     elif type == TType.BOOL: | 
| Mark Slee | 4ac459f | 2006-10-25 21:39:01 +0000 | [diff] [blame] | 153 |       self.readBool() | 
| Mark Slee | cde2b61 | 2006-09-03 21:13:07 +0000 | [diff] [blame] | 154 |     elif type == TType.BYTE: | 
| Mark Slee | 4ac459f | 2006-10-25 21:39:01 +0000 | [diff] [blame] | 155 |       self.readByte() | 
| Mark Slee | cde2b61 | 2006-09-03 21:13:07 +0000 | [diff] [blame] | 156 |     elif type == TType.I16: | 
| Mark Slee | 4ac459f | 2006-10-25 21:39:01 +0000 | [diff] [blame] | 157 |       self.readI16() | 
| Mark Slee | cde2b61 | 2006-09-03 21:13:07 +0000 | [diff] [blame] | 158 |     elif type == TType.I32: | 
| Mark Slee | 4ac459f | 2006-10-25 21:39:01 +0000 | [diff] [blame] | 159 |       self.readI32() | 
| Mark Slee | cde2b61 | 2006-09-03 21:13:07 +0000 | [diff] [blame] | 160 |     elif type == TType.I64: | 
| Mark Slee | 4ac459f | 2006-10-25 21:39:01 +0000 | [diff] [blame] | 161 |       self.readI64() | 
| Mark Slee | c98d050 | 2006-09-06 02:42:25 +0000 | [diff] [blame] | 162 |     elif type == TType.DOUBLE: | 
| Mark Slee | 4ac459f | 2006-10-25 21:39:01 +0000 | [diff] [blame] | 163 |       self.readDouble() | 
| Mark Slee | cde2b61 | 2006-09-03 21:13:07 +0000 | [diff] [blame] | 164 |     elif type == TType.STRING: | 
| Mark Slee | 4ac459f | 2006-10-25 21:39:01 +0000 | [diff] [blame] | 165 |       self.readString() | 
| Mark Slee | cde2b61 | 2006-09-03 21:13:07 +0000 | [diff] [blame] | 166 |     elif type == TType.STRUCT: | 
| Mark Slee | 4ac459f | 2006-10-25 21:39:01 +0000 | [diff] [blame] | 167 |       name = self.readStructBegin() | 
| Mark Slee | cde2b61 | 2006-09-03 21:13:07 +0000 | [diff] [blame] | 168 |       while True: | 
| Mark Slee | 4ac459f | 2006-10-25 21:39:01 +0000 | [diff] [blame] | 169 |         (name, type, id) = self.readFieldBegin() | 
| Mark Slee | cde2b61 | 2006-09-03 21:13:07 +0000 | [diff] [blame] | 170 |         if type == TType.STOP: | 
 | 171 |           break | 
| Mark Slee | 4ac459f | 2006-10-25 21:39:01 +0000 | [diff] [blame] | 172 |         self.skip(type) | 
 | 173 |         self.readFieldEnd() | 
 | 174 |       self.readStructEnd() | 
| Mark Slee | cde2b61 | 2006-09-03 21:13:07 +0000 | [diff] [blame] | 175 |     elif type == TType.MAP: | 
| Mark Slee | 4ac459f | 2006-10-25 21:39:01 +0000 | [diff] [blame] | 176 |       (ktype, vtype, size) = self.readMapBegin() | 
| Mark Slee | cde2b61 | 2006-09-03 21:13:07 +0000 | [diff] [blame] | 177 |       for i in range(size): | 
| Mark Slee | 4ac459f | 2006-10-25 21:39:01 +0000 | [diff] [blame] | 178 |         self.skip(ktype) | 
 | 179 |         self.skip(vtype) | 
 | 180 |       self.readMapEnd() | 
| Mark Slee | cde2b61 | 2006-09-03 21:13:07 +0000 | [diff] [blame] | 181 |     elif type == TType.SET: | 
| Mark Slee | 4ac459f | 2006-10-25 21:39:01 +0000 | [diff] [blame] | 182 |       (etype, size) = self.readSetBegin() | 
| Mark Slee | cde2b61 | 2006-09-03 21:13:07 +0000 | [diff] [blame] | 183 |       for i in range(size): | 
| Mark Slee | 4ac459f | 2006-10-25 21:39:01 +0000 | [diff] [blame] | 184 |         self.skip(etype) | 
 | 185 |       self.readSetEnd() | 
| Mark Slee | cde2b61 | 2006-09-03 21:13:07 +0000 | [diff] [blame] | 186 |     elif type == TType.LIST: | 
| Mark Slee | 4ac459f | 2006-10-25 21:39:01 +0000 | [diff] [blame] | 187 |       (etype, size) = self.readListBegin() | 
| Mark Slee | cde2b61 | 2006-09-03 21:13:07 +0000 | [diff] [blame] | 188 |       for i in range(size): | 
| Mark Slee | 4ac459f | 2006-10-25 21:39:01 +0000 | [diff] [blame] | 189 |         self.skip(etype) | 
 | 190 |       self.readListEnd() | 
| Mark Slee | cde2b61 | 2006-09-03 21:13:07 +0000 | [diff] [blame] | 191 |  | 
| Mark Slee | 4ac459f | 2006-10-25 21:39:01 +0000 | [diff] [blame] | 192 | class TProtocolFactory: | 
| Aditya Agarwal | 5c46819 | 2007-02-06 01:14:33 +0000 | [diff] [blame] | 193 |   def getProtocol(self, trans): | 
| Mark Slee | 4ac459f | 2006-10-25 21:39:01 +0000 | [diff] [blame] | 194 |     pass |