@echo off

:: Get TVSU Installation Directory from the registry
SET TESTTVSUDIR=
FOR /F "usebackq tokens=1,2,*" %%I IN (`reg query "HKLM\SOFTWARE\Lenovo\System Update" /v "InstallationDir"`) DO @IF /I "%%I" == "InstallationDir" SET TESTTVSUDIR=%%~K
::IF "%TESTTVSUDIR%" == "" SET TESTTVSUDIR=%ProgramFiles%\ThinkVantage\SystemUpdate\
IF "%TESTTVSUDIR%" == "" SET TESTTVSUDIR=%ProgramFiles%\Lenovo\SystemUpdate\

:: Check if TVSU is installed
SET TESTTVSUEXE=TVSU.EXE
IF EXIST "%TESTTVSUDIR%%TESTTVSUEXE%" GOTO START
::::SET TESTTVSUEXE=UCLauncher.exe
::SET TESTTVSUEXE=TVTLauncher.exe
::IF EXIST "%TESTTVSUDIR%%TESTTVSUEXE%" GOTO START
GOTO END


:START
:: Run MapDrv.exe to set the TVSU Custom Factory Recovery alias - get the TVSU Repository parameters from the manifest file
FOR /F "usebackq eol=; tokens=1,2 delims==" %%I IN (%SystemDrive%\I386\MANIFEST.CFI) DO (
  IF /I "%%I" == "ExtReposPath"          IF /I NOT "%%J" == "" SET MANREPOS=%%J
  IF /I "%%I" == "ExtReposUserName"      IF /I NOT "%%J" == "" SET MANUSER=%%J
  IF /I "%%I" == "ExtReposPwd"           IF /I NOT "%%J" == "" SET MANPWD=%%J
  IF /I "%%I" == "ExtReposRunUnattended" IF /I NOT "%%J" == "" SET MANUNAT=%%J
)

IF "%MANUSER%" == "" IF "%MANPWD%" == "" GOTO RUNTVSU
FOR %%I IN ("mapdrv.exe") DO IF "%%~$PATH:I" == ""     %SystemDrive%\I386\IUSpawn.exe %SystemDrive%\I386\mapdrv.exe /STORE TVSUAPPLICATION /UNC %MANREPOS% /USER ``%MANUSER%`` /PWD ``%MANPWD%``
FOR %%I IN ("mapdrv.exe") DO IF NOT "%%~$PATH:I" == "" %SystemDrive%\I386\IUSpawn.exe                    mapdrv.exe /STORE TVSUAPPLICATION /UNC %MANREPOS% /USER ``%MANUSER%`` /PWD ``%MANPWD%``


:RUNTVSU
:: Launch TVSU - For runonce mode, there needs to be a RUNONCE.REG and a START.REG file
GOTO DBLREPOS
:RUNTVSU2
PUSHD "%TESTTVSUDIR%"

ECHO REGEDIT4 >RUNONCE.REG
ECHO [HKEY_LOCAL_MACHINE\SOFTWARE\Lenovo\System Update\Preferences\UserSettings\General] >>RUNONCE.REG
ECHO "RepositoryMode"="LOCAL" >>RUNONCE.REG
IF "%NEWREPOS%" == "" SET NEWREPOS=%MANREPOS%
ECHO "LocalRepositoryLocation"="%NEWREPOS%" >>RUNONCE.REG

IF EXIST default\*.REG IF NOT EXIST START.REG COPY /Y default\*.REG START.REG >NUL

IF /I "%MANUNAT%" == "Y"     START "TVSU" "%TESTTVSUDIR%%TESTTVSUEXE%" /unattended
IF /I NOT "%MANUNAT%" == "Y" START "TVSU" "%TESTTVSUDIR%%TESTTVSUEXE%"
POPD


