#!/usr/bin/python

import gobject

import dbus
import dbus.mainloop.glib

def device_found(address, properties):
	print "[ " + address + " ]"

	for key in properties.keys():
		value = properties[key]
		if (key == "Class"):
			print "    %s = 0x%06x" % (key, value)
		else:
			print "    %s = %s" % (key, value)

def property_changed(name, value):
	if (name == "Discovering" and not value):
		mainloop.quit()

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

	bus = dbus.SystemBus()
	manager = dbus.Interface(bus.get_object("org.bluez", "/"),
							"org.bluez.Manager")

	path = manager.DefaultAdapter()
	adapter = dbus.Interface(bus.get_object("org.bluez", path),
							"org.bluez.Adapter")

	bus.add_signal_receiver(device_found,
			dbus_interface = "org.bluez.Adapter",
					signal_name = "DeviceFound")

	bus.add_signal_receiver(property_changed,
			dbus_interface = "org.bluez.Adapter",
					signal_name = "PropertyChanged")

	adapter.StartDiscovery()

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