move dbus introspection to dbusutils.list_objects
authorHelmut Grohne <helmut@subdivi.de>
Mon, 15 Jul 2013 08:12:52 +0000 (10:12 +0200)
committerHelmut Grohne <helmut@subdivi.de>
Mon, 15 Jul 2013 08:12:52 +0000 (10:12 +0200)
dbus_client.py
onoff/dbusutils.py

index 91d9f37..fbaf33a 100755 (executable)
@@ -8,7 +8,6 @@ released.
 
 import argparse
 import os
-import xml.parsers.expat
 
 from dbus.mainloop.glib import DBusGMainLoop
 from gi.repository import GObject
@@ -24,21 +23,6 @@ def wait_for_signal(proxy, signal, desired_state):
     proxy.connect_to_signal(signal, callback)
     loop.run()
 
-def parse_introspection(xmlstring):
-    parser = xml.parsers.expat.ParserCreate()
-    nodes = []
-    def start_element(name, attrs):
-        if name != "node":
-            return
-        try:
-            value = attrs["name"]
-        except KeyError:
-            return
-        nodes.append(value)
-    parser.StartElementHandler = start_element
-    parser.Parse(xmlstring)
-    return nodes
-
 def main():
     parser = argparse.ArgumentParser(parents=[onoff.dbusutils.dbus_options])
     parser.add_argument("--duration", type=int, default=10,
@@ -53,8 +37,7 @@ def main():
     DBusGMainLoop(set_as_default=True)
     if args.list:
         bus = onoff.dbusutils.get_dbus(args)
-        proxy = bus.get_object(args.busname, onoff.dbusutils.object_prefix)
-        for elem in parse_introspection(proxy.Introspect()):
+        for elem in onoff.dbusutils.list_objects(bus, args.busname):
             print(elem)
     elif args.command:
         proxy = onoff.dbusutils.get_dbus_proxy(args)
index 9685377..c248ed5 100644 (file)
@@ -1,6 +1,7 @@
 import argparse
 import logging
 import socket
+import xml.parsers.expat
 
 import dbus
 import dbus.service
@@ -57,6 +58,35 @@ def socketpair():
     s2.close()
     return s1, s3
 
+def list_objects(bus, busname, path=None):
+    """List objects on the given bus and busname starting with path. Only the
+    trailing components after the slash are returned.
+
+    @type bus: dbus.Bus
+    @type busname: str
+    @type path: None or str
+    @param path: prefix for searching objects. Defaults to
+        dbusutils.object_prefix.
+    @rtype: [str]
+    @returns: the trailing components of the objects found
+    """
+    if path is None:
+        path = object_prefix
+    xmlstring = bus.get_object(busname, path).Introspect()
+    parser = xml.parsers.expat.ParserCreate()
+    nodes = []
+    def start_element(name, attrs):
+        if name != "node":
+            return
+        try:
+            value = attrs["name"]
+        except KeyError:
+            return
+        nodes.append(value)
+    parser.StartElementHandler = start_element
+    parser.Parse(xmlstring)
+    return nodes
+
 class OnoffControl(dbus.service.Object):
     domain = default_busname
     path = object_prefix