From e848253618d394548bb47920647d32b012b70c5e Mon Sep 17 00:00:00 2001
From: Stephen Birarda <commit@birarda.com>
Date: Fri, 25 Aug 2017 10:57:30 -0700
Subject: [PATCH 1/3] remember if express or custom was selected for install

---
 cmake/macros/SetPackagingParameters.cmake |   3 +-
 cmake/templates/NSIS.template.in          | 135 +++++++++++-----------
 2 files changed, 71 insertions(+), 67 deletions(-)

diff --git a/cmake/macros/SetPackagingParameters.cmake b/cmake/macros/SetPackagingParameters.cmake
index fea244873c..8458d53f68 100644
--- a/cmake/macros/SetPackagingParameters.cmake
+++ b/cmake/macros/SetPackagingParameters.cmake
@@ -133,7 +133,7 @@ macro(SET_PACKAGING_PARAMETERS)
       else()
         message( FATAL_ERROR "Visual Studio 2013 or higher required." )
       endif()
-  
+
       if (NOT SIGNTOOL_EXECUTABLE)
         message(FATAL_ERROR "Code signing of executables was requested but signtool.exe could not be found.")
       endif ()
@@ -147,6 +147,7 @@ macro(SET_PACKAGING_PARAMETERS)
     set(CONSOLE_STARTUP_REG_KEY "ConsoleStartupShortcut")
     set(CLIENT_LAUNCH_NOW_REG_KEY "ClientLaunchAfterInstall")
     set(SERVER_LAUNCH_NOW_REG_KEY "ServerLaunchAfterInstall")
+    set(CUSTOM_INSTALL_REG_KEY "CustomInstall")
   endif ()
 
   # setup component categories for installer
diff --git a/cmake/templates/NSIS.template.in b/cmake/templates/NSIS.template.in
index de79b49a74..7cd613fc23 100644
--- a/cmake/templates/NSIS.template.in
+++ b/cmake/templates/NSIS.template.in
@@ -49,7 +49,7 @@
     Var STR_CONTAINS_VAR_3
     Var STR_CONTAINS_VAR_4
     Var STR_RETURN_VAR
-        
+
     Function StrContains
       Exch $STR_NEEDLE
       Exch 1
@@ -343,29 +343,29 @@ SectionEnd
 ;--------------------------------
 ;Pages
   !insertmacro MUI_PAGE_WELCOME
-  
+
   !insertmacro MUI_PAGE_LICENSE "@CPACK_RESOURCE_FILE_LICENSE@"
-  
+
   Page custom InstallTypesPage ReadInstallTypes
-  
+
   !define MUI_PAGE_CUSTOMFUNCTION_PRE AbortFunction
   !insertmacro MUI_PAGE_DIRECTORY
-  
+
   ;Start Menu Folder Page Configuration
   !define MUI_STARTMENUPAGE_REGISTRY_ROOT "HKLM"
   !define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\@CPACK_PACKAGE_VENDOR@\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@"
   !define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Start Menu Folder"
-  
+
   !define MUI_PAGE_CUSTOMFUNCTION_PRE AbortFunction
   !insertmacro MUI_PAGE_STARTMENU Application $STARTMENU_FOLDER
-  
+
   !define MUI_PAGE_CUSTOMFUNCTION_PRE AbortFunction
   @CPACK_NSIS_PAGE_COMPONENTS@
-    
+
   Page custom PostInstallOptionsPage ReadPostInstallOptions
 
   !insertmacro MUI_PAGE_INSTFILES
-  
+
   !insertmacro MUI_UNPAGE_CONFIRM
   !insertmacro MUI_UNPAGE_INSTFILES
 
@@ -454,8 +454,8 @@ Var CustomInstallRadioButton
 Var InstallTypeDialog
 Var Express
 
-!macro SetPostInstallOption Checkbox OptionName Default
-  ; reads the value for the given post install option to the registry
+!macro SetInstallOption Checkbox OptionName Default
+  ; reads the value for the given install option to the registry
   ReadRegStr $0 HKLM "@REGISTRY_HKLM_INSTALL_ROOT@\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@\@POST_INSTALL_OPTIONS_REG_GROUP@" "${OptionName}"
 
   ${If} $0 == "NO"