:: Cleanup all files
:END
SET I=
SET J=
SET NEWREPOS=
SET MANREPOS=
SET MANUSER=
SET MANPWD=
SET MANUNAT=
IF EXIST %SystemDrive%\I386\MANIFEST.CFI DEL /Q %SystemDrive%\I386\MANIFEST.CFI >NUL
IF EXIST %SystemDrive%\I386\IUSPAWN.EXE  DEL /Q %SystemDrive%\I386\IUSPAWN.EXE >NUL
IF EXIST %SystemDrive%\I386\MAPDRV.EXE   DEL /Q %SystemDrive%\I386\MAPDRV.EXE >NUL
SET TESTTVSUEXE=
SET TESTTVSUDIR=
DEL %0
GOTO EXIT


:DBLREPOS
:: Function to double all backslashes in the MANREPOS path (for a REG file)
SET NEWREPOS=
FOR /F "usebackq tokens=1-26 delims=\" %%A IN ('%MANREPOS%') DO (
    IF NOT L%%Z == L SET NEWREPOS=%%A\\%%B\\%%C\\%%D\\%%E\\%%F\\%%G\\%%H\\%%I\\%%J\\%%K\\%%L\\%%M\\%%N\\%%O\\%%P\\%%Q\\%%R\\%%S\\%%T\\%%U\\%%V\\%%W\\%%X\\%%Y\\%%Z
    IF NOT L%%Z == L GOTO CONT
    IF NOT L%%Y == L SET NEWREPOS=%%A\\%%B\\%%C\\%%D\\%%E\\%%F\\%%G\\%%H\\%%I\\%%J\\%%K\\%%L\\%%M\\%%N\\%%O\\%%P\\%%Q\\%%R\\%%S\\%%T\\%%U\\%%V\\%%W\\%%X\\%%Y
    IF NOT L%%Y == L GOTO CONT
    IF NOT L%%X == L SET NEWREPOS=%%A\\%%B\\%%C\\%%D\\%%E\\%%F\\%%G\\%%H\\%%I\\%%J\\%%K\\%%L\\%%M\\%%N\\%%O\\%%P\\%%Q\\%%R\\%%S\\%%T\\%%U\\%%V\\%%W\\%%X
    IF NOT L%%X == L GOTO CONT
    IF NOT L%%W == L SET NEWREPOS=%%A\\%%B\\%%C\\%%D\\%%E\\%%F\\%%G\\%%H\\%%I\\%%J\\%%K\\%%L\\%%M\\%%N\\%%O\\%%P\\%%Q\\%%R\\%%S\\%%T\\%%U\\%%V\\%%W
    IF NOT L%%W == L GOTO CONT
    IF NOT L%%V == L SET NEWREPOS=%%A\\%%B\\%%C\\%%D\\%%E\\%%F\\%%G\\%%H\\%%I\\%%J\\%%K\\%%L\\%%M\\%%N\\%%O\\%%P\\%%Q\\%%R\\%%S\\%%T\\%%U\\%%V
    IF NOT L%%V == L GOTO CONT
    IF NOT L%%U == L SET NEWREPOS=%%A\\%%B\\%%C\\%%D\\%%E\\%%F\\%%G\\%%H\\%%I\\%%J\\%%K\\%%L\\%%M\\%%N\\%%O\\%%P\\%%Q\\%%R\\%%S\\%%T\\%%U
    IF NOT L%%U == L GOTO CONT
    IF NOT L%%T == L SET NEWREPOS=%%A\\%%B\\%%C\\%%D\\%%E\\%%F\\%%G\\%%H\\%%I\\%%J\\%%K\\%%L\\%%M\\%%N\\%%O\\%%P\\%%Q\\%%R\\%%S\\%%T
    IF NOT L%%T == L GOTO CONT
    IF NOT L%%S == L SET NEWREPOS=%%A\\%%B\\%%C\\%%D\\%%E\\%%F\\%%G\\%%H\\%%I\\%%J\\%%K\\%%L\\%%M\\%%N\\%%O\\%%P\\%%Q\\%%R\\%%S
    IF NOT L%%S == L GOTO CONT
    IF NOT L%%R == L SET NEWREPOS=%%A\\%%B\\%%C\\%%D\\%%E\\%%F\\%%G\\%%H\\%%I\\%%J\\%%K\\%%L\\%%M\\%%N\\%%O\\%%P\\%%Q\\%%R
    IF NOT L%%R == L GOTO CONT
    IF NOT L%%Q == L SET NEWREPOS=%%A\\%%B\\%%C\\%%D\\%%E\\%%F\\%%G\\%%H\\%%I\\%%J\\%%K\\%%L\\%%M\\%%N\\%%O\\%%P\\%%Q
    IF NOT L%%Q == L GOTO CONT
    IF NOT L%%P == L SET NEWREPOS=%%A\\%%B\\%%C\\%%D\\%%E\\%%F\\%%G\\%%H\\%%I\\%%J\\%%K\\%%L\\%%M\\%%N\\%%O\\%%P
    IF NOT L%%P == L GOTO CONT
    IF NOT L%%O == L SET NEWREPOS=%%A\\%%B\\%%C\\%%D\\%%E\\%%F\\%%G\\%%H\\%%I\\%%J\\%%K\\%%L\\%%M\\%%N\\%%O
    IF NOT L%%O == L GOTO CONT
    IF NOT L%%N == L SET NEWREPOS=%%A\\%%B\\%%C\\%%D\\%%E\\%%F\\%%G\\%%H\\%%I\\%%J\\%%K\\%%L\\%%M\\%%N
    IF NOT L%%N == L GOTO CONT
    IF NOT L%%M == L SET NEWREPOS=%%A\\%%B\\%%C\\%%D\\%%E\\%%F\\%%G\\%%H\\%%I\\%%J\\%%K\\%%L\\%%M
    IF NOT L%%M == L GOTO CONT
    IF NOT L%%L == L SET NEWREPOS=%%A\\%%B\\%%C\\%%D\\%%E\\%%F\\%%G\\%%H\\%%I\\%%J\\%%K\\%%L
    IF NOT L%%L == L GOTO CONT
    IF NOT L%%K == L SET NEWREPOS=%%A\\%%B\\%%C\\%%D\\%%E\\%%F\\%%G\\%%H\\%%I\\%%J\\%%K
    IF NOT L%%K == L GOTO CONT
    IF NOT L%%J == L SET NEWREPOS=%%A\\%%B\\%%C\\%%D\\%%E\\%%F\\%%G\\%%H\\%%I\\%%J
    IF NOT L%%J == L GOTO CONT
    IF NOT L%%I == L SET NEWREPOS=%%A\\%%B\\%%C\\%%D\\%%E\\%%F\\%%G\\%%H\\%%I
    IF NOT L%%I == L GOTO CONT
    IF NOT L%%H == L SET NEWREPOS=%%A\\%%B\\%%C\\%%D\\%%E\\%%F\\%%G\\%%H
    IF NOT L%%H == L GOTO CONT
    IF NOT L%%G == L SET NEWREPOS=%%A\\%%B\\%%C\\%%D\\%%E\\%%F\\%%G
    IF NOT L%%G == L GOTO CONT
    IF NOT L%%F == L SET NEWREPOS=%%A\\%%B\\%%C\\%%D\\%%E\\%%F
    IF NOT L%%F == L GOTO CONT
    IF NOT L%%E == L SET NEWREPOS=%%A\\%%B\\%%C\\%%D\\%%E
    IF NOT L%%E == L GOTO CONT
    IF NOT L%%D == L SET NEWREPOS=%%A\\%%B\\%%C\\%%D
    IF NOT L%%D == L GOTO CONT
    IF NOT L%%C == L SET NEWREPOS=%%A\\%%B\\%%C
    IF NOT L%%C == L GOTO CONT
    IF NOT L%%B == L SET NEWREPOS=%%A\\%%B
    IF NOT L%%B == L GOTO CONT
    IF NOT L%%A == L SET NEWREPOS=%%A
)
:CONT
IF L%MANREPOS:~0,1% == L\ SET NEWREPOS=\\%NEWREPOS%
IF L%MANREPOS:~1,1% == L\ SET NEWREPOS=\\%NEWREPOS%
IF L%MANREPOS:~-1% == L\  SET NEWREPOS=%NEWREPOS%\\
GOTO RUNTVSU2

:EXIT
@echo on
