# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# Common utilities for shell programs that manipulate devices and the
# connection manager, including "modem" and "connectivity"

# Prints an error message to stderr.
error() {
  echo "ERROR: $@" 1>&2
}

# Prints an error message to stderr and exits with a status code 1.
error_exit() {
  error "$@"
  exit 1
}

# Generates a small snippet of code to take a single argument out of our
# parameter list, and complain (and exit) if it's not present. Used in other
# places like: $(needarg foo), which binds foo to $1.
needarg() {
  # We need to echo eval here because the part of bash that understands
  # variable assignments has already run by the time we substitute in the
  # text of $(needarg foo) - i.e., bash will try to execute 'foo="$1"' as
  # a *command*, which it isn't. The eval forces bash to reparse the code
  # before executing it.
  echo eval "$1=\"\$1\";
      [ -z \"\$$1\" ] && echo 'Missing argument: $1' && usage;
      shift"
}

# Generates a small snippet of code to take a matching flag argument
# and value out of our parameter list if present.  If not, assign the
# default value to $1.
# Used in other places like: $(arg_or_default foo bar)
# which binds foo to "bar", unless $1 is "-foo" in which case foo is
# bound to $2.
arg_or_default() {
  echo eval "[ x\"\$1\" = x\"-$1\" ] && $1=\"\$2\" && shift 2;
      [ -z \"\$$1\" ] && $1=\"$2\""
}

# Generates a small snippet of code to take a single argument out of our
# parameter list.  If it's not present, prompt the user and accept a
# blank input as if the users chose the default specified as $2.
arg_or_prompt() {
  echo eval "$1=\"\$1\";
      [ -n \"\$$1\" ] && shift ;
      [ -z \"\$$1\" ] && read -p \"$1 [$2]: \" $1 ;
      [ -z \"\$$1\" ] && $1=\"$2\";"
}

# Requires a key in a csv list of key value pairs
#  $1 - comma separated list of keys and values
#  $2 - required key
# If the key is not found in the argument list, then prompt the user
# for a value for key, and return $key,$value appended to $1
require() {
  local value
  local args=$1
  local key=$2
  if [ -z "$args" -o -n "${args##*$2*}" ] ; then
    read -p "$key: " value
    if [ -n "$args" ] ; then
      args="$args,"
    fi
    args="$args$key,$value"
  fi
  echo "$args"
}

# Removes the indexes output by the --fixed option of dbus-send
stripindexes() {
  sed -e 's/^\/[[:digit:]]\+\///' -e 's/[^[:space:]]*/\0:/' -e 's/^/  /'
}

# Prints values for dbus-send --fixed output lines whose keys match
# the first argument.  Call it with 'Key' and it will take input like
#  /4/Key/0 value value
#  /5/SomethingElse/0 something else
# and write
#  value value
extract_dbus_match() {
  local argument=$1
  sed -r -n -e "s_^/[[:digit:]]+/$argument/\S+\s+__p"
}

# Invokes a DBus method on a DBus object.
dbus_call() {
  local dest="$1"
  local object="$2"
  local method="$3"
  shift 3

  dbus-send --system --print-reply --fixed --dest="${dest}" \
    "${object}" "${method}" "$@"
}

# Gets a DBus property of an interface of a DBus object.
dbus_property() {
  local dest="$1"
  local object="$2"
  local interface="$3"
  local property="$4"

  dbus_call "${dest}" "${object}" org.freedesktop.DBus.Properties.Get \
    "string:${interface}" "string:${property}"
}

# Gets all DBus properties of an interface of a DBus object.
dbus_properties() {
  local dest="$1"
  local object="$2"
  local interface="$3"

  dbus_call "${dest}" "${object}" org.freedesktop.DBus.Properties.GetAll \
    "string:${interface}"
}

# Unpacks output by the --fixed option of dbus-send into key-value pairs.
#
# e.g. The following code
#
#     echo "
#     /0 value1
#     /1 value2
#     " | unpack_tuple key1 key2
#
#  will output
#
#     key1: value1
#     key2: value2
#
unpack_tuple() {
  local cmd='sed'
  local argidx=0
  while test $# != 0; do
    # Grab a variable name
    local varname=$1
    shift

    # Generate an expression that turns the current index into that
    # variable name, and append it.
    cmd="$cmd -e s/^\\/${argidx}/$varname:/"
    argidx=$((argidx+1))
  done
  $cmd
}

# Formats dictionary output by the --fixed option of dbus-send into
# key-value pairs.
#
# e.g. The following code
#
#     echo "
#     /0/key1 value1
#     /1/key2/0 value2a
#     /1/key2/1 value2b
#     " | format_dbus_dict
#
#  will output
#
#     key1: value1
#     key2: value2a, value2b
#
format_dbus_dict() {
  awk 'BEGIN {
    entry_pattern = "/([0-9]+)/([^ /]+)(/[0-9]+)?"
    num_entries = 0
  }
  $0 ~ entry_pattern {
    entry_value = substr($0, length($1) + 2)
    split($1, entry_tokens, "/")
    entry_index = entry_tokens[2]
    if (entry_keys[entry_index] == "") {
      entry_indices[num_entries++] = entry_index
      entry_keys[entry_index] = entry_tokens[3]
      entry_values[entry_index] = entry_value
    } else {
      entry_values[entry_index] = entry_values[entry_index] ", " entry_value
    }
  }
  END {
    for (i = 0; i < num_entries; ++i) {
      entry_index = entry_indices[i]
      print entry_keys[entry_index] ": " entry_values[entry_index]
    }
  }'
}

# Indents non-empty lines with two spaces per indent level.
indent() {
  local level="$1"
  local space

  [ -n "${level}" ] || level=1
  space=$(printf "%${level}s%${level}s" ' ' ' ')
  sed -E "s/^(.+)/${space}\1/"
}
