# bash completion for bluez utils                          -*- shell-script -*-

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

_bluetooth_devices()
{
    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" ) )
}

_hcitool()
{
    local cur prev words cword split
    _init_completion -s || return

    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

    local arg
    _get_first_arg
    if [[ -z $arg ]]; then
        if [[ "$cur" == -* ]]; then
            COMPREPLY=( $( compgen -W '$( _parse_help "$1" )' -- "$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 $arg 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 words cword split
    _init_completion -s || return

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

    $split && return 0

    local arg
    _get_first_arg
    if [[ -z $arg ]]; then
        if [[ "$cur" == -* ]]; then
            COMPREPLY=( $( compgen -W '$( _parse_help "$1" )' -- "$cur" ) )
        else
            COMPREPLY=( $( compgen -W 'search browse records add \
                del get setattr setseq' -- "$cur" ) )
        fi
    else
        case $arg 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 words cword
    _init_completion || return

    case $prev in
        -i)
            _bluetooth_devices
            return 0
            ;;
        -s|-c|-t|-d)
            return 0
            ;;
    esac

    if [[ "$cur" == -* ]]; then
        COMPREPLY=( $( compgen -W '$( _parse_usage "$1" )' -- "$cur" ) )
    else
        _bluetooth_adresses
    fi
} &&
complete -F _l2ping l2ping

_rfcomm()
{
    local cur prev words cword
    _init_completion || return

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

    local arg
    _get_first_arg
    if [[ -z $arg ]]; then
        if [[ "$cur" == -* ]]; then
            COMPREPLY=( $( compgen -W '$( _parse_help "$1" )' -- "$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 $arg in
                connect|bind)
                    if [[ $args -eq 3 ]]; then
                        _bluetooth_adresses
                    fi
                    ;;
            esac
        fi
    fi
} &&
complete -F _rfcomm rfcomm

_ciptool()
{
    local cur prev words cword
    _init_completion || return

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

    local arg
    _get_first_arg
    if [[ -z $arg ]]; then
        if [[ "$cur" == -* ]]; then
            COMPREPLY=( $( compgen -W '$( _parse_help "$1" )' -- "$cur" ) )
        else
            COMPREPLY=( $( compgen -W 'show search connect release \
                loopback' -- "$cur" ) )
        fi
    else
        case $arg in
            connect|release|loopback)
                _count_args
                if [[ $args -eq 2 ]]; then
                    _bluetooth_adresses
                fi
                ;;
        esac
    fi
} &&
complete -F _ciptool ciptool

_dfutool()
{
    local cur prev words cword
    _init_completion || return

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

    if [[ "$cur" == -* ]]; then
        COMPREPLY=( $( compgen -W '$( _parse_help "$1" )' -- "$cur" ) )
    else
        local args
        _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 prev words cword
    _init_completion || return

    local arg
    _get_first_arg
    if [[ -z $arg ]]; then
        if [[ "$cur" == -* ]]; then
            COMPREPLY=( $( compgen -W '--help --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 $arg 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 prev words cword
    _init_completion || return

    if [[ "$cur" == -* ]]; then
        COMPREPLY=( $( compgen -W '-n -p -t -b -s -l' -- "$cur" ) )
    else
        local args
        _count_args
        case $args in
            1)
                COMPREPLY=( $( printf '%s\n' /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

# ex: ts=4 sw=4 et filetype=sh
