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