;-------------------------------------------------------------------------------
; Script to build a Xactools installer
;-------------------------------------------------------------------------------
!include FileFunc.nsh
!include EnvVarUpdate.nsh
!include StdUtils.nsh
!include "LogicLib.nsh"

;-------------------------------------------------------------------------------
; Read version information from svnversion.h
;-------------------------------------------------------------------------------
!searchparse /noerrors /file "${__FILEDIR__}\..\svnversion.h" `#define VER_COMPANYNAME_STR ` TEMPVAL
!define COMPANYNAME ${TEMPVAL}

!searchparse /noerrors /file "${__FILEDIR__}\..\svnversion.h" `#define VER_COPYRIGHT_STR ` TEMPVAL
!define COPYRIGHT ${TEMPVAL}

!searchparse /noerrors /file "${__FILEDIR__}\..\svnversion.h" `#define VER_FILE_DESCRIPTION_STR ` TEMPVAL
!define DESCRIPTION ${TEMPVAL}

!searchparse /noerrors /file "${__FILEDIR__}\..\svnversion.h" `#define VER_PLATFORM_STR ` TEMPVAL
!define PLATFORM ${TEMPVAL}

!searchparse /noerrors /file "${__FILEDIR__}\..\svnversion.h" `#define VER_PRODUCTNAME_STR ` TEMPVAL
!define APPNAME ${TEMPVAL}

!searchparse /noerrors /file "${__FILEDIR__}\..\svnversion.h" `#define STRSVNREVISION ` TEMPVAL
!define VERSIONBUILD ${TEMPVAL}

!searchparse /noerrors /file "${__FILEDIR__}\..\svnversion.h" `#define VERSION_MAJOR ` TEMPVAL
!define VERSIONMAJOR ${TEMPVAL}

!searchparse /noerrors /file "${__FILEDIR__}\..\svnversion.h" `#define VERSION_MINOR ` TEMPVAL
!define VERSIONMINOR ${TEMPVAL}

!searchparse /noerrors /file "${__FILEDIR__}\..\svnversion.h" `#define VERSION_REVISION ` TEMPVAL
!define VERSIONREVISION ${TEMPVAL}

!searchparse /noerrors /file "${__FILEDIR__}\..\svnversion.h" `#define VER_CONFIGURATION_STR ` TEMPVAL
!define CONFIGURATION ${TEMPVAL}

!searchparse /noerrors /file "${__FILEDIR__}\..\svnversion.h" `#define VER_ORIGINAL_FILENAME_STR   VER_PRODUCTNAME_STR "` TEMPVAL `"`
!define EXTENSION ${TEMPVAL}

;-------------------------------------------------------------------------------
; Set installer information
;-------------------------------------------------------------------------------
!define APPICON "${__FILEDIR__}\..\res\${APPNAME}.ico"
!define COMPANY_URL "http://www.xactools.de"
!define FILE_VERSION "${VERSIONMAJOR}.${VERSIONMINOR}.${VERSIONREVISION}.${VERSIONBUILD}"
!define FILENAME_UNINSTALL "Uninstall-${APPNAME}-V${VERSIONMAJOR}.${VERSIONMINOR}.${VERSIONREVISION}.${VERSIONBUILD}${EXTENSION}"
!define LBL_PROGRAM "${APPNAME} V${PRODUCT_VERSION}"
!define LBL_UNINSTALL "Uninstall ${APPNAME} ${PRODUCT_VERSION}"
!define MODE_INSTALL "I"
!define MODE_UPGRADE "U"
!define ORIGINALFILENAME "Setup-${APPNAME}-V${VERSIONMAJOR}.${VERSIONMINOR}.${VERSIONREVISION}.${VERSIONBUILD}${EXTENSION}"
!define PRODUCT_NAME "${APPNAME} Installer"
!define PRODUCT_VERSION "${VERSIONMAJOR}.${VERSIONMINOR}.${VERSIONREVISION}.${VERSIONBUILD}"
!define REMOVE_ALL "A"
!define REMOVE_PART "P"
!define XACTOOLS_APPUSERMODELID "${COMPANYNAME}.${APPNAME}.${PRODUCT_VERSION}"
!define XACTOOLS_CONFIG "$INSTDIR\Bin\Config\Xactools.ini"

