# File lib/em/protocols/linetext2.rb, line 48
      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 ||= []

        if @lt2_mode == :lines
          if ix = data.index( @lt2_delimiter )
            @lt2_linebuffer << data[0...ix]
            ln = @lt2_linebuffer.join
            @lt2_linebuffer.clear
            if @lt2_delimiter == "\n"
              ln.chomp!
            end
            receive_line ln
            receive_data data[(ix+@lt2_delimiter.length)..-1]
          else
            @lt2_linebuffer << data
          end
        elsif @lt2_mode == :text
          if @lt2_textsize
            needed = @lt2_textsize - @lt2_textpos
            will_take = if data.length > needed
                          needed
                        else
                          data.length
                        end

            @lt2_textbuffer << data[0...will_take]
            tail = 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

            receive_data tail
          else
            receive_binary_data data
          end
        end
      end