:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
: Copyright(c) 2013 Intel Corporation.
: All rights reserved.
: Redistribution. Redistribution and use in binary form, without modification,
: are permitted provided that the following conditions are met:
: 1. Redistributions must reproduce the above copyright notice and the
: following disclaimer in the documentation and/or other materials provided
: with the distribution.
: 2. Neither the name of Intel Corporation nor the names of its suppliers may
: be used to endorse or promote products derived from this software without
: specific prior written permission.
: 3. No reverse engineering, de-compilation, or disassembly of this software
: is permitted. Limited patent license. Intel Corporation grants a world-wide,
: royalty-free, non-exclusive license under patents it now or hereafter owns
: or controls to make, have made, use, import, offer to sell and sell
: ("Utilize") this software, but solely to the extent that any such patent
: is necessary to Utilize the software alone. The patent license shall not
: apply to any combinations which include this software. No hardware per se
: is licensed hereunder.
: DISCLAIMER.
: THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
: AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
: IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
: ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
: LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
: CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
: SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
: INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
: CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
: ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
: POSSIBILITY OF SUCH DAMAGE.
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::


@echo off

set reg_location=HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products
set extract_folder=%TEMP%\intel\HAXM\6.2.0\silent
set base_dir=%~dp0
set install_log=haxm_silent_run.log

set mem_type=1
set mem_size=0
set action=install
set installed_haxm_version=na
set installed_product_id=na
set haxm_install=0
set haxm_reg_location=na
set log_parameter=e
set reg_memory_loc=HKLM\Software\HAXM\HAXM

reg query "%reg_location%" > nul 2>&1
if errorlevel 1 goto get_haxm_version

for /f "tokens=*" %%a in ('reg query "%reg_location%" ') do (
  reg query %%a /s /v DisplayName | findstr /c:"Hardware Accelerated Execution Manager" > nul && set haxm_reg_location=%%a && set haxm_install=1
)

:get_haxm_version
if [%haxm_install%]==[1] (
   for /f "skip=1 tokens=3 delims= " %%b in ('reg query "%haxm_reg_location%" /s /v DisplayVersion ' ) do (
      set installed_haxm_version=%%b
      goto find_product_id
   )

:find_product_id
   for /f "skip=1 tokens=4 delims= " %%c in ('reg query "%haxm_reg_location%" /s /v UninstallString ') do (
      set installed_product_id=%%c
      goto exit_product_id
   )
)
:exit_product_id

if [%HAXM_install%]==[1] (
  set installed_product_id=%installed_product_id:~3,36%
)

:parse_input
    if [%1]==[] goto %action%
    if [%1]==[-m] (
        if [%2]==[] goto need_more_param
        set action=install
        set mem_type=2
        set mem_size=%2
        shift
        shift
        goto parse_input)
    if [%1]==[-log] (
        if [%2]==[] goto need_more_param
        set install_log=%2
        shift
        shift
        goto parse_input)
    if [%1]==[-ld] (
        if [%2]==[] goto need_more_param
        set install_log=%2
        set log_parameter=*vx
        shift
        shift
        goto parse_input)
    if [%1]==[-u] (
        set action=uninstall
        shift
        goto parse_input)
    if [%1]==[-c] (
        set action=check
        shift
        goto parse_input)
    if [%1]==[-v] (
        set action=version
        shift
        goto parse_input)
    if [%1]==[-h] (
        set action=help
        shift
        goto parse_input)
    goto invalid_param