AllowRootDirInstall true
BrandingText "${COPYRIGHT}"
CRCCheck force
Caption "${LBL_PROGRAM}"
FileBufSize 20
Icon "${APPICON}"
InstallDir "C:\${APPNAME}"
Name "${COMPANYNAME} - ${LBL_PROGRAM}"
OutFile "${ORIGINALFILENAME}"
RequestExecutionLevel admin
SetCompress force
SetCompressor /SOLID /FINAL lzma
SetCompressorDictSize 20
ShowInstDetails show
ShowUninstDetails show
UninstallIcon "${APPICON}"

VIProductVersion "${PRODUCT_VERSION}"
VIAddVersionKey /LANG=0 "CompanyName" "${COMPANYNAME}"
VIAddVersionKey /LANG=0 "FileDescription" "${PRODUCT_NAME}"
VIAddVersionKey /LANG=0 "FileVersion" "${FILE_VERSION}"
VIAddVersionKey /LANG=0 "LegalCopyright" "${COPYRIGHT}"
VIAddVersionKey /LANG=0 "OriginalFilename" "${ORIGINALFILENAME}"
VIAddVersionKey /LANG=0 "ProductName" "${PRODUCT_NAME}"
VIAddVersionKey /LANG=0 "ProductVersion" "${LBL_PROGRAM} Software"

Var /GLOBAL DirRequiredDLL
Var /GLOBAL ProgramName
Var /GLOBAL ProgramNameFQN

