diff --git a/direct/src/directutil/DistributedLargeBlobSender.py b/direct/src/directutil/DistributedLargeBlobSender.py new file mode 100755 index 0000000000..5772b41a97 --- /dev/null +++ b/direct/src/directutil/DistributedLargeBlobSender.py @@ -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', []) diff --git a/direct/src/directutil/DistributedLargeBlobSenderAI.py b/direct/src/directutil/DistributedLargeBlobSenderAI.py new file mode 100755 index 0000000000..c7c2b04a0d --- /dev/null +++ b/direct/src/directutil/DistributedLargeBlobSenderAI.py @@ -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() diff --git a/direct/src/directutil/LargeBlobSenderConsts.py b/direct/src/directutil/LargeBlobSenderConsts.py new file mode 100755 index 0000000000..6e3ea614af --- /dev/null +++ b/direct/src/directutil/LargeBlobSenderConsts.py @@ -0,0 +1,5 @@ +"""LargeBlobSenderConsts module""" + +USE_DISK = 0x01 + +ChunkSize = 100