From b485b8b82b67edd1337dc5ca5b2f0dabca7336d9 Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Thu, 8 Oct 2009 08:53:57 +0200 Subject: mpd: switch to QtNetwork networking. with this using "idle" command in the future will be easier. --- nephilim/mpclient.py | 2 +- nephilim/mpd.py | 99 ++++++++++++++++++++-------------------------------- 2 files changed, 39 insertions(+), 62 deletions(-) diff --git a/nephilim/mpclient.py b/nephilim/mpclient.py index c66017a..0b7c1c6 100644 --- a/nephilim/mpclient.py +++ b/nephilim/mpclient.py @@ -392,7 +392,7 @@ class MPClient(QtCore.QObject): self.outputs = [] if self.__check_command_ok('tagtypes'): - self.tagtypes = map(str.lower, self._client.tagtypes()) + ['file'] + self.tagtypes = map(unicode.lower, self._client.tagtypes()) + ['file'] else: self.tagtypes = [] diff --git a/nephilim/mpd.py b/nephilim/mpd.py index 560a225..416bd72 100644 --- a/nephilim/mpd.py +++ b/nephilim/mpd.py @@ -16,7 +16,7 @@ import socket import logging -from PyQt4 import QtCore +from PyQt4 import QtCore, QtNetwork HELLO_PREFIX = "OK MPD " @@ -50,14 +50,18 @@ class _NotConnected(object): class MPDClient(QtCore.QObject): # public - logger = None + logger = None + mpd_version = None + + # private + __sock = None + _commandlist = None # SIGNALS connect_changed = QtCore.pyqtSignal(bool) def __init__(self): QtCore.QObject.__init__(self) self.logger = logging.getLogger('mpclient.mpdsocket') - self._reset() self._commands = { # Admin Commands "disableoutput": self._getnone, @@ -161,17 +165,13 @@ class MPDClient(QtCore.QObject): parts = [command] for arg in args: parts.append('"%s"' % escape(str(arg))) - try: - self._wfile.write(' '.join(parts).encode('utf-8') + '\n') - self._wfile.flush() - except socket.error, e: - self.logger.error('Error sending command: %s.'%e) - self.disconnect_mpd() + self.__sock.write(' '.join(parts).encode('utf-8') + '\n') + self.__sock.waitForBytesWritten() def _readline(self): - line = self._rfile.readline() - if not line.endswith("\n"): - raise ConnectionError("Connection lost while reading line") + while not self.__sock.canReadLine(): + self.__sock.waitForReadyRead() + line = str(self.__sock.readLine()).decode('utf-8') line = line.rstrip("\n") if line.startswith(ERROR_PREFIX): error = line[len(ERROR_PREFIX):].strip() @@ -288,57 +288,30 @@ class MPDClient(QtCore.QObject): self._commandlist = None raise - def _reset(self): - self.mpd_version = None - self._commandlist = None - self._sock = None - self._rfile = _NotConnected() - self._wfile = _NotConnected() + def __handle_error(self): + self.logger.error(self.errorString()) def connect_mpd(self, host, port): - if self._sock: - self.logger.error('Already connected.') - msg = "getaddrinfo returns an empty list" - try: - flags = socket.AI_ADDRCONFIG - except AttributeError: - flags = 0 - if port == None: #assume Unix domain socket - try: - self._sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) - self._sock.connect(host) - except socket.error, e: - if self._sock: - self._sock.close() - self._sock = None - self.logger.error('Error connecting to MPD: %s.'%e) + if self.__sock: + return self.logger.error('Already connected.') + + if not port: + #assume Unix domain socket + self.__sock = QtNetwork.QLocalSocket(self) + self.__sock.connectToServer(host) else: - for res in socket.getaddrinfo(host, port, socket.AF_UNSPEC, - socket.SOCK_STREAM, socket.IPPROTO_TCP, - flags): - af, socktype, proto, canonname, sa = res - try: - self._sock = socket.socket(af, socktype, proto) - self._sock.connect(sa) - except socket.error, e: - if self._sock: - self._sock.close() - self._sock = None - self.logger.error('Error connecting to MPD: %s.'%e) - continue - break - if not self._sock: + self.__sock = QtNetwork.QTcpSocket(self) + self.__sock.connectToHost(host, port) + if not self.__sock.waitForConnected(): + self.logger.error('Error connecting to MPD: %s.'%self.__sock.errorString()) + self.__sock = None return - self._rfile = self._sock.makefile('rb') - self._wfile = self._sock.makefile('wb') + self.__sock.error.connect(self.__handle_error) # read MPD hello - line = self._rfile.readline() - if not line.endswith("\n"): - self.logger.error('Connnection lost while reading MPD hello') - self.disconnect_mpd() - return False - line = line.rstrip("\n") + while not self.__sock.canReadLine(): + self.__sock.waitForReadyRead() + line = str(self.__sock.readLine()) if not line.startswith(HELLO_PREFIX): self.logger.error('Got invalid MPD hello: %s' % line) self.disconnect_mpd() @@ -348,10 +321,14 @@ class MPDClient(QtCore.QObject): self.connect_changed.emit(True) def disconnect_mpd(self): - self._rfile.close() - self._wfile.close() - self._sock.close() - self._reset() + try: + self.__sock.disconnectFromHost() + except AttributeError: + self.__sock.disconnectFromServer() + + self.mpd_version = None + self._commandlist = None + self.__sock = None self.connect_changed.emit(False) def command_list_ok_begin(self): -- cgit v1.2.3