# bash completion for bluez-utils

have hcitool && {
_bluetooth_adresses()
{
    if [ -n "${COMP_BLUETOOTH_SCAN:-}" ]; then
        COMPREPLY=( ${COMPREPLY[@]:-} $( compgen -W "$( hcitool scan | \
            awk '/^\t/{print $1}' )" -- "$cur" ) )
    fi
}

_bluetooth_devices()
{
    COMPREPLY=( ${COMPREPLY[@]:-} $( compgen -W "$( hcitool dev | \
        awk '/^\t/{print $1}' )" -- "$cur" ) )
}

_bluetooth_services()
{
    COMPREPLY=( $( compgen -W 'DID SP DUN LAN FAX OPUSH FTP HS HF HFAG \
        SAP NAP GN PANU HCRP HID CIP A2SRC A2SNK AVRCT AVRTG UDIUE \
        UDITE SYNCML' -- "$cur" ) )
}

_bluetooth_packet_types()
{
    COMPREPLY=( $( compgen -W 'DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3' \
        -- "$cur" ) )
}

_get_command()
{
    local i

    command=
    for (( i=1; i < COMP_CWORD; i++ )); do
        if [[ "${COMP_WORDS[i]}" != -* ]]; then
            command=${COMP_WORDS[i]}
            break
        fi
    done
}

_hcitool()
{
    local cur prev split=false

    COMPREPLY=()
    cur=`_get_cword`
    prev=${COMP_WORDS[COMP_CWORD-1]}

    _split_longopt && split=true

    case $prev in
        -i)
            _bluetooth_devices
            return 0;
            ;;
        --role)
            COMPREPLY=( $( compgen -W 'm s' -- "$cur" ) )
            return 0;
            ;;
        --pkt-type)
            _bluetooth_packet_types
            return 0;
            ;;
    esac

    $split && return 0

    _get_command
    if [ -z $command ]; then
        if [[ "$cur" == -* ]]; then
            COMPREPLY=( $( compgen -W '-h -i' -- "$cur" ) )
        else
            COMPREPLY=( $( compgen -W 'dev inq scan name info \
                spinq epinq cmd con cc dc sr cpt rssi lq tpl \
                afh lst auth enc key clkoff clock' -- "$cur" ) )
        fi
    else
        case $command in
            @(name|info|dc|rssi|lq|afh|auth|key|clkoff|lst))
                _count_args
                if [ $args -eq 2 ]; then
                    _bluetooth_adresses
                fi
                ;;
            cc)
                if [[ "$cur" == -* ]]; then
                    COMPREPLY=( $( compgen -W '--role --pkt-type' -- "$cur" ) )
                else
                    _count_args
                    if [ $args -eq 2 ]; then
                        _bluetooth_adresses
                    fi
                fi
                ;;
            sr)
                _count_args
                if [ $args -eq 2 ]; then
                    _bluetooth_adresses
                else
                    COMPREPLY=( $( compgen -W 'master slave' -- "$cur" ) )
                fi
                ;;
            cpt)
                _count_args
                if [ $args -eq 2 ]; then
                    _bluetooth_adresses
                else
                    _bluetooth_packet_types
                fi
                ;;
            @(tpl|enc|clock))
                _count_args
                if [ $args -eq 2 ]; then
                    _bluetooth_adresses
                else
                    COMPREPLY=( $( compgen -W '0 1' -- "$cur" ) )
                fi
                ;;
        esac
    fi
}
complete -F _hcitool hcitool