@@ -472,31 +472,31 @@ Var Express
 
 Function InstallTypesPage
   !insertmacro MUI_HEADER_TEXT "Choose Installation Type" "Express or Custom Install"
-  
+
   nsDialogs::Create 1018
   Pop $InstallTypeDialog
-  
+
   ${If} $InstallTypeDialog == error
     Abort
   ${EndIf}
-  
+
   StrCpy $CurrentOffset 0
   StrCpy $OffsetUnits u
-  StrCpy $Express "0"  
-  
+  StrCpy $Express "0"
+
   ${NSD_CreateRadioButton} 30% $CurrentOffset$OffsetUnits 100% 10u "Express Install (Recommended)"; $\nInstalls High Fidelity Interface and High Fidelity Sandbox"
   pop $ExpressInstallRadioButton
   ${NSD_OnClick} $ExpressInstallRadioButton ChangeExpressLabel
   IntOp $CurrentOffset $CurrentOffset + 15
-  
+
   ${NSD_CreateRadiobutton} 30% $CurrentOffset$OffsetUnits 100% 10u "Custom Install (Advanced)"
   pop $CustomInstallRadioButton
-  ${NSD_OnClick} $CustomInstallRadioButton ChangeCustomLabel 
-  
-  ; Express Install selected by default
-  ${NSD_Check} $ExpressInstallRadioButton
+  ${NSD_OnClick} $CustomInstallRadioButton ChangeCustomLabel
+
+  ; read the install type from the registry, select express install by default
+  !insertmacro SetInstallOption $ExpressInstallRadioButton @CUSTOM_INSTALL_REG_KEY@ ${BST_CHECKED}
   Call ChangeExpressLabel
-  
+
   nsDialogs::Show
 FunctionEnd
 
@@ -519,18 +519,18 @@ Function AbortFunction
   StrCmp $Express "1" 0 end
   Abort
   end:
-FunctionEnd  
+FunctionEnd
 
 Function PostInstallOptionsPage
   !insertmacro MUI_HEADER_TEXT "Setup Options" ""
 
   nsDialogs::Create 1018
   Pop $PostInstallDialog
-  
+
   ${If} $PostInstallDialog == error
     Abort
   ${EndIf}
-  
+
   ; Check if Express is set, if so, abort the post install options page
   StrCmp $Express "1" 0 end
   Abort
@@ -543,18 +543,18 @@ Function PostInstallOptionsPage
     ${NSD_CreateCheckbox} 0 $CurrentOffset$OffsetUnits 100% 10u "&Create a desktop shortcut for @INTERFACE_HF_SHORTCUT_NAME@"
     Pop $DesktopClientCheckbox
     IntOp $CurrentOffset $CurrentOffset + 15
-    
+
     ; set the checkbox state depending on what is present in the registry
-    !insertmacro SetPostInstallOption $DesktopClientCheckbox @CLIENT_DESKTOP_SHORTCUT_REG_KEY@ ${BST_CHECKED}
+    !insertmacro SetInstallOption $DesktopClientCheckbox @CLIENT_DESKTOP_SHORTCUT_REG_KEY@ ${BST_CHECKED}
   ${EndIf}
-  
+
   ${If} ${SectionIsSelected} ${@SERVER_COMPONENT_NAME@}
     ${NSD_CreateCheckbox} 0 $CurrentOffset$OffsetUnits 100% 10u "&Create a desktop shortcut for @CONSOLE_HF_SHORTCUT_NAME@"
     Pop $DesktopServerCheckbox
     IntOp $CurrentOffset $CurrentOffset + 15
-    
+
     ; set the checkbox state depending on what is present in the registry
-    !insertmacro SetPostInstallOption $DesktopServerCheckbox @CONSOLE_DESKTOP_SHORTCUT_REG_KEY@ ${BST_UNCHECKED}
+    !insertmacro SetInstallOption $DesktopServerCheckbox @CONSOLE_DESKTOP_SHORTCUT_REG_KEY@ ${BST_UNCHECKED}
   ${EndIf}
 
   ${If} ${SectionIsSelected} ${@SERVER_COMPONENT_NAME@}
