From 58324fbbccabef700fe337f3bc28f32dddb04d6b Mon Sep 17 00:00:00 2001 From: Chris Kaczor Date: Wed, 12 Nov 2014 19:36:56 -0500 Subject: [PATCH] Initial commit --- BalExtensionExt.sln | 82 + Examples/Build.bat | 63 + Examples/Bundle1.wxs | 35 + Examples/Bundle10.wxs | 46 + Examples/Bundle11.wxs | 53 + Examples/Bundle2.wxs | 53 + Examples/Bundle3.wxs | 48 + Examples/Bundle4.wxs | 42 + Examples/Bundle5.wxs | 33 + Examples/Bundle6.wxs | 32 + Examples/Bundle7.wxs | 33 + Examples/Bundle8.wxs | 35 + Examples/Bundle9.wxs | 35 + Examples/Resource/1031/HyperlinkTheme.wxl | 49 + Examples/Resource/2057/HyperlinkTheme.wxl | 49 + Examples/Resource/Bundle2Theme.xml | 89 + Examples/Resource/Bundle3Theme.xml | 87 + Examples/Resource/Bundle4Theme.xml | 88 + Examples/Resource/HyperlinkLocaleTheme.wxl | 49 + Examples/Resource/HyperlinkTheme.wxl | 49 + Examples/Resource/License.htm | 127 + Examples/Resource/License.rtf | Bin 0 -> 4908 bytes Examples/Resource/Logo.png | Bin 0 -> 886 bytes Examples/Resource/LogoSide.png | Bin 0 -> 3118 bytes Examples/Resource/SplashScreen.bmp | Bin 0 -> 14278 bytes Examples/Setup.wxs | 38 + .../IBootstrapperBAFunction.h | 29 + Examples/Template bafunctions/Readme.txt | 85 + Examples/Template bafunctions/Version.proj | 72 + .../WixBootstrapperBAFunction.cpp | 134 + Examples/Template bafunctions/bafunctions.cpp | 37 + Examples/Template bafunctions/bafunctions.def | 16 + Examples/Template bafunctions/bafunctions.rc | 129 + .../Template bafunctions/bafunctions.vcxproj | 134 + .../bafunctions.vcxproj.filters | 47 + .../Template bafunctions/bafunctionsver.h | 12 + Examples/Template bafunctions/build.bat | 23 + Examples/Template bafunctions/precomp.h | 52 + Examples/Template bafunctions/resource.h | 25 + Examples/bafunctions.dll | Bin 0 -> 74240 bytes LICENSE.TXT | 28 + bafunctions/IBootstrapperBAFunction.h | 29 + bafunctions/Version.proj | 72 + bafunctions/WixBootstrapperBAFunction.cpp | 278 ++ bafunctions/bafunctions.cpp | 37 + bafunctions/bafunctions.def | 16 + bafunctions/bafunctions.rc | 129 + bafunctions/bafunctions.vcxproj | 137 + bafunctions/bafunctions.vcxproj.filters | 46 + bafunctions/bafunctionsver.h | 12 + bafunctions/build.bat | 25 + bafunctions/precomp.h | 52 + bafunctions/resource.h | 25 + build.bat | 44 + build/WixBalExtensionExt.dll | Bin 0 -> 131072 bytes build/balExt.wixlib | Bin 0 -> 266491 bytes inc/Version.proj | 100 + inc/WixDistribution.cs | 13 + inc/WixDistribution.h | 17 + inc/wix.rc | 140 + inc/wixver.cs | 4 + inc/wixver.h | 13 + wixext/BalCompiler.cs | 373 +++ wixext/BalExtension.cs | 96 + wixext/BalPreprocessorExtension.cs | 63 + wixext/Properties/AssemblyInfo.cs | 27 + wixext/WixBalExtensionExt.csproj | 88 + wixext/Xsd/bal.xsd | 154 + wixext/data/messages.xml | 16 + wixext/data/tables.xml | 40 + wixlib/BalExtension.wixproj | 48 + wixlib/BalExtension.wxs | 13 + wixlib/wixstdba.wxs | 66 + wixlib/wixstdba_platform.wxi | 32 + wixlib/wixstdba_x86.wxs | 13 + wixstdba/Resources/Hyperlink2Theme.xml | 77 + wixstdba/Resources/HyperlinkTheme.wxl | 48 + wixstdba/Resources/HyperlinkTheme.xml | 66 + wixstdba/Resources/LogoSide.png | Bin 0 -> 3118 bytes wixstdba/Resources/LoremIpsumLicense.rtf | Bin 0 -> 4908 bytes wixstdba/Resources/RtfTheme.wxl | 43 + wixstdba/Resources/RtfTheme.xml | 62 + wixstdba/Resources/logo.png | Bin 0 -> 880 bytes .../WixStandardBootstrapperApplication.cpp | 2975 +++++++++++++++++ wixstdba/precomp.h | 56 + wixstdba/resource.h | 25 + wixstdba/wixstdba.cpp | 61 + wixstdba/wixstdba.def | 16 + wixstdba/wixstdba.rc | 19 + wixstdba/wixstdba.vcxproj | 144 + wixstdba/wixstdba.vcxproj.filters | 61 + 91 files changed, 7909 insertions(+) create mode 100644 BalExtensionExt.sln create mode 100644 Examples/Build.bat create mode 100644 Examples/Bundle1.wxs create mode 100644 Examples/Bundle10.wxs create mode 100644 Examples/Bundle11.wxs create mode 100644 Examples/Bundle2.wxs create mode 100644 Examples/Bundle3.wxs create mode 100644 Examples/Bundle4.wxs create mode 100644 Examples/Bundle5.wxs create mode 100644 Examples/Bundle6.wxs create mode 100644 Examples/Bundle7.wxs create mode 100644 Examples/Bundle8.wxs create mode 100644 Examples/Bundle9.wxs create mode 100644 Examples/Resource/1031/HyperlinkTheme.wxl create mode 100644 Examples/Resource/2057/HyperlinkTheme.wxl create mode 100644 Examples/Resource/Bundle2Theme.xml create mode 100644 Examples/Resource/Bundle3Theme.xml create mode 100644 Examples/Resource/Bundle4Theme.xml create mode 100644 Examples/Resource/HyperlinkLocaleTheme.wxl create mode 100644 Examples/Resource/HyperlinkTheme.wxl create mode 100644 Examples/Resource/License.htm create mode 100644 Examples/Resource/License.rtf create mode 100644 Examples/Resource/Logo.png create mode 100644 Examples/Resource/LogoSide.png create mode 100644 Examples/Resource/SplashScreen.bmp create mode 100644 Examples/Setup.wxs create mode 100644 Examples/Template bafunctions/IBootstrapperBAFunction.h create mode 100644 Examples/Template bafunctions/Readme.txt create mode 100644 Examples/Template bafunctions/Version.proj create mode 100644 Examples/Template bafunctions/WixBootstrapperBAFunction.cpp create mode 100644 Examples/Template bafunctions/bafunctions.cpp create mode 100644 Examples/Template bafunctions/bafunctions.def create mode 100644 Examples/Template bafunctions/bafunctions.rc create mode 100644 Examples/Template bafunctions/bafunctions.vcxproj create mode 100644 Examples/Template bafunctions/bafunctions.vcxproj.filters create mode 100644 Examples/Template bafunctions/bafunctionsver.h create mode 100644 Examples/Template bafunctions/build.bat create mode 100644 Examples/Template bafunctions/precomp.h create mode 100644 Examples/Template bafunctions/resource.h create mode 100644 Examples/bafunctions.dll create mode 100644 LICENSE.TXT create mode 100644 bafunctions/IBootstrapperBAFunction.h create mode 100644 bafunctions/Version.proj create mode 100644 bafunctions/WixBootstrapperBAFunction.cpp create mode 100644 bafunctions/bafunctions.cpp create mode 100644 bafunctions/bafunctions.def create mode 100644 bafunctions/bafunctions.rc create mode 100644 bafunctions/bafunctions.vcxproj create mode 100644 bafunctions/bafunctions.vcxproj.filters create mode 100644 bafunctions/bafunctionsver.h create mode 100644 bafunctions/build.bat create mode 100644 bafunctions/precomp.h create mode 100644 bafunctions/resource.h create mode 100644 build.bat create mode 100644 build/WixBalExtensionExt.dll create mode 100644 build/balExt.wixlib create mode 100644 inc/Version.proj create mode 100644 inc/WixDistribution.cs create mode 100644 inc/WixDistribution.h create mode 100644 inc/wix.rc create mode 100644 inc/wixver.cs create mode 100644 inc/wixver.h create mode 100644 wixext/BalCompiler.cs create mode 100644 wixext/BalExtension.cs create mode 100644 wixext/BalPreprocessorExtension.cs create mode 100644 wixext/Properties/AssemblyInfo.cs create mode 100644 wixext/WixBalExtensionExt.csproj create mode 100644 wixext/Xsd/bal.xsd create mode 100644 wixext/data/messages.xml create mode 100644 wixext/data/tables.xml create mode 100644 wixlib/BalExtension.wixproj create mode 100644 wixlib/BalExtension.wxs create mode 100644 wixlib/wixstdba.wxs create mode 100644 wixlib/wixstdba_platform.wxi create mode 100644 wixlib/wixstdba_x86.wxs create mode 100644 wixstdba/Resources/Hyperlink2Theme.xml create mode 100644 wixstdba/Resources/HyperlinkTheme.wxl create mode 100644 wixstdba/Resources/HyperlinkTheme.xml create mode 100644 wixstdba/Resources/LogoSide.png create mode 100644 wixstdba/Resources/LoremIpsumLicense.rtf create mode 100644 wixstdba/Resources/RtfTheme.wxl create mode 100644 wixstdba/Resources/RtfTheme.xml create mode 100644 wixstdba/Resources/logo.png create mode 100644 wixstdba/WixStandardBootstrapperApplication.cpp create mode 100644 wixstdba/precomp.h create mode 100644 wixstdba/resource.h create mode 100644 wixstdba/wixstdba.cpp create mode 100644 wixstdba/wixstdba.def create mode 100644 wixstdba/wixstdba.rc create mode 100644 wixstdba/wixstdba.vcxproj create mode 100644 wixstdba/wixstdba.vcxproj.filters diff --git a/BalExtensionExt.sln b/BalExtensionExt.sln new file mode 100644 index 0000000..0031fd9 --- /dev/null +++ b/BalExtensionExt.sln @@ -0,0 +1,82 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2012 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "wixextba", "wixstdba\wixstdba.vcxproj", "{41085A22-E6AA-4E8B-AB1B-DDEE0DC89DFA}" +EndProject +Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "BalExtension", "wixlib\BalExtension.wixproj", "{3444D952-F21C-496F-AB6B-56435BFD0787}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WixBalExtensionExt", "wixext\WixBalExtensionExt.csproj", "{6F9B6AFD-538B-4DF6-A1E8-6C224CBD7B05}" + ProjectSection(ProjectDependencies) = postProject + {3444D952-F21C-496F-AB6B-56435BFD0787} = {3444D952-F21C-496F-AB6B-56435BFD0787} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bafunctions", "bafunctions\bafunctions.vcxproj", "{EB0A7D51-2133-4EE7-B6CA-87DBEAC67E02}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|Mixed Platforms = Debug|Mixed Platforms + Debug|Win32 = Debug|Win32 + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|Mixed Platforms = Release|Mixed Platforms + Release|Win32 = Release|Win32 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {41085A22-E6AA-4E8B-AB1B-DDEE0DC89DFA}.Debug|Any CPU.ActiveCfg = Debug|Win32 + {41085A22-E6AA-4E8B-AB1B-DDEE0DC89DFA}.Debug|Any CPU.Build.0 = Debug|Win32 + {41085A22-E6AA-4E8B-AB1B-DDEE0DC89DFA}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {41085A22-E6AA-4E8B-AB1B-DDEE0DC89DFA}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {41085A22-E6AA-4E8B-AB1B-DDEE0DC89DFA}.Debug|Win32.ActiveCfg = Debug|Win32 + {41085A22-E6AA-4E8B-AB1B-DDEE0DC89DFA}.Debug|Win32.Build.0 = Debug|Win32 + {41085A22-E6AA-4E8B-AB1B-DDEE0DC89DFA}.Debug|x86.ActiveCfg = Debug|Win32 + {41085A22-E6AA-4E8B-AB1B-DDEE0DC89DFA}.Release|Any CPU.ActiveCfg = Debug|Win32 + {41085A22-E6AA-4E8B-AB1B-DDEE0DC89DFA}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {41085A22-E6AA-4E8B-AB1B-DDEE0DC89DFA}.Release|Mixed Platforms.Build.0 = Release|Win32 + {41085A22-E6AA-4E8B-AB1B-DDEE0DC89DFA}.Release|Win32.ActiveCfg = Debug|Win32 + {41085A22-E6AA-4E8B-AB1B-DDEE0DC89DFA}.Release|Win32.Build.0 = Debug|Win32 + {41085A22-E6AA-4E8B-AB1B-DDEE0DC89DFA}.Release|x86.ActiveCfg = Debug|Win32 + {3444D952-F21C-496F-AB6B-56435BFD0787}.Debug|Any CPU.ActiveCfg = Debug|x86 + {3444D952-F21C-496F-AB6B-56435BFD0787}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 + {3444D952-F21C-496F-AB6B-56435BFD0787}.Debug|Mixed Platforms.Build.0 = Debug|x86 + {3444D952-F21C-496F-AB6B-56435BFD0787}.Debug|Win32.ActiveCfg = Debug|x86 + {3444D952-F21C-496F-AB6B-56435BFD0787}.Debug|x86.ActiveCfg = Debug|x86 + {3444D952-F21C-496F-AB6B-56435BFD0787}.Debug|x86.Build.0 = Debug|x86 + {3444D952-F21C-496F-AB6B-56435BFD0787}.Release|Any CPU.ActiveCfg = Release|x86 + {3444D952-F21C-496F-AB6B-56435BFD0787}.Release|Mixed Platforms.ActiveCfg = Release|x86 + {3444D952-F21C-496F-AB6B-56435BFD0787}.Release|Mixed Platforms.Build.0 = Release|x86 + {3444D952-F21C-496F-AB6B-56435BFD0787}.Release|Win32.ActiveCfg = Release|x86 + {3444D952-F21C-496F-AB6B-56435BFD0787}.Release|x86.ActiveCfg = Release|x86 + {3444D952-F21C-496F-AB6B-56435BFD0787}.Release|x86.Build.0 = Release|x86 + {6F9B6AFD-538B-4DF6-A1E8-6C224CBD7B05}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6F9B6AFD-538B-4DF6-A1E8-6C224CBD7B05}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6F9B6AFD-538B-4DF6-A1E8-6C224CBD7B05}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {6F9B6AFD-538B-4DF6-A1E8-6C224CBD7B05}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {6F9B6AFD-538B-4DF6-A1E8-6C224CBD7B05}.Debug|Win32.ActiveCfg = Debug|Any CPU + {6F9B6AFD-538B-4DF6-A1E8-6C224CBD7B05}.Debug|x86.ActiveCfg = Debug|Any CPU + {6F9B6AFD-538B-4DF6-A1E8-6C224CBD7B05}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6F9B6AFD-538B-4DF6-A1E8-6C224CBD7B05}.Release|Any CPU.Build.0 = Release|Any CPU + {6F9B6AFD-538B-4DF6-A1E8-6C224CBD7B05}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {6F9B6AFD-538B-4DF6-A1E8-6C224CBD7B05}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {6F9B6AFD-538B-4DF6-A1E8-6C224CBD7B05}.Release|Win32.ActiveCfg = Release|Any CPU + {6F9B6AFD-538B-4DF6-A1E8-6C224CBD7B05}.Release|x86.ActiveCfg = Release|Any CPU + {EB0A7D51-2133-4EE7-B6CA-87DBEAC67E02}.Debug|Any CPU.ActiveCfg = Debug|Win32 + {EB0A7D51-2133-4EE7-B6CA-87DBEAC67E02}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {EB0A7D51-2133-4EE7-B6CA-87DBEAC67E02}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {EB0A7D51-2133-4EE7-B6CA-87DBEAC67E02}.Debug|Win32.ActiveCfg = Debug|Win32 + {EB0A7D51-2133-4EE7-B6CA-87DBEAC67E02}.Debug|Win32.Build.0 = Debug|Win32 + {EB0A7D51-2133-4EE7-B6CA-87DBEAC67E02}.Debug|x86.ActiveCfg = Debug|Win32 + {EB0A7D51-2133-4EE7-B6CA-87DBEAC67E02}.Debug|x86.Build.0 = Debug|Win32 + {EB0A7D51-2133-4EE7-B6CA-87DBEAC67E02}.Release|Any CPU.ActiveCfg = Release|Win32 + {EB0A7D51-2133-4EE7-B6CA-87DBEAC67E02}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {EB0A7D51-2133-4EE7-B6CA-87DBEAC67E02}.Release|Mixed Platforms.Build.0 = Release|Win32 + {EB0A7D51-2133-4EE7-B6CA-87DBEAC67E02}.Release|Win32.ActiveCfg = Release|Win32 + {EB0A7D51-2133-4EE7-B6CA-87DBEAC67E02}.Release|Win32.Build.0 = Release|Win32 + {EB0A7D51-2133-4EE7-B6CA-87DBEAC67E02}.Release|x86.ActiveCfg = Release|Win32 + {EB0A7D51-2133-4EE7-B6CA-87DBEAC67E02}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Examples/Build.bat b/Examples/Build.bat new file mode 100644 index 0000000..b5c4758 --- /dev/null +++ b/Examples/Build.bat @@ -0,0 +1,63 @@ +@echo off + +path=%wix%\bin;%path% + +rd obj /q/s 2>nul 1>nul +md obj 1>nul 2>nul + +echo Building examples... + +Call :build Setup msi +Call :build Bundle1 exe +Call :build Setup msi +Call :build Bundle2 exe +Call :build Setup msi +Call :build Bundle3 exe +Call :build Setup msi +Call :build Bundle4 exe +Call :build Setup msi +Call :build Bundle5 exe +Call :build Setup msi +Call :build Bundle6 exe +Call :build Setup msi +Call :build Bundle7 exe +Call :build Setup msi +Call :build Bundle8 exe +Call :build Setup msi +Call :build Bundle9 exe +Call :build Setup msi +Call :build Bundle11 exe +Call :build Setup msi +Call :build Bundle10 exe + +echo. +echo Build complete +echo. + +goto :EOF +REM ***************************************************************** +REM End of Main +REM ***************************************************************** + + +REM ***************************************************************** +REM Build WiX code +REM ***************************************************************** +:build +candle -nologo -ext WixUtilExtension -ext WixNetFxExtension -ext ..\build\WixBalExtensionExt.dll -out obj\ %1.wxs +if %errorlevel% neq 0 ( + echo Candle error: %errorlevel% + pause + goto :EOF +) + +light -nologo -spdb -ext WixUtilExtension -ext WixNetFxExtension -ext ..\build\WixBalExtensionExt.dll obj\%1.wixobj -o %1.%2 +if %errorlevel% neq 0 ( + echo Light error: %errorlevel% + pause + goto :EOF +) + +rd obj /q/s 2>nul 1>nul +goto :EOF +REM ***************************************************************** diff --git a/Examples/Bundle1.wxs b/Examples/Bundle1.wxs new file mode 100644 index 0000000..3e64582 --- /dev/null +++ b/Examples/Bundle1.wxs @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Examples/Bundle10.wxs b/Examples/Bundle10.wxs new file mode 100644 index 0000000..1eba28a --- /dev/null +++ b/Examples/Bundle10.wxs @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Examples/Bundle11.wxs b/Examples/Bundle11.wxs new file mode 100644 index 0000000..ea8b67d --- /dev/null +++ b/Examples/Bundle11.wxs @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Examples/Bundle2.wxs b/Examples/Bundle2.wxs new file mode 100644 index 0000000..d5ec53c --- /dev/null +++ b/Examples/Bundle2.wxs @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Examples/Bundle3.wxs b/Examples/Bundle3.wxs new file mode 100644 index 0000000..f3d862f --- /dev/null +++ b/Examples/Bundle3.wxs @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Examples/Bundle4.wxs b/Examples/Bundle4.wxs new file mode 100644 index 0000000..2ccf287 --- /dev/null +++ b/Examples/Bundle4.wxs @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Examples/Bundle5.wxs b/Examples/Bundle5.wxs new file mode 100644 index 0000000..fb5c776 --- /dev/null +++ b/Examples/Bundle5.wxs @@ -0,0 +1,33 @@ + + + + + + + + + diff --git a/Examples/Bundle6.wxs b/Examples/Bundle6.wxs new file mode 100644 index 0000000..a0b0582 --- /dev/null +++ b/Examples/Bundle6.wxs @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/Examples/Bundle7.wxs b/Examples/Bundle7.wxs new file mode 100644 index 0000000..d9cf7f4 --- /dev/null +++ b/Examples/Bundle7.wxs @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/Examples/Bundle8.wxs b/Examples/Bundle8.wxs new file mode 100644 index 0000000..e262a3b --- /dev/null +++ b/Examples/Bundle8.wxs @@ -0,0 +1,35 @@ + + + + + + + + + + + diff --git a/Examples/Bundle9.wxs b/Examples/Bundle9.wxs new file mode 100644 index 0000000..e939f38 --- /dev/null +++ b/Examples/Bundle9.wxs @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/Examples/Resource/1031/HyperlinkTheme.wxl b/Examples/Resource/1031/HyperlinkTheme.wxl new file mode 100644 index 0000000..fd66dfa --- /dev/null +++ b/Examples/Resource/1031/HyperlinkTheme.wxl @@ -0,0 +1,49 @@ + + + [WixBundleName] Setup + [WixBundleName] + Welcome (de-de [UserLanguageID]) + Setup will install [WixBundleName] on your computer. Click install to continue, options to set the install directory or Close to exit. + Version [WixBundleVersion] + Are you sure you want to cancel? + Setup Help + /install | /repair | /uninstall | /layout [directory] - installs, repairs, uninstalls or creates a complete local copy of the bundle in directory. Install is the default. + +/passive | /quiet - displays minimal UI with no prompts or displays no UI and no prompts. By default UI and all prompts are displayed. + +/norestart - suppress any attempts to restart. By default UI will prompt before restart. + +/log log.txt - logs to a specific file. By default a log file is created in %TEMP%. + &Close + [WixBundleName] <a href="#">license terms</a>. + I &agree to the license terms and conditions + &Options + &Install + &Close + Version [WixBundleVersion] <a href="#">upgrade available</a> + Setup Options + Install location: + &Browse... + Database location: + B&rowse... + &OK + &Cancel + Setup Progress + Processing: + Initializing... + &Cancel + Modify Setup + &Repair + &Uninstall + &Close + Setup Successful + &Launch + You must restart your computer before you can use the software. + &Restart + &Close + Setup Failed + One or more issues caused the setup to fail. Please fix the issues and then retry setup. For more information see the <a href="#">log file</a>. + You must restart your computer to complete the rollback of the software. + &Restart + &Close + \ No newline at end of file diff --git a/Examples/Resource/2057/HyperlinkTheme.wxl b/Examples/Resource/2057/HyperlinkTheme.wxl new file mode 100644 index 0000000..704cad1 --- /dev/null +++ b/Examples/Resource/2057/HyperlinkTheme.wxl @@ -0,0 +1,49 @@ + + + [WixBundleName] Setup + [WixBundleName] + Welcome (en-GB [UserLanguageID]) + Setup will install [WixBundleName] on your computer. Click install to continue, options to set the install directory or Close to exit. + Version [WixBundleVersion] + Are you sure you want to cancel? + Setup Help + /install | /repair | /uninstall | /layout [directory] - installs, repairs, uninstalls or creates a complete local copy of the bundle in directory. Install is the default. + +/passive | /quiet - displays minimal UI with no prompts or displays no UI and no prompts. By default UI and all prompts are displayed. + +/norestart - suppress any attempts to restart. By default UI will prompt before restart. + +/log log.txt - logs to a specific file. By default a log file is created in %TEMP%. + &Close + [WixBundleName] <a href="#">license terms</a>. + I &agree to the license terms and conditions + &Options + &Install + &Close + Version [WixBundleVersion] <a href="#">upgrade available</a> + Setup Options + Install location: + &Browse... + Database location: + B&rowse... + &OK + &Cancel + Setup Progress + Processing: + Initializing... + &Cancel + Modify Setup + &Repair + &Uninstall + &Close + Setup Successful + &Launch + You must restart your computer before you can use the software. + &Restart + &Close + Setup Failed + One or more issues caused the setup to fail. Please fix the issues and then retry setup. For more information see the <a href="#">log file</a>. + You must restart your computer to complete the rollback of the software. + &Restart + &Close + \ No newline at end of file diff --git a/Examples/Resource/Bundle2Theme.xml b/Examples/Resource/Bundle2Theme.xml new file mode 100644 index 0000000..8788f2b --- /dev/null +++ b/Examples/Resource/Bundle2Theme.xml @@ -0,0 +1,89 @@ + + + #(loc.Caption) + Segoe UI + Segoe UI + Segoe UI + Segoe UI + Segoe UI + + + #(loc.InstallUpgradeLinkText) + + + #(loc.Title) + + #(loc.HelpHeader) + #(loc.HelpText) + + + + #(loc.Title) + + #(loc.InstallHeader) + #(loc.InstallMessage) + #(loc.InstallLicenseLinkText) + #(loc.InstallVersion) + + #(loc.InstallAcceptCheckbox) + + + + + + #(loc.Title) + + #(loc.OptionsHeader) + #(loc.OptionsLocationLabel) + + + #(loc.OptionsLocationLabel2) + + + + Select option + + + + + + + + + + #(loc.Title) + + #(loc.ProgressHeader) + #(loc.ProgressLabel) + #(loc.OverallProgressPackageText) + + + + + #(loc.Title) + + #(loc.ModifyHeader) + + + + + + #(loc.Title) + + #(loc.SuccessHeader) + + #(loc.SuccessRestartText) + + + + + #(loc.Title) + + #(loc.FailureHeader) + #(loc.FailureHyperlinkLogText) + + #(loc.FailureRestartText) + + + + \ No newline at end of file diff --git a/Examples/Resource/Bundle3Theme.xml b/Examples/Resource/Bundle3Theme.xml new file mode 100644 index 0000000..a0ba158 --- /dev/null +++ b/Examples/Resource/Bundle3Theme.xml @@ -0,0 +1,87 @@ + + + #(loc.Caption) + Segoe UI + Segoe UI + Segoe UI + Segoe UI + Segoe UI + + + #(loc.Title) + + #(loc.HelpHeader) + #(loc.HelpText) + + + + #(loc.Title) + + #(loc.InstallHeader) + #(loc.InstallMessage) + + Select option + + + + + + + #(loc.InstallLicenseLinkText) + #(loc.InstallVersion) + #(loc.InstallAcceptCheckbox) + + + + + + #(loc.Title) + + #(loc.OptionsHeader) + #(loc.OptionsLocationLabel) + + + + Textbox + [Username] + + + + + + #(loc.Title) + + #(loc.ProgressHeader) + #(loc.ProgressLabel) + #(loc.OverallProgressPackageText) + + + + + #(loc.Title) + + #(loc.ModifyHeader) + + + + + + #(loc.Title) + + #(loc.SuccessHeader) + + #(loc.SuccessRestartText) + + + + + #(loc.Title) + + #(loc.FailureHeader) + #(loc.FailureHyperlinkLogText) + + #(loc.FailureRestartText) + + + + \ No newline at end of file diff --git a/Examples/Resource/Bundle4Theme.xml b/Examples/Resource/Bundle4Theme.xml new file mode 100644 index 0000000..517d7ff --- /dev/null +++ b/Examples/Resource/Bundle4Theme.xml @@ -0,0 +1,88 @@ + + + #(loc.Caption) + Segoe UI + Segoe UI + Segoe UI + Segoe UI + Segoe UI + + + #(loc.Title) + + #(loc.HelpHeader) + #(loc.HelpText) + + + + #(loc.Title) + + #(loc.InstallHeader) + #(loc.InstallMessage) + + Checkbox Option 1 + Checkbox Option 2 + + #(loc.InstallLicenseLinkText) + #(loc.InstallVersion) + #(loc.InstallAcceptCheckbox) + + + + + + #(loc.Title) + + #(loc.OptionsHeader) + #(loc.OptionsLocationLabel) + + + #(loc.OptionsLocationLabel2) + + + + Textbox + Useful Text + + Checkbox Option 3 + + + + + + #(loc.Title) + + #(loc.ProgressHeader) + #(loc.ProgressLabel) + #(loc.OverallProgressPackageText) + + + + + #(loc.Title) + + #(loc.ModifyHeader) + + + + + + #(loc.Title) + + #(loc.SuccessHeader) + + #(loc.SuccessRestartText) + + + + + #(loc.Title) + + #(loc.FailureHeader) + #(loc.FailureHyperlinkLogText) + + #(loc.FailureRestartText) + + + + \ No newline at end of file diff --git a/Examples/Resource/HyperlinkLocaleTheme.wxl b/Examples/Resource/HyperlinkLocaleTheme.wxl new file mode 100644 index 0000000..5bfb902 --- /dev/null +++ b/Examples/Resource/HyperlinkLocaleTheme.wxl @@ -0,0 +1,49 @@ + + + [WixBundleName] Setup + [WixBundleName] + Welcome ([UserLanguageID]) + Setup will install [WixBundleName] on your computer. Click install to continue, options to set the install directory or Close to exit. + Version [WixBundleVersion] + Are you sure you want to cancel? + Setup Help + /install | /repair | /uninstall | /layout [directory] - installs, repairs, uninstalls or creates a complete local copy of the bundle in directory. Install is the default. + +/passive | /quiet - displays minimal UI with no prompts or displays no UI and no prompts. By default UI and all prompts are displayed. + +/norestart - suppress any attempts to restart. By default UI will prompt before restart. + +/log log.txt - logs to a specific file. By default a log file is created in %TEMP%. + &Close + [WixBundleName] <a href="#">license terms</a>. + I &agree to the license terms and conditions + &Options + &Install + &Close + Version [WixBundleVersion] <a href="#">upgrade available</a> + Setup Options + Install location: + &Browse... + Database location: + B&rowse... + &OK + &Cancel + Setup Progress + Processing: + Initializing... + &Cancel + Modify Setup + &Repair + &Uninstall + &Close + Setup Successful + &Launch + You must restart your computer before you can use the software. + &Restart + &Close + Setup Failed + One or more issues caused the setup to fail. Please fix the issues and then retry setup. For more information see the <a href="#">log file</a>. + You must restart your computer to complete the rollback of the software. + &Restart + &Close + \ No newline at end of file diff --git a/Examples/Resource/HyperlinkTheme.wxl b/Examples/Resource/HyperlinkTheme.wxl new file mode 100644 index 0000000..955ba61 --- /dev/null +++ b/Examples/Resource/HyperlinkTheme.wxl @@ -0,0 +1,49 @@ + + + [WixBundleName] Setup + [WixBundleName] + Welcome + Setup will install [WixBundleName] on your computer. Click install to continue, options to set the install directory or Close to exit. + Version [WixBundleVersion] + Are you sure you want to cancel? + Setup Help + /install | /repair | /uninstall | /layout [directory] - installs, repairs, uninstalls or creates a complete local copy of the bundle in directory. Install is the default. + +/passive | /quiet - displays minimal UI with no prompts or displays no UI and no prompts. By default UI and all prompts are displayed. + +/norestart - suppress any attempts to restart. By default UI will prompt before restart. + +/log log.txt - logs to a specific file. By default a log file is created in %TEMP%. + &Close + [WixBundleName] <a href="#">license terms</a>. + I &agree to the license terms and conditions + &Options + &Install + &Close + Version [WixBundleVersion] <a href="#">upgrade available</a> + Setup Options + Install location: + &Browse... + Database location: + B&rowse... + &OK + &Cancel + Setup Progress + Processing: + Initializing... + &Cancel + Modify Setup + &Repair + &Uninstall + &Close + Setup Successful + &Launch + You must restart your computer before you can use the software. + &Restart + &Close + Setup Failed + One or more issues caused the setup to fail. Please fix the issues and then retry setup. For more information see the <a href="#">log file</a>. + You must restart your computer to complete the rollback of the software. + &Restart + &Close + \ No newline at end of file diff --git a/Examples/Resource/License.htm b/Examples/Resource/License.htm new file mode 100644 index 0000000..e15530b --- /dev/null +++ b/Examples/Resource/License.htm @@ -0,0 +1,127 @@ + + + + + + + + + + + +
+ +

[Put Your License Agreement Here]

+ +

Lorem +ipsum dolor sit amet, consectetur adipiscing elit. Donec ultricies ultricies +arcu id commodo. Ut dignissim ante nec urna elementum imperdiet. Praesent +pretium condimentum orci sit amet laoreet. Fusce condimentum tempor leo, vitae +tempor quam interdum et. Nulla ante dui, tincidunt sed porta nec, pulvinar in +felis. Pellentesque pellentesque ornare nibh id accumsan. In eu arcu nibh. +Aenean ut vulputate nisl. Proin at nibh lacinia urna elementum commodo. Donec semper +lorem quis neque fringilla quis facilisis dolor dignissim. Suspendisse a massa +in odio viverra vehicula. Curabitur id lectus purus, non bibendum arcu. Cras +dictum, turpis eget gravida condimentum, turpis ante varius leo, molestie +pulvinar mauris libero ut leo. Morbi libero diam, sollicitudin id interdum sit +amet, rhoncus eget turpis.