:install

    call :check_log
    if errorlevel 1 exit /b 1

    call :clean_extract_folder
    if errorlevel 1 exit /b 1

    if %PROCESSOR_ARCHITECTURE%==AMD64 (
        set msi_name=hax64.msi
    )  else (
        set msi_name=hax.msi
    )

    if exist %TEMP%\silent_reboot_flag del %TEMP%\silent_reboot_flag

    for %%a in ("%install_log%") do (
        set full_name=%%~fa
    )
    set install_log=%full_name%

    intelhaxm-android.exe -f %extract_folder% -a /qn /l%log_parameter% "%install_log%" MEMSIZETYPE=%mem_type% CUSTOMMEMSIZE=%mem_size% NOTCHECKVTENABLE=1

    if errorlevel 1 (
        if not %installed_haxm_version%==na (
            echo Failed to update Intel HAXM. For details, please check the installation log: "%install_log%"
            if %errorlevel%==5 (
              echo Failed to update Intel HAXM, because user selected NO in UAC window. >> "%install_log%"
            )
        ) else (
            echo Failed to install Intel HAXM. For details, please check the installation log: "%install_log%"
            if %errorlevel%==5 (
              echo Failed to install Intel HAXM, because user selected NO in UAC window. >> "%install_log%"
            )
        )
        exit /b 1
    )   else (
        if not %installed_haxm_version%==na (
            echo Intel HAXM updated successfully!
            echo Intel HAXM updated successfully! >> "%install_log%"
        )  else (
            echo Intel HAXM installed successfully!
            echo Intel HAXM installed successfully! >> "%install_log%"
        )
        if exist %TEMP%\silent_reboot_flag  (
                echo Please reboot your machine!
                echo Please reboot your machine!  >> "%install_log%"
                del %TEMP%\silent_reboot_flag
                exit /b 2
        )
        exit /b 0
    )

:uninstall
    if %installed_haxm_version%==na (
        echo Intel HAXM is not installed!
        exit /b 0
    )

    call :check_log
    if errorlevel 1 exit /b 1

    for %%a in ("%install_log%") do (
        set full_name=%%~fa
    )
    set install_log=%full_name%

    intelhaxm-android.exe -a /x  /q /l%log_parameter% "%install_log%"

    if errorlevel 1 (
        echo Failed to uninstall Intel HAXM! For details, please check the installation log "%install_log%"!
        if %errorlevel%==5 (
          echo Failed to uninstall Intel HAXM, because user selected NO in UAC window. >> "%install_log%"
        )
        exit /b 1
    )

    call :clean_extract_folder
    if errorlevel 1 exit /b 1

    echo Intel HAXM uninstalled successfully!
    echo Intel HAXM uninstalled successfully! >> "%install_log%"
    exit /b 0

:check

    if not exist haxm_check.exe (
        echo Failed to find haxm_check.exe
        exit /b 1
    )

    haxm_check.exe
    set ret=%errorlevel%

    exit /b %ret%

:version
    if %installed_haxm_version%==na (
        exit /b 1
    )
    echo %installed_haxm_version%
    exit /b 0

:help
    echo Usage:
    echo silent_install.bat -v: print out Intel HAXM version
    echo silent_install.bat -h: print out help information
    echo silent_install.bat -c: check the platform's VT capability
    echo silent_install.bat -log logfile: install Intel HAXM with log file output
    echo silent_install.bat: install Intel HAXM
    echo silent_install.bat -u: uninstall Intel HAXM
    exit /b 0
:invalid_param
    echo invalid_param for %1
    exit /b 1
:need_more_param
    echo need more param for %1
    exit /b 1

:clean_extract_folder
    if exist %extract_folder% rd /s /q %extract_folder% > nul 2>&1

    if exist %extract_folder% (
        echo Failed to cleanup temporary folder %extract_folder%
        exit /b 1
    )

    if not exist intelhaxm-android.exe (
        echo intelhaxm-android.exe is missing.
        exit /b 1
    )

    goto :eof

:check_log
    if exist "%install_log%" del "%install_log%"
    if exist "%install_log%" (
        echo Cannot write to: "%install_log%"
        echo Is it read-only?
        exit /b 1
    )
    echo HAXM installer log started > "%install_log%"
    if not exist "%install_log%" (
        echo Invalid log path: "%install_log%"
        exit /b 1
    )
    exit /b 0