@@ -562,7 +562,7 @@ Function PostInstallOptionsPage
     Pop $LaunchServerNowCheckbox
 
     ; set the checkbox state depending on what is present in the registry
-    !insertmacro SetPostInstallOption $LaunchServerNowCheckbox @SERVER_LAUNCH_NOW_REG_KEY@ ${BST_CHECKED}
+    !insertmacro SetInstallOption $LaunchServerNowCheckbox @SERVER_LAUNCH_NOW_REG_KEY@ ${BST_CHECKED}
     ${StrContains} $substringResult "/forceNoLaunchServer" $CMDLINE
     ${IfNot} $substringResult == ""
         ${NSD_SetState} $LaunchServerNowCheckbox ${BST_UNCHECKED}
@@ -570,29 +570,29 @@ Function PostInstallOptionsPage
 
     IntOp $CurrentOffset $CurrentOffset + 15
   ${EndIf}
-  
+
   ${If} ${SectionIsSelected} ${@CLIENT_COMPONENT_NAME@}
     ${NSD_CreateCheckbox} 0 $CurrentOffset$OffsetUnits 100% 10u "&Launch @INTERFACE_HF_SHORTCUT_NAME@ after install"
     Pop $LaunchClientNowCheckbox
     IntOp $CurrentOffset $CurrentOffset + 30
-    
+
     ; set the checkbox state depending on what is present in the registry
-    !insertmacro SetPostInstallOption $LaunchClientNowCheckbox @CLIENT_LAUNCH_NOW_REG_KEY@ ${BST_CHECKED}
+    !insertmacro SetInstallOption $LaunchClientNowCheckbox @CLIENT_LAUNCH_NOW_REG_KEY@ ${BST_CHECKED}
     ${StrContains} $substringResult "/forceNoLaunchClient" $CMDLINE
     ${IfNot} $substringResult == ""
     ${NSD_SetState} $LaunchClientNowCheckbox ${BST_UNCHECKED}
     ${EndIf}
   ${EndIf}
-  
+
   ${If} ${SectionIsSelected} ${@SERVER_COMPONENT_NAME@}
     ${NSD_CreateCheckbox} 0 $CurrentOffset$OffsetUnits 100% 10u "&Launch @CONSOLE_HF_SHORTCUT_NAME@ on startup"
     Pop $ServerStartupCheckbox
     IntOp $CurrentOffset $CurrentOffset + 15
-    
+
     ; set the checkbox state depending on what is present in the registry
-    !insertmacro SetPostInstallOption $ServerStartupCheckbox @CONSOLE_STARTUP_REG_KEY@ ${BST_CHECKED}
+    !insertmacro SetInstallOption $ServerStartupCheckbox @CONSOLE_STARTUP_REG_KEY@ ${BST_CHECKED}
   ${EndIf}
-  
+
   ${If} ${SectionIsSelected} ${@CLIENT_COMPONENT_NAME@}
     ${NSD_CreateCheckbox} 0 $CurrentOffset$OffsetUnits 100% 10u "&Perform a clean install (Delete older settings and content)"
     Pop $CleanInstallCheckbox
@@ -618,12 +618,12 @@ Function PostInstallOptionsPage
 
     ${NSD_SetState} $CopyFromProductionCheckbox ${BST_UNCHECKED}
   ${EndIf}
-  
+
   nsDialogs::Show
 FunctionEnd
 
-!macro WritePostInstallOption OptionName Option
-  ; writes the value for the given post install option to the registry
+!macro WriteInstallOption OptionName Option
+  ; writes the value for the given install option to the registry
   WriteRegStr HKLM "@REGISTRY_HKLM_INSTALL_ROOT@\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@\@POST_INSTALL_OPTIONS_REG_GROUP@" "${OptionName}" ${Option}
 !macroend
 
@@ -641,12 +641,12 @@ Function ReadInstallTypes
   ; check if the user asked for express/custom install
   ${NSD_GetState} $ExpressInstallRadioButton $ExpressInstallState
   ${NSD_GetState} $CustomInstallRadioButton $CustomInstallState
