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 | |
| 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.
| -rw-r--r-- | ChangeLog | 14 | ||||
| -rw-r--r-- | glib/dbus-gmain.c | 8 | ||||
| -rw-r--r-- | python/_dbus.py | 8 | ||||
| -rw-r--r-- | python/dbus_bindings.pyx | 6 | ||||
| -rw-r--r-- | python/matchrules.py | 17 | 
5 files changed, 42 insertions, 11 deletions
| @@ -1,3 +1,17 @@ +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. +  2006-02-15  John (J5) Palmieri  <johnp@redhat.com>  	* 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, <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) | 
