summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnton Khirnov <wyskas@gmail.com>2009-10-08 08:53:57 +0200
committerAnton Khirnov <wyskas@gmail.com>2009-10-08 08:53:57 +0200
commitb485b8b82b67edd1337dc5ca5b2f0dabca7336d9 (patch)
tree7988085c98b9d6af1ee90ebfbd2e1237c0c5c834
parentf75f2eaa28c28a919ce08c5e1d66320963cbb414 (diff)
mpd: switch to QtNetwork networking.
with this using "idle" command in the future will be easier.
-rw-r--r--nephilim/mpclient.py2
-rw-r--r--nephilim/mpd.py99
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):