-  
+
   ${If} $ExpressInstallState == ${BST_CHECKED}
     StrCpy $Express "1"
-    
-    StrCpy $DesktopClientState ${BST_CHECKED}  
-    StrCpy $ServerStartupState ${BST_CHECKED} 
+
+    StrCpy $DesktopClientState ${BST_CHECKED}
+    StrCpy $ServerStartupState ${BST_CHECKED}
     StrCpy $LaunchServerNowState ${BST_CHECKED}
     StrCpy $LaunchClientNowState ${BST_CHECKED}
     StrCpy $CleanInstallState ${BST_UNCHECKED}
@@ -655,9 +655,12 @@ Function ReadInstallTypes
     ${If} @PR_BUILD@ == 1
       StrCpy $CopyFromProductionState ${BST_UNCHECKED}
     ${EndIf}
-    
+
+    !insertmacro WriteInstallOption "@CUSTOM_INSTALL_REG_KEY@" NO
+  ${Else}
+    !insertmacro WriteInstallOption "@CUSTOM_INSTALL_REG_KEY@" YES
   ${EndIf}
-  
+
 FunctionEnd
 
 Function ReadPostInstallOptions
@@ -683,12 +686,12 @@ Function ReadPostInstallOptions
     ; check if we need to launch the server post-install
     ${NSD_GetState} $LaunchServerNowCheckbox $LaunchServerNowState
   ${EndIf}
-  
+
   ${If} ${SectionIsSelected} ${@CLIENT_COMPONENT_NAME@}
     ; check if we need to launch the client post-install
     ${NSD_GetState} $LaunchClientNowCheckbox $LaunchClientNowState
   ${EndIf}
-   
+
   ${If} ${SectionIsSelected} ${@CLIENT_COMPONENT_NAME@}
     ; check if the user asked for a clean install
     ${NSD_GetState} $CleanInstallCheckbox $CleanInstallState
@@ -700,9 +703,9 @@ Function HandlePostInstallOptions
     ; check if the user asked for a desktop shortcut to High Fidelity
     ${If} $DesktopClientState == ${BST_CHECKED}
       CreateShortCut "$DESKTOP\@INTERFACE_HF_SHORTCUT_NAME@.lnk" "$INSTDIR\@INTERFACE_WIN_EXEC_NAME@"
-      !insertmacro WritePostInstallOption "@CLIENT_DESKTOP_SHORTCUT_REG_KEY@" YES
+      !insertmacro WriteInstallOption "@CLIENT_DESKTOP_SHORTCUT_REG_KEY@" YES
     ${Else}
-      !insertmacro WritePostInstallOption @CLIENT_DESKTOP_SHORTCUT_REG_KEY@ NO
+      !insertmacro WriteInstallOption @CLIENT_DESKTOP_SHORTCUT_REG_KEY@ NO
     ${EndIf}
 
   ${EndIf}
@@ -711,12 +714,12 @@ Function HandlePostInstallOptions
     ; check if the user asked for a desktop shortcut to Sandbox
     ${If} $DesktopServerState == ${BST_CHECKED}
       CreateShortCut "$DESKTOP\@CONSOLE_HF_SHORTCUT_NAME@.lnk" "$INSTDIR\@CONSOLE_INSTALL_SUBDIR@\@CONSOLE_WIN_EXEC_NAME@"
-      !insertmacro WritePostInstallOption @CONSOLE_DESKTOP_SHORTCUT_REG_KEY@ YES
+      !insertmacro WriteInstallOption @CONSOLE_DESKTOP_SHORTCUT_REG_KEY@ YES
     ${Else}
-      !insertmacro WritePostInstallOption @CONSOLE_DESKTOP_SHORTCUT_REG_KEY@ NO
+      !insertmacro WriteInstallOption @CONSOLE_DESKTOP_SHORTCUT_REG_KEY@ NO
     ${EndIf}
 
-    
+
     ; check if the user asked to have Sandbox launched every startup
     ${If} $ServerStartupState == ${BST_CHECKED}
       ; in case we added a shortcut in the global context, pull that now
