From 397b0a4ec150c4400de8a041d077c819f6e978bd Mon Sep 17 00:00:00 2001 From: Robert McQueen Date: Wed, 15 Feb 2006 23:45:50 +0000 Subject: 2006-02-16 Robert McQueen * glib/dbus-gmain.c: Make the previous commit compile. * python/_dbus.py, python/matchrules.py: Patch from Ole Andre Ravnaas 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. --- ChangeLog | 14 ++++++++++++++ glib/dbus-gmain.c | 8 ++++---- python/_dbus.py | 8 ++++++++ python/dbus_bindings.pyx | 6 +++--- python/matchrules.py | 17 +++++++++++++---- 5 files changed, 42 insertions(+), 11 deletions(-) diff --git a/ChangeLog b/ChangeLog index b2fcef21..2b151565 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +2006-02-16 Robert McQueen + + * glib/dbus-gmain.c: Make the previous commit compile. + + * python/_dbus.py, python/matchrules.py: Patch from Ole Andre + Ravnaas 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. + 2006-02-15 John (J5) Palmieri * dbus/dbus-glib.h: diff --git a/glib/dbus-gmain.c b/glib/dbus-gmain.c index d2716103..54f868dd 100644 --- a/glib/dbus-gmain.c +++ b/glib/dbus-gmain.c @@ -698,11 +698,11 @@ dbus_server_setup_with_g_main (DBusServer *server, /** * Returns a connection to the given address. - * + * * (Internally, calls dbus_connection_open() then calls * dbus_connection_setup_with_g_main() on the result.) * - * @param address address of the connection to open + * @param address address of the connection to open * @param error address where an error can be returned. * @returns a DBusConnection */ @@ -716,10 +716,10 @@ dbus_g_connection_open (const gchar *address, g_return_val_if_fail (error == NULL || *error == NULL, NULL); _dbus_g_value_types_init (); - + dbus_error_init (&derror); - connection = dbus_connection_open (socket, &derror); + connection = dbus_connection_open (address, &derror); if (connection == NULL) { dbus_set_g_error (error, &derror); 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, &c_val) + cdef unsigned char c_val + dbus_message_iter_get_basic(self.iter, &c_val) return c_val - + def get_boolean(self): cdef dbus_bool_t c_val dbus_message_iter_get_basic(self.iter, &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) -- cgit