class Levdon::NonBlockLineStream

Public Class Methods

new(input_stream, output_stream) click to toggle source
# File lib/levdon.rb, line 44
def initialize(input_stream, output_stream)
  @input_stream = input_stream
  @output_stream = output_stream
  @read_queue = []
  @write_queue = []
  @rlnb_buffer = ""
end

Public Instance Methods

poll() click to toggle source
# File lib/levdon.rb, line 78
def poll
  has_event = false
  begin
    if(@io)
      if(@write_queue.length > 0)
        wrote_len = @output_stream.write_nonblock(@write_queue[0])
        if(@write_queue[0].length = wrote_len)
          @write_queue.shift
        else
          @write_queue[0] = @write_queue[0].slice(wrote_len,@write_queue[0].length)
        end
        has_event = true
      end
    end
  rescue => e
    puts "Write error"
    puts e.class
    puts e.message
    puts e.backtrace
  end

  begin
    stream = @input_stream.read_nonblock(8192)
    @rlnb_buffer << stream
    if(@rlnb_buffer.index("\n"))
      sp = @rlnb_buffer.split("\n")
      last = ""
      if(sp.length > 1)
        last = sp.pop
      end
      sp.each{|e|
        @read_queue.push(e)
      }
      @rlnb_buffer = last
    end
    # while ch = @input_stream.read_nonblock(1)
    #   @rlnb_buffer << ch
    #   if ch == "\n" then
    #     @read_queue.push(@rlnb_buffer)
    #     @rlnb_buffer = ""
    #   end
    # end
  rescue Errno::EAGAIN
  rescue => e
    puts "Read error"
    puts e.class
    puts e.message
    puts e.backtrace
  end
  return has_event
end
read() click to toggle source
# File lib/levdon.rb, line 52
def read
  if(@read_queue.length)
    return @read_queue.shift
  end
  return nil
end
write(s) click to toggle source
# File lib/levdon.rb, line 59
def write(s)
  @write_queue.push(s)
  begin
    wrote_len = @output_stream.write_nonblock(@write_queue[0])
    if(@write_queue[0].length == wrote_len)
      @write_queue.shift
    else
      @write_queue[0] = @write_queue[0].slice(wrote_len,@write_queue[0].length)
    end
  rescue => e
    puts "Write error"
    puts e.class
    puts e.message
    puts e.backtrace
  end
  
  @write_queue.length
end