Renamed DbusRuleMatcher to DbusRule
[dbuscron] / dbuscron / bus.py
1
2 import dbus
3
4 def get_dbus_message_type(message):
5     return message.__class__.__name__.lower()[0:-7]
6
7 class DbusBus(object):
8     __bus = None
9     __system_bus = None
10     __session_bus = None
11
12     def __new__(cls):
13         if not cls.__bus:
14             cls.__bus = super(DbusBus, cls).__new__(cls)
15         return cls.__bus
16
17     @property
18     def system(self):
19         if not self.__system_bus:
20             self.__system_bus = dbus.SystemBus()
21         return self.__system_bus
22
23     @property
24     def session(self):
25         if not self.__session_bus:
26             self.__session_bus = dbus.SessionBus()
27         return self.__session_bus
28
29     def attach_handler(self, handler):
30         if self.__system_bus:
31             self.__system_bus.add_message_filter(handler)
32         if self.__session_bus:
33             self.__session_bus.add_message_filter(handler)
34     def listen(self):
35         from gobject import MainLoop
36         loop = MainLoop()
37         loop.run()
38
39 class DbusRule(object):
40     def __init__(self, bus_=None, type_=None, sender_=None, interface_=None, path_=None, member_=None, destination_=None, args_=[]):
41         self._bus         = bus_
42         self._type        = type_
43         self._sender      = sender_
44         self._interface   = interface_
45         self._path        = path_
46         self._member      = member_
47         self._destination = destination_
48         self._args        = args_
49
50     def register(self):
51         rule = str(self)
52         if rule:
53             self._bus.add_match_string(str(self))
54
55     def __str__(self):
56         rule = []
57         for key in ['type', 'sender', 'interface', 'path', 'member', 'destination']:
58             value = getattr(self, '_'+key)
59             if value is not None:
60                 rule.append("%s='%s'" % (key, value))
61
62         if self._args:
63             for i, arg in enumerate(self._args):
64                 rule.append("arg%d%s='%s'" % (i, 'path' if arg.startswith('/') else '', arg))
65
66         return ','.join(rule)
67
68     def match(self, bus, message):
69
70         if self._bus not in (None, bus):
71             return False
72
73         if self._type is not None:
74             type_ = get_dbus_message_type(message)
75             if self._type != type_:
76                 return False
77
78         if self._sender not in (None, message.get_sender()):
79             return False
80
81         if self._interface not in (None, message.get_interface()):
82             return False
83
84         if self._path not in (None, message.get_path()):
85             return False
86
87         if self._member not in (None, message.get_member()):
88             return False
89
90         if self._destination not in (None, message.get_destination()):
91             return False
92
93         args_ = message.get_args_list()
94         for i, arg in enumerate(args_):
95             if i >= len(self._args):
96                 break
97             if self._args[i] not in (None, arg):
98                 return False
99
100         return True
101