diff options
author | Robert McQueen <robot101@debian.org> | 2006-02-15 23:45:50 +0000 |
---|---|---|
committer | Robert McQueen <robot101@debian.org> | 2006-02-15 23:45:50 +0000 |
commit | 397b0a4ec150c4400de8a041d077c819f6e978bd (patch) | |
tree | 4d4f13752e02db90fed751fb933d10fda961fbdd /python | |
parent | 08bbc0210c243cb1c7e41d0c434fc069c7b2743c (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.py | 8 | ||||
-rw-r--r-- | python/dbus_bindings.pyx | 6 | ||||
-rw-r--r-- | python/matchrules.py | 17 |
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) |