#!/usr/bin/python

import gobject

import sys
import dbus
import dbus.service
import dbus.mainloop.glib

class GoBack(dbus.DBusException):
	_dbus_error_name = "org.ofono.Error.GoBack"

class EndSession(dbus.DBusException):
	_dbus_error_name = "org.ofono.Error.EndSession"

class StkAgent(dbus.service.Object):
	exit_on_release = True

	def set_exit_on_release(self, exit_on_release):
		self.exit_on_release = exit_on_release

	@dbus.service.method("org.ofono.SimToolkitAgent",
					in_signature="", out_signature="")
	def Release(self):
		print "Release"
		if self.exit_on_release:
			mainloop.quit()

	@dbus.service.method("org.ofono.SimToolkitAgent",
				in_signature="sya(sy)n", out_signature="y")
	def RequestSelection(self, title, icon, items, default):
		print "Title: (%s)" % (title)
		index = 0;
		for item in items:
			print "%d. %s" % (index, item[0])
			index += 1

		print "\nDefault: %d" % (default)
		select = raw_input("Enter Selection (t, b):")

		if select == 'b':
			raise GoBack("User wishes to go back")
		elif select == 't':
			raise EndSession("User wishes to terminate session")
		else:
			return int(select);

	@dbus.service.method("org.ofono.SimToolkitAgent",
					in_signature="syb", out_signature="")
	def DisplayText(self, title, icon, urgent):
		print "DisplayText (%s, %s)" % (title, urgent)

	@dbus.service.method("org.ofono.SimToolkitAgent",
				in_signature="sysyyb", out_signature="s")
	def RequestInput(self, title, icon, default, min_chars, max_chars,
				hide_typing):
		print "Title: (%s)" % (title)
		print "Default: (%s)" % (default)
		print "Enter characters, min: %d, max: %d:" % (min_chars,
								max_chars)
		userin = raw_input("");

		return userin

	@dbus.service.method("org.ofono.SimToolkitAgent",
				in_signature="sysyyb", out_signature="s")
	def RequestDigits(self, title, icon, default, min_chars, max_chars,
				hide_typing):
		print "Title: (%s)" % (title)
		print "Default: (%s)" % (default)
		print "Enter digits, min: %d, max: %d:" % (min_chars,
								max_chars)
		userin = raw_input("'t' terminates, 'b' goes back:");

		if userin == 'b':
			raise GoBack("User wishes to go back")
		elif userin == 't':
			raise EndSession("User wishes to terminate session")
		else:
			return userin

	@dbus.service.method("org.ofono.SimToolkitAgent",
				in_signature="sy", out_signature="s")
	def RequestKey(self, title, icon):
		print "Title: (%s)" % (title)
		key = raw_input("Enter Key (t, b):")

		if key == 'b':
			raise GoBack("User wishes to go back");
		elif key == 't':
			raise EndSession("User wishes to terminate session");
		else:
			return key

	@dbus.service.method("org.ofono.SimToolkitAgent",
				in_signature="sy", out_signature="s")
	def RequestDigit(self, title, icon):
		print "Title: (%s)" % (title)
		key = raw_input("Enter Digit (t, b):")

		if key == 'b':
			raise GoBack("User wishes to go back");
		elif key == 't':
			raise EndSession("User wishes to terminate session");
		else:
			return key

	@dbus.service.method("org.ofono.SimToolkitAgent",
				in_signature="sy", out_signature="b")
	def RequestConfirmation(self, title, icon):
		print "Title: (%s)" % (title)
		key = raw_input("Enter Confirmation (t, b, y, n):")

		if key == 'b':
			raise GoBack("User wishes to go back");
		elif key == 't':
			raise EndSession("User wishes to terminate session");
		elif key == 'y':
			return True
		else:
			return False

	@dbus.service.method("org.ofono.SimToolkitAgent",
				in_signature="sy", out_signature="b")
	def ConfirmCallSetup(self, info, icon):
		print "Information: (%s)" % (info)
		key = raw_input("Enter Confirmation (t, y, n):")

		if key == 't':
			raise EndSession("User wishes to terminate session");
		elif key == 'y':
			return True
		else:
			return False

	@dbus.service.method("org.ofono.SimToolkitAgent",
					in_signature="", out_signature="")
	def Cancel(self):
		print "Cancel"

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

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

	properties = manager.GetProperties()

	for path in properties["Modems"]:
		modem = dbus.Interface(bus.get_object('org.ofono', path),
							'org.ofono.Modem')

		properties = modem.GetProperties()

		if "org.ofono.SimToolkit" not in properties["Interfaces"]:
			continue

		stk = dbus.Interface(bus.get_object('org.ofono', path),
					'org.ofono.SimToolkit')

	properties = stk.GetProperties()

	if "MainMenuTitle" in properties:
		print "Main Menu:"
		print "%s" % (properties["MainMenuTitle"])
		print "\n"

	if "MainMenu" in properties:
		print "Items:"
		index = 0
		for item in properties["MainMenu"]:
			print "%d. %s" % (index, item[0])
			index += 1

	path = "/test/agent"
	agent = StkAgent(bus, path)

	select = int(raw_input("Enter Selection: "))
	stk.SelectItem(select, path)
	print "Agent registered for session"

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