;-------------------------------------------------------------------------------
; Control function of installation
;-------------------------------------------------------------------------------
Section "Install" "SecInstall"
	; Prefill some variables
	StrCpy $DirRequiredDLL "$INSTDIR\Bin\RequiredDll"
	StrCpy $ProgramName "${APPNAME}-V${VERSIONMAJOR}.${VERSIONMINOR}.${VERSIONREVISION}.${VERSIONBUILD}${EXTENSION}"
	StrCpy $ProgramNameFQN "$INSTDIR\Bin\$ProgramName"

	;-------------------------------------------------------------------------------
	; Create default folders
	;-------------------------------------------------------------------------------
	; Set output path to the installation directory.
	SetOutPath $INSTDIR

	StrCpy $0 "$INSTDIR\Auftrag"
	Call MKDir

	StrCpy $0 "$INSTDIR\Austausch"
	Call MKDir

	StrCpy $0 "$INSTDIR\Bin\Program"
	Call MKDir

	StrCpy $0 "$INSTDIR\Bin\scripte"
	Call MKDir

	StrCpy $0 "$INSTDIR\Images"
	Call MKDir

	StrCpy $0 "$INSTDIR\Log"
	Call MKDir

	StrCpy $0 "$INSTDIR\Manual"
	Call MKDir

	StrCpy $0 "$INSTDIR\StatisticData"
	Call MKDir

	;-------------------------------------------------------------------------------
	; Place Beckhoff files
	;-------------------------------------------------------------------------------
	CreateDirectory "$INSTDIR\Beckhoff"
	SetOutPath "$INSTDIR\Beckhoff"
	SetOverwrite ifnewer
	File "${__FILEDIR__}\Templates\Xactools\Beckhoff\*.tsm"

	;-------------------------------------------------------------------------------
	; Place common files
	;-------------------------------------------------------------------------------
	SetOutPath "$INSTDIR\Bin"
	SetOverwrite ifnewer
	File "${__FILEDIR__}\..\CalcParser.chm"
	File "${__FILEDIR__}\Templates\Xactools\Bin\ctv_deu.xml"
	File "${__FILEDIR__}\Templates\Xactools\Bin\ctv_eng.xml"
	File "${__FILEDIR__}\Templates\Xactools\Bin\Datensicherung.bat"
	File "${__FILEDIR__}\Templates\Xactools\Bin\Datensicherung_nur_Bilder.bat"
	File "${__FILEDIR__}\Templates\Xactools\Bin\logo_small.png"
	File "${__FILEDIR__}\Templates\Xactools\Bin\xactools_background.png"
	File "${__FILEDIR__}\Templates\Xactools\Bin\xactools_camera_backgroung.png"
	File "${__FILEDIR__}\Templates\Xactools\Bin\XactoolsViewer.exe"
	File "${__FILEDIR__}\Templates\Xactools\Bin\xctls.ini"

	;-------------------------------------------------------------------------------
	; Place config files
	;-------------------------------------------------------------------------------
	CreateDirectory "$INSTDIR\Bin\Config"
	SetOutPath "$INSTDIR\Bin\Config"
	SetOverwrite off
	File "${__FILEDIR__}\Templates\Xactools\Bin\Config\*.ini"
	File "${__FILEDIR__}\Templates\Xactools\Bin\Config\*.xml"

	;-------------------------------------------------------------------------------
	; Place language files
	;-------------------------------------------------------------------------------
	CreateDirectory "$INSTDIR\Languages"
	SetOutPath "$INSTDIR\Languages"
	SetOverwrite ifnewer
	File "${__FILEDIR__}\..\Languages\*.XML"

	;-------------------------------------------------------------------------------
	; Place Xactools program
	;-------------------------------------------------------------------------------
	SetOutPath "$INSTDIR\Bin\"
	File /oname=$ProgramName "${__FILEDIR__}\..\${PLATFORM}\${CONFIGURATION}\${APPNAME}${EXTENSION}"

	;-------------------------------------------------------------------------------
	; Place requried DLLs and add folder to system PATH variable
	;-------------------------------------------------------------------------------
	CreateDirectory "$DirRequiredDLL"
	SetOutPath "$DirRequiredDLL"
	SetOverwrite ifnewer
	File "${__FILEDIR__}\..\${PLATFORM}\${CONFIGURATION}\*.DLL"
	${EnvVarUpdate} $1 "PATH" "A" "HKLM" "$DirRequiredDLL"

	;-------------------------------------------------------------------------------
	; Place Sherlock files
	;-------------------------------------------------------------------------------
	CreateDirectory "$INSTDIR\Bin\Sherlock"
	SetOutPath "$INSTDIR\Bin\Sherlock"
	SetOverwrite ifnewer
	File "${__FILEDIR__}\Templates\Xactools\Bin\Sherlock\*.ivs"

	;-------------------------------------------------------------------------------
	; Modify paths/drive in Xactools.ini file
	;-------------------------------------------------------------------------------
	${GetRoot} "$INSTDIR" $0
	DetailPrint "Update [${XACTOOLS_CONFIG}] with path information."
	ReadINIStr $1 "${XACTOOLS_CONFIG}" Program QrkPath
	WriteINIStr "${XACTOOLS_CONFIG}" Program QrkPath "$0$1"
	ReadINIStr $1 "${XACTOOLS_CONFIG}" Program BmpPath
	WriteINIStr "${XACTOOLS_CONFIG}" Program BmpPath "$INSTDIR$1"
	ReadINIStr $1 "${XACTOOLS_CONFIG}" Program ShmPath
	WriteINIStr "${XACTOOLS_CONFIG}" Program ShmPath "$INSTDIR$1"
	ReadINIStr $1 "${XACTOOLS_CONFIG}" Program TmpPath
	WriteINIStr "${XACTOOLS_CONFIG}" Program TmpPath "$INSTDIR$1"
	ReadINIStr $1 "${XACTOOLS_CONFIG}" Program TxtPath
	WriteINIStr "${XACTOOLS_CONFIG}" Program TxtPath "$INSTDIR$1"
	ReadINIStr $1 "${XACTOOLS_CONFIG}" Program Viewer
	WriteINIStr "${XACTOOLS_CONFIG}" Program Viewer "$INSTDIR$1"
	ReadINIStr $1 "${XACTOOLS_CONFIG}" Program XmlPath
	WriteINIStr "${XACTOOLS_CONFIG}" Program XmlPath "$INSTDIR$1"
	ReadINIStr $1 "${XACTOOLS_CONFIG}" CustomScreens Path
	WriteINIStr "${XACTOOLS_CONFIG}" CustomScreens Path "$INSTDIR$1"

	;-------------------------------------------------------------------------------
	; Create uninstaller
	;-------------------------------------------------------------------------------
	SetOutPath "$INSTDIR"
	writeUninstaller "$INSTDIR\${FILENAME_UNINSTALL}"

	;-------------------------------------------------------------------------------
	; Create entry for uninstaller as usual on windows
	;-------------------------------------------------------------------------------
	WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANYNAME} ${APPNAME}" "VersionMajor" ${VERSIONMAJOR}
	WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANYNAME} ${APPNAME}" "VersionMinor" ${VERSIONMINOR}
	WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANYNAME} ${APPNAME}" "Contact" "${COMPANY_URL}"
	WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANYNAME} ${APPNAME}" "DisplayIcon" "${APPICON}"
	WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANYNAME} ${APPNAME}" "DisplayName" "${DESCRIPTION}"
	WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANYNAME} ${APPNAME}" "DisplayVersion" "${VERSIONMAJOR}.${VERSIONMINOR}.${VERSIONREVISION}.${VERSIONBUILD}"
	WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANYNAME} ${APPNAME}" "HelpLink" "${COMPANY_URL}"
	WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANYNAME} ${APPNAME}" "InstallLocation" "$INSTDIR"
	WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANYNAME} ${APPNAME}" "Publisher" "${COMPANYNAME}"
	WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANYNAME} ${APPNAME}" "QuietUninstallString" "$INSTDIR\${FILENAME_UNINSTALL} /S"
	WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANYNAME} ${APPNAME}" "RegCompany" "${COMPANYNAME}"
	WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANYNAME} ${APPNAME}" "RegOwner" "${COMPANYNAME}"
	WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANYNAME} ${APPNAME}" "URLInfoAbout" "${COMPANY_URL}"
	WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANYNAME} ${APPNAME}" "URLUpdateInfo" "${COMPANY_URL}"
	WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANYNAME} ${APPNAME}" "UninstallString" "$INSTDIR\${FILENAME_UNINSTALL}"

	${GetSize} "$INSTDIR" "/S=0K" $0 $1 $2
	IntFmt $0 "0x%08X" $0
	WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANYNAME} ${APPNAME}" "EstimatedSize" "$0"

	WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANYNAME} ${APPNAME}" "NoModify" 1
	WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANYNAME} ${APPNAME}" "NoRepair" 1

	;-------------------------------------------------------------------------------
	; Create start menu entry, desktop shortcut, ...
	;-------------------------------------------------------------------------------
	SetOutPath "$INSTDIR\Bin\"

	CreateShortcut "$DESKTOP\${LBL_PROGRAM}.lnk" "$ProgramNameFQN"

	CreateDirectory "$SMPrograms\${COMPANYNAME}"
	CreateShortcut "$SMPROGRAMS\${COMPANYNAME}\${LBL_PROGRAM}.lnk" "$ProgramNameFQN" "" "${APPICON}"
	CreateShortcut "$SMPROGRAMS\${COMPANYNAME}\${LBL_UNINSTALL}.lnk" "$INSTDIR\${FILENAME_UNINSTALL}" "" "${APPICON}"

	WinShell::SetLnkAUMI "$SMPROGRAMS\${COMPANYNAME}\${LBL_PROGRAM}.lnk" "${XACTOOLS_APPUSERMODELID}"
