4 def get_dbus_message_type(message):
5 result = message.__class__.__name__[0:-7]
6 for c in 'ABCDEFGHIJKLMNOPQRSTUVWXYZ':
7 result = result.replace(c, '_'+c.lower())
8 return result.strip('_')
10 class DbusBus(object):
17 cls.__bus = super(DbusBus, cls).__new__(cls)
21 from dbus.mainloop.glib import DBusGMainLoop
22 DBusGMainLoop(set_as_default=True)
26 if not self.__system_bus:
27 self.__system_bus = dbus.SystemBus()
28 return self.__system_bus
32 if not self.__session_bus:
33 self.__session_bus = dbus.SessionBus()
34 return self.__session_bus
36 def attach_handler(self, handler):
38 self.__system_bus.add_message_filter(handler)
39 if self.__session_bus:
40 self.__session_bus.add_message_filter(handler)
42 from gobject import MainLoop
46 class DbusRule(object):
47 def __init__(self, bus_=None, type_=None, sender_=None, interface_=None, path_=None, member_=None, destination_=None, args_=[]):
50 self._sender = sender_
51 self._interface = interface_
53 self._member = member_
54 self._destination = destination_
60 self._bus.add_match_string(str(self))
64 for key in ['type', 'sender', 'interface', 'path', 'member', 'destination']:
65 value = getattr(self, '_'+key)
67 rule.append("%s='%s'" % (key, value))
70 for i, arg in enumerate(self._args):
71 rule.append("arg%d%s='%s'" % (i, 'path' if arg.startswith('/') else '', arg))
75 def match(self, bus, message):
77 if self._bus not in (None, bus):
80 if self._type is not None:
81 type_ = get_dbus_message_type(message)
82 if self._type != type_:
85 if self._sender not in (None, message.get_sender()):
88 if self._interface not in (None, message.get_interface()):
91 if self._path not in (None, message.get_path()):
94 if self._member not in (None, message.get_member()):
97 if self._destination not in (None, message.get_destination()):
100 if self._args is not None:
101 args_ = message.get_args_list()
102 for i, arg in enumerate(args_):
103 if i >= len(self._args):
105 if self._args[i] not in (None, arg):