| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- """DistributedLargeBlobSender module: contains the DistributedLargeBlobSender class"""
- from direct.distributed import DistributedObject
- from direct.directnotify import DirectNotifyGlobal
- from direct.showbase.MessengerGlobal import messenger
- from . 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 != base.localAvatar.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: %s' % filename)
- assert self.useDisk
- import os
- origDir = os.getcwd()
- bPath = LargeBlobSenderConsts.getLargeBlobPath()
- try:
- os.chdir(bPath)
- except OSError:
- DistributedLargeBlobSender.notify.error(
- 'could not access %s' % bPath)
- f = open(filename, 'rb')
- self.blob = f.read()
- f.close()
- os.unlink(filename)
- os.chdir(origDir)
- 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', [])
|