예제 #1
0
    def handleData(self, prot):
        buf = prot._ao_inbuff
        cmd = None

        """
        Los comandos consumen los bytes del buffer de entrada, si faltan
        datos se dispara un CommandsDecoderException o ByteQueueError.
        """

        try:
            try:
                while len(buf) > 0:
                    cmd = buf.peekInt8()

                    if cmd < 0 or cmd >= len(self.cmds):
                        debug_print("cmd out of range:", cmd)
                        raise CriticalDecoderException()

                    if self.cmds[cmd] is None:
                        debug_print("cmd not implemented:", cmd, \
                            "should be:", clientPacketsFlip.get(cmd, '?'))
                        raise CriticalDecoderException()

                    # Marca la posicion actual por si hay que hacer rollback.
                    buf.mark()

                    # Invoca al handler del comando cmd.
                    self.cmds[cmd](prot, buf)


                # La operacion commit() destruye los datos del buffer,
                # por lo que para llamarla tengo que estar seguro
                # que se leyeron todos los datos del comando actual.
                #
                # Llamarla al final de cada comando puede llegar a ser
                # lento si hay varios comandos encolados.

                buf.commit()

                prot.lastHandledPacket = time.time()

            except:
                buf.rollback()
                raise
        except ByteQueueError, e:
            pass
            debug_print("ByteQueueError", e)
예제 #2
0
    def handleData(self, prot):
        buf = prot._ao_inbuff
        cmd = None
        """
        Los comandos consumen los bytes del buffer de entrada, si faltan
        datos se dispara un CommandsDecoderException o ByteQueueError.
        """

        try:
            try:
                while len(buf) > 0:
                    cmd = buf.peekInt8()

                    if cmd < 0 or cmd >= len(self.cmds):
                        debug_print("cmd out of range:", cmd)
                        raise CriticalDecoderException()

                    if self.cmds[cmd] is None:
                        debug_print("cmd not implemented:", cmd, \
                            "should be:", clientPacketsFlip.get(cmd, '?'))
                        raise CriticalDecoderException()

                    # Marca la posicion actual por si hay que hacer rollback.
                    buf.mark()

                    # Invoca al handler del comando cmd.
                    self.cmds[cmd](prot, buf)

                # La operacion commit() destruye los datos del buffer,
                # por lo que para llamarla tengo que estar seguro
                # que se leyeron todos los datos del comando actual.
                #
                # Llamarla al final de cada comando puede llegar a ser
                # lento si hay varios comandos encolados.

                buf.commit()

                prot.lastHandledPacket = time.time()

            except:
                buf.rollback()
                raise
        except ByteQueueError, e:
            pass
            debug_print("ByteQueueError", e)
예제 #3
0
            except:
                buf.rollback()
                raise
        except ByteQueueError, e:
            pass
            debug_print("ByteQueueError", e)
        except ByteQueueInsufficientData, e:
            pass
        except CommandsDecoderException, e:
            pass
            # debug_print("CommandsDecoderException")
        except CriticalDecoderException, e:
            if cmd is not None:
                debug_print("CriticalDecoderException", cmd, \
                    clientPacketsFlip.get(cmd, '?'), e)
            raise
        except Exception, e:
            debug_print("handleData Exception: ", e)
            raise

    def CheckLogged(fOrig):
        """Decorator para verificar que el usuario esta logeado"""
        def fNew(self, prot, buf):
            if prot.player is None:
                raise CriticalDecoderException()
            return fOrig(self, prot, buf, prot.player)
        return fNew

    def CheckNotLogged(fOrig):
        """Decorator para verificar que el usuario no esta logeado"""
예제 #4
0
            except:
                buf.rollback()
                raise
        except ByteQueueError, e:
            pass
            debug_print("ByteQueueError", e)
        except ByteQueueInsufficientData, e:
            pass
        except CommandsDecoderException, e:
            pass
            # debug_print("CommandsDecoderException")
        except CriticalDecoderException, e:
            if cmd is not None:
                debug_print("CriticalDecoderException", cmd, \
                    clientPacketsFlip.get(cmd, '?'), e)
            raise
        except Exception, e:
            debug_print("handleData Exception: ", e)
            raise

    def CheckLogged(fOrig):
        """Decorator para verificar que el usuario esta logeado"""
        def fNew(self, prot, buf):
            if prot.player is None:
                raise CriticalDecoderException()
            return fOrig(self, prot, buf, prot.player)

        return fNew

    def CheckNotLogged(fOrig):