+class SlipStreamDecoder():
+ def __init__(self, desc, on_packet):
+ self._buffer = b''
+ self._on_packet = on_packet
+ self._desc = desc
+ self._log('__init__')
+
+ def _log(self, msg, **kwargs):
+ log_debug(DBG.SLIP_FULL, 'slip %s: %s' % (self._desc, msg), **kwargs)
+
+ def inputdata(self, data):
+ self._log('inputdata', d=data)
+ data = self._buffer + data
+ self._buffer = b''
+ packets = slip.decode(data)
+ self._buffer = packets.pop()
+ for packet in packets:
+ self._maybe_packet(packet)
+ self._log('bufremain', d=self._buffer)
+
+ def _maybe_packet(self, packet):
+ self._log('maybepacket', d=packet)
+ if len(packet):
+ self._on_packet(packet)
+
+ def flush(self):
+ self._log('flush')
+ self._maybe_packet(self._buffer)
+ self._buffer = b''
+