def fromString(content): msg = AppMessage() stream = io.BytesIO(content) ##read basic attrib ##msg id msg.id = serialize.readVariant(stream) ##type&success ##bin: 6bit type | 1bit success type_value = ord(stream.read(1)) msg.type = type_value >> 1 if type_value&0x01: msg.success = True else: msg.success = False ##sender&receiver msg.sender = serialize.readString(stream) msg.receiver = serialize.readString(stream) msg.session = serialize.readVariant(stream) msg.sequence = serialize.readVariant(stream) msg.transaction = serialize.readVariant(stream) msg.timestamp = serialize.readVariant(stream) msg.readParams(stream) stream.close() return msg
def readParams(self, stream): ## 2bytes: 11 bits key, 5 bits type data = stream.read(2) while 0 != len(data): key_value = ord(data[0])<<8|ord(data[1]) value_type = key_value&0x1F key = key_value >> 5 if self.param_type_uint == value_type: ##uint value = serialize.readVariant(stream) self.setUInt(key, value) elif self.param_type_bool == value_type: ##bool value = serialize.readVariant(stream) self.setBool(key, (1 == value)) elif self.param_type_int == value_type: ##int value = serialize.readVariant(stream) self.setInt(key, serialize.zigzagDecode(value)) elif self.param_type_string == value_type: ##string value = serialize.readString(stream) self.setString(key, value) elif self.param_type_float == value_type: ##float self.setFloat(key, serialize.readFloat(stream)) elif self.param_type_uint_array == value_type: ##uint array count = serialize.readVariant(stream) array = [] for i in range(count): array.append(serialize.readVariant(stream)) self.setUIntArray(key, array) elif self.param_type_string_array == value_type: ##string array count = serialize.readVariant(stream) array = [] for i in range(count): array.append(serialize.readString(stream)) self.setStringArray(key, array) elif self.param_type_float_array == value_type: ##float array count = serialize.readVariant(stream) array = [] for i in range(count): array.append(serialize.readFloat(stream)) self.setFloatArray(key, array) elif self.param_type_uint_array_array == value_type: ##uint array array count = serialize.readVariant(stream) array = [] for i in range(count): sub_count = serialize.readVariant(stream) sub_array = [] for j in range(sub_count): sub_array.append(serialize.readVariant(stream)) array.append(sub_array) self.setUIntArrayArray(key, array) elif self.param_type_string_array_array == value_type: ##string array array count = serialize.readVariant(stream) array = [] for i in range(count): sub_count = serialize.readVariant(stream) sub_array = [] for j in range(sub_count): sub_array.append(serialize.readString(stream)) array.append(sub_array) self.setStringArrayArray(key, array) elif self.param_type_float_array_array == value_type: ##float array array count = serialize.readVariant(stream) array = [] for i in range(count): sub_count = serialize.readVariant(stream) sub_array = [] for j in range(sub_count): sub_array.append(serialize.readFloat(stream)) array.append(sub_array) self.setFloatArrayArray(key, array) ##next key data = stream.read(2)
def unpackageFromRawdata(data): result = [] stream = io.BytesIO(data) command_type = serialize.readVariant(stream) while command_type is not None: session = serialize.readVariant(stream) if TransportCommand.type_connect_request == command_type: ##connect request command = ConnectRequest() command.session = session command.client_key = serialize.readString(stream) command.digest = serialize.readString(stream) command.sender = serialize.readVariant(stream) command.name = serialize.readString(stream) command.ip = serialize.readString(stream) command.port = serialize.readVariant(stream) result.append(command) elif TransportCommand.type_connect_response == command_type: ##connect response command = ConnectResponse() command.session = session bool_value = serialize.readVariant(stream) if 1 == (bool_value >> 1): command.success = True else: command.success = False if 1 == (bool_value&0x01): command.need_digest = True else: command.need_digest = False command.client_key = serialize.readString(stream) command.server_key = serialize.readString(stream) command.sender = serialize.readVariant(stream) command.name = serialize.readString(stream) command.ip = serialize.readString(stream) command.port = serialize.readVariant(stream) result.append(command) elif TransportCommand.type_connect_acknowledge == command_type: command = ConnectAcknowledge() command.session = session command.name = serialize.readString(stream) result.append(command) elif TransportCommand.type_disconnect_request == command_type: command = DisconnectRequest() command.session = session command.name = serialize.readString(stream) result.append(command) elif TransportCommand.type_disconnect_response == command_type: command = DisconnectResponse() command.session = session if 1 == serialize.readVariant(stream): command.success = True else: command.success = False result.append(command) elif TransportCommand.type_keep_alive == command_type: command = KeepAlive() command.session = session command.name = serialize.readString(stream) result.append(command) elif TransportCommand.type_message_data == command_type: command = MessageData() command.session = session command.serial = serialize.readVariant(stream) command.index = serialize.readVariant(stream) command.total = serialize.readVariant(stream) command.data = serialize.readString(stream) result.append(command) ##next command command_type = serialize.readVariant(stream) ## print "unpackage %d commands from %d bytes"%( ## len(result), len(data)) return result