diff options
Diffstat (limited to 'python')
-rw-r--r-- | python/decorators.py | 17 | ||||
-rw-r--r-- | python/introspect_parser.py | 27 | ||||
-rw-r--r-- | python/service.py | 4 |
3 files changed, 26 insertions, 22 deletions
diff --git a/python/decorators.py b/python/decorators.py index 3973f3e4..e4cc0249 100644 --- a/python/decorators.py +++ b/python/decorators.py @@ -39,20 +39,25 @@ def signal(dbus_interface, signature=None): _util._validate_interface_or_name(dbus_interface) def decorator(func): def emit_signal(self, *args, **keywords): - func(self, *args, **keywords) + func(self, *args, **keywords) message = dbus_bindings.Signal(self._object_path, dbus_interface, func.__name__) iter = message.get_iter(True) - - for arg in args: - iter.append(arg) - + + if emit_signal._dbus_signature: + signature = tuple(dbus_bindings.Signature(emit_signal._dbus_signature)) + for (arg, sig) in zip(args, signature): + iter.append_strict(arg, sig) + else: + for arg in args: + iter.append(arg) + self._connection.send(message) args = inspect.getargspec(func)[0] args.pop(0) if signature: - sig = tuple(dbus_bindings.Signature(func._dbus_signature)) + sig = tuple(dbus_bindings.Signature(signature)) if len(sig) > len(args): raise ValueError, 'signal signature is longer than the number of arguments provided' diff --git a/python/introspect_parser.py b/python/introspect_parser.py index 40cae1e7..47c9806e 100644 --- a/python/introspect_parser.py +++ b/python/introspect_parser.py @@ -13,35 +13,36 @@ def process_introspection_data(data): reader = input_source.newTextReader("urn:introspect") ret = reader.Read() - current_iface='' - current_method='' + current_iface = None + current_method = None current_sigstr = '' - + while ret == 1: name = reader.LocalName() if reader.NodeType() == XMLREADER_START_ELEMENT_NODE_TYPE: - if name == 'interface': + if (not current_iface and not current_method and name == 'interface'): current_iface = reader.GetAttribute('name') - elif name == 'method': + elif (current_iface and not current_method and name == 'method'): current_method = reader.GetAttribute('name') if reader.IsEmptyElement(): - method_map[current_iface + '.' + current_method] = '' - current_method = '' + method_map[current_iface + '.' + current_method] = '' + current_method = None current_sigstr = '' - - elif name == 'arg': + + elif (current_iface and current_method and name == 'arg'): direction = reader.GetAttribute('direction') if not direction or direction == 'in': current_sigstr = current_sigstr + reader.GetAttribute('type') elif reader.NodeType() == XMLREADER_END_ELEMENT_NODE_TYPE: - if name == 'method': - method_map[current_iface + '.' + current_method] = current_sigstr - current_method = '' + if (current_iface and not current_method and name == 'interface'): + current_iface = None + if (current_iface and current_method and name == 'method'): + method_map[current_iface + '.' + current_method] = current_sigstr + current_method = None current_sigstr = '' - ret = reader.Read() if ret != 0: diff --git a/python/service.py b/python/service.py index d1973b04..3eec65f6 100644 --- a/python/service.py +++ b/python/service.py @@ -20,21 +20,19 @@ class BusName(object): # otherwise register the name retval = dbus_bindings.bus_request_name(bus.get_connection(), name) - print retval + # TODO: more intelligent tracking of bus name states? if retval == dbus_bindings.REQUEST_NAME_REPLY_PRIMARY_OWNER: pass elif retval == dbus_bindings.REQUEST_NAME_REPLY_IN_QUEUE: # you can't arrive at this state via the high-level bindings # because you can't put flags in, but... who knows? - print "joined queue for %s" % name pass elif retval == dbus_bindings.REQUEST_NAME_REPLY_EXISTS: raise dbus_bindings.DBusException('requested name %s already exists' % name) elif retval == dbus_bindings.REQUEST_NAME_REPLY_ALREADY_OWNER: # if this is a shared bus which is being used by someone # else in this process, this can happen legitimately - print "already owner of %s" % name pass else: raise dbus_bindings.DBusException('requesting name %s returned unexpected value %s' % (name, retval)) |