#!/bin/bash # Copyright (C) 2016 Deepin, Inc. # # Author: Li LongYu # Peng Hao WINEPREFIX="$HOME/.deepinwine/@public_bottle_name@" APPDIR="/opt/deepinwine/apps/@public_bottle_name@" APPVER="@deb_version_string@" APPTAR="files.7z" BOTTLENAME="" WINE_CMD="deepin-wine" LOG_FILE=$0 CREATE_BOTTLE="" SHELL_DIR=$(dirname $0) SHELL_DIR=$(realpath "$SHELL_DIR") if [ $SPECIFY_SHELL_DIR ]; then SHELL_DIR=$SPECIFY_SHELL_DIR fi if [ $APPRUN_CMD ]; then WINE_CMD=$APPRUN_CMD fi if [ $SPECIFY_SHELL_DIR ]; then SHELL_DIR=$SPECIFY_SHELL_DIR fi _DeleteRegistry() { env WINEPREFIX="$WINEPREFIX" $WINE_CMD reg DELETE "$1" /f &> /dev/null } init_log_file() { if [ ! -d "$DEBUG_LOG" ];then return fi LOG_DIR=$(realpath $DEBUG_LOG) if [ -d "$LOG_DIR" ];then LOG_FILE="${LOG_DIR}/${LOG_FILE##*/}.log" echo "" > "$LOG_FILE" debug_log "LOG_FILE=$LOG_FILE" fi } debug_log_to_file() { if [ -d "$DEBUG_LOG" ];then echo -e "${1}" >> "$LOG_FILE" fi } debug_log() { echo "${1}" } HelpApp() { echo " Extra Commands:" echo " -r/--reset Reset app to fix errors" echo " -e/--remove Remove deployed app files" echo " -h/--help Show program help info" } FixLink() { if [ -d ${WINEPREFIX} ]; then CUR_DIR=$PWD cd "${WINEPREFIX}/dosdevices" rm c: z: y: ln -s -f ../drive_c c: ln -s -f / z: ln -s -f $HOME y: cd $CUR_DIR ls -l "${WINEPREFIX}/dosdevices" fi } DisableWrite() { if [ -d "${1}" ]; then chmod +w "${1}" rm -rf "${1}" fi mkdir "${1}" chmod -w "${1}" } is_autostart() { AUTOSTART="/opt/deepinwine/tools/autostart" if [ -f "$AUTOSTART.all" ]&&[ -f "/opt/apps/$1/files/run.sh" ];then return 0 fi if [ -f $AUTOSTART ];then grep -c "$1" $AUTOSTART > /dev/null return $? fi return 1 } #arg 1: windows process file path #arg 2-*: windows process args CallProcess() { #get file full path path="$1" path=$(echo ${path/c:/${WINEPREFIX}/drive_c}) path=$(echo ${path//\\/\/}) #kill bloack process is_autostart $DEB_PACKAGE_NAME autostart=$? if [ $autostart -ne 0 ];then $SHELL_DIR/kill.sh "$BOTTLENAME" block fi #change current dir to excute path path=$(dirname "$path") cd "$path" pwd #Set default mime type if [ -n "$MIME_TYPE" ]; then xdg-mime default "$DEB_PACKAGE_NAME".desktop "$MIME_TYPE" fi debug_log_to_file "Starting process $* ..." export ATTACH_FILE_DIALOG=1 env WINEPREFIX="$WINEPREFIX" $WINE_CMD "$@" & #start autobottle if [ $autostart -eq 0 ];then $SHELL_DIR/autostart_wine.sh $DEB_PACKAGE_NAME fi } CallZhuMu() { #change current dir to excute path path=$(dirname "$path") cd "$path" pwd #Set default mime type if [ -n "$MIME_TYPE" ]; then xdg-mime default "$DEB_PACKAGE_NAME".desktop "$MIME_TYPE" fi debug_log_to_file "Starting process $* ..." if [ -n "$2" ];then env WINEPREFIX="$WINEPREFIX" $WINE_CMD "$1" "--url=$2" & else env WINEPREFIX="$WINEPREFIX" $WINE_CMD "$1" & fi } CallQQGame() { debug_log "run $1" $SHELL_DIR/kill.sh qqgame block env WINEPREFIX="$WINEPREFIX" $WINE_CMD "$1" & } CallQQ() { if [ ! -f "$WINEPREFIX/../.QQ_run" ]; then debug_log "first run time" $SHELL_DIR/add_hotkeys $SHELL_DIR/fontconfig touch "$WINEPREFIX/../.QQ_run" fi DisableWrite "${WINEPREFIX}/drive_c/Program Files/Tencent/QQ/Bin/QQLiveMPlayer" DisableWrite "${WINEPREFIX}/drive_c/Program Files/Tencent/QQ/Bin/QQLiveMPlayer1" DisableWrite "${WINEPREFIX}/drive_c/Program Files/Tencent/QzoneMusic" DisableWrite "${WINEPREFIX}/drive_c/Program Files/Tencent/QQBrowser" DisableWrite "${WINEPREFIX}/drive_c/Program Files/Common Files/Tencent/QQBrowser" DisableWrite "${WINEPREFIX}/drive_c/users/Public/Application Data/Tencent/QQBrowserBin" DisableWrite "${WINEPREFIX}/drive_c/users/Public/Application Data/Tencent/QQBrowserDefault" DisableWrite "${WINEPREFIX}/drive_c/users/${USER}/Application Data/Tencent/QQBrowserDefault" DisableWrite "${WINEPREFIX}/drive_c/users/Public/Application Data/Tencent/QQPCMgr" DisableWrite "${WINEPREFIX}/drive_c/Program Files/Common Files/Tencent/QQPCMgr" DisableWrite "${WINEPREFIX}/drive_c/Program Files/Common Files/Tencent/HuaYang" DisableWrite "${WINEPREFIX}/drive_c/users/${USER}/Application Data/Tencent/HuaYang" #Support use native file dialog export ATTACH_FILE_DIALOG=1 CallProcess "$@" } CallTIM() { if [ ! -f "$WINEPREFIX/../.QQ_run" ]; then debug_log "first run time" $SHELL_DIR/add_hotkeys $SHELL_DIR/fontconfig # If the bottle not exists, run reg may cost lots of times # So create the bottle befor run reg env WINEPREFIX="$WINEPREFIX" $WINE_CMD uninstaller --list touch $WINEPREFIX/../.QQ_run fi #Support use native file dialog export ATTACH_FILE_DIALOG=1 CallProcess "$@" #disable Tencent MiniBrowser _DeleteRegistry "HKCU\\Software\\Tencent\\MiniBrowser" } CallWeChat() { debug_log "Disable auto update" _DeleteRegistry "HKCU\\Software\\Tencent\\WeChat" "UpdateFailCnt" _DeleteRegistry "HKCU\\Software\\Tencent\\WeChat" "NeedUpdateType" rm "${WINEPREFIX}/drive_c/users/${USER}/Application Data/Tencent/WeChat/All Users/config/configEx.ini" export DISABLE_RENDER_CLIPBOARD=1 export ATTACH_FILE_DIALOG=1 CallProcess "$@" } CallWangWang() { chmod 700 "$WINEPREFIX/drive_c/Program Files/AliWangWang/9.12.10C/wwbizsrv.exe" chmod 700 "$WINEPREFIX/drive_c/Program Files/Alibaba/wwbizsrv/wwbizsrv.exe" if [ $# = 3 ] && [ -z "$3" ];then EXEC_PATH="c:/Program Files/AliWangWang/9.12.10C/WWCmd.exe" export ATTACH_FILE_DIALOG=1 env WINEPREFIX="$WINEPREFIX" $WINE_CMD "$EXEC_PATH" "$2" & else CallProcess "$@" fi } CallWXWork() { if [ -d "${WINEPREFIX}/drive_c/users/${USER}/Application Data/Tencent/WXWork/Update" ]; then rm -rf "${WINEPREFIX}/drive_c/users/${USER}/Application Data/Tencent/WXWork/Update" fi if [ -d "${WINEPREFIX}/drive_c/users/${USER}/Application Data/Tencent/WXWork/upgrade" ]; then rm -rf "${WINEPREFIX}/drive_c/users/${USER}/Application Data/Tencent/WXWork/upgrade" fi #Support use native file dialog export ATTACH_FILE_DIALOG=1 CallProcess "$@" } CallDingTalk() { debug_log "run $1" $SHELL_DIR/kill.sh DingTalk block export ATTACH_FILE_DIALOG=1 CallProcess "$@" } urldecode() { : "${*//+/ }"; echo -e "${_//%/\\x}"; } CallMeiTuXiuXiu() { #set -- "$1" "${2#file://*}" local path=$(urldecode "$2") path=${path/file:\/\//} set -- "$1" $path CallProcess "$@" } CallFastReadPDF() { #set -- "$1" "${2#file://*}" local path=$(urldecode "$2") path=${path/file:\/\//} set -- "$1" $path CallProcess "$@" } CallEvernote() { local path=$(urldecode "$2") path=${path/file:\/\//} set -- "$1" $path CallProcess "$@" } CallTencentVideo() { if [ -f "${WINEPREFIX}/drive_c/Program Files/Tencent/QQLive/Upgrade.dll" ]; then rm -rf "${WINEPREFIX}/drive_c/Program Files/Tencent/QQLive/Upgrade.dll" fi CallProcess "$@" } CallFoxmail() { sed -i '/LogPixels/d' ${WINEPREFIX}/user.reg CallProcess "$@" } CallTHS() { $SHELL_DIR/kill.sh ths block debug_log "Start run $1" #get file full path path="$1" path=$(echo ${path/c:/${WINEPREFIX}/drive_c}) path=$(echo ${path//\\/\/}) #kill bloack process name="${path##*/}" $SHELL_DIR/kill.sh "$name" block #change current dir to excute path path=$(dirname "$path") cd "$path" pwd #Set default mime type if [ -n "$MIME_TYPE" ]; then xdg-mime default "$DEB_PACKAGE_NAME".desktop "$MIME_TYPE" fi env WINEPREFIX="$WINEPREFIX" $WINE_CMD "$@" & } CallQQGameV2() { debug_log "run $1" $SHELL_DIR/kill.sh QQMicroGameBox block env WINEPREFIX="$WINEPREFIX" $WINE_CMD "$1" -action:force_download -appid:${2} -pid:8 -bin_version:1.1.2.4 -loginuin: & } CallEBS250() { CallProcess "$@" } CallPsCs6() { #get file full path path="$1" path=$(echo ${path/c:/${WINEPREFIX}/drive_c}) path=$(echo ${path//\\/\/}) #kill bloack process name="${path##*/}" $SHELL_DIR/kill.sh "$name" block #change current dir to excute path path=$(dirname "$path") cd "$path" pwd #Set default mime type if [ -n "$MIME_TYPE" ]; then xdg-mime default "$DEB_PACKAGE_NAME".desktop "$MIME_TYPE" fi debug_log_to_file "Starting process $* ..." env WINEPREFIX="$WINEPREFIX" $WINE_CMD "$@" & } #arg 1: exec file path #arg 2: autostart ,or exec arg 1 #arg 3: exec arg 2 CallApp() { FixLink debug_log "CallApp $BOTTLENAME $*" case $BOTTLENAME in "Deepin-WangWang") CallWangWang "$@" ;; "Deepin-ZhuMu") CallZhuMu "$@" ;; "Deepin-QQ") CallQQ "$@" ;; "Deepin-TIM") CallTIM "$@" ;; "Deepin-QQGame"*) CallQQGame "$@" ;; "Deepin-ATM") CallATM "$@" ;; "Deepin-WeChat") CallWeChat "$@" ;; "Deepin-WXWork") CallWXWork "$@" ;; "Deepin-Dding") CallDingTalk "$@" ;; "Deepin-MTXX") CallMeiTuXiuXiu "$@" ;; "Deepin-FastReadPDF") CallFastReadPDF "$@" ;; "Deepin-Evernote") CallEvernote "$@" ;; "Deepin-TencentVideo") CallTencentVideo "$@" ;; "Deepin-Foxmail") CallFoxmail "$@" ;; "Deepin-THS") CallTHS "$@" ;; "Deepin-QQHlddz") CallQQGameV2 "$1" 363 ;; "Deepin-QQBydr") CallQQGameV2 "$1" 1104632801 ;; "Deepin-QQMnsj") CallQQGameV2 "$1" 1105856612 ;; "Deepin-QQSszb") CallQQGameV2 "$1" 1105640244 ;; "Deepin-CS6") CallPsCs6 "$@" ;; "Deepin-EBS250") CallEBS250 "$1" ;; *) CallProcess "$@" ;; esac } ExtractApp() { $SHELL_DIR/deepin-wine-banner unpack & mkdir -p "$1" 7z x "$APPDIR/$APPTAR" -o"$1" mv "$1/drive_c/users/@current_user@" "$1/drive_c/users/$USER" sed -i "s#@current_user@#$USER#" $1/*.reg FixLink $SHELL_DIR/deepin-wine-banner unpacked } DeployApp() { ExtractApp "$WINEPREFIX" echo "$APPVER" > "$WINEPREFIX/PACKAGE_VERSION" } RemoveApp() { rm -rf "$WINEPREFIX" } ResetApp() { debug_log "Reset $PACKAGENAME....." read -p "* Are you sure?(Y/N)" ANSWER if [ "$ANSWER" = "Y" -o "$ANSWER" = "y" -o -z "$ANSWER" ]; then EvacuateApp DeployApp CallApp fi } UpdateApp() { if [ -f "$WINEPREFIX/PACKAGE_VERSION" ] && [ "$(cat "$WINEPREFIX/PACKAGE_VERSION")" = "$APPVER" ]; then return fi if [ -d "${WINEPREFIX}.tmpdir" ]; then rm -rf "${WINEPREFIX}.tmpdir" fi case $BOTTLENAME in "Deepin-Intelligent" | "Deepin-QQ" | "Deepin-TIM" | "Deepin-WeChat" | "Deepin-WXWork" | "Deepin-Dding") rm -rf "$WINEPREFIX" DeployApp return ;; esac ExtractApp "${WINEPREFIX}.tmpdir" $SHELL_DIR/updater -s "${WINEPREFIX}.tmpdir" -c "${WINEPREFIX}" -v rm -rf "${WINEPREFIX}.tmpdir" echo "$APPVER" > "$WINEPREFIX/PACKAGE_VERSION" } RunApp() { $SHELL_DIR/deepin-wine-banner if [[ $? != 0 ]]; then debug_log "检测到 deepin-wine-banner 运行, exit 1" exit 1 fi $SHELL_DIR/deepin-wine-banner start & if [ -d "$WINEPREFIX" ]; then UpdateApp else DeployApp fi CallApp "$@" } CreateBottle() { CREATE_BOTTLE="1" if [ -d "$WINEPREFIX" ]; then UpdateApp else DeployApp fi } init_log_file # Check if some visual feedback is possible if command -v zenity >/dev/null 2>&1; then progressbar() { WINDOWID="" zenity --progress --title="$1" --text="$2" --pulsate --width=400 --auto-close --no-cancel || WINDOWID="" zenity --progress --title="$1" --text="$2" --pulsate --width=400 --auto-close } else progressbar() { cat - } fi if [ -z $1 ] || [ -z $2 ] || [ -z "$3" ]; then debug_log "Invalid params" exit 0 fi BOTTLENAME="$1" WINEPREFIX="$HOME/.deepinwine/$1" APPDIR="/opt/apps/${DEB_PACKAGE_NAME}/files" if [ -f "$APPDIR/files.md5sum" ];then APPVER="$(cat $APPDIR/files.md5sum)" else APPVER="$2" fi debug_log "Run $*" if [ -z "$WINE_WMCLASS" ]; then export WINE_WMCLASS="$DEB_PACKAGE_NAME" fi if [ -z "$4" ]; then RunApp "$3" exit 0 fi case $4 in "-r" | "--reset") ResetApp ;; "-cb" | "--create") CreateBottle ;; "-e" | "--remove") RemoveApp ;; "-u" | "--uri") RunApp "$3" "$5" "$6" ;; "-h" | "--help") HelpApp ;; *) echo "Invalid option: $4" echo "Use -h|--help to get help" exit 1 ;; esac exit 0