Source code for pokerthproto.transport

# -*- coding: utf-8 -*-
"""
The low-level transport functionality for packing/unpacking and enveloping/
developing messages.
"""

from __future__ import print_function, absolute_import, division

from .pokerth_pb2 import PokerTHMessage

__author__ = 'Florian Wilhelm'
__copyright__ = 'Florian Wilhelm'


[docs]def makeSizeBytes(n): """ Create a 4 bytes string that encodes the number ``n``. :param n: integer :return: 4 bytes string """ return str(bytearray.fromhex(b'{:08x}'.format(n)))
[docs]def readSizeBytes(string): """ Reads the 4 byte size-string and returns the size as integer. :param string: 4 byte size-string :return: integer """ assert len(string) == 4 return int(string.encode('hex'), 16)
[docs]def unpack(data): """ Unpacks/Deserializes a PokerTH network messsage. :param data: data as string :return: PokerTHMessage object containing the message """ envelope = PokerTHMessage() envelope.ParseFromString(data) return envelope
[docs]def pack(envelope): """ Packs/Serializes a PokerTHMessage to a data string. :param envelope: PokerTHMessage envelope :return: data as string """ data = envelope.SerializeToString() size_bytes = makeSizeBytes(len(data)) return size_bytes + data
[docs]def develop(envelope): """ Remove the envelope from a message. :param envelope: PokerTHMessage object that envelops a message :return: PokerTH message from the envelope """ msg = [v for _, v in envelope.ListFields() if v != envelope.messageType] assert len(msg) == 1 assert msg[0].IsInitialized() return msg[0]
def _getEnvelopeAttr(msg_name): """ Get attribute name of an envelope for a given message name. :param msg_name: name of message :return: attribute name of message """ return msg_name[0].lower() + msg_name[1:] def _getMsgTypeAttr(msg_name): """ Get the attribute name for the type of a message. :param msg_name: name of message :return: attribute name of message's type """ return "Type_{}".format(msg_name)
[docs]def envelop(msg): """ Put a message into an envelope. :param msg: PokerTH message object :return: message wrapped in a PokerTHMessage object """ msg_name = msg.__class__.__name__ envelope = PokerTHMessage() envelope_msg = getattr(envelope, _getEnvelopeAttr(msg_name)) envelope_msg.MergeFrom(msg) msg_type = getattr(envelope, _getMsgTypeAttr(msg_name)) setattr(envelope, 'messageType', msg_type) return envelope