|
@@ -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', [])
|