From 4b83cf89f59bf312ee6182c197d68e2c0f3404de Mon Sep 17 00:00:00 2001 From: "locklainn.linden" Date: Thu, 7 Aug 2008 20:02:45 +0000 Subject: [PATCH] UDP communication with SIM! --- pyogp/lib/base/message/data_packer.py | 78 ++++++++++++------------ pyogp/lib/base/message/data_unpacker.py | 79 +++++++++++++------------ pyogp/lib/base/network/net.py | 14 +++-- 3 files changed, 90 insertions(+), 81 deletions(-) diff --git a/pyogp/lib/base/message/data_packer.py b/pyogp/lib/base/message/data_packer.py index decad90..0835b4c 100644 --- a/pyogp/lib/base/message/data_packer.py +++ b/pyogp/lib/base/message/data_packer.py @@ -4,61 +4,63 @@ from pyogp.lib.base.message.message_types import MsgType, EndianType class DataPacker(object): def __init__(self): - self.endian = EndianType.BIG self.packer = {} - self.packer[MsgType.MVT_VARIABLE] = self.__pack_string - self.packer[MsgType.MVT_U8] = 'B' - self.packer[MsgType.MVT_U16] = 'H' - self.packer[MsgType.MVT_U32] = 'I' - self.packer[MsgType.MVT_U64] = 'Q' - self.packer[MsgType.MVT_S8] = 'b' - self.packer[MsgType.MVT_S16] = 'h' - self.packer[MsgType.MVT_S32] = 'i' - self.packer[MsgType.MVT_S64] = 'q' - self.packer[MsgType.MVT_F32] = 'f' - self.packer[MsgType.MVT_F64] = 'd' - self.packer[MsgType.MVT_LLVector3] = self.__pack_vector3 - self.packer[MsgType.MVT_LLVector3d] = self.__pack_vector3d - self.packer[MsgType.MVT_LLVector4] = self.__pack_vector4 - self.packer[MsgType.MVT_LLQuaternion] = self.__pack_quat - self.packer[MsgType.MVT_LLUUID] = self.__pack_uuid - self.packer[MsgType.MVT_BOOL] = 'B' - self.packer[MsgType.MVT_IP_ADDR] = self.__pack_string - self.packer[MsgType.MVT_IP_PORT] = 'H' + self.packer[MsgType.MVT_VARIABLE] = ('>', self.__pack_string) + self.packer[MsgType.MVT_S8] = ('>', 'b') + self.packer[MsgType.MVT_U8] = ('>','B') + self.packer[MsgType.MVT_BOOL] = ('>','B') + self.packer[MsgType.MVT_LLUUID] = ('>',self.__pack_uuid) + self.packer[MsgType.MVT_IP_ADDR] = ('>',self.__pack_string) + self.packer[MsgType.MVT_IP_PORT] = ('>','H') + self.packer[MsgType.MVT_U16] = ('<','H') + self.packer[MsgType.MVT_U32] = ('<','I') + self.packer[MsgType.MVT_U64] = ('<','Q') + self.packer[MsgType.MVT_S16] = ('<','h') + self.packer[MsgType.MVT_S32] = ('<','i') + self.packer[MsgType.MVT_S64] = ('<','q') + self.packer[MsgType.MVT_F32] = ('<','f') + self.packer[MsgType.MVT_F64] = ('<','d') + self.packer[MsgType.MVT_LLVector3] = ('<',self.__pack_vector3) + self.packer[MsgType.MVT_LLVector3d] = ('<',self.__pack_vector3d) + self.packer[MsgType.MVT_LLVector4] = ('<',self.__pack_vector4) + self.packer[MsgType.MVT_LLQuaternion] = ('<',self.__pack_quat) def pack_data(self, data, data_type, endian_type=EndianType.NONE): - if endian_type != EndianType.NONE: - self.endian = endian_type - if data_type in self.packer: - pack = self.packer[data_type] + pack_tup = self.packer[data_type] + endian = pack_tup[0] + #override endian + if endian_type != EndianType.NONE: + endian = endian_type + + pack = pack_tup[1] if callable(pack): - return pack(data) + return pack(endian, data) else: - return struct.pack(self.endian + pack, data) + return struct.pack(endian + pack, data) return None - def __pack_tuple(self, tup, tp): + def __pack_tuple(self, endian, tup, tp): size = len(tup) - return struct.pack(self.endian + str(size) + tp, *tup) + return struct.pack(endian + str(size) + tp, *tup) - def __pack_vector3(self, vec): - return __pack_tuple(vec, 'f') + def __pack_vector3(self, endian, vec): + return __pack_tuple(endian, vec, 'f') - def __pack_vector3d(self, vec): - return __pack_tuple(vec, 'd') + def __pack_vector3d(self, endian, vec): + return __pack_tuple(endian,vec, 'd') - def __pack_vector4(self, vec): - return __pack_tuple(vec, 'f') + def __pack_vector4(self, endian, vec): + return __pack_tuple(endian, vec, 'f') - def __pack_quat(self, quat): + def __pack_quat(self, endian, quat): #first, pack to vector3 vec = quat_to_vec3(quat) - return __pack_vector3(vec) + return __pack_vector3(vendian, ec) - def __pack_uuid(self, uuid): + def __pack_uuid(self, endian, uuid): return uuid.bytes - def __pack_string(self, pack_string): + def __pack_string(self, endian, pack_string): return pack_string diff --git a/pyogp/lib/base/message/data_unpacker.py b/pyogp/lib/base/message/data_unpacker.py index 38e890d..b4d0ae2 100644 --- a/pyogp/lib/base/message/data_unpacker.py +++ b/pyogp/lib/base/message/data_unpacker.py @@ -5,33 +5,29 @@ from pyogp.lib.base.message.message_types import MsgType, EndianType, sizeof class DataUnpacker(object): def __init__(self): - self.endian = EndianType.BIG self.unpacker = {} - self.unpacker[MsgType.MVT_VARIABLE] = self.__unpack_string - self.unpacker[MsgType.MVT_U8] = 'B' - self.unpacker[MsgType.MVT_U16] = 'H' - self.unpacker[MsgType.MVT_U32] = 'I' - self.unpacker[MsgType.MVT_U64] = 'Q' - self.unpacker[MsgType.MVT_S8] = 'b' - self.unpacker[MsgType.MVT_S16] = 'h' - self.unpacker[MsgType.MVT_S32] = 'i' - self.unpacker[MsgType.MVT_S64] = 'q' - self.unpacker[MsgType.MVT_F32] = 'f' - self.unpacker[MsgType.MVT_F64] = 'd' - self.unpacker[MsgType.MVT_LLVector3] = self.__unpack_vector3 - self.unpacker[MsgType.MVT_LLVector3d] = self.__unpack_vector3d - self.unpacker[MsgType.MVT_LLVector4] = self.__unpack_vector4 - self.unpacker[MsgType.MVT_LLQuaternion] = self.__unpack_quat - self.unpacker[MsgType.MVT_LLUUID] = self.__unpack_uuid - self.unpacker[MsgType.MVT_BOOL] = 'B' - self.unpacker[MsgType.MVT_IP_ADDR] = self.__unpack_string - self.unpacker[MsgType.MVT_IP_PORT] = 'H' + self.unpacker[MsgType.MVT_VARIABLE] = ('>', self.__unpack_string) + self.unpacker[MsgType.MVT_S8] = ('>', 'b') + self.unpacker[MsgType.MVT_U8] = ('>','B') + self.unpacker[MsgType.MVT_BOOL] = ('>','B') + self.unpacker[MsgType.MVT_LLUUID] = ('>',self.__unpack_uuid) + self.unpacker[MsgType.MVT_IP_ADDR] = ('>',self.__unpack_string) + self.unpacker[MsgType.MVT_IP_PORT] = ('>','H') + self.unpacker[MsgType.MVT_U16] = ('<','H') + self.unpacker[MsgType.MVT_U32] = ('<','I') + self.unpacker[MsgType.MVT_U64] = ('<','Q') + self.unpacker[MsgType.MVT_S16] = ('<','h') + self.unpacker[MsgType.MVT_S32] = ('<','i') + self.unpacker[MsgType.MVT_S64] = ('<','q') + self.unpacker[MsgType.MVT_F32] = ('<','f') + self.unpacker[MsgType.MVT_F64] = ('<','d') + self.unpacker[MsgType.MVT_LLVector3] = ('<',self.__unpack_vector3) + self.unpacker[MsgType.MVT_LLVector3d] = ('<',self.__unpack_vector3d) + self.unpacker[MsgType.MVT_LLVector4] = ('<',self.__unpack_vector4) + self.unpacker[MsgType.MVT_LLQuaternion] = ('<',self.__unpack_quat) def unpack_data(self, data, data_type, start_index=0, \ var_size=0, endian_type=EndianType.NONE): - if endian_type != EndianType.NONE: - self.endian = endian_type - if start_index != 0: if var_size != 0: data = data[start_index:start_index+var_size] @@ -39,34 +35,41 @@ class DataUnpacker(object): data = data[start_index:start_index+sizeof(data_type)] if data_type in self.unpacker: - unpack = self.unpacker[data_type] + unpack_tup = self.unpacker[data_type] + endian = unpack_tup[0] + #override endian + if endian_type != EndianType.NONE: + endian = endian_type + + unpack = unpack_tup[1] if callable(unpack): - return unpack(data) + return unpack(endian, data) else: - return struct.unpack(self.endian + unpack, data)[0] + return struct.unpack(endian + unpack, data)[0] return None - def __unpack_tuple(self, tup, tp): + def __unpack_tuple(self, endian, tup, tp): size = len(tup) / struct.calcsize(tp) - return struct.unpack(self.endian + str(size) + tp, tup) + return struct.unpack(endian + str(size) + tp, tup) - def __unpack_vector3(self, vec): - return __unpack_tuple(vec, 'f') + def __unpack_vector3(self, endian, vec): + return self.__unpack_tuple(endian, vec, 'f') - def __unpack_vector3d(self, vec): - return __unpack_tuple(vec, 'd') + def __unpack_vector3d(self, endian, vec): + return self.__unpack_tuple(endian, vec, 'd') - def __unpack_vector4(self, vec): - return __unpack_tuple(vec, 'f') + def __unpack_vector4(self, endian, vec): + return self.__unpack_tuple(endian, vec, 'f') - def __unpack_quat(self, quat): + def __unpack_quat(self, endian, quat): #first, pack to vector3 + print "WARNING: UNPACKING A QUAT...." vec = quat_to_vec3(quat) - return __unpack_vector3(vec) + return self.__unpack_vector3(endian, vec) - def __unpack_uuid(self, uuid_data): + def __unpack_uuid(self, endian, uuid_data): return UUID(bytes=uuid_data) - def __unpack_string(self, pack_string): + def __unpack_string(self, endian, pack_string): return pack_string diff --git a/pyogp/lib/base/network/net.py b/pyogp/lib/base/network/net.py index 7884ce6..0cfa8e5 100644 --- a/pyogp/lib/base/network/net.py +++ b/pyogp/lib/base/network/net.py @@ -10,10 +10,10 @@ class NetUDPClient(object): implements(IUDPClient) def __init__(self): - self.sender = None + self.sender = Host(None, None) def get_sender(self): - return Host(self.sender.host, self.sender.port) + return self.sender def send_packet(self, sock, send_buffer, host): print 'Sending to: ' + str(host.ip) + ":" + str(host.port) @@ -21,9 +21,13 @@ class NetUDPClient(object): def receive_packet(self, sock): buf = 10000 - data, addr = sock.recvfrom(buf) - self.sender.ip_addr = addr - self.sender.port() + try: + data, addr = sock.recvfrom(buf) + print "Received data: " + repr(data) + except: + return '', 0 + self.sender.ip = addr[0] + self.sender.port = addr[1] return data, len(data) def start_udp_connection(self, port):