#!/usr/bin/env python
# -*- coding: UTF-8 -*-
#
# xmlrpc interface for re_codec: config and status
# no xmlrpc for now. only the functions
#
import sys
import jack
import re
from xml.dom.minidom import parse, parseString,getDOMImplementation


#some basic 
config="/etc/reboot.fm/re_codec.xml"

#read basics from xml
try:
	xml=parse(config)
except:
	print "could not parse config file: %s\n" % config
	sys.exit()
re_stream_config_file=xml.getElementsByTagName("re_stream_config")[0].firstChild.data
fallback_pls=xml.getElementsByTagName("fallback_playlist")[0].firstChild.data
restream_status=xml.getElementsByTagName("re_restream_status")[0].firstChild.data
jackplumbing_rc=xml.getElementsByTagName("jackplumbingrc")[0].firstChild.data
channels=int(xml.getElementsByTagName("channels")[0].firstChild.data)

#xmlrpc re_codec status framework:
def	jackmixer_status():
	#not implementet in jackmixer right now
	#return stream|fallback
	return 'stream'
	
def	jackmixer_log():
	#not implementet in jackmixer right now
	#return array(timestamp : status)
	return []
	
def	internet_log():
	#not implementet in pppkeepalive right now
	#return array(timestamp : reconnect)
	return []
	
def	restream_status():
	config_file=open(restream_status,"r")
	restream_status_value=config_file.read()
	config_file.close
	
	return restream_status_value
	# interpre restream_status_value here. stream or fallback
	# return stream|fallback

def	restream_log():
	#not implementet in restreame right now
	#return array(timestamp : status)
	return []  
	
def	uptime():
	return sys.uptime()

#xmlrpc re_codec config framework_
#

#TODO
# check url.
def re_stream_set_url(url):
	xml=parse(config)
	xml.getElementsByTagName("re_stream_url")[0].firstChild.replaceWholeText(ics_url)
	config_file=open(config,"w")
	config_file.write(rdf.toxml())
	config_file.close

def re_stream_get_url():
	xml=parse(config)
	url=rdf.getElementsByTagName("re_stream_url")[0].firstChild.data
	return url
	
def	re_fallback_get_pls():
	pls_file=open(fallback_pls,"r")
	pls_value=pls_file.read()
	pls_file.close
	return pls_value

def	re_fallback_set_pls(pls):
	pls_file=open(fallback_pls,"w")
	pls_file.write(pls)
	pls_file.close

def	re_jack_get_capture_ports():
	jack.attach('re_config')
	all_ports=jack.get_ports()
	capture_ports= []
	for x in all_ports:
		if (jack.get_port_flags(x) & jack.IsOutput) == 2:
			capture_ports.append(x)
	jack.detach()
	return capture_ports

def	re_jack_get_playback_ports():
	jack.attach('re_config')
	all_ports=jack.get_ports()
	playback_ports= []
	for x in all_ports:
		if (jack.get_port_flags(x) & jack.IsInput) == 1:
			playback_ports.append(x)
	jack.detach()
	return playback_ports

def	_jack_get_connected_ports(port):
	jack.attach('re_config')
	out_ports=[]
	for y in (jack.get_connections(port)):
		out_ports.append(z)
	jack.detach()
	return out_port

# internal function, not for public use
def _jack_plumbing_update(replace,new):
	rc_data_out=''
	rc=open(jackplumbing_rc,'r')
	rc_data=rc.read()
	rc.close()
	for line in rc_data.split('\n'):
		# alter rc_data here
		re_line= re.search(replace,line)
		if re_line:
			rc_data_out +=new +'\n'
		else:
			rc_data_out +=line +'\n'
		
	rc=open(jackplumbing_rc,'w')
	rc.write(rc_data_out.strip())
	rc.close()

def	re_jackmixer_set_in(portnum,port):
	_jack_plumbing_update(	're_jackmixer:in_%s'%portnum,
											'(connect "%s" "re_jackmixer:in_%s")'%(port,portnum)
										)
	
def	re_jackmixer_get_in():
	cannel1=_jack_get_connected_ports('re_jackmixer:in_1')
	cannel2=_jack_get_connected_ports('re_jackmixer:in_2')
	return (cannel1,cannel2)
	
def	re_jackmixer_set_fallback(portnum,fallback_port):
	_jack_plumbing_update(	're_jackmixer:fallback_%s'%portnum,
											'(connect "%s" "re_jackmixer:fallback_%s")'%(port,portnum)
										)

def 	re_jackmixer_get_fallback():
	cannel1=_jack_get_connected_ports('re_jackmixer:fallback_1')
	cannel2=_jack_get_connected_ports('re_jackmixer:fallback_2')
	return (cannel1,cannel2)

def	re_jackmixer_set_out(out_port):
	_jack_plumbing_update(	're_jackmixer:out_%s'%portnum,
											'(connect "%s" "re_jackmixer:fallback_%s")'%(port,portnum)
										)

def 	re_jackmixer_get_out():
	cannel1=_jack_get_connected_ports('re_jackmixer:out_1')
	cannel2=_jack_get_connected_ports('re_jackmixer:out_2')
	return (cannel1,cannel2)

def	re_restream_set_icsurl(ics_url):
	xml=parse(config)
	xml.getElementsByTagName("icsurl")[0].firstChild.replaceWholeText(ics_url)
	config_file=open(config,"w")
	config_file.write(rdf.toxml())
	config_file.close

	

def	re_restream_get_icsurl():
	rdf=parse(config)
	url=rdf.getElementsByTagName("icsurl")[0].firstChild.data
	return url
	
def	re_restream_set_overwrite_source(ogg_url):
	return
	
def	re_restream_get_overwrite_source():
	return

re_restream_set_icsurl('http://www.reboot.fm/vcal/current.ics')
print re_restream_get_icsurl()
