X-Git-Url: https://vcs.maemo.org/git/?a=blobdiff_plain;f=dbuscron%2Fbus.py;h=2bf9116a1e3b05978b27be4c14bc06f76bb4a3e5;hb=9f50a8ebcb89930d8cfbbfb956c09b78f183a989;hp=f82cb217981a208b1de76700f320c4a7e99ed606;hpb=62fb88f39a571719781119cc7066f57c20737974;p=dbuscron diff --git a/dbuscron/bus.py b/dbuscron/bus.py index f82cb21..2bf9116 100644 --- a/dbuscron/bus.py +++ b/dbuscron/bus.py @@ -1,8 +1,27 @@ import dbus +from dbuscron.logger import Logger +log = Logger(__name__) + +def dbus_to_str(value): + log('converting', value, 'of type', type(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(dbus_to_str(v) for v in value) + elif isinstance(value, dbus.Dictionary): + return ','.join('%s:%s' % (k, dbus_to_str(v)) for k, v in value.iteritems()) + else: + return str(value) + def get_dbus_message_type(message): - return message.__class__.__name__.lower()[0:-7] + result = message.__class__.__name__[0:-7] + for c in 'ABCDEFGHIJKLMNOPQRSTUVWXYZ': + result = result.replace(c, '_'+c.lower()) + return result.strip('_') class DbusBus(object): __bus = None @@ -14,6 +33,10 @@ class DbusBus(object): cls.__bus = super(DbusBus, cls).__new__(cls) return cls.__bus + def __init__(self): + from dbus.mainloop.glib import DBusGMainLoop + DBusGMainLoop(set_as_default=True) + @property def system(self): if not self.__system_bus: @@ -50,7 +73,15 @@ class DbusRule(object): def register(self): rule = str(self) if rule: - self._bus.add_match_string(str(self)) + self._bus.add_match_string(rule) + + def unregister(self): + rule = str(self) + if rule: + self._bus.remove_match_string(rule) + + def __del__(self): + self.unregister() def __str__(self): rule = [] @@ -90,12 +121,13 @@ class DbusRule(object): if self._destination not in (None, message.get_destination()): return False - args_ = message.get_args_list() - for i, arg in enumerate(args_): - if i >= len(self._args): - break - if self._args[i] not in (None, arg): - return False + if self._args is not None: + args_ = message.get_args_list() + for i, arg in enumerate(args_): + if i >= len(self._args): + break + if self._args[i] not in (None, str(arg)): + return False return True