872
class DBusObjectWithProperties(dbus.service.Object):
873
"""A D-Bus object with properties.
874
class DBusObjectWithAnnotations(dbus.service.Object):
875
"""A D-Bus object with annotations.
875
Classes inheriting from this can use the dbus_service_property
876
decorator to expose methods as D-Bus properties. It exposes the
877
standard Get(), Set(), and GetAll() methods on the D-Bus.
877
Classes inheriting from this can use the dbus_annotations
878
decorator to add annotations to methods or signals.
896
897
for name, athing in
897
898
inspect.getmembers(cls, self._is_dbus_thing(thing)))
900
@dbus.service.method(dbus.INTROSPECTABLE_IFACE,
902
path_keyword = 'object_path',
903
connection_keyword = 'connection')
904
def Introspect(self, object_path, connection):
905
"""Overloading of standard D-Bus method.
907
Inserts annotation tags on methods and signals.
909
xmlstring = dbus.service.Object.Introspect(self, object_path,
912
document = xml.dom.minidom.parseString(xmlstring)
914
for if_tag in document.getElementsByTagName("interface"):
915
# Add annotation tags
916
for typ in ("method", "signal"):
917
for tag in if_tag.getElementsByTagName(typ):
919
for name, prop in (self.
920
_get_all_dbus_things(typ)):
921
if (name == tag.getAttribute("name")
922
and prop._dbus_interface
923
== if_tag.getAttribute("name")):
924
annots.update(getattr(
925
prop, "_dbus_annotations", {}))
926
for name, value in annots.items():
927
ann_tag = document.createElement(
929
ann_tag.setAttribute("name", name)
930
ann_tag.setAttribute("value", value)
931
tag.appendChild(ann_tag)
932
# Add interface annotation tags
933
for annotation, value in dict(
934
itertools.chain.from_iterable(
935
annotations().items()
936
for name, annotations
937
in self._get_all_dbus_things("interface")
938
if name == if_tag.getAttribute("name")
940
ann_tag = document.createElement("annotation")
941
ann_tag.setAttribute("name", annotation)
942
ann_tag.setAttribute("value", value)
943
if_tag.appendChild(ann_tag)
944
# Fix argument name for the Introspect method itself
945
if (if_tag.getAttribute("name")
946
== dbus.INTROSPECTABLE_IFACE):
947
for cn in if_tag.getElementsByTagName("method"):
948
if cn.getAttribute("name") == "Introspect":
949
for arg in cn.getElementsByTagName("arg"):
950
if (arg.getAttribute("direction")
952
arg.setAttribute("name",
954
xmlstring = document.toxml("utf-8")
956
except (AttributeError, xml.dom.DOMException,
957
xml.parsers.expat.ExpatError) as error:
958
logger.error("Failed to override Introspection method",
963
class DBusObjectWithProperties(DBusObjectWithAnnotations):
964
"""A D-Bus object with properties.
966
Classes inheriting from this can use the dbus_service_property
967
decorator to expose methods as D-Bus properties. It exposes the
968
standard Get(), Set(), and GetAll() methods on the D-Bus.
899
971
def _get_dbus_property(self, interface_name, property_name):
900
972
"""Returns a bound method if one exists which is a D-Bus
901
973
property with the specified name and interface.
1006
1079
if prop._dbus_interface
1007
1080
== if_tag.getAttribute("name")):
1008
1081
if_tag.appendChild(tag)
1009
# Add annotation tags
1010
for typ in ("method", "signal", "property"):
1011
for tag in if_tag.getElementsByTagName(typ):
1013
for name, prop in (self.
1014
_get_all_dbus_things(typ)):
1015
if (name == tag.getAttribute("name")
1016
and prop._dbus_interface
1017
== if_tag.getAttribute("name")):
1018
annots.update(getattr(
1019
prop, "_dbus_annotations", {}))
1020
for name, value in annots.items():
1021
ann_tag = document.createElement(
1023
ann_tag.setAttribute("name", name)
1024
ann_tag.setAttribute("value", value)
1025
tag.appendChild(ann_tag)
1026
# Add interface annotation tags
1027
for annotation, value in dict(
1028
itertools.chain.from_iterable(
1029
annotations().items()
1030
for name, annotations
1031
in self._get_all_dbus_things("interface")
1032
if name == if_tag.getAttribute("name")
1034
ann_tag = document.createElement("annotation")
1035
ann_tag.setAttribute("name", annotation)
1036
ann_tag.setAttribute("value", value)
1037
if_tag.appendChild(ann_tag)
1082
# Add annotation tags for properties
1083
for tag in if_tag.getElementsByTagName("property"):
1085
for name, prop in self._get_all_dbus_things(
1087
if (name == tag.getAttribute("name")
1088
and prop._dbus_interface
1089
== if_tag.getAttribute("name")):
1090
annots.update(getattr(
1091
prop, "_dbus_annotations", {}))
1092
for name, value in annots.items():
1093
ann_tag = document.createElement(
1095
ann_tag.setAttribute("name", name)
1096
ann_tag.setAttribute("value", value)
1097
tag.appendChild(ann_tag)
1038
1098
# Add the names to the return values for the
1039
1099
# "org.freedesktop.DBus.Properties" methods
1040
1100
if (if_tag.getAttribute("name")
1376
1436
if exitstatus >= 0:
1377
1437
# Emit D-Bus signal
1378
1438
self.CheckerCompleted(dbus.Int16(exitstatus),
1439
# This is specific to GNU libC
1440
dbus.Int64(exitstatus << 8),
1380
1441
dbus.String(command))
1382
1443
# Emit D-Bus signal
1383
1444
self.CheckerCompleted(dbus.Int16(-1),
1385
self.last_checker_signal),
1446
# This is specific to GNU libC
1448
| self.last_checker_signal),
1386
1449
dbus.String(command))
1524
1591
self.approval_duration = datetime.timedelta(0, 0, 0, value)
1526
1593
# Name - property
1595
{"org.freedesktop.DBus.Property.EmitsChangedSignal": "const"})
1527
1596
@dbus_service_property(_interface, signature="s", access="read")
1528
1597
def Name_dbus_property(self):
1529
1598
return dbus.String(self.name)
1531
1600
# Fingerprint - property
1602
{"org.freedesktop.DBus.Property.EmitsChangedSignal": "const"})
1532
1603
@dbus_service_property(_interface, signature="s", access="read")
1533
1604
def Fingerprint_dbus_property(self):
1534
1605
return dbus.String(self.fingerprint)
1663
1736
self.stop_checker()
1665
1738
# ObjectPath - property
1740
{"org.freedesktop.DBus.Property.EmitsChangedSignal": "const",
1741
"org.freedesktop.DBus.Deprecated": "true"})
1666
1742
@dbus_service_property(_interface, signature="o", access="read")
1667
1743
def ObjectPath_dbus_property(self):
1668
1744
return self.dbus_object_path # is already a dbus.ObjectPath
1670
1746
# Secret = property
1748
{"org.freedesktop.DBus.Property.EmitsChangedSignal":
1671
1750
@dbus_service_property(_interface,
1672
1751
signature="ay",
1673
1752
access="write",