#!/usr/bin/python

import sys
import dbus

bus = dbus.SystemBus()

def extract_list(list):
	val = "["
	for i in list:
		val += " " + str(i)
	val += " ]"
	return val

def usage():
	print "Usage: %s <command>" % (sys.argv[0])
	print ""
	print "  list"
	print "  enabled se/nfcX_<se_type>_seX [on/off]"
	print "  open_channel se/nfcX_<se_type>_seX <AID>"
	print "  close_channel se/nfcX_<se_type>_seX channelX"
	sys.exit(1)

if (len(sys.argv) < 2):
	usage()

if (sys.argv[1] == "list"):
	if (len(sys.argv) != 2):
		usage()
	else:
		manager = dbus.Interface(bus.get_object("org.neard.se", "/"),
							"org.neard.se.Manager")
		properties = manager.GetProperties()

		for path in properties["SecureElements"]:
			print "[ %s ]" % (path)

			seel = dbus.Interface(bus.get_object("org.neard.se", path),
						"org.neard.se.SecureElement")
			properties = seel.GetProperties()

			for key in properties.keys():
				if key in ["Enabled"]:
					if properties[key] == dbus.Boolean(1):
						val = "true"
					else:
						val = "false"
					print "    %s = %s" % (key, val)

				if key in ["Type"]:
					print "    %s = %s" % (key, str(properties[key]))

				if key in ["Channels"]:
					print "    %s = %s" % (key, extract_list(properties[key]))
	sys.exit(0)

if (sys.argv[1] == "enabled"):
	if (len(sys.argv) < 4):
		usage()
	else:
		path = "/org/neard/se/" + sys.argv[2]

		seel = dbus.Interface(bus.get_object("org.neard.se", path),
					"org.neard.se.SecureElement")

		try:
			if (sys.argv[3] == "on"):
				val = seel.SetProperty("Enabled", dbus.Boolean(1), timeout = 10)
			elif (sys.argv[3] == "off"):
				val = seel.SetProperty("Enabled", dbus.Boolean(0), timeout = 10)
			else:
				print "Invalid option %s" % sys.argv[3]

		except dbus.DBusException, error:
			print "%s: %s" % (error._dbus_error_name, error.message)
	sys.exit(0)

if (sys.argv[1] == "open_channel"):
	if (len(sys.argv) < 4):
		usage()
	else:
		path = "/org/neard/se/" + sys.argv[2]

		seel = dbus.Interface(bus.get_object("org.neard.se", path),
					"org.neard.se.SecureElement")

		try:
			channel = seel.OpenChannel(sys.argv[3].decode("hex"))

			print "Opened channel: %s" % str(channel)
		except dbus.DBusException, error:
			print "%s: %s" % (error._dbus_error_name, error.message)
	sys.exit(0)

if (sys.argv[1] == "close_channel"):
	if (len(sys.argv) < 4):
		usage()
	else:
		seel_path = "/org/neard/se/" + sys.argv[2]
		channel_path = seel_path + "/" + sys.argv[3]

		seel = dbus.Interface(bus.get_object("org.neard.se", seel_path),
					"org.neard.se.SecureElement")

		channel = dbus.Interface(bus.get_object("org.neard.se", channel_path),
					"org.neard.se.Channel")
		try:
			seel.CloseChannel(channel)

		except dbus.DBusException, error:
			print "%s: %s" % (error._dbus_error_name, error.message)
	sys.exit(0)

usage()
