#!/usr/bin/python

import sys
import gobject
import string

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

import glib

import traceback

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

def extract_values(values):
	val = "{"
	for key in values.keys():
		val += " " + key + "="
		if key in ["PrefixLength"]:
			val += "%s" % (int(values[key]))
		else:
			if key in ["Servers", "Excludes"]:
				val += extract_list(values[key])
			else:
				val += str(values[key])
	val += " }"
	return val

class Notification(dbus.service.Object):
	def __init__(self, bus, app, notify_path):
		dbus.service.Object.__init__(self)
		self.app = app

	@dbus.service.method("net.connman.Notification",
				in_signature='', out_signature='')
	def Release(self):
		print "Release %s" % (self._object_path)
		session_name = self._object_path.split('/')[-1]
		self.app.release(session_name)

	@dbus.service.method("net.connman.Notification",
				in_signature='a{sv}', out_signature='')
	def Update(self, settings):
		print "Update called at %s" % (self._object_path)

		try:
			for key in settings.keys():
				if key in ["IPv4", "IPv6"]:
					val = extract_values(settings[key])
				elif key in  ["AllowedBearers"]:
					val = extract_list(settings[key])
				else:
					val = settings[key]
				print "    %s = %s" % (key, val)
		except:
			print "Exception:"
			traceback.print_exc()

class SessionApplication(dbus.service.Object):
	def __init__(self, bus, object_path, mainloop):
		dbus.service.Object.__init__(self, bus, object_path)

		self.manager = None
		self.mainloop = mainloop
		self.sessions = {}

		try:
			bus = dbus.SystemBus()
			bus.watch_name_owner('net.connman', self.connman_name_owner_changed)
		except dbus.DBusException:
			traceback.print_exc()

	def connman_name_owner_changed(self, proxy):
		try:
			if proxy:
				print "connman appeared on D-Bus ", str(proxy)

				bus = dbus.SystemBus()
				self.manager = dbus.Interface(bus.get_object("net.connman", "/"),
							      "net.connman.Manager")
			else:
				print "connman disappeared on D-Bus"
				self.manager = None
				for s in self.sessions.keys():
					self.sessions[s]['notify'].remove_from_connection()
					self.sessions[s]['notify'] = None

				self.sessions = {}

		except dbus.DBusException:
			traceback.print_exc()

	def release(self, session_name):
		s = self.find_session(session_name)
		if not s:
			return
		if s['session']:
			s['session'].Destroy()
			s['session'] = None
		if s['notify']:
			s['notify'].remove_from_connection()
			s['notify'] = None
		del self.sessions[session_name]

	def type_convert(self, key, value):
		if key in [ "AllowedBearers" ]:
			return value
		elif key in [ "RoamingPolicy", "ConnectionType" ]:
			if len(value) > 0:
				return value[0]
		elif key in [ "Priority", "AvoidHandover",
			      "StayConnected", "EmergencyCall" ]:
			flag = str(value[0]).strip().lower()
			val = flag not in ['false', 'f', 'n', '0']
			return dbus.Boolean(val)
		elif key in [ "PeriodicConnect", "IdleTimeout" ]:
			val = value[0]
			return dbus.UInt32(val)

		return value

	def find_session(self, session_name):
		if not session_name in self.sessions.keys():
			return None
		return self.sessions[session_name]

	@dbus.service.method("com.example.TestSession",
				in_signature='', out_signature='')
	def CreateSession(self, session_name):
		print "Create session"

		s = self.find_session(session_name)
		if s and s['session'] :
			print "Session %s already created-> drop reqest" % (session_name)
			return

		try:
			bus = dbus.SystemBus()

			if s == None:
				s = {}
			s['notify_path'] = self._object_path + "/" + session_name
			s['notify'] = Notification(bus, self, s['notify_path'])
			s['notify'].add_to_connection(bus, s['notify_path'])
			if not 'settings' in s.keys():
				s['settings'] = {};
			s['session_path'] = self.manager.CreateSession(s['settings'], s['notify_path'])
			print "notify path %s" % (s['notify_path'])
			print "session path %s" % (s['session_path'])
			s['session'] = dbus.Interface(bus.get_object("net.connman", s['session_path']),
						      "net.connman.Session")
			self.sessions[session_name] = s

		except dbus.DBusException, e:
			if e.get_dbus_name() in ['net.connman.Error.Failed']:
				print e.get_dbus_message()
				return
			traceback.print_exc()

	@dbus.service.method("com.example.TestSession",
				in_signature='', out_signature='')
	def DestroySession(self, session_name):
		print "Destroy session"

		s = self.find_session(session_name)
		if s == None or s['session'] == None:
			print "The session is not running -> drop request"
			return

		try:
			self.release(session_name)
		except dbus.DBusException:
			traceback.print_exc()

	@dbus.service.method("com.example.TestSession",
				in_signature='', out_signature='')
	def Connect(self, session_name):
		print "Connect session"

		s = self.find_session(session_name)
		if s == None or s['session'] == None:
			print "The session is not running -> drop request"
			return

		try:
			s['session'].Connect()
		except dbus.DBusException, e:
			if e.get_dbus_name() in ['net.connman.Error.Failed']:
				print e.get_dbus_message()
				return
			traceback.print_exc()

	@dbus.service.method("com.example.TestSession",
				in_signature='', out_signature='')
	def Disconnect(self, session_name):
		print "Disconnect session"

		s = self.find_session(session_name)
		if s == None or s['session'] == None:
			print "The session is not running -> drop request"
			return

		try:
			s['session'].Disconnect()
		except dbus.DBusException, e:
			if e.get_dbus_name() in ['net.connman.Error.Failed']:
				print e.get_dbus_message()
				return
			traceback.print_exc()

	@dbus.service.method("com.example.TestSession",
				in_signature='', out_signature='')
	def Change(self, session_name, key, value):
		print "Update session settings"

		s = self.find_session(session_name)
		if s == None or s['session'] == None:
			print "The session is not running -> drop request"
			return

		try:
			val = self.type_convert(key, value)
			s['session'].Change(key, val)
		except dbus.DBusException, e:
			if e.get_dbus_name() in ['net.connman.Error.Failed']:
				print e.get_dbus_message()
				return
			traceback.print_exc()

	@dbus.service.method("com.example.TestSession",
				in_signature='', out_signature='')
	def Configure(self, session_name, key, value):
		print "Configure session settings"
		s = self.find_session(session_name)
		if s == None:
			s = {}
			s['notify_path'] = None
			s['notify'] = None
			if not 'settings' in s.keys():
				s['settings'] = {};
			s['session_path'] = None
			s['session'] = None
			self.sessions[session_name] = s
		if s and s['session']:
			print "The session is running, use change -> drop request"
			return
		val = self.type_convert(key, value)
		s['settings'][key] = val