_sdptool()
{
    local cur prev split=false

    COMPREPLY=()
    cur=`_get_cword`
    prev=${COMP_WORDS[COMP_CWORD-1]}

    _split_longopt && split=true

    case $prev in
        --bdaddr)
            _bluetooth_adresses
            return 0;
            ;;
    esac

    $split && return 0

    _get_command
    if [ -z $command ]; then
        if [[ "$cur" == -* ]]; then
            COMPREPLY=( $( compgen -W '--help' -- "$cur" ) )
        else
            COMPREPLY=( $( compgen -W 'search browse records add \
                del get setattr setseq' -- "$cur" ) )
        fi
    else
        case $command in
            search)
                if [[ "$cur" == -* ]]; then
                    COMPREPLY=( $( compgen -W '--bdaddr \
                        --tree --raw --xml' -- "$cur" ) )
                else
                    _bluetooth_services
                fi
                ;;
            @(browse|records))
                if [[ "$cur" == -* ]]; then
                    COMPREPLY=( $( compgen -W '--tree --raw --xml' -- "$cur" ) )
                else
                    _bluetooth_adresses
                fi
                ;;
            add)
                if [[ "$cur" == -* ]]; then
                    COMPREPLY=( $( compgen -W '--handle --channel' -- "$cur" ) )
                else
                    _bluetooth_services
                fi
                ;;
            get)
                if [[ "$cur" == -* ]]; then
                    COMPREPLY=( $( compgen -W '--bdaddr \
                        --tree --raw --xml' -- "$cur" ) )
                fi
                ;;
        esac
    fi
}
complete -F _sdptool sdptool

_l2ping()
{
    local cur prev

    COMPREPLY=()
    cur=`_get_cword`
    prev=${COMP_WORDS[COMP_CWORD-1]}

    case $prev in
        -i)
            _bluetooth_devices
            return 0;
            ;;
    esac

    if [[ "$cur" == -* ]]; then
        COMPREPLY=( $( compgen -W '-i -s -c -t -f -r' -- "$cur" ) )
    else
        _bluetooth_adresses
    fi

}
complete -F _l2ping l2ping

_rfcomm()
{
    local cur prev

    COMPREPLY=()
    cur=`_get_cword`
    prev=${COMP_WORDS[COMP_CWORD-1]}

    case $prev in
        -@(f|-config))
            _filedir
            return 0;
            ;;
        -i)
            _bluetooth_devices
            _bluetooth_adresses
            return 0;
            ;;
    esac

    _get_command
    if [ -z $command ]; then
        if [[ "$cur" == -* ]]; then
            COMPREPLY=( $( compgen -W '-h --help -a -r --raw -f \
                --config -i -A --auth -E --encrypt -S --secure \
                -M --master' -- "$cur" ) )
        else
            COMPREPLY=( $( compgen -W 'show connect listen watch \
                bind release' -- "$cur" ) )
        fi
    else
        _count_args
        if [ $args -eq 2 ]; then
            _bluetooth_devices
        else
            case $command in
                @(connect|bind))
                    if [ $args -eq 3 ]; then
                        _bluetooth_adresses
                    fi
                    ;;
            esac
        fi
    fi
}
complete -F _rfcomm rfcomm

_ciptool()
{
    local cur prev

    COMPREPLY=()
    cur=`_get_cword`
    prev=${COMP_WORDS[COMP_CWORD-1]}

    case $prev in
        -i)
            _bluetooth_devices
            _bluetooth_adresses
            return 0;
            ;;
    esac

    _get_command
    if [ -z $command ]; then
        if [[ "$cur" == -* ]]; then
            COMPREPLY=( $( compgen -W '-h --help -i' -- "$cur" ) )
        else
            COMPREPLY=( $( compgen -W 'show search connect release \
                loopback' -- "$cur" ) )
        fi
    else
        case $command in
            @(connect|release|loopback))
                _count_args
                if [ $args -eq 2 ]; then
                    _bluetooth_adresses
                fi
                ;;
        esac
    fi
}
complete -F _ciptool ciptool