@@ -730,12 +733,12 @@ Function HandlePostInstallOptions
       ; reset the shell var context back
       SetShellVarContext all
 
-      !insertmacro WritePostInstallOption @CONSOLE_STARTUP_REG_KEY@ YES
+      !insertmacro WriteInstallOption @CONSOLE_STARTUP_REG_KEY@ YES
     ${Else}
-      !insertmacro WritePostInstallOption @CONSOLE_STARTUP_REG_KEY@ NO
+      !insertmacro WriteInstallOption @CONSOLE_STARTUP_REG_KEY@ NO
     ${EndIf}
   ${EndIf}
-  
+
   ${If} ${SectionIsSelected} ${@CLIENT_COMPONENT_NAME@}
     ; check if the user asked for a clean install
     ${If} $CleanInstallState == ${BST_CHECKED}
@@ -774,28 +777,28 @@ Function HandlePostInstallOptions
   ${EndIf}
 
   ${If} $LaunchServerNowState == ${BST_CHECKED}
-    !insertmacro WritePostInstallOption @SERVER_LAUNCH_NOW_REG_KEY@ YES
+    !insertmacro WriteInstallOption @SERVER_LAUNCH_NOW_REG_KEY@ YES
 
     ; both launches use the explorer trick in case the user has elevated permissions for the installer
     ${If} $LaunchClientNowState == ${BST_CHECKED}
-      !insertmacro WritePostInstallOption @CLIENT_LAUNCH_NOW_REG_KEY@ YES
+      !insertmacro WriteInstallOption @CLIENT_LAUNCH_NOW_REG_KEY@ YES
       ; create shortcut with ARGUMENTS
       CreateShortCut "$TEMP\SandboxShortcut.lnk" "$INSTDIR\@CONSOLE_INSTALL_SUBDIR@\@CONSOLE_WIN_EXEC_NAME@" "-- --launchInterface"
       Exec '"$WINDIR\explorer.exe" "$TEMP\SandboxShortcut.lnk"'
     ${Else}
-      !insertmacro WritePostInstallOption @CLIENT_LAUNCH_NOW_REG_KEY@ NO
+      !insertmacro WriteInstallOption @CLIENT_LAUNCH_NOW_REG_KEY@ NO
       Exec '"$WINDIR\explorer.exe" "$INSTDIR\@CONSOLE_INSTALL_SUBDIR@\@CONSOLE_WIN_EXEC_NAME@"'
     ${EndIf}
 
   ${Else}
-    !insertmacro WritePostInstallOption @SERVER_LAUNCH_NOW_REG_KEY@ NO
+    !insertmacro WriteInstallOption @SERVER_LAUNCH_NOW_REG_KEY@ NO
 
     ; launch uses the explorer trick in case the user has elevated permissions for the installer
     ${If} $LaunchClientNowState == ${BST_CHECKED}
-      !insertmacro WritePostInstallOption @CLIENT_LAUNCH_NOW_REG_KEY@ YES
+      !insertmacro WriteInstallOption @CLIENT_LAUNCH_NOW_REG_KEY@ YES
       Exec '"$WINDIR\explorer.exe" "$INSTDIR\@INTERFACE_WIN_EXEC_NAME@"'
     ${Else}
-      !insertmacro WritePostInstallOption @CLIENT_LAUNCH_NOW_REG_KEY@ NO
+      !insertmacro WriteInstallOption @CLIENT_LAUNCH_NOW_REG_KEY@ NO
     ${EndIf}
 
   ${EndIf}
@@ -843,7 +846,7 @@ Section "-Core installation"
   Rename "$INSTDIR\resources\qml\styles-uit\RalewaySemibold.qml" "$INSTDIR\resources\qml\styles-uit\RalewaySemiBold.qml"
 
   ExecWait "$INSTDIR\vcredist_x64.exe /install /q /norestart"
-  
+
   ; Remove the Old Interface directory and vcredist_x64.exe (from installs prior to Server Console)
   RMDir /r "$INSTDIR\Interface"
   Delete "$INSTDIR\vcredist_x64.exe"
