/*  This file is part of vcxsrv.
 *
 *  Copyright (C) 2009 Marc Haesen
 *
 *  vcxsrv is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  vcxsrv is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with vcxsrv.  If not, see <http://www.gnu.org/licenses/>.
*/
;--------------------------------

; The name of the installer
Name "VcXsrv"

; The file to write
OutFile "vcxsrv.1.9.2.0.installer.exe"

; The default installation directory
InstallDir $PROGRAMFILES\VcXsrv

; Registry key to check for directory (so if you install again, it will 
; overwrite the old one automatically)
InstallDirRegKey HKLM "Software\VcXsrv" "Install_Dir"

; Request application privileges for Windows Vista
RequestExecutionLevel admin

;--------------------------------
InstType "Full"
InstType "Minimal"

; Pages

Page components
Page directory
Page instfiles

UninstPage uninstConfirm
UninstPage instfiles

SetPluginUnload alwaysoff
; ShowInstDetails show
XPStyle on

!define FUSION_REFCOUNT_UNINSTALL_SUBKEY_GUID {8cedc215-ac4b-488b-93c0-a50a49cb2fb8}

!ifdef VS2008
!include runtime
!endif

;--------------------------------
; The stuff to install
Section "VcXsrv (required)"

  SectionIn RO
  SectionIn 1 2

  ; Set output path to the installation directory.
  SetOutPath $INSTDIR

  ; Remove old opengl32.dll file if it extits
  IfFileExists "$INSTDIR\opengl32.dll" 0 +2
    Delete "$INSTDIR\opengl32.dll"

  ; Put files there
  File "..\obj\servrelease\vcxsrv.exe"
  File "..\obj\servdebug\vcxsrv_dbg.exe"
  File "..\obj\servdebug\vcxsrv_dbg.pdb"
  File "..\protocol.txt"
  File "..\system.XWinrc"
  File "..\..\xkbcomp\obj\release\xkbcomp.exe"
  File "..\..\apps\xcalc\obj\release\xcalc.exe"
  File "..\xcalc"
  File "..\xcalc-color"
  File "..\..\apps\xclock\obj\release\xclock.exe"
  File "..\..\apps\xwininfo\obj\release\xwininfo.exe"
  File "..\XKeysymDB"
  File "..\XErrorDB"
  File "..\hw\xwin\xlaunch\obj\release\xlaunch.exe"
  File "..\..\tools\plink\obj\release\plink.exe"
  File "..\swrast_dri.dll"
  File "..\swrast_dri_dbg.dll"
!ifndef VS2008
  File "msvcr100.dll"
  File "msvcp100.dll"
  File "msvcr100d.dll"
!endif
  SetOutPath $INSTDIR\fonts
  File /r "..\fonts\*.*"
  SetOutPath $INSTDIR\xkbdata
  File /r "..\xkbdata\*.*"
  SetOutPath $INSTDIR\locale
  File /r "..\locale\*.*"

  ; Write the installation path into the registry
  WriteRegStr HKLM SOFTWARE\VcXsrv "Install_Dir" "$INSTDIR"

  ; Write the uninstall keys for Windows
  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\VcXsrv" "DisplayName" "VcXsrv"
  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\VcXsrv" "UninstallString" '"$INSTDIR\uninstall.exe"'
  WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\VcXsrv" "NoModify" 1
  WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\VcXsrv" "NoRepair" 1
  WriteUninstaller "uninstall.exe"
  
  ; Register the xlaunch file extension
  WriteRegStr HKCR ".xlaunch" "" "XLaunchFile"
  WriteRegStr HKCR "XLaunchFile" "" "XLaunch Configuration"
  WriteRegStr HKCR "XLaunchFile\DefaultIcon" "" "$INSTDIR\xlaunch.exe,0"
  WriteRegStr HKCR "XLaunchFile\shell" "" 'open'
  WriteRegStr HKCR "XLaunchFile\shell\open\command" "" '"$INSTDIR\XLaunch.exe" -run "%1"'
  WriteRegStr HKCR "XLaunchFile\shell\open\ddeexec\Application" "" "XLaunch"
  WriteRegStr HKCR "XLaunchFile\shell\open\ddeexec\Topic" "" "System"
  WriteRegStr HKCR "XLaunchFile\shell\edit\command" "" '"$INSTDIR\XLaunch.exe" -load "%1"'
  WriteRegStr HKCR "XLaunchFile\shell\edit\ddeexec\Application" "" "XLaunch"
  WriteRegStr HKCR "XLaunchFile\shell\edit\ddeexec\Topic" "" "System"
  WriteRegStr HKCR "XLaunchFile\shell\Validate\command" "" '"$INSTDIR\XLaunch.exe" -validate "%1"'
  WriteRegStr HKCR "XLaunchFile\shell\Validate\ddeexec\Application" "" "XLaunch"
  WriteRegStr HKCR "XLaunchFile\shell\Validate\ddeexec\Topic" "" "System"

  WriteRegStr HKCR "Applications\xlaunch.exe\shell" "" 'open'
  WriteRegStr HKCR "Applications\xlaunch.exe\shell\open\command" "" '"$INSTDIR\XLaunch.exe" -run "%1"'
  WriteRegStr HKCR "Applications\xlaunch.exe\shell\open\ddeexec\Application" "" "XLaunch"
  WriteRegStr HKCR "Applications\xlaunch.exe\shell\open\ddeexec\Topic" "" "System"
  WriteRegStr HKCR "Applications\xlaunch.exe\shell\edit\command" "" '"$INSTDIR\XLaunch.exe" -load "%1"'
  WriteRegStr HKCR "Applications\xlaunch.exe\shell\edit\ddeexec\Application" "" "XLaunch"
  WriteRegStr HKCR "Applications\xlaunch.exe\shell\edit\ddeexec\Topic" "" "System"
  WriteRegStr HKCR "Applications\xlaunch.exe\shell\Validate\command" "" '"$INSTDIR\XLaunch.exe" -validate "%1"'
  WriteRegStr HKCR "Applications\xlaunch.exe\shell\Validate\ddeexec\Application" "" "XLaunch"
  WriteRegStr HKCR "Applications\xlaunch.exe\shell\Validate\ddeexec\Topic" "" "System"

