summaryrefslogtreecommitdiffstats
path: root/python
diff options
context:
space:
mode:
authorRobert McQueen <robot101@debian.org>2006-02-15 23:45:50 +0000
committerRobert McQueen <robot101@debian.org>2006-02-15 23:45:50 +0000
commit397b0a4ec150c4400de8a041d077c819f6e978bd (patch)
tree4d4f13752e02db90fed751fb933d10fda961fbdd /python
parent08bbc0210c243cb1c7e41d0c434fc069c7b2743c (diff)
2006-02-16 Robert McQueen <robot101@debian.org>
* glib/dbus-gmain.c: Make the previous commit compile. * python/_dbus.py, python/matchrules.py: Patch from Ole Andre Ravnaas <ole.andre.ravnaas@collabora.co.uk> to allow you to specify sender_keyword="foo", path_keyword="bar" when adding a signal listener, so that you can bind to signals generically but still do something useful in your callback. * python/dbus_bindings.pyx: Demarshal the byte type as unsigned chars so that they're not cast to chars and made negative. Thanks to Jakub Stachowski for reporting this and testing the fix.
Diffstat (limited to 'python')
-rw-r--r--python/_dbus.py8
-rw-r--r--python/dbus_bindings.pyx6
-rw-r--r--python/matchrules.py17
3 files changed, 24 insertions, 7 deletions
diff --git a/python/_dbus.py b/python/_dbus.py
index 2376f172..7e17d9f6 100644
--- a/python/_dbus.py
+++ b/python/_dbus.py
@@ -158,6 +158,8 @@ class Bus(object):
args_dict[num] = value
except ValueError:
raise TypeError("Invalid arg index %s"%snum)
+ elif key in ("sender_keyword", "path_keyword"):
+ pass
else:
raise TypeError("Unknown keyword %s"%(key))
@@ -178,6 +180,12 @@ class Bus(object):
match_rule = SignalMatchRule(signal_name, dbus_interface, named_service, path)
+ for kw in ("sender_keyword", "path_keyword"):
+ if kw in keywords:
+ setattr(match_rule, kw, keywords[kw])
+ else:
+ setattr(match_rule, kw, None)
+
if args_dict:
match_rule.add_args_match(args_dict)
diff --git a/python/dbus_bindings.pyx b/python/dbus_bindings.pyx
index 3bde96a1..836dbf8e 100644
--- a/python/dbus_bindings.pyx
+++ b/python/dbus_bindings.pyx
@@ -741,10 +741,10 @@ cdef class MessageIter:
return dbus_message_iter_get_element_type(self.iter)
def get_byte(self):
- cdef char c_val
- dbus_message_iter_get_basic(self.iter, <char *>&c_val)
+ cdef unsigned char c_val
+ dbus_message_iter_get_basic(self.iter, <unsigned char *>&c_val)
return c_val
-
+
def get_boolean(self):
cdef dbus_bool_t c_val
dbus_message_iter_get_basic(self.iter, <dbus_bool_t *>&c_val)
diff --git a/python/matchrules.py b/python/matchrules.py
index 3a2fbedf..023a5b76 100644
--- a/python/matchrules.py
+++ b/python/matchrules.py
@@ -130,16 +130,25 @@ class SignalMatchRule:
self.args = args
def execute(self, message, args=None):
- #optimization just in case we already extarcted the args
+ keywords = {}
+
+ if self.sender_keyword is not None:
+ keywords[self.sender_keyword] = message.get_sender()
+ if self.path_keyword is not None:
+ keywords[self.path_keyword] = message.get_path()
+
+ # optimization just in case we already extracted the args
if not args:
args = message.get_args_list()
for handler in self.handler_functions:
if getattr(handler, "_dbus_pass_message", False):
- keywords = {"dbus_message": message}
- handler(*args, **keywords)
- else:
+ keywords["dbus_message"] = message
+
+ if len(keywords) == 0:
handler(*args)
+ else:
+ handler(*args, **keywords)
def add_handler(self, handler):
self.handler_functions.append(handler)