summaryrefslogtreecommitdiffstats
path: root/python
diff options
context:
space:
mode:
authorRobert McQueen <robot101@debian.org>2005-11-07 15:31:30 +0000
committerRobert McQueen <robot101@debian.org>2005-11-07 15:31:30 +0000
commite598c5edc5b4d3fa7eb474ab3cd93ec6747e4bc0 (patch)
treeb6769252aea4e581aef2261fcdd1ceebd321b8fc /python
parent95f9771d6be677d3393aab60f0f56126fbb252a6 (diff)
2005-11-07 Robert McQueen <robot101@debian.org>
* python/decorators.py: Change emit_signal function to use the signature annotation of the signal when marhsalling the arguments from the service. Fix a bug where the code checking signature length against argument length referenced the wrong variable. * python/introspect_parser.py: Avoid adding the type signature of signal arguments to any methods which occur after them in the introspection data (!) by making the parser a little more careful about its current state. * python/service.py: Remove debug prints from last commit (again :D). * test/python/test-client.py, test/python/test-service.py: Add test signals with signature decorators to test the strict marshalling code gives errors at the right time. Could do with checking the signals actually get emitted too, given that the test does nothing with signals at the moment...
Diffstat (limited to 'python')
-rw-r--r--python/decorators.py17
-rw-r--r--python/introspect_parser.py27
-rw-r--r--python/service.py4
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))