Panda3D
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Properties
Public Member Functions | Public Attributes | Static Public Attributes | List of all members
ClientRepositoryBase Class Reference
Inheritance diagram for ClientRepositoryBase:
ConnectionRepository DoInterestManager DoCollectionManager OldClientRepository

Public Member Functions

def __init__
 
def allocateContext
 
def considerHeartbeat
 
def disableDoId
 
def doDeferredGenerate
 
def doGenerate
 
def flushGenerates
 
def generateWithRequiredFields
 
def generateWithRequiredOtherFields
 
def generateWithRequiredOtherFieldsOwner
 
def getObjectsOfClass
 
def getObjectsOfExactClass
 
def getServerDelta
 
def getServerTimeOfDay
 
def getTables
 
def getWorld
 
def handleDelete
 
def handleGoGetLost
 
def handleServerHeartbeat
 
def handleSystemMessage
 
def handleSystemMessageAknowledge
 
def handleUpdateField
 
def isLive
 
def isLocalId
 
def printDelayDeletes
 
def replaceMethod
 
def replayDeferredGenerate
 
def sendHeartbeatTask
 
def setDeferInterval
 
def setServerDelta
 
def specialName
 def queryObjectAll(self, doID, context=0): """ Get a one-time snapshot look at the object. More...
 
def startHeartbeat
 
def stopHeartbeat
 
def waitForNextHeartBeat
 
- Public Member Functions inherited from ConnectionRepository
def __init__
 
def checkHttp
 
def connect
 
def disconnect
 
def generateGlobalObject
 
def getServerAddress
 
def handleDatagram
 
def handleReaderOverflow
 
def httpConnectCallback
 
def importModule
 
def lostConnection
 
def readDCFile
 
def readerPollOnce
 
def readerPollUntilEmpty
 
def send
 
def shutdown
 
def startReaderPollTask
 
def stopReaderPollTask
 
- Public Member Functions inherited from DoInterestManager
def __init__
 
def addAutoInterest
 
def addInterest
 
def alterInterest
 
def cleanupWaitAllInterestsComplete
 
def closeAutoInterests
 
def getAllInterestsCompleteEvent
 
def handleInterestDoneMessage
 
def isValidInterestHandle
 
def noNewInterests
 
def openAutoInterests
 
def printInterestHistory
 
def printInterests
 
def printInterestSets
 
def printInterestsIfDebug
 
def queueAllInterestsCompleteEvent
 
def removeAIInterest
 
def removeAutoInterest
 
def removeInterest
 
def resetInterestStateForConnectionLoss
 
def setAllInterestsCompleteCallback
 
def setNoNewInterests
 
def updateInterestDescription
 
- Public Member Functions inherited from DoCollectionManager
def __init__
 
def addDOToTables
 
def callbackWithDo
 
def callbackWithOwnerView
 
def countObjects
 
def deleteDistributedObjects
 
def deleteObjectLocation
 
def doByDistance
 
def doFind
 
def doFindAll
 
def doFindAllInstances
 
def doFindAllMatching
 
def doFindAllOfType
 
def dosByDistance
 
def findAnyOfType
 
def getAllOfType
 
def getDo
 
def getDoIdList
 
def getDoList
 
def getDoTable
 
def getGameDoId
 
def getObjectsInZone
 def changeDOZoneInTables(self, do, newParentId, newZoneId, oldParentId, oldZoneId): if 1: self.storeObjectLocation(do.doId, newParentId, newZoneId) else: #assert not hasattr(do, "isQueryAllResponse") or not do.isQueryAllResponse oldLocation = (oldParentId, oldZoneId) newLocation = (newParentId, newZoneId)

HACK: DistributedGuildMemberUD starts in -1, -1, which isnt ever put in the

zoneId2doIds table

if self.isValidLocationTuple(oldLocation): assert self.notify.debugStateCall(self) assert oldLocation in self.zoneId2doIds assert do.doId in self.zoneId2doIds[oldLocation] assert do.doId not in self.zoneId2doIds.get(newLocation, {})

remove from old zone

del(self.zoneId2doIds[oldLocation][do.doId]) if len(self.zoneId2doIds[oldLocation]) == 0: del self.zoneId2doIds[oldLocation] if self.isValidLocationTuple(newLocation):

add to new zone

self.zoneId2doIds.setdefault(newLocation, {}) self.zoneId2doIds[newLocation][do.doId]=do More...
 
def getObjectsOfClassInZone
 
def getOwnerView
 
def getOwnerViewDoIdList
 
def getOwnerViewDoList
 
def handleObjectLocation
 
def handleSetLocation
 
def hasOwnerViewDoId
 
def isInDoTables
 
def isValidLocationTuple
 
def printObjectCount
 
def printObjects
 
def removeDOFromTables
 
def storeObjectLocation
 
def webPrintObjectCount
 

Public Attributes

 bootedIndex
 
 bootedText
 
 cache
 
 cacheOwner
 
 context
 
 dcSuffix
 
 deferInterval
 
 deferredDoIds
 
 deferredGenerates
 
 doDataCache
 
 heartbeatInterval
 
 heartbeatStarted
 
 lastGenerate
 
 lastHeartbeat
 
 noDefer
 
 parentMgr
 
 recorder
 
 relatedObjectMgr
 
 serverDelta
 
 specialNameNumber
 
 timeManager
 
- Public Attributes inherited from ConnectionRepository
 bootedIndex
 if self.recorder and self.recorder.isPlaying(): More...
 
 bootedText
 
 config
 
 connectHttp
 
 connectMethod
 
 dclassesByName
 
 dclassesByNumber
 
 dcSuffix
 
 hashVal
 
 http
 
 private__di
 
 readerPollTaskObj
 
 recorder
 
 uniqueId
 
- Public Attributes inherited from DoCollectionManager
 doId2do
 
 doId2ownerView
 self.zoneId2doIds={} More...
 

Static Public Attributes

tuple notify = DirectNotifyGlobal.directNotify.newCategory("ClientRepositoryBase")
 
- Static Public Attributes inherited from ConnectionRepository
int CM_HTTP = 0
 
int CM_NATIVE = 2
 
int CM_NET = 1
 
string GarbageCollectTaskName = "allowGarbageCollect"
 
string GarbageThresholdTaskName = "adjustGarbageCollectThreshold"
 
tuple gcNotify = directNotify.newCategory("GarbageCollect")
 
tuple notify = DirectNotifyGlobal.directNotify.newCategory("ConnectionRepository")
 
 taskChain = None
 
int taskPriority = -30
 
- Static Public Attributes inherited from DoInterestManager
tuple InterestDebug = tempbase.config.GetBool('interest-debug', False)
 
tuple notify = directNotify.newCategory("DoInterestManager")
 
 tempbase = base
 

Detailed Description

This maintains a client-side connection with a Panda server.

This base class exists to collect the common code between
ClientRepository, which is the CMU-provided, open-source version
of the client repository code, and OTPClientRepository, which is
the VR Studio's implementation of the same.

Constructor & Destructor Documentation

def __init__ (   self,
  dcFileNames = None,
  dcSuffix = '',
  connectMethod = None,
  threadedNet = None 
)

Member Function Documentation

def allocateContext (   self)
def considerHeartbeat (   self)
Send a heartbeat message if we haven't sent one recently.
def disableDoId (   self,
  doId,
  ownerView = False 
)
def doDeferredGenerate (   self,
  task 
)
This is the task that generates an object on the deferred
queue. 
def doGenerate (   self,
  parentId,
  zoneId,
  classId,
  doId,
  di 
)
def flushGenerates (   self)
Forces all pending generates to be performed immediately. 
def generateWithRequiredFields (   self,
  dclass,
  doId,
  di,
  parentId,
  zoneId 
)
def generateWithRequiredOtherFields (   self,
  dclass,
  doId,
  di,
  parentId = None,
  zoneId = None 
)
def generateWithRequiredOtherFieldsOwner (   self,
  dclass,
  doId,
  di 
)
def getObjectsOfClass (   self,
  objClass 
)
returns dict of doId:object, containing all objects
that inherit from 'class'. returned dict is safely mutable. 
def getObjectsOfExactClass (   self,
  objClass 
)
returns dict of doId:object, containing all objects that
are exactly of type 'class' (neglecting inheritance). returned
dict is safely mutable. 
def getServerDelta (   self)
def getServerTimeOfDay (   self)
Returns the current time of day (seconds elapsed since the
1972 epoch) according to the server's clock.  This is in GMT,
and hence is irrespective of timezones.

The value is computed based on the client's clock and the
known delta from the server's clock, which is not terribly
precisely measured and may drift slightly after startup, but
it should be accurate plus or minus a couple of seconds.
def getTables (   self,
  ownerView 
)
def getWorld (   self,
  doId 
)
def handleDelete (   self,
  di 
)
def handleGoGetLost (   self,
  di 
)
def handleServerHeartbeat (   self,
  di 
)
def handleSystemMessage (   self,
  di 
)
def handleSystemMessageAknowledge (   self,
  di 
)
def handleUpdateField (   self,
  di 
)
This method is called when a CLIENT_OBJECT_UPDATE_FIELD
message is received; it decodes the update, unpacks the
arguments, and calls the corresponding method on the indicated
DistributedObject.

In fact, this method is exactly duplicated by the C++ method
cConnectionRepository::handle_update_field(), which was
written to optimize the message loop by handling all of the
CLIENT_OBJECT_UPDATE_FIELD messages in C++.  That means that
nowadays, this Python method will probably never be called,
since UPDATE_FIELD messages will not even be passed to the
Python message handlers.  But this method remains for
documentation purposes, and also as a "just in case" handler
in case we ever do come across a situation in the future in
which python might handle the UPDATE_FIELD message.
def isLive (   self)
def isLocalId (   self,
  id 
)
def printDelayDeletes (   self)
def replaceMethod (   self,
  oldMethod,
  newFunction 
)
def replayDeferredGenerate (   self,
  msgType,
  extra 
)
Override this to do something appropriate with deferred
"generate" messages when they are replayed().
def sendHeartbeatTask (   self,
  task 
)
def setDeferInterval (   self,
  deferInterval 
)
Specifies the minimum amount of time, in seconds, that must
elapse before generating any two DistributedObjects whose
class type is marked "deferrable".  Set this to 0 to indicate
no deferring will occur.
def setServerDelta (   self,
  delta 
)
Indicates the approximate difference in seconds between the
client's clock and the server's clock, in universal time (not
including timezone shifts).  This is mainly useful for
reporting synchronization information to the logs; don't
depend on it for any precise timing requirements.

Also see Notify.setServerDelta(), which also accounts for a
timezone shift.
def specialName (   self,
  label 
)

def queryObjectAll(self, doID, context=0): """ Get a one-time snapshot look at the object.

""" assert self.notify.debugStateCall(self)

Create a message

datagram = PyDatagram() datagram.addServerHeader( doID, localAvatar.getDoId(), 2020)

A context that can be used to index the response if needed

datagram.addUint32(context) self.send(datagram)

Make sure the message gets there.

self.flush()

def startHeartbeat (   self)
def stopHeartbeat (   self)
def waitForNextHeartBeat (   self)

Member Data Documentation

bootedIndex
bootedText
cache
cacheOwner
context
dcSuffix
deferInterval
deferredDoIds
deferredGenerates
doDataCache
heartbeatInterval
heartbeatStarted
lastGenerate
lastHeartbeat
noDefer
tuple notify = DirectNotifyGlobal.directNotify.newCategory("ClientRepositoryBase")
static
parentMgr
recorder
relatedObjectMgr
serverDelta
specialNameNumber
timeManager