def __init__(self): self.__manager = ServersManager.get_instance() self.__scheduler = Scheduler(self.__manager) self.__tasks = {} self.__running = False self.__listeners = [] self.__ensure_run()
def __init__(self): self.__manager = ServersManager.get_instance() self.__scheduler = Scheduler(self.__manager) self.__tasks = {} self.__running = False self.__listeners = [] self.__ensure_run()
class DownUpManager: """ Download/Upload manager. This manager handles upload and download tasks and allows task management (start,suspend,stop,cancel). Notifications are sent by this manager to every registered listeners, making them able to react on events and interact with active tasks (upload or down- load tasks). Tasks are referenced by UUIDs, instead of using objects. That is, it is very easy to manage tasks without having complex objects. This class is an interface for every background running tasks. """ gDownUpManager = None @staticmethod def get_instance(): if DownUpManager.gDownUpManager is None: DownUpManager.gDownUpManager = DownUpManager() return DownUpManager.gDownUpManager def __init__(self): self.__manager = ServersManager.get_instance() self.__scheduler = Scheduler(self.__manager) self.__tasks = {} self.__running = False self.__listeners = [] self.__ensure_run() def __ensure_run(self): """ Make sure the scheduler is running """ if self.__running == False: self.__scheduler.start() self.__running = True ## Listeners def register_listener(self, listener): """ Register a listener """ if listener not in self.__listeners: self.__listeners.append(listener) def remove_listener(self, listener): """ Unregister a listener """ if listener in self.__listeners: self.__listeners.remove(listener) ## Events def notify_task_created(self, task): """ Notify listeners about a new task """ for listener in self.__listeners: listener.on_task_created(task) def notify_task_started(self, task): """ Notify listeners about a started task """ for listener in self.__listeners: listener.on_task_started(task) def notify_task_done(self, task): """ Notify listeners about a completed task """ for listener in self.__listeners: listener.on_task_done(task) def notify_task_progress(self, task, progress): """ Notify listeners about an active task """ for listener in self.__listeners: listener.on_task_progress(task, progress) def notify_task_cancel(self, task): """ Notify listeners about a canceled task """ for listener in self.__listeners: listener.on_task_cancel(task) def notify_task_suspended(self, task): """ Notify listeners about a suspended task """ for listener in self.__listeners: listener.on_task_suspended(task) def notify_task_resumed(self, task): """ Notify listeners about a resumed task """ for listener in self.__listeners: listener.on_task_resumed(task) def notify_task_error(self, task): """ Notify listeners about an error that occured during task processing """ for listener in self.__listeners: listener.on_task_error(task) ## Task management def queue_task(self, task): """ Queue a given task (forward the task directly to the scheduler) """ self.__scheduler.queue_task(task) def __register_task(self, task): """ Register a new task """ if task.uuid not in self.__tasks: self.__tasks[task.uuid] = TaskRef(task) self.notify_task_created(task.uuid) def upload(self, filename): """ Upload a file """ task = UpTask(self, filename) self.__register_task(task) return task.uuid def download(self, url, prefix=''): """ Download a file. The prefix parameter can be used to specify a destination directory """ task = DownTask(self, url, prefix) self.__register_task(task) return task.uuid def start_task(self, task): """ Start a given task Task must be registered before start """ if task in self.__tasks: self.__tasks[task].object.process() self.notify_task_started(task) def remove_task(self, task): """ Remove task. Cancel task and unregister it. """ if task in self.__tasks: self.__tasks[task].cancel() del self.__tasks[task] def suspend_task(self, task): """ Suspend task. Task must have been registered before. """ if task in self.__tasks: self.__tasks[task].suspend() def resume_task(self, task): """ Resume task. Task must have been registered before. """ if task in self.__tasks: self.__tasks[task].resume() def get_task_status(self, task): """ Retrieve task status. Return a AbstractTask status code. """ if task in self.__tasks: return self.__tasks[task].status def get_task(self, task): """ Return an internal task object """ if task in self.__tasks: return self.__tasks[task] else: return None def cancel(self, task): """ Cancel task. """ if task in self.__tasks: self.__tasks[task].cancel() self.notify_task_cancel(task) def shutdown(self): """ Shutdown upload/download manager. Cause the scheduler to shutdown. """ self.__scheduler.cancel() self.__scheduler.join() ## Events def on_task_done(self, task): """ Task done event handler """ if task.uuid in self.__tasks: self.__tasks[task.uuid].status = TaskStatus.TASK_DONE self.notify_task_done(task.uuid) def on_task_error(self, task): """ Task error event handler """ if task.uuid in self.__tasks: self.__tasks[task.uuid].status = TaskStatus.TASK_ERR self.notify_task_error(task.uuid) def on_task_progress(self, task, done, total): """ Task progress event handler """ if task.uuid in self.__tasks: self.__tasks[task.uuid].update(done, total) self.notify_task_progress(task.uuid, float(done)/total) def on_server_discovered(self, server): """ New server discovered event handler """ if not self.__manager.has(server): # check server and register it # this would normally not cause an error # but who knows =) try: server.get_version() server.get_capacity() self.__manager.add(server) except ServerIOError: pass
class DownUpManager: """ Download/Upload manager. This manager handles upload and download tasks and allows task management (start,suspend,stop,cancel). Notifications are sent by this manager to every registered listeners, making them able to react on events and interact with active tasks (upload or down- load tasks). Tasks are referenced by UUIDs, instead of using objects. That is, it is very easy to manage tasks without having complex objects. This class is an interface for every background running tasks. """ gDownUpManager = None @staticmethod def get_instance(): if DownUpManager.gDownUpManager is None: DownUpManager.gDownUpManager = DownUpManager() return DownUpManager.gDownUpManager def __init__(self): self.__manager = ServersManager.get_instance() self.__scheduler = Scheduler(self.__manager) self.__tasks = {} self.__running = False self.__listeners = [] self.__ensure_run() def __ensure_run(self): """ Make sure the scheduler is running """ if self.__running == False: self.__scheduler.start() self.__running = True ## Listeners def register_listener(self, listener): """ Register a listener """ if listener not in self.__listeners: self.__listeners.append(listener) def remove_listener(self, listener): """ Unregister a listener """ if listener in self.__listeners: self.__listeners.remove(listener) ## Events def notify_task_created(self, task): """ Notify listeners about a new task """ for listener in self.__listeners: listener.on_task_created(task) def notify_task_started(self, task): """ Notify listeners about a started task """ for listener in self.__listeners: listener.on_task_started(task) def notify_task_done(self, task): """ Notify listeners about a completed task """ for listener in self.__listeners: listener.on_task_done(task) def notify_task_progress(self, task, progress): """ Notify listeners about an active task """ for listener in self.__listeners: listener.on_task_progress(task, progress) def notify_task_cancel(self, task): """ Notify listeners about a canceled task """ for listener in self.__listeners: listener.on_task_cancel(task) def notify_task_suspended(self, task): """ Notify listeners about a suspended task """ for listener in self.__listeners: listener.on_task_suspended(task) def notify_task_resumed(self, task): """ Notify listeners about a resumed task """ for listener in self.__listeners: listener.on_task_resumed(task) def notify_task_error(self, task): """ Notify listeners about an error that occured during task processing """ for listener in self.__listeners: listener.on_task_error(task) ## Task management def queue_task(self, task): """ Queue a given task (forward the task directly to the scheduler) """ self.__scheduler.queue_task(task) def __register_task(self, task): """ Register a new task """ if task.uuid not in self.__tasks: self.__tasks[task.uuid] = TaskRef(task) self.notify_task_created(task.uuid) def upload(self, filename): """ Upload a file """ task = UpTask(self, filename) self.__register_task(task) return task.uuid def download(self, url, prefix=''): """ Download a file. The prefix parameter can be used to specify a destination directory """ task = DownTask(self, url, prefix) self.__register_task(task) return task.uuid def start_task(self, task): """ Start a given task Task must be registered before start """ if task in self.__tasks: self.__tasks[task].object.process() self.notify_task_started(task) def remove_task(self, task): """ Remove task. Cancel task and unregister it. """ if task in self.__tasks: self.__tasks[task].cancel() del self.__tasks[task] def suspend_task(self, task): """ Suspend task. Task must have been registered before. """ if task in self.__tasks: self.__tasks[task].suspend() def resume_task(self, task): """ Resume task. Task must have been registered before. """ if task in self.__tasks: self.__tasks[task].resume() def get_task_status(self, task): """ Retrieve task status. Return a AbstractTask status code. """ if task in self.__tasks: return self.__tasks[task].status def get_task(self, task): """ Return an internal task object """ if task in self.__tasks: return self.__tasks[task] else: return None def cancel(self, task): """ Cancel task. """ if task in self.__tasks: self.__tasks[task].cancel() self.notify_task_cancel(task) def shutdown(self): """ Shutdown upload/download manager. Cause the scheduler to shutdown. """ self.__scheduler.cancel() self.__scheduler.join() ## Events def on_task_done(self, task): """ Task done event handler """ if task.uuid in self.__tasks: self.__tasks[task.uuid].status = TaskStatus.TASK_DONE self.notify_task_done(task.uuid) def on_task_error(self, task): """ Task error event handler """ if task.uuid in self.__tasks: self.__tasks[task.uuid].status = TaskStatus.TASK_ERR self.notify_task_error(task.uuid) def on_task_progress(self, task, done, total): """ Task progress event handler """ if task.uuid in self.__tasks: self.__tasks[task.uuid].update(done, total) self.notify_task_progress(task.uuid, float(done)/total) def on_server_discovered(self, server): """ New server discovered event handler """ if not self.__manager.has(server): # check server and register it # this would normally not cause an error # but who knows =) try: server.get_version() server.get_capacity() self.__manager.add(server) except ServerIOError: pass