Refactored crontab parser: new default values definition
[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     def __init__(self):
18         from dbus.mainloop.glib import DBusGMainLoop
19         DBusGMainLoop(set_as_default=True)
20
21     @property
22     def system(self):
23         if not self.__system_bus:
24             self.__system_bus = dbus.SystemBus()
25         return self.__system_bus
26
27     @property
28     def session(self):
29         if not self.__session_bus:
30             self.__session_bus = dbus.SessionBus()
31         return self.__session_bus
32
33     def attach_handler(self, handler):
34         if self.__system_bus:
35             self.__system_bus.add_message_filter(handler)
36         if self.__session_bus:
37             self.__session_bus.add_message_filter(handler)
38     def listen(self):
39         from gobject import MainLoop
40         loop = MainLoop()
41         loop.run()
42
43 class DbusRule(object):
44     def __init__(self, bus_=None, type_=None, sender_=None, interface_=None, path_=None, member_=None, destination_=None, args_=[]):
45         self._bus         = bus_
46         self._type        = type_
47         self._sender      = sender_
48         self._interface   = interface_
49         self._path        = path_
50         self._member      = member_
51         self._destination = destination_
52         self._args        = args_
53
54     def register(self):
55         rule = str(self)
56         if rule:
57             self._bus.add_match_string(str(self))
58
59     def __str__(self):
60         rule = []
61         for key in ['type', 'sender', 'interface', 'path', 'member', 'destination']:
62             value = getattr(self, '_'+key)
63             if value is not None:
64                 rule.append("%s='%s'" % (key, value))
65
66         if self._args:
67             for i, arg in enumerate(self._args):
68                 rule.append("arg%d%s='%s'" % (i, 'path' if arg.startswith('/') else '', arg))
69
70         return ','.join(rule)
71
72     def match(self, bus, message):
73
74         if self._bus not in (None, bus):
75             return False
76
77         if self._type is not None:
78             type_ = get_dbus_message_type(message)
79             if self._type != type_:
80                 return False
81
82         if self._sender not in (None, message.get_sender()):
83             return False
84
85         if self._interface not in (None, message.get_interface()):
86             return False
87
88         if self._path not in (None, message.get_path()):
89             return False
90
91         if self._member not in (None, message.get_member()):
92             return False
93
94         if self._destination not in (None, message.get_destination()):
95             return False
96
97         args_ = message.get_args_list()
98         for i, arg in enumerate(args_):
99             if i >= len(self._args):
100                 break
101             if self._args[i] not in (None, arg):
102                 return False
103
104         return True
105