Ejemplo n.º 1
0
 def __init__(self):
     self.__manager = ServersManager.get_instance()
     self.__scheduler = Scheduler(self.__manager)
     self.__tasks = {}
     self.__running = False
     self.__listeners = []
     self.__ensure_run()
Ejemplo n.º 2
0
 def __init__(self):
     self.__manager = ServersManager.get_instance()
     self.__scheduler = Scheduler(self.__manager)
     self.__tasks = {}
     self.__running = False
     self.__listeners = []
     self.__ensure_run()
Ejemplo n.º 3
0
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
Ejemplo n.º 4
0
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