# Copyright 2005 Divmod, Inc.  See LICENSE file for details
# -*- test-case-name: vertex.test.test_juice -*-

from twisted.internet.protocol import Protocol

class LineReceiver(Protocol):

    lineMode = True
    MAX_LINE_LENGTH = 1024 * 1024
    buffer = b''
    delimiter = b'\r\n'

    def lineReceived(self, line):
        pass

    def rawDataReceived(self, data):
        pass

    def setLineMode(self, extra=b''):
        self.lineMode = True
        if extra:
            self.dataReceived(extra)

    def isDisconnecting(self):
        if self.transport is None:
            # XXX This _ought_ to be horribly broken but in fact it is
            # not. TODO: Investigate further.  -glyph
            return False
        if self.transport.disconnecting:
            return True
        return False

    def setRawMode(self):
        self.lineMode = False

    def dataReceived(self, data):
        buffer = self.buffer
        buffer += data
        delimiter = self.delimiter
        begin = 0
        raw = False
        while self.lineMode:
            end = buffer.find(delimiter, begin)
            if end == -1:
                break
            line = buffer[begin:end]
            self.lineReceived(line)
            if self.isDisconnecting():
                self.buffer = b''
                return
            begin = end + len(delimiter)
        else:
            raw = True
        if begin:
            buffer = buffer[begin:]
        if raw:
            self.buffer = b''
            if self.isDisconnecting():
                return
            if buffer:
                self.rawDataReceived(buffer)
        else:
            self.buffer = buffer


