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