diff options
| author | Sean Hall <r.sean.hall@gmail.com> | 2021-10-27 15:29:19 -0500 |
|---|---|---|
| committer | Sean Hall <r.sean.hall@gmail.com> | 2021-11-01 16:34:09 -0500 |
| commit | dce1c97c7d3e76c18e4f80d4ffe288d2933a74bc (patch) | |
| tree | 68dc0653ee1a6fe962d82dac2159c8ab00a95808 /src/ext | |
| parent | bad2e93524f376cfeb76d5231d4b08510bdad033 (diff) | |
| download | wix-dce1c97c7d3e76c18e4f80d4ffe288d2933a74bc.tar.gz wix-dce1c97c7d3e76c18e4f80d4ffe288d2933a74bc.tar.bz2 wix-dce1c97c7d3e76c18e4f80d4ffe288d2933a74bc.zip | |
Make thmutil automatically load controls during window creation.
Add control loaded event.
Diffstat (limited to 'src/ext')
| -rw-r--r-- | src/ext/Bal/wixstdba/WixStandardBootstrapperApplication.cpp | 188 |
1 files changed, 114 insertions, 74 deletions
diff --git a/src/ext/Bal/wixstdba/WixStandardBootstrapperApplication.cpp b/src/ext/Bal/wixstdba/WixStandardBootstrapperApplication.cpp index 2283880c..5546b74f 100644 --- a/src/ext/Bal/wixstdba/WixStandardBootstrapperApplication.cpp +++ b/src/ext/Bal/wixstdba/WixStandardBootstrapperApplication.cpp | |||
| @@ -2389,6 +2389,11 @@ private: | |||
| 2389 | hr = ThemeRegisterVariableCallbacks(m_pTheme, EvaluateVariableConditionCallback, FormatVariableStringCallback, GetVariableNumericCallback, SetVariableNumericCallback, GetVariableStringCallback, SetVariableStringCallback, NULL); | 2389 | hr = ThemeRegisterVariableCallbacks(m_pTheme, EvaluateVariableConditionCallback, FormatVariableStringCallback, GetVariableNumericCallback, SetVariableNumericCallback, GetVariableStringCallback, SetVariableStringCallback, NULL); |
| 2390 | BalExitOnFailure(hr, "Failed to register variable theme callbacks."); | 2390 | BalExitOnFailure(hr, "Failed to register variable theme callbacks."); |
| 2391 | 2391 | ||
| 2392 | C_ASSERT(COUNT_WIXSTDBA_PAGE == countof(vrgwzPageNames)); | ||
| 2393 | C_ASSERT(countof(m_rgdwPageIds) == countof(vrgwzPageNames)); | ||
| 2394 | |||
| 2395 | ThemeGetPageIds(m_pTheme, vrgwzPageNames, m_rgdwPageIds, countof(m_rgdwPageIds)); | ||
| 2396 | |||
| 2392 | hr = ThemeLocalize(m_pTheme, m_pWixLoc); | 2397 | hr = ThemeLocalize(m_pTheme, m_pWixLoc); |
| 2393 | BalExitOnFailure(hr, "Failed to localize theme: %ls", sczThemePath); | 2398 | BalExitOnFailure(hr, "Failed to localize theme: %ls", sczThemePath); |
| 2394 | 2399 | ||
| @@ -2697,6 +2702,8 @@ private: | |||
| 2697 | hr = ThemeCreateParentWindow(m_pTheme, 0, wc.lpszClassName, m_pTheme->sczCaption, dwWindowStyle, x, y, HWND_DESKTOP, m_hModule, this, THEME_WINDOW_INITIAL_POSITION_CENTER_MONITOR_FROM_COORDINATES, &m_hWnd); | 2702 | hr = ThemeCreateParentWindow(m_pTheme, 0, wc.lpszClassName, m_pTheme->sczCaption, dwWindowStyle, x, y, HWND_DESKTOP, m_hModule, this, THEME_WINDOW_INITIAL_POSITION_CENTER_MONITOR_FROM_COORDINATES, &m_hWnd); |
| 2698 | ExitOnFailure(hr, "Failed to create window."); | 2703 | ExitOnFailure(hr, "Failed to create window."); |
| 2699 | 2704 | ||
| 2705 | OnThemeLoaded(); | ||
| 2706 | |||
| 2700 | hr = S_OK; | 2707 | hr = S_OK; |
| 2701 | 2708 | ||
| 2702 | LExit: | 2709 | LExit: |
| @@ -2831,16 +2838,12 @@ private: | |||
| 2831 | return lres; | 2838 | return lres; |
| 2832 | } | 2839 | } |
| 2833 | 2840 | ||
| 2834 | case WM_CREATE: | ||
| 2835 | if (!pBA->OnCreate(hWnd)) | ||
| 2836 | { | ||
| 2837 | return -1; | ||
| 2838 | } | ||
| 2839 | break; | ||
| 2840 | |||
| 2841 | case WM_THMUTIL_LOADING_CONTROL: | 2841 | case WM_THMUTIL_LOADING_CONTROL: |
| 2842 | return pBA->OnThemeLoadingControl(reinterpret_cast<THEME_LOADINGCONTROL_ARGS*>(wParam), reinterpret_cast<THEME_LOADINGCONTROL_RESULTS*>(lParam)); | 2842 | return pBA->OnThemeLoadingControl(reinterpret_cast<THEME_LOADINGCONTROL_ARGS*>(wParam), reinterpret_cast<THEME_LOADINGCONTROL_RESULTS*>(lParam)); |
| 2843 | 2843 | ||
| 2844 | case WM_THMUTIL_LOADED_CONTROL: | ||
| 2845 | return pBA->OnThemeLoadedControl(reinterpret_cast<THEME_LOADEDCONTROL_ARGS*>(wParam), reinterpret_cast<THEME_LOADEDCONTROL_RESULTS*>(lParam)); | ||
| 2846 | |||
| 2844 | case WM_QUERYENDSESSION: | 2847 | case WM_QUERYENDSESSION: |
| 2845 | fCancel = true; | 2848 | fCancel = true; |
| 2846 | pBA->OnSystemShutdown(static_cast<DWORD>(lParam), &fCancel); | 2849 | pBA->OnSystemShutdown(static_cast<DWORD>(lParam), &fCancel); |
| @@ -2896,74 +2899,14 @@ private: | |||
| 2896 | 2899 | ||
| 2897 | 2900 | ||
| 2898 | // | 2901 | // |
| 2899 | // OnCreate - finishes loading the theme. | 2902 | // OnThemeLoaded - finishes loading the theme. |
| 2900 | // | 2903 | // |
| 2901 | BOOL OnCreate( | 2904 | BOOL OnThemeLoaded() |
| 2902 | __in HWND /*hWnd*/ | ||
| 2903 | ) | ||
| 2904 | { | 2905 | { |
| 2905 | HRESULT hr = S_OK; | 2906 | HRESULT hr = S_OK; |
| 2906 | LPWSTR sczLicenseFormatted = NULL; | ||
| 2907 | LPWSTR sczLicensePath = NULL; | ||
| 2908 | LPWSTR sczLicenseDirectory = NULL; | ||
| 2909 | LPWSTR sczLicenseFilename = NULL; | ||
| 2910 | BA_FUNCTIONS_ONTHEMELOADED_ARGS themeLoadedArgs = { }; | 2907 | BA_FUNCTIONS_ONTHEMELOADED_ARGS themeLoadedArgs = { }; |
| 2911 | BA_FUNCTIONS_ONTHEMELOADED_RESULTS themeLoadedResults = { }; | 2908 | BA_FUNCTIONS_ONTHEMELOADED_RESULTS themeLoadedResults = { }; |
| 2912 | 2909 | ||
| 2913 | hr = ThemeLoadControls(m_pTheme); | ||
| 2914 | BalExitOnFailure(hr, "Failed to load theme controls."); | ||
| 2915 | |||
| 2916 | C_ASSERT(COUNT_WIXSTDBA_PAGE == countof(vrgwzPageNames)); | ||
| 2917 | C_ASSERT(countof(m_rgdwPageIds) == countof(vrgwzPageNames)); | ||
| 2918 | |||
| 2919 | ThemeGetPageIds(m_pTheme, vrgwzPageNames, m_rgdwPageIds, countof(m_rgdwPageIds)); | ||
| 2920 | |||
| 2921 | // Load the RTF EULA control with text if the control exists. | ||
| 2922 | if (ThemeControlExists(m_pTheme, WIXSTDBA_CONTROL_EULA_RICHEDIT)) | ||
| 2923 | { | ||
| 2924 | hr = (m_sczLicenseFile && *m_sczLicenseFile) ? S_OK : E_INVALIDDATA; | ||
| 2925 | if (SUCCEEDED(hr)) | ||
| 2926 | { | ||
| 2927 | hr = StrAllocString(&sczLicenseFormatted, m_sczLicenseFile, 0); | ||
| 2928 | if (SUCCEEDED(hr)) | ||
| 2929 | { | ||
| 2930 | hr = LocLocalizeString(m_pWixLoc, &sczLicenseFormatted); | ||
| 2931 | if (SUCCEEDED(hr)) | ||
| 2932 | { | ||
| 2933 | // Assume there is no hidden variables to be formatted | ||
| 2934 | // so don't worry about securely freeing it. | ||
| 2935 | hr = BalFormatString(sczLicenseFormatted, &sczLicenseFormatted); | ||
| 2936 | if (SUCCEEDED(hr)) | ||
| 2937 | { | ||
| 2938 | hr = PathRelativeToModule(&sczLicensePath, sczLicenseFormatted, m_hModule); | ||
| 2939 | if (SUCCEEDED(hr)) | ||
| 2940 | { | ||
| 2941 | hr = PathGetDirectory(sczLicensePath, &sczLicenseDirectory); | ||
| 2942 | if (SUCCEEDED(hr)) | ||
| 2943 | { | ||
| 2944 | hr = StrAllocString(&sczLicenseFilename, PathFile(sczLicenseFormatted), 0); | ||
| 2945 | if (SUCCEEDED(hr)) | ||
| 2946 | { | ||
| 2947 | hr = LocProbeForFile(sczLicenseDirectory, sczLicenseFilename, m_sczLanguage, &sczLicensePath); | ||
| 2948 | if (SUCCEEDED(hr)) | ||
| 2949 | { | ||
| 2950 | hr = ThemeLoadRichEditFromFile(m_pTheme, WIXSTDBA_CONTROL_EULA_RICHEDIT, sczLicensePath, m_hModule); | ||
| 2951 | } | ||
| 2952 | } | ||
| 2953 | } | ||
| 2954 | } | ||
| 2955 | } | ||
| 2956 | } | ||
| 2957 | } | ||
| 2958 | } | ||
| 2959 | |||
| 2960 | if (FAILED(hr)) | ||
| 2961 | { | ||
| 2962 | BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Failed to load file into license richedit control from path '%ls' manifest value: %ls", sczLicensePath, m_sczLicenseFile); | ||
| 2963 | hr = S_OK; | ||
| 2964 | } | ||
| 2965 | } | ||
| 2966 | |||
| 2967 | if (m_pfnBAFunctionsProc) | 2910 | if (m_pfnBAFunctionsProc) |
| 2968 | { | 2911 | { |
| 2969 | themeLoadedArgs.cbSize = sizeof(themeLoadedArgs); | 2912 | themeLoadedArgs.cbSize = sizeof(themeLoadedArgs); |
| @@ -2975,11 +2918,6 @@ private: | |||
| 2975 | } | 2918 | } |
| 2976 | 2919 | ||
| 2977 | LExit: | 2920 | LExit: |
| 2978 | ReleaseStr(sczLicenseFilename); | ||
| 2979 | ReleaseStr(sczLicenseDirectory); | ||
| 2980 | ReleaseStr(sczLicensePath); | ||
| 2981 | ReleaseStr(sczLicenseFormatted); | ||
| 2982 | |||
| 2983 | return SUCCEEDED(hr); | 2921 | return SUCCEEDED(hr); |
| 2984 | } | 2922 | } |
| 2985 | 2923 | ||
| @@ -3034,6 +2972,108 @@ private: | |||
| 3034 | return fProcessed || FAILED(hr); | 2972 | return fProcessed || FAILED(hr); |
| 3035 | } | 2973 | } |
| 3036 | 2974 | ||
| 2975 | BOOL OnThemeLoadedControl( | ||
| 2976 | __in const THEME_LOADEDCONTROL_ARGS* pArgs, | ||
| 2977 | __in THEME_LOADEDCONTROL_RESULTS* pResults | ||
| 2978 | ) | ||
| 2979 | { | ||
| 2980 | HRESULT hr = S_OK; | ||
| 2981 | BOOL fProcessed = FALSE; | ||
| 2982 | BA_FUNCTIONS_ONTHEMECONTROLLOADED_ARGS themeControlLoadedArgs = { }; | ||
| 2983 | BA_FUNCTIONS_ONTHEMECONTROLLOADED_RESULTS themeControlLoadedResults = { }; | ||
| 2984 | |||
| 2985 | if (WIXSTDBA_CONTROL_EULA_RICHEDIT == pArgs->pThemeControl->wId) | ||
| 2986 | { | ||
| 2987 | // Best effort to load the RTF EULA control with text. | ||
| 2988 | OnLoadedEulaRtfControl(pArgs->pThemeControl); | ||
| 2989 | fProcessed = TRUE; | ||
| 2990 | ExitFunction(); | ||
| 2991 | } | ||
| 2992 | |||
| 2993 | if (m_pfnBAFunctionsProc) | ||
| 2994 | { | ||
| 2995 | themeControlLoadedArgs.cbSize = sizeof(themeControlLoadedArgs); | ||
| 2996 | themeControlLoadedArgs.wzName = pArgs->pThemeControl->sczName; | ||
| 2997 | themeControlLoadedArgs.wId = pArgs->pThemeControl->wId; | ||
| 2998 | themeControlLoadedArgs.hWnd = pArgs->pThemeControl->hWnd; | ||
| 2999 | |||
| 3000 | themeControlLoadedResults.cbSize = sizeof(themeControlLoadedResults); | ||
| 3001 | |||
| 3002 | hr = m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONTHEMECONTROLLOADED, &themeControlLoadedArgs, &themeControlLoadedResults, m_pvBAFunctionsProcContext); | ||
| 3003 | |||
| 3004 | if (E_NOTIMPL == hr) | ||
| 3005 | { | ||
| 3006 | hr = S_OK; | ||
| 3007 | } | ||
| 3008 | else | ||
| 3009 | { | ||
| 3010 | BalExitOnFailure(hr, "BAFunctions OnThemeControlLoaded failed."); | ||
| 3011 | |||
| 3012 | if (themeControlLoadedResults.fProcessed) | ||
| 3013 | { | ||
| 3014 | fProcessed = TRUE; | ||
| 3015 | } | ||
| 3016 | } | ||
| 3017 | } | ||
| 3018 | |||
| 3019 | LExit: | ||
| 3020 | pResults->hr = hr; | ||
| 3021 | return fProcessed || FAILED(hr); | ||
| 3022 | } | ||
| 3023 | |||
| 3024 | HRESULT OnLoadedEulaRtfControl( | ||
| 3025 | const THEME_CONTROL* pThemeControl | ||
| 3026 | ) | ||
| 3027 | { | ||
| 3028 | HRESULT hr = S_OK; | ||
| 3029 | LPWSTR sczLicenseFormatted = NULL; | ||
| 3030 | LPWSTR sczLicensePath = NULL; | ||
| 3031 | LPWSTR sczLicenseDirectory = NULL; | ||
| 3032 | LPWSTR sczLicenseFilename = NULL; | ||
| 3033 | |||
| 3034 | if (!m_sczLicenseFile || !*m_sczLicenseFile) | ||
| 3035 | { | ||
| 3036 | ExitWithRootFailure(hr, E_INVALIDDATA, "No license file in manifest."); | ||
| 3037 | } | ||
| 3038 | |||
| 3039 | hr = StrAllocString(&sczLicenseFormatted, m_sczLicenseFile, 0); | ||
| 3040 | ExitOnFailure(hr, "Failed to copy manifest license file."); | ||
| 3041 | |||
| 3042 | hr = LocLocalizeString(m_pWixLoc, &sczLicenseFormatted); | ||
| 3043 | ExitOnFailure(hr, "Failed to localize manifest license file."); | ||
| 3044 | |||
| 3045 | hr = BalFormatString(sczLicenseFormatted, &sczLicenseFormatted); | ||
| 3046 | ExitOnFailure(hr, "Failed to expand localized manifest license file."); | ||
| 3047 | |||
| 3048 | hr = PathRelativeToModule(&sczLicensePath, sczLicenseFormatted, m_hModule); | ||
| 3049 | ExitOnFailure(hr, "Failed to get relative path for license file."); | ||
| 3050 | |||
| 3051 | hr = PathGetDirectory(sczLicensePath, &sczLicenseDirectory); | ||
| 3052 | ExitOnFailure(hr, "Failed to get license file directory."); | ||
| 3053 | |||
| 3054 | hr = StrAllocString(&sczLicenseFilename, PathFile(sczLicenseFormatted), 0); | ||
| 3055 | ExitOnFailure(hr, "Failed to copy license file name."); | ||
| 3056 | |||
| 3057 | hr = LocProbeForFile(sczLicenseDirectory, sczLicenseFilename, m_sczLanguage, &sczLicensePath); | ||
| 3058 | ExitOnFailure(hr, "Failed to probe for localized license file."); | ||
| 3059 | |||
| 3060 | hr = ThemeLoadRichEditFromFile(m_pTheme, pThemeControl->wId, sczLicensePath, m_hModule); | ||
| 3061 | ExitOnFailure(hr, "Failed to load license file into richedit control."); | ||
| 3062 | |||
| 3063 | LExit: | ||
| 3064 | if (FAILED(hr)) | ||
| 3065 | { | ||
| 3066 | BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Failed to load file into license richedit control from path '%ls' manifest value: %ls", sczLicensePath, m_sczLicenseFile); | ||
| 3067 | } | ||
| 3068 | |||
| 3069 | ReleaseStr(sczLicenseFilename); | ||
| 3070 | ReleaseStr(sczLicenseDirectory); | ||
| 3071 | ReleaseStr(sczLicensePath); | ||
| 3072 | ReleaseStr(sczLicenseFormatted); | ||
| 3073 | |||
| 3074 | return hr; | ||
| 3075 | } | ||
| 3076 | |||
| 3037 | 3077 | ||
| 3038 | // | 3078 | // |
| 3039 | // OnShowFailure - display the failure page. | 3079 | // OnShowFailure - display the failure page. |
