@echo off
setlocal DisableDelayedExpansion
rem ** At this point the delayedExpansion should be disabled
rem ** otherwise an exclamation mark in %* will be interpreted as special command
SET SUM_CMD_ARGS=%*

SET SUM_ROOT="%~dp0"

SET DRIVE="%~d0"

rem remove trailing back slash
IF "!SUM_ROOT:~-1!"=="\" SET SUM_ROOT=!SUM_ROOT:~0,-1!

SET dstpath="!SUM_ROOT!"

setlocal EnableDelayedExpansion

SET REMOTE=0
SET SERVICERUNNING=0
SET ERRORCODE=0

rem Windows server 2008 and earlier are no longer supported starting SUM 8.0
ver | find "Version 5"
if %errorlevel% EQU 0 (
	echo Smart Update Manager 8.0 supports Windows Server 2008 R2 and later. Use HP SUM 7.6 for older Windows versions.
	set ERRORCODE=-4
	pause
	goto :Exit
)

ver | find "Version 6.0"
if %errorlevel% EQU 0 (
echo Smart Update Manager 8.0 supports Windows Server 2008 R2 and later. Use HP SUM 7.6 for older Windows versions.
	set ERRORCODE=-4
	pause
	goto :Exit
)

IF "!TMPDIR!"=="" (
	SET TMPDIR=%temp%
) ELSE (
	echo TMPDIR is set to !TMPDIR!
)


rem Check if any of the following switches were passed as arguments.  
rem They will not yet require a copy of the SUM Files if remote.
rem check for: /v, /version (version information)
rem check for: /h, /?, /help (help)

rem check for silent as it is a different mode for SUM
rem check for: /s, /silent

rem Initialize
SET INPUTFILEPATH=
SET USELOCATION=0
SET LEGACYMODE=0
SET ERRORCODE=0
SET VERSION=0
SET HELP=0

:loop
IF NOT "%~1"=="" (

rem Get if silent flag is set. Treat it exactly like express_install.
    IF "%~1"=="/s" SET LEGACYMODE=1
    IF "%~1"=="/silent" SET LEGACYMODE=1

rem Get if express_install flag is set. Treat it exactly like silent mode.
    IF "%~1"=="/express_install" SET LEGACYMODE=1

rem Handle working directory
    IF "%~1"=="/use_location" (
        SET USELOCATION=1
        SHIFT
    )

rem Handle input file
    IF "%~1"=="/inputfile" (
        SET INPUTFILEPATH="%~2"
        SHIFT
    )
rem handle logdir	
	IF "%~1"=="/logdir" (
        SHIFT
    )
rem Handle version
    IF "%~1"=="/v" SET VERSION=1
    IF "%~1"=="/version" SET VERSION=1

rem Handle help
    IF "%~1"=="/h" SET HELP=1
    IF "%~1"=="/help" SET HELP=1
    IF "%~1"=="/?" SET HELP=1

    SHIFT
    GOTO :loop
)

IF !VERSION! NEQ 0 (
	goto :run
)
IF !HELP! NEQ 0 (
	goto :run
)

rem check whether it is Virtual mapped Drive 
rem updates method to handle different locale. 
FOR /F "tokens=*" %%A IN ('"fsutil fsinfo drivetype"" "!DRIVE!""') do (
 	SET drvchk=%%A

	rem check if drive contains cd-rom (case insensitve)
	if /i NOT "!drvchk!"=="!drvchk:CD-ROM=!" (
            echo %~d0 is a CD-ROM Drive
            set REMOTE=1
            set dstpath="%LOCALAPPDATA%\localsum"
            goto :run
      )
)

rem check whether it is N/W mapped Drive or UNC path
rem SUM_ROOT will contain eg: "Z:\packages" or "\\", hence taking the 2nd and 3rd Character to match it with the output of net use.
IF "!SUM_ROOT:~1,2!"=="\\" (
    echo !SUM_ROOT! is a remote UNC path
    set REMOTE=1
    set dstpath="%LOCALAPPDATA%\localsum"
	goto :run
) ELSE (
    for /f "skip=6 tokens=2" %%d in ('net use') do (
        if /i "!SUM_ROOT:~1,2!"=="%%d" (
            echo !SUM_ROOT! is a Network Mapped Drive
            set REMOTE=1
            set dstpath="%LOCALAPPDATA%\localsum"
            goto :run
        )
    )
)

:run
setlocal DisableDelayedExpansion
set newcmdcmdline="%cmdcmdline:"=-%"
set withincmd=1
echo %newcmdcmdline% | find /i "cmd /c --%~dpf0%-"
if %errorlevel% EQU 0 set withincmd=0
rem if %withincmd% EQU 0 echo This batch-file: %~dpf0 was executed directly (from Windows Explorer, ...).
rem if %withincmd% EQU 1 echo This batch-file: %~dpf0 was executed from within a Command Prompt
setlocal EnableDelayedExpansion
rem Select 32-bit or 64-bit
SET HostIs64Bit=%ProgramFiles(x86)%
IF "%HostIs64Bit%"=="" (
    set SUM_ARCH=x86
) ELSE (
    set SUM_ARCH=x64
)


rem If help or version commands were detected, then skip the copy and execute SUM


IF %REMOTE% EQU 0 GOTO :runsum


rem Check if there's an existing sum service running..
tasklist /FI "IMAGENAME eq sum_service_%SUM_ARCH%.exe" 2>NUL | find /I /N "sum_service_%SUM_ARCH%.exe" >NUL

