소스 검색

datagram improvements

Joe Shochet 22 년 전
부모
커밋
bc70d28fc5

+ 11 - 10
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)

+ 3 - 2
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

+ 2 - 1
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

+ 4 - 2
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()

+ 126 - 0
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 <if> 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
+
+

+ 5 - 3
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

+ 0 - 138
direct/src/extensions/DatagramIterator-extensions.py

@@ -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
-
-