added DistributedLargeBlobSender

This commit is contained in:
Darren Ranalli 2003-10-04 01:04:04 +00:00
parent d24581e411
commit 5528735c9b
3 changed files with 124 additions and 0 deletions

View File

@ -0,0 +1,75 @@
"""DistributedLargeBlobSender module: contains the DistributedLargeBlobSender class"""
import DistributedObject
import DirectNotifyGlobal
import LargeBlobSenderConsts
class DistributedLargeBlobSender(DistributedObject.DistributedObject):
"""DistributedLargeBlobSender: for sending large chunks of data through
the DC system"""
notify = DirectNotifyGlobal.directNotify.newCategory('DistributedLargeBlobSender')
def __init__(self, cr):
DistributedObject.DistributedObject.__init__(self, cr)
def generate(self):
DistributedLargeBlobSender.notify.debug('generate')
DistributedObject.DistributedObject.generate(self)
self.complete = 0
self.doneEvent = None
def setMode(self, mode):
self.mode = mode
self.useDisk = mode & LargeBlobSenderConsts.USE_DISK
def setTargetAvId(self, avId):
self.targetAvId = avId
def announceGenerate(self):
DistributedLargeBlobSender.notify.debug('announceGenerate')
DistributedObject.DistributedObject.announceGenerate(self)
if self.targetAvId != toonbase.localToon.doId:
# it's not for us
return
if not self.useDisk:
self.blob = ''
def setChunk(self, chunk):
DistributedLargeBlobSender.notify.debug('setChunk')
assert not self.useDisk
if len(chunk) > 0:
self.blob += chunk
else:
self.privOnBlobComplete()
def setFilename(self, filename):
DistributedLargeBlobSender.notify.debug('setFilename')
assert self.useDisk
self.blob = ''
DistributedLargeBlobSender.notify.error(
'large blob transfer by file not yet implemented')
self.privOnBlobComplete()
def isComplete(self):
""" returns non-zero if we've got the full blob """
return self.complete
def setDoneEvent(self, event):
self.doneEvent = event
def privOnBlobComplete(self):
assert not self.isComplete()
self.complete = 1
# announce that we've got it?
if self.doneEvent is not None:
messenger.send(self.doneEvent, [self.blob])
def getBlob(self):
""" returns the full blob """
assert self.isComplete()
return self.blob
def sendAck(self):
self.sendUpdate('setAck', [])

View File

@ -0,0 +1,44 @@
"""DistributedLargeBlobSenderAI module: contains the DistributedLargeBlobSenderAI class"""
import DistributedObjectAI
import DirectNotifyGlobal
import LargeBlobSenderConsts
class DistributedLargeBlobSenderAI(DistributedObjectAI.DistributedObjectAI):
"""DistributedLargeBlobSenderAI: for sending large chunks of data through
the DC system to a specific avatar"""
notify = DirectNotifyGlobal.directNotify.newCategory('DistributedLargeBlobSenderAI')
def __init__(self, air, zoneId, targetAvId, data, useDisk=0):
DistributedObjectAI.DistributedObjectAI.__init__(self, air)
self.targetAvId = targetAvId
self.mode = 0
if useDisk:
self.mode |= LargeBlobSenderConsts.USE_DISK
self.generateWithRequired(zoneId)
# send the data
if useDisk:
DistributedLargeBlobSenderAI.notify.error(
'large blob transfer by file not yet implemented')
else:
s = str(data)
chunkSize = LargeBlobSenderConsts.ChunkSize
while len(s):
self.sendUpdateToAvatarId(self.targetAvId,
'setChunk', [s[:chunkSize]])
s = s[chunkSize:]
# send final empty string
self.sendUpdateToAvatarId(self.targetAvId, 'setChunk', [''])
def getMode(self):
return self.mode
def getTargetAvId(self):
return self.targetAvId
def setAck(self):
DistributedLargeBlobSenderAI.notify.debug('setAck')
self.requestDelete()

View File

@ -0,0 +1,5 @@
"""LargeBlobSenderConsts module"""
USE_DISK = 0x01
ChunkSize = 100