diff options
author | Anton Khirnov <wyskas@gmail.com> | 2009-10-08 08:53:57 +0200 |
---|---|---|
committer | Anton Khirnov <wyskas@gmail.com> | 2009-10-08 08:53:57 +0200 |
commit | b485b8b82b67edd1337dc5ca5b2f0dabca7336d9 (patch) | |
tree | 7988085c98b9d6af1ee90ebfbd2e1237c0c5c834 /nephilim | |
parent | f75f2eaa28c28a919ce08c5e1d66320963cbb414 (diff) |
mpd: switch to QtNetwork networking.
with this using "idle" command in the future will be easier.
Diffstat (limited to 'nephilim')
-rw-r--r-- | nephilim/mpclient.py | 2 | ||||
-rw-r--r-- | 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): |