41 lines
1.1 KiB
Python
41 lines
1.1 KiB
Python
# -*- coding: utf-8 -*-
|
|
#
|
|
# Copyright 2010 Maurizio Porrato <maurizio.porrato@gmail.com>
|
|
# See LICENSE.txt for copyright info
|
|
|
|
from twisted.protocols.basic import LineReceiver
|
|
|
|
|
|
class BufferingLineReceiver(LineReceiver):
|
|
|
|
def connectionMade(self):
|
|
self.rawBuffer = ""
|
|
self.rawExpected = None
|
|
LineReceiver.connectionMade(self)
|
|
|
|
def expectRawData(self, howmany):
|
|
self.setRawMode()
|
|
self.rawExpected = howmany
|
|
self.rawDataReceived('')
|
|
|
|
def rawDataReceived(self, data):
|
|
if self.rawExpected is None:
|
|
raise NotImplementedError
|
|
self.rawBuffer += data
|
|
if len(self.rawBuffer) >= self.rawExpected:
|
|
expected = self.rawBuffer[:self.rawExpected]
|
|
rest = self.rawBuffer[self.rawExpected:]
|
|
self.rawBuffer = ""
|
|
self.rawExpected = None
|
|
self.expectedReceived(expected)
|
|
self.dataReceived(rest)
|
|
|
|
def setLineMode(self, extra=""):
|
|
LineReceiver.setLineMode(self, extra+self.rawBuffer)
|
|
|
|
def expectedReceived(self, data):
|
|
raise NotImplementedError
|
|
|
|
|
|
# vim: set et ai sw=4 ts=4 sts=4:
|