2006-02-16 Robert McQueen <robot101@debian.org>
authorRobert McQueen <robot101@debian.org>
Wed, 15 Feb 2006 23:45:50 +0000 (23:45 +0000)
committerRobert McQueen <robot101@debian.org>
Wed, 15 Feb 2006 23:45:50 +0000 (23:45 +0000)
* 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.

ChangeLog
glib/dbus-gmain.c
python/_dbus.py
python/dbus_bindings.pyx
python/matchrules.py

index b2fcef2..2b15156 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -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:
index d271610..54f868d 100644 (file)
@@ -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);
index 2376f17..7e17d9f 100644 (file)
@@ -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)
 
index 3bde96a..836dbf8 100644 (file)
@@ -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)
index 3a2fbed..023a5b7 100644 (file)
@@ -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)