IF %ERRORLEVEL% NEQ 0 (
	GOTO :copyfiles
) ELSE (
    SET SERVICERUNNING=1
	IF %LEGACYMODE% EQU 0 (
		GOTO :copyfiles
	) ELSE (
        rem ONLY if a silent switch is detected, do not allow running of sum again. 
        rem Otherwise, let it through as it could be interactive commands.
        echo An existing SUM session is detected.
        set ERRORCODE=-4
        goto :WrapUp
	)
)

	
:copyfiles
SET SUM_VERSION_EXIST=0
IF EXIST %SUM_ROOT%sum*_b*.txt (
	FOR /F "delims=" %%a IN ('dir /b !SUM_ROOT!\"sum*_b*.txt"') DO SET SUM_VERSION_FILE=!params!%%a
	IF NOT "!SUM_VERSION_FILE!"=="" (
		IF EXIST !dstpath!\!SUM_VERSION_FILE! (
			SET SUM_VERSION_EXIST=1
		) ELSE (
			rd /s /q !dstpath! 2> NUL
		)
	)
)

IF %SUM_VERSION_EXIST% EQU 0 (
	echo Copying SUM files from !SUM_ROOT! to !dstpath!
	IF NOT EXIST !dstpath! (        
        md !dstpath! 
        
        rem Check if the folder is now present.
        IF NOT EXIST !dstpath! (
            echo Could not create the temporary directory !dstpath!
            SET ERRORCODE=-4
            goto :WrapUp
        )
    )

    xcopy /s /y /i /q "!SUM_ROOT!\%SUM_ARCH%" "!dstpath!\%SUM_ARCH%" 2>NUL
    IF !ERRORLEVEL! NEQ 0 (
	    IF !SERVICERUNNING! EQU 0  (
			SET ERRORCODE=-4
			goto :WrapUp
		)
    )

    xcopy /s /y /i /q "!SUM_ROOT!\assets" "!dstpath!\assets"
    IF !ERRORLEVEL! NEQ 0 (
        SET ERRORCODE=-4
        goto :WrapUp
    )
   
    xcopy /s /y /i /q "!SUM_ROOT!\cygwin" "!dstpath!\cygwin"
    IF !ERRORLEVEL! NEQ 0 (
        SET ERRORCODE=-4
        goto :WrapUp
    )

    xcopy /y /i /q "!SUM_ROOT!masterdependency.xml" "!dstpath!\"
    IF !ERRORLEVEL! NEQ 0 (
        SET ERRORCODE=-4
        goto :WrapUp
    )

    xcopy /y /i /q "!SUM_ROOT!platformdependency.xml" "!dstpath!\"
    IF !ERRORLEVEL! NEQ 0 (
        SET ERRORCODE=-4
        goto :WrapUp
    )
	
	xcopy /y /i /q "!SUM_ROOT!gatherlogs.bat" "!dstpath!\"
    IF !ERRORLEVEL! NEQ 0 (
        SET ERRORCODE=-4
        goto :WrapUp
    )
	IF NOT "%SUM_VERSION_FILE%"=="" (
		xcopy /y /i /q "!SUM_ROOT!!SUM_VERSION_FILE!" "!dstpath!\"
	)

    IF EXIST "%INPUTFILEPATH%" xcopy /y /i /q "%INPUTFILEPATH%" "!dstpath!\"
    IF !ERRORLEVEL! NEQ 0 (
        SET ERRORCODE=-4
        goto :WrapUp
    )
)

    rem If working directory is not set, and it is a read-only then append use_location with the mount point path
    IF %LEGACYMODE% EQU 1 (
        IF %USELOCATION% NEQ 1 (
            SET "SUM_CMD_ARGS=!SUM_CMD_ARGS! /use_location "!SUM_ROOT!
        )
    )


:runsum
set SUM_BIN="!dstpath!\%SUM_ARCH%\sum_bin_%SUM_ARCH%.exe"

IF NOT EXIST %SUM_BIN% (
    @echo Unable to locate %SUM_BIN%
    IF %withincmd% EQU 0 (
        call :delay
    )
    set ERRORCODE=-4
    goto :Exit
)
	
rem Remove localsum folder if cleanup_onexit or cleanupall_onexit
SET REMOVE_LOCALPATH = 0
FOR %%a IN (%*) DO (
  IF /I "%%a"=="/cleanup_onexit" SET REMOVE_LOCALPATH=1
  IF /I "%%a"=="/cleanupall_onexit" SET REMOVE_LOCALPATH=1
)

%SUM_BIN% !SUM_CMD_ARGS!

set ERRORCODE=%ERRORLEVEL%

rem the acutal binary should have displayed an error
rem message.  We still want to delay to allow
rem people who started by clicking on the icon
rem a chance to see the message
:WrapUp
IF %ERRORCODE% NEQ 0 (
    if %withincmd% EQU 0 (
        call :delay
    )
    goto :Exit
)    

goto :Exit

:delay
where ping > nul 2>&1
IF %ERRORLEVEL% NEQ 0 (
    pause
) else (
    @echo Pausing for 10 seconds ...
    ping -n 11 127.0.0.1 > nul
)
goto :EOF

:Exit
IF %REMOTE% EQU 1 (
	IF "%SUM_REMOVE_TEMP_FILES%"=="true" (
		echo SUM_REMOVE_TEMP_FILES set true, removing sum files
		rd /s /q !dstpath! 2> NUL
	)
	
	IF !REMOVE_LOCALPATH! EQU 1 (
		echo cleanup_onexit or cleanupall_onexit is set, removing files at !dstpath!
		rd /s /q !dstpath! 2> NUL
	)
)
exit /b %ERRORCODE%
