lib/rmpd/connection.rb in rmpd-1.0.5 vs lib/rmpd/connection.rb in rmpd-1.1.0

- old
+ new

@@ -1,84 +1,81 @@ require "socket" module Rmpd class Connection - - include Rmpd::Commands include Socket::Constants + include Rmpd::Commands - attr_reader :error - def initialize(config_file=nil) - @config = Rmpd::Config.new(config_file) - @socket = nil - end + MAX_RETRIES = 5 - def server_version - "#{@server_version_major}.#{@server_version_minor}.#{@server_version_patch}" - end attr_reader :socket - private - def authenticate - raise "Socket no good!" if (@socket.nil? || @socket.closed?) - send_command("password", @config.password) - read_response - true + def initialize(config_file=nil) + @config = Rmpd::Config.new(config_file) + @socket = nil end + def close + @socket.close + end + def connect return unless @socket.nil? || @socket.closed? - error = nil Socket::getaddrinfo(@config.hostname, @config.port, nil, SOCK_STREAM).each do |info| begin - puts "args: #{info.inspect}" if $DEBUG sockaddr = Socket.pack_sockaddr_in(info[1], info[3]) @socket = Socket.new(info[4], info[5], 0) @socket.connect(sockaddr) rescue StandardError => error $stderr.puts "Failed to connect to #{info[3]}: #{error}" @socket = nil + raise MpdConnRefusedError.new(error) else break end end - raise MpdConnRefusedError.new(error) if @socket.nil? - parse_server_version(@socket.readline) - authenticate if @config.password + read_response # protocol version, ignore for now + password(@config.password) if @config.password end - def parse_server_version(version) - /OK MPD (\d+)\.(\d+)\.(\d+)/.match(version.to_s) - @server_version_major = $~[1].to_i - @server_version_minor = $~[2].to_i - @server_version_patch = $~[3].to_i - end + def send_command(command, *args) + tries = 0 - def read_response(klass=Response, *args) - x = klass.new(receive_server_response, *args) - @error = x.error - x + begin + connect + @socket.puts("#{command} #{quote(args).join(" ")}".strip) + rescue Errno::EPIPE, EOFError + @socket.close + if (tries += 1) < MAX_RETRIES + retry + else + raise MpdError.new("Retry count exceeded") + end + end end - def server_version_at_least(major, minor, patch) - connect - e = MpdError.new("Requires server version #{major}.#{minor}.#{patch}") + def read_response + response = [] - raise e if major > @server_version_major - return true if major < @server_version_major + while (line = @socket.readline) + response << line.strip + break if END_RE === line + end + response + end - raise e if minor > @server_version_minor - return true if minor < @server_version_minor + def mpd + self + end - raise e if patch > @server_version_patch - return true if patch < @server_version_patch - true + def quote(args) + args.collect {|arg| "\"#{arg.to_s.gsub(/"/, "\\\"")}\""} end end end