#!/usr/bin/python

from __future__ import absolute_import, print_function, unicode_literals

import dbus
import dbus.mainloop.glib
try:
  from gi.repository import GObject
except ImportError:
  import gobject as GObject

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()
