4 def get_dbus_message_type(message):
5 return message.__class__.__name__.lower()[0:-7]
14 cls.__bus = super(DbusBus, cls).__new__(cls)
19 if not self.__system_bus:
20 self.__system_bus = dbus.SystemBus()
21 return self.__system_bus
25 if not self.__session_bus:
26 self.__session_bus = dbus.SessionBus()
27 return self.__session_bus
29 def attach_handler(self, handler):
31 self.__system_bus.add_message_filter(handler)
32 if self.__session_bus:
33 self.__session_bus.add_message_filter(handler)
35 from gobject import MainLoop
39 class DbusRule(object):
40 def __init__(self, bus_=None, type_=None, sender_=None, interface_=None, path_=None, member_=None, destination_=None, args_=[]):
43 self._sender = sender_
44 self._interface = interface_
46 self._member = member_
47 self._destination = destination_
53 self._bus.add_match_string(str(self))
57 for key in ['type', 'sender', 'interface', 'path', 'member', 'destination']:
58 value = getattr(self, '_'+key)
60 rule.append("%s='%s'" % (key, value))
63 for i, arg in enumerate(self._args):
64 rule.append("arg%d%s='%s'" % (i, 'path' if arg.startswith('/') else '', arg))
68 def match(self, bus, message):
70 if self._bus not in (None, bus):
73 if self._type is not None:
74 type_ = get_dbus_message_type(message)
75 if self._type != type_:
78 if self._sender not in (None, message.get_sender()):
81 if self._interface not in (None, message.get_interface()):
84 if self._path not in (None, message.get_path()):
87 if self._member not in (None, message.get_member()):
90 if self._destination not in (None, message.get_destination()):
93 args_ = message.get_args_list()
94 for i, arg in enumerate(args_):
95 if i >= len(self._args):
97 if self._args[i] not in (None, arg):