_dfutool()
{
    local cur prev

    COMPREPLY=()
    cur=`_get_cword`
    prev=${COMP_WORDS[COMP_CWORD-1]}

    case $prev in
        -@(d|-device))
            _bluetooth_devices
            return 0;
            ;;
    esac

    if [[ "$cur" == -* ]]; then
        COMPREPLY=( $( compgen -W '-h --help -d --device' -- "$cur" ) )
    else
        _count_args
        case $args in
            1)
                COMPREPLY=( $( compgen -W 'verify modify \
                    upgrade archive' -- "$cur" ) )
                ;;
            2)
                _filedir
                ;;
        esac
    fi
}
complete -F _dfutool dfutool

_hciconfig()
{
    local cur

    COMPREPLY=()
    cur=`_get_cword`

    _get_command
    if [ -z $command ]; then
        if [[ "$cur" == -* ]]; then
            COMPREPLY=( $( compgen -W '-h --help -a --all' -- "$cur" ) )
        else
            COMPREPLY=( $( compgen -W 'up down reset rstat auth \
                noauth encrypt noencrypt secmgr nosecmgr \
                piscan noscan iscan pscan ptype name class \
                voice iac inqmode inqdata inqtype inqparams \
                pageparms pageto afhmode aclmtu scomtu putkey \
                delkey commands features version revision lm' \
                -- "$cur" ) )
        fi
    else
        case $command in
            @(putkey|delkey))
                _count_args
                if [ $args -eq 2 ]; then
                    _bluetooth_adresses
                fi
                ;;
            lm)
                _count_args
                if [ $args -eq 2 ]; then
                    COMPREPLY=( $( compgen -W 'MASTER \
                        SLAVE NONE ACCEPT' -- "$cur" ) )
                fi
                ;;
            ptype)
                _count_args
                if [ $args -eq 2 ]; then
                    _bluetooth_packet_types
                fi
                ;;
        esac
    fi
}
complete -F _hciconfig hciconfig

_hciattach()
{
    local cur

    COMPREPLY=()
    cur=`_get_cword`

    if [[ "$cur" == -* ]]; then
        COMPREPLY=( $( compgen -W '-n -p -t -b -s -l' -- "$cur" ) )
    else
        _count_args
        case $args in
            1)
                COMPREPLY=( $( command ls /dev/tty* ) )
                COMPREPLY=( $( compgen -W '${COMPREPLY[@]} \
                    ${COMPREPLY[@]#/dev/}' -- "$cur" ) )
                ;;
            2)
                COMPREPLY=( $( compgen -W 'any ericsson digi \
                    xircom csr bboxes swave bcsp 0x0105 \
                    0x080a 0x0160 0x0002' -- "$cur" ) )
                ;;
            3)
                COMPREPLY=( $( compgen -W '9600 19200 38400 \
                    57600 115200 230400 460800 921600' -- "$cur" ) )
                ;;
            4)
                COMPREPLY=( $( compgen -W 'flow noflow' -- "$cur" ) )
                ;;
            5)
                _bluetooth_adresses
                ;;
        esac
    fi

}
complete -F _hciattach hciattach

_hid2hci()
{
    local cur

    COMPREPLY=()
    cur=`_get_cword`

    if [[ "$cur" == -* ]]; then
        COMPREPLY=( $( compgen -W '-h --help -q --quiet -0 --tohci -1 \
            --tohid' -- "$cur" ) )
    fi
}
complete -F _hid2hci hid2hci

_avctrl()
{
    local cur

    COMPREPLY=()
    cur=`_get_cword`

    if [[ "$cur" == -* ]]; then
        COMPREPLY=( $( compgen -W '-h --help -q --quiet' -- "$cur" ) )
    else
        _count_args
        if [ $args -eq 1 ]; then
            COMPREPLY=( $( compgen -W 'discover switch' -- "$cur" ) )
        fi
    fi
}
complete -F _avctrl avctrl
}

# Local variables:
# mode: shell-script
# sh-basic-offset: 4
# sh-indent-comment: t
# indent-tabs-mode: nil
# End:
# ex: ts=4 sw=4 et filetype=sh
