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':
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
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):
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()),
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