4 from dbuscron.logger import Logger
7 def dbus_to_str(value):
8 log('converting', value, 'of type', type(value))
9 if isinstance(value, dbus.Byte):
10 return str(int(value))
11 elif isinstance(value, dbus.ByteArray):
12 return ','.join(str(ord(v)) for v in value)
13 elif isinstance(value, dbus.Array):
14 return ','.join(dbus_to_str(v) for v in value)
15 elif isinstance(value, dbus.Dictionary):
16 return ','.join('%s:%s' % (k, dbus_to_str(v)) for k, v in value.iteritems())
20 def get_dbus_message_type(message):
21 result = message.__class__.__name__[0:-7]
22 for c in 'ABCDEFGHIJKLMNOPQRSTUVWXYZ':
23 result = result.replace(c, '_'+c.lower())
24 return result.strip('_')
26 class DbusBus(object):
33 cls.__bus = super(DbusBus, cls).__new__(cls)
37 from dbus.mainloop.glib import DBusGMainLoop
38 DBusGMainLoop(set_as_default=True)
42 if not self.__system_bus:
43 self.__system_bus = dbus.SystemBus()
44 return self.__system_bus
48 if not self.__session_bus:
49 self.__session_bus = dbus.SessionBus()
50 return self.__session_bus
52 def attach_handler(self, handler):
54 self.__system_bus.add_message_filter(handler)
55 if self.__session_bus:
56 self.__session_bus.add_message_filter(handler)
58 from gobject import MainLoop
62 class DbusRule(object):
63 def __init__(self, bus_=None, type_=None, sender_=None, interface_=None, path_=None, member_=None, destination_=None, args_=[]):
66 self._sender = sender_
67 self._interface = interface_
69 self._member = member_
70 self._destination = destination_
76 self._bus.add_match_string(rule)
81 self._bus.remove_match_string(rule)
88 for key in ['type', 'sender', 'interface', 'path', 'member', 'destination']:
89 value = getattr(self, '_'+key)
91 rule.append("%s='%s'" % (key, value))
94 for i, arg in enumerate(self._args):
95 rule.append("arg%d%s='%s'" % (i, 'path' if arg.startswith('/') else '', arg))
99 def match(self, bus, message):
101 if self._bus not in (None, bus):
104 if self._type is not None:
105 type_ = get_dbus_message_type(message)
106 if self._type != type_:
109 if self._sender not in (None, message.get_sender()):
112 if self._interface not in (None, message.get_interface()):
115 if self._path not in (None, message.get_path()):
118 if self._member not in (None, message.get_member()):
121 if self._destination not in (None, message.get_destination()):
124 if self._args is not None:
125 args_ = message.get_args_list()
126 for i, arg in enumerate(args_):
127 if i >= len(self._args):
129 if self._args[i] not in (None, str(arg)):