Mercurial > libervia-backend
comparison src/bridge/bridge_constructor/dbus_core_template.py @ 423:6c20c76abdcc
backend: - bridge async D-Bus method now automatically manage callback and errback, we just have to return a deferred
- getParams, getParamsForCategory and getParamsUI are now asynchronous
primitivus: management of asynchronous getParamsUI
author | Goffi <goffi@goffi.org> |
---|---|
date | Mon, 07 Nov 2011 00:09:22 +0100 |
parents | 6c167a2e04b8 |
children | 72c13313b6d6 |
comparison
equal
deleted
inserted
replaced
422:5a18c5f08d9b | 423:6c20c76abdcc |
---|---|
22 | 22 |
23 from bridge import Bridge | 23 from bridge import Bridge |
24 import dbus | 24 import dbus |
25 import dbus.service | 25 import dbus.service |
26 import dbus.mainloop.glib | 26 import dbus.mainloop.glib |
27 from logging import debug, info | 27 from logging import debug, info, error |
28 from twisted.internet.defer import Deferred | |
28 | 29 |
29 const_INT_PREFIX = "org.goffi.SAT" #Interface prefix | 30 const_INT_PREFIX = "org.goffi.SAT" #Interface prefix |
30 const_ERROR_PREFIX = const_INT_PREFIX+".error" | 31 const_ERROR_PREFIX = const_INT_PREFIX+".error" |
31 const_OBJ_PATH = '/org/goffi/SAT/bridge' | 32 const_OBJ_PATH = '/org/goffi/SAT/bridge' |
32 const_CORE_SUFFIX = ".core" | 33 const_CORE_SUFFIX = ".core" |
33 const_PLUGIN_SUFFIX = ".plugin" | 34 const_PLUGIN_SUFFIX = ".plugin" |
34 | 35 |
36 class MethodNotRegistered(dbus.DBusException): | |
37 _dbus_error_name = const_ERROR_PREFIX + ".MethodNotRegistered" | |
38 | |
39 class InternalError(dbus.DBusException): | |
40 _dbus_error_name = const_ERROR_PREFIX + ".InternalError" | |
41 | |
42 class AsyncNotDeferred(dbus.DBusException): | |
43 _dbus_error_name = const_ERROR_PREFIX + ".AsyncNotDeferred" | |
44 | |
35 class GenericException(dbus.DBusException): | 45 class GenericException(dbus.DBusException): |
36 def __init__(self, name): | 46 def __init__(self, twisted_error): |
37 super(GenericException,self).__init__() | 47 super(GenericException,self).__init__() |
38 self._dbus_error_name = const_ERROR_PREFIX+"."+name | 48 mess = twisted_error.getErrorMessage() |
49 self._dbus_error_name = const_ERROR_PREFIX+"."+ (mess or str(err.__class__)) | |
39 | 50 |
40 class DbusObject(dbus.service.Object): | 51 class DbusObject(dbus.service.Object): |
41 | 52 |
42 def __init__(self, bus, path): | 53 def __init__(self, bus, path): |
43 dbus.service.Object.__init__(self, bus, path) | 54 dbus.service.Object.__init__(self, bus, path) |
44 debug("Init DbusObject...") | 55 debug("Init DbusObject...") |
45 self.cb={} | 56 self.cb={} |
46 | 57 |
47 def register(self, name, cb): | 58 def register(self, name, cb): |
48 self.cb[name]=cb | 59 self.cb[name]=cb |
60 | |
61 def _callback(self, name, *args, **kwargs): | |
62 """call the callback if it exists, raise an exception else | |
63 if the callback return a deferred, use async methods""" | |
64 if not name in self.cb: | |
65 raise MethodNotRegistered | |
66 | |
67 if "callback" in kwargs: | |
68 #we must have errback too | |
69 if not "errback" in kwargs: | |
70 error("errback is missing in method call [%s]" % name) | |
71 raise InternalError | |
72 callback = kwargs.pop("callback") | |
73 errback = kwargs.pop("errback") | |
74 async = True | |
75 else: | |
76 async = False | |
77 result = self.cb[name](*args, **kwargs) | |
78 if async: | |
79 if not isinstance(result, Deferred): | |
80 error("Asynchrone method [%s] does not return a Deferred." % name) | |
81 raise AsyncNotDeferred | |
82 result.addCallback(callback) | |
83 result.addErrback(lambda err:errback(GenericException(err))) | |
84 else: | |
85 return result | |
49 | 86 |
50 ### signals ### | 87 ### signals ### |
51 | 88 |
52 @dbus.service.signal(const_INT_PREFIX+const_PLUGIN_SUFFIX, | 89 @dbus.service.signal(const_INT_PREFIX+const_PLUGIN_SUFFIX, |
53 signature='') | 90 signature='') |