diff --git a/secop/client/__init__.py b/secop/client/__init__.py index a3d3b9b..68070d4 100644 --- a/secop/client/__init__.py +++ b/secop/client/__init__.py @@ -107,21 +107,21 @@ class ProxyClient: # caches (module, parameter) = value, timestamp, readerror (internal names!) self.cache = {} - def register(self, key, obj=None, **kwds): + def register_callback(self, key, *args, **kwds): """register callback functions - - kwds each key must be a valid callback name defined in self.CALLBACK_NAMES - - kwds values are the callback functions - - if obj is not None, use its methods named from the callback name, if not given in kwds - key might be either: 1) None: general callback (all callbacks) 2) : callbacks related to a module (not called for 'unhandledMessage') 3) (, ): callback for specified parameter (only called for 'updateEvent') + - all the following arguments are callback functions. The callback name may be + given by the keyword, or, for non-keyworded arguments it is taken from the + __name__ attribute of the function """ + for cbfunc in args: + kwds[cbfunc.__name__] = cbfunc for cbname in self.CALLBACK_NAMES: cbfunc = kwds.pop(cbname, None) - if obj and cbfunc is None: - cbfunc = getattr(obj, cbname, None) if not cbfunc: continue cbdict = self.callbacks[cbname] diff --git a/secop/gui/mainwindow.py b/secop/gui/mainwindow.py index 6c0cd3d..afda457 100644 --- a/secop/gui/mainwindow.py +++ b/secop/gui/mainwindow.py @@ -55,7 +55,7 @@ class QSECNode(QObject): self.modules = conn.modules self.properties = self.conn.properties self.protocolVersion = conn.secop_version - conn.register(None, self) # generic callback + conn.register_callback(None, self.updateEvent, self.nodeStateChange, self.unhandledMessage) # provide methods from old baseclient for making other gui code work @@ -81,7 +81,10 @@ class QSECNode(QObject): return self.conn.getParameter(module, parameter, True) def execCommand(self, module, command, arg): - return self.conn.execCommand(module, command, arg) + try: + return self.conn.execCommand(module, command, arg) + except Exception as e: + return 'ERROR: %r' % e, {} def queryCache(self, module): return {k: Value(*self.conn.cache[(module, k)]) diff --git a/secop/protocol/router.py b/secop/protocol/router.py index 019fc20..3d3c93a 100644 --- a/secop/protocol/router.py +++ b/secop/protocol/router.py @@ -70,10 +70,9 @@ class SecopClient(secop.client.SecopClient): self.updateEvent(*key, *self.cache[key]) def descriptiveDataChange(self, module, data): - print('CHANGE', self.nodename) + if module is None: + self.log.error('descriptive data for node %r has changed', self.nodename) self.dispatcher.restart() - #if module is None: - # self.log.error('descriptive data for node %r has changed', self.nodename) class Router(secop.protocol.dispatcher.Dispatcher): @@ -99,7 +98,7 @@ class Router(secop.protocol.dispatcher.Dispatcher): self.nodes = [SecopClient(uri, logger.getChild('routed%d' % i), self) for i, uri in enumerate(uris)] # register callbacks for node in self.nodes: - node.register(None, node) + node.register_callback(None, node.updateEvent, node.descriptiveDataChange, node.nodeStateChange) self.node_by_module = {} multievent = MultiEvent() for node in self.nodes: @@ -113,7 +112,7 @@ class Router(secop.protocol.dispatcher.Dispatcher): nodes.append(node) else: - def check_new_node(online, state, self=self, node=node): + def nodeStateChange(online, state, self=self, node=node): if online: for module in node.modules: self.node_by_module[module] = node @@ -122,7 +121,7 @@ class Router(secop.protocol.dispatcher.Dispatcher): return secop.client.UNREGISTER return None - node.register(None, nodeStateChange=check_new_node) + node.register_callback(None, nodeStateChange) logger.warning('can not connect to node %r', node.nodename) def handle_describe(self, conn, specifier, data): diff --git a/secop/proxy.py b/secop/proxy.py index 1686a72..1791267 100644 --- a/secop/proxy.py +++ b/secop/proxy.py @@ -61,7 +61,8 @@ class ProxyModule(Module): if not self.module: self.properties['module'] = self.name self._secnode = self._iodev.secnode - self._secnode.register(self.module, self) + self._secnode.register_callback(self.module, self.updateEvent, + self.descriptiveDataChange, self.nodeStateChange) super().initModule() def descriptiveDataChange(self, module, moddesc): @@ -147,7 +148,6 @@ class SecNode(Module): def earlyInit(self): self.secnode = SecopClient(self.uri, self.log) - self.secnode.register(None, self) # for nodeStateChange def startModule(self, started_callback): self.secnode.spawn_connect(started_callback)