+ +

Vestibulum arcu dui, suscipit +vitae suscipit laoreet, posuere eget risus. Sed vitae massa in justo vehicula +elementum sed at arcu. Pellentesque arcu ante, accumsan sed lacinia sed, +lacinia vel urna. Vivamus at ligula nulla, lobortis ultricies tortor. Vivamus +suscipit dolor non velit adipiscing venenatis. Nullam adipiscing accumsan +condimentum. Nullam ut lorem neque, et iaculis felis. Donec sed massa diam, et +feugiat velit. Pellentesque facilisis mi a odio ultrices facilisis. Nam porta, +lorem feugiat aliquet placerat, ipsum risus accumsan sem, euismod bibendum +velit dolor sed turpis. Suspendisse tincidunt, lectus congue rhoncus +sollicitudin, magna erat porttitor ante, eget sodales ante sem eu augue. Aenean +risus risus, mattis vitae pretium at, venenatis dictum est. Vestibulum +consectetur euismod magna vel sodales.

+ +

Quisque eu urna lacus. Nunc eget +dictum odio. Pellentesque vel dolor leo. Praesent aliquet, erat vel fringilla +lobortis, ante nibh dapibus augue, sed semper ligula odio vitae nulla. Nullam +dictum gravida lectus nec lacinia. Vivamus fermentum ultricies lobortis. In +quis magna massa, ut commodo lectus. Donec nunc velit, gravida id euismod +luctus, luctus sed ante. Nunc elementum mollis sapien, ac interdum quam +fringilla eu. Pellentesque habitant morbi tristique senectus et netus et +malesuada fames ac turpis egestas. Aliquam dui enim, tempus vel aliquam sed, +pretium sed nisi. Fusce vitae magna nec nibh aliquam suscipit vel a felis. +Etiam gravida, lorem id laoreet gravida, nisl leo hendrerit dolor, quis porta +mauris enim vitae justo. Maecenas congue, felis at rhoncus vestibulum, nisl +urna pellentesque urna, id iaculis augue metus eget neque. Curabitur pretium +risus nec tortor vulputate et rhoncus ipsum gravida.

+ +

Maecenas elementum volutpat arcu, +nec ultricies velit faucibus facilisis. Etiam sem lacus, mattis eget gravida +ut, rhoncus porta lorem. Vivamus volutpat dui sit amet risus mollis venenatis. +Quisque velit velit, condimentum id pharetra sed, varius vitae lectus. Praesent +nisi turpis, porttitor nec accumsan a, aliquam sit amet augue. Quisque +facilisis enim sed enim pretium tristique. Aliquam commodo varius mi, ut +iaculis nunc tempus non. Vivamus velit nunc, dictum a dignissim vitae, commodo +id metus. Integer volutpat, neque at ultrices dignissim, felis nulla commodo +orci, at auctor nisl quam nec sem. Pellentesque interdum pellentesque nulla, ac +fermentum tortor porttitor a. Etiam condimentum aliquet sapien vel adipiscing. Quisque +est velit, vulputate a iaculis ut, tempus in nibh. Cras consectetur quam nibh, +vel lobortis justo. Aenean a elit leo. Aenean mollis dolor a odio accumsan +mollis. Proin blandit neque erat. Integer lectus urna, volutpat quis vulputate +et, fermentum et ante. Maecenas vitae ultricies dui.

+ +

Mauris accumsan varius luctus. In +hac habitasse platea dictumst. Mauris malesuada tempus nibh, porta accumsan +tortor tincidunt eu. Proin orci mauris, commodo id malesuada nec, adipiscing ut +sapien. Phasellus at dui vel nisi adipiscing auctor quis vel sem. Phasellus +fermentum, enim id sodales ullamcorper, magna sapien facilisis urna, ac +lobortis nunc augue ut ligula. Quisque vulputate nibh sed velit pharetra +dictum. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque +mi metus, vestibulum vitae dapibus vel, ultrices at tellus. Vivamus iaculis dui +a nisl faucibus eget congue velit gravida. Donec vel quam ligula. Nam magna +ante, vulputate id pharetra ac, dapibus commodo velit. Cras nisl nulla, congue +sit amet laoreet eget, cursus et lorem. Mauris diam tortor, porttitor vitae +fringilla id, iaculis sit amet eros. Donec sed enim eget felis fermentum +posuere. Pellentesque sodales feugiat dolor, vel molestie est adipiscing non. +Morbi tincidunt viverra felis ut hendrerit.

+ +
+ + + + diff --git a/Examples/Resource/License.rtf b/Examples/Resource/License.rtf new file mode 100644 index 0000000000000000000000000000000000000000..1a1832361851f096afcd4586d486d22aa13073a2 GIT binary patch literal 4908 zcmbVQON-n_5YE})|Ip_k#LU=ESbQ>0LISpNFfoKEhaRal(}`a0$K+u4zvru}erPtg zfEn+Oq*nD;-=liJb}o#^PA}f_N55T;r&p(LFynZj&q*(r!khbM_fJf)%)*G|9L`B_U!EI$H(W-zINYs7qb|r!|K#~KL#_{ zpkB2vkL?NnUL77@KXx~3{`uQ3!^!@}U0s z7=!wKjZVF@y;;0bZ!XT5*(^c*Y@GSCqrE+JXKV*G`{M(x`urJxORq~NJgU{1 zS=r6USqi!%)L<`*_1?}(FTp5&)GZooapicqoj2nKYq0c3r;VrmY|aFWYba!}v_t&7 zy55!=)ud5BJ@Zray}7$Fn0do?CbKr`W`i~=ee)%1ybfi!0qfDjAL2A=sceY0QNb>~ z9U?05W>8oqXezl;Tbyoo(GHKR5jc1hYo-a68UH03we5ddu|bEu+Vhp*(0w0gua{Q+ zvM3W3!$cQb^#(N2i$Y^>aoS?g1d;U;)MMgy!?@gBMYwDiPd;|3e&&VGs3 zqjoB8bm*R?o${9>7Q+s3S^8dD)T&R>Zw8QiuuH31d#`E7>tI(vc{9#wbu(An$4R&9 zZFKr+3Dg0v2W~SiD1|kvK+|0z(Y1L6UNqK8+CuZ|#Vmw8yAT-Ygn|>s=t*OvXKL8|?i;_K8Zk z-e4(Ygb2)9zYZD_5mSRBu;WCmSKLM_=TBNLP}hZ!*>-7{rISgs3IYHZstooakvA^I z5#3T5Nj<*;7;+-GA6po(Bq@A|OE20GU*PsUX&@~o0J5%2M5Mj|bb^BJsy3I&3~g}e zkP#1hgMNVvVF5EhH?m)f5R%DJUa%$#GgEEZrc#qA$&$XRL`LIMT2&e4V%YxKfCVL1 ze?x|qY&^9;C+tGtFoBw4k#MaH^%Ti(!5RLa_d}b_pq6-rVUmVCwr>_Pi|TuvhZQvg zlfLtqE4e!sRWq9@0v{eoZA3;3Q=y9mQvwVVHxcckhLMk$A^>#1b9o;$`u&Eq1fjt^ zm02w103r*IQ~S7~xX8|xnMiFyAljVs**Hl9)B(=e@?^1NS}xnhj{)wV5zOkQz>*1~ zUZLQn@K9I8mNO2{#>8tRHf0(}X+zZ~(Xe?VaJ0cxhKLjOHu8Eh+N|SS(GK#F-o;Y5 zn;hsH7!0y0Ss$}iVJIVvDJiR+H^X##;? zRQpUEuJ~iz6n5=f%S`~g#oWY2%D7Q`0o`RItz$L@+oUlfWC9k0p$z6ctnL#|c7-6J zWQ0xRaVe=k4f1rZ0Ud3ZP6gIdLc-rb+L z%1KPug{I}nf*&ReGI z@{T>MdX`|^s&_n={*MFuU8Z9SX8jY5%ZWyKktZa)AI`()dy4S@aS*1}ak6j-VZ<5pu7PmPvBDzD9jv&g3m5HQKl2& z6JyK_%ZH9McMw*v2x=5&XSmpo#+(6i%B?!eXLNZh=vGFVwj1$BD}Or4aTb53`sQDO CvIZgm literal 0 HcmV?d00001 diff --git a/Examples/Resource/Logo.png b/Examples/Resource/Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..8bc70e8e6ee7f8c3eaa526cffe98696b52427d00 GIT binary patch literal 886 zcmV-+1Bv{JP)00004XF*Lt006O$ zeEU(80000WV@Og>004&%004{+008|`004nN004b?008NW002DY000@xb3BE200009 za7bBm000XP000XP0YJXtK>z>%8gxZibW?9;ba!ELWdKlNX>N2bPDNB8b~7$DE-^4L z^m3s900PEIL_t(&L+w~wcIz+*%m%vWuBzYJSu2MGVFKq?RGtH zz`)Pfmc%Fi`v&9399eluJ7iB@Vi>&c zR6C3n@up%uc&scbh5&ON5f2KRC^0|9lJ$n^(_;Xvxm!!%12Z%0n_@`!0NY4_!PpWy z8FXTrqxyi>L$bpLww}YVr9i!9!QGBT?uVZ3PTz$bH2oED=55o|1VXxN*Cy8|LQ4VP zVYXQ@h7bewV0MwzIYuW)3`q5(ph7_u=@MIZuOdw?b-Meds4Z(Si5a!mWL+r|DzgDR zsL*+1+1bUvTR7UFLIwbGY#}zBCy9cr32IL^y$2E{Td$5G*;`{x=mBF3Mz#m;kfLe= zl6Yk)rPwphn=Qmxq~8E$M_IKX?}473TB72!kMow==FAYg(Y!G&=z(bhG%F4zO{@ke zISAM2bAEZgj2t%p+m;EEyoCy`;fIa%W!Ka(@<|}`r_^p@OO!;hU-jz<`1JbOJi7rckjj=}$qY{@U}mu09)hp9R}Q8sCq&K1$zzFD6>1+e-XANxTM^+l9aHL3u$XE#~N!1K#Ry>7Ft(_G^G z(OW-pUFyGXOzZ(&F?zazAnXBy9@&L=I}`}8H6zLdGM2cU!Ob~7m(VpK=s9f7h%$kU zB`#-hbB@m?bWI3)4qG##Odw;4%Ng99<8ujJ6M~+@){H0<$T-{OA3g@i=RCp{S8d^EHNYS#-fB*RkJ` zTPriPN+>dvh9-t_4KXOy_+o6a2Fd+5o&Jp9e$M%v=lQ(O^E~JIJm>Q{=bh?7{1u_B zqYQ(=5N@tGlFYJUFu6=6xXk-v<8ef06wW&xbArLDGgQ|76=5(q%){NwS;k>?h=ha$ z9*?)Rwe|J*@A`KF|2Go=dHG$k%kH@3>JtHjA)CH#xtSx?JQ>uXJD;Q<4-cY8`2&G4 z4}WSH9ZhuhGGthxZO|ACi$&m17)+_i4d>()?fa>4>dJ(PnzQ}KwZjV<#)<* z+IJ?m?&FlOXDa3-_IYtnAilQf=fkQ0==Q!^>f(?0(Bi8i^H|+8*`qve<4+W{14R&E zz5XU{ygSg?ZDYgy!AH;O|CHqkUFYLbol*hPAa00$ic3C$>g=#JW%?Y#0NQfEEJI^a%10;mM`Eq5L<>nsATm z6}Q*sz zV_QW7Jcwq`)ke$cSl#OVroSti9+UMaqhle{H`Pl9L$n3n+(R6 zg}mki=OKl$OlQ{qOC?kw=wtF&=ko%hWn;IE~-MDc-t*0JM7!2FKhH zhfz;w>}-uL(7HKi=Q;g8a^GgS8TEto88kOz4cqu!

V=|G~23-Y1jg)61b^pNJKt z);cbFXm~y@W}LM1Y+at=9N9&%)Y8mJAN5taC~`kte-<}KZt+yTrFb5SYWt-|HT-BU zc~*`_Tt+V-%URul&#TwcW-RZT*>8=Ve0z=@Oz93BnZlvKE4_DxkI%J*Uyo=WAHD1g z5YsQCbMLTQmDg$)B!Q7l_ZtTid?`W6l4zSV*RQ_IuPsvv;)<21=hNn`4*q5`NPdm9 zt(zkNrbV}ZB1_BmYJwr|`@yHFZ#z*c{oSatQ3S=(B9uaEj1zqnG%@3g%WFTUaH6%} z0^U^h_au!!xKF8SXOzHFqL!xFYno?SPJw2W($9=!D;GPp0XU}>4W5fe36Oml?QcX~mf2|;V-tq?% z%KDnE!qVb1w%%q_sPtkndZjx!>Puv5M8aRx23+3Gxs4GAbtJ^utCiW0vQPoZ@_)CU zV8rcFtTBr+Xs|G{ia1rdJgb zUYSBEtLA(1NGkU%@ob!9hm#xA1VZc?48ad#JfCj2g@19QOG81J$`pVRZu3Dj~A z=%1&SJ4@1|QB;?E%)$_jWKwEP?EW70hjiieb>P9~l^-Aahe=NNIzZJQ`dCpSmEyso zRVUU`x@n}`6WtX^sQ=qSc=xd1_x78!)CU$1?>yOx&(NRTv3Lmk2P;`L)y~p2F#z5b z7Y(QLb+;MhMjHr*2RT#p)dNvQ(}!~9L(b#5waRz3$VvU@W*_|mM)Z0w+q z%rWUQ!GD45!$K#d6G;k!u%jv4Mfl0_)`0Y}9hG2tkKzdFi)h1=bZ zaYkg&e8N!nHamz`py%V#`ba7xpmK8wEot|nH>kKPOu+J$+*e^53_JO3vGhzUzy4!b zzamGm)KFH*GxO=Wn$QLw--%Hxk?%)l=N{8yxw?i~YRh^GFlrR>0|3VDv;%~njK@(J zSwdfCVTdgJD5E;HZ6ae~Qmy4Ep1i5cav(FRB=QT`%qJpxqG&tmk4{}#bc|Dytaz-> zIaGd6+rUP7`O4Y7?RDZ+am8X`Jem!^FfI{Z{d{fUY~{0gSFobX+_HzRjal~g2Bql3 zh^I|xPgWr%$s(qa??(i=#cJMBpjzi97w3n(w1cPjo+SI)o2zd2-O2S{Q7bHRFlIZ~ zD}V?l4;>hU=|H4@C~0E7DAEha(-pr?_NR+JO(b~#?d|J5z)PJ$9j=Ivji@WE@$eXqqlzP zYJN`8fFeglkVl|yBP?^L0j*3c&g*Ef)N8faxkq=`vb3h^6ocSajd?QUZO4F%|| zZI>dstl!Cw-I#O&M8{HoK)jm)FyC<#3eM_*9TJ&D(BTb20cL<4w(TG~w;!UXS|?Np zUwTb^6AEQQ$v5S2PoOxVC$9G*g8ishuu8Pn@hlYqwv~1-c1v|H|8Zcmmz?OUqH}X5 K;wq2$CH)WO!icZ{ literal 0 HcmV?d00001 diff --git a/Examples/Resource/SplashScreen.bmp b/Examples/Resource/SplashScreen.bmp new file mode 100644 index 0000000000000000000000000000000000000000..1d9b1e448c85644804e3ad1c29d205a03d843909 GIT binary patch literal 14278 zcmeHNyN=wt8Rh^1&O)=RXHc0wK+*~+jTss+VjaLhMk>yO5XcLpH?R_5)%KW?lFc%iV7%i6Z&&zmb&m*Ym&s!c6+}9~k>1j{X7s0vyoqqr~m;pKo1P8$M}1e0Xa|s0%!pJH(1lkGUPc>0Rm`%9vH0I7Up1dy)WD^5c>d#E&C@o?kgw@xRL9RSwh< zUtkYPN!hk-U6;>wUE`>eQYqT#oyYfaP_iux&UsN3rS4r5!Lhk?X+h=A-tF!CIiP>^ zRn*;b(8`ELvn$#c@Yu;g$$CczmS!#Ql*TR&sw>i>+ZMEv5RU6uvn^VGwu{XU4yxt+ zYNL{;Y058=Mpy8AgmII@O$MXlDXbDSil_uxg3~S`;HFy~I?k^s!SvFlr5d#gCM;CV z>zx|8&OsIFRV^3}b!tZ}YiOj4gO>$w*rF}habIH3u|vNAoNbUJ=EH`FP22JAdbhnOF7-yLxPVf?wnn}q|sM3O0TI;$hd3x(g-loY-IjF+a(lvLa z!aGI_uP9U359d#B5H~uc))>~uLnz_NH`4C997?Z2a_9D8>xE{t^86IKI(#CPz9!*1 zKYSns>v6L41EY6tAItP&3lX*Ds7{fD(S|E~6E8m{(HKy=CWm{BL3a=hqR`>sr#N7( z4VNaG`0B5ke2v3puUGn(f zhN7B?!rA0dl(uO9FZ{vY?6mT2p$#G$PK?CXTFPN621!!Tt*MIDwNI^|BoGwmZfFEQ z(FAoC)6$Z|rLgSGuY7t8>1i^3sB09-w=SqnM*j=p(s}2v zPJHa7XN?p0o~il8iJWReJH}p{B)%EVA>lqEIq&?t=fI8kf<#<;NgpXcQB7zL%aw!X zytD@y<3luuWBtZ;ni#DsKW8SToi>ixR`^E*GA&KZWa=~o@I#iD<`(zk+76dUoQ&r1 zDF5aMZdTCJi{&VtlO|_~!bUL1fvy=mhs8?Lc01=l=ByZ~->YC6XYHLKIy|Zn#vlr? zK&jIOSw}y`d2_P2@dKZ87=v??Kz$j5Otg2#=unJAVLxjYb&JO)Xq<+pgatwDn!Cr& z8$@g!3#f3S7gI4h)MGSUR^uU5iliqk8m12)zeFcpbI^qxl%My4!1cNz3I!CS{2`Q} zCH5W?>gtPmB1h*;EFj70ii0jVcx6O^n+P3@1K~P!t3!9t5{t9yNCwUicmzPjvSUr_ zl@SGQW~$KDQAY7=wFNCP>$lp_Xn?f-NX!Fk+*w-6!FfgyxDC*;t2P{(g?7{ugWsB` zFX~-%1Rs}(HWn-EC5O?5${=t%J~H^QqP8YuE+k=rXP-L6 z0{vJUZxQrr!X+9Gh@H-swrd=;YXpJ&`8w*|2Wq$P3I%63dtwFQIZRYfOk(Pws~oWH z4WbX`9`)|(_yvtG2zw0aIZVe(9dxqyUgZF@43kvY*+jj&I%evCNx6c!ti=-mlc*-N z?R`u9{_pK%=ey29{p@FF#(Y;n@2-k=MU#9%ki%H;$2Ule3F>2_FY9zn$g`Mr4rAv# zifd`&DW))lBySL5X+7$v{W>|4F*8@~&&}tPF&vXUMKlq^A%tch)v?d9y_&~!vE!RZ z>vAAt_LfJcDqAOR{QT_3(~BVy9?RV9-QKXy!K)aheoH~8Y*VQYJ@~MmU@e80oOq#Q zR(zrS*18(;QH99KPWr8{ zU023>w~kgh5OW~IrSaQGaNB%X>cfIpyx~P0h&e=)oQ&5;aNB&?@dHY7o zTvd7rZ|C%f4JMVHE+Q2!+Z^zEg$mU-x-N%UYC0$;kLsp{cbw6O z0@G@1a+uzMiIG1CQOwJBpX06Xx)k=v0lld9&aVj;%=G)(&2j9J16tJYt~c9Q^tiYn z@t97J5=^U4tiMlDyp`hsp&7*kjjfWwcnCm8~Cj3J2;q@^jB*3 m3%-|szW2QxW=_>~-wpTg4%7Hr2@5mk;mDlV?OW^+m$TjK! literal 0 HcmV?d00001 diff --git a/Examples/Setup.wxs b/Examples/Setup.wxs new file mode 100644 index 0000000..946a98a --- /dev/null +++ b/Examples/Setup.wxs @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Examples/Template bafunctions/IBootstrapperBAFunction.h b/Examples/Template bafunctions/IBootstrapperBAFunction.h new file mode 100644 index 0000000..c0c9b3b --- /dev/null +++ b/Examples/Template bafunctions/IBootstrapperBAFunction.h @@ -0,0 +1,29 @@ +//------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2004, Outercurve Foundation. +// This software is released under Microsoft Reciprocal License (MS-RL). +// The license and further copyright text can be found in the file +// LICENSE.TXT at the root directory of the distribution. +// +//------------------------------------------------------------------------------------------------- + +#pragma once + +#include + +#include "IBootstrapperEngine.h" + +interface IBootstrapperBAFunction +{ + STDMETHOD(OnDetect)() = 0; + STDMETHOD(OnDetectComplete)() = 0; + STDMETHOD(OnPlan)() = 0; + STDMETHOD(OnPlanComplete)() = 0; +}; + +extern "C" typedef HRESULT (WINAPI *PFN_BOOTSTRAPPER_BA_FUNCTION_CREATE)( + __in IBootstrapperEngine* pEngine, + __in HMODULE hModule, + __out IBootstrapperBAFunction** ppBAFunction + ); + diff --git a/Examples/Template bafunctions/Readme.txt b/Examples/Template bafunctions/Readme.txt new file mode 100644 index 0000000..c94074a --- /dev/null +++ b/Examples/Template bafunctions/Readme.txt @@ -0,0 +1,85 @@ + +This is a sample project showing how to create a BA function assembly. + +The four interfaces are in the WixBootstrapperBAFunction.cpp file. + + +Example code: +~~~~~~~~~~~~~ + + + HRESULT hr = S_OK; + HKEY hkKey = NULL; + LPWSTR sczValue = NULL; + LPWSTR sczFormatedValue = NULL; + + + //--------------------------------------------------------------------------------------------- + // Example of BA function failure + hr = E_NOTIMPL; + BalExitOnFailure(hr, "Test failure."); + //--------------------------------------------------------------------------------------------- + + //--------------------------------------------------------------------------------------------- + // Example of setting a variables + hr = m_pEngine->SetVariableString(L"Variable1", L"String value"); + BalExitOnFailure(hr, "Failed to set variable."); + hr = m_pEngine->SetVariableNumeric(L"Variable2", 1234); + BalExitOnFailure(hr, "Failed to set variable."); + //--------------------------------------------------------------------------------------------- + + //--------------------------------------------------------------------------------------------- + // Example of reading burn variable. + BalGetStringVariable(L"WixBundleName", &sczValue); + BalExitOnFailure(hr, "Failed to get variable."); + + hr = m_pEngine->SetVariableString(L"Variable4", sczValue); + BalExitOnFailure(hr, "Failed to set variable."); + //--------------------------------------------------------------------------------------------- + + ReleaseNullStr(sczValue); // Release string so it can be re-used + + //--------------------------------------------------------------------------------------------- + // Examples of reading burn variable and formatting it. + BalGetStringVariable(L"InstallFolder", &sczValue); + BalExitOnFailure(hr, "Failed to get variable."); + + hr = m_pEngine->SetVariableString(L"Variable5", sczValue); + BalExitOnFailure(hr, "Failed to set variable."); + + BalFormatString(sczValue, &sczFormatedValue); + BalExitOnFailure(hr, "Failed to format variable."); + + hr = m_pEngine->SetVariableString(L"Variable6", sczFormatedValue); + BalExitOnFailure(hr, "Failed to set variable."); + //--------------------------------------------------------------------------------------------- + + ReleaseNullStr(sczValue); // Release string so it can be re-used + + //--------------------------------------------------------------------------------------------- + // Example of reading 64 bit registry and setting the InstallFolder variable to the value read. + hr = RegOpen(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v3.5", KEY_READ | KEY_WOW64_64KEY, &hkKey); + BalExitOnFailure(hr, "Failed to open registry key."); + + hr = RegReadString(hkKey, L"InstallPath", &sczValue); + BalExitOnFailure(hr, "Failed to read registry value."); + + // Example of function call + PathBackslashTerminate(&sczValue); + + hr = m_pEngine->SetVariableString(L"InstallFolder", sczValue); + BalExitOnFailure(hr, "Failed to set variable."); + //--------------------------------------------------------------------------------------------- + + ReleaseNullStr(sczValue); // Release string so it can be re-used + + //--------------------------------------------------------------------------------------------- + // Example of calling a function that return HRESULT + hr = GetFileVersion(); + BalExitOnFailure(hr, "Failed to get version."); + //--------------------------------------------------------------------------------------------- + + LExit: + ReleaseRegKey(hkKey); + ReleaseStr(sczValue); + ReleaseStr(sczFormatedValue); diff --git a/Examples/Template bafunctions/Version.proj b/Examples/Template bafunctions/Version.proj new file mode 100644 index 0000000..109f83f --- /dev/null +++ b/Examples/Template bafunctions/Version.proj @@ -0,0 +1,72 @@ + + + + 1 + 0 + + .\bafunctionsver.h + + + + $([System.DateTime]::new(2000, 1, 1)) + $([System.Convert]::ToInt32($([System.DateTime]::Now.ToUniversalTime().Subtract($(Base)).TotalDays))) + $([System.Convert]::ToInt32($([MSBuild]::Divide($([System.Convert]::ToInt32($([System.DateTime]::Now.ToUniversalTime().TimeOfDay.TotalSeconds))), 2)))) + + $(MajorBuildNumber).$(MinorBuildNumber).$(BuildNumber).$(BuildRevision) + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Examples/Template bafunctions/WixBootstrapperBAFunction.cpp b/Examples/Template bafunctions/WixBootstrapperBAFunction.cpp new file mode 100644 index 0000000..34baaa7 --- /dev/null +++ b/Examples/Template bafunctions/WixBootstrapperBAFunction.cpp @@ -0,0 +1,134 @@ +//------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2004, Outercurve Foundation. +// This software is released under Microsoft Reciprocal License (MS-RL). +// The license and further copyright text can be found in the file +// LICENSE.TXT at the root directory of the distribution. +// +//------------------------------------------------------------------------------------------------- + + +#include "precomp.h" + +class CWixBootstrapperBAFunction : IBootstrapperBAFunction +{ +public: + STDMETHODIMP OnDetect() + { + HRESULT hr = S_OK; + + BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "Running detect BA function"); + + //------------------------------------------------------------------------------------------------- + // YOUR CODE GOES HERE + BalExitOnFailure(hr, "Change this message to represent real error handling."); + //------------------------------------------------------------------------------------------------- + + LExit: + return hr; + } + + + STDMETHODIMP OnDetectComplete() { return S_OK; } + STDMETHODIMP OnPlan() { return S_OK; } + STDMETHODIMP OnPlanComplete() { return S_OK; } + +/* + STDMETHODIMP OnDetectComplete() + { + HRESULT hr = S_OK; + + BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "Running detect complete BA function"); + + //------------------------------------------------------------------------------------------------- + // YOUR CODE GOES HERE + BalExitOnFailure(hr, "Change this message to represent real error handling."); + //------------------------------------------------------------------------------------------------- + + LExit: + return hr; + } + + + STDMETHODIMP OnPlan() + { + HRESULT hr = S_OK; + + BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "Running plan BA function"); + + //------------------------------------------------------------------------------------------------- + // YOUR CODE GOES HERE + BalExitOnFailure(hr, "Change this message to represent real error handling."); + //------------------------------------------------------------------------------------------------- + + LExit: + return hr; + } + + + STDMETHODIMP OnPlanComplete() + { + HRESULT hr = S_OK; + + BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "Running plan complete BA function"); + + //------------------------------------------------------------------------------------------------- + // YOUR CODE GOES HERE + BalExitOnFailure(hr, "Change this message to represent real error handling."); + //------------------------------------------------------------------------------------------------- + + LExit: + return hr; + } +*/ + + +private: + HMODULE m_hModule; + IBootstrapperEngine* m_pEngine; + + +public: + // + // Constructor - initialize member variables. + // + CWixBootstrapperBAFunction( + __in IBootstrapperEngine* pEngine, + __in HMODULE hModule + ) + { + m_hModule = hModule; + m_pEngine = pEngine; + } + + // + // Destructor - release member variables. + // + ~CWixBootstrapperBAFunction() + { + } +}; + + +extern "C" HRESULT WINAPI CreateBootstrapperBAFunction( + __in IBootstrapperEngine* pEngine, + __in HMODULE hModule, + __out CWixBootstrapperBAFunction** ppBAFunction + ) +{ + HRESULT hr = S_OK; + CWixBootstrapperBAFunction* pBAFunction = NULL; + + // This is required to enable logging functions + BalInitialize(pEngine); + + pBAFunction = new CWixBootstrapperBAFunction(pEngine, hModule); + ExitOnNull(pBAFunction, hr, E_OUTOFMEMORY, "Failed to create new bootstrapper BA function object."); + + *ppBAFunction = pBAFunction; + pBAFunction = NULL; + +LExit: + delete pBAFunction; + return hr; +} diff --git a/Examples/Template bafunctions/bafunctions.cpp b/Examples/Template bafunctions/bafunctions.cpp new file mode 100644 index 0000000..16b6543 --- /dev/null +++ b/Examples/Template bafunctions/bafunctions.cpp @@ -0,0 +1,37 @@ +//------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2004, Outercurve Foundation. +// This software is released under Microsoft Reciprocal License (MS-RL). +// The license and further copyright text can be found in the file +// LICENSE.TXT at the root directory of the distribution. +// +// +//

