async def write(self, msg: protobuf.MessageType, field_cache: protobuf.FieldCache = None) -> None: if __debug__: log.debug(__name__, "%s:%x write: %s", self.iface.iface_num(), self.sid, msg) if field_cache is None: field_cache = self._field_cache # write the message msg_size = protobuf.count_message(msg, field_cache) # prepare buffer if msg_size <= len(self.buffer_writer.buffer): # reuse preallocated buffer_writer = self.buffer_writer else: # message is too big, we need to allocate a new buffer buffer_writer = utils.BufferWriter(bytearray(msg_size)) buffer_writer.seek(0) protobuf.dump_message(buffer_writer, msg, field_cache) await codec_v1.write_message( self.iface, msg.MESSAGE_WIRE_TYPE, memoryview(buffer_writer.buffer)[:msg_size], ) # make sure we don't keep around fields of all protobuf types ever self._field_cache.clear()
def set(auth_message: protobuf.MessageType) -> None: buffer = bytearray(protobuf.count_message(auth_message)) writer = utils.BufferWriter(buffer) protobuf.dump_message(writer, auth_message) storage.cache.set( storage.cache.APP_COMMON_AUTHORIZATION_TYPE, auth_message.MESSAGE_WIRE_TYPE.to_bytes(2, "big"), ) storage.cache.set(storage.cache.APP_COMMON_AUTHORIZATION_DATA, buffer)
async def write(self, msg: protobuf.MessageType) -> None: writer = self.make_writer() if __debug__: log.debug(__name__, "%s:%x write: %s", self.iface.iface_num(), self.sid, msg) # get the message size fields = msg.get_fields() size = protobuf.count_message(msg, fields) # write the message writer.setheader(msg.MESSAGE_WIRE_TYPE, size) await protobuf.dump_message(writer, msg, fields) await writer.aclose()
async def write(self, msg): """ Write a protobuf message to this wire context. """ writer = self.getwriter() if __debug__: log.debug(__name__, "%s:%x write: %s", self.iface.iface_num(), self.sid, msg) # get the message size fields = msg.get_fields() size = protobuf.count_message(msg, fields) # write the message writer.setheader(msg.MESSAGE_WIRE_TYPE, size) await protobuf.dump_message(writer, msg, fields) await writer.aclose()
def test_validate_enum(self): # ok message: msg = Message(-42, 5) length = protobuf.count_message(msg) buffer_writer = BufferWriter(bytearray(length)) protobuf.dump_message(buffer_writer, msg) buffer_reader = BufferReader(buffer_writer.buffer) nmsg = protobuf.load_message(buffer_reader, Message) self.assertEqual(msg.sint_field, nmsg.sint_field) self.assertEqual(msg.enum_field, nmsg.enum_field) # bad enum value: buffer_writer.seek(0) msg = Message(-42, 42) # XXX this assumes the message will have equal size protobuf.dump_message(buffer_writer, msg) buffer_reader.seek(0) with self.assertRaises(TypeError): protobuf.load_message(buffer_reader, Message)
def dump_message(msg: protobuf.MessageType) -> bytearray: length = protobuf.count_message(msg) buffer = bytearray(length) protobuf.dump_message(BufferWriter(buffer), msg) return buffer