Class: EventMachine::Protocols::LineAndTextProtocol

Inherits:
Connection
  • Object
show all
Defined in:
lib/protocols/line_and_text.rb

Direct Known Subclasses

HeaderAndContentProtocol

Constant Summary collapse

MaxLineLength =
16*1024
MaxBinaryLength =
32*1024*1024

Instance Attribute Summary

Attributes inherited from Connection

#signature

Instance Method Summary collapse

Methods inherited from Connection

#close_connection, #close_connection_after_writing, #comm_inactivity_timeout, #comm_inactivity_timeout=, #connection_completed, #get_peername, #post_init, #reconnect, #send_data, #send_datagram, #set_comm_inactivity_timeout, #start_tls

Constructor Details

#initialize(*args) ⇒ LineAndTextProtocol

Returns a new instance of LineAndTextProtocol.



35
36
37
38
# File 'lib/protocols/line_and_text.rb', line 35

def initialize *args
  super
  lbp_init_line_state
end

Instance Method Details

#receive_data(data) ⇒ Object



39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/protocols/line_and_text.rb', line 39

def receive_data data
  if @lbp_mode == :lines
    begin
      @lpb_buffer.extract(data).each { |line| receive_line(line) if respond_to?(:receive_line) }
    rescue Exception
      receive_error('overlength line') if respond_to?(:receive_error)
      close_connection
      return
    end
  else
    if @lbp_binary_limit > 0
      wanted = @lbp_binary_limit - @lbp_binary_bytes_received
      chunk = nil
      if data.length > wanted
        chunk = data.slice!(0...wanted)
      else
        chunk = data
        data = ""
      end
      @lbp_binary_buffer[@lbp_binary_bytes_received...(@lbp_binary_bytes_received+chunk.length)] = chunk
      @lbp_binary_bytes_received += chunk.length
      if @lbp_binary_bytes_received == @lbp_binary_limit
        receive_binary_data(@lbp_binary_buffer) if respond_to?(:receive_binary_data)
        lbp_init_line_state
      end
      receive_data(data) if data.length > 0
    else
      receive_binary_data(data) if respond_to?(:receive_binary_data)
      data = ""
    end
  end
end

#set_binary_mode(size = nil) ⇒ Object

Set up to read the supplied number of binary bytes. This recycles all the data currently waiting in the line buffer, if any. If the limit is nil, then ALL subsequent data will be treated as binary data and passed to the upstream protocol handler as we receive it. If a limit is given, we’ll hold the incoming binary data and not pass it upstream until we’ve seen it all, or until there is an unbind (in which case we’ll pass up a partial). Specifying nil for the limit (the default) means there is no limit. Specifiyng zero for the limit will cause an immediate transition back to line mode.



90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
# File 'lib/protocols/line_and_text.rb', line 90

def set_binary_mode size = nil
  if @lbp_mode == :lines
    if size == 0
      receive_binary_data("") if respond_to?(:receive_binary_data)
      # Do no more work here. Stay in line mode and keep consuming data.
    else
      @lbp_binary_limit = size.to_i # (nil will be stored as zero)
      if @lbp_binary_limit > 0
        raise "Overlength" if @lbp_binary_limit > MaxBinaryLength # arbitrary sanity check
        @lbp_binary_buffer = "\0" * @lbp_binary_limit
        @lbp_binary_bytes_received = 0
      end

      @lbp_mode = :binary
      receive_data @lpb_buffer.flush
    end
  else
    raise "invalid operation"
  end
end

#unbindObject



72
73
74
75
76
77
78
# File 'lib/protocols/line_and_text.rb', line 72

def unbind
  if @lbp_mode == :binary and @lbp_binary_limit > 0
    if respond_to?(:receive_binary_data)
      receive_binary_data( @lbp_binary_buffer[0...@lbp_binary_bytes_received] )
    end
  end
end