+// Entry point for bootstrapper BA function DLL. +// +//------------------------------------------------------------------------------------------------- + +#include "precomp.h" + +static HINSTANCE vhInstance = NULL; + +extern "C" BOOL WINAPI DllMain( + IN HINSTANCE hInstance, + IN DWORD dwReason, + IN LPVOID /* pvReserved */ + ) +{ + switch(dwReason) + { + case DLL_PROCESS_ATTACH: + ::DisableThreadLibraryCalls(hInstance); + vhInstance = hInstance; + break; + + case DLL_PROCESS_DETACH: + vhInstance = NULL; + break; + } + + return TRUE; +} diff --git a/Examples/Template bafunctions/bafunctions.def b/Examples/Template bafunctions/bafunctions.def new file mode 100644 index 0000000..6e721f1 --- /dev/null +++ b/Examples/Template bafunctions/bafunctions.def @@ -0,0 +1,16 @@ +;------------------------------------------------------------------------------------------------- +; +; Copyright (c) 2004, Outercurve Foundation. +; This software is released under Microsoft Reciprocal License (MS-RL). +; The license and further copyright text can be found in the file +; LICENSE.TXT at the root directory of the distribution. +; +; +; +; Bootstrapper Application function DLL entry points. +; +;------------------------------------------------------------------------------------------------- + +EXPORTS + CreateBootstrapperBAFunction + diff --git a/Examples/Template bafunctions/bafunctions.rc b/Examples/Template bafunctions/bafunctions.rc new file mode 100644 index 0000000..d3fcf9f --- /dev/null +++ b/Examples/Template bafunctions/bafunctions.rc @@ -0,0 +1,129 @@ +//------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2004, Outercurve Foundation. +// This software is released under Microsoft Reciprocal License (MS-RL). +// The license and further copyright text can be found in the file +// LICENSE.TXT at the root directory of the distribution. +// +// +// +// WiX Extendend Bootstrapper BA function resource file. +// +//------------------------------------------------------------------------------------------------- + +#include +#include +#include "bafunctionsver.h" + +#define VER_APP +#define VER_ORIGINAL_FILENAME "bafunctions.dll" +#define VER_INTERNAL_NAME "bafunctions" +#define VER_PRODUCT_NAME "WiX Bootstrapper functions" +#define VER_FILE_DESCRIPTION "WiX Bootstrapper functions" + +#ifdef DEBUG + #define VER_DEBUG VS_FF_DEBUG + #define VER_PRIVATE_BUILD VS_FF_PRIVATEBUILD + #define VER_PRE_RELEASE (VS_FF_PRERELEASE | VS_FF_SPECIALBUILD) +#else + #define VER_DEBUG 0 + #define VER_PRIVATE_BUILD 0 + #define VER_PRE_RELEASE 0 +#endif + +#if defined(VER_APP) + #define VER_FILE_TYPE VFT_APP +#elif defined(VER_DLL) + #define VER_FILE_TYPE VFT_DLL +#elif defined(VER_TYPELIB) + #define VER_FILE_TYPE VFT_UNKNOWN +#else + #define VER_FILE_TYPE VFT_UNKNOWN +#endif + +#if defined(VER_LANG_NEUTRAL) + #ifndef VER_LANG + #define VER_LANG 0x0000 + #endif + #ifndef VER_CP + #define VER_CP 0x04E4 + #endif + #ifndef VER_BLOCK + #define VER_BLOCK "000004E4" + #endif +#else + #ifndef VER_LANG + #define VER_LANG 0x0409 + #endif + #ifndef VER_CP + #define VER_CP 0x04E4 + #endif + #ifndef VER_BLOCK + #define VER_BLOCK "040904E4" + #endif +#endif + +#define VER_FILE_VERSION rmj, rmm, rbd, rev +#define VER_PRODUCT_VERSION rmj, rmm, rbd, rev +#define VER_FILE_VERSION_STRING szVerMajorMinorBuildRev +#define VER_PRODUCT_VERSION_STRING VER_FILE_VERSION_STRING +#define VER_FILE_FLAGS_MASK VS_FFI_FILEFLAGSMASK +#define VER_FILE_FLAGS (VER_DEBUG | VER_PRIVATE_BUILD | VER_PRE_RELEASE) + +#define VER_FILE_OS VOS__WINDOWS32 + +#define VER_COMPANY_NAME "Outercurve Foundation" +#ifndef VER_PRODUCT_NAME + #define VER_PRODUCT_NAME "Windows Installer XML (WiX)" +#endif +#ifndef VER_FILE_DESCRIPTION + #define VER_FILE_DESCRIPTION "Windows Installer XML (WiX) component" +#endif + +#if defined(VER_LEGAL_COPYRIGHT) + #error +#endif +#define VER_LEGAL_COPYRIGHT "Copyright (c) Outercurve Foundation.\240 All rights reserved." + +#if !defined(VER_FILE_SUBTYPE) + #define VER_FILE_SUBTYPE 0 +#endif + +#ifdef RC_INVOKED + +VS_VERSION_INFO VERSIONINFO +FILEVERSION VER_FILE_VERSION +PRODUCTVERSION VER_PRODUCT_VERSION +FILEFLAGSMASK VER_FILE_FLAGS_MASK +FILEFLAGS VER_FILE_FLAGS +FILEOS VER_FILE_OS +FILETYPE VER_FILE_TYPE +FILESUBTYPE VER_FILE_SUBTYPE +BEGIN +BLOCK "StringFileInfo" + BEGIN + BLOCK VER_BLOCK + BEGIN + VALUE "CompanyName", VER_COMPANY_NAME + VALUE "FileDescription", VER_FILE_DESCRIPTION + VALUE "FileVersion", VER_FILE_VERSION_STRING + VALUE "InternalName", VER_INTERNAL_NAME + + VALUE "LegalCopyright", VER_LEGAL_COPYRIGHT + + VALUE "OriginalFilename", VER_ORIGINAL_FILENAME + VALUE "ProductName", VER_PRODUCT_NAME + VALUE "ProductVersion", VER_FILE_VERSION_STRING +#if defined(DEBUG) + VALUE "WiX Common Resource Format", "Debug Only" +#endif + END + END + +BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", VER_LANG, VER_CP + END +END + +#endif diff --git a/Examples/Template bafunctions/bafunctions.vcxproj b/Examples/Template bafunctions/bafunctions.vcxproj new file mode 100644 index 0000000..02b4cf9 --- /dev/null +++ b/Examples/Template bafunctions/bafunctions.vcxproj @@ -0,0 +1,134 @@ + + + + + + Debug + Win32 + + + Release + Win32 + + + + {EB0A7D51-2133-4EE7-B6CA-87DBEAC67E02} + BaFunctions + Win32Proj + DynamicLibrary + MultiByte + bafunctions + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + $(Configuration)\ + $(Configuration)\ + true + AllRules.ruleset + + + $(Configuration)\ + $(Configuration)\ + true + AllRules.ruleset + + + + + + + + + + Disabled + $(WiX)SDK\VS2010\inc;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_LIB;DEBUG;%(PreprocessorDefinitions);$(ExtraDefinitions) + true + EnableFastChecks + MultiThreadedDebug + Use + precomp.h + $(IntDir)$(ProjectName).pdb + Level4 + ProgramDatabase + StdCall + true + + + %(AdditionalIncludeDirectories) + + + dutil.lib;balutil.lib;comctl32.lib;gdiplus.lib;shlwapi.lib;wininet.lib;version.lib;%(AdditionalDependencies) + $(WiX)SDK\VS2010\lib\x86;%(AdditionalLibraryDirectories) + bafunctions.def + true + Windows + + + + + Disabled + $(WiX)SDK\VS2010\inc;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions);$(ExtraDefinitions) + true + EnableFastChecks + MultiThreaded + Use + precomp.h + $(IntDir)$(ProjectName).pdb + Level4 + ProgramDatabase + StdCall + true + + + %(AdditionalIncludeDirectories) + + + dutil.lib;balutil.lib;comctl32.lib;gdiplus.lib;shlwapi.lib;wininet.lib;version.lib;%(AdditionalDependencies) + $(WiX)SDK\VS2010\lib\x86;%(AdditionalLibraryDirectories) + bafunctions.def + false + Windows + + + + + + Create + Create + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Examples/Template bafunctions/bafunctions.vcxproj.filters b/Examples/Template bafunctions/bafunctions.vcxproj.filters new file mode 100644 index 0000000..2212a5f --- /dev/null +++ b/Examples/Template bafunctions/bafunctions.vcxproj.filters @@ -0,0 +1,47 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav + + + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + Header Files + + + + + Source Files + + + + + + Resource Files + + + \ No newline at end of file diff --git a/Examples/Template bafunctions/bafunctionsver.h b/Examples/Template bafunctions/bafunctionsver.h new file mode 100644 index 0000000..2046f30 --- /dev/null +++ b/Examples/Template bafunctions/bafunctionsver.h @@ -0,0 +1,12 @@ +// +#ifndef _VERSION_FILE_H_ +#define _VERSION_FILE_H_ + +#define szVerMajorMinor "1.0" +#define szVerMajorMinorBuildRev "1.0.0.0" +#define rmj 1 +#define rmm 0 +#define rbd 0 +#define rev 0 + +#endif diff --git a/Examples/Template bafunctions/build.bat b/Examples/Template bafunctions/build.bat new file mode 100644 index 0000000..9356ca1 --- /dev/null +++ b/Examples/Template bafunctions/build.bat @@ -0,0 +1,23 @@ +@echo off + +echo Configuring environment... +set MSBUILD="%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\msbuild.exe" +echo. + +set outdir=%~dp0build + +rem %MSBUILD% Version.proj +%MSBUILD% bafunctions.vcxproj /t:Rebuild /p:Configuration=Release,Platform=Win32 /p:RunCodeAnalysis=false /p:DefineConstants="TRACE" /p:OutDir="%outdir%\\" /l:FileLogger,Microsoft.Build.Engine;logfile=build.log +if %errorlevel% neq 0 ( + echo Build failed + pause + goto :EOF +) + +echo. + +goto :EOF + +REM ***************************************************************** +REM End of Main +REM ***************************************************************** diff --git a/Examples/Template bafunctions/precomp.h b/Examples/Template bafunctions/precomp.h new file mode 100644 index 0000000..a90e2a4 --- /dev/null +++ b/Examples/Template bafunctions/precomp.h @@ -0,0 +1,52 @@ +//------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2004, Outercurve Foundation. +// This software is released under Microsoft Reciprocal License (MS-RL). +// The license and further copyright text can be found in the file +// LICENSE.TXT at the root directory of the distribution. +// +// +// +// Precompiled header for standard bootstrapper application. +// +//------------------------------------------------------------------------------------------------- + +#pragma once + + +#include +#include +#include +#include +#include +#include +#include +#include + +// Standard WiX header files, include as required +#include "dutil.h" +//#include "memutil.h" +//#include "dictutil.h" +//#include "dirutil.h" +#include "fileutil.h" +//#include "locutil.h" +//#include "logutil.h" +#include "pathutil.h" +//#include "resrutil.h" +//#include "shelutil.h" +#include "strutil.h" +//#include "thmutil.h" +//#include "uriutil.h" +//#include "xmlutil.h" +#include "regutil.h" + +//#include "IBootstrapperEngine.h" +//#include "IBootstrapperApplication.h" + +#include "BalBaseBootstrapperApplication.h" +//#include "balinfo.h" +//#include "balcondition.h" +#include "balutil.h" + +#include "IBootstrapperBAFunction.h" + diff --git a/Examples/Template bafunctions/resource.h b/Examples/Template bafunctions/resource.h new file mode 100644 index 0000000..53c03c3 --- /dev/null +++ b/Examples/Template bafunctions/resource.h @@ -0,0 +1,25 @@ +//------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2004, Outercurve Foundation. +// This software is released under Microsoft Reciprocal License (MS-RL). +// The license and further copyright text can be found in the file +// LICENSE.TXT at the root directory of the distribution. +// +//------------------------------------------------------------------------------------------------- + +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// +#define IDC_STATIC -1 + + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 102 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1003 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/Examples/bafunctions.dll b/Examples/bafunctions.dll new file mode 100644 index 0000000000000000000000000000000000000000..ae079bb5d75cdad03b80873807f2e574d2aa5ecc GIT binary patch literal 74240 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 WxWIu69Js)N3mmw>f&b?@@P7ar^lNMY literal 0 HcmV?d00001 diff --git a/LICENSE.TXT b/LICENSE.TXT new file mode 100644 index 0000000..9e34401 --- /dev/null +++ b/LICENSE.TXT @@ -0,0 +1,28 @@ +Copyright (c) 2004, Outercurve Foundation. +This software is released under the Microsoft Reciprocal License (MS-RL) (the "License"); you may not use the software except in compliance with the License. + +The text of the Microsoft Reciprocal License (MS-RL) can be found online at: + http://opensource.org/licenses/ms-rl + + +Microsoft Reciprocal License (MS-RL) + +This license governs use of the accompanying software. If you use the software, you accept this license. If you do not accept the license, do not use the software. + +1. Definitions + The terms "reproduce," "reproduction," "derivative works," and "distribution" have the same meaning here as under U.S. copyright law. + A "contribution" is the original software, or any additions or changes to the software. + A "contributor" is any person that distributes its contribution under this license. + "Licensed patents" are a contributor's patent claims that read directly on its contribution. + +2. Grant of Rights + (A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution or any derivative works that you create. + (B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution in the software or derivative works of the contribution in the software. + +3. Conditions and Limitations + (A) Reciprocal Grants- For any file you distribute that contains code from the software (in source code or binary format), you must provide recipients the source code to that file along with a copy of this license, which license will govern that file. You may license other files that are entirely your own work and do not contain code from the software under any terms you choose. + (B) No Trademark License- This license does not grant you rights to use any contributors' name, logo, or trademarks. + (C) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your patent license from such contributor to the software ends automatically. + (D) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution notices that are present in the software. + (E) If you distribute any portion of the software in source code form, you may do so only under this license by including a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or object code form, you may only do so under a license that complies with this license. + (F) The software is licensed "as-is." You bear the risk of using it. The contributors give no express warranties, guarantees or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a particular purpose and non-infringement. diff --git a/bafunctions/IBootstrapperBAFunction.h b/bafunctions/IBootstrapperBAFunction.h new file mode 100644 index 0000000..c0c9b3b --- /dev/null +++ b/bafunctions/IBootstrapperBAFunction.h @@ -0,0 +1,29 @@ +//------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2004, Outercurve Foundation. +// This software is released under Microsoft Reciprocal License (MS-RL). +// The license and further copyright text can be found in the file +// LICENSE.TXT at the root directory of the distribution. +// +//------------------------------------------------------------------------------------------------- + +#pragma once + +#include + +#include "IBootstrapperEngine.h" + +interface IBootstrapperBAFunction +{ + STDMETHOD(OnDetect)() = 0; + STDMETHOD(OnDetectComplete)() = 0; + STDMETHOD(OnPlan)() = 0; + STDMETHOD(OnPlanComplete)() = 0; +}; + +extern "C" typedef HRESULT (WINAPI *PFN_BOOTSTRAPPER_BA_FUNCTION_CREATE)( + __in IBootstrapperEngine* pEngine, + __in HMODULE hModule, + __out IBootstrapperBAFunction** ppBAFunction + ); + diff --git a/bafunctions/Version.proj b/bafunctions/Version.proj new file mode 100644 index 0000000..109f83f --- /dev/null +++ b/bafunctions/Version.proj @@ -0,0 +1,72 @@ + + + + 1 + 0 + + .\bafunctionsver.h + + + + $([System.DateTime]::new(2000, 1, 1)) + $([System.Convert]::ToInt32($([System.DateTime]::Now.ToUniversalTime().Subtract($(Base)).TotalDays))) + $([System.Convert]::ToInt32($([MSBuild]::Divide($([System.Convert]::ToInt32($([System.DateTime]::Now.ToUniversalTime().TimeOfDay.TotalSeconds))), 2)))) + + $(MajorBuildNumber).$(MinorBuildNumber).$(BuildNumber).$(BuildRevision) + + + + + + + + + + + + + + + + + + + + + + + diff --git a/bafunctions/WixBootstrapperBAFunction.cpp b/bafunctions/WixBootstrapperBAFunction.cpp new file mode 100644 index 0000000..f4739a0 --- /dev/null +++ b/bafunctions/WixBootstrapperBAFunction.cpp @@ -0,0 +1,278 @@ +//------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2004, Outercurve Foundation. +// This software is released under Microsoft Reciprocal License (MS-RL). +// The license and further copyright text can be found in the file +// LICENSE.TXT at the root directory of the distribution. +// +//------------------------------------------------------------------------------------------------- + + +#include "precomp.h" + +class CWixBootstrapperBAFunction : IBootstrapperBAFunction +{ +public: + STDMETHODIMP OnDetect() + { + HRESULT hr = S_OK; + HKEY hkKey = NULL; + LPWSTR sczValue = NULL; + LPWSTR sczFormatedValue = NULL; + + BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "Running detect BA function"); + + //--------------------------------------------------------------------------------------------- + // Example of BA function failure + //hr = E_NOTIMPL; + //BalExitOnFailure(hr, "Test failure."); + //--------------------------------------------------------------------------------------------- + + //--------------------------------------------------------------------------------------------- + // Example of setting a variables + hr = m_pEngine->SetVariableString(L"Variable1", L"String value"); + BalExitOnFailure(hr, "Failed to set variable."); + hr = m_pEngine->SetVariableNumeric(L"Variable2", 1234); + BalExitOnFailure(hr, "Failed to set variable."); + //--------------------------------------------------------------------------------------------- + + //--------------------------------------------------------------------------------------------- + // Example of reading burn variable. + BalGetStringVariable(L"WixBundleName", &sczValue); + BalExitOnFailure(hr, "Failed to get variable."); + + hr = m_pEngine->SetVariableString(L"Variable4", sczValue); + BalExitOnFailure(hr, "Failed to set variable."); + //--------------------------------------------------------------------------------------------- + + ReleaseNullStr(sczValue); // Release string so it can be re-used + + //--------------------------------------------------------------------------------------------- + // Examples of reading burn variable and formatting it. + BalGetStringVariable(L"InstallFolder", &sczValue); + BalExitOnFailure(hr, "Failed to get variable."); + + hr = m_pEngine->SetVariableString(L"Variable5", sczValue); + BalExitOnFailure(hr, "Failed to set variable."); + + BalFormatString(sczValue, &sczFormatedValue); + BalExitOnFailure(hr, "Failed to format variable."); + + hr = m_pEngine->SetVariableString(L"Variable6", sczFormatedValue); + BalExitOnFailure(hr, "Failed to set variable."); + //--------------------------------------------------------------------------------------------- + + ReleaseNullStr(sczValue); // Release string so it can be re-used + + //--------------------------------------------------------------------------------------------- + BalFormatString(L"WixBundleVersion=[WixBundleVersion]", &sczValue); + BalExitOnFailure(hr, "Failed to format variable."); + + hr = m_pEngine->SetVariableString(L"Variable7", sczValue); + BalExitOnFailure(hr, "Failed to set variable."); + //--------------------------------------------------------------------------------------------- + + ReleaseNullStr(sczValue); // Release string so it can be re-used + + //--------------------------------------------------------------------------------------------- + // Example of reading 64 bit registry and setting the InstallFolder variable to the value read. + hr = RegOpen(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v3.5", KEY_READ | KEY_WOW64_64KEY, &hkKey); + BalExitOnFailure(hr, "Failed to open registry key."); + + hr = RegReadString(hkKey, L"InstallPath", &sczValue); + BalExitOnFailure(hr, "Failed to read registry value."); + + // Example of function call + PathBackslashTerminate(&sczValue); + + hr = m_pEngine->SetVariableString(L"InstallFolder", sczValue); + BalExitOnFailure(hr, "Failed to set variable."); + //--------------------------------------------------------------------------------------------- + + ReleaseNullStr(sczValue); // Release string so it can be re-used + + //--------------------------------------------------------------------------------------------- + hr = PathRelativeToModule(&sczValue, NULL, m_hModule); + hr = m_pEngine->SetVariableString(L"ModulePath", sczValue); + //--------------------------------------------------------------------------------------------- + + ReleaseNullStr(sczValue); // Release string so it can be re-used + + //--------------------------------------------------------------------------------------------- + hr = GetFileVersion(); + BalExitOnFailure(hr, "Failed to get version."); + //--------------------------------------------------------------------------------------------- + + //--------------------------------------------------------------------------------------------- + // Delay start to show splashscreen handling + Delay(); + //--------------------------------------------------------------------------------------------- + + LExit: + ReleaseRegKey(hkKey); + ReleaseStr(sczValue); + ReleaseStr(sczFormatedValue); + + return hr; + } + + + STDMETHODIMP OnDetectComplete() { return S_OK; } + + +/* + STDMETHODIMP OnDetectComplete() + { + HRESULT hr = S_OK; + + BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "Running detect complete BA function"); + + //------------------------------------------------------------------------------------------------- + // YOUR CODE GOES HERE + BalExitOnFailure(hr, "Change this message to represent real error handling."); + //------------------------------------------------------------------------------------------------- + + LExit: + return hr; + } +*/ + + + STDMETHODIMP OnPlan() + { + HRESULT hr = S_OK; + + BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "Running plan BA function"); + + //--------------------------------------------------------------------------------------------- + // Example of converting 4 radio button values in to 1 + LONGLONG llValue = 0; + if (SUCCEEDED(BalGetNumericVariable(L"RadioButton1", &llValue)) && llValue) + { + m_pEngine->SetVariableNumeric(L"RadioButton", 1); + BalExitOnFailure(hr, "Failed to set variable."); + } + else if (SUCCEEDED(BalGetNumericVariable(L"RadioButton2", &llValue)) && llValue) + { + m_pEngine->SetVariableNumeric(L"RadioButton", 2); + BalExitOnFailure(hr, "Failed to set variable."); + } + else if (SUCCEEDED(BalGetNumericVariable(L"RadioButton3", &llValue)) && llValue) + { + m_pEngine->SetVariableNumeric(L"RadioButton", 3); + BalExitOnFailure(hr, "Failed to set variable."); + } + else if (SUCCEEDED(BalGetNumericVariable(L"RadioButton4", &llValue)) && llValue) + { + m_pEngine->SetVariableNumeric(L"RadioButton", 4); + BalExitOnFailure(hr, "Failed to set variable."); + } + else + { + m_pEngine->SetVariableNumeric(L"RadioButton", 0); + BalExitOnFailure(hr, "Failed to set variable."); + } + //--------------------------------------------------------------------------------------------- + + LExit: + return hr; + } + + + STDMETHODIMP OnPlanComplete() + { + BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "Running plan complete BA function"); + return S_OK; + } + +private: + //--------------------------------------------------------------------------------------------- + // Example of function call to get the file version of this bundle + //--------------------------------------------------------------------------------------------- + HRESULT GetFileVersion() + { + HRESULT hr = S_OK; + LPWSTR sczValue = NULL; + ULARGE_INTEGER uliVersion = { }; + + BalFormatString(L"[WixBundleOriginalSource]", &sczValue); + BalExitOnFailure(hr, "Failed to format variable."); + + FileVersion(sczValue, &uliVersion.HighPart, &uliVersion.LowPart); + BalExitOnFailure(hr, "Failed to get file version."); + + hr = m_pEngine->SetVariableVersion(L"FileVersion", uliVersion.QuadPart); + BalExitOnFailure(hr, "Failed to set variable."); + + LExit: + ReleaseStr(sczValue); + + return hr; + } + + + HRESULT Delay() + { + HRESULT hr = S_OK; + LONGLONG llDelay = 0; + + BalGetNumericVariable(L"DelayStart", &llDelay); + if (llDelay) + { + BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "Delay for %dms", (DWORD)llDelay); + ::Sleep((DWORD)llDelay); + } + + return hr; + } + + +private: + HMODULE m_hModule; + IBootstrapperEngine* m_pEngine; + + +public: + // + // Constructor - initialize member variables. + // + CWixBootstrapperBAFunction( + __in IBootstrapperEngine* pEngine, + __in HMODULE hModule + ) + { + m_hModule = hModule; + m_pEngine = pEngine; + } + + // + // Destructor - release member variables. + // + ~CWixBootstrapperBAFunction() + { + } +}; + + +extern "C" HRESULT WINAPI CreateBootstrapperBAFunction( + __in IBootstrapperEngine* pEngine, + __in HMODULE hModule, + __out CWixBootstrapperBAFunction** ppBAFunction + ) +{ + HRESULT hr = S_OK; + CWixBootstrapperBAFunction* pBAFunction = NULL; + + // This is required to enable logging functions + BalInitialize(pEngine); + + pBAFunction = new CWixBootstrapperBAFunction(pEngine, hModule); + ExitOnNull(pBAFunction, hr, E_OUTOFMEMORY, "Failed to create new bootstrapper BA function object."); + + *ppBAFunction = pBAFunction; + pBAFunction = NULL; + +LExit: + delete pBAFunction; + return hr; +} diff --git a/bafunctions/bafunctions.cpp b/bafunctions/bafunctions.cpp new file mode 100644 index 0000000..16b6543 --- /dev/null +++ b/bafunctions/bafunctions.cpp @@ -0,0 +1,37 @@ +//------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2004, Outercurve Foundation. +// This software is released under Microsoft Reciprocal License (MS-RL). +// The license and further copyright text can be found in the file +// LICENSE.TXT at the root directory of the distribution. +// +// +// +// Entry point for bootstrapper BA function DLL. +// +//------------------------------------------------------------------------------------------------- + +#include "precomp.h" + +static HINSTANCE vhInstance = NULL; + +extern "C" BOOL WINAPI DllMain( + IN HINSTANCE hInstance, + IN DWORD dwReason, + IN LPVOID /* pvReserved */ + ) +{ + switch(dwReason) + { + case DLL_PROCESS_ATTACH: + ::DisableThreadLibraryCalls(hInstance); + vhInstance = hInstance; + break; + + case DLL_PROCESS_DETACH: + vhInstance = NULL; + break; + } + + return TRUE; +} diff --git a/bafunctions/bafunctions.def b/bafunctions/bafunctions.def new file mode 100644 index 0000000..6e721f1 --- /dev/null +++ b/bafunctions/bafunctions.def @@ -0,0 +1,16 @@ +;------------------------------------------------------------------------------------------------- +; +; Copyright (c) 2004, Outercurve Foundation. +; This software is released under Microsoft Reciprocal License (MS-RL). +; The license and further copyright text can be found in the file +; LICENSE.TXT at the root directory of the distribution. +; +; +; +; Bootstrapper Application function DLL entry points. +; +;------------------------------------------------------------------------------------------------- + +EXPORTS + CreateBootstrapperBAFunction + diff --git a/bafunctions/bafunctions.rc b/bafunctions/bafunctions.rc new file mode 100644 index 0000000..d3fcf9f --- /dev/null +++ b/bafunctions/bafunctions.rc @@ -0,0 +1,129 @@ +//------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2004, Outercurve Foundation. +// This software is released under Microsoft Reciprocal License (MS-RL). +// The license and further copyright text can be found in the file +// LICENSE.TXT at the root directory of the distribution. +// +// +// +// WiX Extendend Bootstrapper BA function resource file. +// +//------------------------------------------------------------------------------------------------- + +#include +#include +#include "bafunctionsver.h" + +#define VER_APP +#define VER_ORIGINAL_FILENAME "bafunctions.dll" +#define VER_INTERNAL_NAME "bafunctions" +#define VER_PRODUCT_NAME "WiX Bootstrapper functions" +#define VER_FILE_DESCRIPTION "WiX Bootstrapper functions" + +#ifdef DEBUG + #define VER_DEBUG VS_FF_DEBUG + #define VER_PRIVATE_BUILD VS_FF_PRIVATEBUILD + #define VER_PRE_RELEASE (VS_FF_PRERELEASE | VS_FF_SPECIALBUILD) +#else + #define VER_DEBUG 0 + #define VER_PRIVATE_BUILD 0 + #define VER_PRE_RELEASE 0 +#endif + +#if defined(VER_APP) + #define VER_FILE_TYPE VFT_APP +#elif defined(VER_DLL) + #define VER_FILE_TYPE VFT_DLL +#elif defined(VER_TYPELIB) + #define VER_FILE_TYPE VFT_UNKNOWN +#else + #define VER_FILE_TYPE VFT_UNKNOWN +#endif + +#if defined(VER_LANG_NEUTRAL) + #ifndef VER_LANG + #define VER_LANG 0x0000 + #endif + #ifndef VER_CP + #define VER_CP 0x04E4 + #endif + #ifndef VER_BLOCK + #define VER_BLOCK "000004E4" + #endif +#else + #ifndef VER_LANG + #define VER_LANG 0x0409 + #endif + #ifndef VER_CP + #define VER_CP 0x04E4 + #endif + #ifndef VER_BLOCK + #define VER_BLOCK "040904E4" + #endif +#endif + +#define VER_FILE_VERSION rmj, rmm, rbd, rev +#define VER_PRODUCT_VERSION rmj, rmm, rbd, rev +#define VER_FILE_VERSION_STRING szVerMajorMinorBuildRev +#define VER_PRODUCT_VERSION_STRING VER_FILE_VERSION_STRING +#define VER_FILE_FLAGS_MASK VS_FFI_FILEFLAGSMASK +#define VER_FILE_FLAGS (VER_DEBUG | VER_PRIVATE_BUILD | VER_PRE_RELEASE) + +#define VER_FILE_OS VOS__WINDOWS32 + +#define VER_COMPANY_NAME "Outercurve Foundation" +#ifndef VER_PRODUCT_NAME + #define VER_PRODUCT_NAME "Windows Installer XML (WiX)" +#endif +#ifndef VER_FILE_DESCRIPTION + #define VER_FILE_DESCRIPTION "Windows Installer XML (WiX) component" +#endif + +#if defined(VER_LEGAL_COPYRIGHT) + #error +#endif +#define VER_LEGAL_COPYRIGHT "Copyright (c) Outercurve Foundation.\240 All rights reserved." + +#if !defined(VER_FILE_SUBTYPE) + #define VER_FILE_SUBTYPE 0 +#endif + +#ifdef RC_INVOKED + +VS_VERSION_INFO VERSIONINFO +FILEVERSION VER_FILE_VERSION +PRODUCTVERSION VER_PRODUCT_VERSION +FILEFLAGSMASK VER_FILE_FLAGS_MASK +FILEFLAGS VER_FILE_FLAGS +FILEOS VER_FILE_OS +FILETYPE VER_FILE_TYPE +FILESUBTYPE VER_FILE_SUBTYPE +BEGIN +BLOCK "StringFileInfo" + BEGIN + BLOCK VER_BLOCK + BEGIN + VALUE "CompanyName", VER_COMPANY_NAME + VALUE "FileDescription", VER_FILE_DESCRIPTION + VALUE "FileVersion", VER_FILE_VERSION_STRING + VALUE "InternalName", VER_INTERNAL_NAME + + VALUE "LegalCopyright", VER_LEGAL_COPYRIGHT + + VALUE "OriginalFilename", VER_ORIGINAL_FILENAME + VALUE "ProductName", VER_PRODUCT_NAME + VALUE "ProductVersion", VER_FILE_VERSION_STRING +#if defined(DEBUG) + VALUE "WiX Common Resource Format", "Debug Only" +#endif + END + END + +BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", VER_LANG, VER_CP + END +END + +#endif diff --git a/bafunctions/bafunctions.vcxproj b/bafunctions/bafunctions.vcxproj new file mode 100644 index 0000000..83d9607 --- /dev/null +++ b/bafunctions/bafunctions.vcxproj @@ -0,0 +1,137 @@ + + + + + + Debug + Win32 + + + Release + Win32 + + + + {EB0A7D51-2133-4EE7-B6CA-87DBEAC67E02} + BaFunctions + Win32Proj + DynamicLibrary + MultiByte + bafunctions + + + + v120 + + + v120 + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + $(Configuration)\ + $(Configuration)\ + true + AllRules.ruleset + + + $(Configuration)\ + $(Configuration)\ + true + AllRules.ruleset + + + + + + + + + + Disabled + $(WiX)SDK\VS2010\inc;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_LIB;DEBUG;%(PreprocessorDefinitions);$(ExtraDefinitions) + true + EnableFastChecks + MultiThreadedDebug + Use + precomp.h + $(IntDir)$(ProjectName).pdb + Level4 + ProgramDatabase + StdCall + true + + + %(AdditionalIncludeDirectories) + + + dutil.lib;balutil.lib;comctl32.lib;gdiplus.lib;shlwapi.lib;wininet.lib;version.lib;%(AdditionalDependencies) + $(WiX)SDK\VS2010\lib\x86;%(AdditionalLibraryDirectories) + bafunctions.def + true + Windows + + + + + Disabled + $(WiX)SDK\VS2010\inc;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions);$(ExtraDefinitions) + true + EnableFastChecks + MultiThreaded + Use + precomp.h + $(IntDir)$(ProjectName).pdb + Level4 + ProgramDatabase + StdCall + true + + + %(AdditionalIncludeDirectories) + + + dutil.lib;balutil.lib;comctl32.lib;gdiplus.lib;shlwapi.lib;wininet.lib;version.lib;%(AdditionalDependencies) + $(WiX)SDK\VS2010\lib\x86;%(AdditionalLibraryDirectories) + bafunctions.def + false + Windows + + + + + + Create + Create + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/bafunctions/bafunctions.vcxproj.filters b/bafunctions/bafunctions.vcxproj.filters new file mode 100644 index 0000000..b77f5c3 --- /dev/null +++ b/bafunctions/bafunctions.vcxproj.filters @@ -0,0 +1,46 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav + + + + + Source Files + + + Source Files + + + + + Source Files + + + + + Header Files + + + Header Files + + + Header Files + + + + + Resource Files + + + \ No newline at end of file diff --git a/bafunctions/bafunctionsver.h b/bafunctions/bafunctionsver.h new file mode 100644 index 0000000..7b0d107 --- /dev/null +++ b/bafunctions/bafunctionsver.h @@ -0,0 +1,12 @@ +// +#ifndef _VERSION_FILE_H_ +#define _VERSION_FILE_H_ + +#define szVerMajorMinor "1.0" +#define szVerMajorMinorBuildRev "1.0.5260.23891" +#define rmj 1 +#define rmm 0 +#define rbd 5260 +#define rev 23891 + +#endif diff --git a/bafunctions/build.bat b/bafunctions/build.bat new file mode 100644 index 0000000..c6578de --- /dev/null +++ b/bafunctions/build.bat @@ -0,0 +1,25 @@ +@echo off + +echo Configuring environment... +set MSBUILD="%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\msbuild.exe" +echo. + +set outdir=%~dp0build + +%MSBUILD% Version.proj +%MSBUILD% bafunctions.vcxproj /t:Rebuild /p:Configuration=Release,Platform=Win32 /p:RunCodeAnalysis=false /p:DefineConstants="TRACE" /p:OutDir="%outdir%\\" /l:FileLogger,Microsoft.Build.Engine;logfile=build.log +if %errorlevel% neq 0 ( + echo Build failed + pause + goto :EOF +) + +copy build\bafunctions.dll ..\Examples /y + +echo. + +goto :EOF + +REM ***************************************************************** +REM End of Main +REM ***************************************************************** diff --git a/bafunctions/precomp.h b/bafunctions/precomp.h new file mode 100644 index 0000000..a90e2a4 --- /dev/null +++ b/bafunctions/precomp.h @@ -0,0 +1,52 @@ +//------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2004, Outercurve Foundation. +// This software is released under Microsoft Reciprocal License (MS-RL). +// The license and further copyright text can be found in the file +// LICENSE.TXT at the root directory of the distribution. +// +// +// +// Precompiled header for standard bootstrapper application. +// +//------------------------------------------------------------------------------------------------- + +#pragma once + + +#include +#include +#include +#include +#include +#include +#include +#include + +// Standard WiX header files, include as required +#include "dutil.h" +//#include "memutil.h" +//#include "dictutil.h" +//#include "dirutil.h" +#include "fileutil.h" +//#include "locutil.h" +//#include "logutil.h" +#include "pathutil.h" +//#include "resrutil.h" +//#include "shelutil.h" +#include "strutil.h" +//#include "thmutil.h" +//#include "uriutil.h" +//#include "xmlutil.h" +#include "regutil.h" + +//#include "IBootstrapperEngine.h" +//#include "IBootstrapperApplication.h" + +#include "BalBaseBootstrapperApplication.h" +//#include "balinfo.h" +//#include "balcondition.h" +#include "balutil.h" + +#include "IBootstrapperBAFunction.h" + diff --git a/bafunctions/resource.h b/bafunctions/resource.h new file mode 100644 index 0000000..53c03c3 --- /dev/null +++ b/bafunctions/resource.h @@ -0,0 +1,25 @@ +//------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2004, Outercurve Foundation. +// This software is released under Microsoft Reciprocal License (MS-RL). +// The license and further copyright text can be found in the file +// LICENSE.TXT at the root directory of the distribution. +// +//------------------------------------------------------------------------------------------------- + +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// +#define IDC_STATIC -1 + + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 102 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1003 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/build.bat b/build.bat new file mode 100644 index 0000000..90d8beb --- /dev/null +++ b/build.bat @@ -0,0 +1,44 @@ +@echo off + +echo Configuring environment... +set MSBUILD="%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\msbuild.exe" +echo. + +set outdir=%~dp0build + +echo Removing release folder... +Call :DeleteDir "%outdir%" +Call :DeleteDir "ipch" + +%MSBUILD% inc\Version.proj +%MSBUILD% bafunctions\Version.proj +%MSBUILD% BalExtensionExt.sln /t:Rebuild /p:Configuration=Release /p:Platform="Mixed Platforms" /p:RunCodeAnalysis=false /p:DefineConstants="TRACE" /p:OutDir="%outdir%\\" /l:FileLogger,Microsoft.Build.Engine;logfile=build.log +if %errorlevel% neq 0 ( + echo Build failed + pause + goto :EOF +) + +copy build\bafunctions.dll Examples /y + +pushd Examples +Call Build +popd + +echo. + +pause + +goto :EOF + +REM ***************************************************************** +REM End of Main +REM ***************************************************************** + + +REM ***************************************************************** +REM Delete/create directory +REM ***************************************************************** +:DeleteDir +rd %1% /q/s 2>nul 1>nul +goto :EOF diff --git a/build/WixBalExtensionExt.dll b/build/WixBalExtensionExt.dll new file mode 100644 index 0000000000000000000000000000000000000000..5ab6898d81efae134e979c42a6d4d4706d729d26 GIT binary patch literal 131072 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 z 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 `DteT(b~c_ep8 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 O9vS`rayk5$vj2Y|Pi-dv literal 0 HcmV?d00001 diff --git a/build/balExt.wixlib b/build/balExt.wixlib new file mode 100644 index 0000000000000000000000000000000000000000..38368c2fe7deb28c50217bf9eec894e358153a20 GIT binary patch literal 266491 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