SectionEnd

;-------------------------------------------------------------------------------
; Uninstall control function
;-------------------------------------------------------------------------------
Section un.Install
	; Prefill some variables
	StrCpy $DirRequiredDLL "$INSTDIR\Bin\RequiredDll"
	StrCpy $ProgramName "${APPNAME}-V${VERSIONMAJOR}.${VERSIONMINOR}.${VERSIONREVISION}.${VERSIONBUILD}${EXTENSION}"
	StrCpy $ProgramNameFQN "$INSTDIR\Bin\$ProgramName"

	MessageBox MB_YESNO "Delete directory $INSTDIR completely?" IDYES true IDNO false
	true:
		;-------------------------------------------------------------------------------
		; Delete all files
		;-------------------------------------------------------------------------------
		rmDir /r "$INSTDIR"
		Goto next
	false:
		;-------------------------------------------------------------------------------
		; Delete required DLLs
		;-------------------------------------------------------------------------------
		rmDir /r "$DirRequiredDLL"

		;-------------------------------------------------------------------------------
		; Delete Xactools program
		;-------------------------------------------------------------------------------
		MessageBox MB_YESNO "Delete program $ProgramName?" IDYES delorigtrue IDNO delorigfalse
		delorigtrue:
			Delete $ProgramNameFQN
			Goto delorignext
		delorigfalse:
			; Do nothing in case of IDNO
		delorignext:

		;-------------------------------------------------------------------------------
		; Delete language files
		;-------------------------------------------------------------------------------
		rmDir /r "$INSTDIR\Languages"

		;-------------------------------------------------------------------------------
		; Delete common files
		;-------------------------------------------------------------------------------
		Delete "$INSTDIR\Bin\CalcParser.chm"
		Delete "$INSTDIR\Bin\ctv_deu.xml"
		Delete "$INSTDIR\Bin\ctv_eng.xml"
		Delete "$INSTDIR\Bin\Datensicherung.bat"
		Delete "$INSTDIR\Bin\Datensicherung_nur_Bilder.bat"
		Delete "$INSTDIR\Bin\logo_small.png"
		Delete "$INSTDIR\Bin\xactools_background.png"
		Delete "$INSTDIR\Bin\xactools_camera_backgroung.png"
		Delete "$INSTDIR\Bin\XactoolsViewer.exe"
		Delete "$INSTDIR\Bin\xctls.ini"

		;-------------------------------------------------------------------------------
		; Delete Beckhoff files
		;-------------------------------------------------------------------------------
		rmDir /r "$INSTDIR\Beckhoff"

		;-------------------------------------------------------------------------------
		; Delete default folders
		;-------------------------------------------------------------------------------
		StrCpy $0 "$INSTDIR\Auftrag"
		Call un.DeleteFolderRequest

		StrCpy $0 "$INSTDIR\Austausch"
		Call un.DeleteFolderRequest

		StrCpy $0 "$INSTDIR\Bin\Config"
		Call un.DeleteFolderRequest

		StrCpy $0 "$INSTDIR\Bin\Program"
		Call un.DeleteFolderRequest

		StrCpy $0 "$INSTDIR\Bin\scripte"
		Call un.DeleteFolderRequest

		StrCpy $0 "$INSTDIR\Images"
		Call un.DeleteFolderRequest

		StrCpy $0 "$INSTDIR\Log"
		Call un.DeleteFolderRequest

		StrCpy $0 "$INSTDIR\Manual"
		Call un.DeleteFolderRequest

		StrCpy $0 "$INSTDIR\StatisticData"
		Call un.DeleteFolderRequest
	next:

	;-------------------------------------------------------------------------------
	; Remove path from system PATH variable
	;-------------------------------------------------------------------------------
	${un.EnvVarUpdate} $1 "PATH" "R" "HKLM" "$DirRequiredDLL"

	;-------------------------------------------------------------------------------
	; Delete start menu entry, desktop shortcut, ...
	;-------------------------------------------------------------------------------
	Delete "$DESKTOP\${LBL_PROGRAM}.lnk"

	WinShell::UninstAppUserModelId "${XACTOOLS_APPUSERMODELID}"
	WinShell::UninstShortcut "$SMPROGRAMS\${COMPANYNAME}\${LBL_PROGRAM}.lnk"

	Delete "$SMPROGRAMS\${COMPANYNAME}\${LBL_PROGRAM}.lnk"
	Delete "$SMPROGRAMS\${COMPANYNAME}\${LBL_UNINSTALL}.lnk"

	StrCpy $0 "$SMPROGRAMS\${COMPANYNAME}"
	Call un.DeleteFolderRequest

	;-------------------------------------------------------------------------------
	; Delete entry of uninstaller as last action
	;-------------------------------------------------------------------------------
	DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANYNAME} ${APPNAME}"
	Delete "$INSTDIR\${FILENAME_UNINSTALL}"
