distributed: Change the message numbers to match Astron's

I imagine very few Panda3D users depend on the message numbers having
particular values. The ones removed belonged to Disney's OTP system,
which hasn't been used by anybody in over 4 years.

At any rate, old code should continue to work, just at the cost of
compatibility between clients and servers running different P3D versions.
This commit is contained in:
Sam Edwards 2018-02-23 16:11:49 -07:00
parent 97368ec321
commit 167c6dcafa
9 changed files with 148 additions and 323 deletions

View File

@ -946,9 +946,9 @@ ai_format_generate(PyObject *distobj, DOID_TYPE do_id,
bool has_optional_fields = (PyObject_IsTrue(optional_fields) != 0);
if (has_optional_fields) {
packer.raw_pack_uint16(STATESERVER_OBJECT_GENERATE_WITH_REQUIRED_OTHER);
packer.raw_pack_uint16(STATESERVER_CREATE_OBJECT_WITH_REQUIRED_OTHER);
} else {
packer.raw_pack_uint16(STATESERVER_OBJECT_GENERATE_WITH_REQUIRED);
packer.raw_pack_uint16(STATESERVER_CREATE_OBJECT_WITH_REQUIRED);
}
// Parent is a bit overloaded; this parent is not about inheritance, this
@ -1027,7 +1027,7 @@ ai_database_generate_context(
packer.RAW_PACK_CHANNEL(database_server_id);
packer.RAW_PACK_CHANNEL(from_channel_id);
// packer.raw_pack_uint8('A');
packer.raw_pack_uint16(STATESERVER_OBJECT_CREATE_WITH_REQUIRED_CONTEXT);
packer.raw_pack_uint16(STATESERVER_OBJECT_ENTER_WITH_REQUIRED_CONTEXT);
packer.raw_pack_uint32(parent_id);
packer.raw_pack_uint32(zone_id);
packer.RAW_PACK_CHANNEL(owner_channel);
@ -1060,7 +1060,7 @@ ai_database_generate_context_old(
packer.RAW_PACK_CHANNEL(database_server_id);
packer.RAW_PACK_CHANNEL(from_channel_id);
// packer.raw_pack_uint8('A');
packer.raw_pack_uint16(STATESERVER_OBJECT_CREATE_WITH_REQUIRED_CONTEXT);
packer.raw_pack_uint16(STATESERVER_OBJECT_ENTER_WITH_REQUIRED_CONTEXT);
packer.raw_pack_uint32(parent_id);
packer.raw_pack_uint32(zone_id);
packer.raw_pack_uint16(_number); // DCD class ID

View File

@ -391,7 +391,7 @@ Datagram DCField::
client_format_update(DOID_TYPE do_id, PyObject *args) const {
DCPacker packer;
packer.raw_pack_uint16(CLIENT_OBJECT_UPDATE_FIELD);
packer.raw_pack_uint16(CLIENT_OBJECT_SET_FIELD);
packer.raw_pack_uint32(do_id);
packer.raw_pack_uint16(_number);
@ -417,7 +417,7 @@ ai_format_update(DOID_TYPE do_id, CHANNEL_TYPE to_id, CHANNEL_TYPE from_id, PyOb
packer.raw_pack_uint8(1);
packer.RAW_PACK_CHANNEL(to_id);
packer.RAW_PACK_CHANNEL(from_id);
packer.raw_pack_uint16(STATESERVER_OBJECT_UPDATE_FIELD);
packer.raw_pack_uint16(STATESERVER_OBJECT_SET_FIELD);
packer.raw_pack_uint32(do_id);
packer.raw_pack_uint16(_number);

View File

@ -17,16 +17,13 @@
// This file defines the server message types used within this module. It
// duplicates some symbols defined in MsgTypes.py and AIMsgTypes.py.
#define CLIENT_OBJECT_UPDATE_FIELD 24
#define CLIENT_CREATE_OBJECT_REQUIRED 34
#define CLIENT_CREATE_OBJECT_REQUIRED_OTHER 35
#define CLIENT_OBJECT_SET_FIELD 120
#define CLIENT_ENTER_OBJECT_REQUIRED 142
#define CLIENT_ENTER_OBJECT_REQUIRED_OTHER 143
#define STATESERVER_OBJECT_GENERATE_WITH_REQUIRED 2001
#define STATESERVER_OBJECT_GENERATE_WITH_REQUIRED_OTHER 2003
#define STATESERVER_OBJECT_UPDATE_FIELD 2004
#define STATESERVER_OBJECT_CREATE_WITH_REQUIRED_CONTEXT 2050
#define STATESERVER_OBJECT_CREATE_WITH_REQUIR_OTHER_CONTEXT 2051
#define STATESERVER_BOUNCE_MESSAGE 2086
#define STATESERVER_CREATE_OBJECT_WITH_REQUIRED 2000
#define STATESERVER_CREATE_OBJECT_WITH_REQUIRED_OTHER 2001
#define STATESERVER_OBJECT_SET_FIELD 2020
#define CLIENT_OBJECT_GENERATE_CMU 9002

View File

@ -175,7 +175,7 @@ class ClientRepositoryBase(ConnectionRepository):
"generate" messages when they are replayed().
"""
if msgType == CLIENT_CREATE_OBJECT_REQUIRED_OTHER:
if msgType == CLIENT_ENTER_OBJECT_REQUIRED_OTHER:
# It's a generate message.
doId = extra
if doId in self.deferredDoIds:
@ -381,7 +381,7 @@ class ClientRepositoryBase(ConnectionRepository):
# The object had been deferred. Great; we don't even have
# to generate it now.
del self.deferredDoIds[doId]
i = self.deferredGenerates.index((CLIENT_CREATE_OBJECT_REQUIRED_OTHER, doId))
i = self.deferredGenerates.index((CLIENT_ENTER_OBJECT_REQUIRED_OTHER, doId))
del self.deferredGenerates[i]
if len(self.deferredGenerates) == 0:
taskMgr.remove('deferredGenerate')

View File

@ -3,104 +3,140 @@
from direct.showbase.PythonUtil import invertDictLossless
MsgName2Id = {
# 2 new params: passwd, char bool 0/1 1 = new account
# 2 new return values: 129 = not found, 12 = bad passwd,
'CLIENT_LOGIN': 1,
'CLIENT_LOGIN_RESP': 2,
'CLIENT_GET_AVATARS': 3,
'CLIENT_HELLO': 1,
'CLIENT_HELLO_RESP': 2,
# Sent by the client when it's leaving.
'CLIENT_DISCONNECT': 3,
# Sent by the server when it is dropping the connection deliberately.
'CLIENT_GO_GET_LOST': 4,
'CLIENT_GET_AVATARS_RESP': 5,
'CLIENT_CREATE_AVATAR': 6,
'CLIENT_CREATE_AVATAR_RESP': 7,
'CLIENT_GET_FRIEND_LIST': 10,
'CLIENT_GET_FRIEND_LIST_RESP': 11,
'CLIENT_GET_AVATAR_DETAILS': 14,
'CLIENT_GET_AVATAR_DETAILS_RESP': 15,
'CLIENT_LOGIN_2': 16,
'CLIENT_LOGIN_2_RESP': 17,
'CLIENT_EJECT': 4,
'CLIENT_OBJECT_UPDATE_FIELD': 24,
'CLIENT_OBJECT_UPDATE_FIELD_RESP': 24,
'CLIENT_OBJECT_DISABLE': 25,
'CLIENT_OBJECT_DISABLE_RESP': 25,
'CLIENT_OBJECT_DISABLE_OWNER': 26,
'CLIENT_OBJECT_DISABLE_OWNER_RESP': 26,
'CLIENT_OBJECT_DELETE': 27,
'CLIENT_OBJECT_DELETE_RESP': 27,
'CLIENT_SET_ZONE_CMU': 29,
'CLIENT_REMOVE_ZONE': 30,
'CLIENT_SET_AVATAR': 32,
'CLIENT_CREATE_OBJECT_REQUIRED': 34,
'CLIENT_CREATE_OBJECT_REQUIRED_RESP': 34,
'CLIENT_CREATE_OBJECT_REQUIRED_OTHER': 35,
'CLIENT_CREATE_OBJECT_REQUIRED_OTHER_RESP': 35,
'CLIENT_CREATE_OBJECT_REQUIRED_OTHER_OWNER': 36,
'CLIENT_CREATE_OBJECT_REQUIRED_OTHER_OWNER_RESP':36,
'CLIENT_HEARTBEAT': 5,
'CLIENT_REQUEST_GENERATES': 36,
'CLIENT_OBJECT_SET_FIELD': 120,
'CLIENT_OBJECT_SET_FIELDS': 121,
'CLIENT_OBJECT_LEAVING': 132,
'CLIENT_OBJECT_LEAVING_OWNER': 161,
'CLIENT_ENTER_OBJECT_REQUIRED': 142,
'CLIENT_ENTER_OBJECT_REQUIRED_OTHER': 143,
'CLIENT_ENTER_OBJECT_REQUIRED_OWNER': 172,
'CLIENT_ENTER_OBJECT_REQUIRED_OTHER_OWNER': 173,
'CLIENT_DISCONNECT': 37,
'CLIENT_DONE_INTEREST_RESP': 204,
'CLIENT_GET_STATE_RESP': 47,
'CLIENT_DONE_INTEREST_RESP': 48,
'CLIENT_DELETE_AVATAR': 49,
'CLIENT_DELETE_AVATAR_RESP': 5,
'CLIENT_HEARTBEAT': 52,
'CLIENT_FRIEND_ONLINE': 53,
'CLIENT_FRIEND_OFFLINE': 54,
'CLIENT_REMOVE_FRIEND': 56,
'CLIENT_CHANGE_PASSWORD': 65,
'CLIENT_SET_NAME_PATTERN': 67,
'CLIENT_SET_NAME_PATTERN_ANSWER': 68,
'CLIENT_SET_WISHNAME': 70,
'CLIENT_SET_WISHNAME_RESP': 71,
'CLIENT_SET_WISHNAME_CLEAR': 72,
'CLIENT_SET_SECURITY': 73,
'CLIENT_SET_DOID_RANGE': 74,
'CLIENT_GET_AVATARS_RESP2': 75,
'CLIENT_CREATE_AVATAR2': 76,
'CLIENT_SYSTEM_MESSAGE': 78,
'CLIENT_SET_AVTYPE': 80,
'CLIENT_GET_PET_DETAILS': 81,
'CLIENT_GET_PET_DETAILS_RESP': 82,
'CLIENT_ADD_INTEREST': 97,
'CLIENT_REMOVE_INTEREST': 99,
'CLIENT_OBJECT_LOCATION': 102,
'CLIENT_LOGIN_3': 111,
'CLIENT_LOGIN_3_RESP': 110,
'CLIENT_GET_FRIEND_LIST_EXTENDED': 115,
'CLIENT_GET_FRIEND_LIST_EXTENDED_RESP': 116,
'CLIENT_SET_FIELD_SENDABLE': 120,
'CLIENT_SYSTEMMESSAGE_AKNOWLEDGE': 123,
'CLIENT_CHANGE_GENERATE_ORDER': 124,
# new toontown specific login message, adds last logged in, and if child account has parent acount
'CLIENT_LOGIN_TOONTOWN': 125,
'CLIENT_LOGIN_TOONTOWN_RESP': 126,
'CLIENT_ADD_INTEREST': 200,
'CLIENT_ADD_INTEREST_MULTIPLE': 201,
'CLIENT_REMOVE_INTEREST': 203,
'CLIENT_OBJECT_LOCATION': 140,
# These are sent internally inside the Astron cluster.
'STATESERVER_OBJECT_GENERATE_WITH_REQUIRED': 2001,
'STATESERVER_OBJECT_GENERATE_WITH_REQUIRED_OTHER': 2003,
'STATESERVER_OBJECT_UPDATE_FIELD': 2004,
'STATESERVER_OBJECT_CREATE_WITH_REQUIRED_CONTEXT': 2050,
'STATESERVER_OBJECT_CREATE_WITH_REQUIR_OTHER_CONTEXT': 2051,
'STATESERVER_BOUNCE_MESSAGE': 2086,
# Message Director control messages:
'CONTROL_CHANNEL': 1,
'CONTROL_ADD_CHANNEL': 9000,
'CONTROL_REMOVE_CHANNEL': 9001,
'CONTROL_ADD_RANGE': 9002,
'CONTROL_REMOVE_RANGE': 9003,
'CONTROL_ADD_POST_REMOVE': 9010,
'CONTROL_CLEAR_POST_REMOVES': 9011,
# State Server control messages:
'STATESERVER_CREATE_OBJECT_WITH_REQUIRED': 2000,
'STATESERVER_CREATE_OBJECT_WITH_REQUIRED_OTHER': 2001,
'STATESERVER_DELETE_AI_OBJECTS': 2009,
'STATESERVER_OBJECT_GET_FIELD': 2010,
'STATESERVER_OBJECT_GET_FIELD_RESP': 2011,
'STATESERVER_OBJECT_GET_FIELDS': 2012,
'STATESERVER_OBJECT_GET_FIELDS_RESP': 2013,
'STATESERVER_OBJECT_GET_ALL': 2014,
'STATESERVER_OBJECT_GET_ALL_RESP': 2015,
'STATESERVER_OBJECT_SET_FIELD': 2020,
'STATESERVER_OBJECT_SET_FIELDS': 2021,
'STATESERVER_OBJECT_DELETE_FIELD_RAM': 2030,
'STATESERVER_OBJECT_DELETE_FIELDS_RAM': 2031,
'STATESERVER_OBJECT_DELETE_RAM': 2032,
'STATESERVER_OBJECT_SET_LOCATION': 2040,
'STATESERVER_OBJECT_CHANGING_LOCATION': 2041,
'STATESERVER_OBJECT_ENTER_LOCATION_WITH_REQUIRED': 2042,
'STATESERVER_OBJECT_ENTER_LOCATION_WITH_REQUIRED_OTHER': 2043,
'STATESERVER_OBJECT_GET_LOCATION': 2044,
'STATESERVER_OBJECT_GET_LOCATION_RESP': 2045,
'STATESERVER_OBJECT_SET_AI': 2050,
'STATESERVER_OBJECT_CHANGING_AI': 2051,
'STATESERVER_OBJECT_ENTER_AI_WITH_REQUIRED': 2052,
'STATESERVER_OBJECT_ENTER_AI_WITH_REQUIRED_OTHER': 2053,
'STATESERVER_OBJECT_GET_AI': 2054,
'STATESERVER_OBJECT_GET_AI_RESP': 2055,
'STATESERVER_OBJECT_SET_OWNER': 2060,
'STATESERVER_OBJECT_CHANGING_OWNER': 2061,
'STATESERVER_OBJECT_ENTER_OWNER_WITH_REQUIRED': 2062,
'STATESERVER_OBJECT_ENTER_OWNER_WITH_REQUIRED_OTHER': 2063,
'STATESERVER_OBJECT_GET_OWNER': 2064,
'STATESERVER_OBJECT_GET_OWNER_RESP': 2065,
'STATESERVER_OBJECT_GET_ZONE_OBJECTS': 2100,
'STATESERVER_OBJECT_GET_ZONES_OBJECTS': 2102,
'STATESERVER_OBJECT_GET_CHILDREN': 2104,
'STATESERVER_OBJECT_GET_ZONE_COUNT': 2110,
'STATESERVER_OBJECT_GET_ZONE_COUNT_RESP': 2111,
'STATESERVER_OBJECT_GET_ZONES_COUNT': 2112,
'STATESERVER_OBJECT_GET_ZONES_COUNT_RESP': 2113,
'STATESERVER_OBJECT_GET_CHILD_COUNT': 2114,
'STATESERVER_OBJECT_GET_CHILD_COUNT_RESP': 2115,
'STATESERVER_OBJECT_DELETE_ZONE': 2120,
'STATESERVER_OBJECT_DELETE_ZONES': 2122,
'STATESERVER_OBJECT_DELETE_CHILDREN': 2124,
# DBSS-backed-object messages:
'DBSS_OBJECT_ACTIVATE_WITH_DEFAULTS': 2200,
'DBSS_OBJECT_ACTIVATE_WITH_DEFAULTS_OTHER': 2201,
'DBSS_OBJECT_GET_ACTIVATED': 2207,
'DBSS_OBJECT_GET_ACTIVATED_RESP': 2208,
'DBSS_OBJECT_DELETE_FIELD_DISK': 2230,
'DBSS_OBJECT_DELETE_FIELDS_DISK': 2231,
'DBSS_OBJECT_DELETE_DISK': 2232,
# Database Server control messages:
'DBSERVER_CREATE_OBJECT': 3000,
'DBSERVER_CREATE_OBJECT_RESP': 3001,
'DBSERVER_OBJECT_GET_FIELD': 3010,
'DBSERVER_OBJECT_GET_FIELD_RESP': 3011,
'DBSERVER_OBJECT_GET_FIELDS': 3012,
'DBSERVER_OBJECT_GET_FIELDS_RESP': 3013,
'DBSERVER_OBJECT_GET_ALL': 3014,
'DBSERVER_OBJECT_GET_ALL_RESP': 3015,
'DBSERVER_OBJECT_SET_FIELD': 3020,
'DBSERVER_OBJECT_SET_FIELDS': 3021,
'DBSERVER_OBJECT_SET_FIELD_IF_EQUALS': 3022,
'DBSERVER_OBJECT_SET_FIELD_IF_EQUALS_RESP': 3023,
'DBSERVER_OBJECT_SET_FIELDS_IF_EQUALS': 3024,
'DBSERVER_OBJECT_SET_FIELDS_IF_EQUALS_RESP': 3025,
'DBSERVER_OBJECT_SET_FIELD_IF_EMPTY': 3026,
'DBSERVER_OBJECT_SET_FIELD_IF_EMPTY_RESP': 3027,
'DBSERVER_OBJECT_DELETE_FIELD': 3030,
'DBSERVER_OBJECT_DELETE_FIELDS': 3031,
'DBSERVER_OBJECT_DELETE': 3032,
# Client Agent control messages:
'CLIENTAGENT_SET_STATE': 1000,
'CLIENTAGENT_SET_CLIENT_ID': 1001,
'CLIENTAGENT_SEND_DATAGRAM': 1002,
'CLIENTAGENT_EJECT': 1004,
'CLIENTAGENT_DROP': 1005,
'CLIENTAGENT_GET_NETWORK_ADDRESS': 1006,
'CLIENTAGENT_GET_NETWORK_ADDRESS_RESP': 1007,
'CLIENTAGENT_DECLARE_OBJECT': 1010,
'CLIENTAGENT_UNDECLARE_OBJECT': 1011,
'CLIENTAGENT_ADD_SESSION_OBJECT': 1012,
'CLIENTAGENT_REMOVE_SESSION_OBJECT': 1013,
'CLIENTAGENT_SET_FIELDS_SENDABLE': 1014,
'CLIENTAGENT_OPEN_CHANNEL': 1100,
'CLIENTAGENT_CLOSE_CHANNEL': 1101,
'CLIENTAGENT_ADD_POST_REMOVE': 1110,
'CLIENTAGENT_CLEAR_POST_REMOVES': 1111,
'CLIENTAGENT_ADD_INTEREST': 1200,
'CLIENTAGENT_ADD_INTEREST_MULTIPLE': 1201,
'CLIENTAGENT_REMOVE_INTEREST': 1203,
}
# create id->name table for debugging

View File

@ -19,7 +19,7 @@ MsgName2Id = {
'CLIENT_HEARTBEAT_CMU' : 9011,
'CLIENT_OBJECT_UPDATE_FIELD_TARGETED_CMU' : 9011,
'CLIENT_OBJECT_UPDATE_FIELD' : 24, # Matches MsgTypes.CLIENT_OBJECT_UPDATE_FIELD
'CLIENT_OBJECT_UPDATE_FIELD' : 120, # Matches MsgTypes.CLIENT_OBJECT_SET_FIELD
}
# create id->name table for debugging

View File

@ -1,208 +0,0 @@
"""OldClientRepository module: contains the OldClientRepository class"""
from .ClientRepositoryBase import *
class OldClientRepository(ClientRepositoryBase):
"""
This is the open-source ClientRepository as provided by CMU. It
communicates with the ServerRepository in this same directory.
If you are looking for the VR Studio's implementation of the
client repository, look to OTPClientRepository (elsewhere).
"""
notify = DirectNotifyGlobal.directNotify.newCategory("ClientRepository")
def __init__(self, dcFileNames = None):
ClientRepositoryBase.__init__(self, dcFileNames = dcFileNames)
# The DOID allocator. The CMU LAN server may choose to
# send us a block of DOIDs. If it chooses to do so, then we
# may create objects, using those DOIDs.
self.DOIDbase = 0
self.DOIDnext = 0
self.DOIDlast = 0
def handleSetDOIDrange(self, di):
self.DOIDbase = di.getUint32()
self.DOIDlast = self.DOIDbase + di.getUint32()
self.DOIDnext = self.DOIDbase
def handleRequestGenerates(self, di):
# When new clients join the zone of an object, they need to hear
# about it, so we send out all of our information about objects in
# that particular zone.
assert self.DOIDnext < self.DOIDlast
zone = di.getUint32()
for obj in self.doId2do.values():
if obj.zone == zone:
id = obj.doId
if (self.isLocalId(id)):
self.send(obj.dclass.clientFormatGenerate(obj, id, zone, []))
def createWithRequired(self, className, zoneId = 0, optionalFields=None):
if self.DOIDnext >= self.DOIDlast:
self.notify.error(
"Cannot allocate a distributed object ID: all IDs used up.")
return None
id = self.DOIDnext
self.DOIDnext = self.DOIDnext + 1
dclass = self.dclassesByName[className]
classDef = dclass.getClassDef()
if classDef == None:
self.notify.error("Could not create an undefined %s object." % (
dclass.getName()))
obj = classDef(self)
obj.dclass = dclass
obj.zone = zoneId
obj.doId = id
self.doId2do[id] = obj
obj.generateInit()
obj._retrieveCachedData()
obj.generate()
obj.announceGenerate()
datagram = dclass.clientFormatGenerate(obj, id, zoneId, optionalFields)
self.send(datagram)
return obj
def sendDisableMsg(self, doId):
datagram = PyDatagram()
datagram.addUint16(CLIENT_OBJECT_DISABLE)
datagram.addUint32(doId)
self.send(datagram)
def sendDeleteMsg(self, doId):
datagram = PyDatagram()
datagram.addUint16(CLIENT_OBJECT_DELETE)
datagram.addUint32(doId)
self.send(datagram)
def sendRemoveZoneMsg(self, zoneId, visibleZoneList=None):
datagram = PyDatagram()
datagram.addUint16(CLIENT_REMOVE_ZONE)
datagram.addUint32(zoneId)
# if we have an explicit list of visible zones, add them
if visibleZoneList is not None:
vzl = list(visibleZoneList)
vzl.sort()
assert PythonUtil.uniqueElements(vzl)
for zone in vzl:
datagram.addUint32(zone)
# send the message
self.send(datagram)
def sendUpdateZone(self, obj, zoneId):
id = obj.doId
assert self.isLocalId(id)
self.sendDeleteMsg(id, 1)
obj.zone = zoneId
self.send(obj.dclass.clientFormatGenerate(obj, id, zoneId, []))
def sendSetZoneMsg(self, zoneId, visibleZoneList=None):
datagram = PyDatagram()
# Add message type
datagram.addUint16(CLIENT_SET_ZONE_CMU)
# Add zone id
datagram.addUint32(zoneId)
# if we have an explicit list of visible zones, add them
if visibleZoneList is not None:
vzl = list(visibleZoneList)
vzl.sort()
assert PythonUtil.uniqueElements(vzl)
for zone in vzl:
datagram.addUint32(zone)
# send the message
self.send(datagram)
def isLocalId(self, id):
return ((id >= self.DOIDbase) and (id < self.DOIDlast))
def haveCreateAuthority(self):
return (self.DOIDlast > self.DOIDnext)
def handleDatagram(self, di):
if self.notify.getDebug():
print("ClientRepository received datagram:")
di.getDatagram().dumpHex(ostream)
msgType = self.getMsgType()
# These are the sort of messages we may expect from the public
# Panda server.
if msgType == CLIENT_SET_DOID_RANGE:
self.handleSetDOIDrange(di)
elif msgType == CLIENT_CREATE_OBJECT_REQUIRED_RESP:
self.handleGenerateWithRequired(di)
elif msgType == CLIENT_CREATE_OBJECT_REQUIRED_OTHER_RESP:
self.handleGenerateWithRequiredOther(di)
elif msgType == CLIENT_OBJECT_UPDATE_FIELD_RESP:
self.handleUpdateField(di)
elif msgType == CLIENT_OBJECT_DELETE_RESP:
self.handleDelete(di)
elif msgType == CLIENT_OBJECT_DISABLE_RESP:
self.handleDisable(di)
elif msgType == CLIENT_REQUEST_GENERATES:
self.handleRequestGenerates(di)
else:
self.handleMessageType(msgType, di)
# If we're processing a lot of datagrams within one frame, we
# may forget to send heartbeats. Keep them coming!
self.considerHeartbeat()
def handleGenerateWithRequired(self, di):
# Get the class Id
classId = di.getUint16()
# Get the DO Id
doId = di.getUint32()
# Look up the dclass
dclass = self.dclassesByNumber[classId]
dclass.startGenerate()
# Create a new distributed object, and put it in the dictionary
distObj = self.generateWithRequiredFields(dclass, doId, di)
dclass.stopGenerate()
def generateWithRequiredFields(self, dclass, doId, di):
if doId in self.doId2do:
# ...it is in our dictionary.
# Just update it.
distObj = self.doId2do[doId]
assert distObj.dclass == dclass
distObj.generate()
distObj.updateRequiredFields(dclass, di)
# updateRequiredFields calls announceGenerate
elif self.cache.contains(doId):
# ...it is in the cache.
# Pull it out of the cache:
distObj = self.cache.retrieve(doId)
assert distObj.dclass == dclass
# put it in the dictionary:
self.doId2do[doId] = distObj
# and update it.
distObj.generate()
distObj.updateRequiredFields(dclass, di)
# updateRequiredFields calls announceGenerate
else:
# ...it is not in the dictionary or the cache.
# Construct a new one
classDef = dclass.getClassDef()
if classDef == None:
self.notify.error("Could not create an undefined %s object." % (
dclass.getName()))
distObj = classDef(self)
distObj.dclass = dclass
# Assign it an Id
distObj.doId = doId
# Put the new do in the dictionary
self.doId2do[doId] = distObj
# Update the required fields
distObj.generateInit() # Only called when constructed
distObj.generate()
distObj.updateRequiredFields(dclass, di)
# updateRequiredFields calls announceGenerate
return distObj

View File

@ -301,8 +301,8 @@ check_datagram() {
switch (_msg_type) {
#ifdef HAVE_PYTHON
case CLIENT_OBJECT_UPDATE_FIELD:
case STATESERVER_OBJECT_UPDATE_FIELD:
case CLIENT_OBJECT_SET_FIELD:
case STATESERVER_OBJECT_SET_FIELD:
if (_handle_c_updates) {
if (_has_owner_view) {
if (!handle_update_field_owner()) {
@ -494,7 +494,7 @@ send_message_bundle(unsigned int channel, unsigned int sender_channel) {
dg.add_int8(1);
dg.add_uint64(channel);
dg.add_uint64(sender_channel);
dg.add_uint16(STATESERVER_BOUNCE_MESSAGE);
//dg.add_uint16(STATESERVER_BOUNCE_MESSAGE);
// add each bundled message
BundledMsgVector::const_iterator bmi;
for (bmi = _bundle_msgs.begin(); bmi != _bundle_msgs.end(); bmi++) {
@ -899,11 +899,11 @@ describe_message(ostream &out, const string &prefix,
packer.RAW_UNPACK_CHANNEL(); // msg_sender
msg_type = packer.raw_unpack_uint16();
is_update = (msg_type == STATESERVER_OBJECT_UPDATE_FIELD);
is_update = (msg_type == STATESERVER_OBJECT_SET_FIELD);
} else {
msg_type = packer.raw_unpack_uint16();
is_update = (msg_type == CLIENT_OBJECT_UPDATE_FIELD);
is_update = (msg_type == CLIENT_OBJECT_SET_FIELD);
}
if (!is_update) {

View File

@ -278,12 +278,12 @@ begin_send_update(DCPacker &packer, const string &field_name) {
packer.RAW_PACK_CHANNEL(_do_id);
packer.RAW_PACK_CHANNEL(_ai_id);
// packer.raw_pack_uint8('A');
packer.raw_pack_uint16(STATESERVER_OBJECT_UPDATE_FIELD);
packer.raw_pack_uint16(STATESERVER_OBJECT_SET_FIELD);
packer.raw_pack_uint32(_do_id);
packer.raw_pack_uint16(field->get_number());
} else {
packer.raw_pack_uint16(CLIENT_OBJECT_UPDATE_FIELD);
packer.raw_pack_uint16(CLIENT_OBJECT_SET_FIELD);
packer.raw_pack_uint32(_do_id);
packer.raw_pack_uint16(field->get_number());
}