#!/usr/bin/python

from __future__ import absolute_import, print_function, unicode_literals

import gobject

import dbus
import dbus.mainloop.glib

relevant_ifaces = [ "org.bluez.Adapter1", "org.bluez.Device1" ]

def property_changed(interface, changed, invalidated, path):
	iface = interface[interface.rfind(".") + 1:]
	for name, value in changed.iteritems():
		val = str(value)
		print("{%s.PropertyChanged} [%s] %s = %s" % (iface, path, name,
									val))

def interfaces_added(path, interfaces):
	for iface, props in interfaces.iteritems():
		if not(iface in relevant_ifaces):
			continue
		print("{Added %s} [%s]" % (iface, path))
		for name, value in props.iteritems():
			print("      %s = %s" % (name, value))

def interfaces_removed(path, interfaces):
	for iface in interfaces:
		if not(iface in relevant_ifaces):
			continue
		print("{Removed %s} [%s]" % (iface, path))

if __name__ == '__main__':
	dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)

	bus = dbus.SystemBus()

	bus.add_signal_receiver(property_changed, bus_name="org.bluez",
			dbus_interface="org.freedesktop.DBus.Properties",
			signal_name="PropertiesChanged",
			path_keyword="path")

	bus.add_signal_receiver(interfaces_added, bus_name="org.bluez",
			dbus_interface="org.freedesktop.DBus.ObjectManager",
			signal_name="InterfacesAdded")

	bus.add_signal_receiver(interfaces_removed, bus_name="org.bluez",
			dbus_interface="org.freedesktop.DBus.ObjectManager",
			signal_name="InterfacesRemoved")

	mainloop = gobject.MainLoop()
	mainloop.run()
