home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2010 November / maximum-cd-2010-11.iso / DiscContents / calibre-0.7.13.msi / file_1880 (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2010-08-06  |  4.9 KB  |  135 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. __docformat__ = 'restructuredtext en'
  5. from twisted.application import service
  6. from twisted.internet import defer, reactor
  7. from twisted.python import log, components, failure
  8. from zope.interface import Interface, implements, Attribute
  9. from IPython.kernel.twistedutil import gatherBoth
  10. from IPython.kernel import error
  11. from IPython.external import guid
  12. from IPython.tools import growl
  13.  
  14. class PendingDeferredManager(object):
  15.     
  16.     def __init__(self):
  17.         self.results = { }
  18.         self.deferred_ids = []
  19.         self.deferreds_to_callback = { }
  20.  
  21.     
  22.     def get_deferred_id(self):
  23.         return guid.generate()
  24.  
  25.     
  26.     def quick_has_id(self, deferred_id):
  27.         return deferred_id in self.deferred_ids
  28.  
  29.     
  30.     def _save_result(self, result, deferred_id):
  31.         if self.quick_has_id(deferred_id):
  32.             self.results[deferred_id] = result
  33.             self._trigger_callbacks(deferred_id)
  34.         
  35.  
  36.     
  37.     def _trigger_callbacks(self, deferred_id):
  38.         result = self.results.get(deferred_id)
  39.         if result is not None:
  40.             
  41.             try:
  42.                 d = self.deferreds_to_callback.pop(deferred_id)
  43.             except KeyError:
  44.                 d = None
  45.  
  46.             if d is not None:
  47.                 if isinstance(result, failure.Failure):
  48.                     d.errback(result)
  49.                 else:
  50.                     d.callback(result)
  51.                 self.delete_pending_deferred(deferred_id)
  52.             
  53.         
  54.  
  55.     
  56.     def save_pending_deferred(self, d, deferred_id = None):
  57.         if deferred_id is None:
  58.             deferred_id = self.get_deferred_id()
  59.         
  60.         self.deferred_ids.append(deferred_id)
  61.         d.addBoth(self._save_result, deferred_id)
  62.         return deferred_id
  63.  
  64.     
  65.     def _protected_del(self, key, container):
  66.         
  67.         try:
  68.             del container[key]
  69.         except Exception:
  70.             pass
  71.  
  72.  
  73.     
  74.     def delete_pending_deferred(self, deferred_id):
  75.         if self.quick_has_id(deferred_id):
  76.             d = self.deferreds_to_callback.get(deferred_id)
  77.             if d is not None:
  78.                 d.errback(failure.Failure(error.AbortedPendingDeferredError('pending deferred has been deleted: %r' % deferred_id)))
  79.             
  80.             ind = self.deferred_ids.index(deferred_id)
  81.             self._protected_del(ind, self.deferred_ids)
  82.             self._protected_del(deferred_id, self.deferreds_to_callback)
  83.             self._protected_del(deferred_id, self.results)
  84.         else:
  85.             raise error.InvalidDeferredID('invalid deferred_id: %r' % deferred_id)
  86.         return self.quick_has_id(deferred_id)
  87.  
  88.     
  89.     def clear_pending_deferreds(self):
  90.         for did in self.deferred_ids:
  91.             self.delete_pending_deferred(did)
  92.         
  93.  
  94.     
  95.     def _delete_and_pass_through(self, r, deferred_id):
  96.         self.delete_pending_deferred(deferred_id)
  97.         return r
  98.  
  99.     
  100.     def get_pending_deferred(self, deferred_id, block):
  101.         if not self.quick_has_id(deferred_id) or self.deferreds_to_callback.get(deferred_id) is not None:
  102.             return defer.fail(failure.Failure(error.InvalidDeferredID('invalid deferred_id: %r' + deferred_id)))
  103.         result = self.results.get(deferred_id)
  104.         if result is not None:
  105.             self.delete_pending_deferred(deferred_id)
  106.             if isinstance(result, failure.Failure):
  107.                 return defer.fail(result)
  108.             return defer.succeed(result)
  109.         result is not None
  110.         if block:
  111.             d = defer.Deferred()
  112.             self.deferreds_to_callback[deferred_id] = d
  113.             return d
  114.         return defer.fail(failure.Failure(error.ResultNotCompleted('result not completed: %r' % deferred_id)))
  115.  
  116.  
  117.  
  118. def two_phase(wrapped_method):
  119.     
  120.     def wrapper_two_phase(pdm, *args, **kwargs):
  121.         
  122.         try:
  123.             block = kwargs.pop('block')
  124.         except KeyError:
  125.             block = True
  126.  
  127.         if block:
  128.             return wrapped_method(pdm, *args, **kwargs)
  129.         d = wrapped_method(pdm, *args, **kwargs)
  130.         deferred_id = pdm.save_pending_deferred(d)
  131.         return defer.succeed(deferred_id)
  132.  
  133.     return wrapper_two_phase
  134.  
  135.