SectionEnd

;-------------------------------------------------------------------------------
; Handles the directory selection of the user
;-------------------------------------------------------------------------------
Page directory "FncDirPre"

;-------------------------------------------------------------------------------
; Function executed before directory selection page
;-------------------------------------------------------------------------------
Function FncDirPre
	; Read size of install section
	SectionGetSize ${SecInstall} $0
	; Set size to directory selection page
	SectionSetSize ${directory} $0
FunctionEnd

;-------------------------------------------------------------------------------
; Display what is installed
;-------------------------------------------------------------------------------
Page instfiles

;-------------------------------------------------------------------------------
; Create directory if not exists
;-------------------------------------------------------------------------------
Function MKDir
	${IF} ${FileExists} "$0"
		;
	${Else}
		CreateDirectory $0
	${EndIf}
FunctionEnd

;-------------------------------------------------------------------------------
; Delete folder on user request
;-------------------------------------------------------------------------------
Function un.DeleteFolderRequest
	FindFirst $R0 $R1 "$0\*.*"
	strcmp $R1 "." 0 DelEnd
		FindNext $R0 $R1
		strcmp $R1 ".." 0 DelEnd
		ClearErrors
		FindNext $R0 $R1
		IfErrors 0 UserQuestion
			FindClose $R0
			Sleep 1000
			rmDir /r "$0"
			Goto DelEnd
		UserQuestion:
		MessageBox MB_YESNO "Folder $0 is not empty, delete anyway?" IDYES true IDNO false
		true:
			rmDir /r "$0"
			Goto next
		false:
			; Do nothing in case of IDNO
		next:
	DelEnd:
	FindClose $R0
FunctionEnd
