import logging import gobject LOGGER = logging.getLogger("sugar.tutorius.dbustools") def save_args(callable, *xargs, **xkwargs): def __call(*args, **kwargs): kw = dict() kw.update(kwargs) kw.update(xkwargs) return callable(*(xargs+args), **kw) return __call def ignore(*args): LOGGER.debug("Unhandled asynchronous dbus call response with arguments: %s", str(args)) def logError(error): LOGGER.error("Unhandled asynchronous dbus call error: %s", error) def remote_call(callable, args, return_cb=None, error_cb=None, block=False): reply_cb = return_cb or ignore errhandler_cb = error_cb or logError if block: try: ret_val = callable(*args) LOGGER.debug("remote_call return arguments: %s", str(ret_val)) except Exception, e: #Use the specified error handler even for blocking calls errhandler_cb(e) return #Return value signature might be : if ret_val is None: #Nothing return reply_cb() elif type(ret_val) in (list, tuple): #Several parameters return reply_cb(*ret_val) else: #One parameter return reply_cb(ret_val) else: callable(*args, reply_handler=reply_cb, error_handler=errhandler_cb) class Future(object): def __init__(self): self._value = None def get(self): context = gobject.MainLoop().get_context() while self._value == None and context.iteration(True): pass return self._value def _set(self, value): self._value = value