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 __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 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]
Exemple #4
0
    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")