!ifdef VS2008
  InitPluginsDir
  SetOutPath $PLUGINSDIR
  File "${MSVCR90_DLL}"
  File "${MSVCM90_DLL}"
  File "${MSVCP90_DLL}"
  File "${MSVC_CAT}"
  File "${MSVC_MANIFEST}"
  File "${MSVCR90_DLL_D}"
  File "${MSVCM90_DLL_D}"
  File "${MSVCP90_DLL_D}"
  File "${MSVC_CAT_D}"
  File "${MSVC_MANIFEST_D}"
  DetailPrint "Installing CRT assembly..."
  System::Call "sxs::CreateAssemblyCache(*i .r0, i 0) i.r1"
  StrCmp $1 0 0 fail
  # Fill a FUSION_INSTALL_REFERENCE.
  # fir.cbSize = sizeof(FUSION_INSTALL_REFERENCE) == 32
  # fir.dwFlags = 0
  # fir.guidScheme = FUSION_REFCOUNT_UNINSTALL_SUBKEY_GUID
  # fir.szIdentifier = "nsissxs"
  # fir.szNonCanonicalData = 0
  System::Call "*(i 32, i 0, i 2364391957, i 1217113163, i 178634899, i 3090139977, w 'nsissxs', w '') i.s"
  Pop $2
  # IAssemblyCache::InstallAssembly(0, manifestPath, fir)
  System::Call "$0->7(i 0, w '$PLUGINSDIR\${MSVC_MANIFEST_PART}', i r2) i.r1"
  StrCmp $1 0 0 failcrt
  System::Call "$0->7(i 0, w '$PLUGINSDIR\${MSVC_MANIFEST_PART_D}', i r2) i.r1"
  StrCmp $1 0 0 faildebugcrt
  System::Free $2
  System::Call "$0->2()"
  Goto end
  
fail:
  DetailPrint "CreateAssemblyCache failed."
  DetailPrint $1
  Goto end

failcrt:
  DetailPrint "InstallAssembly CRT failed."
  DetailPrint $1
  Goto end
faildebugcrt:
  DetailPrint "InstallAssembly Debug CRT failed."
  DetailPrint $1
  Goto end
end:
!endif
SectionEnd

; Optional section (can be disabled by the user)
Section "Start Menu Shortcuts"
  SectionIn 1

  SetOutPath $INSTDIR
  CreateDirectory "$SMPROGRAMS\VcXsrv"
  CreateShortCut "$SMPROGRAMS\VcXsrv\Uninstall VcXsrv.lnk" "$INSTDIR\uninstall.exe" "" "$INSTDIR\uninstall.exe" 0
  CreateShortCut "$SMPROGRAMS\VcXsrv\VcXsrv.lnk" "$INSTDIR\vcxsrv.exe" " :0 -ac -terminate -lesspointer -multiwindow -clipboard -wgl" "$INSTDIR\vcxsrv.exe" 0
  CreateShortCut "$SMPROGRAMS\VcXsrv\XLaunch.lnk" "$INSTDIR\xlaunch.exe" "" "$INSTDIR\xlaunch.exe" 0

