#!/bin/bash
#
# Copyright (c) 2017 Omnissa, LLC. All rights reserved.
# This product is protected by copyright and intellectual property laws in the
# United States and other countries as well as by international treaties.
# -- Omnissa Public
#
# This script manages the Omnissa Horizon Client (New Version)
#

libpath="/usr/lib/omnissa"
binPath="/usr/lib/omnissa/horizon"
libtsdrClient="$libpath/horizon/vdpService/libtsdrClient.so"
pid_self=$$

# Updated to point to oneClient bundle directory
binFile="horizon-client-next-bundle/horizon-client-next"

# Get the executed user
user=
if [[ $USER = "" ]]; then
   if [ "`type -t 'whomai' 2>/dev/null`" = 'file' ]; then
      user=`whoami`
   fi
else
   user=$USER
fi

# Get the home path
homePath=
if [[ $HOME = "" ]]; then
   homePath="/home/$user"
else
   homePath=$HOME
fi


# Input argument from stdin
stdin_arg=

# We use x11 lib in client, so cannot use wayland now
export GDK_BACKEND=x11

# Add path to LD_LIBRARY_PATH
vm_append_to_library_path() {
   local ldBasePath
   if [ ! -z "$LD_LIBRARY_PATH" ]; then
      ldBasePath="$LD_LIBRARY_PATH"
   fi
   export LD_LIBRARY_PATH="$1:""$ldBasePath"
}

# Function to export environment variable
vm_append_export() {
   local key=$1
   local val=$2

   export $key"=""$val"
}

# Export environment variable if libtsdrClient.so exists.
vm_folder_redirection_config() {
   if [ -x $libtsdrClient ]; then
      vm_append_export "ENABLE_FOLDER_REDIRECTION" "TRUE"
   fi
}

is_glibcxx_compatible() {
   local result="true"
   local cpp_elf_files=(
      "/usr/lib/libclientSdkCPrimitive.so" \
      "/usr/lib/libpcoip_client.so" \
      "/usr/lib/pcoip/vchan_plugins/librdpvcbridge.so" \
      "/usr/lib/pcoip/vchan_plugins/libvdpservice.so" \
      "/usr/lib/pcoip/vchan_plugins/libviewMMDevRedir.so" \
      "/usr/lib/omnissa/libatkmm-1.6.so.1" \
      "/usr/lib/omnissa/libcairomm-1.0.so.1" \
      "/usr/lib/omnissa/libcrtbora.so" \
      "/usr/lib/omnissa/libgdkmm-3.0.so.1" \
      "/usr/lib/omnissa/libgiomm-2.4.so.1" \
      "/usr/lib/omnissa/libglibmm-2.4.so.1" \
      "/usr/lib/omnissa/libgtkmm-3.0.so.1" \
      "/usr/lib/omnissa/libpangomm-1.4.so.1" \
      "/usr/lib/omnissa/librtavCliLib.so" \
      "/usr/lib/omnissa/libsigc-2.0.so.0" \
      "/usr/lib/omnissa/libudpProxyLib.so" \
      "/usr/lib/omnissa/liburlFilterPlugin.so" \
      "/usr/lib/omnissa/libomnissabase.so" \
      "/usr/lib/omnissa/libHarfBuzzSharp.so" \
      "/usr/lib/omnissa/libSkiaSharp.so" \
      "/usr/lib/omnissa/horizon/bin/horizon-urlFilter" \
      "/usr/lib/omnissa/horizon/bin/horizon-client-next" \
      "/usr/lib/omnissa/horizon/client/horizon-protocol" \
      "/usr/lib/omnissa/horizon/integratedPrinting/prlinuxcupsppd" \
      "/usr/lib/omnissa/horizon/integratedPrinting/horizon-print-redir-client" \
      "/usr/lib/omnissa/horizon/lib/libclientSdkCPrimitive.so" \
      "/usr/lib/omnissa/horizon/usb/libhorizon-view-usbd.so" \
      "/usr/lib/omnissa/horizon/vdpService/libhtml5Client.so" \
      "/usr/lib/omnissa/horizon/vdpService/libmksvchanclient.so" \
      "/usr/lib/omnissa/horizon/vdpService/librdeSvc.so" \
      "/usr/lib/omnissa/horizon/vdpService/libtsdrClient.so" \
      "/usr/lib/omnissa/horizon/vdpService/libtsmmrClient.so" \
      "/usr/lib/omnissa/horizon/vdpService/libusbRedirectionClient.so" \
      "/usr/lib/omnissa/horizon/vdpService/libprvdpplugin.so" \
   )

   for elf_filepath in ${cpp_elf_files[@]}; do
      if [[ -e $elf_filepath ]]; then
         output=$(ldd -r "$elf_filepath" 2>&1)
         if [[ $output == *"not found"* ]] || [[ $output == *"undefined symbol"* ]]; then
            result="false"
            break
         fi
      fi
   done

   echo $result
}


vm_run() {
   # Check if os cpp standard library is compatible
   vm_append_to_library_path "$libpath"
   if [ $(is_glibcxx_compatible) == "false" ]; then
      vm_append_to_library_path "$libpath"/gcc
   fi

   # Disable DRI3 for libva
   vm_append_export "LIBVA_DRI3_DISABLE" "1"

   # Config tsdr feature
   vm_folder_redirection_config

   if [ -e "$binPath/bin/$binFile" ]; then
      if [ ! $stdin_arg ]; then
         "$binPath/bin/$binFile" "$@"
      else
         echo $stdin_arg | "$binPath/bin/$binFile" "$@"
      fi
   else
      echo "File not exists:/usr/lib/omnissa/horizon/bin/$binFile"
      exit 1
   fi

   return "$?"
}


# Read stdin if it exists and there is "-p -" in command parameters
if [ ! -t 0 ] && [[ "$@" =~ "-p -" ]]; then
   read -t 1 stdin_arg
fi

# To execute the horizon-protocol binary
export PATH="$binPath/client:$PATH"

vm_run "$@"
