module EventMachine::Protocols::LineText2

def receive_data data


handling characteristics on a per-token basis.
That way the user-defined handlers we call can modify the
Will loop internally until there's no data left to read.
--
def receive_data data
  return unless (data and data.length > 0)
  # Do this stuff in lieu of a constructor.
  @lt2_mode ||= :lines
  @lt2_delimiter ||= "\n"
  @lt2_linebuffer ||= []
  remaining_data = data
  while remaining_data.length > 0
    if @lt2_mode == :lines
      delimiter_string = case @lt2_delimiter
      when Regexp
        remaining_data.slice(@lt2_delimiter)
      else
        @lt2_delimiter
      end
      ix = remaining_data.index(delimiter_string) if delimiter_string
      if ix
        @lt2_linebuffer << remaining_data[0...ix]
        ln = @lt2_linebuffer.join
        @lt2_linebuffer.clear
        if @lt2_delimiter == "\n"
          ln.chomp!
        end
        receive_line ln
        remaining_data = remaining_data[(ix+delimiter_string.length)..-1]
      else
        @lt2_linebuffer << remaining_data
        remaining_data = ""
      end
    elsif @lt2_mode == :text
      if @lt2_textsize
        needed = @lt2_textsize - @lt2_textpos
        will_take = if remaining_data.length > needed
                      needed
                    else
                      remaining_data.length
                    end
        @lt2_textbuffer << remaining_data[0...will_take]
        tail = remaining_data[will_take..-1]
        @lt2_textpos += will_take
        if @lt2_textpos >= @lt2_textsize
          # Reset line mode (the default behavior) BEFORE calling the
          # receive_binary_data. This makes it possible for user code
          # to call set_text_mode, enabling chains of text blocks
          # (which can possibly be of different sizes).
          set_line_mode
          receive_binary_data @lt2_textbuffer.join
          receive_end_of_binary_data
        end
        remaining_data = tail
      else
        receive_binary_data remaining_data
        remaining_data = ""
      end
    end
  end
end