Project

General

Profile

« Previous | Next » 

Revision ce98dac2

Added by Marc Dequènes over 13 years ago

  • ID ce98dac2cc160cda69c76da624e6e21777b44128

[evol] work on cyborg server protocol and API (refs #31)

View differences:

lib/cyborghood/cyborg/server.rb
require 'eventmachine'
require 'cyborghood/cyborg/interface'
require 'shellwords'
module CyborgHood
......
class Conversation < EventMachine::Protocols::LineAndTextProtocol
private_class_method :new
# don't rely on EventMachine's default, it may change one day
MaxLineLength = 16*1024
EOD = "\033[0J"
def initialize(interface)
@interface = interface
super
@config = Config.instance
@split_data_mode = false
@split_data_cmd = nil
@split_data_cmd_args = []
@split_data = []
end
def send_line(msg)
send_data "#{msg}\r\n"
send_data "#{msg}\n"
logger.debug "Sent data [#{identifier}]: #{msg}"
end
def post_init
......
end
def receive_line(data)
logger.debug "Received [#{identifier}]: #{data}"
send_line @interface.instance.call(data)
return if data.empty?
if data == EOD
logger.debug "Received EOD [#{identifier}]"
exit_split_mode
else
if @split_data_mode
logger.debug "Received data (split mode) [#{identifier}]: #{data}"
@split_data << data
else
logger.debug "Received data [#{identifier}]: #{data}"
begin
cmd_parts = Shellwords.shellsplit(data)
rescue
logger.error "Error [#{identifier}]: syntax error"
send_line "552 syntax error"
return
end
cmd = cmd_parts.shift
args = cmd_parts
if @interface.is_split_mode_command? cmd
enter_split_mode(cmd, args)
else
receive_command(cmd, args)
end
end
end
end
def receive_command(cmd, args, data = nil)
logger.debug "Executing command '#{cmd}' [#{identifier}]"
send_line @interface.instance.call(cmd, args, data)
end
def receive_error(msg)
......
def unbind
logger.debug "Conversation finished with #{identifier}"
end
protected
def enter_split_mode(cmd, args)
if @split_data_mode
logger.error "Error [#{identifier}]: already in split mode"
send_line "551 protocol error"
@split_data_mode = false
@split_data_cmd = nil
@split_data_cmd_args = []
else
logger.debug "Entered split mode for command '#{cmd}' [#{identifier}]"
@split_data_mode = true
@split_data_cmd = cmd
@split_data_cmd_args = args
end
@split_data = []
end
def exit_split_mode
if @split_data_mode
logger.debug "Quit split mode for command '#{@split_data_cmd}' [#{identifier}]"
receive_command(@split_data_cmd, @split_data_cmd_args, @split_data.join("\n"))
else
logger.error "Error [#{identifier}]: not in split mode"
send_line "551 protocol error"
end
@split_data_mode = false
@split_data_cmd = nil
@split_data_cmd_args = []
@split_data = []
end
end
class ConversationUNIXSocket < Conversation

Also available in: Unified diff