DbusRule.unregister() method
[dbuscron] / dbuscron / bus.py
1
2 import dbus
3
4 from dbuscron.logger import Logger
5 log = Logger(__name__)
6
7 def dbus_to_str(value):
8     log('converting', value, 'of type', type(value))
9     if isinstance(value, dbus.Byte):
10         return str(int(value))
11     elif isinstance(value, dbus.ByteArray):
12         return ','.join(str(ord(v)) for v in value)
13     elif isinstance(value, dbus.Array):
14         return ','.join(dbus_to_str(v) for v in value)
15     elif isinstance(value, dbus.Dictionary):
16         return ','.join('%s:%s' % (k, dbus_to_str(v)) for k, v in value.iteritems())
17     else:
18         return str(value)
19
20 def get_dbus_message_type(message):
21     result = message.__class__.__name__[0:-7]
22     for c in 'ABCDEFGHIJKLMNOPQRSTUVWXYZ':
23         result = result.replace(c, '_'+c.lower())
24     return result.strip('_')
25
26 class DbusBus(object):
27     __bus = None
28     __system_bus = None
29     __session_bus = None
30
31     def __new__(cls):
32         if not cls.__bus:
33             cls.__bus = super(DbusBus, cls).__new__(cls)
34         return cls.__bus
35
36     def __init__(self):
37         from dbus.mainloop.glib import DBusGMainLoop
38         DBusGMainLoop(set_as_default=True)
39
40     @property
41     def system(self):
42         if not self.__system_bus:
43             self.__system_bus = dbus.SystemBus()
44         return self.__system_bus
45
46     @property
47     def session(self):
48         if not self.__session_bus:
49             self.__session_bus = dbus.SessionBus()
50         return self.__session_bus
51
52     def attach_handler(self, handler):
53         if self.__system_bus:
54             self.__system_bus.add_message_filter(handler)
55         if self.__session_bus:
56             self.__session_bus.add_message_filter(handler)
57     def listen(self):
58         from gobject import MainLoop
59         loop = MainLoop()
60         loop.run()
61
62 class DbusRule(object):
63     def __init__(self, bus_=None, type_=None, sender_=None, interface_=None, path_=None, member_=None, destination_=None, args_=[]):
64         self._bus         = bus_
65         self._type        = type_
66         self._sender      = sender_
67         self._interface   = interface_
68         self._path        = path_
69         self._member      = member_
70         self._destination = destination_
71         self._args        = args_
72
73     def register(self):
74         rule = str(self)
75         if rule:
76             self._bus.add_match_string(rule)
77
78     def unregister(self):
79         rule = str(self)
80         if rule:
81             self._bus.remove_match_string(rule)
82
83     #def __del__(self):
84     #    self.unregister()
85
86     def __str__(self):
87         rule = []
88         for key in ['type', 'sender', 'interface', 'path', 'member', 'destination']:
89             value = getattr(self, '_'+key)
90             if value is not None:
91                 rule.append("%s='%s'" % (key, value))
92
93         if self._args:
94             for i, arg in enumerate(self._args):
95                 rule.append("arg%d%s='%s'" % (i, 'path' if arg.startswith('/') else '', arg))
96
97         return ','.join(rule)
98
99     def match(self, bus, message):
100
101         if self._bus not in (None, bus):
102             return False
103
104         if self._type is not None:
105             type_ = get_dbus_message_type(message)
106             if self._type != type_:
107                 return False
108
109         if self._sender not in (None, message.get_sender()):
110             return False
111
112         if self._interface not in (None, message.get_interface()):
113             return False
114
115         if self._path not in (None, message.get_path()):
116             return False
117
118         if self._member not in (None, message.get_member()):
119             return False
120
121         if self._destination not in (None, message.get_destination()):
122             return False
123
124         if self._args is not None:
125             args_ = message.get_args_list()
126             for i, arg in enumerate(args_):
127                 if i >= len(self._args):
128                     break
129                 if self._args[i] not in (None, str(arg)):
130                     return False
131
132         return True
133