+class IdleThread(object):
+ def __init__(self, parent, folder=None):
+ self.parent = parent
+ self.folder = folder
+ self.event = Event()
+ if folder is None:
+ self.thread = Thread(target=self.noop)
+ else:
+ self.thread = Thread(target=self.idle)
+ self.thread.setDaemon(1)
+
+ def start(self):
+ self.thread.start()
+
+ def stop(self):
+ self.event.set()
+
+ def join(self):
+ self.thread.join()
+
+ def noop(self):
+ imapobj = self.parent.acquireconnection()
+ imapobj.noop()
+ self.event.wait()
+ self.parent.releaseconnection(imapobj)
+
+ def dosync(self):
+ remoterepos = self.parent.repos
+ account = remoterepos.account
+ localrepos = account.localrepos
+ remoterepos = account.remoterepos
+ statusrepos = account.statusrepos
+ remotefolder = remoterepos.getfolder(self.folder)
+ syncfolder(account.name, remoterepos, remotefolder, localrepos, statusrepos, quick=False)
+ ui = UIBase.getglobalui()
+ ui.unregisterthread(currentThread())
+
+ def idle(self):
+ imapobj = self.parent.acquireconnection()
+ imapobj.select(self.folder)
+ self.parent.releaseconnection(imapobj)
+ while True:
+ if self.event.isSet():
+ return
+ self.needsync = False
+ def callback(args):
+ if not self.event.isSet():
+ self.needsync = True
+ self.event.set()
+ imapobj = self.parent.acquireconnection()
+ if "IDLE" in imapobj.capabilities:
+ imapobj.idle(callback=callback)
+ else:
+ imapobj.noop()
+ self.event.wait()
+ if self.event.isSet():
+ imapobj.noop()
+ self.parent.releaseconnection(imapobj)
+ if self.needsync:
+ self.event.clear()
+ self.dosync()
+