def __handleObjectMessage(self, dgi): doId = dgi.getUint32() do = self.doId2do.get(doId) if not do: self.notify.warning("Received message for unknown object %i" % doId) return fieldNumber = dgi.getUint16() field = do.dclass.getFieldByIndex(fieldNumber) if not field: self.notify.warning( "Received message on unknown field %i on object %i" % (fieldNumber, doId)) return if field.asParameter(): self.notify.warning("Received message for parameter field?") return # We can safely pass this message onto the object packer = DCPacker() packer.setUnpackData(dgi.getRemainingBytes()) packer.beginUnpack(field) field.receiveUpdate(packer, do) if not packer.endUnpack(): self.notify.warning("Failed to unpack message")
def handleQueryObjectResp(self, msgType, di): ctx = di.getUint32() success = di.getUint8() if ctx not in self._callbacks: self.notify.warning('Received unexpected %s' ' (ctx %d)' % (MsgId2Names[msgType], ctx)) return try: if not success: if self._callbacks[ctx]: self._callbacks[ctx](None, None) return if msgType == DBSERVER_OBJECT_GET_ALL_RESP: dclassId = di.getUint16() dclass = self.air.dclassesByNumber.get(dclassId) else: dclass = self._dclasses[ctx] if not dclass: self.notify.error('Received bad dclass %d in' ' DBSERVER_OBJECT_GET_ALL_RESP' % (dclassId)) if msgType == DBSERVER_OBJECT_GET_FIELD_RESP: fieldCount = 1 else: fieldCount = di.getUint16() unpacker = DCPacker() unpacker.setUnpackData(di.getRemainingBytes()) fields = {} for x in range(fieldCount): fieldId = unpacker.rawUnpackInt16() field = dclass.getFieldByIndex(fieldId) if not field: self.notify.error('Received bad field %d in query for' ' %s object' % (fieldId, dclass.getName())) unpacker.beginUnpack(field) fields[field.getName()] = field.unpackArgs(unpacker) unpacker.endUnpack() if self._callbacks[ctx]: self._callbacks[ctx](dclass, fields) finally: del self._callbacks[ctx] del self._dclasses[ctx]
def handleUpdateObjectResp(self, di, multi): ctx = di.getUint32() success = di.getUint8() if ctx not in self._callbacks: self.notify.warning('Received unexpected' ' DBSERVER_OBJECT_SET_FIELD(S)_IF_EQUALS_RESP' ' (ctx %d)' % (ctx)) return try: if success: if self._callbacks[ctx]: self._callbacks[ctx](None) return if not di.getRemainingSize(): # We failed due to other reasons. if self._callbacks[ctx]: return self._callbacks[ctx]({}) if multi: fieldCount = di.getUint16() else: fieldCount = 1 unpacker = DCPacker() unpacker.setUnpackData(di.getRemainingBytes()) fields = {} for x in range(fieldCount): fieldId = unpacker.rawUnpackInt16() field = self.air.getDcFile().getFieldByIndex(fieldId) if not field: self.notify.error('Received bad field %d in update' ' failure response message' % (fieldId)) unpacker.beginUnpack(field) fields[field.getName()] = field.unpackArgs(unpacker) unpacker.endUnpack() if self._callbacks[ctx]: self._callbacks[ctx](fields) finally: del self._callbacks[ctx]
def handleGetObjectResp(self, di): ctx = di.getUint32() doId = di.getUint32() parentId = di.getUint32() zoneId = di.getUint32() classId = di.getUint16() if ctx not in self.__callbacks: self.notify.warning( 'Received unexpected STATESERVER_OBJECT_GET_ALL_RESP (ctx: %d)' % ctx) return if classId not in self.dclassesByNumber: self.notify.warning( 'Received STATESERVER_OBJECT_GET_ALL_RESP for unknown dclass=%d! (Object %d)' % (classId, doId)) return dclass = self.dclassesByNumber[classId] fields = {} unpacker = DCPacker() unpacker.setUnpackData(di.getRemainingBytes()) # Required: for i in xrange(dclass.getNumInheritedFields()): field = dclass.getInheritedField(i) if not field.isRequired() or field.asMolecularField(): continue unpacker.beginUnpack(field) fields[field.getName()] = field.unpackArgs(unpacker) unpacker.endUnpack() # Other: other = unpacker.rawUnpackUint16() for i in xrange(other): field = dclass.getFieldByIndex(unpacker.rawUnpackUint16()) unpacker.beginUnpack(field) fields[field.getName()] = field.unpackArgs(unpacker) unpacker.endUnpack() try: self.__callbacks[ctx](doId, parentId, zoneId, dclass, fields) finally: del self.__callbacks[ctx]
def handleObjectMessage(self, client, dgi): doId = dgi.getUint32() do = self.doId2do.get(doId) if not do: self.notify.warning( "SUSPICIOUS: client %i tried to send message to unknown doId %i" % (client.id, doId)) return fieldNumber = dgi.getUint16() field = do.dclass.getFieldByIndex(fieldNumber) if field.asParameter(): self.notify.warning( "SUSPICIOUS: client %i tried to send message on a parameter field!" ) return if not field: self.notify.warning( "SUSPICIOUS: client %i tried to send message on unknown field %i on doId %i" % (client.id, doId, fieldNumber)) return if do.owner != client: if not field.isClsend(): # Not client-send self.notify.warning( "SUSPICIOUS: client %i tried to send non-clsend message on doId %i" % (client.id, doId)) return else: if not field.isOwnsend() and not field.isClsend(): # Not client-send or owner-send self.notify.warning( "SUSPICIOUS: owner client %i tried to send non-ownsend and non-clsend message on doId %i" % (client.id, doId)) return # We can safely pass this message onto the object packer = DCPacker() packer.setUnpackData(dgi.getRemainingBytes()) packer.beginUnpack(field) field.receiveUpdate(packer, do) if not packer.endUnpack(): self.notify.warning("Failed to unpack object message")