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='')