From bbf1b4b2a34e25bca91120995dc8318b5827dc18 Mon Sep 17 00:00:00 2001 From: Sebastian Hoffmann Date: Thu, 10 Jul 2014 03:14:42 +0200 Subject: [PATCH] Split up handleMessageType. Added "forgotten" types to MsgTypes. --- .../src/distributed/AstronClientRepository.py | 131 ++++++++++-------- direct/src/distributed/MsgTypes.py | 2 + direct/src/distributed/MsgTypesAstron.py | 32 ----- 3 files changed, 72 insertions(+), 93 deletions(-) delete mode 100644 direct/src/distributed/MsgTypesAstron.py diff --git a/direct/src/distributed/AstronClientRepository.py b/direct/src/distributed/AstronClientRepository.py index 8f0bddaad7..a665385201 100644 --- a/direct/src/distributed/AstronClientRepository.py +++ b/direct/src/distributed/AstronClientRepository.py @@ -2,7 +2,7 @@ from direct.directnotify import DirectNotifyGlobal from ClientRepositoryBase import ClientRepositoryBase -from MsgTypesAstron import * +from MsgTypes import * from direct.distributed.PyDatagram import PyDatagram from pandac.PandaModules import STUint16, STUint32 @@ -27,80 +27,48 @@ class AstronClientRepository(ClientRepositoryBase): # This is required by DoCollectionManager, even though it's not # used by this implementation. GameGlobalsId = 0 - + def __init__(self, *args, **kwargs): ClientRepositoryBase.__init__(self, *args, **kwargs) base.finalExitCallbacks.append(self.shutdown) - + self.message_handlers = {CLIENT_HELLO_RESP: self.handleHelloResp, + CLIENT_EJECT: self.handleEject, + CLIENT_ENTER_OBJECT_REQUIRED: self.handleEnterObjectRequired, + CLIENT_ENTER_OBJECT_REQUIRED_OWNER: self.handleEnterObjectRequiredOwner, + CLIENT_OBJECT_SET_FIELD: self.handleUpdateField, + CLIENT_OBJECT_SET_FIELDS: self.handleUpdateFields, + CLIENT_OBJECT_LEAVING: self.handleObjectLeaving, + CLIENT_OBJECT_LOCATION: self.handleObjectLocation, + CLIENT_ADD_INTEREST: self.handleAddInterest, + CLIENT_ADD_INTEREST_MULTIPLE: self.handleAddInterestMultiple, + CLIENT_REMOVE_INTEREST: self.handleRemoveInterest, + CLIENT_DONE_INTEREST_RESP: self.handleInterestDoneMessage, + } + # # Message Handling # def handleDatagram(self, di): msgType = self.getMsgType() - self.handleMessageType(msgType, di) - - def handleMessageType(self, msgType, di): - - # These are the messages to a client that Astron specifies. - - if msgType == CLIENT_HELLO_RESP: - messenger.send("CLIENT_HELLO_RESP", []) - elif msgType == CLIENT_EJECT: - error_code = di.get_uint16() - reason = di.get_string() - messenger.send("CLIENT_EJECT", [error_code, reason]) - elif msgType == CLIENT_ENTER_OBJECT_REQUIRED: - self.handleEnterObjectRequired(di) - elif msgType == CLIENT_ENTER_OBJECT_REQUIRED_OWNER: - self.handleEnterObjectRequiredOwner(di) - elif msgType == CLIENT_OBJECT_SET_FIELD: - self.handleUpdateField(di) - elif msgType == CLIENT_OBJECT_SET_FIELDS: - raise NotImplementedError("CLIENT_OBJECT_SET_FIELDS not implemented!") - # Can't test this without the server actually sending it. - # Here's some tentative code and notes: - #do_id = di.getUint32() - #field_count = di.getUint16() - #for i in range(0, field_count): - # field_id = di.getUint16() - # field = self.get_dc_file().get_field_by_index(field_id) - # # print(type(field)) - # # print(field) - # # FIXME: Get field type, unpack value, create and send message. - # # value = di.get?() - # # Assemble new message - elif msgType == CLIENT_OBJECT_LEAVING: - do_id = di.get_uint32() - dist_obj = self.doId2do.get(do_id) - dist_obj.delete() - self.deleteObject(do_id) - messenger.send("CLIENT_OBJECT_LEAVING", [do_id]) - elif msgType == CLIENT_OBJECT_LOCATION: - self.handleObjectLocation(di) - elif msgType == CLIENT_ADD_INTEREST: - context = di.get_uint32() - interest_id = di.get_uint16() - parent_id = di.get_uint32() - zone_id = di.get_uint32() - messenger.send("CLIENT_ADD_INTEREST", [context, interest_id, parent_id, zone_id]) - elif msgType == CLIENT_ADD_INTEREST_MULTIPLE: - context = di.get_uint32() - interest_id = di.get_uint16() - parent_id = di.get_uint32() - zone_ids = [di.get_uint32() for i in range(0, di.get_uint16())] - messenger.send("CLIENT_ADD_INTEREST_MULTIPLE", [context, interest_id, parent_id, zone_ids]) - elif msgType == CLIENT_REMOVE_INTEREST: - context = di.get_uint32() - interest_id = di.get_uint16() - messenger.send("CLIENT_REMOVE_INTEREST", [context, interest_id]) - elif msgType == CLIENT_DONE_INTEREST_RESP: - self.handleInterestDoneMessage(di) # Implemented in DoInterestManager.py + # self.handleMessageType(msgType, di) + # + #def handleMessageType(self, msgType, di): + if msgType in self.message_handlers: + self.message_handlers[msgType](di) else: self.notify.error("Got unknown message type %d!" % (msgType,)) self.considerHeartbeat() + def handleHelloResp(self, di): + messenger.send("CLIENT_HELLO_RESP", []) + + def handleEject(self, di): + error_code = di.get_uint16() + reason = di.get_string() + messenger.send("CLIENT_EJECT", [error_code, reason]) + def handleEnterObjectRequired(self, di): do_id = di.getArg(STUint32) parent_id = di.getArg(STUint32) @@ -158,6 +126,47 @@ class AstronClientRepository(ClientRepositoryBase): # updateRequiredFields calls announceGenerate return distObj + def handleUpdateFields(self, di): + # Can't test this without the server actually sending it. + self.notify.error("CLIENT_OBJECT_SET_FIELDS not implemented!") + # # Here's some tentative code and notes: + # do_id = di.getUint32() + # field_count = di.getUint16() + # for i in range(0, field_count): + # field_id = di.getUint16() + # field = self.get_dc_file().get_field_by_index(field_id) + # # print(type(field)) + # # print(field) + # # FIXME: Get field type, unpack value, create and send message. + # # value = di.get?() + # # Assemble new message + + def handleObjectLeaving(self, di): + do_id = di.get_uint32() + dist_obj = self.doId2do.get(do_id) + dist_obj.delete() + self.deleteObject(do_id) + messenger.send("CLIENT_OBJECT_LEAVING", [do_id]) + + def handleAddInterest(self, di): + context = di.get_uint32() + interest_id = di.get_uint16() + parent_id = di.get_uint32() + zone_id = di.get_uint32() + messenger.send("CLIENT_ADD_INTEREST", [context, interest_id, parent_id, zone_id]) + + def handleAddInterestMultiple(self, di): + context = di.get_uint32() + interest_id = di.get_uint16() + parent_id = di.get_uint32() + zone_ids = [di.get_uint32() for i in range(0, di.get_uint16())] + messenger.send("CLIENT_ADD_INTEREST_MULTIPLE", [context, interest_id, parent_id, zone_ids]) + + def handleRemoveInterest(self, di): + context = di.get_uint32() + interest_id = di.get_uint16() + messenger.send("CLIENT_REMOVE_INTEREST", [context, interest_id]) + def deleteObject(self, doId): """ implementation copied from ClientRepository.py diff --git a/direct/src/distributed/MsgTypes.py b/direct/src/distributed/MsgTypes.py index f839873bcc..b689214d10 100644 --- a/direct/src/distributed/MsgTypes.py +++ b/direct/src/distributed/MsgTypes.py @@ -15,10 +15,12 @@ MsgName2Id = { 'CLIENT_HEARTBEAT': 5, 'CLIENT_OBJECT_SET_FIELD': 120, + 'CLIENT_OBJECT_SET_FIELDS': 121, 'CLIENT_OBJECT_LEAVING': 132, 'CLIENT_OBJECT_LEAVING_OWNER': 161, 'CLIENT_ENTER_OBJECT_REQUIRED': 142, 'CLIENT_ENTER_OBJECT_REQUIRED_OTHER': 143, + 'CLIENT_ENTER_OBJECT_REQUIRED_OWNER': 172, 'CLIENT_ENTER_OBJECT_REQUIRED_OTHER_OWNER': 173, 'CLIENT_DONE_INTEREST_RESP': 204, diff --git a/direct/src/distributed/MsgTypesAstron.py b/direct/src/distributed/MsgTypesAstron.py deleted file mode 100644 index 5e94797361..0000000000 --- a/direct/src/distributed/MsgTypesAstron.py +++ /dev/null @@ -1,32 +0,0 @@ -"""MsgTypesAstron module: contains distributed object message types""" - -from direct.showbase.PythonUtil import invertDictLossless - -MsgName2Id = { - 'CLIENT_HELLO': 1, - 'CLIENT_HELLO_RESP': 2, - 'CLIENT_DISCONNECT': 3, - 'CLIENT_EJECT': 4, - 'CLIENT_HEARTBEAT': 5, - 'CLIENT_ENTER_OBJECT_REQUIRED': 142, - 'CLIENT_ENTER_OBJECT_REQUIRED_OTHER': 143, - 'CLIENT_ENTER_OBJECT_REQUIRED_OWNER': 172, - 'CLIENT_ENTER_OBJECT_REQUIRED_OTHER_OWNER': 173, - 'CLIENT_OBJECT_SET_FIELD': 120, - 'CLIENT_OBJECT_SET_FIELDS': 121, - 'CLIENT_OBJECT_LEAVING': 132, - 'CLIENT_OBJECT_LOCATION': 140, - 'CLIENT_ADD_INTEREST': 200, - 'CLIENT_ADD_INTEREST_MULTIPLE': 201, - 'CLIENT_REMOVE_INTEREST': 203, - 'CLIENT_DONE_INTEREST_RESP': 204, - } - -# create id->name table for debugging -MsgId2Names = invertDictLossless(MsgName2Id) - -# put msg names in module scope, assigned to msg value -for name, value in MsgName2Id.items(): - exec '%s = %s' % (name, value) -del name, value -