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)
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"""
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):