| From 39a7d79ee6c548902fbac8b95c934af7e4c69260 Mon Sep 17 00:00:00 2001 |
| From: Vendula Poncova <vponcova@redhat.com> |
| Date: Thu, 2 Aug 2018 15:30:45 +0800 |
| Subject: [PATCH 1/2] Support asynchronous calls (#58) |
| |
| Added support for asynchronous calls of methods. A method is called |
| synchronously unless its callback parameter is specified. A callback |
| is a function f(*args, returned=None, error=None), where args is |
| callback_args specified in the method call, returned is a return |
| value of the method and error is an exception raised by the method. |
| |
| Example of an asynchronous call: |
| |
| def func(x, y, returned=None, error=None): |
| pass |
| |
| proxy.Method(a, b, callback=func, callback_args=(x, y)) |
| |
| Upstream-Status: Cherry-pick [https://src.fedoraproject.org/cgit/rpms/python-pydbus.git/] |
| |
| Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com> |
| --- |
| pydbus/proxy_method.py | 44 ++++++++++++++++++++++++++++++++++++++------ |
| 1 file changed, 38 insertions(+), 6 deletions(-) |
| |
| diff --git a/pydbus/proxy_method.py b/pydbus/proxy_method.py |
| index 8798edd..4ea4304 100644 |
| --- a/pydbus/proxy_method.py |
| +++ b/pydbus/proxy_method.py |
| @@ -65,15 +65,34 @@ class ProxyMethod(object): |
| |
| # Python 2 sux |
| for kwarg in kwargs: |
| - if kwarg not in ("timeout",): |
| + if kwarg not in ("timeout", "callback", "callback_args"): |
| raise TypeError(self.__qualname__ + " got an unexpected keyword argument '{}'".format(kwarg)) |
| timeout = kwargs.get("timeout", None) |
| + callback = kwargs.get("callback", None) |
| + callback_args = kwargs.get("callback_args", tuple()) |
| + |
| + call_args = ( |
| + instance._bus_name, |
| + instance._path, |
| + self._iface_name, |
| + self.__name__, |
| + GLib.Variant(self._sinargs, args), |
| + GLib.VariantType.new(self._soutargs), |
| + 0, |
| + timeout_to_glib(timeout), |
| + None |
| + ) |
| + |
| + if callback: |
| + call_args += (self._finish_async_call, (callback, callback_args)) |
| + instance._bus.con.call(*call_args) |
| + return None |
| + else: |
| + ret = instance._bus.con.call_sync(*call_args) |
| + return self._unpack_return(ret) |
| |
| - ret = instance._bus.con.call_sync( |
| - instance._bus_name, instance._path, |
| - self._iface_name, self.__name__, GLib.Variant(self._sinargs, args), GLib.VariantType.new(self._soutargs), |
| - 0, timeout_to_glib(timeout), None).unpack() |
| - |
| + def _unpack_return(self, values): |
| + ret = values.unpack() |
| if len(self._outargs) == 0: |
| return None |
| elif len(self._outargs) == 1: |
| @@ -81,6 +100,19 @@ class ProxyMethod(object): |
| else: |
| return ret |
| |
| + def _finish_async_call(self, source, result, user_data): |
| + error = None |
| + return_args = None |
| + |
| + try: |
| + ret = source.call_finish(result) |
| + return_args = self._unpack_return(ret) |
| + except Exception as err: |
| + error = err |
| + |
| + callback, callback_args = user_data |
| + callback(*callback_args, returned=return_args, error=error) |
| + |
| def __get__(self, instance, owner): |
| if instance is None: |
| return self |
| -- |
| 2.7.4 |
| |