+from Queue import Queue, Empty
+
+class SigListener(Queue):
+ def __init__(self):
+ self.folderlock = Lock()
+ self.folders = None
+ Queue.__init__(self, 20)
+ def put_nowait(self, sig):
+ self.folderlock.acquire()
+ try:
+ if sig == 1:
+ if self.folders is None or not self.autorefreshes:
+ # folders haven't yet been added, or this account is once-only; drop signal
+ return
+ elif self.folders:
+ for foldernr in range(len(self.folders)):
+ # requeue folder
+ self.folders[foldernr][1] = True
+ self.quick = False
+ return
+ # else folders have already been cleared, put signal...
+ finally:
+ self.folderlock.release()
+ Queue.put_nowait(self, sig)
+ def addfolders(self, remotefolders, autorefreshes, quick):
+ self.folderlock.acquire()
+ try:
+ self.folders = []
+ self.quick = quick
+ self.autorefreshes = autorefreshes
+ for folder in remotefolders:
+ # new folders are queued
+ self.folders.append([folder, True])
+ finally:
+ self.folderlock.release()
+ def clearfolders(self):
+ self.folderlock.acquire()
+ try:
+ for folder, queued in self.folders:
+ if queued:
+ # some folders still in queue
+ return False
+ self.folders[:] = []
+ return True
+ finally:
+ self.folderlock.release()
+ def queuedfolders(self):
+ self.folderlock.acquire()
+ try:
+ dirty = True
+ while dirty:
+ dirty = False
+ for foldernr, (folder, queued) in enumerate(self.folders):
+ if queued:
+ # mark folder as no longer queued
+ self.folders[foldernr][1] = False
+ dirty = True
+ quick = self.quick
+ self.folderlock.release()
+ yield (folder, quick)
+ self.folderlock.acquire()
+ finally:
+ self.folderlock.release()