def main():
	if len(sys.argv) < 2:
		print "Usage: %s <command>" % (sys.argv[0])
		print ""
		print "  enable"
		print "  disable"
		print "  create <app_path> <session_name>"
		print "  destroy <app_path> <session_name>"
		print "  connect <app_path> <session_name>"
		print "  disconnect <app_path> <session_name>"
		print "  change <app_path> <session_name> <key> <value>"
		print "  configure <app_path> <session_name> <key> <value>"
		print ""
		print "  run <app_path>"
		sys.exit(1)

	dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)

	if sys.argv[1] == "enable":
		bus = dbus.SystemBus()
		manager = dbus.Interface(bus.get_object("net.connman", "/"),
					 "net.connman.Manager")
		manager.SetProperty("SessionMode", True)
		return

	elif sys.argv[1] == "disable":
		bus = dbus.SystemBus()
		manager = dbus.Interface(bus.get_object("net.connman", "/"),
					 "net.connman.Manager")
		manager.SetProperty("SessionMode", False)
		return

	if (len(sys.argv) < 3):
		print "Need test application path"
		sys.exit(1)

	app_path = sys.argv[2]
	bus = dbus.SessionBus()

	app_name = "com.example.SessionApplication.%s" % (string.strip(app_path, "/"))

	if sys.argv[1] == "run":
		name = dbus.service.BusName(app_name, bus)
		mainloop = gobject.MainLoop()

		app = SessionApplication(bus, app_path, mainloop)

		mainloop.run()
		return

	app = dbus.Interface(bus.get_object(app_name, app_path),
			     "com.example.TestSession")

	if sys.argv[1] == "create":
		app.CreateSession(sys.argv[3])

	elif sys.argv[1] == "destroy":
		app.DestroySession(sys.argv[3])

	elif sys.argv[1] == "connect":
		app.Connect(sys.argv[3])

	elif sys.argv[1] == "disconnect":
		app.Disconnect(sys.argv[3])

	elif sys.argv[1] == "change":
		if len(sys.argv) < 5:
			print "Arguments missing"
			sys.exit(1)

		app.Change(sys.argv[3], sys.argv[4], sys.argv[5:])

	elif sys.argv[1] == "configure":
		if len(sys.argv) < 5:
			print "Arguments missing"
			sys.exit(1)

		app.Configure(sys.argv[3], sys.argv[4], sys.argv[5:])

	else:
		print "Unknown command '%s'" % sys.argv[1]
		sys.exit(1)

if __name__ == '__main__':
	main()
