iro/controller/task.py
branchdevel
changeset 234 08fcc2b6df99
parent 217 d755b2e0cc0b
child 238 c36b117f7400
--- a/iro/controller/task.py	Sun Mar 18 14:08:06 2012 +0100
+++ b/iro/controller/task.py	Wed Mar 21 17:24:46 2012 +0100
@@ -1,6 +1,6 @@
 from functools import partial
 
-from twisted.internet.defer import inlineCallbacks, returnValue 
+from twisted.internet.defer import inlineCallbacks, returnValue, maybeDeferred, Deferred
 
 from ..error import NoRouteForTask, RejectRecipient
 
@@ -23,29 +23,38 @@
         self.status = status
         return status
 
-    def setError(self,error):
+    def setError(self, error):
         self.status = error
         self.error = True
         return error
 
     def start(self):
-        self.d = taskPool.run(self._run)
+        self.d = Deferred()
         self.d.addCallback(self.setStatus)
         self.d.addCallback(partial(self.job.setStatus,self))
         self.d.addErrback(self.setError)
         self.d.addErrback(partial(self.job.setError,self))
+        taskPool.run(self._run)
         return self.d
 
-    @inlineCallbacks
     def _run(self):
-        for offer in self.job.offers:
+        os= (i for i in self.job.offers)
+        def n():
             try:
-                ret = yield offers[offer](self.recipient,self.job.message)
-                returnValue(ret)
-            except RejectRecipient:
-                continue
-        else:
-            raise NoRouteForTask()
+                offer = os.next()
+                d = maybeDeferred(offers[offer],self.recipient,self.job.message)
+                d.addCallback(self.d.callback)
+                d.addErrback(addErr)
+                d.addErrback(self.d.errback)
+                return d
+            except StopIteration:
+                self.d.errback(NoRouteForTask())
+
+        def addErr(failure):
+            failure.trap(RejectRecipient)
+            return n()
+        
+        n()
 
 
 @inlineCallbacks