56 lines
2.1 KiB
Python
56 lines
2.1 KiB
Python
import dbus
|
|
import dbus.service
|
|
|
|
from .exception import InvalidArgsException
|
|
|
|
NullObject = dbus.ObjectPath("/")
|
|
|
|
class BusObjectWithProperties():
|
|
PROPERTIES = {}
|
|
|
|
@dbus.service.method("org.freedesktop.DBus.Properties", "ss", "v",
|
|
path_keyword="path")
|
|
def Get(self, interface, property, path=None):
|
|
if interface == self.INTERFACE:
|
|
if property in self.PROPERTIES:
|
|
getter, setter, value = self.PROPERTIES[property]
|
|
if getter:
|
|
value = getter(self, path)
|
|
return value
|
|
else:
|
|
raise InvalidArgsException("No such property %r" % str(property))
|
|
else:
|
|
raise InvalidArgsException("No such interface %r" % str(interface))
|
|
|
|
@dbus.service.method("org.freedesktop.DBus.Properties", "s", "a{sv}",
|
|
path_keyword="path")
|
|
def GetAll(self, interface, path=None):
|
|
if interface == self.INTERFACE:
|
|
out = {}
|
|
for name, (getter, setter, value) in self.PROPERTIES.items():
|
|
if getter:
|
|
value = getter(self, path)
|
|
out[name] = value
|
|
return out
|
|
else:
|
|
raise InvalidArgsException("No such interface %r" % str(interface))
|
|
|
|
@dbus.service.method("org.freedesktop.DBus.Properties", "ssv", "",
|
|
path_keyword="path")
|
|
def Set(self, interface, property, value, path=None):
|
|
if interface == self.INTERFACE:
|
|
if property in self.PROPERTIES:
|
|
getter, setter, _ = self.PROPERTIES[property]
|
|
if setter:
|
|
setter(self, path, value)
|
|
else:
|
|
raise InvalidArgsException("Property %r is read-only" % str(property))
|
|
else:
|
|
raise InvalidArgsException("No such property %r" % str(property))
|
|
else:
|
|
raise InvalidArgsException("No such interface %r" % str(interface))
|
|
|
|
@dbus.service.signal("org.freedesktop.DBus.Properties", "sa{sv}as")
|
|
def PropertiesChanged(self, interface, changed_props, invalidated_props):
|
|
pass
|