SectionEnd

; Optional section (can be disabled by the user)
Section "Desktop Shortcuts"
  SectionIn 1

  SetOutPath $INSTDIR
  CreateShortCut "$DESKTOP\VcXsrv.lnk" "$INSTDIR\vcxsrv.exe" " :0 -ac -terminate -lesspointer -multiwindow -clipboard -wgl" "$INSTDIR\vcxsrv.exe" 0
  CreateShortCut "$DESKTOP\XLaunch.lnk" "$INSTDIR\xlaunch.exe" "" "$INSTDIR\xlaunch.exe" 0

SectionEnd

;--------------------------------

; Uninstaller

Section "Uninstall"
  
  ; Remove registry keys
  DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\VcXsrv"
  DeleteRegKey HKLM SOFTWARE\VcXsrv

  ; Register the xlaunch file extension
  DeleteRegKey HKCR ".xlaunch"
  DeleteRegKey HKCR "XLaunchFile"
  DeleteRegKey HKCR "Applications\xlaunch.exe"

  ; Remove files and uninstaller
  Delete "$INSTDIR\vcxsrv.exe"
  Delete "$INSTDIR\vcxsrv_dbg.exe"
  Delete "$INSTDIR\vcxsrv_dbg.pdb"
  Delete "$INSTDIR\uninstall.exe"
  Delete "$INSTDIR\protocol.txt"
  Delete "$INSTDIR\system.XWinrc"
  Delete "$INSTDIR\xkbcomp.exe"
  Delete "$INSTDIR\xcalc.exe"
  Delete "$INSTDIR\xcalc"
  Delete "$INSTDIR\xcalc-color"
  Delete "$INSTDIR\xclock.exe"
  Delete "$INSTDIR\xwininfo.exe"
  Delete "$INSTDIR\XKeysymDB"
  Delete "$INSTDIR\XErrorDB"
  Delete "$INSTDIR\xlaunch.exe"
  Delete "$INSTDIR\plink.exe"
  Delete "$INSTDIR\swrast_dri.dll"
  Delete "$INSTDIR\swrast_dri_dbg.dll"
!ifndef VS2008
  Delete "$INSTDIR\msvcr100.dll"
  Delete "$INSTDIR\msvcp100.dll"
  Delete "$INSTDIR\msvcr100d.dll"
!endif

  RMDir /r "$INSTDIR\fonts"
  RMDir /r "$INSTDIR\xkbdata"
  RMDir /r "$INSTDIR\locale"

  ; Remove shortcuts, if any
  Delete "$SMPROGRAMS\VcXsrv\*.*"
  Delete "$DESKTOP\VcXsrv.lnk"
  Delete "$DESKTOP\XLaunch.lnk"

  ; Remove directories used
  RMDir "$SMPROGRAMS\VcXsrv"
  RMDir "$INSTDIR"

;  Currently disable uninstalling the run-time; because sometimes it is removing
;  the run-time although other applications are using them
;  DetailPrint "Removing CRT assembly..."
;  System::Call "sxs::CreateAssemblyCache(*i .r0, i 0) i.r1"
;  StrCmp $1 0 0 fail
;  System::Call "*(i 32, i 0, i 2364391957, i 1217113163, i 178634899, i 3090139977, w 'nsissxs', w '') i.s"
;  Pop $2
;  System::Call "$0->3(i 0, w 'Microsoft.VC90.CRT,version=$\"9.0.${MSVC_VERSION}$\",type=$\"win32$\",processorArchitecture=$\"x86$\",publicKeyToken=$\"${MSVC_PUBLICTOKEN}$\"', i r2, *i . r3) i.r1"
;  StrCmp $1 0 0 failcrt
;  System::Call "$0->3(i 0, w 'Microsoft.VC90.DebugCRT,version=$\"9.0.${MSVC_VERSION_D}$\",type=$\"win32$\",processorArchitecture=$\"x86$\",publicKeyToken=$\"${MSVC_PUBLICTOKEN}$\"', i r2, *i . r3) i.r1"
;  StrCmp $1 0 0 faildebugcrt
;  DetailPrint "Disposition returned is $3"
;  System::Free $2
;  System::Call "$0->2()"
;  Goto end
;  fail:
;  DetailPrint "CreateAssemblyCache failed."
;  DetailPrint $1
;  Goto end
;  failcrt:
;  DetailPrint "UninstallAssembly CRT failed."
;  DetailPrint $1
;  Goto end
;  faildebugcrt:
;  DetailPrint "UninstallAssembly Debug CRT failed."
;  DetailPrint $1
;  Goto end
;end:

SectionEnd