| require 'socket' |
| require 'monitor' |
| require 'common/Params' |
| require 'common/Logger' |
| |
| module XoredDebugger |
| class Communicator |
| include Logger |
| |
| def initialize(thread) |
| params = Params.instance |
| @socket = TCPSocket.new(params.host, params.port) |
| @socket.sync = true |
| @monitor = Monitor.new() |
| end |
| |
| def receive_command |
| #IDE: command [SPACE] [args] -- data [NULL] |
| line = '' |
| # Ruby 1.8 uses numbers as characters and Ruby 1.9 uses single |
| # character strings. Select the terminator based on version. |
| terminator = RUBY_VERSION.start_with?("1.8") ? 0 : "\0" |
| while((ch = @socket.getc) != terminator) |
| if (ch.nil?) |
| raise IOError |
| end |
| line << ch |
| end |
| log('RECEIVED: ' + line) |
| return Command.new(line) |
| end |
| |
| def sendPacket(packet) |
| @monitor.synchronize do |
| #DEBUGGER: [NUMBER] [NULL] XML(data) [NULL] |
| xml = packet.to_xml |
| log('SENDING: ' + xml) |
| @socket.write(xml.length.to_s) |
| @socket.putc(0) |
| @socket.write(xml) |
| @socket.putc(0) |
| @socket.flush |
| end |
| end |
| |
| def close() |
| begin |
| @socket.close |
| rescue Exception |
| end |
| end |
| end |
| end |