datagram improvements

This commit is contained in:
Joe Shochet 2004-04-09 22:56:34 +00:00
parent 4805d1285c
commit bc70d28fc5
7 changed files with 151 additions and 156 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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