rPCfpWhRr9fCZFcYlwA;jPQ0qn` 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 literal 0 HcmV?d00001 diff --git a/inc/Version.proj b/inc/Version.proj new file mode 100644 index 0000000..42ab9c5 --- /dev/null +++ b/inc/Version.proj @@ -0,0 +1,100 @@ + + + + 3 + 8 + + .\wixver.h + .\wixver.cs + + + + $([System.DateTime]::new(2000, 1, 1)) + $([System.Convert]::ToInt32($([System.DateTime]::Now.ToUniversalTime().Subtract($(Base)).TotalDays))) + $([System.Convert]::ToInt32($([MSBuild]::Divide($([System.Convert]::ToInt32($([System.DateTime]::Now.ToUniversalTime().TimeOfDay.TotalSeconds))), 2)))) + + $(MajorBuildNumber).$(MinorBuildNumber).$(BuildNumber).$(BuildRevision) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inc/WixDistribution.cs b/inc/WixDistribution.cs new file mode 100644 index 0000000..54e7d1d --- /dev/null +++ b/inc/WixDistribution.cs @@ -0,0 +1,13 @@ +using System.Reflection; +using System.Resources; + +[assembly: AssemblyCompany("Outercurve Foundation")] +[assembly: AssemblyCopyright("Copyright © Outercurve Foundation. All rights reserved.")] +[assembly: AssemblyTrademark("")] +#if DEBUG + [assembly: AssemblyConfiguration("DEBUG")] +#else + [assembly: AssemblyConfiguration("")] +#endif +[assembly: NeutralResourcesLanguage("en-US")] +[assembly: AssemblyProduct("Windows Installer XML")] diff --git a/inc/WixDistribution.h b/inc/WixDistribution.h new file mode 100644 index 0000000..4151907 --- /dev/null +++ b/inc/WixDistribution.h @@ -0,0 +1,17 @@ +/* ************************************************************************** + * WixDistribution.h file contains disribution specific items, such as + * Product Name. + * + * **************************************************************************/ + +#pragma once + +#ifndef __WIXDISTRIBUTION_FILE_H_ +#define __WIXDISTRIBUTION_FILE_H_ + +#ifdef VER_PRODUCT_NAME + #undef VER_PRODUCT_NAME +#endif +#define VER_PRODUCT_NAME "Windows Installer XML" + +#endif // __WIXDISTRIBUTION_FILE_H_ diff --git a/inc/wix.rc b/inc/wix.rc new file mode 100644 index 0000000..8c418b4 --- /dev/null +++ b/inc/wix.rc @@ -0,0 +1,140 @@ +//------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2004, Outercurve Foundation. +// This software is released under Microsoft Reciprocal License (MS-RL). +// The license and further copyright text can be found in the file +// LICENSE.TXT at the root directory of the distribution. +// +// +//

+// Common resource file for any native wix resources. +// +// +// Usage: +// #define VER_APP (VER_DLL, VER_TYPELIB, none) +// #define VER_LANG_NEUTRAL (optional) +// #define VER_ORIGINAL_FILENAME "FooBar.Exe" +// #define VER_INTERNAL_NAME "FooBar" +// #define VER_PRODUCT_NAME +// #define VER_FILE_DESCRIPTION +// #include "wix.rc" +// +// Optional to add before the #include (must add as a group and VER_BLOCK must match to VER_LANG and VER_CP) +// You should not have to do this except for some extreme cases. +// #define VER_LANG 0x0000 +// #define VER_CP 0x04E4 +// #define VER_BLOCK "000004E4" +// +//------------------------------------------------------------------------------------------------- + +#include +#include +#include "wixver.h" +#include "WixDistribution.h" + +#ifdef DEBUG + #define VER_DEBUG VS_FF_DEBUG + #define VER_PRIVATE_BUILD VS_FF_PRIVATEBUILD + #define VER_PRE_RELEASE (VS_FF_PRERELEASE | VS_FF_SPECIALBUILD) +#else + #define VER_DEBUG 0 + #define VER_PRIVATE_BUILD 0 + #define VER_PRE_RELEASE 0 +#endif + +#if defined(VER_APP) + #define VER_FILE_TYPE VFT_APP +#elif defined(VER_DLL) + #define VER_FILE_TYPE VFT_DLL +#elif defined(VER_TYPELIB) + #define VER_FILE_TYPE VFT_UNKNOWN +#else + #define VER_FILE_TYPE VFT_UNKNOWN +#endif + +#if defined(VER_LANG_NEUTRAL) + #ifndef VER_LANG + #define VER_LANG 0x0000 + #endif + #ifndef VER_CP + #define VER_CP 0x04E4 + #endif + #ifndef VER_BLOCK + #define VER_BLOCK "000004E4" + #endif +#else + #ifndef VER_LANG + #define VER_LANG 0x0409 + #endif + #ifndef VER_CP + #define VER_CP 0x04E4 + #endif + #ifndef VER_BLOCK + #define VER_BLOCK "040904E4" + #endif +#endif + +#define VER_FILE_VERSION rmj, rmm, rbd, rev +#define VER_PRODUCT_VERSION rmj, rmm, rbd, rev +#define VER_FILE_VERSION_STRING szVerMajorMinorBuildRev +#define VER_PRODUCT_VERSION_STRING VER_FILE_VERSION_STRING +#define VER_FILE_FLAGS_MASK VS_FFI_FILEFLAGSMASK +#define VER_FILE_FLAGS (VER_DEBUG | VER_PRIVATE_BUILD | VER_PRE_RELEASE) + +#define VER_FILE_OS VOS__WINDOWS32 + +#define VER_COMPANY_NAME "Outercurve Foundation" +#ifndef VER_PRODUCT_NAME + #define VER_PRODUCT_NAME "Windows Installer XML (WiX)" +#endif +#ifndef VER_FILE_DESCRIPTION + #define VER_FILE_DESCRIPTION "Windows Installer XML (WiX) component" +#endif + +#if defined(VER_LEGAL_COPYRIGHT) + #error +#endif +#define VER_LEGAL_COPYRIGHT "Copyright (c) Outercurve Foundation.\240 All rights reserved." + +#if !defined(VER_FILE_SUBTYPE) + #define VER_FILE_SUBTYPE 0 +#endif + +#ifdef RC_INVOKED + +VS_VERSION_INFO VERSIONINFO +FILEVERSION VER_FILE_VERSION +PRODUCTVERSION VER_PRODUCT_VERSION +FILEFLAGSMASK VER_FILE_FLAGS_MASK +FILEFLAGS VER_FILE_FLAGS +FILEOS VER_FILE_OS +FILETYPE VER_FILE_TYPE +FILESUBTYPE VER_FILE_SUBTYPE +BEGIN +BLOCK "StringFileInfo" + BEGIN + BLOCK VER_BLOCK + BEGIN + VALUE "CompanyName", VER_COMPANY_NAME + VALUE "FileDescription", VER_FILE_DESCRIPTION + VALUE "FileVersion", VER_FILE_VERSION_STRING + VALUE "InternalName", VER_INTERNAL_NAME + + VALUE "LegalCopyright", VER_LEGAL_COPYRIGHT + + VALUE "OriginalFilename", VER_ORIGINAL_FILENAME + VALUE "ProductName", VER_PRODUCT_NAME + VALUE "ProductVersion", VER_FILE_VERSION_STRING +#if defined(DEBUG) + VALUE "WiX Common Resource Format", "Debug Only" +#endif + END + END + +BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", VER_LANG, VER_CP + END +END + +#endif diff --git a/inc/wixver.cs b/inc/wixver.cs new file mode 100644 index 0000000..e82ef78 --- /dev/null +++ b/inc/wixver.cs @@ -0,0 +1,4 @@ +// +using System.Reflection; +[assembly:AssemblyVersion("3.0.0.0")] +[assembly:AssemblyFileVersion("3.8.5260.23891")] diff --git a/inc/wixver.h b/inc/wixver.h new file mode 100644 index 0000000..ba6381f --- /dev/null +++ b/inc/wixver.h @@ -0,0 +1,13 @@ +// +#ifndef _VERSION_FILE_H_ +#define _VERSION_FILE_H_ + +#define szVerMajorMinor "3.8" +#define szVerMajorMinorBuildRev "3.8.5260.23891" +#define rmj 3 +#define rmm 8 +#define rbd 5260 +#define rev 23891 +#define szVerName "BalExtensionExt Release" + +#endif diff --git a/wixext/BalCompiler.cs b/wixext/BalCompiler.cs new file mode 100644 index 0000000..b2b77e5 --- /dev/null +++ b/wixext/BalCompiler.cs @@ -0,0 +1,373 @@ +//------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2004, Outercurve Foundation. +// This software is released under Microsoft Reciprocal License (MS-RL). +// The license and further copyright text can be found in the file +// LICENSE.TXT at the root directory of the distribution. +// +// +// +// The compiler for the Windows Installer XML Toolset Bal Extension. +// +//------------------------------------------------------------------------------------------------- + +namespace Microsoft.Tools.WindowsInstallerXml.Extensions +{ + using System; + using System.Collections.Generic; + using System.Diagnostics; + using System.Globalization; + using System.IO; + using System.Reflection; + using System.Xml; + using System.Xml.Schema; + using Microsoft.Tools.WindowsInstallerXml; + + /// + /// The compiler for the Windows Installer XML Toolset Bal Extension. + /// + public sealed class BalCompiler : CompilerExtension + { + private SourceLineNumberCollection addedConditionLineNumber; + private XmlSchema schema; + + /// + /// Instantiate a new BalCompiler. + /// + public BalCompiler() + { + this.addedConditionLineNumber = null; + this.schema = LoadXmlSchemaHelper(Assembly.GetExecutingAssembly(), "Microsoft.Tools.WindowsInstallerXml.Extensions.Xsd.bal.xsd"); + } + + /// + /// Gets the schema for this extension. + /// + /// Schema for this extension. + public override XmlSchema Schema + { + get { return this.schema; } + } + + /// + /// Processes an element for the Compiler. + /// + /// Source line number for the parent element. + /// Parent element of element to process. + /// Element to process. + /// Extra information about the context in which this element is being parsed. + public override void ParseElement(SourceLineNumberCollection sourceLineNumbers, XmlElement parentElement, XmlElement element, params string[] contextValues) + { + switch (parentElement.LocalName) + { + case "Bundle": + case "Fragment": + switch (element.LocalName) + { + case "Condition": + this.ParseConditionElement(element); + break; + default: + this.Core.UnexpectedElement(parentElement, element); + break; + } + break; + case "BootstrapperApplicationRef": + switch (element.LocalName) + { + case "WixExtendedBootstrapperApplication": + this.ParseWixExtendedBootstrapperApplicationElement(element); + break; + default: + this.Core.UnexpectedElement(parentElement, element); + break; + } + break; + default: + this.Core.UnexpectedElement(parentElement, element); + break; + } + } + + /// + /// Processes an attribute for the Compiler. + /// + /// Source line number for the parent element. + /// Parent element of element to process. + /// Attribute to process. + /// Extra information about the context in which this element is being parsed. + public override void ParseAttribute(SourceLineNumberCollection sourceLineNumbers, XmlElement parentElement, XmlAttribute attribute, Dictionary contextValues) + { + switch (parentElement.LocalName) + { + case "Variable": + // at the time the extension attribute is parsed, the compiler might not yet have + // parsed the Name attribute, so we need to get it directly from the parent element. + string variableName = parentElement.GetAttribute("Name"); + if (String.IsNullOrEmpty(variableName)) + { + this.Core.OnMessage(WixErrors.ExpectedParentWithAttribute(sourceLineNumbers, "Variable", "Overridable", "Name")); + } + else + { + switch (attribute.LocalName) + { + case "Overridable": + if (YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attribute)) + { + Row row = this.Core.CreateRow(sourceLineNumbers, "WixStdbaOverridableVariable"); + row[0] = variableName; + } + break; + default: + this.Core.UnexpectedAttribute(sourceLineNumbers, attribute); + break; + } + } + break; + default: + this.Core.UnexpectedAttribute(sourceLineNumbers, attribute); + break; + } + } + + /// + /// Parses a Condition element for Bundles. + /// + /// The element to parse. + private void ParseConditionElement(XmlNode node) + { + SourceLineNumberCollection sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node); + string condition = CompilerCore.GetConditionInnerText(node); // condition is the inner text of the element. + string message = null; + + foreach (XmlAttribute attrib in node.Attributes) + { + if (0 == attrib.NamespaceURI.Length || attrib.NamespaceURI == this.schema.TargetNamespace) + { + switch (attrib.LocalName) + { + case "Message": + message = this.Core.GetAttributeValue(sourceLineNumbers, attrib, false); + break; + default: + this.Core.UnexpectedAttribute(sourceLineNumbers, attrib); + break; + } + } + else + { + this.Core.UnsupportedExtensionAttribute(sourceLineNumbers, attrib); + } + } + + foreach (XmlNode child in node.ChildNodes) + { + if (XmlNodeType.Element == child.NodeType) + { + if (child.NamespaceURI == this.schema.TargetNamespace) + { + this.Core.UnexpectedElement(node, child); + } + else + { + this.Core.UnsupportedExtensionElement(node, child); + } + } + } + + // Error check the values. + if (String.IsNullOrEmpty(condition)) + { + this.Core.OnMessage(WixErrors.ConditionExpected(sourceLineNumbers, node.Name)); + } + + if (null == message) + { + this.Core.OnMessage(WixErrors.ExpectedAttribute(sourceLineNumbers, node.Name, "Message")); + } + + if (!this.Core.EncounteredError) + { + Row row = this.Core.CreateRow(sourceLineNumbers, "WixBalCondition"); + row[0] = condition; + row[1] = message; + + if (null == this.addedConditionLineNumber) + { + this.addedConditionLineNumber = sourceLineNumbers; + } + } + } + + /// + /// Parses a WixExtendedBootstrapperApplication element for Bundles. + /// + /// The element to parse. + private void ParseWixExtendedBootstrapperApplicationElement(XmlNode node) + { + SourceLineNumberCollection sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node); + string launchTarget = null; + string licenseFile = null; + string licenseUrl = null; + string logoFile = null; + string logoSideFile = null; + string themeFile = null; + string localizationFile = null; + YesNoType suppressOptionsUI = YesNoType.NotSet; + YesNoType suppressDowngradeFailure = YesNoType.NotSet; + YesNoType suppressRepair = YesNoType.NotSet; + YesNoType showVersion = YesNoType.NotSet; + YesNoType launchPassive = YesNoType.NotSet; + YesNoType launchQuiet = YesNoType.NotSet; + + foreach (XmlAttribute attrib in node.Attributes) + { + if (0 == attrib.NamespaceURI.Length || attrib.NamespaceURI == this.schema.TargetNamespace) + { + switch (attrib.LocalName) + { + case "LaunchTarget": + launchTarget = this.Core.GetAttributeValue(sourceLineNumbers, attrib, false); + break; + case "LicenseFile": + licenseFile = this.Core.GetAttributeValue(sourceLineNumbers, attrib, false); + break; + case "LicenseUrl": + licenseUrl = this.Core.GetAttributeValue(sourceLineNumbers, attrib, true); + break; + case "LogoFile": + logoFile = this.Core.GetAttributeValue(sourceLineNumbers, attrib, false); + break; + case "LogoSideFile": + logoSideFile = this.Core.GetAttributeValue(sourceLineNumbers, attrib, false); + break; + case "ThemeFile": + themeFile = this.Core.GetAttributeValue(sourceLineNumbers, attrib, false); + break; + case "LocalizationFile": + localizationFile = this.Core.GetAttributeValue(sourceLineNumbers, attrib, false); + break; + case "SuppressOptionsUI": + suppressOptionsUI = this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib); + break; + case "LaunchPassive": + launchPassive = this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib); + break; + case "LaunchQuiet": + launchQuiet = this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib); + break; + case "SuppressDowngradeFailure": + suppressDowngradeFailure = this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib); + break; + case "SuppressRepair": + suppressRepair = this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib); + break; + case "ShowVersion": + showVersion = this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib); + break; + default: + this.Core.UnexpectedAttribute(sourceLineNumbers, attrib); + break; + } + } + else + { + this.Core.UnsupportedExtensionAttribute(sourceLineNumbers, attrib); + } + } + + foreach (XmlNode child in node.ChildNodes) + { + if (XmlNodeType.Element == child.NodeType) + { + if (child.NamespaceURI == this.schema.TargetNamespace) + { + this.Core.UnexpectedElement(node, child); + } + else + { + this.Core.UnsupportedExtensionElement(node, child); + } + } + } + + if (String.IsNullOrEmpty(licenseFile) && null == licenseUrl) + { + this.Core.OnMessage(WixErrors.ExpectedAttribute(sourceLineNumbers, node.Name, "LicenseFile", "LicenseUrl", true)); + } + + if (!this.Core.EncounteredError) + { + if (!String.IsNullOrEmpty(launchTarget)) + { + this.Core.CreateVariableRow(sourceLineNumbers, "LaunchTarget", launchTarget, "string", false, false); + } + + if (!String.IsNullOrEmpty(licenseFile)) + { + this.Core.CreateWixVariableRow(sourceLineNumbers, "WixExtbaLicenseRtf", licenseFile, false); + } + + if (null != licenseUrl) + { + this.Core.CreateWixVariableRow(sourceLineNumbers, "WixExtbaLicenseUrl", licenseUrl, false); + } + + if (!String.IsNullOrEmpty(logoFile)) + { + this.Core.CreateWixVariableRow(sourceLineNumbers, "WixExtbaLogo", logoFile, false); + } + + if (!String.IsNullOrEmpty(logoSideFile)) + { + this.Core.CreateWixVariableRow(sourceLineNumbers, "WixExtbaLogoSide", logoSideFile, false); + } + + if (!String.IsNullOrEmpty(themeFile)) + { + this.Core.CreateWixVariableRow(sourceLineNumbers, "WixExtbaThemeXml", themeFile, false); + } + + if (!String.IsNullOrEmpty(localizationFile)) + { + this.Core.CreateWixVariableRow(sourceLineNumbers, "WixExtbaThemeWxl", localizationFile, false); + } + + if (YesNoType.Yes == suppressOptionsUI || YesNoType.Yes == suppressDowngradeFailure || YesNoType.Yes == suppressRepair) + { + Row row = this.Core.CreateRow(sourceLineNumbers, "WixExtbaOptions"); + if (YesNoType.Yes == suppressOptionsUI) + { + row[0] = 1; + } + + if (YesNoType.Yes == suppressDowngradeFailure) + { + row[1] = 1; + } + + if (YesNoType.Yes == suppressRepair) + { + row[2] = 1; + } + + if (YesNoType.Yes == showVersion) + { + row[3] = 1; + } + + if (YesNoType.Yes == launchPassive) + { + row[4] = 1; + } + + if (YesNoType.Yes == launchQuiet) + { + row[5] = 1; + } + } + } + } + } +} diff --git a/wixext/BalExtension.cs b/wixext/BalExtension.cs new file mode 100644 index 0000000..ae0ba2c --- /dev/null +++ b/wixext/BalExtension.cs @@ -0,0 +1,96 @@ +//------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2004, Outercurve Foundation. +// This software is released under Microsoft Reciprocal License (MS-RL). +// The license and further copyright text can be found in the file +// LICENSE.TXT at the root directory of the distribution. +// +// +// +// The Windows Installer XML Toolset Bal extension. +// +//------------------------------------------------------------------------------------------------- + +namespace Microsoft.Tools.WindowsInstallerXml.Extensions +{ + using System; + using System.Reflection; + + /// + /// The Windows Installer XML Toolset Bal Extension. + /// + public sealed class BalExtension : WixExtension + { + private BalCompiler compilerExtension; + private Library library; + private TableDefinitionCollection tableDefinitions; + + private BalPreprocessorExtension preprocessorExtension; + + /// + /// Gets the optional compiler extension. + /// + /// The optional compiler extension. + public override CompilerExtension CompilerExtension + { + get + { + if (null == this.compilerExtension) + { + this.compilerExtension = new BalCompiler(); + } + + return this.compilerExtension; + } + } + + /// + /// Gets the optional table definitions for this extension. + /// + /// The optional table definitions for this extension. + public override TableDefinitionCollection TableDefinitions + { + get + { + if (null == this.tableDefinitions) + { + this.tableDefinitions = LoadTableDefinitionHelper(Assembly.GetExecutingAssembly(), "Microsoft.Tools.WindowsInstallerXml.Extensions.Data.tables.xml"); + } + + return this.tableDefinitions; + } + } + + /// + /// Gets the library associated with this extension. + /// + /// The table definitions to use while loading the library. + /// The loaded library. + public override Library GetLibrary(TableDefinitionCollection tableDefinitions) + { + if (null == this.library) + { + this.library = LoadLibraryHelper(Assembly.GetExecutingAssembly(), "Microsoft.Tools.WindowsInstallerXml.Extensions.Data.balExt.wixlib", tableDefinitions); + } + + return this.library; + } + + /// + /// Gets the optional preprocessor extension. + /// + /// The optional preprocessor extension. + public override PreprocessorExtension PreprocessorExtension + { + get + { + if (null == this.preprocessorExtension) + { + this.preprocessorExtension = new BalPreprocessorExtension(); + } + + return this.preprocessorExtension; + } + } + } +} diff --git a/wixext/BalPreprocessorExtension.cs b/wixext/BalPreprocessorExtension.cs new file mode 100644 index 0000000..bd84548 --- /dev/null +++ b/wixext/BalPreprocessorExtension.cs @@ -0,0 +1,63 @@ +//------------------------------------------------------------------------------------------------- +// +// +// +// +// A WiX preprocessor extension. +// +//------------------------------------------------------------------------------------------------- + +namespace Microsoft.Tools.WindowsInstallerXml.Extensions +{ + using System; + using Microsoft.Tools.WindowsInstallerXml; + + /// + /// The preprocessor extension. + /// + public sealed class BalPreprocessorExtension : PreprocessorExtension + { + private static readonly string[] prefixes = {"bal"}; + + /// + /// Gets the variable prefixes for this extension. + /// + /// The variable prefixes for this extension. + public override string[] Prefixes + { + get { return prefixes; } + } + + public override string EvaluateFunction(string prefix, string function, string[] args) + { + string result = null; + + switch (prefix) + { + case "bal": + switch (function) + { + case "Version": + // Make sure the base version is specified + if (args.Length == 0 || args[0].Length == 0) + { + throw new ArgumentException("Version template not specified"); + } + + // Build = days since 1/1/2000; Revision = seconds since midnight / 2 + DateTime now = DateTime.Now.ToUniversalTime(); + double build = (now - new DateTime(2000, 1, 1)).TotalDays; + double revision = now.TimeOfDay.TotalSeconds / 2; + + result = String.Format("{0}.{1}.{2}", args[0], (int)build, (int)revision); + + break; + } + + break; + } + + return result; + } + } +} diff --git a/wixext/Properties/AssemblyInfo.cs b/wixext/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..5081dc3 --- /dev/null +++ b/wixext/Properties/AssemblyInfo.cs @@ -0,0 +1,27 @@ +//------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2004, Outercurve Foundation. +// This software is released under Microsoft Reciprocal License (MS-RL). +// The license and further copyright text can be found in the file LICENSE.TXT +// LICENSE.TXT at the root directory of the distribution. +// +// +// +// The assembly information for the Windows Installer XML Toolset Bootstrapper Application Layer Extension. +// +//------------------------------------------------------------------------------------------------- + +using System; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +using Microsoft.Tools.WindowsInstallerXml; +using Microsoft.Tools.WindowsInstallerXml.Extensions; + +[assembly: AssemblyTitle("WiX Toolset Bootstrapper Application Layer Extension")] +[assembly: AssemblyDescription("Windows Installer XML Toolset Bootstrapper Application Layer Extension")] +[assembly: AssemblyCulture("")] +[assembly: CLSCompliant(true)] +[assembly: ComVisible(false)] +[assembly: AssemblyDefaultWixExtension(typeof(BalExtension))] diff --git a/wixext/WixBalExtensionExt.csproj b/wixext/WixBalExtensionExt.csproj new file mode 100644 index 0000000..e693763 --- /dev/null +++ b/wixext/WixBalExtensionExt.csproj @@ -0,0 +1,88 @@ + + + + + Debug + AnyCPU + 8.0.30703 + 2.0 + {6F9B6AFD-538B-4DF6-A1E8-6C224CBD7B05} + Library + Properties + Microsoft.Tools.WindowsInstallerXml.Extensions + WixBalExtensionExt + v2.0 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + False + $(WIX)bin\wix.dll + False + + + + + Properties\WixDistribution.cs + + + Properties\wixver.cs + + + + + + + $(RootNamespace).Data.Messages.resources + + + $(RootNamespace).Data.tables.xml + + + $(RootNamespace).Xsd.bal.xsd + PreserveNewest + + + Microsoft.Tools.WindowsInstallerXml.Serialize + Microsoft.Tools.WindowsInstallerXml.Extensions.Serialize.Bal + + + Data\balExt.wixlib + + + + + \ No newline at end of file diff --git a/wixext/Xsd/bal.xsd b/wixext/Xsd/bal.xsd new file mode 100644 index 0000000..152ae5e --- /dev/null +++ b/wixext/Xsd/bal.xsd @@ -0,0 +1,154 @@ + + + + + + The source code schema for the Windows Installer XML Toolset Burn User Experience Extension. + + + + + + + + + Conditions for a bundle. The condition is specified in the inner text of the element. + + + + + + + + + + + + The condition that must evaluate to true for the installation to continue. + + + + + + Set the value to the text to display when the condition fails and the installation must be terminated. + + + + + + + + + + + + Configures WixExtendedBootstrapperApplication for a Bundle. + + + + + + + + + If set, the success page will show a Launch button the user can use to launch the application being installed. The string value can be formatted using Burn variables enclosed in brackets, to refer to installation directories and so forth. + + + + + Source file of the RTF license file. Cannot be used simultaneously with LicenseUrl. + + + + + URL target of the license link. Cannot be used simultaneously with LicenseFile. This attribute can be empty to hide the license link completely. + + + + + Source file of the logo graphic. + + + + + Source file of the side logo graphic. + + + + + Source file of the theme XML. + + + + + Source file of the theme localization .wxl file. + + + + + If set to "yes", the Options button will not be shown and the user will not be able to choose an installation directory. + + + + + If set to "yes", the LaunchTarget option will be executed automatically at the end of a passive install. + + + + + If set to "yes", the LaunchTarget option will be executed automatically at the end of a quiet install. + + + + + If set to "yes", attempting to installer a downgraded version of a bundle will be treated as a successful do-nothing operation. + The default behavior (or when explicitly set to "no") is to treat downgrade attempts as failures. + + + + + If set to "yes", the Repair button will not be shown in the maintenance-mode UI. + + + + + If set to "yes", the application version will be displayed on the UI. + + + + + + + + + When set to "yes", lets the user override the variable's default value by specifying another value on the command line, + in the form Variable=Value. Otherwise, WixStdBA won't overwrite the default value and will log + "Ignoring attempt to set non-overridable variable: 'BAR'." + + + + + + + + + + Values of this type will either be "yes" or "no". + + + + + + + diff --git a/wixext/data/messages.xml b/wixext/data/messages.xml new file mode 100644 index 0000000..a902dc9 --- /dev/null +++ b/wixext/data/messages.xml @@ -0,0 +1,16 @@ + + + + + + + diff --git a/wixext/data/tables.xml b/wixext/data/tables.xml new file mode 100644 index 0000000..7216e89 --- /dev/null +++ b/wixext/data/tables.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/wixlib/BalExtension.wixproj b/wixlib/BalExtension.wixproj new file mode 100644 index 0000000..c0d8c9c --- /dev/null +++ b/wixlib/BalExtension.wixproj @@ -0,0 +1,48 @@ + + + + + {3444d952-f21c-496f-ab6b-56435bfd0787} + balExt + Library + True + True + True + en-us + $(MSBuildExtensionsPath)\Microsoft\WiX\v3.x\Wix.targets + $(Configuration)\$(Platform) + True + + + ..\build\ + + + ..\build\ + + + + + + + + + + + + wixextba + {41085a22-e6aa-4e8b-ab1b-ddee0dc89dfa} + True + True + Binaries;Content;Satellites + INSTALLFOLDER + + + + \ No newline at end of file diff --git a/wixlib/BalExtension.wxs b/wixlib/BalExtension.wxs new file mode 100644 index 0000000..83f8203 --- /dev/null +++ b/wixlib/BalExtension.wxs @@ -0,0 +1,13 @@ + + + + + + diff --git a/wixlib/wixstdba.wxs b/wixlib/wixstdba.wxs new file mode 100644 index 0000000..5632880 --- /dev/null +++ b/wixlib/wixstdba.wxs @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + !(wix.WixExtbaLicenseRtfName=license.rtf) + + + + + + + + + + + + + + + !(wix.WixExtbaLicenseUrl) + + + + + + + + + + + + + + + + !(wix.WixExtbaLicenseUrl) + + + + + + + + + + + + diff --git a/wixlib/wixstdba_platform.wxi b/wixlib/wixstdba_platform.wxi new file mode 100644 index 0000000..46bc723 --- /dev/null +++ b/wixlib/wixstdba_platform.wxi @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wixlib/wixstdba_x86.wxs b/wixlib/wixstdba_x86.wxs new file mode 100644 index 0000000..988f466 --- /dev/null +++ b/wixlib/wixstdba_x86.wxs @@ -0,0 +1,13 @@ + + + + + + \ No newline at end of file diff --git a/wixstdba/Resources/Hyperlink2Theme.xml b/wixstdba/Resources/Hyperlink2Theme.xml new file mode 100644 index 0000000..c4f0f1e --- /dev/null +++ b/wixstdba/Resources/Hyperlink2Theme.xml @@ -0,0 +1,77 @@ + + + #(loc.Caption) + Segoe UI + Segoe UI + Segoe UI + Segoe UI + Segoe UI + + + #(loc.Title) + + #(loc.HelpHeader) + #(loc.HelpText) + + + + #(loc.Title) + + #(loc.InstallHeader) + #(loc.InstallMessage) + #(loc.InstallLicenseLinkText) + #(loc.InstallVersion) + #(loc.InstallUpgradeLinkText) + #(loc.InstallAcceptCheckbox) + + + + + + #(loc.Title) + + #(loc.OptionsHeader) + #(loc.OptionsLocationLabel) + + + + + + + + #(loc.Title) + + #(loc.ProgressHeader) + #(loc.ProgressLabel) + #(loc.OverallProgressPackageText) + + + + + #(loc.Title) + + #(loc.ModifyHeader) + + + + + + #(loc.Title) + + #(loc.SuccessHeader) + + #(loc.SuccessRestartText) + + + + + #(loc.Title) + + #(loc.FailureHeader) + #(loc.FailureHyperlinkLogText) + + #(loc.FailureRestartText) + + + + \ No newline at end of file diff --git a/wixstdba/Resources/HyperlinkTheme.wxl b/wixstdba/Resources/HyperlinkTheme.wxl new file mode 100644 index 0000000..41910b6 --- /dev/null +++ b/wixstdba/Resources/HyperlinkTheme.wxl @@ -0,0 +1,48 @@ + + + [WixBundleName] Setup + [WixBundleName] + Welcome + Setup will install [WixBundleName] on your computer. Click install to continue, options to set the install directory or Close to exit. + Version [WixBundleVersion] + Version [WixBundleVersion] <a href="#">upgrade available</a> + Are you sure you want to cancel? + Setup Help + /install | /repair | /uninstall | /layout [directory] - installs, repairs, uninstalls or + creates a complete local copy of the bundle in directory. Install is the default. + +/passive | /quiet - displays minimal UI with no prompts or displays no UI and + no prompts. By default UI and all prompts are displayed. + +/norestart - suppress any attempts to restart. By default UI will prompt before restart. +/log log.txt - logs to a specific file. By default a log file is created in %TEMP%. + &Close + [WixBundleName] <a href="#">license terms</a>. + I &agree to the license terms and conditions + &Options + &Install + &Close + Setup Options + Install location: + &Browse + &OK + &Cancel + Setup Progress + Processing: + Initializing... + &Cancel + Modify Setup + &Repair + &Uninstall + &Close + Setup Successful + &Launch + You must restart your computer before you can use the software. + &Restart + &Close + Setup Failed + One or more issues caused the setup to fail. Please fix the issues and then retry setup. For more information see the <a href="#">log file</a>. + You must restart your computer to complete the rollback of the software. + &Restart + &Close + \ No newline at end of file diff --git a/wixstdba/Resources/HyperlinkTheme.xml b/wixstdba/Resources/HyperlinkTheme.xml new file mode 100644 index 0000000..34aca2c --- /dev/null +++ b/wixstdba/Resources/HyperlinkTheme.xml @@ -0,0 +1,66 @@ + + + #(loc.Caption) + Segoe UI + Segoe UI + Segoe UI + Segoe UI + Segoe UI + + + #(loc.Title) + + + #(loc.HelpHeader) + #(loc.HelpText) + + + + #(loc.InstallHeader) + #(loc.InstallMessage) + + #(loc.InstallLicenseLinkText) + #(loc.InstallVersion) + #(loc.InstallUpgradeLinkText) + #(loc.InstallAcceptCheckbox) + + + + + + #(loc.OptionsHeader) + #(loc.OptionsLocationLabel) + + + + + + + #(loc.ProgressHeader) + #(loc.ProgressLabel) + #(loc.OverallProgressPackageText) + + + + + #(loc.ModifyHeader) + + + + + + #(loc.SuccessHeader) + + #(loc.SuccessRestartText) + + + + + #(loc.FailureHeader) + #(loc.FailureHyperlinkLogText) + + #(loc.FailureRestartText) + + + + \ No newline at end of file diff --git a/wixstdba/Resources/LogoSide.png b/wixstdba/Resources/LogoSide.png new file mode 100644 index 0000000000000000000000000000000000000000..3d7af32993fb4738507e1f1063e8338d79f3baca GIT binary patch literal 3118 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 M-Gzj&JmR19KL=Nb$^ZZW literal 0 HcmV?d00001 diff --git a/wixstdba/Resources/LoremIpsumLicense.rtf b/wixstdba/Resources/LoremIpsumLicense.rtf new file mode 100644 index 0000000000000000000000000000000000000000..1a1832361851f096afcd4586d486d22aa13073a2 GIT binary patch literal 4908 zcmbVQON-n_5YE})|Ip_k#LU=ESbQ>0LISpNFfoKEhaRal(}`a0$K+u4zvru}erPtg zfEn+Oq*nD;-=liJb}o#^PA}f_N55T;r&p(LFynZj&q*(r!khbM_fJf)%)*G|9L`B_U!EI$H(W-zINYs7qb|r!|K#~KL#_{ zpkB2vkL?NnUL77@KXx~3{`uQ3!^!@}U0s z7=!wKjZVF@y;;0bZ!XT5*(^c*Y@GSCqrE+JXKV*G`{M(x`urJxORq~NJgU{1 zS=r6USqi!%)L<`*_1?}(FTp5&)GZooapicqoj2nKYq0c3r;VrmY|aFWYba!}v_t&7 zy55!=)ud5BJ@Zray}7$Fn0do?CbKr`W`i~=ee)%1ybfi!0qfDjAL2A=sceY0QNb>~ z9U?05W>8oqXezl;Tbyoo(GHKR5jc1hYo-a68UH03we5ddu|bEu+Vhp*(0w0gua{Q+ zvM3W3!$cQb^#(N2i$Y^>aoS?g1d;U;)MMgy!?@gBMYwDiPd;|3e&&VGs3 zqjoB8bm*R?o${9>7Q+s3S^8dD)T&R>Zw8QiuuH31d#`E7>tI(vc{9#wbu(An$4R&9 zZFKr+3Dg0v2W~SiD1|kvK+|0z(Y1L6UNqK8+CuZ|#Vmw8yAT-Ygn|>s=t*OvXKL8|?i;_K8Zk z-e4(Ygb2)9zYZD_5mSRBu;WCmSKLM_=TBNLP}hZ!*>-7{rISgs3IYHZstooakvA^I z5#3T5Nj<*;7;+-GA6po(Bq@A|OE20GU*PsUX&@~o0J5%2M5Mj|bb^BJsy3I&3~g}e zkP#1hgMNVvVF5EhH?m)f5R%DJUa%$#GgEEZrc#qA$&$XRL`LIMT2&e4V%YxKfCVL1 ze?x|qY&^9;C+tGtFoBw4k#MaH^%Ti(!5RLa_d}b_pq6-rVUmVCwr>_Pi|TuvhZQvg zlfLtqE4e!sRWq9@0v{eoZA3;3Q=y9mQvwVVHxcckhLMk$A^>#1b9o;$`u&Eq1fjt^ zm02w103r*IQ~S7~xX8|xnMiFyAljVs**Hl9)B(=e@?^1NS}xnhj{)wV5zOkQz>*1~ zUZLQn@K9I8mNO2{#>8tRHf0(}X+zZ~(Xe?VaJ0cxhKLjOHu8Eh+N|SS(GK#F-o;Y5 zn;hsH7!0y0Ss$}iVJIVvDJiR+H^X##;? zRQpUEuJ~iz6n5=f%S`~g#oWY2%D7Q`0o`RItz$L@+oUlfWC9k0p$z6ctnL#|c7-6J zWQ0xRaVe=k4f1rZ0Ud3ZP6gIdLc-rb+L z%1KPug{I}nf*&ReGI z@{T>MdX`|^s&_n={*MFuU8Z9SX8jY5%ZWyKktZa)AI`()dy4S@aS*1}ak6j-VZ<5pu7PmPvBDzD9jv&g3m5HQKl2& z6JyK_%ZH9McMw*v2x=5&XSmpo#+(6i%B?!eXLNZh=vGFVwj1$BD}Or4aTb53`sQDO CvIZgm literal 0 HcmV?d00001 diff --git a/wixstdba/Resources/RtfTheme.wxl b/wixstdba/Resources/RtfTheme.wxl new file mode 100644 index 0000000..67b5ee0 --- /dev/null +++ b/wixstdba/Resources/RtfTheme.wxl @@ -0,0 +1,43 @@ + + + [WixBundleName] Setup + [WixBundleName] + Are you sure you want to cancel? + Setup Help + /install | /repair | /uninstall | /layout [directory] - installs, repairs, uninstalls or + creates a complete local copy of the bundle in directory. Install is the default. + +/passive | /quiet - displays minimal UI with no prompts or displays no UI and + no prompts. By default UI and all prompts are displayed. + +/norestart - suppress any attempts to restart. By default UI will prompt before restart. +/log log.txt - logs to a specific file. By default a log file is created in %TEMP%. + &Close + I &agree to the license terms and conditions + &Options + &Install + &Close + Setup Options + Install location: + &Browse + &OK + &Cancel + Setup Progress + Processing: + Initializing... + &Cancel + Modify Setup + &Repair + &Uninstall + &Close + Setup Successful + &Launch + You must restart your computer before you can use the software. + &Restart + &Close + Setup Failed + One or more issues caused the setup to fail. Please fix the issues and then retry setup. For more information see the <a href="#">log file</a>. + You must restart your computer to complete the rollback of the software. + &Restart + &Close + diff --git a/wixstdba/Resources/RtfTheme.xml b/wixstdba/Resources/RtfTheme.xml new file mode 100644 index 0000000..af724a8 --- /dev/null +++ b/wixstdba/Resources/RtfTheme.xml @@ -0,0 +1,62 @@ + + + #(loc.Caption) + Segoe UI + Segoe UI + Segoe UI + Segoe UI + Segoe UI + + + #(loc.Title) + + + #(loc.HelpHeader) + #(loc.HelpText) + + + + + + #(loc.InstallAcceptCheckbox) + + + + + + #(loc.OptionsHeader) + #(loc.OptionsLocationLabel) + + + + + + + #(loc.ProgressHeader) + #(loc.ProgressLabel) + #(loc.OverallProgressPackageText) + + + + + #(loc.ModifyHeader) + + + + + + #(loc.SuccessHeader) + + #(loc.SuccessRestartText) + + + + + #(loc.FailureHeader) + #(loc.FailureHyperlinkLogText) + + #(loc.FailureRestartText) + + + + \ No newline at end of file diff --git a/wixstdba/Resources/logo.png b/wixstdba/Resources/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..6df52d5464a282ed469b599483b469fea7f11a31 GIT binary patch literal 880 zcmV-$1CRWPP)00004XF*Lt006O$ zeEU(80000WV@Og>004&%004{+008|`004nN004b?008NW002DY000@xb3BE200009 za7bBm000XQ000XQ0h0Lxr2qf`8gxZibW?9;ba!ELWdKlNX>N2bPDNB8b~7$DE-^4L z^m3s900O{CL_t(&L+w{fa$_+F^gb8Mt&*epW{F%>FaZf#hzjM@dy832Py^lke7jv= zKLc;?A0voY{I{RGnh0Kzdy4tLe3t^eo-)bBkf%U}vP-8@jB?ILvz7g{RJIT# z-%`VYyoLAaf@k<=Z$(j?Xbwy%B=~7Q`CbS}Q&{var5o4oK}HHk5hKzX8II3TnaG11Hzz@X8;L^Qqe5%vg1!rvNm7ccux^>~Oi#B;M<*{K#cu z7EN`-Z(Aiu@)jCFlpi*$Uv^U=H+~X096Pm}Q-=H1zm8Zg-wRa2VeLXFKSpwfuKGb1 z8w4J5DW~|!T%xzK#H|i0`T_-r1I_`WBr;N$Hk)rX$ +// Copyright (c) 2004, Outercurve Foundation. +// This software is released under Microsoft Reciprocal License (MS-RL). +// The license and further copyright text can be found in the file +// LICENSE.TXT at the root directory of the distribution. +// +//------------------------------------------------------------------------------------------------- + + +#include "precomp.h" + +static const LPCWSTR WIXBUNDLE_VARIABLE_ELEVATED = L"WixBundleElevated"; + +static const LPCWSTR WIXSTDBA_WINDOW_CLASS = L"WixExtBA"; +static const LPCWSTR WIXSTDBA_VARIABLE_INSTALL_FOLDER = L"InstallFolder"; +static const LPCWSTR WIXSTDBA_VARIABLE_INSTALL_FOLDER2 = L"InstallFolder2"; +static const LPCWSTR WIXSTDBA_VARIABLE_LAUNCH_TARGET_PATH = L"LaunchTarget"; +static const LPCWSTR WIXSTDBA_VARIABLE_LAUNCH_ARGUMENTS = L"LaunchArguments"; +static const LPCWSTR WIXSTDBA_VARIABLE_LAUNCH_HIDDEN = L"LaunchHidden"; +static const DWORD WIXSTDBA_ACQUIRE_PERCENTAGE = 30; + +enum WIXSTDBA_STATE +{ + WIXSTDBA_STATE_OPTIONS, + WIXSTDBA_STATE_INITIALIZING, + WIXSTDBA_STATE_INITIALIZED, + WIXSTDBA_STATE_HELP, + WIXSTDBA_STATE_DETECTING, + WIXSTDBA_STATE_DETECTED, + WIXSTDBA_STATE_PLANNING, + WIXSTDBA_STATE_PLANNED, + WIXSTDBA_STATE_APPLYING, + WIXSTDBA_STATE_CACHING, + WIXSTDBA_STATE_CACHED, + WIXSTDBA_STATE_EXECUTING, + WIXSTDBA_STATE_EXECUTED, + WIXSTDBA_STATE_APPLIED, + WIXSTDBA_STATE_FAILED, +}; + +enum WM_WIXSTDBA +{ + WM_WIXSTDBA_SHOW_HELP = WM_APP + 100, + WM_WIXSTDBA_DETECT_PACKAGES, + WM_WIXSTDBA_PLAN_PACKAGES, + WM_WIXSTDBA_APPLY_PACKAGES, + WM_WIXSTDBA_CHANGE_STATE, +}; + +// This enum must be kept in the same order as the vrgwzPageNames array. +enum WIXSTDBA_PAGE +{ + WIXSTDBA_PAGE_LOADING, + WIXSTDBA_PAGE_HELP, + WIXSTDBA_PAGE_INSTALL, + WIXSTDBA_PAGE_OPTIONS, + WIXSTDBA_PAGE_MODIFY, + WIXSTDBA_PAGE_PROGRESS, + WIXSTDBA_PAGE_PROGRESS_PASSIVE, + WIXSTDBA_PAGE_SUCCESS, + WIXSTDBA_PAGE_FAILURE, + COUNT_WIXSTDBA_PAGE, +}; + +// This array must be kept in the same order as the WIXSTDBA_PAGE enum. +static LPCWSTR vrgwzPageNames[] = { + L"Loading", + L"Help", + L"Install", + L"Options", + L"Modify", + L"Progress", + L"ProgressPassive", + L"Success", + L"Failure", +}; + +enum WIXSTDBA_CONTROL +{ + // Non-paged controls + WIXSTDBA_CONTROL_CLOSE_BUTTON = THEME_FIRST_ASSIGN_CONTROL_ID, + WIXSTDBA_CONTROL_MINIMIZE_BUTTON, + + // Help page + WIXSTDBA_CONTROL_HELP_CANCEL_BUTTON, + + // Welcome page + WIXSTDBA_CONTROL_INSTALL_BUTTON, + WIXSTDBA_CONTROL_OPTIONS_BUTTON, + WIXSTDBA_CONTROL_EULA_RICHEDIT, + WIXSTDBA_CONTROL_EULA_LINK, + WIXSTDBA_CONTROL_EULA_ACCEPT_CHECKBOX, + WIXSTDBA_CONTROL_WELCOME_CANCEL_BUTTON, + WIXSTDBA_CONTROL_VERSION_LABEL, + WIXSTDBA_CONTROL_UPGRADE_LINK, + + // Options page + WIXSTDBA_CONTROL_FOLDER_EDITBOX, + WIXSTDBA_CONTROL_BROWSE_BUTTON, + WIXSTDBA_CONTROL_FOLDER_EDITBOX2, + WIXSTDBA_CONTROL_BROWSE_BUTTON2, + WIXSTDBA_CONTROL_OK_BUTTON, + WIXSTDBA_CONTROL_CANCEL_BUTTON, + + // Modify page + WIXSTDBA_CONTROL_REPAIR_BUTTON, + WIXSTDBA_CONTROL_UNINSTALL_BUTTON, + WIXSTDBA_CONTROL_MODIFY_CANCEL_BUTTON, + + // Progress page + WIXSTDBA_CONTROL_CACHE_PROGRESS_PACKAGE_TEXT, + WIXSTDBA_CONTROL_CACHE_PROGRESS_BAR, + WIXSTDBA_CONTROL_CACHE_PROGRESS_TEXT, + + WIXSTDBA_CONTROL_EXECUTE_PROGRESS_PACKAGE_TEXT, + WIXSTDBA_CONTROL_EXECUTE_PROGRESS_BAR, + WIXSTDBA_CONTROL_EXECUTE_PROGRESS_TEXT, + WIXSTDBA_CONTROL_EXECUTE_PROGRESS_ACTIONDATA_TEXT, + + WIXSTDBA_CONTROL_OVERALL_PROGRESS_PACKAGE_TEXT, + WIXSTDBA_CONTROL_OVERALL_PROGRESS_BAR, + WIXSTDBA_CONTROL_OVERALL_CALCULATED_PROGRESS_BAR, + WIXSTDBA_CONTROL_OVERALL_PROGRESS_TEXT, + + WIXSTDBA_CONTROL_PROGRESS_CANCEL_BUTTON, + + // Success page + WIXSTDBA_CONTROL_LAUNCH_BUTTON, + WIXSTDBA_CONTROL_SUCCESS_RESTART_TEXT, + WIXSTDBA_CONTROL_SUCCESS_RESTART_BUTTON, + WIXSTDBA_CONTROL_SUCCESS_CANCEL_BUTTON, + + // Failure page + WIXSTDBA_CONTROL_FAILURE_LOGFILE_LINK, + WIXSTDBA_CONTROL_FAILURE_MESSAGE_TEXT, + WIXSTDBA_CONTROL_FAILURE_RESTART_TEXT, + WIXSTDBA_CONTROL_FAILURE_RESTART_BUTTON, + WIXSTDBA_CONTROL_FAILURE_CANCEL_BUTTON, +}; + +static THEME_ASSIGN_CONTROL_ID vrgInitControls[] = { + { WIXSTDBA_CONTROL_CLOSE_BUTTON, L"CloseButton" }, + { WIXSTDBA_CONTROL_MINIMIZE_BUTTON, L"MinimizeButton" }, + + { WIXSTDBA_CONTROL_HELP_CANCEL_BUTTON, L"HelpCancelButton" }, + + { WIXSTDBA_CONTROL_INSTALL_BUTTON, L"InstallButton" }, + { WIXSTDBA_CONTROL_OPTIONS_BUTTON, L"OptionsButton" }, + { WIXSTDBA_CONTROL_EULA_RICHEDIT, L"EulaRichedit" }, + { WIXSTDBA_CONTROL_EULA_LINK, L"EulaHyperlink" }, + { WIXSTDBA_CONTROL_EULA_ACCEPT_CHECKBOX, L"EulaAcceptCheckbox" }, + { WIXSTDBA_CONTROL_WELCOME_CANCEL_BUTTON, L"WelcomeCancelButton" }, + { WIXSTDBA_CONTROL_VERSION_LABEL, L"InstallVersion" }, + { WIXSTDBA_CONTROL_UPGRADE_LINK, L"UpgradeHyperlink" }, + + { WIXSTDBA_CONTROL_FOLDER_EDITBOX, L"FolderEditbox" }, + { WIXSTDBA_CONTROL_BROWSE_BUTTON, L"BrowseButton" }, + { WIXSTDBA_CONTROL_FOLDER_EDITBOX2, L"FolderEditbox2" }, + { WIXSTDBA_CONTROL_BROWSE_BUTTON2, L"BrowseButton2" }, + { WIXSTDBA_CONTROL_OK_BUTTON, L"OptionsOkButton" }, + { WIXSTDBA_CONTROL_CANCEL_BUTTON, L"OptionsCancelButton" }, + + { WIXSTDBA_CONTROL_REPAIR_BUTTON, L"RepairButton" }, + { WIXSTDBA_CONTROL_UNINSTALL_BUTTON, L"UninstallButton" }, + { WIXSTDBA_CONTROL_MODIFY_CANCEL_BUTTON, L"ModifyCancelButton" }, + + { WIXSTDBA_CONTROL_CACHE_PROGRESS_PACKAGE_TEXT, L"CacheProgressPackageText" }, + { WIXSTDBA_CONTROL_CACHE_PROGRESS_BAR, L"CacheProgressbar" }, + { WIXSTDBA_CONTROL_CACHE_PROGRESS_TEXT, L"CacheProgressText" }, + { WIXSTDBA_CONTROL_EXECUTE_PROGRESS_PACKAGE_TEXT, L"ExecuteProgressPackageText" }, + { WIXSTDBA_CONTROL_EXECUTE_PROGRESS_BAR, L"ExecuteProgressbar" }, + { WIXSTDBA_CONTROL_EXECUTE_PROGRESS_TEXT, L"ExecuteProgressText" }, + { WIXSTDBA_CONTROL_EXECUTE_PROGRESS_ACTIONDATA_TEXT, L"ExecuteProgressActionDataText" }, + { WIXSTDBA_CONTROL_OVERALL_PROGRESS_PACKAGE_TEXT, L"OverallProgressPackageText" }, + { WIXSTDBA_CONTROL_OVERALL_PROGRESS_BAR, L"OverallProgressbar" }, + { WIXSTDBA_CONTROL_OVERALL_CALCULATED_PROGRESS_BAR, L"OverallCalculatedProgressbar" }, + { WIXSTDBA_CONTROL_OVERALL_PROGRESS_TEXT, L"OverallProgressText" }, + { WIXSTDBA_CONTROL_PROGRESS_CANCEL_BUTTON, L"ProgressCancelButton" }, + + { WIXSTDBA_CONTROL_LAUNCH_BUTTON, L"LaunchButton" }, + { WIXSTDBA_CONTROL_SUCCESS_RESTART_TEXT, L"SuccessRestartText" }, + { WIXSTDBA_CONTROL_SUCCESS_RESTART_BUTTON, L"SuccessRestartButton" }, + { WIXSTDBA_CONTROL_SUCCESS_CANCEL_BUTTON, L"SuccessCancelButton" }, + + { WIXSTDBA_CONTROL_FAILURE_LOGFILE_LINK, L"FailureLogFileLink" }, + { WIXSTDBA_CONTROL_FAILURE_MESSAGE_TEXT, L"FailureMessageText" }, + { WIXSTDBA_CONTROL_FAILURE_RESTART_TEXT, L"FailureRestartText" }, + { WIXSTDBA_CONTROL_FAILURE_RESTART_BUTTON, L"FailureRestartButton" }, + { WIXSTDBA_CONTROL_FAILURE_CANCEL_BUTTON, L"FailureCloseButton" }, +}; + +class CWixStandardBootstrapperApplication : public CBalBaseBootstrapperApplication +{ +public: // IBootstrapperApplication + virtual STDMETHODIMP OnStartup() + { + HRESULT hr = S_OK; + DWORD dwUIThreadId = 0; + + // create UI thread + m_hUiThread = ::CreateThread(NULL, 0, UiThreadProc, this, 0, &dwUIThreadId); + if (!m_hUiThread) + { + ExitWithLastError(hr, "Failed to create UI thread."); + } + + LExit: + return hr; + } + + + virtual STDMETHODIMP_(int) OnShutdown() + { + int nResult = IDNOACTION; + + // wait for UI thread to terminate + if (m_hUiThread) + { + ::WaitForSingleObject(m_hUiThread, INFINITE); + ReleaseHandle(m_hUiThread); + } + + // If a restart was required. + if (m_fRestartRequired) + { + if (m_fAllowRestart) + { + nResult = IDRESTART; + } + + if (m_sczPrereqPackage) + { + BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, m_fAllowRestart ? "The prerequisites scheduled a restart. The bootstrapper application will be reloaded after the computer is restarted." + : "A restart is required by the prerequisites but the user delayed it. The bootstrapper application will be reloaded after the computer is restarted."); + } + } + else if (m_fPrereqInstalled) + { + BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "The prerequisites were successfully installed. The bootstrapper application will be reloaded."); + nResult = IDRELOAD_BOOTSTRAPPER; + } + else if (m_fPrereqAlreadyInstalled) + { + BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "The prerequisites were already installed. The bootstrapper application will not be reloaded to prevent an infinite loop."); + } + else if (m_fPrereq) + { + BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "The prerequisites were not successfully installed, error: 0x%x. The bootstrapper application will be not reloaded.", m_hrFinal); + } + + return nResult; + } + + + virtual STDMETHODIMP_(int) OnDetectRelatedBundle( + __in LPCWSTR wzBundleId, + __in BOOTSTRAPPER_RELATION_TYPE relationType, + __in LPCWSTR /*wzBundleTag*/, + __in BOOL fPerMachine, + __in DWORD64 /*dw64Version*/, + __in BOOTSTRAPPER_RELATED_OPERATION operation + ) + { + BalInfoAddRelatedBundleAsPackage(&m_Bundle.packages, wzBundleId, relationType, fPerMachine); + + // If we're not doing a pre-req install, remember when our bundle would cause a downgrade. + if (!m_sczPrereqPackage && BOOTSTRAPPER_RELATED_OPERATION_DOWNGRADE == operation) + { + m_fDowngrading = TRUE; + } + + return CheckCanceled() ? IDCANCEL : IDOK; + } + + + virtual STDMETHODIMP_(void) OnDetectPackageComplete( + __in LPCWSTR wzPackageId, + __in HRESULT /*hrStatus*/, + __in BOOTSTRAPPER_PACKAGE_STATE state + ) + { + // If the prereq package is already installed, remember that. + if (m_sczPrereqPackage && BOOTSTRAPPER_PACKAGE_STATE_PRESENT == state && + CSTR_EQUAL == ::CompareStringW(LOCALE_NEUTRAL, 0, wzPackageId, -1, m_sczPrereqPackage, -1)) + { + m_fPrereqAlreadyInstalled = TRUE; + } + } + + + // OnDetectUpdateBegin - called when the engine begins detection for bundle update. + virtual STDMETHODIMP_(int) OnDetectUpdateBegin( + __in_z LPCWSTR wzUpdateLocation, + __in int nRecommendation + ) + { + BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "Update location: %ls.", wzUpdateLocation); + + m_wzUpdateLocation = wzUpdateLocation; + // If there is an upgrade link, check for update on a background thread + if (ThemeControlExists(m_pTheme, WIXSTDBA_CONTROL_UPGRADE_LINK)) + { + ThemeControlEnable(m_pTheme, WIXSTDBA_CONTROL_UPGRADE_LINK, FALSE); + ::CreateThread(NULL, 0, ThreadProc, this, 0, NULL); + } + + return nRecommendation; + } + + + virtual STDMETHODIMP_(int) OnDetectBegin( + __in BOOL /*fInstalled*/, + __in DWORD /*cPackages*/ + ) + { + return IDNOACTION; + } + + + virtual STDMETHODIMP_(void) OnDetectComplete( + __in HRESULT hrStatus + ) + { + if (SUCCEEDED(hrStatus) && m_pBAFunction) + { + m_pBAFunction->OnDetectComplete(); + } + + if (SUCCEEDED(hrStatus)) + { + hrStatus = EvaluateConditions(); + } + + SetState(WIXSTDBA_STATE_DETECTED, hrStatus); + + // If we're not interacting with the user or we're doing a layout or we're just after a force restart + // then automatically start planning. + if (BOOTSTRAPPER_DISPLAY_FULL > m_command.display || BOOTSTRAPPER_ACTION_LAYOUT == m_command.action || BOOTSTRAPPER_RESUME_TYPE_REBOOT == m_command.resumeType) + { + if (SUCCEEDED(hrStatus)) + { + ::PostMessageW(m_hWnd, WM_WIXSTDBA_PLAN_PACKAGES, 0, m_command.action); + } + } + } + + + virtual STDMETHODIMP_(int) OnPlanRelatedBundle( + __in_z LPCWSTR /*wzBundleId*/, + __inout_z BOOTSTRAPPER_REQUEST_STATE* pRequestedState + ) + { + // If we're only installing prereq, do not touch related bundles. + if (m_sczPrereqPackage) + { + *pRequestedState = BOOTSTRAPPER_REQUEST_STATE_NONE; + } + + return CheckCanceled() ? IDCANCEL : IDOK; + } + + + virtual STDMETHODIMP_(int) OnPlanPackageBegin( + __in_z LPCWSTR wzPackageId, + __inout BOOTSTRAPPER_REQUEST_STATE *pRequestState + ) + { + // If we're planning to install a pre-req, install it. The pre-req needs to be installed + // in all cases (even uninstall!) so the BA can load next. + if (m_sczPrereqPackage) + { + if (CSTR_EQUAL == ::CompareStringW(LOCALE_NEUTRAL, 0, wzPackageId, -1, m_sczPrereqPackage, -1)) + { + *pRequestState = BOOTSTRAPPER_REQUEST_STATE_PRESENT; + } + else // skip everything else. + { + *pRequestState = BOOTSTRAPPER_REQUEST_STATE_NONE; + } + } + else if (m_sczAfterForcedRestartPackage) // after force restart skip packages until after the package that caused the restart. + { + // After restart we need to finish the dependency registration for our package so allow the package + // to go present. + if (CSTR_EQUAL == ::CompareStringW(LOCALE_NEUTRAL, 0, wzPackageId, -1, m_sczAfterForcedRestartPackage, -1)) + { + // Do not allow a repair because that could put us in a perpetual restart loop. + if (BOOTSTRAPPER_REQUEST_STATE_REPAIR == *pRequestState) + { + *pRequestState = BOOTSTRAPPER_REQUEST_STATE_PRESENT; + } + + ReleaseNullStr(m_sczAfterForcedRestartPackage); // no more skipping now. + } + else // not the matching package, so skip it. + { + BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "Skipping package: %ls, after restart because it was applied before the restart.", wzPackageId); + + *pRequestState = BOOTSTRAPPER_REQUEST_STATE_NONE; + } + } + + return CheckCanceled() ? IDCANCEL : IDOK; + } + + + virtual STDMETHODIMP_(void) OnPlanComplete( + __in HRESULT hrStatus + ) + { + if (SUCCEEDED(hrStatus) && m_pBAFunction) + { + m_pBAFunction->OnPlanComplete(); + } + + SetState(WIXSTDBA_STATE_PLANNED, hrStatus); + + if (SUCCEEDED(hrStatus)) + { + ::PostMessageW(m_hWnd, WM_WIXSTDBA_APPLY_PACKAGES, 0, 0); + } + + m_dwCalculatedCacheProgress = 0; + m_dwCalculatedExecuteProgress = 0; + } + + + virtual STDMETHODIMP_(int) OnCachePackageBegin( + __in_z LPCWSTR wzPackageId, + __in DWORD cCachePayloads, + __in DWORD64 dw64PackageCacheSize + ) + { + if (wzPackageId && *wzPackageId) + { + BAL_INFO_PACKAGE* pPackage = NULL; + HRESULT hr = BalInfoFindPackageById(&m_Bundle.packages, wzPackageId, &pPackage); + LPCWSTR wz = (SUCCEEDED(hr) && pPackage->sczDisplayName) ? pPackage->sczDisplayName : wzPackageId; + + ThemeSetTextControl(m_pTheme, WIXSTDBA_CONTROL_CACHE_PROGRESS_PACKAGE_TEXT, wz); + + // If something started executing, leave it in the overall progress text. + if (!m_fStartedExecution) + { + ThemeSetTextControl(m_pTheme, WIXSTDBA_CONTROL_OVERALL_PROGRESS_PACKAGE_TEXT, wz); + } + } + + return __super::OnCachePackageBegin(wzPackageId, cCachePayloads, dw64PackageCacheSize); + } + + + virtual STDMETHODIMP_(int) OnCacheAcquireProgress( + __in_z LPCWSTR wzPackageOrContainerId, + __in_z_opt LPCWSTR wzPayloadId, + __in DWORD64 dw64Progress, + __in DWORD64 dw64Total, + __in DWORD dwOverallPercentage + ) + { + WCHAR wzProgress[5] = {}; + +#ifdef DEBUG + BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "WIXSTDBA: OnCacheAcquireProgress() - container/package: %ls, payload: %ls, progress: %I64u, total: %I64u, overall progress: %u%%", wzPackageOrContainerId, wzPayloadId, dw64Progress, dw64Total, dwOverallPercentage); +#endif + + ::StringCchPrintfW(wzProgress, countof(wzProgress), L"%u%%", dwOverallPercentage); + ThemeSetTextControl(m_pTheme, WIXSTDBA_CONTROL_CACHE_PROGRESS_TEXT, wzProgress); + + ThemeSetProgressControl(m_pTheme, WIXSTDBA_CONTROL_CACHE_PROGRESS_BAR, dwOverallPercentage); + + // Restrict progress to 100% to hide burn engine progress bug. + m_dwCalculatedCacheProgress = min(dwOverallPercentage, 100) * WIXSTDBA_ACQUIRE_PERCENTAGE / 100; +#ifdef DEBUG + BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "WIXSTDBA: OnCacheAcquireProgress() - calculated progress: %u%%, displayed progress: %u%%", m_dwCalculatedCacheProgress, m_dwCalculatedCacheProgress + m_dwCalculatedExecuteProgress); +#endif + ThemeSetProgressControl(m_pTheme, WIXSTDBA_CONTROL_OVERALL_CALCULATED_PROGRESS_BAR, m_dwCalculatedCacheProgress + m_dwCalculatedExecuteProgress); + + SetTaskbarButtonProgress(m_dwCalculatedCacheProgress + m_dwCalculatedExecuteProgress); + + return __super::OnCacheAcquireProgress(wzPackageOrContainerId, wzPayloadId, dw64Progress, dw64Total, dwOverallPercentage); + } + + + virtual STDMETHODIMP_(int) OnCacheAcquireComplete( + __in_z LPCWSTR wzPackageOrContainerId, + __in_z_opt LPCWSTR wzPayloadId, + __in HRESULT hrStatus, + __in int nRecommendation + ) + { + SetProgressState(hrStatus); + return __super::OnCacheAcquireComplete(wzPackageOrContainerId, wzPayloadId, hrStatus, nRecommendation); + } + + + virtual STDMETHODIMP_(int) OnCacheVerifyComplete( + __in_z LPCWSTR wzPackageId, + __in_z LPCWSTR wzPayloadId, + __in HRESULT hrStatus, + __in int nRecommendation + ) + { + SetProgressState(hrStatus); + return __super::OnCacheVerifyComplete(wzPackageId, wzPayloadId, hrStatus, nRecommendation); + } + + + virtual STDMETHODIMP_(void) OnCacheComplete( + __in HRESULT /*hrStatus*/ + ) + { + ThemeSetTextControl(m_pTheme, WIXSTDBA_CONTROL_CACHE_PROGRESS_PACKAGE_TEXT, L""); + SetState(WIXSTDBA_STATE_CACHED, S_OK); // we always return success here and let OnApplyComplete() deal with the error. + } + + + virtual STDMETHODIMP_(int) OnError( + __in BOOTSTRAPPER_ERROR_TYPE errorType, + __in LPCWSTR wzPackageId, + __in DWORD dwCode, + __in_z LPCWSTR wzError, + __in DWORD dwUIHint, + __in DWORD /*cData*/, + __in_ecount_z_opt(cData) LPCWSTR* /*rgwzData*/, + __in int nRecommendation + ) + { + int nResult = nRecommendation; + LPWSTR sczError = NULL; + + if (BOOTSTRAPPER_DISPLAY_EMBEDDED == m_command.display) + { + HRESULT hr = m_pEngine->SendEmbeddedError(dwCode, wzError, dwUIHint, &nResult); + if (FAILED(hr)) + { + nResult = IDERROR; + } + } + else if (BOOTSTRAPPER_DISPLAY_FULL == m_command.display) + { + // If this is an authentication failure, let the engine try to handle it for us. + if (BOOTSTRAPPER_ERROR_TYPE_HTTP_AUTH_SERVER == errorType || BOOTSTRAPPER_ERROR_TYPE_HTTP_AUTH_PROXY == errorType) + { + nResult = IDTRYAGAIN; + } + else // show a generic error message box. + { + BalRetryErrorOccurred(wzPackageId, dwCode); + + if (!m_fShowingInternalUiThisPackage) + { + // If no error message was provided, use the error code to try and get an error message. + if (!wzError || !*wzError || BOOTSTRAPPER_ERROR_TYPE_WINDOWS_INSTALLER != errorType) + { + HRESULT hr = StrAllocFromError(&sczError, dwCode, NULL); + if (FAILED(hr) || !sczError || !*sczError) + { + StrAllocFormatted(&sczError, L"0x%x", dwCode); + } + } + + nResult = ::MessageBoxW(m_hWnd, sczError ? sczError : wzError, m_pTheme->sczCaption, dwUIHint); + } + } + + SetProgressState(HRESULT_FROM_WIN32(dwCode)); + } + else // just take note of the error code and let things continue. + { + BalRetryErrorOccurred(wzPackageId, dwCode); + } + + ReleaseStr(sczError); + return nResult; + } + + + virtual STDMETHODIMP_(int) OnExecuteMsiMessage( + __in_z LPCWSTR wzPackageId, + __in INSTALLMESSAGE mt, + __in UINT uiFlags, + __in_z LPCWSTR wzMessage, + __in DWORD cData, + __in_ecount_z_opt(cData) LPCWSTR* rgwzData, + __in int nRecommendation + ) + { +#ifdef DEBUG + BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "WIXSTDBA: OnExecuteMsiMessage() - package: %ls, message: %ls", wzPackageId, wzMessage); +#endif + if (BOOTSTRAPPER_DISPLAY_FULL == m_command.display && (INSTALLMESSAGE_WARNING == mt || INSTALLMESSAGE_USER == mt)) + { + int nResult = ::MessageBoxW(m_hWnd, wzMessage, m_pTheme->sczCaption, uiFlags); + return nResult; + } + + if (INSTALLMESSAGE_ACTIONSTART == mt) + { + ThemeSetTextControl(m_pTheme, WIXSTDBA_CONTROL_EXECUTE_PROGRESS_ACTIONDATA_TEXT, wzMessage); + } + + return __super::OnExecuteMsiMessage(wzPackageId, mt, uiFlags, wzMessage, cData, rgwzData, nRecommendation); + } + + + virtual STDMETHODIMP_(int) OnProgress( + __in DWORD dwProgressPercentage, + __in DWORD dwOverallProgressPercentage + ) + { + WCHAR wzProgress[5] = {}; + +#ifdef DEBUG + BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "WIXSTDBA: OnProgress() - progress: %u%%, overall progress: %u%%", dwProgressPercentage, dwOverallProgressPercentage); +#endif + + ::StringCchPrintfW(wzProgress, countof(wzProgress), L"%u%%", dwOverallProgressPercentage); + ThemeSetTextControl(m_pTheme, WIXSTDBA_CONTROL_OVERALL_PROGRESS_TEXT, wzProgress); + + ThemeSetProgressControl(m_pTheme, WIXSTDBA_CONTROL_OVERALL_PROGRESS_BAR, dwOverallProgressPercentage); + SetTaskbarButtonProgress(dwOverallProgressPercentage); + + return __super::OnProgress(dwProgressPercentage, dwOverallProgressPercentage); + } + + + virtual STDMETHODIMP_(int) OnExecutePackageBegin( + __in_z LPCWSTR wzPackageId, + __in BOOL fExecute + ) + { + LPWSTR sczFormattedString = NULL; + + m_fStartedExecution = TRUE; + + if (wzPackageId && *wzPackageId) + { + BAL_INFO_PACKAGE* pPackage = NULL; + BalInfoFindPackageById(&m_Bundle.packages, wzPackageId, &pPackage); + + LPCWSTR wz = wzPackageId; + if (pPackage) + { + LOC_STRING* pLocString = NULL; + + switch (pPackage->type) + { + case BAL_INFO_PACKAGE_TYPE_BUNDLE_ADDON: + LocGetString(m_pWixLoc, L"#(loc.ExecuteAddonRelatedBundleMessage)", &pLocString); + break; + + case BAL_INFO_PACKAGE_TYPE_BUNDLE_PATCH: + LocGetString(m_pWixLoc, L"#(loc.ExecutePatchRelatedBundleMessage)", &pLocString); + break; + + case BAL_INFO_PACKAGE_TYPE_BUNDLE_UPGRADE: + LocGetString(m_pWixLoc, L"#(loc.ExecuteUpgradeRelatedBundleMessage)", &pLocString); + break; + } + + if (pLocString) + { + BalFormatString(pLocString->wzText, &sczFormattedString); + } + + wz = sczFormattedString ? sczFormattedString : pPackage->sczDisplayName ? pPackage->sczDisplayName : wzPackageId; + } + + m_fShowingInternalUiThisPackage = pPackage && pPackage->fDisplayInternalUI; + + ThemeSetTextControl(m_pTheme, WIXSTDBA_CONTROL_EXECUTE_PROGRESS_PACKAGE_TEXT, wz); + ThemeSetTextControl(m_pTheme, WIXSTDBA_CONTROL_OVERALL_PROGRESS_PACKAGE_TEXT, wz); + } + else + { + m_fShowingInternalUiThisPackage = FALSE; + } + + ReleaseStr(sczFormattedString); + return __super::OnExecutePackageBegin(wzPackageId, fExecute); + } + + + virtual int __stdcall OnExecuteProgress( + __in_z LPCWSTR wzPackageId, + __in DWORD dwProgressPercentage, + __in DWORD dwOverallProgressPercentage + ) + { + WCHAR wzProgress[5] = {}; + +#ifdef DEBUG + BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "WIXSTDBA: OnExecuteProgress() - package: %ls, progress: %u%%, overall progress: %u%%", wzPackageId, dwProgressPercentage, dwOverallProgressPercentage); +#endif + + ::StringCchPrintfW(wzProgress, countof(wzProgress), L"%u%%", dwOverallProgressPercentage); + ThemeSetTextControl(m_pTheme, WIXSTDBA_CONTROL_EXECUTE_PROGRESS_TEXT, wzProgress); + + ThemeSetProgressControl(m_pTheme, WIXSTDBA_CONTROL_EXECUTE_PROGRESS_BAR, dwOverallProgressPercentage); + + m_dwCalculatedExecuteProgress = dwOverallProgressPercentage * (100 - WIXSTDBA_ACQUIRE_PERCENTAGE) / 100; +#ifdef DEBUG + BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "WIXSTDBA: OnExecuteProgress() - calculated progress: %u%%, displayed progress: %u%%", m_dwCalculatedExecuteProgress, m_dwCalculatedCacheProgress + m_dwCalculatedExecuteProgress); +#endif + ThemeSetProgressControl(m_pTheme, WIXSTDBA_CONTROL_OVERALL_CALCULATED_PROGRESS_BAR, m_dwCalculatedCacheProgress + m_dwCalculatedExecuteProgress); + + SetTaskbarButtonProgress(m_dwCalculatedCacheProgress + m_dwCalculatedExecuteProgress); + + return __super::OnExecuteProgress(wzPackageId, dwProgressPercentage, dwOverallProgressPercentage); + } + + + virtual STDMETHODIMP_(int) OnExecutePackageComplete( + __in_z LPCWSTR wzPackageId, + __in HRESULT hrExitCode, + __in BOOTSTRAPPER_APPLY_RESTART restart, + __in int nRecommendation + ) + { + SetProgressState(hrExitCode); + + int nResult = __super::OnExecutePackageComplete(wzPackageId, hrExitCode, restart, nRecommendation); + + if (m_sczPrereqPackage && CSTR_EQUAL == ::CompareStringW(LOCALE_NEUTRAL, 0, wzPackageId, -1, m_sczPrereqPackage, -1)) + { + m_fPrereqInstalled = SUCCEEDED(hrExitCode); + + // If the pre-req required a restart (any restart) then do an immediate + // restart to ensure that the bundle will get launched again post reboot. + if (BOOTSTRAPPER_APPLY_RESTART_NONE != restart) + { + nResult = IDRESTART; + } + } + + return nResult; + } + + + virtual STDMETHODIMP_(void) OnExecuteComplete( + __in HRESULT hrStatus + ) + { + ThemeSetTextControl(m_pTheme, WIXSTDBA_CONTROL_EXECUTE_PROGRESS_PACKAGE_TEXT, L""); + ThemeSetTextControl(m_pTheme, WIXSTDBA_CONTROL_EXECUTE_PROGRESS_ACTIONDATA_TEXT, L""); + ThemeSetTextControl(m_pTheme, WIXSTDBA_CONTROL_OVERALL_PROGRESS_PACKAGE_TEXT, L""); + ThemeControlEnable(m_pTheme, WIXSTDBA_CONTROL_PROGRESS_CANCEL_BUTTON, FALSE); // no more cancel. + + SetState(WIXSTDBA_STATE_EXECUTED, S_OK); // we always return success here and let OnApplyComplete() deal with the error. + SetProgressState(hrStatus); + } + + + virtual STDMETHODIMP_(int) OnResolveSource( + __in_z LPCWSTR wzPackageOrContainerId, + __in_z_opt LPCWSTR wzPayloadId, + __in_z LPCWSTR wzLocalSource, + __in_z_opt LPCWSTR wzDownloadSource + ) + { + int nResult = IDERROR; // assume we won't resolve source and that is unexpected. + + if (BOOTSTRAPPER_DISPLAY_FULL == m_command.display) + { + if (wzDownloadSource) + { + nResult = IDDOWNLOAD; + } + else // prompt to change the source location. + { + OPENFILENAMEW ofn = {}; + WCHAR wzFile[MAX_PATH] = {}; + + ::StringCchCopyW(wzFile, countof(wzFile), wzLocalSource); + + ofn.lStructSize = sizeof(ofn); + ofn.hwndOwner = m_hWnd; + ofn.lpstrFile = wzFile; + ofn.nMaxFile = countof(wzFile); + ofn.lpstrFilter = L"All Files\0*.*\0"; + ofn.nFilterIndex = 1; + ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; + ofn.lpstrTitle = m_pTheme->sczCaption; + + if (::GetOpenFileNameW(&ofn)) + { + HRESULT hr = m_pEngine->SetLocalSource(wzPackageOrContainerId, wzPayloadId, ofn.lpstrFile); + nResult = SUCCEEDED(hr) ? IDRETRY : IDERROR; + } + else + { + nResult = IDCANCEL; + } + } + } + else if (wzDownloadSource) + { + // If doing a non-interactive install and download source is available, let's try downloading the package silently + nResult = IDDOWNLOAD; + } + // else there's nothing more we can do in non-interactive mode + + return CheckCanceled() ? IDCANCEL : nResult; + } + + + virtual STDMETHODIMP_(int) OnApplyComplete( + __in HRESULT hrStatus, + __in BOOTSTRAPPER_APPLY_RESTART restart + ) + { + m_restartResult = restart; // remember the restart result so we return the correct error code no matter what the user chooses to do in the UI. + + // If a restart was encountered and we are not suppressing restarts, then restart is required. + m_fRestartRequired = (BOOTSTRAPPER_APPLY_RESTART_NONE != restart && BOOTSTRAPPER_RESTART_NEVER < m_command.restart); + // If a restart is required and we're not displaying a UI or we are not supposed to prompt for restart then allow the restart. + m_fAllowRestart = m_fRestartRequired && (BOOTSTRAPPER_DISPLAY_FULL > m_command.display || BOOTSTRAPPER_RESTART_PROMPT < m_command.restart); + + // If we are showing UI, wait a beat before moving to the final screen. + if (BOOTSTRAPPER_DISPLAY_NONE < m_command.display) + { + ::Sleep(250); + } + + SetState(WIXSTDBA_STATE_APPLIED, hrStatus); + SetTaskbarButtonProgress(100); // show full progress bar, green, yellow, or red + + // If we successfully applied an update close the window since the new Bundle should be running now. + if (SUCCEEDED(hrStatus) && m_fUpdating) + { + BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "Update downloaded, close bundle."); + ::PostMessageW(m_hWnd, WM_CLOSE, 0, 0); + } + + return IDNOACTION; + } + + +private: // privates + // + // UiThreadProc - entrypoint for UI thread. + // + static DWORD WINAPI UiThreadProc( + __in LPVOID pvContext + ) + { + HRESULT hr = S_OK; + CWixStandardBootstrapperApplication* pThis = (CWixStandardBootstrapperApplication*)pvContext; + BOOL fComInitialized = FALSE; + BOOL fRet = FALSE; + MSG msg = {}; + + // Initialize COM and theme. + hr = ::CoInitialize(NULL); + BalExitOnFailure(hr, "Failed to initialize COM."); + fComInitialized = TRUE; + + hr = ThemeInitialize(pThis->m_hModule); + BalExitOnFailure(hr, "Failed to initialize theme manager."); + + hr = pThis->InitializeData(); + BalExitOnFailure(hr, "Failed to initialize data in bootstrapper application."); + + // Create main window. + pThis->InitializeTaskbarButton(); + hr = pThis->CreateMainWindow(); + BalExitOnFailure(hr, "Failed to create main window."); + + // Okay, we're ready for packages now. + pThis->SetState(WIXSTDBA_STATE_INITIALIZED, hr); + ::PostMessageW(pThis->m_hWnd, BOOTSTRAPPER_ACTION_HELP == pThis->m_command.action ? WM_WIXSTDBA_SHOW_HELP : WM_WIXSTDBA_DETECT_PACKAGES, 0, 0); + + // message pump + while (0 != (fRet = ::GetMessageW(&msg, NULL, 0, 0))) + { + if (-1 == fRet) + { + hr = E_UNEXPECTED; + BalExitOnFailure(hr, "Unexpected return value from message pump."); + } + else if (!ThemeHandleKeyboardMessage(pThis->m_pTheme, msg.hwnd, &msg)) + { + ::TranslateMessage(&msg); + ::DispatchMessageW(&msg); + } + } + + // Succeeded thus far, check to see if anything went wrong while actually + // executing changes. + if (FAILED(pThis->m_hrFinal)) + { + hr = pThis->m_hrFinal; + } + else if (pThis->CheckCanceled()) + { + hr = HRESULT_FROM_WIN32(ERROR_INSTALL_USEREXIT); + } + + LExit: + // destroy main window + pThis->DestroyMainWindow(); + + // initiate engine shutdown + DWORD dwQuit = HRESULT_CODE(hr); + if (BOOTSTRAPPER_APPLY_RESTART_INITIATED == pThis->m_restartResult) + { + dwQuit = ERROR_SUCCESS_REBOOT_INITIATED; + } + else if (BOOTSTRAPPER_APPLY_RESTART_REQUIRED == pThis->m_restartResult) + { + dwQuit = ERROR_SUCCESS_REBOOT_REQUIRED; + } + pThis->m_pEngine->Quit(dwQuit); + + ReleaseTheme(pThis->m_pTheme); + ThemeUninitialize(); + + // uninitialize COM + if (fComInitialized) + { + ::CoUninitialize(); + } + + return hr; + } + + + static DWORD WINAPI ThreadProc( + __in LPVOID pvContext + ) + { + CWixStandardBootstrapperApplication* pThis = static_cast(pvContext);; + + HRESULT hr = S_OK; + IXMLDOMDocument *pixd = NULL; + IXMLDOMNode* pNode = NULL; + LPWSTR sczUpdateUrl = NULL; + DWORD64 qwSize = 0; + + BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "Checking for update."); + + // Load the update XML from a location url and parse it for an update. + // + // + // + // + // + + hr = XmlLoadDocumentFromFile(pThis->m_wzUpdateLocation, &pixd); + BalExitOnFailure(hr, "Failed to load version check XML document."); + + hr = XmlSelectSingleNode(pixd, L"/Setup/Upgrade", &pNode); + BalExitOnFailure(hr, "Failed to select upgrade node."); + + if (S_OK == hr) + { + hr = XmlGetAttributeEx(pNode, L"Url", &sczUpdateUrl); + BalExitOnFailure(hr, "Failed to get url attribute."); + + hr = XmlGetAttributeLargeNumber(pNode, L"Size", &qwSize); + } + + if (sczUpdateUrl && *sczUpdateUrl) + { + BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "Update available, url: %ls; size: %I64u.", sczUpdateUrl, qwSize); + // Show upgrade on install and modify pages + if (pThis->m_rgdwPageIds[WIXSTDBA_PAGE_INSTALL] == pThis->m_dwCurrentPage || + pThis->m_rgdwPageIds[WIXSTDBA_PAGE_MODIFY] == pThis->m_dwCurrentPage) + { + pThis->m_pEngine->SetUpdate(NULL, sczUpdateUrl, qwSize, BOOTSTRAPPER_UPDATE_HASH_TYPE_NONE, NULL, 0); + ThemeControlEnable(pThis->m_pTheme, WIXSTDBA_CONTROL_UPGRADE_LINK, TRUE); + } + } + else + { + BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "No update available."); + } + + LExit: + ReleaseObject(pixd); + ReleaseObject(pNode); + ReleaseStr(sczUpdateUrl); + + return 0; + } + + + // + // InitializeData - initializes all the package and prereq information. + // + HRESULT InitializeData() + { + HRESULT hr = S_OK; + LPWSTR sczModulePath = NULL; + IXMLDOMDocument *pixdManifest = NULL; + + hr = BalManifestLoad(m_hModule, &pixdManifest); + BalExitOnFailure(hr, "Failed to load bootstrapper application manifest."); + + hr = ParseOverridableVariablesFromXml(pixdManifest); + BalExitOnFailure(hr, "Failed to read overridable variables."); + + hr = ProcessCommandLine(&m_sczLanguage); + ExitOnFailure(hr, "Unknown commandline parameters."); + + hr = PathRelativeToModule(&sczModulePath, NULL, m_hModule); + BalExitOnFailure(hr, "Failed to get module path."); + + hr = LoadLocalization(sczModulePath, m_sczLanguage); + ExitOnFailure(hr, "Failed to load localization."); + + hr = LoadTheme(sczModulePath, m_sczLanguage); + ExitOnFailure(hr, "Failed to load theme."); + + hr = BalInfoParseFromXml(&m_Bundle, pixdManifest); + BalExitOnFailure(hr, "Failed to load bundle information."); + + hr = BalConditionsParseFromXml(&m_Conditions, pixdManifest, m_pWixLoc); + BalExitOnFailure(hr, "Failed to load conditions from XML."); + + LoadBootstrapperBAFunctions(); + + hr = ParseBootrapperApplicationDataFromXml(pixdManifest); + BalExitOnFailure(hr, "Failed to read bootstrapper application data."); + + LExit: + ReleaseObject(pixdManifest); + ReleaseStr(sczModulePath); + + return hr; + } + + + // + // ProcessCommandLine - process the provided command line arguments. + // + HRESULT ProcessCommandLine( + __inout LPWSTR* psczLanguage + ) + { + HRESULT hr = S_OK; + int argc = 0; + LPWSTR* argv = NULL; + LPWSTR sczVariableName = NULL; + LPWSTR sczVariableValue = NULL; + + if (m_command.wzCommandLine && *m_command.wzCommandLine) + { + argv = ::CommandLineToArgvW(m_command.wzCommandLine, &argc); + ExitOnNullWithLastError(argv, hr, "Failed to get command line."); + + for (int i = 0; i < argc; ++i) + { + if (argv[i][0] == L'-' || argv[i][0] == L'/') + { + if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, &argv[i][1], -1, L"lang", -1)) + { + if (i + 1 >= argc) + { + hr = E_INVALIDARG; + BalExitOnFailure(hr, "Must specify a language."); + } + + ++i; + + hr = StrAllocString(psczLanguage, &argv[i][0], 0); + BalExitOnFailure(hr, "Failed to copy language."); + } + } + else if (m_sdOverridableVariables) + { + const wchar_t* pwc = wcschr(argv[i], L'='); + if (pwc) + { + hr = StrAllocString(&sczVariableName, argv[i], pwc - argv[i]); + BalExitOnFailure(hr, "Failed to copy variable name."); + + hr = DictKeyExists(m_sdOverridableVariables, sczVariableName); + if (E_NOTFOUND == hr) + { + BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Ignoring attempt to set non-overridable variable: '%ls'.", sczVariableName); + hr = S_OK; + continue; + } + ExitOnFailure(hr, "Failed to check the dictionary of overridable variables."); + + hr = StrAllocString(&sczVariableValue, ++pwc, 0); + BalExitOnFailure(hr, "Failed to copy variable value."); + + hr = m_pEngine->SetVariableString(sczVariableName, sczVariableValue); + BalExitOnFailure(hr, "Failed to set variable."); + } + else + { + BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "Ignoring unknown argument: %ls", argv[i]); + } + } + } + } + + LExit: + if (argv) + { + ::LocalFree(argv); + } + + ReleaseStr(sczVariableName); + ReleaseStr(sczVariableValue); + + return hr; + } + + HRESULT LoadLocalization( + __in_z LPCWSTR wzModulePath, + __in_z_opt LPCWSTR wzLanguage + ) + { + HRESULT hr = S_OK; + LPWSTR sczLocPath = NULL; + LPCWSTR wzLocFileName = L"thm.wxl"; + + hr = LocProbeForFile(wzModulePath, wzLocFileName, wzLanguage, &sczLocPath); + BalExitOnFailure2(hr, "Failed to probe for loc file: %ls in path: %ls", wzLocFileName, wzModulePath); + + hr = LocLoadFromFile(sczLocPath, &m_pWixLoc); + BalExitOnFailure1(hr, "Failed to load loc file from path: %ls", sczLocPath); + + if (WIX_LOCALIZATION_LANGUAGE_NOT_SET != m_pWixLoc->dwLangId) + { + ::SetThreadLocale(m_pWixLoc->dwLangId); + } + + hr = StrAllocString(&m_sczConfirmCloseMessage, L"#(loc.ConfirmCancelMessage)", 0); + ExitOnFailure(hr, "Failed to initialize confirm message loc identifier."); + + hr = LocLocalizeString(m_pWixLoc, &m_sczConfirmCloseMessage); + BalExitOnFailure1(hr, "Failed to localize confirm close message: %ls", m_sczConfirmCloseMessage); + + LExit: + ReleaseStr(sczLocPath); + + return hr; + } + + + HRESULT LoadTheme( + __in_z LPCWSTR wzModulePath, + __in_z_opt LPCWSTR wzLanguage + ) + { + HRESULT hr = S_OK; + LPWSTR sczThemePath = NULL; + LPCWSTR wzThemeFileName = L"thm.xml"; + LPWSTR sczCaption = NULL; + + hr = LocProbeForFile(wzModulePath, wzThemeFileName, wzLanguage, &sczThemePath); + BalExitOnFailure2(hr, "Failed to probe for theme file: %ls in path: %ls", wzThemeFileName, wzModulePath); + + hr = ThemeLoadFromFile(sczThemePath, &m_pTheme); + BalExitOnFailure1(hr, "Failed to load theme from path: %ls", sczThemePath); + + hr = ThemeLocalize(m_pTheme, m_pWixLoc); + BalExitOnFailure1(hr, "Failed to localize theme: %ls", sczThemePath); + + // Update the caption if there are any formatted strings in it. + hr = BalFormatString(m_pTheme->sczCaption, &sczCaption); + if (SUCCEEDED(hr)) + { + ThemeUpdateCaption(m_pTheme, sczCaption); + } + + LExit: + ReleaseStr(sczCaption); + ReleaseStr(sczThemePath); + + return hr; + } + + + HRESULT ParseOverridableVariablesFromXml( + __in IXMLDOMDocument* pixdManifest + ) + { + HRESULT hr = S_OK; + IXMLDOMNode* pNode = NULL; + IXMLDOMNodeList* pNodes = NULL; + DWORD cNodes = 0; + LPWSTR scz = NULL; + + // get the list of variables users can override on the command line + hr = XmlSelectNodes(pixdManifest, L"/BootstrapperApplicationData/WixStdbaOverridableVariable", &pNodes); + if (S_FALSE == hr) + { + ExitFunction1(hr = S_OK); + } + ExitOnFailure(hr, "Failed to select overridable variable nodes."); + + hr = pNodes->get_length((long*)&cNodes); + ExitOnFailure(hr, "Failed to get overridable variable node count."); + + if (cNodes) + { + hr = DictCreateStringList(&m_sdOverridableVariables, 32, DICT_FLAG_NONE); + ExitOnFailure(hr, "Failed to create the string dictionary."); + + for (DWORD i = 0; i < cNodes; ++i) + { + hr = XmlNextElement(pNodes, &pNode, NULL); + ExitOnFailure(hr, "Failed to get next node."); + + // @Name + hr = XmlGetAttributeEx(pNode, L"Name", &scz); + ExitOnFailure(hr, "Failed to get @Name."); + + hr = DictAddKey(m_sdOverridableVariables, scz); + ExitOnFailure1(hr, "Failed to add \"%ls\" to the string dictionary.", scz); + + // prepare next iteration + ReleaseNullObject(pNode); + } + } + + LExit: + ReleaseObject(pNode); + ReleaseObject(pNodes); + ReleaseStr(scz); + return hr; + } + + + HRESULT ParsePrerequisiteInformationFromXml( + __in IXMLDOMDocument* pixdManifest + ) + { + HRESULT hr = S_OK; + IXMLDOMNode* pNode = NULL; + + hr = XmlSelectSingleNode(pixdManifest, L"/BootstrapperApplicationData/WixMbaPrereqInformation", &pNode); + if (S_FALSE == hr) + { + hr = E_INVALIDARG; + } + BalExitOnFailure(hr, "BootstrapperApplication.xml manifest is missing prerequisite information."); + + hr = XmlGetAttributeEx(pNode, L"PackageId", &m_sczPrereqPackage); + BalExitOnFailure(hr, "Failed to get prerequisite package identifier."); + + hr = XmlGetAttributeEx(pNode, L"LicenseUrl", &m_sczLicenseUrl); + if (E_NOTFOUND == hr) + { + hr = S_OK; + } + BalExitOnFailure(hr, "Failed to get prerequisite license URL."); + + hr = XmlGetAttributeEx(pNode, L"LicenseFile", &m_sczLicenseFile); + if (E_NOTFOUND == hr) + { + hr = S_OK; + } + BalExitOnFailure(hr, "Failed to get prerequisite license file."); + + LExit: + ReleaseObject(pNode); + return hr; + } + + + HRESULT ParseBootrapperApplicationDataFromXml( + __in IXMLDOMDocument* pixdManifest + ) + { + HRESULT hr = S_OK; + IXMLDOMNode* pNode = NULL; + DWORD dwBool = 0; + + hr = XmlSelectSingleNode(pixdManifest, L"/BootstrapperApplicationData/WixExtbaInformation", &pNode); + if (S_FALSE == hr) + { + hr = E_INVALIDARG; + } + BalExitOnFailure(hr, "BootstrapperApplication.xml manifest is missing wixextba information."); + + hr = XmlGetAttributeEx(pNode, L"LicenseFile", &m_sczLicenseFile); + if (E_NOTFOUND == hr) + { + hr = S_OK; + } + BalExitOnFailure(hr, "Failed to get license file."); + + hr = XmlGetAttributeEx(pNode, L"LicenseUrl", &m_sczLicenseUrl); + if (E_NOTFOUND == hr) + { + hr = S_OK; + } + BalExitOnFailure(hr, "Failed to get license URL."); + + ReleaseObject(pNode); + + hr = XmlSelectSingleNode(pixdManifest, L"/BootstrapperApplicationData/WixExtbaOptions", &pNode); + if (S_FALSE == hr) + { + ExitFunction1(hr = S_OK); + } + BalExitOnFailure(hr, "Failed to read wixextba options from BootstrapperApplication.xml manifest."); + + hr = XmlGetAttributeNumber(pNode, L"SuppressOptionsUI", &dwBool); + if (E_NOTFOUND == hr) + { + hr = S_OK; + } + else if (SUCCEEDED(hr)) + { + m_fSuppressOptionsUI = 0 < dwBool; + } + BalExitOnFailure(hr, "Failed to get SuppressOptionsUI value."); + + dwBool = 0; + hr = XmlGetAttributeNumber(pNode, L"SuppressDowngradeFailure", &dwBool); + if (E_NOTFOUND == hr) + { + hr = S_OK; + } + else if (SUCCEEDED(hr)) + { + m_fSuppressDowngradeFailure = 0 < dwBool; + } + BalExitOnFailure(hr, "Failed to get SuppressDowngradeFailure value."); + + dwBool = 0; + hr = XmlGetAttributeNumber(pNode, L"SuppressRepair", &dwBool); + if (E_NOTFOUND == hr) + { + hr = S_OK; + } + else if (SUCCEEDED(hr)) + { + m_fSuppressRepair = 0 < dwBool; + } + BalExitOnFailure(hr, "Failed to get SuppressRepair value."); + + hr = XmlGetAttributeNumber(pNode, L"ShowVersion", &dwBool); + if (E_NOTFOUND == hr) + { + hr = S_OK; + } + else if (SUCCEEDED(hr)) + { + m_fShowVersion = 0 < dwBool; + } + BalExitOnFailure(hr, "Failed to get ShowVersion value."); + + dwBool = 0; + hr = XmlGetAttributeNumber(pNode, L"LaunchPassive", &dwBool); + if (E_NOTFOUND == hr) + { + hr = S_OK; + } + else if (SUCCEEDED(hr)) + { + m_fLaunchPassive = 0 < dwBool; + } + BalExitOnFailure(hr, "Failed to get LaunchPassive value."); + + dwBool = 0; + hr = XmlGetAttributeNumber(pNode, L"LaunchQuiet", &dwBool); + if (E_NOTFOUND == hr) + { + hr = S_OK; + } + else if (SUCCEEDED(hr)) + { + m_fLaunchQuiet = 0 < dwBool; + } + BalExitOnFailure(hr, "Failed to get LaunchQuiet value."); + + LExit: + ReleaseObject(pNode); + return hr; + } + + + // + // CreateMainWindow - creates the main install window. + // + HRESULT CreateMainWindow() + { + HRESULT hr = S_OK; + HICON hIcon = reinterpret_cast(m_pTheme->hIcon); + WNDCLASSW wc = {}; + DWORD dwWindowStyle = 0; + int x = CW_USEDEFAULT; + int y = CW_USEDEFAULT; + POINT ptCursor = {}; + HMONITOR hMonitor = NULL; + MONITORINFO mi = {}; + + // If the theme did not provide an icon, try using the icon from the bundle engine. + if (!hIcon) + { + HMODULE hBootstrapperEngine = ::GetModuleHandleW(NULL); + if (hBootstrapperEngine) + { + hIcon = ::LoadIconW(hBootstrapperEngine, MAKEINTRESOURCEW(1)); + } + } + + // Register the window class and create the window. + wc.lpfnWndProc = CWixStandardBootstrapperApplication::WndProc; + wc.hInstance = m_hModule; + wc.hIcon = hIcon; + wc.hCursor = ::LoadCursorW(NULL, (LPCWSTR)IDC_ARROW); + wc.hbrBackground = m_pTheme->rgFonts[m_pTheme->dwFontId].hBackground; + wc.lpszMenuName = NULL; + wc.lpszClassName = WIXSTDBA_WINDOW_CLASS; + if (!::RegisterClassW(&wc)) + { + ExitWithLastError(hr, "Failed to register window."); + } + + m_fRegistered = TRUE; + + // Calculate the window style based on the theme style and command display value. + dwWindowStyle = m_pTheme->dwStyle; + if (BOOTSTRAPPER_DISPLAY_NONE >= m_command.display) + { + dwWindowStyle &= ~WS_VISIBLE; + } + + // Don't show the window if there is a splash screen (it will be made visible when the splash screen is hidden) + if (::IsWindow(m_command.hwndSplashScreen)) + { + dwWindowStyle &= ~WS_VISIBLE; + } + + // Center the window on the monitor with the mouse. + if (::GetCursorPos(&ptCursor)) + { + hMonitor = ::MonitorFromPoint(ptCursor, MONITOR_DEFAULTTONEAREST); + if (hMonitor) + { + mi.cbSize = sizeof(mi); + if (::GetMonitorInfoW(hMonitor, &mi)) + { + x = mi.rcWork.left + (mi.rcWork.right - mi.rcWork.left - m_pTheme->nWidth) / 2; + y = mi.rcWork.top + (mi.rcWork.bottom - mi.rcWork.top - m_pTheme->nHeight) / 2; + } + } + } + + m_hWnd = ::CreateWindowExW(0, wc.lpszClassName, m_pTheme->sczCaption, dwWindowStyle, x, y, m_pTheme->nWidth, m_pTheme->nHeight, HWND_DESKTOP, NULL, m_hModule, this); + ExitOnNullWithLastError(m_hWnd, hr, "Failed to create window."); + + hr = S_OK; + + LExit: + return hr; + } + + + // + // InitializeTaskbarButton - initializes taskbar button for progress. + // + void InitializeTaskbarButton() + { + HRESULT hr = S_OK; + + hr = ::CoCreateInstance(CLSID_TaskbarList, NULL, CLSCTX_ALL, __uuidof(ITaskbarList3), reinterpret_cast(&m_pTaskbarList)); + if (REGDB_E_CLASSNOTREG == hr) // not supported before Windows 7 + { + ExitFunction1(hr = S_OK); + } + BalExitOnFailure(hr, "Failed to create ITaskbarList3. Continuing."); + + m_uTaskbarButtonCreatedMessage = ::RegisterWindowMessageW(L"TaskbarButtonCreated"); + BalExitOnNullWithLastError(m_uTaskbarButtonCreatedMessage, hr, "Failed to get TaskbarButtonCreated message. Continuing."); + + LExit: + return; + } + + // + // DestroyMainWindow - clean up all the window registration. + // + void DestroyMainWindow() + { + if (::IsWindow(m_hWnd)) + { + ::DestroyWindow(m_hWnd); + m_hWnd = NULL; + m_fTaskbarButtonOK = FALSE; + } + + if (m_fRegistered) + { + ::UnregisterClassW(WIXSTDBA_WINDOW_CLASS, m_hModule); + m_fRegistered = FALSE; + } + } + + + // + // WndProc - standard windows message handler. + // + static LRESULT CALLBACK WndProc( + __in HWND hWnd, + __in UINT uMsg, + __in WPARAM wParam, + __in LPARAM lParam + ) + { +#pragma warning(suppress:4312) + CWixStandardBootstrapperApplication* pBA = reinterpret_cast(::GetWindowLongPtrW(hWnd, GWLP_USERDATA)); + + switch (uMsg) + { + case WM_NCCREATE: + { + LPCREATESTRUCT lpcs = reinterpret_cast(lParam); + pBA = reinterpret_cast(lpcs->lpCreateParams); +#pragma warning(suppress:4244) + ::SetWindowLongPtrW(hWnd, GWLP_USERDATA, reinterpret_cast(pBA)); + } + break; + + case WM_NCDESTROY: + { + LRESULT lres = ThemeDefWindowProc(pBA ? pBA->m_pTheme : NULL, hWnd, uMsg, wParam, lParam); + ::SetWindowLongPtrW(hWnd, GWLP_USERDATA, 0); + return lres; + } + + case WM_CREATE: + if (!pBA->OnCreate(hWnd)) + { + return -1; + } + break; + + case WM_QUERYENDSESSION: + return IDCANCEL != pBA->OnSystemShutdown(static_cast(lParam), IDCANCEL); + + case WM_CLOSE: + // If the user chose not to close, do *not* let the default window proc handle the message. + if (!pBA->OnClose()) + { + return 0; + } + break; + + case WM_DESTROY: + ::PostQuitMessage(0); + break; + + case WM_WIXSTDBA_SHOW_HELP: + pBA->OnShowHelp(); + return 0; + + case WM_WIXSTDBA_DETECT_PACKAGES: + pBA->OnDetect(); + return 0; + + case WM_WIXSTDBA_PLAN_PACKAGES: + pBA->OnPlan(static_cast(lParam)); + return 0; + + case WM_WIXSTDBA_APPLY_PACKAGES: + pBA->OnApply(); + return 0; + + case WM_WIXSTDBA_CHANGE_STATE: + pBA->OnChangeState(static_cast(lParam)); + return 0; + + case WM_COMMAND: + switch (LOWORD(wParam)) + { + case WIXSTDBA_CONTROL_EULA_ACCEPT_CHECKBOX: + pBA->OnClickAcceptCheckbox(); + return 0; + + case WIXSTDBA_CONTROL_OPTIONS_BUTTON: + pBA->OnClickOptionsButton(); + return 0; + + case WIXSTDBA_CONTROL_BROWSE_BUTTON: + pBA->OnClickOptionsBrowseButton(WIXSTDBA_CONTROL_BROWSE_BUTTON); + return 0; + + case WIXSTDBA_CONTROL_BROWSE_BUTTON2: + pBA->OnClickOptionsBrowseButton(WIXSTDBA_CONTROL_BROWSE_BUTTON2); + return 0; + + case WIXSTDBA_CONTROL_OK_BUTTON: + pBA->OnClickOptionsOkButton(); + return 0; + + case WIXSTDBA_CONTROL_CANCEL_BUTTON: + pBA->OnClickOptionsCancelButton(); + return 0; + + case WIXSTDBA_CONTROL_INSTALL_BUTTON: + pBA->OnClickInstallButton(); + return 0; + + case WIXSTDBA_CONTROL_REPAIR_BUTTON: + pBA->OnClickRepairButton(); + return 0; + + case WIXSTDBA_CONTROL_UNINSTALL_BUTTON: + pBA->OnClickUninstallButton(); + return 0; + + case WIXSTDBA_CONTROL_LAUNCH_BUTTON: + pBA->OnClickLaunchButton(); + return 0; + + case WIXSTDBA_CONTROL_SUCCESS_RESTART_BUTTON: __fallthrough; + case WIXSTDBA_CONTROL_FAILURE_RESTART_BUTTON: + pBA->OnClickRestartButton(); + return 0; + + case WIXSTDBA_CONTROL_HELP_CANCEL_BUTTON: __fallthrough; + + case WIXSTDBA_CONTROL_WELCOME_CANCEL_BUTTON: __fallthrough; + case WIXSTDBA_CONTROL_MODIFY_CANCEL_BUTTON: __fallthrough; + case WIXSTDBA_CONTROL_PROGRESS_CANCEL_BUTTON: __fallthrough; + case WIXSTDBA_CONTROL_SUCCESS_CANCEL_BUTTON: __fallthrough; + case WIXSTDBA_CONTROL_FAILURE_CANCEL_BUTTON: __fallthrough; + case WIXSTDBA_CONTROL_CLOSE_BUTTON: + pBA->OnClickCloseButton(); + return 0; + } + break; + + case WM_NOTIFY: + if (lParam) + { + LPNMHDR pnmhdr = reinterpret_cast(lParam); + switch (pnmhdr->code) + { + case NM_CLICK: __fallthrough; + case NM_RETURN: + switch (static_cast(pnmhdr->idFrom)) + { + case WIXSTDBA_CONTROL_EULA_LINK: + pBA->OnClickEulaLink(); + return 1; + case WIXSTDBA_CONTROL_FAILURE_LOGFILE_LINK: + pBA->OnClickLogFileLink(); + return 1; + case WIXSTDBA_CONTROL_UPGRADE_LINK: + pBA->OnClickUpgradeLink(); + return 1; + } + } + } + break; + } + + if (pBA && pBA->m_pTaskbarList && uMsg == pBA->m_uTaskbarButtonCreatedMessage) + { + pBA->m_fTaskbarButtonOK = TRUE; + return 0; + } + + return ThemeDefWindowProc(pBA ? pBA->m_pTheme : NULL, hWnd, uMsg, wParam, lParam); + } + + + // + // OnCreate - finishes loading the theme. + // + BOOL OnCreate( + __in HWND hWnd + ) + { + HRESULT hr = S_OK; + LPWSTR sczText = NULL; + LPWSTR sczLicenseFormatted = NULL; + LPWSTR sczLicensePath = NULL; + LPWSTR sczLicenseDirectory = NULL; + LPWSTR sczLicenseFilename = NULL; + + hr = ThemeLoadControls(m_pTheme, hWnd, vrgInitControls, countof(vrgInitControls)); + BalExitOnFailure(hr, "Failed to load theme controls."); + + C_ASSERT(COUNT_WIXSTDBA_PAGE == countof(vrgwzPageNames)); + C_ASSERT(countof(m_rgdwPageIds) == countof(vrgwzPageNames)); + + ThemeGetPageIds(m_pTheme, vrgwzPageNames, m_rgdwPageIds, countof(m_rgdwPageIds)); + + // Initialize the text on all "application" (non-page) controls. + for (DWORD i = 0; i < m_pTheme->cControls; ++i) + { + THEME_CONTROL* pControl = m_pTheme->rgControls + i; + if (!pControl->wPageId && pControl->sczText && *pControl->sczText) + { + HRESULT hrFormat = BalFormatString(pControl->sczText, &sczText); + if (SUCCEEDED(hrFormat)) + { + ThemeSetTextControl(m_pTheme, pControl->wId, sczText); + } + } + } + + // Load the RTF EULA control with text if the control exists. + if (ThemeControlExists(m_pTheme, WIXSTDBA_CONTROL_EULA_RICHEDIT)) + { + hr = (m_sczLicenseFile && *m_sczLicenseFile) ? S_OK : E_INVALIDDATA; + if (SUCCEEDED(hr)) + { + hr = StrAllocString(&sczLicenseFormatted, m_sczLicenseFile, 0); + if (SUCCEEDED(hr)) + { + hr = LocLocalizeString(m_pWixLoc, &sczLicenseFormatted); + if (SUCCEEDED(hr)) + { + hr = BalFormatString(sczLicenseFormatted, &sczLicenseFormatted); + if (SUCCEEDED(hr)) + { + hr = PathRelativeToModule(&sczLicensePath, sczLicenseFormatted, m_hModule); + if (SUCCEEDED(hr)) + { + hr = PathGetDirectory(sczLicensePath, &sczLicenseDirectory); + if (SUCCEEDED(hr)) + { + hr = StrAllocString(&sczLicenseFilename, PathFile(sczLicenseFormatted), 0); + if (SUCCEEDED(hr)) + { + hr = LocProbeForFile(sczLicenseDirectory, sczLicenseFilename, m_sczLanguage, &sczLicensePath); + if (SUCCEEDED(hr)) + { + hr = ThemeLoadRichEditFromFile(m_pTheme, WIXSTDBA_CONTROL_EULA_RICHEDIT, sczLicensePath, m_hModule); + } + } + } + } + } + } + } + } + + if (FAILED(hr)) + { + BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Failed to load file into license richedit control from path '%ls' manifest value: %ls", sczLicensePath, m_sczLicenseFile); + hr = S_OK; + } + } + + LExit: + ReleaseStr(sczLicenseFilename); + ReleaseStr(sczLicenseDirectory); + ReleaseStr(sczLicensePath); + ReleaseStr(sczLicenseFormatted); + ReleaseStr(sczText); + + return SUCCEEDED(hr); + } + + + // + // OnShowHelp - display the help page. + // + void OnShowHelp() + { + SetState(WIXSTDBA_STATE_HELP, S_OK); + + // If the UI should be visible, display it now and hide the splash screen + if (BOOTSTRAPPER_DISPLAY_NONE < m_command.display) + { + ::ShowWindow(m_pTheme->hwndParent, SW_SHOW); + } + + m_pEngine->CloseSplashScreen(); + + return; + } + + + // + // OnDetect - start the processing of packages. + // + void OnDetect() + { + HRESULT hr = S_OK; + + if (m_pBAFunction) + { + hr = m_pBAFunction->OnDetect(); + BalExitOnFailure(hr, "Failed calling detect BA function."); + } + + SetState(WIXSTDBA_STATE_DETECTING, hr); + + // If the UI should be visible, display it now and hide the splash screen + if (BOOTSTRAPPER_DISPLAY_NONE < m_command.display) + { + ::ShowWindow(m_pTheme->hwndParent, SW_SHOW); + } + + m_pEngine->CloseSplashScreen(); + + // Tell the core we're ready for the packages to be processed now. + hr = m_pEngine->Detect(); + BalExitOnFailure(hr, "Failed to start detecting chain."); + + LExit: + if (FAILED(hr)) + { + SetState(WIXSTDBA_STATE_DETECTING, hr); + } + + return; + } + + + // + // OnPlan - plan the detected changes. + // + void OnPlan( + __in BOOTSTRAPPER_ACTION action + ) + { + HRESULT hr = S_OK; + + m_plannedAction = action; + + // If we are going to apply a downgrade, bail. + if (m_fDowngrading && BOOTSTRAPPER_ACTION_UNINSTALL < action) + { + if (m_fSuppressDowngradeFailure) + { + BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "A newer version of this product is installed but downgrade failure has been suppressed; continuing..."); + } + else + { + hr = HRESULT_FROM_WIN32(ERROR_PRODUCT_VERSION); + BalExitOnFailure(hr, "Cannot install a product when a newer version is installed."); + } + } + + SetState(WIXSTDBA_STATE_PLANNING, hr); + + if (m_pBAFunction) + { + m_pBAFunction->OnPlan(); + } + + hr = m_pEngine->Plan(action); + BalExitOnFailure(hr, "Failed to start planning packages."); + + LExit: + if (FAILED(hr)) + { + SetState(WIXSTDBA_STATE_PLANNING, hr); + } + + return; + } + + + // + // OnApply - apply the packages. + // + void OnApply() + { + HRESULT hr = S_OK; + + SetState(WIXSTDBA_STATE_APPLYING, hr); + SetProgressState(hr); + SetTaskbarButtonProgress(0); + + hr = m_pEngine->Apply(m_hWnd); + BalExitOnFailure(hr, "Failed to start applying packages."); + + ThemeControlEnable(m_pTheme, WIXSTDBA_CONTROL_PROGRESS_CANCEL_BUTTON, TRUE); // ensure the cancel button is enabled before starting. + + LExit: + if (FAILED(hr)) + { + SetState(WIXSTDBA_STATE_APPLYING, hr); + } + + return; + } + + + // + // OnChangeState - change state. + // + void OnChangeState( + __in WIXSTDBA_STATE state + ) + { + WIXSTDBA_STATE stateOld = m_state; + DWORD dwOldPageId = 0; + DWORD dwNewPageId = 0; + LPWSTR sczText = NULL; + LPWSTR sczUnformattedText = NULL; + LPWSTR sczControlState = NULL; + LPWSTR sczControlName = NULL; + + m_state = state; + + // If our install is at the end (success or failure) and we're not showing full UI or + // we successfully installed the prerequisite then exit (prompt for restart if required). + if ((WIXSTDBA_STATE_APPLIED <= m_state && BOOTSTRAPPER_DISPLAY_FULL > m_command.display) || + (WIXSTDBA_STATE_APPLIED == m_state && m_fPrereq)) + { + // If a restart was required but we were not automatically allowed to + // accept the reboot then do the prompt. + if (m_fRestartRequired && !m_fAllowRestart) + { + StrAllocFromError(&sczUnformattedText, HRESULT_FROM_WIN32(ERROR_SUCCESS_REBOOT_REQUIRED), NULL); + + int nResult = ::MessageBoxW(m_hWnd, sczUnformattedText ? sczUnformattedText : L"The requested operation is successful. Changes will not be effective until the system is rebooted.", m_pTheme->sczCaption, MB_ICONEXCLAMATION | MB_OKCANCEL); + m_fAllowRestart = (IDOK == nResult); + } + + if ((BOOTSTRAPPER_DISPLAY_PASSIVE == m_command.display && m_fLaunchPassive) || (m_command.display == BOOTSTRAPPER_DISPLAY_NONE && m_fLaunchQuiet)) + { + BOOL fLaunchTargetExists = BalStringVariableExists(WIXSTDBA_VARIABLE_LAUNCH_TARGET_PATH); + if (fLaunchTargetExists) + OnClickLaunchButton(); + } + + // Quietly exit. + ::PostMessageW(m_hWnd, WM_CLOSE, 0, 0); + } + else // try to change the pages. + { + DeterminePageId(stateOld, &dwOldPageId); + DeterminePageId(m_state, &dwNewPageId); + + if (dwOldPageId != dwNewPageId) + { + // Enable disable controls per-page. + if (m_rgdwPageIds[WIXSTDBA_PAGE_INSTALL] == dwNewPageId) // on the "Install" page, ensure the install button is enabled/disabled correctly. + { + LONGLONG llElevated = 0; + if (m_Bundle.fPerMachine) + { + BalGetNumericVariable(WIXBUNDLE_VARIABLE_ELEVATED, &llElevated); + } + ThemeControlElevates(m_pTheme, WIXSTDBA_CONTROL_INSTALL_BUTTON, (m_Bundle.fPerMachine && !llElevated)); + + // If the EULA control exists, show it only if a license URL is provided as well. + if (ThemeControlExists(m_pTheme, WIXSTDBA_CONTROL_EULA_LINK)) + { + BOOL fEulaLink = (m_sczLicenseUrl && *m_sczLicenseUrl); + ThemeControlEnable(m_pTheme, WIXSTDBA_CONTROL_EULA_LINK, fEulaLink); + ThemeControlEnable(m_pTheme, WIXSTDBA_CONTROL_EULA_ACCEPT_CHECKBOX, fEulaLink); + } + + BOOL fAcceptedLicense = !ThemeControlExists(m_pTheme, WIXSTDBA_CONTROL_EULA_ACCEPT_CHECKBOX) || !ThemeControlEnabled(m_pTheme, WIXSTDBA_CONTROL_EULA_ACCEPT_CHECKBOX) || ThemeIsControlChecked(m_pTheme, WIXSTDBA_CONTROL_EULA_ACCEPT_CHECKBOX); + ThemeControlEnable(m_pTheme, WIXSTDBA_CONTROL_INSTALL_BUTTON, fAcceptedLicense); + + // If there is an "Options" page, the "Options" button exists, and it hasn't been suppressed, then enable the button. + BOOL fOptionsEnabled = m_rgdwPageIds[WIXSTDBA_PAGE_OPTIONS] && ThemeControlExists(m_pTheme, WIXSTDBA_CONTROL_OPTIONS_BUTTON) && !m_fSuppressOptionsUI; + ThemeControlEnable(m_pTheme, WIXSTDBA_CONTROL_OPTIONS_BUTTON, fOptionsEnabled); + + // Show/Hide the version label if it exists. + if (m_rgdwPageIds[WIXSTDBA_PAGE_OPTIONS] && ThemeControlExists(m_pTheme, WIXSTDBA_CONTROL_VERSION_LABEL) && !m_fShowVersion) + { + ThemeShowControl(m_pTheme, WIXSTDBA_CONTROL_VERSION_LABEL, SW_HIDE); + } + } + else if (m_rgdwPageIds[WIXSTDBA_PAGE_MODIFY] == dwNewPageId) + { + ThemeControlEnable(m_pTheme, WIXSTDBA_CONTROL_REPAIR_BUTTON, !m_fSuppressRepair); + } + else if (m_rgdwPageIds[WIXSTDBA_PAGE_OPTIONS] == dwNewPageId) + { + HRESULT hr = BalGetStringVariable(WIXSTDBA_VARIABLE_INSTALL_FOLDER, &sczUnformattedText); + if (SUCCEEDED(hr)) + { + BalFormatString(sczUnformattedText, &sczText); + ThemeSetTextControl(m_pTheme, WIXSTDBA_CONTROL_FOLDER_EDITBOX, sczText); + } + + hr = BalGetStringVariable(WIXSTDBA_VARIABLE_INSTALL_FOLDER2, &sczUnformattedText); + if (SUCCEEDED(hr)) + { + BalFormatString(sczUnformattedText, &sczText); + ThemeSetTextControl(m_pTheme, WIXSTDBA_CONTROL_FOLDER_EDITBOX2, sczText); + } + } + else if (m_rgdwPageIds[WIXSTDBA_PAGE_SUCCESS] == dwNewPageId) // on the "Success" page, check if the restart or launch button should be enabled. + { + BOOL fShowRestartButton = FALSE; + BOOL fLaunchTargetExists = FALSE; + if (m_fRestartRequired) + { + if (BOOTSTRAPPER_RESTART_PROMPT == m_command.restart) + { + fShowRestartButton = TRUE; + } + } + else if (ThemeControlExists(m_pTheme, WIXSTDBA_CONTROL_LAUNCH_BUTTON)) + { + fLaunchTargetExists = BalStringVariableExists(WIXSTDBA_VARIABLE_LAUNCH_TARGET_PATH); + } + + ThemeControlEnable(m_pTheme, WIXSTDBA_CONTROL_LAUNCH_BUTTON, fLaunchTargetExists && BOOTSTRAPPER_ACTION_UNINSTALL < m_plannedAction); + ThemeControlEnable(m_pTheme, WIXSTDBA_CONTROL_SUCCESS_RESTART_TEXT, fShowRestartButton); + ThemeControlEnable(m_pTheme, WIXSTDBA_CONTROL_SUCCESS_RESTART_BUTTON, fShowRestartButton); + } + else if (m_rgdwPageIds[WIXSTDBA_PAGE_FAILURE] == dwNewPageId) // on the "Failure" page, show error message and check if the restart button should be enabled. + { + BOOL fShowLogLink = (m_Bundle.sczLogVariable && *m_Bundle.sczLogVariable); // if there is a log file variable then we'll assume the log file exists. + BOOL fShowErrorMessage = FALSE; + BOOL fShowRestartButton = FALSE; + + if (FAILED(m_hrFinal)) + { + // If we know the failure message, use that. + if (m_sczFailedMessage && *m_sczFailedMessage) + { + StrAllocString(&sczUnformattedText, m_sczFailedMessage, 0); + } + else // try to get the error message from the error code. + { + StrAllocFromError(&sczUnformattedText, m_hrFinal, NULL); + if (!sczUnformattedText || !*sczUnformattedText) + { + StrAllocFromError(&sczUnformattedText, E_FAIL, NULL); + } + } + + StrAllocFormatted(&sczText, L"0x%08x - %ls", m_hrFinal, sczUnformattedText); + ThemeSetTextControl(m_pTheme, WIXSTDBA_CONTROL_FAILURE_MESSAGE_TEXT, sczText); + fShowErrorMessage = TRUE; + } + + if (m_fRestartRequired) + { + if (BOOTSTRAPPER_RESTART_PROMPT == m_command.restart) + { + fShowRestartButton = TRUE; + } + } + + ThemeControlEnable(m_pTheme, WIXSTDBA_CONTROL_FAILURE_LOGFILE_LINK, fShowLogLink); + ThemeControlEnable(m_pTheme, WIXSTDBA_CONTROL_FAILURE_MESSAGE_TEXT, fShowErrorMessage); + ThemeControlEnable(m_pTheme, WIXSTDBA_CONTROL_FAILURE_RESTART_TEXT, fShowRestartButton); + ThemeControlEnable(m_pTheme, WIXSTDBA_CONTROL_FAILURE_RESTART_BUTTON, fShowRestartButton); + } + + // Hide the upgrade link + if (ThemeControlExists(m_pTheme, WIXSTDBA_CONTROL_UPGRADE_LINK)) + { + ThemeControlEnable(m_pTheme, WIXSTDBA_CONTROL_UPGRADE_LINK, FALSE); + } + + // Process each control for special handling in the new page. + THEME_PAGE* pPage = ThemeGetPage(m_pTheme, dwNewPageId); + if (pPage) + { + for (DWORD i = 0; i < pPage->cControlIndices; ++i) + { + THEME_CONTROL* pControl = m_pTheme->rgControls + pPage->rgdwControlIndices[i]; + + // If we are on the install, options or modify pages and this is a named control, try to set its default state. + if ((m_rgdwPageIds[WIXSTDBA_PAGE_INSTALL] == dwNewPageId || + m_rgdwPageIds[WIXSTDBA_PAGE_OPTIONS] == dwNewPageId || + m_rgdwPageIds[WIXSTDBA_PAGE_MODIFY] == dwNewPageId) && + pControl->sczName && *pControl->sczName) + { + // If this is a checkbox control, try to set its default state to the state of a matching named Burn variable. + if (THEME_CONTROL_TYPE_CHECKBOX == pControl->type && WIXSTDBA_CONTROL_EULA_ACCEPT_CHECKBOX != pControl->wId) + { + LONGLONG llValue = 0; + HRESULT hr = BalGetNumericVariable(pControl->sczName, &llValue); + + ThemeSendControlMessage(m_pTheme, pControl->wId, BM_SETCHECK, SUCCEEDED(hr) && llValue ? BST_CHECKED : BST_UNCHECKED, 0); + } + + // If this is a button control with the BS_AUTORADIOBUTTON style, try to set its default + // state to the state of a matching named Burn variable. + if (THEME_CONTROL_TYPE_BUTTON == pControl->type && (BS_AUTORADIOBUTTON == (BS_AUTORADIOBUTTON & pControl->dwStyle))) + { + LONGLONG llValue = 0; + HRESULT hr = BalGetNumericVariable(pControl->sczName, &llValue); + + // If the control value isn't set then disable it. + if (!SUCCEEDED(hr)) + { + ThemeControlEnable(m_pTheme, pControl->wId, FALSE); + } + else + { + ThemeSendControlMessage(m_pTheme, pControl->wId, BM_SETCHECK, SUCCEEDED(hr) && llValue ? BST_CHECKED : BST_UNCHECKED, 0); + } + } + + // Hide or disable controls based on the control name with 'State' appended + HRESULT hr = StrAllocFormatted(&sczControlName, L"%lsState", pControl->sczName); + if (SUCCEEDED(hr)) + { + hr = BalGetStringVariable(sczControlName, &sczControlState); + if (SUCCEEDED(hr) && sczControlState && *sczControlState) + { + if (CSTR_EQUAL == ::CompareStringW(LOCALE_NEUTRAL, 0, sczControlState, -1, L"disable", -1)) + { + BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "Disable control %ls", pControl->sczName); + ThemeControlEnable(m_pTheme, pControl->wId, FALSE); + } + else if (CSTR_EQUAL == ::CompareStringW(LOCALE_NEUTRAL, 0, sczControlState, -1, L"hide", -1)) + { + BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "Hide control %ls", pControl->sczName); + // TODO: This doesn't work + ThemeShowControl(m_pTheme, pControl->wId, SW_HIDE); + } + } + } + } + + // Format the text in each of the new page's controls (if they have any text). + if (pControl->sczText && *pControl->sczText) + { + HRESULT hr = BalFormatString(pControl->sczText, &sczText); + if (SUCCEEDED(hr)) + { + ThemeSetTextControl(m_pTheme, pControl->wId, sczText); + } + } + } + } + + ThemeShowPage(m_pTheme, dwOldPageId, SW_HIDE); + ThemeShowPage(m_pTheme, dwNewPageId, SW_SHOW); + + // Remember current page + m_dwCurrentPage = dwNewPageId; + + // On the install page set the focus to the install button or the next enabled control if install is disabled + if (m_rgdwPageIds[WIXSTDBA_PAGE_INSTALL] == dwNewPageId) + { + HWND hwndFocus = ::GetDlgItem(m_pTheme->hwndParent, WIXSTDBA_CONTROL_INSTALL_BUTTON); + if (hwndFocus && !ThemeControlEnabled(m_pTheme, WIXSTDBA_CONTROL_INSTALL_BUTTON)) + { + hwndFocus = ::GetNextDlgTabItem(m_pTheme->hwndParent, hwndFocus, FALSE); + } + + if (hwndFocus) + { + ::SetFocus(hwndFocus); + } + } + } + } + + ReleaseStr(sczText); + ReleaseStr(sczUnformattedText); + ReleaseStr(sczControlState); + ReleaseStr(sczControlName); + } + + + // + // OnClose - called when the window is trying to be closed. + // + BOOL OnClose() + { + BOOL fClose = FALSE; + + // If we've already succeeded or failed or showing the help page, just close (prompts are annoying if the bootstrapper is done). + if (WIXSTDBA_STATE_APPLIED <= m_state || WIXSTDBA_STATE_HELP == m_state) + { + fClose = TRUE; + } + else // prompt the user or force the cancel if there is no UI. + { + fClose = PromptCancel(m_hWnd, BOOTSTRAPPER_DISPLAY_FULL != m_command.display, m_sczConfirmCloseMessage ? m_sczConfirmCloseMessage : L"Are you sure you want to cancel?", m_pTheme->sczCaption); + } + + // If we're doing progress then we never close, we just cancel to let rollback occur. + if (WIXSTDBA_STATE_APPLYING <= m_state && WIXSTDBA_STATE_APPLIED > m_state) + { + // If we canceled disable cancel button since clicking it again is silly. + if (fClose) + { + ThemeControlEnable(m_pTheme, WIXSTDBA_CONTROL_PROGRESS_CANCEL_BUTTON, FALSE); + } + + fClose = FALSE; + } + + return fClose; + } + + + // + // OnClickAcceptCheckbox - allow the install to continue. + // + void OnClickAcceptCheckbox() + { + BOOL fAcceptedLicense = ThemeIsControlChecked(m_pTheme, WIXSTDBA_CONTROL_EULA_ACCEPT_CHECKBOX); + ThemeControlEnable(m_pTheme, WIXSTDBA_CONTROL_INSTALL_BUTTON, fAcceptedLicense); + } + + + // + // OnClickOptionsButton - show the options page. + // + void OnClickOptionsButton() + { + SavePageSettings(WIXSTDBA_PAGE_INSTALL); + m_stateBeforeOptions = m_state; + SetState(WIXSTDBA_STATE_OPTIONS, S_OK); + } + + + // + // OnClickOptionsBrowseButton - browse for install folder on the options page. + // + void OnClickOptionsBrowseButton(DWORD dwControl) + { + WCHAR wzPath[MAX_PATH] = {}; + BROWSEINFOW browseInfo = {}; + PIDLIST_ABSOLUTE pidl = NULL; + PIDLIST_ABSOLUTE pidlRoot = NULL; + + ::SHGetFolderLocation(m_hWnd, CSIDL_DRIVES, NULL, 0, &pidlRoot); + + browseInfo.hwndOwner = m_hWnd; + browseInfo.pszDisplayName = wzPath; + browseInfo.lpszTitle = m_pTheme->sczCaption; + browseInfo.ulFlags = BIF_RETURNONLYFSDIRS | BIF_USENEWUI; + browseInfo.pidlRoot = pidlRoot; + pidl = ::SHBrowseForFolderW(&browseInfo); + if (pidl && ::SHGetPathFromIDListW(pidl, wzPath)) + { + switch (dwControl) + { + case WIXSTDBA_CONTROL_BROWSE_BUTTON: + ThemeSetTextControl(m_pTheme, WIXSTDBA_CONTROL_FOLDER_EDITBOX, wzPath); + break; + + case WIXSTDBA_CONTROL_BROWSE_BUTTON2: + ThemeSetTextControl(m_pTheme, WIXSTDBA_CONTROL_FOLDER_EDITBOX2, wzPath); + break; + } + } + + if (pidl) + { + ::CoTaskMemFree(pidl); + } + + return; + } + + // + // OnClickOptionsOkButton - accept the changes made by the options page. + // + void OnClickOptionsOkButton() + { + HRESULT hr = S_OK; + LPWSTR sczPath = NULL; + + if (ThemeControlExists(m_pTheme, WIXSTDBA_CONTROL_FOLDER_EDITBOX)) + { + hr = ThemeGetTextControl(m_pTheme, WIXSTDBA_CONTROL_FOLDER_EDITBOX, &sczPath); + ExitOnFailure(hr, "Failed to get text from folder edit box."); + + // TODO: verify the path is valid. + + hr = m_pEngine->SetVariableString(WIXSTDBA_VARIABLE_INSTALL_FOLDER, sczPath); + ExitOnFailure(hr, "Failed to set the install folder."); + } + + if (ThemeControlExists(m_pTheme, WIXSTDBA_CONTROL_FOLDER_EDITBOX2)) + { + hr = ThemeGetTextControl(m_pTheme, WIXSTDBA_CONTROL_FOLDER_EDITBOX2, &sczPath); + ExitOnFailure(hr, "Failed to get text from folder edit box2."); + + // TODO: verify the path is valid. + + hr = m_pEngine->SetVariableString(WIXSTDBA_VARIABLE_INSTALL_FOLDER2, sczPath); + ExitOnFailure(hr, "Failed to set the install folder2."); + } + + SavePageSettings(WIXSTDBA_PAGE_OPTIONS); + + LExit: + SetState(m_stateBeforeOptions, S_OK); + return; + } + + + // + // OnClickOptionsCancelButton - discard the changes made by the options page. + // + void OnClickOptionsCancelButton() + { + SetState(m_stateBeforeOptions, S_OK); + } + + + // + // OnClickInstallButton - start the install by planning the packages. + // + void OnClickInstallButton() + { + SavePageSettings(WIXSTDBA_PAGE_INSTALL); + + this->OnPlan(BOOTSTRAPPER_ACTION_INSTALL); + } + + + // + // OnClickRepairButton - start the repair. + // + void OnClickRepairButton() + { + this->OnPlan(BOOTSTRAPPER_ACTION_REPAIR); + } + + + // + // OnClickUninstallButton - start the uninstall. + // + void OnClickUninstallButton() + { + this->OnPlan(BOOTSTRAPPER_ACTION_UNINSTALL); + } + + + // + // OnClickCloseButton - close the application. + // + void OnClickCloseButton() + { + ::SendMessageW(m_hWnd, WM_CLOSE, 0, 0); + } + + + // + // OnClickEulaLink - show the end user license agreement. + // + void OnClickEulaLink() + { + HRESULT hr = S_OK; + LPWSTR sczLicenseUrl = NULL; + LPWSTR sczLicensePath = NULL; + LPWSTR sczLicenseDirectory = NULL; + URI_PROTOCOL protocol = URI_PROTOCOL_UNKNOWN; + + hr = StrAllocString(&sczLicenseUrl, m_sczLicenseUrl, 0); + BalExitOnFailure1(hr, "Failed to copy license URL: %ls", m_sczLicenseUrl); + + hr = LocLocalizeString(m_pWixLoc, &sczLicenseUrl); + BalExitOnFailure1(hr, "Failed to localize license URL: %ls", m_sczLicenseUrl); + + hr = BalFormatString(sczLicenseUrl, &sczLicenseUrl); + BalExitOnFailure1(hr, "Failed to get formatted license URL: %ls", m_sczLicenseUrl); + + hr = UriProtocol(sczLicenseUrl, &protocol); + if (FAILED(hr) || URI_PROTOCOL_UNKNOWN == protocol) + { + // Probe for localised license file + hr = PathRelativeToModule(&sczLicensePath, sczLicenseUrl, m_hModule); + if (SUCCEEDED(hr)) + { + hr = PathGetDirectory(sczLicensePath, &sczLicenseDirectory); + if (SUCCEEDED(hr)) + { + hr = LocProbeForFile(sczLicenseDirectory, PathFile(sczLicenseUrl), m_sczLanguage, &sczLicensePath); + } + } + } + + hr = ShelExec(sczLicensePath ? sczLicensePath : sczLicenseUrl, NULL, L"open", NULL, SW_SHOWDEFAULT, m_hWnd, NULL); + BalExitOnFailure(hr, "Failed to launch URL to EULA."); + + LExit: + ReleaseStr(sczLicensePath); + ReleaseStr(sczLicenseUrl); + ReleaseStr(sczLicenseDirectory); + + return; + } + + + // + // OnClickUpgradeLink - download the upgrade. + // + void OnClickUpgradeLink() + { + this->OnPlan(BOOTSTRAPPER_ACTION_UPDATE_REPLACE); + + m_fUpdating = TRUE; + + return; + } + + + // + // OnClickLaunchButton - launch the app from the success page. + // + void OnClickLaunchButton() + { + HRESULT hr = S_OK; + LPWSTR sczUnformattedLaunchTarget = NULL; + LPWSTR sczLaunchTarget = NULL; + LPWSTR sczUnformattedArguments = NULL; + LPWSTR sczArguments = NULL; + int nCmdShow = SW_SHOWNORMAL; + + hr = BalGetStringVariable(WIXSTDBA_VARIABLE_LAUNCH_TARGET_PATH, &sczUnformattedLaunchTarget); + BalExitOnFailure1(hr, "Failed to get launch target variable '%ls'.", WIXSTDBA_VARIABLE_LAUNCH_TARGET_PATH); + + hr = BalFormatString(sczUnformattedLaunchTarget, &sczLaunchTarget); + BalExitOnFailure1(hr, "Failed to format launch target variable: %ls", sczUnformattedLaunchTarget); + + if (BalStringVariableExists(WIXSTDBA_VARIABLE_LAUNCH_ARGUMENTS)) + { + hr = BalGetStringVariable(WIXSTDBA_VARIABLE_LAUNCH_ARGUMENTS, &sczUnformattedArguments); + BalExitOnFailure1(hr, "Failed to get launch arguments '%ls'.", WIXSTDBA_VARIABLE_LAUNCH_ARGUMENTS); + + hr = BalFormatString(sczUnformattedArguments, &sczArguments); + BalExitOnFailure1(hr, "Failed to format launch arguments variable: %ls", sczUnformattedArguments); + } + + if (BalStringVariableExists(WIXSTDBA_VARIABLE_LAUNCH_HIDDEN)) + { + nCmdShow = SW_HIDE; + } + + hr = ShelExec(sczLaunchTarget, sczArguments, L"open", NULL, nCmdShow, m_hWnd, NULL); + BalExitOnFailure1(hr, "Failed to launch target: %ls", sczLaunchTarget); + + ::PostMessageW(m_hWnd, WM_CLOSE, 0, 0); + + LExit: + ReleaseStr(sczArguments); + ReleaseStr(sczUnformattedArguments); + ReleaseStr(sczLaunchTarget); + ReleaseStr(sczUnformattedLaunchTarget); + + return; + } + + + // + // OnClickRestartButton - allows the restart and closes the app. + // + void OnClickRestartButton() + { + AssertSz(m_fRestartRequired, "Restart must be requested to be able to click on the restart button."); + + m_fAllowRestart = TRUE; + ::SendMessageW(m_hWnd, WM_CLOSE, 0, 0); + + return; + } + + + // + // OnClickLogFileLink - show the log file. + // + void OnClickLogFileLink() + { + HRESULT hr = S_OK; + LPWSTR sczLogFile = NULL; + + hr = BalGetStringVariable(m_Bundle.sczLogVariable, &sczLogFile); + BalExitOnFailure1(hr, "Failed to get log file variable '%ls'.", m_Bundle.sczLogVariable); + + hr = ShelExec(L"notepad.exe", sczLogFile, L"open", NULL, SW_SHOWDEFAULT, m_hWnd, NULL); + BalExitOnFailure1(hr, "Failed to open log file target: %ls", sczLogFile); + + LExit: + ReleaseStr(sczLogFile); + + return; + } + + + // + // SetState + // + void SetState( + __in WIXSTDBA_STATE state, + __in HRESULT hrStatus + ) + { + if (FAILED(hrStatus)) + { + m_hrFinal = hrStatus; + } + + if (FAILED(m_hrFinal)) + { + state = WIXSTDBA_STATE_FAILED; + } + + if (WIXSTDBA_STATE_OPTIONS == state || m_state < state) + { + ::PostMessageW(m_hWnd, WM_WIXSTDBA_CHANGE_STATE, 0, state); + } + } + + + void DeterminePageId( + __in WIXSTDBA_STATE state, + __out DWORD* pdwPageId + ) + { + if (BOOTSTRAPPER_DISPLAY_PASSIVE == m_command.display) + { + switch (state) + { + case WIXSTDBA_STATE_INITIALIZED: + *pdwPageId = BOOTSTRAPPER_ACTION_HELP == m_command.action ? m_rgdwPageIds[WIXSTDBA_PAGE_HELP] : m_rgdwPageIds[WIXSTDBA_PAGE_LOADING]; + break; + + case WIXSTDBA_STATE_HELP: + *pdwPageId = m_rgdwPageIds[WIXSTDBA_PAGE_HELP]; + break; + + case WIXSTDBA_STATE_DETECTING: + *pdwPageId = m_rgdwPageIds[WIXSTDBA_PAGE_LOADING] ? m_rgdwPageIds[WIXSTDBA_PAGE_LOADING] : m_rgdwPageIds[WIXSTDBA_PAGE_PROGRESS_PASSIVE] ? m_rgdwPageIds[WIXSTDBA_PAGE_PROGRESS_PASSIVE] : m_rgdwPageIds[WIXSTDBA_PAGE_PROGRESS]; + break; + + case WIXSTDBA_STATE_DETECTED: __fallthrough; + case WIXSTDBA_STATE_PLANNING: __fallthrough; + case WIXSTDBA_STATE_PLANNED: __fallthrough; + case WIXSTDBA_STATE_APPLYING: __fallthrough; + case WIXSTDBA_STATE_CACHING: __fallthrough; + case WIXSTDBA_STATE_CACHED: __fallthrough; + case WIXSTDBA_STATE_EXECUTING: __fallthrough; + case WIXSTDBA_STATE_EXECUTED: + *pdwPageId = m_rgdwPageIds[WIXSTDBA_PAGE_PROGRESS_PASSIVE] ? m_rgdwPageIds[WIXSTDBA_PAGE_PROGRESS_PASSIVE] : m_rgdwPageIds[WIXSTDBA_PAGE_PROGRESS]; + break; + + default: + *pdwPageId = 0; + break; + } + } + else if (BOOTSTRAPPER_DISPLAY_FULL == m_command.display) + { + switch (state) + { + case WIXSTDBA_STATE_INITIALIZING: + *pdwPageId = 0; + break; + + case WIXSTDBA_STATE_INITIALIZED: + *pdwPageId = BOOTSTRAPPER_ACTION_HELP == m_command.action ? m_rgdwPageIds[WIXSTDBA_PAGE_HELP] : m_rgdwPageIds[WIXSTDBA_PAGE_LOADING]; + break; + + case WIXSTDBA_STATE_HELP: + *pdwPageId = m_rgdwPageIds[WIXSTDBA_PAGE_HELP]; + break; + + case WIXSTDBA_STATE_DETECTING: + *pdwPageId = m_rgdwPageIds[WIXSTDBA_PAGE_LOADING]; + break; + + case WIXSTDBA_STATE_DETECTED: + switch (m_command.action) + { + case BOOTSTRAPPER_ACTION_INSTALL: + *pdwPageId = m_rgdwPageIds[WIXSTDBA_PAGE_INSTALL]; + break; + + case BOOTSTRAPPER_ACTION_MODIFY: __fallthrough; + case BOOTSTRAPPER_ACTION_REPAIR: __fallthrough; + case BOOTSTRAPPER_ACTION_UNINSTALL: + *pdwPageId = m_rgdwPageIds[WIXSTDBA_PAGE_MODIFY]; + break; + } + break; + + case WIXSTDBA_STATE_OPTIONS: + *pdwPageId = m_rgdwPageIds[WIXSTDBA_PAGE_OPTIONS]; + break; + + case WIXSTDBA_STATE_PLANNING: __fallthrough; + case WIXSTDBA_STATE_PLANNED: __fallthrough; + case WIXSTDBA_STATE_APPLYING: __fallthrough; + case WIXSTDBA_STATE_CACHING: __fallthrough; + case WIXSTDBA_STATE_CACHED: __fallthrough; + case WIXSTDBA_STATE_EXECUTING: __fallthrough; + case WIXSTDBA_STATE_EXECUTED: + *pdwPageId = m_rgdwPageIds[WIXSTDBA_PAGE_PROGRESS]; + break; + + case WIXSTDBA_STATE_APPLIED: + *pdwPageId = m_rgdwPageIds[WIXSTDBA_PAGE_SUCCESS]; + break; + + case WIXSTDBA_STATE_FAILED: + *pdwPageId = m_rgdwPageIds[WIXSTDBA_PAGE_FAILURE]; + break; + } + } + } + + + HRESULT EvaluateConditions() + { + HRESULT hr = S_OK; + BOOL fResult = FALSE; + + for (DWORD i = 0; i < m_Conditions.cConditions; ++i) + { + BAL_CONDITION* pCondition = m_Conditions.rgConditions + i; + + hr = BalConditionEvaluate(pCondition, m_pEngine, &fResult, &m_sczFailedMessage); + BalExitOnFailure(hr, "Failed to evaluate condition."); + + if (!fResult) + { + hr = E_WIXSTDBA_CONDITION_FAILED; + BalExitOnFailure1(hr, "Bundle condition evaluated to false: %ls", pCondition->sczCondition); + } + } + + ReleaseNullStr(m_sczFailedMessage); + + LExit: + return hr; + } + + + void SetTaskbarButtonProgress( + __in DWORD dwOverallPercentage + ) + { + HRESULT hr = S_OK; + + if (m_fTaskbarButtonOK) + { + hr = m_pTaskbarList->SetProgressValue(m_hWnd, dwOverallPercentage, 100UL); + BalExitOnFailure1(hr, "Failed to set taskbar button progress to: %d%%.", dwOverallPercentage); + } + + LExit: + return; + } + + + void SetTaskbarButtonState( + __in TBPFLAG tbpFlags + ) + { + HRESULT hr = S_OK; + + if (m_fTaskbarButtonOK) + { + hr = m_pTaskbarList->SetProgressState(m_hWnd, tbpFlags); + BalExitOnFailure1(hr, "Failed to set taskbar button state.", tbpFlags); + } + + LExit: + return; + } + + + void SetProgressState( + __in HRESULT hrStatus + ) + { + TBPFLAG flag = TBPF_NORMAL; + + if (IsCanceled() || HRESULT_FROM_WIN32(ERROR_INSTALL_USEREXIT) == hrStatus) + { + flag = TBPF_PAUSED; + } + else if (IsRollingBack() || FAILED(hrStatus)) + { + flag = TBPF_ERROR; + } + + SetTaskbarButtonState(flag); + } + + + HRESULT LoadBootstrapperBAFunctions() + { + HRESULT hr = S_OK; + LPWSTR sczBafPath = NULL; + + hr = PathRelativeToModule(&sczBafPath, L"bafunctions.dll", m_hModule); + BalExitOnFailure(hr, "Failed to get path to BA function DLL."); + +#ifdef DEBUG + BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "WIXEXTBA: LoadBootstrapperBAFunctions() - BA function DLL '%ls'", sczBafPath); +#endif + + m_hBAFModule = ::LoadLibraryW(sczBafPath); + if (m_hBAFModule) + { + PFN_BOOTSTRAPPER_BA_FUNCTION_CREATE pfnBAFunctionCreate = reinterpret_cast(::GetProcAddress(m_hBAFModule, "CreateBootstrapperBAFunction")); + BalExitOnNullWithLastError1(pfnBAFunctionCreate, hr, "Failed to get CreateBootstrapperBAFunction entry-point from: %ls", sczBafPath); + + hr = pfnBAFunctionCreate(m_pEngine, m_hBAFModule, &m_pBAFunction); + BalExitOnFailure(hr, "Failed to create BA function."); + } +#ifdef DEBUG + else + { + BalLogError(HRESULT_FROM_WIN32(::GetLastError()), "WIXEXTBA: LoadBootstrapperBAFunctions() - Failed to load DLL %ls", sczBafPath); + } +#endif + + LExit: + if (m_hBAFModule && !m_pBAFunction) + { + ::FreeLibrary(m_hBAFModule); + m_hBAFModule = NULL; + } + ReleaseStr(sczBafPath); + + return hr; + } + + + void SavePageSettings( + __in WIXSTDBA_PAGE page + ) + { + THEME_PAGE* pPage = NULL; + + pPage = ThemeGetPage(m_pTheme, m_rgdwPageIds[page]); + if (pPage) + { + for (DWORD i = 0; i < pPage->cControlIndices; ++i) + { + // Loop through all the checkbox controls (or buttons with BS_AUTORADIOBUTTON) with names and set a Burn variable with that name to true or false. + THEME_CONTROL* pControl = m_pTheme->rgControls + pPage->rgdwControlIndices[i]; + if ((THEME_CONTROL_TYPE_CHECKBOX == pControl->type) || + (THEME_CONTROL_TYPE_BUTTON == pControl->type && (BS_AUTORADIOBUTTON == (BS_AUTORADIOBUTTON & pControl->dwStyle)) && + pControl->sczName && *pControl->sczName)) + { + BOOL bChecked = ThemeIsControlChecked(m_pTheme, pControl->wId); + m_pEngine->SetVariableNumeric(pControl->sczName, bChecked ? 1 : 0); + } + + // Loop through all the editbox controls with names and set a Burn variable with that name to the contents. + if (THEME_CONTROL_TYPE_EDITBOX == pControl->type && pControl->sczName && *pControl->sczName && + (WIXSTDBA_CONTROL_FOLDER_EDITBOX != pControl->wId && WIXSTDBA_CONTROL_FOLDER_EDITBOX2 != pControl->wId)) + { + LPWSTR sczValue = NULL; + ThemeGetTextControl(m_pTheme, pControl->wId, &sczValue); + m_pEngine->SetVariableString(pControl->sczName, sczValue); + } + } + } + } + + +public: + // + // Constructor - intitialize member variables. + // + CWixStandardBootstrapperApplication( + __in HMODULE hModule, + __in BOOL fPrereq, + __in IBootstrapperEngine* pEngine, + __in const BOOTSTRAPPER_COMMAND* pCommand + ) : CBalBaseBootstrapperApplication(pEngine, pCommand, 3, 3000) + { + m_hModule = hModule; + memcpy_s(&m_command, sizeof(m_command), pCommand, sizeof(BOOTSTRAPPER_COMMAND)); + + // Pre-req BA should only show help or do an install (to launch the Managed BA which can then do the right action). + if (fPrereq && BOOTSTRAPPER_ACTION_HELP != m_command.action && BOOTSTRAPPER_ACTION_INSTALL != m_command.action) + { + m_command.action = BOOTSTRAPPER_ACTION_INSTALL; + } + else // maybe modify the action state if the bundle is or is not already installed. + { + LONGLONG llInstalled = 0; + HRESULT hr = BalGetNumericVariable(L"WixBundleInstalled", &llInstalled); + if (SUCCEEDED(hr) && BOOTSTRAPPER_RESUME_TYPE_REBOOT != m_command.resumeType && 0 < llInstalled && BOOTSTRAPPER_ACTION_INSTALL == m_command.action) + { + m_command.action = BOOTSTRAPPER_ACTION_MODIFY; + } + else if (0 == llInstalled && (BOOTSTRAPPER_ACTION_MODIFY == m_command.action || BOOTSTRAPPER_ACTION_REPAIR == m_command.action)) + { + m_command.action = BOOTSTRAPPER_ACTION_INSTALL; + } + } + + m_plannedAction = BOOTSTRAPPER_ACTION_UNKNOWN; + + // When resuming from restart doing some install-like operation, try to find the package that forced the + // restart. We'll use this information during planning. + m_sczAfterForcedRestartPackage = NULL; + + if (BOOTSTRAPPER_RESUME_TYPE_REBOOT == m_command.resumeType && BOOTSTRAPPER_ACTION_UNINSTALL < m_command.action) + { + // Ensure the forced restart package variable is null when it is an empty string. + HRESULT hr = BalGetStringVariable(L"WixBundleForcedRestartPackage", &m_sczAfterForcedRestartPackage); + if (FAILED(hr) || !m_sczAfterForcedRestartPackage || !*m_sczAfterForcedRestartPackage) + { + ReleaseNullStr(m_sczAfterForcedRestartPackage); + } + } + + m_pWixLoc = NULL; + memset(&m_Bundle, 0, sizeof(m_Bundle)); + memset(&m_Conditions, 0, sizeof(m_Conditions)); + m_sczConfirmCloseMessage = NULL; + m_sczFailedMessage = NULL; + + m_sczLanguage = NULL; + m_pTheme = NULL; + memset(m_rgdwPageIds, 0, sizeof(m_rgdwPageIds)); + m_dwCurrentPage = 0; + m_hUiThread = NULL; + m_fRegistered = FALSE; + m_hWnd = NULL; + + m_state = WIXSTDBA_STATE_INITIALIZING; + m_hrFinal = S_OK; + + m_fDowngrading = FALSE; + m_restartResult = BOOTSTRAPPER_APPLY_RESTART_NONE; + m_fRestartRequired = FALSE; + m_fAllowRestart = FALSE; + + m_sczLicenseFile = NULL; + m_sczLicenseUrl = NULL; + m_fSuppressOptionsUI = FALSE; + m_fSuppressDowngradeFailure = FALSE; + m_fSuppressRepair = FALSE; + m_fShowVersion = FALSE; + + m_sdOverridableVariables = NULL; + m_pTaskbarList = NULL; + m_uTaskbarButtonCreatedMessage = UINT_MAX; + m_fTaskbarButtonOK = FALSE; + m_fShowingInternalUiThisPackage = FALSE; + + m_fPrereq = fPrereq; + m_sczPrereqPackage = NULL; + m_fPrereqInstalled = FALSE; + m_fPrereqAlreadyInstalled = FALSE; + + m_fUpdating = FALSE; + + pEngine->AddRef(); + m_pEngine = pEngine; + + m_hBAFModule = NULL; + m_pBAFunction = NULL; + } + + + // + // Destructor - release member variables. + // + ~CWixStandardBootstrapperApplication() + { + AssertSz(!::IsWindow(m_hWnd), "Window should have been destroyed before destructor."); + AssertSz(!m_pTheme, "Theme should have been released before destuctor."); + + ReleaseObject(m_pTaskbarList); + ReleaseDict(m_sdOverridableVariables); + ReleaseStr(m_sczFailedMessage); + ReleaseStr(m_sczConfirmCloseMessage); + BalConditionsUninitialize(&m_Conditions); + BalInfoUninitialize(&m_Bundle); + LocFree(m_pWixLoc); + + ReleaseStr(m_sczLanguage); + ReleaseStr(m_sczLicenseFile); + ReleaseStr(m_sczLicenseUrl); + ReleaseStr(m_sczPrereqPackage); + ReleaseStr(m_sczAfterForcedRestartPackage); + ReleaseNullObject(m_pEngine); + + if (m_hBAFModule) + { + ::FreeLibrary(m_hBAFModule); + m_hBAFModule = NULL; + } + } + +private: + HMODULE m_hModule; + BOOTSTRAPPER_COMMAND m_command; + IBootstrapperEngine* m_pEngine; + BOOTSTRAPPER_ACTION m_plannedAction; + + LPWSTR m_sczAfterForcedRestartPackage; + + WIX_LOCALIZATION* m_pWixLoc; + BAL_INFO_BUNDLE m_Bundle; + BAL_CONDITIONS m_Conditions; + LPWSTR m_sczFailedMessage; + LPWSTR m_sczConfirmCloseMessage; + + LPWSTR m_sczLanguage; + THEME* m_pTheme; + DWORD m_rgdwPageIds[countof(vrgwzPageNames)]; + DWORD m_dwCurrentPage; + HANDLE m_hUiThread; + BOOL m_fRegistered; + HWND m_hWnd; + + WIXSTDBA_STATE m_state; + WIXSTDBA_STATE m_stateBeforeOptions; + HRESULT m_hrFinal; + + BOOL m_fStartedExecution; + DWORD m_dwCalculatedCacheProgress; + DWORD m_dwCalculatedExecuteProgress; + + BOOL m_fDowngrading; + BOOTSTRAPPER_APPLY_RESTART m_restartResult; + BOOL m_fRestartRequired; + BOOL m_fAllowRestart; + + LPWSTR m_sczLicenseFile; + LPWSTR m_sczLicenseUrl; + BOOL m_fSuppressOptionsUI; + BOOL m_fSuppressDowngradeFailure; + BOOL m_fSuppressRepair; + BOOL m_fShowVersion; + BOOL m_fLaunchPassive; + BOOL m_fLaunchQuiet; + + STRINGDICT_HANDLE m_sdOverridableVariables; + + BOOL m_fPrereq; + LPWSTR m_sczPrereqPackage; + BOOL m_fPrereqInstalled; + BOOL m_fPrereqAlreadyInstalled; + + ITaskbarList3* m_pTaskbarList; + UINT m_uTaskbarButtonCreatedMessage; + BOOL m_fTaskbarButtonOK; + BOOL m_fShowingInternalUiThisPackage; + + BOOL m_fUpdating; + LPCWSTR m_wzUpdateLocation; + + HMODULE m_hBAFModule; + IBootstrapperBAFunction* m_pBAFunction; +}; + + +// +// CreateUserExperience - creates a new IBurnUserExperience object. +// +HRESULT CreateBootstrapperApplication( + __in HMODULE hModule, + __in BOOL fPrereq, + __in IBootstrapperEngine* pEngine, + __in const BOOTSTRAPPER_COMMAND* pCommand, + __out IBootstrapperApplication** ppApplication + ) +{ + HRESULT hr = S_OK; + CWixStandardBootstrapperApplication* pApplication = NULL; + + pApplication = new CWixStandardBootstrapperApplication(hModule, fPrereq, pEngine, pCommand); + ExitOnNull(pApplication, hr, E_OUTOFMEMORY, "Failed to create new standard bootstrapper application object."); + + *ppApplication = pApplication; + pApplication = NULL; + +LExit: + ReleaseObject(pApplication); + return hr; +} diff --git a/wixstdba/precomp.h b/wixstdba/precomp.h new file mode 100644 index 0000000..61bee4f --- /dev/null +++ b/wixstdba/precomp.h @@ -0,0 +1,56 @@ +//------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2004, Outercurve Foundation. +// This software is released under Microsoft Reciprocal License (MS-RL). +// The license and further copyright text can be found in the file +// LICENSE.TXT at the root directory of the distribution. +// +// +// +// Precompiled header for standard bootstrapper application. +// +//------------------------------------------------------------------------------------------------- + +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "dutil.h" +#include "memutil.h" +#include "dictutil.h" +#include "dirutil.h" +#include "fileutil.h" +#include "locutil.h" +#include "logutil.h" +#include "pathutil.h" +#include "resrutil.h" +#include "shelutil.h" +#include "strutil.h" +#include "thmutil.h" +#include "uriutil.h" +#include "xmlutil.h" + +#include "IBootstrapperEngine.h" +#include "IBootstrapperApplication.h" + +#include "BalBaseBootstrapperApplication.h" +#include "balinfo.h" +#include "balcondition.h" + +HRESULT CreateBootstrapperApplication( + __in HMODULE hModule, + __in BOOL fPrereq, + __in IBootstrapperEngine* pEngine, + __in const BOOTSTRAPPER_COMMAND* pCommand, + __out IBootstrapperApplication** ppApplication + ); + +#include "..\bafunctions\IBootstrapperBAFunction.h" + diff --git a/wixstdba/resource.h b/wixstdba/resource.h new file mode 100644 index 0000000..53c03c3 --- /dev/null +++ b/wixstdba/resource.h @@ -0,0 +1,25 @@ +//------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2004, Outercurve Foundation. +// This software is released under Microsoft Reciprocal License (MS-RL). +// The license and further copyright text can be found in the file +// LICENSE.TXT at the root directory of the distribution. +// +//------------------------------------------------------------------------------------------------- + +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// +#define IDC_STATIC -1 + + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 102 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1003 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/wixstdba/wixstdba.cpp b/wixstdba/wixstdba.cpp new file mode 100644 index 0000000..59c389c --- /dev/null +++ b/wixstdba/wixstdba.cpp @@ -0,0 +1,61 @@ +//------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2004, Outercurve Foundation. +// This software is released under Microsoft Reciprocal License (MS-RL). +// The license and further copyright text can be found in the file +// LICENSE.TXT at the root directory of the distribution. +// +// +// +// Setup chainer/bootstrapper standard UI for WiX toolset. +// +//------------------------------------------------------------------------------------------------- + +#include "precomp.h" + +static HINSTANCE vhInstance = NULL; + +extern "C" BOOL WINAPI DllMain( + IN HINSTANCE hInstance, + IN DWORD dwReason, + IN LPVOID /* pvReserved */ + ) +{ + switch(dwReason) + { + case DLL_PROCESS_ATTACH: + ::DisableThreadLibraryCalls(hInstance); + vhInstance = hInstance; + break; + + case DLL_PROCESS_DETACH: + vhInstance = NULL; + break; + } + + return TRUE; +} + + +extern "C" HRESULT WINAPI BootstrapperApplicationCreate( + __in IBootstrapperEngine* pEngine, + __in const BOOTSTRAPPER_COMMAND* pCommand, + __out IBootstrapperApplication** ppApplication + ) +{ + HRESULT hr = S_OK; + + BalInitialize(pEngine); + + hr = CreateBootstrapperApplication(vhInstance, FALSE, pEngine, pCommand, ppApplication); + BalExitOnFailure(hr, "Failed to create bootstrapper application interface."); + +LExit: + return hr; +} + + +extern "C" void WINAPI BootstrapperApplicationDestroy() +{ + BalUninitialize(); +} diff --git a/wixstdba/wixstdba.def b/wixstdba/wixstdba.def new file mode 100644 index 0000000..e2de8e8 --- /dev/null +++ b/wixstdba/wixstdba.def @@ -0,0 +1,16 @@ +;------------------------------------------------------------------------------------------------- +; +; Copyright (c) 2004, Outercurve Foundation. +; This software is released under Microsoft Reciprocal License (MS-RL). +; The license and further copyright text can be found in the file +; LICENSE.TXT at the root directory of the distribution. +; +; +; +; WiX Standard Bootstrapper Application DLL entry points. +; +;------------------------------------------------------------------------------------------------- + +EXPORTS + BootstrapperApplicationCreate + BootstrapperApplicationDestroy diff --git a/wixstdba/wixstdba.rc b/wixstdba/wixstdba.rc new file mode 100644 index 0000000..98a03ba --- /dev/null +++ b/wixstdba/wixstdba.rc @@ -0,0 +1,19 @@ +//------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2004, Outercurve Foundation. +// This software is released under Microsoft Reciprocal License (MS-RL). +// The license and further copyright text can be found in the file +// LICENSE.TXT at the root directory of the distribution. +// +// +// +// WiX Extendend Bootstrapper Application resource file. +// +//------------------------------------------------------------------------------------------------- + +#define VER_APP +#define VER_ORIGINAL_FILENAME "wixextba.dll" +#define VER_INTERNAL_NAME "wixextba" +#define VER_PRODUCT_NAME "WiX Extendend Bootstrapper Application" +#define VER_FILE_DESCRIPTION "WiX Extendend Bootstrapper Application" +#include "wix.rc" diff --git a/wixstdba/wixstdba.vcxproj b/wixstdba/wixstdba.vcxproj new file mode 100644 index 0000000..3bde57e --- /dev/null +++ b/wixstdba/wixstdba.vcxproj @@ -0,0 +1,144 @@ + + + + + + Debug + Win32 + + + Release + Win32 + + + + {41085a22-e6aa-4e8b-ab1b-ddee0dc89dfa} + WixStdBA + Win32Proj + DynamicLibrary + MultiByte + wixextba + + + + v120 + + + v120 + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + $(Configuration)\ + $(Configuration)\ + true + AllRules.ruleset + + + $(Configuration)\ + $(Configuration)\ + true + AllRules.ruleset + + + + + + + + + + Disabled + $(WiX)SDK\VS2010\inc;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_LIB;DEBUG;%(PreprocessorDefinitions);$(ExtraDefinitions) + true + EnableFastChecks + MultiThreadedDebug + Use + precomp.h + $(IntDir)$(ProjectName).pdb + Level4 + ProgramDatabase + StdCall + true + + + $(ProjectDir)..\inc;%(AdditionalIncludeDirectories) + + + dutil.lib;balutil.lib;comctl32.lib;gdiplus.lib;shlwapi.lib;wininet.lib;version.lib;msimg32.lib;%(AdditionalDependencies) + $(WiX)SDK\VS2010\lib\x86;%(AdditionalLibraryDirectories) + wixstdba.def + true + Windows + + + + + Disabled + $(WiX)SDK\VS2010\inc;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions);$(ExtraDefinitions) + true + EnableFastChecks + MultiThreaded + Use + precomp.h + $(IntDir)$(ProjectName).pdb + Level4 + ProgramDatabase + StdCall + true + + + $(ProjectDir)..\inc;%(AdditionalIncludeDirectories) + + + dutil.lib;balutil.lib;comctl32.lib;gdiplus.lib;shlwapi.lib;wininet.lib;version.lib;msimg32.lib;%(AdditionalDependencies) + $(WiX)SDK\VS2010\lib\x86;%(AdditionalLibraryDirectories) + wixstdba.def + false + Windows + + + + + + Create + Create + + + + + + + + + + Designer + + + + + + + + + + + + + + \ No newline at end of file diff --git a/wixstdba/wixstdba.vcxproj.filters b/wixstdba/wixstdba.vcxproj.filters new file mode 100644 index 0000000..ba94b5a --- /dev/null +++ b/wixstdba/wixstdba.vcxproj.filters @@ -0,0 +1,61 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav + + + + + Source Files + + + Source Files + + + + + Source Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + + + Header Files + + + Header Files + + + + + Resource Files + + + \ No newline at end of file