Bladeren bron

added DistributedLargeBlobSender

Darren Ranalli 22 jaren geleden
bovenliggende
commit
5528735c9b

+ 75 - 0
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', [])

+ 44 - 0
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()

+ 5 - 0
direct/src/directutil/LargeBlobSenderConsts.py

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