#!/bin/sh

PROG="${0##*/}" #program name

MONITORSDB=/usr/share/hwdatabase/MonitorsDB

print_version()
{
	cat <<EOF
$PROG version @VERSION@

Written by Stanislav Ievlev

Copyright (C) 2003-2004 ALT Linux Team
EOF
	exit
}


print_usage()
{
	[ "$1" = 0 ] || exec >&2
	cat <<EOF
Usage: $PROG [options] 

alterator backend to get list of avaliable video drivers

Valid options are:
  -h, --help	display help screen
  -v, --version	display version information
  -l, --list	get list of available vendors/drivers
  -t, --type	check for vendor/driver existance
  -d, --delete	(empty action, required for backend)
  -r, --read	read driver information
  -w, --write	(empty action, required for backend)

Report bugs to <inger@altlinux.org>
EOF
	[ -n "$1" ] && exit "$1" || exit
}

dump_drv_models()
{
	if [ -n "$1" ];then
	  grep -E -v '(^#|^[[:space:]]*$)' "$MONITORSDB"|grep -E "^$1;"|cut -f2 -d';'|sed -s 's,^ ,,'|sort -u
	else
	  grep -E -v '(^#|^[[:space:]]*$)' "$MONITORSDB"|cut -f2 -d';'|sed -s 's,^ ,,'|sort -u
	fi
}

dump_drv_vendors()
{
	if [ -n "$1" ];then
	  grep -E -v '(^#|^[[:space:]]*$)' "$MONITORSDB"|grep -F "; $1;"|cut -f1 -d';'|sort -u
	else
	  grep -E -v '(^#|^[[:space:]]*$)' "$MONITORSDB"|cut -f1 -d';'|sort -u
	fi
}

#quote filenames,to made it usable in filesystem
encode_drv_name()
{
	#hide / symbols - both for input and output
	sed $sed_options 's,%,%%,g
	s,|,%|,g
	s,/,|,g'
}

decode_drv_name()
{
    local separator=$(printf '\007')
    sed  $sed_options "s,%\(.\),$separator\1,g
	    s,\([^$separator]\|^\)|,\1/,g
	    s,\([^$separator]\|^\)|,\1/,g
	    s,$separator,,g"
}


out_from_db()
{
	#name
	echo "$1"|cut -f2 -d';'|
		sed -r 's,[[:space:]]*(.*),name:\1,'
	#hsync
	echo "$1"|cut -f4 -d';'|
		sed -r 's,[[:space:]]*(.*),hsync:\1,'
	#vsync
	echo "$1"|cut -f5 -d';'|
		sed -r 's,[[:space:]]*(.*),vsync:\1,'
}

get_monitor_data()
{
	ddcout=$(/usr/sbin/ddcprobe 2>/dev/null)
	echo "$ddcout"|grep -qs "edidfail" && return
	eisa=$(echo "$ddcout"|grep "eisa:"|sed -r 's,eisa:[[:space:]]*(.*),\L\1,')
	monitor_name=$(echo "$ddcout"|grep "monitorname:"|sed -r 's,monitorname:[[:space:]]*(.*),\1,')
	
	#first try to determine monitor's name using eisa
	if [ -n "$eisa" ] && grep -qsi ";[[:space:]]*$eisa;" "$MONITORSDB" ;then
		line=$(grep -i ";[[:space:]]*$eisa;" "$MONITORSDB")
		out_from_db "$line"
	#second try to determine monitor's name using
	elif [ -n "$monitor_name" ] &&
		cat /usr/share/hwdatabase/MonitorsDB|sed 's, ,,g'|grep -qs "$monitor_name;"; then
		eisa=$(cat "$MONITORSDB"|sed 's, ,,g'|grep "$monitor_name;"|cut -f3 -d';')
		line=$(grep ";[[:space:]]*$eisa;" "$MONITORSDB")
		out_from_db "$line"
	#ddc only information
	else
	    if [ -n "$monitor_name" ];then
		echo "name:$monitor_name"
	    else
		echo "name:$eisa"
	    fi
	fi
	# show supported and recommended resolutions
	x11createconfig -m 2>/dev/null
}

TEMP=`getopt -n $PROG -o h,v,l:,d:,r:,w:,t: -l help,version,list:,delete:,read:,write:,type: -- "$@"` || print_usage
eval set -- "$TEMP"

while :; do
	case "$1" in
		-h|--help) print_usage 0
			;;
		-v|--version) print_version
			;;
		-l|--list)
			shift;dir="$1";
			if [ "$dir" == "/" ] ;then
				echo "auto_detect r"
				echo "vendors d"
				echo "models d"
			elif [ "$dir" == "vendors" ];then
				dump_drv_vendors|encode_drv_name|sed 's,.*,& d,'
			elif [ "${dir:0:8}" == "vendors/" ];then
				dump_drv_models "${dir:8}"|encode_drv_name|sed 's,.*,& r,'
			elif [ "$dir" == "models" ];then
				dump_drv_models|encode_drv_name|sed 's,.*,& r,'
			fi
			;;
		-d|--delete)
			#ignore
			shift;drv="$1";
			;;
		-t|--type)
			shift;drv="$1";
			if [ "$drv" == "drivers" ];then
				echo "drivers d"
			elif [ "$drv" == "auto_detect" ];then
				echo "auto_detect r"
			fi
			#TODO: also check for existance of auto_detect and drivers data
			;;
		-r|--read)
			shift;drv="$1";
			if [ "$drv" == "auto_detect" ];then
				get_monitor_data
			elif [ "${drv:0:7}" == "models/" ];then
				model=`echo "${drv:7}"|decode_drv_name`
				dump_drv_vendors "$model"|encode_drv_name|sed 's,.*,vendor:&,'
			fi
			;;
		-w|--write)
			#ignore
			shift;drv="$1";
			while read l; do
				echo -n
			done
			;;
		--) shift; break
			;;
		*) Fatal "unrecognized option: $1"
			;;
	esac
	shift
done
