diff --git a/src/network/advanceddispatcher.py b/src/network/advanceddispatcher.py new file mode 100644 index 00000000..47eacc5a --- /dev/null +++ b/src/network/advanceddispatcher.py @@ -0,0 +1,50 @@ +class AdvancedDispatcher(asyncore.dispatcher): + _buf_len = 131072 + + def __init__(self, sock): + asyncore.dispatcher.__init__(self, sock) + self.read_buf = "" + self.write_buf = "" + self.state = "init" + + def slice_read_buf(length=0): + self.read_buf = self.read_buf[length:] + + def slice_write_buf(length=0): + self.write_buf = self.read_buf[length:] + + def read_buf_sufficient(length=0): + if len(self.read_buf) < length: + return False + else: + return True + + def process(self): + if len(self.read_buf) == 0: + return + while True: + try: + if getattr(self, "state_" + str(self.state))() is False: + break + except AttributeError: + # missing state + raise + + def set_state(self, state, length): + self.slice_read_buf(length) + self.state = state + + def writable(self): + return len(self.write_buf) > 0 + + def readable(self): + return len(self.read_buf) < AdvancedDispatcher._buf_len + + def handle_read(self): + self.read_buf += self.recv(AdvancedDispatcher._buf_len) + self.process() + + def handle_write(self): + written = self.send(self.write_buf) + self.slice_write_buf(written) +# self.process()