#!/bin/sh
PATH=/usr/local/bin:$PATH
HOME=/usr/local/root

gkf_get () {
	awk 'BEGIN{r=1}/^\[/{x=0}/^\['$2']/{x=1}(x)&&/^ *'$3' *=/{sub("^ *'$3' *= *", "");print;r=0}END{exit r}' $1 2>/dev/null
}

adjust_time_if () {
	[ $(date '+%Y') -gt 2000 ] || clife adjust_time
}

get_using_ssid () {
	sed -n \
		-e '/^[  ]*wpa-ssid/{s/^[        ]*wpa-ssid[     ]*\(\\ \|\)\(.*\)/\1\2/;p;}' \
		-e '/^[  ]*wireless_essid/{s/^[  ]*wireless_essid[       ]*\(--\|\)[     ]*\(\\ \|\)\(.*\)/\2\3/;p;}' \
		< /etc/network/interfaces
}

delete_device_if () {
	! gkf_get $HOME/.camera.ini OLDACCOUNT DEVICEID > /dev/null || \
		clife delete_device
}

register_device_if () {
	gkf_get $HOME/.camera.ini UPLOADER DEVICEID > /dev/null || \
		clife register_device
}

pid_exist () {
	ps | (while read i j; do [ $i = "$1" ] && exit 0; done; exit 1)
}

# avoid making multiple camera processes (not a perfect solution)
exec_or_wait () {
	if ! p=$(ps|awk 'BEGIN{x=1}($5~/'"$1"'$/){print $1;x=0}END{exit x}'); then
		exec "$@"
	fi
	# Wait for the process to exit.
	# If a signal comes, this process relay it and still wait for the process to exit.
	trap "kill $p" TERM
	while pid_exist $p; do sleep 1; done
	exit 0
}

start_live_broadcasting () {
	adjust_time_if
	delete_device_if
	register_device_if
	es=$?
	[ $es -eq 0 ] || return $es
	kill -STOP 0		# device id is ready
	rm /tmp/camera-status.cfg
	case `ethlink eth0` in
		*up)
			exec_or_wait camera live
			;;
		*)
			exec_or_wait camera live "`get_using_ssid`"
			;;
	esac
}

start_camera_test_broad () {
	echo $1 > /tmp/camera-status.cfg
	exec_or_wait camera test-broad
}

start_recording () {
    start_camera_test_broad "[FILE]"
}

start_rtsp_preview () {
    start_camera_test_broad "[RTSP]"
}

ret=1
case "$1" in
    "encoder")
        case "$2" in
            "preview")
                start_rtsp_preview
                ;;
            "live")
                start_live_broadcasting
		ret=$?
                ;;
            "record")
                start_recording
                ;;
            *)
                echo Unknown mode "$2" 1>&2
                ;;
        esac
        ;;
    *)
        echo Unknown command "$1" 1>&2
        ;;
esac
exit $ret
