#!/usr/bin/python

import sys
import dbus
import re

bus = dbus.SystemBus()

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

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

if (len(sys.argv) < 2):
	print "Usage: %s <command>" % (sys.argv[0])
	print ""
	print "  list"
	print "  create <address>"
	print "  remove <address|path>"
	print "  discover <address> [pattern]"
	print "  class <address>"
	print "  name <address>"
	print "  alias <address> [alias]"
	print "  trusted <address> [yes/no]"
	sys.exit(1)

if (sys.argv[1] == "list"):
	list = adapter.ListDevices()
	print list
	sys.exit(0)

if (sys.argv[1] == "create"):
	if (len(sys.argv) < 3):
		print "Need address parameter"
	else:
		device = adapter.CreateDevice(sys.argv[2])
		print device
	sys.exit(0)

if (sys.argv[1] == "remove"):
	if (len(sys.argv) < 3):
		print "Need address or object path parameter"
	else:
		try:
			path = adapter.FindDevice(sys.argv[2])
		except:
			path = sys.argv[2]
		adapter.RemoveDevice(path)
	sys.exit(0)

if (sys.argv[1] == "discover"):
	if (len(sys.argv) < 3):
		print "Need address parameter"
	else:
		path = adapter.FindDevice(sys.argv[2])
		device = dbus.Interface(bus.get_object("org.bluez", path),
							"org.bluez.Device")
		if (len(sys.argv) < 4):
			pattern = ""
		else:
			pattern = sys.argv[3]
		services = device.DiscoverServices(pattern);
		for key in services.keys():
			p = re.compile(">.*?<")
			xml = p.sub("><", services[key].replace("\n", ""))
			print "[ 0x%5x ]" % (key)
			print xml
			print
	sys.exit(0)

if (sys.argv[1] == "class"):
	if (len(sys.argv) < 3):
		print "Need address parameter"
	else:
		path = adapter.FindDevice(sys.argv[2])
		device = dbus.Interface(bus.get_object("org.bluez", path),
							"org.bluez.Device")
		properties = device.GetProperties()
		print "0x%06x" % (properties["Class"])
	sys.exit(0)

if (sys.argv[1] == "name"):
	if (len(sys.argv) < 3):
		print "Need address parameter"
	else:
		path = adapter.FindDevice(sys.argv[2])
		device = dbus.Interface(bus.get_object("org.bluez", path),
							"org.bluez.Device")
		properties = device.GetProperties()
		print properties["Name"]
	sys.exit(0)

if (sys.argv[1] == "alias"):
	if (len(sys.argv) < 3):
		print "Need address parameter"
	else:
		path = adapter.FindDevice(sys.argv[2])
		device = dbus.Interface(bus.get_object("org.bluez", path),
							"org.bluez.Device")
		if (len(sys.argv) < 4):
			properties = device.GetProperties()
			print properties["Alias"]
		else:
			device.SetProperty("Alias", sys.argv[3])
	sys.exit(0)

if (sys.argv[1] == "trusted"):
	if (len(sys.argv) < 3):
		print "Need address parameter"
	else:
		path = adapter.FindDevice(sys.argv[2])
		device = dbus.Interface(bus.get_object("org.bluez", path),
							"org.bluez.Device")
		if (len(sys.argv) < 4):
			properties = device.GetProperties()
			print properties["Trusted"]
		else:
			if (sys.argv[3] == "yes"):
				value = dbus.Boolean(1)
			elif (sys.argv[3] == "no"):
				value = dbus.Boolean(0)
			else:
				value = dbus.Boolean(sys.argv[3])
			device.SetProperty("Trusted", value)
	sys.exit(0)

print "Unknown command"
sys.exit(1)
