diff -uNr pympd-0.07.old/src/glade/pympd.glade pympd-0.07/src/glade/pympd.glade --- pympd-0.07.old/src/glade/pympd.glade 2007-11-11 17:04:59.000000000 +0000 +++ pympd-0.07/src/glade/pympd.glade 2007-11-11 17:05:11.000000000 +0000 @@ -2206,7 +2206,7 @@ GTK_UPDATE_ALWAYS False False - 1 0 100 1 10 10 + 1 1 100 1 10 10 1 diff -uNr pympd-0.07.old/src/modules/mpdlib2.py pympd-0.07/src/modules/mpdlib2.py --- pympd-0.07.old/src/modules/mpdlib2.py 2007-11-11 17:04:59.000000000 +0000 +++ pympd-0.07/src/modules/mpdlib2.py 2007-11-11 17:05:11.000000000 +0000 @@ -6,13 +6,39 @@ # OK # ACK +def get_socket(host, port, timeout): + sock_err = sock = sock_addrinfo = None + sock_addrinfo = socket.getaddrinfo(host, port, socket.AF_UNSPEC, socket.SOCK_STREAM) + + for res in sock_addrinfo: + sock_domain, sock_type, sock_proto, canonname, sock_addr = res + sock_err = None + try: + sock = socket.socket(sock_domain, sock_type, sock_proto) + sock.settimeout(timeout) + except socket.error, sock_err: + continue + + try: + sock.connect(sock_addr) + except socket.error, sock_err: + sock.close() + continue + + break + + if sock_err: + raise sock_err + + return sock + class socket_talker(object): - def __init__(self, host, port): + def __init__(self, host, port, timeout): self.host = host self.port = port - self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - self.sock.connect((host, port)) + self.timeout = timeout + self.sock = get_socket(host, port, timeout) self.file = self.sock.makefile("rb+") self.current_line = '' self.ack = '' @@ -285,8 +311,8 @@ '\n }>') class mpd_connection(object): - def __init__(self, host, port): - self.talker = socket_talker(host, port) + def __init__(self, host, port, timeout): + self.talker = socket_talker(host, port, timeout) self.send = command_sender(self.talker) self.fetch = response_fetcher(self.talker) self.do = sender_n_fetcher(self.send, self.fetch) @@ -321,8 +347,9 @@ password, host = parse_host(os.environ.get('MPD_HOST', 'localhost')) host = kw.get('host', host) password = kw.get('password', password) + timeout = kw.get('timeout', 1) - conn = mpd_connection(host, port) + conn = mpd_connection(host, port, timeout) if password: conn.password(password) return conn diff -uNr pympd-0.07.old/src/modules/pympdclient2.py pympd-0.07/src/modules/pympdclient2.py --- pympd-0.07.old/src/modules/pympdclient2.py 2007-11-11 17:04:59.000000000 +0000 +++ pympd-0.07/src/modules/pympdclient2.py 2007-11-11 17:05:11.000000000 +0000 @@ -48,9 +48,9 @@ #updated # connect in mpdclient2 takes keyword arguments. - def _connect(self, mpd_host, mpd_port, mpd_password=None): + def _connect(self, mpd_host, mpd_port, mpd_timeout, mpd_password=None): try: - self.mpd = mpdlib2.connect(host=mpd_host, port=mpd_port, password=mpd_password) + self.mpd = mpdlib2.connect(host=mpd_host, port=mpd_port, password=mpd_password, timeout=mpd_timeout) return True except: diff -uNr pympd-0.07.old/src/modules/pympdriver.py pympd-0.07/src/modules/pympdriver.py --- pympd-0.07.old/src/modules/pympdriver.py 2007-11-11 17:04:59.000000000 +0000 +++ pympd-0.07/src/modules/pympdriver.py 2007-11-11 17:05:11.000000000 +0000 @@ -944,7 +944,10 @@ else: password = None - if self.pympd._connect(get('host'), int(get('port')), password): + set('timeout', self.prefConnTimeoutSpinner.get_value_as_int()) + + err_msg = self.pympd._connect(get('host'), int(get('port')), get('timeout'), password) + if not err_msg: self.statusLabel.set_text("Connected") self.connected = True self.correctConnectionButtons() @@ -956,7 +959,11 @@ self.hdStoreBuilt = False gobject.timeout_add(500, self.statusUpdate) else: - self.statusLabel.set_text("Connection Failed") + self.statusLabel.set_text("Connection Failed: %s" % err_msg) + self.connected = False + self.correctConnectionButtons() + self.statsLabel.set_label("") + self.updateLabels(False) def correctConnectionButtons(self): if self.connected == True: @@ -2067,6 +2074,7 @@ def prefs_close(self, obj): set('host', self.prefConnHostEntry.get_text()) set('port', self.prefConnPortEntry.get_text()) + set('timeout', self.prefConnTimeoutSpinner.get_text()) self.saveConfigParser(CONFIG_FILE) self.prefsDialog.hide()