X-Git-Url: http://git.kaliko.me/?p=python-musicpd.git;a=blobdiff_plain;f=mpd.py;h=5e50295df30acb0523d84f5fedd5dfe77048310e;hp=cb16701872c5b700bc44620eb415780e7715e64c;hb=a8b38c7c44c731525fdf02c4bf8cec5acfe86031;hpb=461fe7b8248ef8e26f3c6119a70ef8f0336d033b diff --git a/mpd.py b/mpd.py index cb16701..5e50295 100644 --- a/mpd.py +++ b/mpd.py @@ -1,5 +1,5 @@ # Python MPD client library -# Copyright (C) 2008 J. Alexander Treuman +# Copyright (C) 2008-2010 J. Alexander Treuman # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -41,6 +41,9 @@ class CommandListError(MPDError): class PendingCommandError(MPDError): pass +class IteratingError(MPDError): + pass + class _NotConnected(object): def __getattr__(self, attr): @@ -159,6 +162,9 @@ class MPDClient(object): if self._command_list is not None: raise CommandListError("Cannot use fetch_%s in a command list" % command) + if self._iterating: + raise IteratingError("Cannot use fetch_%s while iterating" % + command) if not self._pending: raise PendingCommandError("No pending commands to fetch") if self._pending[0] != command: @@ -170,6 +176,8 @@ class MPDClient(object): return retval() def _execute(self, command, args): + if self._iterating: + raise IteratingError("Cannot execute %s while iterating" % command) if self._pending: raise PendingCommandError("Cannot execute %s with " "pending commands" % command) @@ -227,7 +235,6 @@ class MPDClient(object): while pair: yield pair pair = self._read_pair(separator) - raise StopIteration def _read_list(self): seen = None @@ -238,12 +245,10 @@ class MPDClient(object): (seen, key)) seen = key yield value - raise StopIteration def _read_playlist(self): for key, value in self._read_pairs(":"): yield value - raise StopIteration def _read_objects(self, delimiters=[]): obj = {} @@ -262,19 +267,27 @@ class MPDClient(object): obj[key] = value if obj: yield obj - raise StopIteration def _read_command_list(self): - for retval in self._command_list: - yield retval() - self._command_list = None + try: + for retval in self._command_list: + yield retval() + finally: + self._command_list = None self._fetch_nothing() - raise StopIteration + + def _iterator_wrapper(self, iterator): + try: + for item in iterator: + yield item + finally: + self._iterating = False def _wrap_iterator(self, iterator): if not self.iterate: return list(iterator) - return iterator + self._iterating = True + return self._iterator_wrapper(iterator) def _fetch_nothing(self): line = self._read_line() @@ -331,6 +344,7 @@ class MPDClient(object): def _reset(self): self.mpd_version = None + self._iterating = False self._pending = [] self._command_list = None self._sock = None @@ -389,9 +403,16 @@ class MPDClient(object): self._sock.close() self._reset() + def fileno(self): + if not self._sock: + raise ConnectionError("Not connected") + return self._sock.fileno() + def command_list_ok_begin(self): if self._command_list is not None: raise CommandListError("Already in command list") + if self._iterating: + raise IteratingError("Cannot begin command list while iterating") if self._pending: raise PendingCommandError("Cannot begin command list " "with pending commands") @@ -401,6 +422,8 @@ class MPDClient(object): def command_list_end(self): if self._command_list is None: raise CommandListError("Not in command list") + if self._iterating: + raise IteratingError("Already iterating over a command list") self._write_command("command_list_end") return self._fetch_command_list()