diff -urN 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:32:08.000000000 +0000 +++ pympd-0.07/src/glade/pympd.glade 2007-11-11 17:32:31.000000000 +0000 @@ -2148,7 +2148,7 @@ True 6 - 2 + 1 False 8 7 @@ -2206,7 +2206,7 @@ GTK_UPDATE_ALWAYS False False - 1 0 100 1 10 10 + 1 1 100 1 10 10 1 @@ -2429,169 +2429,6 @@ True - - - - True - GTK_BUTTONBOX_SPREAD - 0 - - - - True - True - True - GTK_RELIEF_NORMAL - True - - - - - True - 0.5 - 0.5 - 0 - 0 - 0 - 0 - 0 - 0 - - - - True - False - 2 - - - - True - gtk-disconnect - 4 - 0.5 - 0.5 - 0 - 0 - - - 0 - False - False - - - - - - True - Disconnect - True - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - - - - - - - - True - True - True - GTK_RELIEF_NORMAL - True - - - - - True - 0.5 - 0.5 - 0 - 0 - 0 - 0 - 0 - 0 - - - - True - False - 2 - - - - True - gtk-connect - 4 - 0.5 - 0.5 - 0 - 0 - - - 0 - False - False - - - - - - True - Connect - True - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - - - - - - - 0 - False - True - - False diff -urN 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:32:08.000000000 +0000 +++ pympd-0.07/src/modules/mpdlib2.py 2007-11-11 17:32:19.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 -urN 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:32:08.000000000 +0000 +++ pympd-0.07/src/modules/pympdclient2.py 2007-11-11 17:32:28.000000000 +0000 @@ -1,5 +1,7 @@ import mpdlib2 import threading +import socket +import errno def fillSong(song): if not song.has_key('artist'): @@ -48,13 +50,19 @@ #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: - return False + return "" + except socket.error, sock_err: + if isinstance(sock_err, socket.timeout): + return str(sock_err) + else: + return (sock_err[0] == errno.EINPROGRESS and os.strerror(errno.ETIMEDOUT) \ + or sock_err[1]) + except Exception, msg: + return msg #updated # should work without adjustments. diff -urN 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:32:08.000000000 +0000 +++ pympd-0.07/src/modules/pympdriver.py 2007-11-11 17:32:31.000000000 +0000 @@ -705,8 +705,6 @@ self.prefDispAll = self.xml.get_widget("pref_client_dbALL") self.prefStopQuit = self.xml.get_widget("pref_client_stopQuit") self.prefDebug = self.xml.get_widget("pref_client_debug") - self.disconnectButton = self.xml.get_widget("disconnect_btn") - self.connectButton = self.xml.get_widget("connect_btn") self.playlistPrefView = self.xml.get_widget("playlistPrefView") self.keyView = self.xml.get_widget("keyView") @@ -944,7 +942,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,19 +957,19 @@ 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: - self.connectButton.set_property('sensitive',False) self.menuConnect.set_property('sensitive',False) - self.disconnectButton.set_property('sensitive',True) self.menuDisconnect.set_property('sensitive',True) else: - self.connectButton.set_property('sensitive',True) self.menuConnect.set_property('sensitive',True) - self.disconnectButton.set_property('sensitive',False) self.menuDisconnect.set_property('sensitive',False) def initListStores(self): @@ -2067,6 +2068,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()