diff --git a/direct/src/cluster/ClusterMsgs.py b/direct/src/cluster/ClusterMsgs.py index b1c9c01194..a355f6b9d4 100644 --- a/direct/src/cluster/ClusterMsgs.py +++ b/direct/src/cluster/ClusterMsgs.py @@ -4,7 +4,8 @@ # both ClusterClient and ClusterServer. from PandaModules import * -import Datagram +from PyDatagram import PyDatagram +from PyDatagramIterator import PyDatagramIterator import time #these are the types of messages that are currently supported. @@ -87,14 +88,14 @@ class ClusterMsgHandler: return (datagram, dgi, type) def readHeader(self,datagram): - dgi = DatagramIterator(datagram) + dgi = PyDatagramIterator(datagram) number = dgi.getUint32() type = dgi.getUint8() self.notify.debug("Packet %d type %d received" % (number,type)) return (dgi,type) def makeCamOffsetDatagram(self,xyz,hpr): - datagram = Datagram.Datagram() + datagram = PyDatagram() datagram.addUint32(self.packetNumber) self.packetNumber = self.packetNumber + 1 datagram.addUint8(CLUSTER_CAM_OFFSET) @@ -117,7 +118,7 @@ class ClusterMsgHandler: return (x,y,z,h,p,r) def makeCamFrustumDatagram(self,focalLength, filmSize, filmOffset): - datagram = Datagram.Datagram() + datagram = PyDatagram() datagram.addUint32(self.packetNumber) self.packetNumber = self.packetNumber + 1 datagram.addUint8(CLUSTER_CAM_FRUSTUM) @@ -138,7 +139,7 @@ class ClusterMsgHandler: return (focalLength, filmSize, filmOffset) def makeCamMovementDatagram(self,xyz,hpr): - datagram = Datagram.Datagram() + datagram = PyDatagram() datagram.addUint32(self.packetNumber) self.packetNumber = self.packetNumber + 1 datagram.addUint8(CLUSTER_CAM_MOVEMENT) @@ -162,7 +163,7 @@ class ClusterMsgHandler: return (x,y,z,h,p,r) def makeSelectedMovementDatagram(self,xyz,hpr,scale): - datagram = Datagram.Datagram() + datagram = PyDatagram() datagram.addUint32(self.packetNumber) self.packetNumber = self.packetNumber + 1 datagram.addUint8(CLUSTER_SELECTED_MOVEMENT) @@ -192,7 +193,7 @@ class ClusterMsgHandler: return (x,y,z,h,p,r,sx,sy,sz) def makeCommandStringDatagram(self, commandString): - datagram = Datagram.Datagram() + datagram = PyDatagram() datagram.addUint32(self.packetNumber) self.packetNumber = self.packetNumber + 1 datagram.addUint8(CLUSTER_COMMAND_STRING) @@ -204,21 +205,21 @@ class ClusterMsgHandler: return command def makeSwapNowDatagram(self): - datagram = Datagram.Datagram() + datagram = PyDatagram() datagram.addUint32(self.packetNumber) self.packetNumber = self.packetNumber + 1 datagram.addUint8(CLUSTER_SWAP_NOW) return datagram def makeSwapReadyDatagram(self): - datagram = Datagram.Datagram() + datagram = PyDatagram() datagram.addUint32(self.packetNumber) self.packetNumber = self.packetNumber + 1 datagram.addUint8(CLUSTER_SWAP_READY) return datagram def makeExitDatagram(self): - datagram = Datagram.Datagram() + datagram = PyDatagram() datagram.addUint32(self.packetNumber) self.packetNumber = self.packetNumber + 1 datagram.addUint8(CLUSTER_EXIT) diff --git a/direct/src/distributed/ClientRepository.py b/direct/src/distributed/ClientRepository.py index 9d7ee16ad2..b7ae21fff0 100644 --- a/direct/src/distributed/ClientRepository.py +++ b/direct/src/distributed/ClientRepository.py @@ -11,6 +11,7 @@ import PythonUtil import ParentMgr import RelatedObjectMgr import time +from PyDatagram import PyDatagram class ClientRepository(ConnectionRepository.ConnectionRepository): notify = DirectNotifyGlobal.directNotify.newCategory("ClientRepository") @@ -347,7 +348,7 @@ class ClientRepository(ConnectionRepository.ConnectionRepository): currentGameStateName) def sendSetShardMsg(self, shardId): - datagram = Datagram() + datagram = PyDatagram() # Add message type datagram.addUint16(CLIENT_SET_SHARD) # Add shard id @@ -356,7 +357,7 @@ class ClientRepository(ConnectionRepository.ConnectionRepository): self.send(datagram) def sendSetZoneMsg(self, zoneId, visibleZoneList=None): - datagram = Datagram() + datagram = PyDatagram() # Add message type datagram.addUint16(CLIENT_SET_ZONE) # Add zone id diff --git a/direct/src/distributed/ConnectionRepository.py b/direct/src/distributed/ConnectionRepository.py index c7d652fe96..aa3736ae2d 100644 --- a/direct/src/distributed/ConnectionRepository.py +++ b/direct/src/distributed/ConnectionRepository.py @@ -2,6 +2,7 @@ from PandaModules import * import Task import DirectNotifyGlobal import DirectObject +from PyDatagram import PyDatagram class ConnectionRepository(DirectObject.DirectObject): """ @@ -251,7 +252,7 @@ class ConnectionRepository(DirectObject.DirectObject): self.reportReaderStatistics() if self.connectHttp: - datagram = Datagram() + datagram = PyDatagram() if self.tcpConn.receiveDatagram(datagram): if self.rsDoReport: self.rsDatagramCount += 1 diff --git a/direct/src/distributed/DistributedObject.py b/direct/src/distributed/DistributedObject.py index 0670591503..7975852182 100644 --- a/direct/src/distributed/DistributedObject.py +++ b/direct/src/distributed/DistributedObject.py @@ -2,6 +2,8 @@ from PandaObject import * from DirectNotifyGlobal import * +from PyDatagram import PyDatagram +from PyDatagramIterator import PyDatagramIterator # Values for DistributedObject.activeState @@ -299,8 +301,8 @@ class DistributedObject(PandaObject): # handling whatever it should handle in its current state, it # should call doneBarrier(), which will send the context # number back to the AI. - dg = Datagram(data) - dgi = DatagramIterator(dg) + dg = PyDatagram(data) + dgi = PyDatagramIterator(dg) while dgi.getRemainingSize() > 0: context = dgi.getUint16() numToons = dgi.getUint16() diff --git a/direct/src/distributed/PyDatagramIterator.py b/direct/src/distributed/PyDatagramIterator.py new file mode 100755 index 0000000000..91c6854fc0 --- /dev/null +++ b/direct/src/distributed/PyDatagramIterator.py @@ -0,0 +1,126 @@ + +# This is built as a subclass instead of an extension so we can define the +# class variable FuncDict and so we can import DCSubatomicType at the top +# of the file rather than every time we call the putArg function. + +from PandaModules import * +# Import the type numbers +from DCSubatomicType import * + +class PyDatagramIterator(DatagramIterator): + + # This is a little helper Dict to replace the huge statement + # for trying to match up datagram subatomic types with add funtions + # If Python had an O(1) "case" statement we would use that instead + FuncDict = { + STInt8 : DatagramIterator.getInt8, + STInt16 : DatagramIterator.getInt16, + STInt32 : DatagramIterator.getInt32, + STInt64 : DatagramIterator.getInt64, + STUint8 : DatagramIterator.getUint8, + STUint16 : DatagramIterator.getUint16, + STUint32 : DatagramIterator.getUint32, + STUint64 : DatagramIterator.getUint64, + STFloat64 : DatagramIterator.getFloat64, + STString : DatagramIterator.getString, + STBlob : DatagramIterator.getString, + STBlob32 : DatagramIterator.getString32, + } + + def getArg(self, subatomicType, divisor=1): + # Import the type numbers + if divisor == 1: + # See if it is in the handy dict + getFunc = self.FuncDict.get(subatomicType) + if getFunc: + retVal = getFunc(self) + # No division necessary + elif subatomicType == STInt8array: + len = self.getUint16() + retVal = [] + for i in range(len): + retVal.append(self.getInt8()) + elif subatomicType == STInt16array: + len = self.getUint16() >> 1 + retVal = [] + for i in range(len): + retVal.append(self.getInt16()) + elif subatomicType == STInt32array: + len = self.getUint16() >> 2 + retVal = [] + for i in range(len): + retVal.append(self.getInt32()) + elif subatomicType == STUint8array: + len = self.getUint16() + retVal = [] + for i in range(len): + retVal.append(self.getUint8()) + elif subatomicType == STUint16array: + len = self.getUint16() >> 1 + retVal = [] + for i in range(len): + retVal.append(self.getUint16()) + elif subatomicType == STUint32array: + len = self.getUint16() >> 2 + retVal = [] + for i in range(len): + retVal.append(self.getUint32()) + elif subatomicType == STUint32uint8array: + len = self.getUint16() / 5 + retVal = [] + for i in range(len): + a = self.getUint32() + b = self.getUint8() + retVal.append((a, b)) + else: + raise Exception("Error: No such type as: " + str(subAtomicType)) + else: + # See if it is in the handy dict + getFunc = self.FuncDict.get(subatomicType) + if getFunc: + retVal = (getFunc(self)/float(divisor)) + elif subatomicType == STInt8array: + len = self.getUint8() >> 1 + retVal = [] + for i in range(len): + retVal.append(self.getInt8()/float(divisor)) + elif subatomicType == STInt16array: + len = self.getUint16() >> 1 + retVal = [] + for i in range(len): + retVal.append(self.getInt16()/float(divisor)) + elif subatomicType == STInt32array: + len = self.getUint16() >> 2 + retVal = [] + for i in range(len): + retVal.append(self.getInt32()/float(divisor)) + elif subatomicType == STUint8array: + len = self.getUint8() >> 1 + retVal = [] + for i in range(len): + retVal.append(self.getUint8()/float(divisor)) + elif subatomicType == STUint16array: + len = self.getUint16() >> 1 + retVal = [] + for i in range(len): + retVal.append(self.getUint16()/float(divisor)) + elif subatomicType == STUint32array: + len = self.getUint16() >> 2 + retVal = [] + for i in range(len): + retVal.append(self.getUint32()/float(divisor)) + elif subatomicType == STUint32uint8array: + len = self.getUint16() / 5 + retVal = [] + for i in range(len): + a = self.getUint32() + b = self.getUint8() + retVal.append((a / float(divisor), b / float(divisor))) + else: + raise Exception("Error: No such type as: " + str(subatomicType)) + + + + return retVal + + diff --git a/direct/src/distributed/ServerRepository.py b/direct/src/distributed/ServerRepository.py index c154484857..18721c6e9e 100644 --- a/direct/src/distributed/ServerRepository.py +++ b/direct/src/distributed/ServerRepository.py @@ -5,6 +5,8 @@ from TaskManagerGlobal import * from MsgTypes import * import Task import DirectNotifyGlobal +from PyDatagram import PyDatagram +from PyDatagramIterator import PyDatagramIterator class ServerRepository: @@ -63,19 +65,19 @@ class ServerRepository: def handleDatagram(self, datagram): print "Server got a datagram!" - dgi = DatagramIterator(datagram) + dgi = PyDatagramIterator(datagram) print dgi.getUint16() print dgi.getString() print dgi.getUint32() print dgi.getUint16() - newDatagram = Datagram() + newDatagram = PyDatagram() newDatagram.addUint16(LOGIN_RESPONSE) newDatagram.addUint8(ord('s')) self.cw.send(newDatagram, self.lastConnection) def sendAvatarGenerate(self): - datagram = Datagram() + datagram = PyDatagram() # Message type is 1 datagram.addUint16(ALL_OBJECT_GENERATE_WITH_REQUIRED) # Avatar class type is 2 diff --git a/direct/src/extensions/DatagramIterator-extensions.py b/direct/src/extensions/DatagramIterator-extensions.py deleted file mode 100644 index f4d4974dae..0000000000 --- a/direct/src/extensions/DatagramIterator-extensions.py +++ /dev/null @@ -1,138 +0,0 @@ - - def getArg(self, subatomicType, divisor=1): - # Import the type numbers - import DCSubatomicType - if divisor == 1: - # No division necessary - if subatomicType == DCSubatomicType.STInt8: - retVal = self.getInt8() - elif subatomicType == DCSubatomicType.STInt16: - retVal = self.getInt16() - elif subatomicType == DCSubatomicType.STInt32: - retVal = self.getInt32() - elif subatomicType == DCSubatomicType.STInt64: - retVal = self.getInt64() - elif subatomicType == DCSubatomicType.STUint8: - retVal = self.getUint8() - elif subatomicType == DCSubatomicType.STUint16: - retVal = self.getUint16() - elif subatomicType == DCSubatomicType.STUint32: - retVal = self.getUint32() - elif subatomicType == DCSubatomicType.STUint64: - retVal = self.getUint64() - elif subatomicType == DCSubatomicType.STFloat64: - retVal = self.getFloat64() - elif subatomicType == DCSubatomicType.STString: - retVal = self.getString() - elif subatomicType == DCSubatomicType.STBlob: - retVal = self.getString() - elif hasattr(DCSubatomicType, "STBlob32") and subatomicType == DCSubatomicType.STBlob32: - retVal = self.getString32() - elif subatomicType == DCSubatomicType.STInt8array: - len = self.getUint16() - retVal = [] - for i in range(len): - retVal.append(self.getInt8()) - elif subatomicType == DCSubatomicType.STInt16array: - len = self.getUint16() >> 1 - retVal = [] - for i in range(len): - retVal.append(self.getInt16()) - elif subatomicType == DCSubatomicType.STInt32array: - len = self.getUint16() >> 2 - retVal = [] - for i in range(len): - retVal.append(self.getInt32()) - elif subatomicType == DCSubatomicType.STUint8array: - len = self.getUint16() - retVal = [] - for i in range(len): - retVal.append(self.getUint8()) - elif subatomicType == DCSubatomicType.STUint16array: - len = self.getUint16() >> 1 - retVal = [] - for i in range(len): - retVal.append(self.getUint16()) - elif subatomicType == DCSubatomicType.STUint32array: - len = self.getUint16() >> 2 - retVal = [] - for i in range(len): - retVal.append(self.getUint32()) - elif subatomicType == DCSubatomicType.STUint32uint8array: - len = self.getUint16() / 5 - retVal = [] - for i in range(len): - a = self.getUint32() - b = self.getUint8() - retVal.append((a, b)) - else: - raise Exception("Error: No such type as: " + str(subAtomicType)) - else: - # This needs to be divided - if subatomicType == DCSubatomicType.STInt8: - retVal = (self.getInt8()/float(divisor)) - elif subatomicType == DCSubatomicType.STInt16: - retVal = (self.getInt16()/float(divisor)) - elif subatomicType == DCSubatomicType.STInt32: - retVal = (self.getInt32()/float(divisor)) - elif subatomicType == DCSubatomicType.STInt64: - retVal = (self.getInt64()/float(divisor)) - elif subatomicType == DCSubatomicType.STUint8: - retVal = (self.getUint8()/float(divisor)) - elif subatomicType == DCSubatomicType.STUint16: - retVal = (self.getUint16()/float(divisor)) - elif subatomicType == DCSubatomicType.STUint32: - retVal = (self.getUint32()/float(divisor)) - elif subatomicType == DCSubatomicType.STUint64: - retVal = (self.getUint64()/float(divisor)) - elif subatomicType == DCSubatomicType.STFloat64: - retVal = self.getFloat64() - elif subatomicType == DCSubatomicType.STString: - retVal = self.getString() - elif subatomicType == DCSubatomicType.STBlob: - retVal = self.getString() - elif subatomicType == DCSubatomicType.STInt8array: - len = self.getUint8() >> 1 - retVal = [] - for i in range(len): - retVal.append(self.getInt8()/float(divisor)) - elif subatomicType == DCSubatomicType.STInt16array: - len = self.getUint16() >> 1 - retVal = [] - for i in range(len): - retVal.append(self.getInt16()/float(divisor)) - elif subatomicType == DCSubatomicType.STInt32array: - len = self.getUint16() >> 2 - retVal = [] - for i in range(len): - retVal.append(self.getInt32()/float(divisor)) - elif subatomicType == DCSubatomicType.STUint8array: - len = self.getUint8() >> 1 - retVal = [] - for i in range(len): - retVal.append(self.getUint8()/float(divisor)) - elif subatomicType == DCSubatomicType.STUint16array: - len = self.getUint16() >> 1 - retVal = [] - for i in range(len): - retVal.append(self.getUint16()/float(divisor)) - elif subatomicType == DCSubatomicType.STUint32array: - len = self.getUint16() >> 2 - retVal = [] - for i in range(len): - retVal.append(self.getUint32()/float(divisor)) - elif subatomicType == DCSubatomicType.STUint32uint8array: - len = self.getUint16() / 5 - retVal = [] - for i in range(len): - a = self.getUint32() - b = self.getUint8() - retVal.append((a / float(divisor), b / float(divisor))) - else: - raise Exception("Error: No such type as: " + str(subatomicType)) - - - - return retVal - -