mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-14 15:56:23 -04:00
95 lines
3.4 KiB
Python
Executable File
95 lines
3.4 KiB
Python
Executable File
|
|
from otp.ai.AIBaseGlobal import *
|
|
from direct.directnotify import DirectNotifyGlobal
|
|
from direct.showbase.DirectObject import DirectObject
|
|
|
|
|
|
class AsyncRequest(DirectObject):
|
|
def __init__(self, manager, air, replyToChannelId=None, timeout=4.0):
|
|
assert self.notify.debugCall()
|
|
#DirectObject.DirectObject.__init__(self)
|
|
self.manager=manager
|
|
self.air=air
|
|
self.replyToChannelId=replyToChannelId
|
|
self.neededObjects={}
|
|
self.timeoutTask=taskMgr.doMethodLater(timeout, self.timeout, "AsyncRequestTimer-%s"%(id(self,)))
|
|
|
|
def delete(self):
|
|
assert self.notify.debugCall()
|
|
self.timeoutTask.remove()
|
|
del self.timeoutTask
|
|
self.ignoreAll()
|
|
if 0:
|
|
for i in self.neededObjects.values():
|
|
if i is not None:
|
|
#self.air.unRegisterForChannel(o.account.doId)
|
|
#self.air.removeDOFromTables(o.account)
|
|
#if 0:
|
|
# o.account.delete()
|
|
# self.air.deleteObject(o.account.getDoId())
|
|
self.air.removeDOFromTables(i)
|
|
i.delete()
|
|
del self.neededObjects
|
|
del self.manager
|
|
del self.air
|
|
del self.replyToChannelId
|
|
#DirectObject.DirectObject.delete(self)
|
|
|
|
def timeout(self, task):
|
|
"""
|
|
If this is called we have not gotten the needed objects in the timeout
|
|
period. Derived classes should inform the user or whomever and then
|
|
call this base method to cleanup.
|
|
"""
|
|
assert self.notify.debugCall("neededObjects: %s"%(self.neededObjects,))
|
|
self.delete()
|
|
|
|
def _checkCompletion(self, name, context, distObj):
|
|
"""
|
|
This checks whether we have all the needed objects and calls
|
|
finish() if we do.
|
|
"""
|
|
assert self.notify.debugCall()
|
|
if name is not None:
|
|
self.neededObjects[name]=distObj
|
|
else:
|
|
self.neededObjects[distObj.doId]=distObj
|
|
for i in self.neededObjects.values():
|
|
if i is None:
|
|
return
|
|
self.finish()
|
|
|
|
def askForObject(self, doId, context=None):
|
|
"""
|
|
Request an already created object, i.e. read from database.
|
|
"""
|
|
assert self.notify.debugCall()
|
|
object = self.air.doId2do.get(doId)
|
|
if object is not None:
|
|
self._checkCompletion(None, context, object)
|
|
else:
|
|
if context is None:
|
|
context=self.air.allocateContext()
|
|
self.accept("doRequestResponse-%s"%(context,), self._checkCompletion, [None])
|
|
self.air.queryObjectSnapshot(doId, context)
|
|
|
|
def createObject(self, name, className, context=None):
|
|
"""
|
|
Create a new database object. You can get the doId from within
|
|
your self.finish() function.
|
|
"""
|
|
assert self.notify.debugCall()
|
|
if context is None:
|
|
context=self.air.allocateContext()
|
|
self.accept("doRequestResponse-%s"%(context,), self._checkCompletion, [name])
|
|
self.air.requestDatabaseGenerate(className, context)
|
|
|
|
def finish(self):
|
|
"""
|
|
This is the function that gets called when all of the needed objects are in.
|
|
I.e. all the askForObject and createObject requests have been satisfied.
|
|
If the other requests timeout, finish will not be called.
|
|
"""
|
|
assert self.notify.debugCall()
|
|
self.delete()
|