#!/usr/bin/python

import dbus
import dbus.mainloop.glib
import sys
import gobject
import os

def print_menu():
	print "Select test case"
	print "----------------------------------------------------------------"
	print "[0] Activate cbs"
	print "[1] Deactivate cbs"
	print "[2] Get cbs properties"
	print "[3] Set/Register topics"
	print "        If several - give topics separated with comma. \
		\n        E.g. 20,50-51,60"
	print "[4] Clear/Unregister topics"
	print "[5] NetReg Base Station - Get current serving cell"
	print "[x] Exit"
	print "----------------------------------------------------------------"

def property_changed(property, value):
	if value == "" and property == "Topics":
		print "User selected Topics have been cleared. \
			\nRegistered for emergency topics only."
	else:
		print "Cell Broadcast property %s is changed to %s" % (property, value)
	print "\nPress ENTER to continue"

def incoming_broadcast(text, topic):
	print "Broadcast msg: %s \n Topic channel: %s" % (text, topic)
	print "\nPress ENTER to continue"

def emergency_broadcast(text, properties):
	emergType = properties["EmergencyType"]
	emergAlert = properties["EmergencyAlert"]

	print "Broadcast msg: %s \n\t Type: %s \n\t Alert: %s \n\t Popup: %s" \
		% (text, emergType, emergAlert, popup)

	if properties["Popup"] == True:
		print "Popup required."

	print "\nPress ENTER to continue"

def set_cbs_state(cbs, state):
	if state == True:
		print "Activating cell broadcast..."
		cbs.SetProperty("Powered", dbus.Boolean(1))
	else:
		print "Deactivating cell broadcast..."
		cbs.SetProperty("Powered", dbus.Boolean(0))
	print "-----------------------------------------------------------"

def print_cbs_properties(cbs):
	properties = cbs.GetProperties()
	print "---------------------PROPERTIES----------------------------"
	for p in properties:
		if len(properties[p].__str__()) > 0:
			if p == "Powered":
				if properties[p] == True:
					print "Cell Broadcast is Activated."
				else:
					print "Cell Broadcast is Deactivated."
			elif p == "Topics":
				print "Currently set CBS %s are: %s" \
					% (p, properties[p])
				topics_available = True
		else:
			print "Cell Broadcast %s value empty" % (p)
	print "-----------------------------------------------------------"

def set_topics(cbs):
	print_cbs_properties(cbs)

	topicTemp = ""
	invalidData = False;
	index = 0

	topics = raw_input('Enter the topic ID(s) you want to register to: ')

	while index < len(topics):
		if topics[index] == ',' or topics[index] == '-':
			topicTemp = ""
		elif topics[index] >= '0' and topics[index] <= '9':
			topicTemp = topicTemp + topics[index]
		else:
			print "Invalid char. \"%s\" entered. Topic not set." \
				% (topics[index])
			invalidData = True
			break

		if topicTemp:
			if int(topicTemp) > 999:
				invalidData = True
				print "Invalid Topic ID %s (range 0-999). \
					\nCould not register." % topicTemp

		index = index + 1

	if invalidData == False:
		try:
			print "Setting Cell Broadcast topics..."
			cbs.SetProperty("Topics", topics);
		except dbus.DBusException, e:
			print "Unable to set topic: ", e

	print "-----------------------------------------------------------"

def get_serving_cell_name(netReg):
	wasFound = False;
	properties = netReg.GetProperties()

	for p in properties:
		if p == "BaseStation":
			if len(properties[p].__str__()) > 0:
				print "Current serving cell name: %s" \
					% (properties["BaseStation"])
				wasFound = True;
			else:
				print "Current Serving cell name empty. \
					Base Station CBS not available."

	if wasFound == False:
		print "Base Station parameter not found. \
			\nBase Station CBS not available."
	print "-----------------------------------------------------------"

def stdin_handler(fd, condition, cbs, netReg):
	in_key = os.read(fd.fileno(), 160).rstrip()

	if in_key == '0':
		set_cbs_state(cbs, True)

	elif in_key == '1':
		set_cbs_state(cbs, False)

	elif in_key == '2':
		print_cbs_properties(cbs)

	elif in_key == '3':
		set_topics(cbs)

	elif in_key == '4':
		cbs.SetProperty("Topics", "")

	elif in_key == '5':
		get_serving_cell_name(netReg)

	elif in_key == 'x':
		sys.exit(1)

	print '\n' * 2
	print_menu()

	return True

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')

	modems = manager.GetModems()
	path = modems[0][0]

	cbs = dbus.Interface(bus.get_object('org.ofono', path),
				'org.ofono.CellBroadcast')

	netReg = dbus.Interface(bus.get_object('org.ofono', path),
				'org.ofono.NetworkRegistration')

	cbs.connect_to_signal("PropertyChanged", property_changed)
	cbs.connect_to_signal("IncomingBroadcast", incoming_broadcast)
	cbs.connect_to_signal("EmergencyBroadcast", emergency_broadcast)

	print '\n' * 2

	print_menu()

	gobject.io_add_watch(sys.stdin, gobject.IO_IN, stdin_handler, cbs, \
				netReg)

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