@@ -943,9 +946,9 @@ Section "-Core installation"
   Call ConditionalAddToRegisty
 
   !insertmacro MUI_STARTMENU_WRITE_END
-  
+
   @CPACK_NSIS_EXTRA_INSTALL_COMMANDS@
-  
+
   ; Handle whichever post install options were set
   Call HandlePostInstallOptions
 

From 6ac255dd2153c0e9fef706f29893ca95c87d1a2a Mon Sep 17 00:00:00 2001
From: Stephen Birarda <commit@birarda.com>
Date: Fri, 25 Aug 2017 12:07:26 -0700
Subject: [PATCH 2/3] add custom install reg key to cpack properties

---
 cmake/templates/CPackProperties.cmake.in | 1 +
 1 file changed, 1 insertion(+)

diff --git a/cmake/templates/CPackProperties.cmake.in b/cmake/templates/CPackProperties.cmake.in
index c1e3d9d773..b91d78f628 100644
--- a/cmake/templates/CPackProperties.cmake.in
+++ b/cmake/templates/CPackProperties.cmake.in
@@ -40,6 +40,7 @@ set(CONSOLE_DESKTOP_SHORTCUT_REG_KEY "@CONSOLE_DESKTOP_SHORTCUT_REG_KEY@")
 set(CONSOLE_STARTUP_REG_KEY "@CONSOLE_STARTUP_REG_KEY@")
 set(SERVER_LAUNCH_NOW_REG_KEY "@SERVER_LAUNCH_NOW_REG_KEY@")
 set(CLIENT_LAUNCH_NOW_REG_KEY "@CLIENT_LAUNCH_NOW_REG_KEY@")
+set(CUSTOM_INSTALL_REG_KEY "@CUSTOM_INSTALL_REG_KEY@")
 set(INSTALLER_HEADER_IMAGE "@INSTALLER_HEADER_IMAGE@")
 set(UNINSTALLER_HEADER_IMAGE "@UNINSTALLER_HEADER_IMAGE@")
 set(ADD_REMOVE_ICON_PATH "@ADD_REMOVE_ICON_PATH@")

From 2661f92e0949bc202144f08bf2802a7c147521d3 Mon Sep 17 00:00:00 2001
From: Stephen Birarda <commit@birarda.com>
Date: Fri, 25 Aug 2017 14:05:40 -0700
Subject: [PATCH 3/3] fix state setting for express/custom

---
 cmake/templates/NSIS.template.in | 13 +++++++++++--
 1 file changed, 11 insertions(+), 2 deletions(-)

diff --git a/cmake/templates/NSIS.template.in b/cmake/templates/NSIS.template.in
index 7cd613fc23..64b7299b9b 100644
--- a/cmake/templates/NSIS.template.in
+++ b/cmake/templates/NSIS.template.in
@@ -453,6 +453,7 @@ Var ExpressInstallRadioButton
 Var CustomInstallRadioButton
 Var InstallTypeDialog
 Var Express
+Var CustomInstallTemporaryState
 
 !macro SetInstallOption Checkbox OptionName Default
   ; reads the value for the given install option to the registry
@@ -493,8 +494,16 @@ Function InstallTypesPage
   pop $CustomInstallRadioButton
   ${NSD_OnClick} $CustomInstallRadioButton ChangeCustomLabel
 
-  ; read the install type from the registry, select express install by default
-  !insertmacro SetInstallOption $ExpressInstallRadioButton @CUSTOM_INSTALL_REG_KEY@ ${BST_CHECKED}
+  ; check install type from the registry, express install by default
+  !insertmacro SetInstallOption $CustomInstallRadioButton @CUSTOM_INSTALL_REG_KEY@ ${BST_UNCHECKED}
+
+  ; set the express install value based on the custom install value from registry
+  ${NSD_GetState} $CustomInstallRadioButton $CustomInstallTemporaryState
+
+  ${If} $CustomInstallTemporaryState == ${BST_UNCHECKED}
+    ${NSD_Check} $ExpressInstallRadioButton
+  ${EndIf}
+
   Call ChangeExpressLabel
 
   nsDialogs::Show