monitor-ofono: deep pretty-print
authorPekka Pessi <Pekka.Pessi@nokia.com>
Wed, 25 Aug 2010 11:57:01 +0000 (14:57 +0300)
committerDenis Kenzior <denkenz@gmail.com>
Wed, 25 Aug 2010 16:39:06 +0000 (11:39 -0500)
test/monitor-ofono

index a441d5d..94febac 100755 (executable)
@@ -5,22 +5,54 @@ import gobject
 import dbus
 import dbus.mainloop.glib
 
+_dbus2py = {
+       dbus.String : unicode,
+       dbus.UInt32 : int,
+       dbus.Int32 : int,
+       dbus.Int16 : int,
+       dbus.UInt16 : int,
+       dbus.UInt64 : int,
+       dbus.Int64 : int,
+       dbus.Byte : int,
+       dbus.Boolean : bool,
+       dbus.ByteArray : str,
+       dbus.ObjectPath : str
+    }
+
+def dbus2py(d):
+       t = type(d)
+       if t in _dbus2py:
+               return _dbus2py[t](d)
+       if t is dbus.Dictionary:
+               return dict([(dbus2py(k), dbus2py(v)) for k, v in d.items()])
+       if t is dbus.Array and d.signature == "y":
+               return "".join([chr(b) for b in d])
+       if t is dbus.Array or t is list:
+               return [dbus2py(v) for v in d]
+       if t is dbus.Struct or t is tuple:
+               return tuple([dbus2py(v) for v in d])
+       return d
+
+def pretty(d):
+       d = dbus2py(d)
+       t = type(d)
+
+       if t in (dict, tuple, list) and len(d) > 0:
+               if t is dict:
+                       d = ", ".join(["%s = %s" % (k, pretty(v))
+                                       for k, v in d.items()])
+                       return "{ %s }" % d
+
+               d = " ".join([pretty(e) for e in d])
+
+               if t is tuple:
+                       return "( %s )" % d
+
+       return str(d)
+
 def property_changed(name, value, path, interface):
        iface = interface[interface.rfind(".") + 1:]
-       if name in ["Modems", "Interfaces", "Features",
-                               "Technologies",
-                               "SubscriberNumbers",
-                               "EmergencyNumbers",
-                               "PreferredLanguages"]:
-               val = ""
-               for i in value:
-                       val += i + " "
-       elif name in ["MobileNetworkCodeLength",
-                               "VoicemailMessageCount"]:
-               val = int(value)
-       else:
-               val = str(value)
-       print "{%s} [%s] %s = %s" % (iface, path, name, val)
+       print "{%s} [%s] %s = %s" % (iface, path, name, pretty(value))
 
 if __name__ == '__main__':
        dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)