DistributedLargeBlobSender.py 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. """DistributedLargeBlobSender module: contains the DistributedLargeBlobSender class"""
  2. from direct.distributed import DistributedObject
  3. from direct.directnotify import DirectNotifyGlobal
  4. from direct.showbase.MessengerGlobal import messenger
  5. from . import LargeBlobSenderConsts
  6. class DistributedLargeBlobSender(DistributedObject.DistributedObject):
  7. """DistributedLargeBlobSender: for sending large chunks of data through
  8. the DC system"""
  9. notify = DirectNotifyGlobal.directNotify.newCategory('DistributedLargeBlobSender')
  10. def __init__(self, cr):
  11. DistributedObject.DistributedObject.__init__(self, cr)
  12. def generate(self):
  13. DistributedLargeBlobSender.notify.debug('generate')
  14. DistributedObject.DistributedObject.generate(self)
  15. self.complete = 0
  16. self.doneEvent = None
  17. def setMode(self, mode):
  18. self.mode = mode
  19. self.useDisk = mode & LargeBlobSenderConsts.USE_DISK
  20. def setTargetAvId(self, avId):
  21. self.targetAvId = avId
  22. def announceGenerate(self):
  23. DistributedLargeBlobSender.notify.debug('announceGenerate')
  24. DistributedObject.DistributedObject.announceGenerate(self)
  25. if self.targetAvId != base.localAvatar.doId:
  26. # it's not for us
  27. return
  28. if not self.useDisk:
  29. self.blob = ''
  30. def setChunk(self, chunk):
  31. DistributedLargeBlobSender.notify.debug('setChunk')
  32. assert not self.useDisk
  33. if len(chunk) > 0:
  34. self.blob += chunk
  35. else:
  36. self.privOnBlobComplete()
  37. def setFilename(self, filename):
  38. DistributedLargeBlobSender.notify.debug('setFilename: %s' % filename)
  39. assert self.useDisk
  40. import os
  41. origDir = os.getcwd()
  42. bPath = LargeBlobSenderConsts.getLargeBlobPath()
  43. try:
  44. os.chdir(bPath)
  45. except OSError:
  46. DistributedLargeBlobSender.notify.error(
  47. 'could not access %s' % bPath)
  48. f = open(filename, 'rb')
  49. self.blob = f.read()
  50. f.close()
  51. os.unlink(filename)
  52. os.chdir(origDir)
  53. self.privOnBlobComplete()
  54. def isComplete(self):
  55. """ returns non-zero if we've got the full blob """
  56. return self.complete
  57. def setDoneEvent(self, event):
  58. self.doneEvent = event
  59. def privOnBlobComplete(self):
  60. assert not self.isComplete()
  61. self.complete = 1
  62. # announce that we've got it?
  63. if self.doneEvent is not None:
  64. messenger.send(self.doneEvent, [self.blob])
  65. def getBlob(self):
  66. """ returns the full blob """
  67. assert self.isComplete()
  68. return self.blob
  69. def sendAck(self):
  70. self.sendUpdate('setAck', [])