added DistributedLargeBlobSender
This commit is contained in:
parent
d24581e411
commit
5528735c9b
|
|
@ -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', [])
|
||||
|
|
@ -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()
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
"""LargeBlobSenderConsts module"""
|
||||
|
||||
USE_DISK = 0x01
|
||||
|
||||
ChunkSize = 100
|
||||
Loading…
Reference in New Issue