more robust dbus data convert on export to env
authorKonstantin Stepanov <kstep@p-nut.info>
Sat, 27 Nov 2010 14:25:03 +0000 (16:25 +0200)
committerKonstantin Stepanov <kstep@p-nut.info>
Sat, 27 Nov 2010 14:25:03 +0000 (16:25 +0200)
dbuscron/bus.py
dbuscron/command.py

index c766860..6c07f36 100644 (file)
@@ -1,6 +1,18 @@
 
 import dbus
 
+def dbus_to_str(value):
+    if isinstance(value, dbus.Byte):
+        return str(int(value))
+    elif isinstance(value, dbus.ByteArray):
+        return ','.join(str(ord(v)) for v in value)
+    elif isinstance(value, dbus.Array):
+        return ','.join(str(v) for v in value)
+    elif isinstance(value, dbus.Dictionary):
+        return ','.join('%s:%s' % (k, v) for k, v in value.iteritems())
+    else:
+        return str(value)
+
 def get_dbus_message_type(message):
     result = message.__class__.__name__[0:-7]
     for c in 'ABCDEFGHIJKLMNOPQRSTUVWXYZ':
@@ -102,7 +114,7 @@ class DbusRule(object):
             for i, arg in enumerate(args_):
                 if i >= len(self._args):
                     break
-                if self._args[i] not in (None, arg):
+                if self._args[i] not in (None, str(arg)):
                     return False
 
         return True
index 4faad84..3713c17 100644 (file)
@@ -1,6 +1,6 @@
 
 import os
-from dbuscron.bus import get_dbus_message_type
+from dbuscron.bus import get_dbus_message_type, dbus_to_str
 
 class Command(object):
     def __init__(self, cmd):
@@ -16,8 +16,8 @@ class Command(object):
         args_list = message.get_args_list()
         env = dict()
         env.update(environ)
-        env.update(dict(
-                (('DBUS_ARG%d' % i, str(args_list[i])) for i in range(0, len(args_list))),
+        dbus_env = dict(
+                (('DBUS_ARG%d' % i, dbus_to_str(a)) for i, a in enumerate(args_list)),
                 DBUS_ARGN   = str(len(args_list)),
                 DBUS_SENDER = str(message.get_sender()),
                 DBUS_DEST   = str(message.get_destination()),
@@ -26,7 +26,8 @@ class Command(object):
                 DBUS_MEMBER = str(message.get_member()),
                 DBUS_BUS    = bus.__class__.__name__.lower()[0:-3],
                 DBUS_TYPE   = get_dbus_message_type(message)
-                ))
+                )
+        env.update(dbus_env)
         result = os.spawnvpe(os.P_WAIT, self.__file, self.__args, env)
         return result