#!/usr/bin/python

import sys
import dbus
from optparse import OptionParser, make_option

bus = dbus.SystemBus()

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

option_list = [
		make_option("-i", "--device", action="store",
				type="string", dest="dev_id"),
		]
parser = OptionParser(option_list=option_list)

(options, args) = parser.parse_args()

if options.dev_id:
	adapter_path = manager.FindAdapter(options.dev_id)
else:
	adapter_path = manager.DefaultAdapter()

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

if len(args) < 2:
	print """Usage: %s <command>

	connect <bdaddr>
	disconnect <bdaddr>
	""" % sys.argv[0]
	sys.exit(1)

device = adapter.FindDevice(args[1])
input = dbus.Interface(bus.get_object("org.bluez", device),
				"org.bluez.Input")

if args[0] == "connect":
	input.Connect()
elif args[0] == "disconnect":
	input.Disconnect()
else:
	print "Unknown command"
	sys.exit(1)
