#!/bin/sh
#
# (C) 2007 Frantisek Dufka <dufkaf@seznam.cz>
#

toupper(){
    echo $* | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRTSUVWXYZ
}


infoprint(){
DBUS_SESSION_BUS_ADDRESS='unix:path=/tmp/session_bus_socket' dbus-send >/dev/null 2>&1 --session --print-reply --dest=org.freedesktop.Notifications /org/freedesktop/Notifications org.freedesktop.Notifications.SystemNoteInfoprint "string:$*" &
}

dbus_method(){
local dest=$1
shift
DBUS_REPLY=$(dbus-send 2>&1 --system --type=method_call --print-reply --dest="$dest" $* )
}

dbus_result(){
    echo $DBUS_REPLY | cut -d ' ' -f 7- | tr -d \"
}

err(){
echo >&2 $*
}


find_port(){
#find rfcomm port bound to $BTADDR
if dbus_method org.bluez /org/bluez org.bluez.Manager.ActivateService string:serial ; then
    MGR_BUS=$(dbus_result)
    if dbus_method "${MGR_BUS}" /org/bluez/serial org.bluez.serial.Manager.ListPorts ; then
	local PORTS=$(dbus_result)
	for p in $PORTS ; do
	case $p in
	    /org/bluez/serial/rfcomm*)
    if dbus_method "${MGR_BUS}"  $p org.bluez.serial.Port.GetAddress ; then
	if [ "$(dbus_result)" = "$BTADDR" ] ; then
	    #err $BTADDR already exists on `basename $p`
	    PORT=`basename $p`
	fi
    else
	err ${DBUS_REPLY}
    fi
	    ;;
	esac
	done
    fi
fi
}

create_port(){
if dbus_method "${MGR_BUS}" /org/bluez/serial org.bluez.serial.Manager.CreatePort string:${BTADDR} string:spp ; then
    PORT=$(dbus_result)
    PORT=`basename $PORT`
else
    err $DBUS_REPLY
fi
}

remove_port(){
#delete port
if dbus_method "${MGR_BUS}" /org/bluez/serial org.bluez.serial.Manager.RemovePort string:/org/bluez/serial/$1 ; then
    echo $(dbus_result)
else
    err ${DBUS_REPLY}
fi	
}

#this doesn't work
connectService(){
    if dbus_method "${MGR_BUS}" /org/bluez/serial org.bluez.serial.Manager.ConnectService string:"${BTADDR} string:spp" ; then
	CONN=$(dbus_result)
	echo $CONN
	ls -l $CONN
	sleep 5
	ls -l $CONN
        dbus_method "${MGR_BUS}" /org/bluez/serial org.bluez.network.serial.Manager.DisconnectService string:"${CONN}"
    fi	
}

#err "Searching for $BTADDR ..."
#[ -t 1 ] || infoprint "Searching for $BTADDR"

if [ $# -lt 2 ] ; then
    err "Usage $0 bind|release BDADDR"
    exit
fi

PORT=
#BTADDR='00:0F:6F:00:93:07'
BTADDR=$(toupper $2)

find_port
case $1 in
    bind)
	if [ "$PORT" = "" ] ; then
	    create_port
	fi
	if [ "$PORT" = "" ] ; then
	    err "rfcomm bind to $BTADDR failed"
	    exit 1
	else
	    echo $PORT
	    exit 0
	fi
	;;
    release)	
	if [ "$PORT" = "" ] ; then
	    err no binding to $BTADDR to release
	    exit 1
	else
	    remove_port $PORT
	    exit 0
	fi
	;;
esac
