Merge remote branch 'origin/acid-burn/virtualkeyboard' into experimental
[vuplus_dvbapp] / lib / python / Components / Task.py
index 04e5c93..8676923 100644 (file)
@@ -16,6 +16,7 @@ class Job(object):
                self.end = 100
                self.__progress = 0
                self.weightScale = 1
+               self.afterEvent = None
 
                self.state_changed = CList()
 
@@ -63,11 +64,10 @@ class Job(object):
        def runNext(self):
                if self.current_task == len(self.tasks):
                        if len(self.resident_tasks) == 0:
-                               cb = self.callback
-                               self.callback = None
                                self.status = self.FINISHED
                                self.state_changed()
-                               cb(self, None, [])
+                               self.callback(self, None, [])
+                               self.callback = None
                        else:
                                print "still waiting for %d resident task(s) %s to finish" % (len(self.resident_tasks), str(self.resident_tasks))
                else:
@@ -108,7 +108,6 @@ class Job(object):
                        self.tasks[i].abort()
 
        def cancel(self):
-               # some Jobs might have a better idea of how to cancel a job
                self.abort()
 
 class Task(object):
@@ -131,6 +130,7 @@ class Task(object):
                self.task_progress_changed = None
                self.output_line = ""
                job.addTask(self)
+               self.container = None
 
        def setCommandline(self, cmd, args):
                self.cmd = cmd
@@ -211,7 +211,8 @@ class Task(object):
                self.finish()
 
        def abort(self):
-               self.container.kill()
+               if self.container:
+                       self.container.kill()
                self.finish(aborted = True)
 
        def finish(self, aborted = False):
@@ -303,6 +304,7 @@ class JobManager:
                        list.append(self.active_job)
                list += self.active_jobs
                return list
+
 # some examples:
 #class PartitionExistsPostcondition:
 #      def __init__(self, device):
@@ -368,12 +370,20 @@ class DiskspacePrecondition(Condition):
 class ToolExistsPrecondition(Condition):
        def check(self, task):
                import os
+               
                if task.cmd[0]=='/':
-                       realpath = task.cmd
+                       self.realpath = task.cmd
+                       print "[Task.py][ToolExistsPrecondition] WARNING: usage of absolute paths for tasks should be avoided!" 
+                       return os.access(self.realpath, os.X_OK)
                else:
-                       realpath = task.cwd + '/' + task.cmd
-               self.realpath = realpath
-               return os.access(realpath, os.X_OK)
+                       self.realpath = task.cmd
+                       path = os.environ.get('PATH', '').split(os.pathsep)
+                       path.append(task.cwd + '/')
+                       absolutes = filter(lambda file: os.access(file, os.X_OK), map(lambda directory, file = task.cmd: os.path.join(directory, file), path))
+                       if len(absolutes) > 0:
+                               self.realpath = task.cmd[0]
+                               return True
+               return False 
 
        def getErrorMessage(self, task):
                return _("A required tool (%s) was not found.") % (self.realpath)