From 2c32e72bfdeee82b55d38ca79b38ab9c847b3bd3 Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Sun, 28 Nov 2010 17:29:30 +0100 Subject: mpdsocket: support ignoring errors apparrently there's no clean way to do some things (like querying whether a sticker exists) without triggering an error. --- nephilim/mpdsocket.py | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/nephilim/mpdsocket.py b/nephilim/mpdsocket.py index 005ddd2..685b3d8 100644 --- a/nephilim/mpdsocket.py +++ b/nephilim/mpdsocket.py @@ -43,7 +43,7 @@ class MPDSocket(QtCore.QObject): #### PRIVATE #### _logger = None _sock = None - """A list of callbacks that are waiting for a response from MPD.""" + """A list of (callback, report_errors) that are waiting for a response from MPD.""" _cmd_queue = None _is_idle = False @@ -114,7 +114,12 @@ class MPDSocket(QtCore.QObject): else: callback = self._parse_discard - self._cmd_queue.append(callback) + if 'report_errors' in kwargs: + report_errors = bool(kwargs['report_errors']) + else: + report_errors = True + + self._cmd_queue.append((callback, report_errors)) if self._is_idle: self._sock.write('noidle\n') self._sock.write(args[0]) @@ -167,14 +172,15 @@ class MPDSocket(QtCore.QObject): Escape backslashes and quotes before sending. """ return text.replace('\\', '\\\\').replace('"', '\\"') - def _readline(self): + def _readline(self, report_errors = True): """ Read from the socket one line and return it, unless it's an error or end of response. """ line = str(self._sock.readLine()).decode('utf-8').rstrip('\n') if line.startswith(self.ERROR_PREFIX): - self._logger.error('MPD returned error: %s'%line) + if report_errors: + self._logger.error('MPD returned error: %s'%line) return if line == self.SUCCESS: return @@ -262,16 +268,16 @@ class MPDSocket(QtCore.QObject): # wait for more data if not self._sock.canReadLine(): return - self._cmd_queue[0](self._read_response()) + self._cmd_queue[0][0](self._read_response(self._cmd_queue[0][1])) del self._cmd_queue[0] self._idle() - def _read_response(self): + def _read_response(self, report_errors = True): """ An iterator over all lines in one response. """ while self._sock.canReadLine(): - line = self._readline() + line = self._readline(report_errors) if not line: raise StopIteration yield line -- cgit v1.2.3