From cd0a99c518122f179addd0c151fcfb7b3a5ddf89 Mon Sep 17 00:00:00 2001 From: Simon Rozman Date: Thu, 6 Feb 2020 12:16:52 +0100 Subject: [PATCH] wxUICanceller: Move upstream and make reusable Signed-off-by: Simon Rozman --- lib/EAPBase_UI/include/EAP_UI.h | 24 ++++++++++++++++++++++++ lib/EAPBase_UI/src/EAP_UI.cpp | 21 +++++++++++++++++++++ lib/TTLS_UI/src/Module.cpp | 28 +++++----------------------- 3 files changed, 50 insertions(+), 23 deletions(-) diff --git a/lib/EAPBase_UI/include/EAP_UI.h b/lib/EAPBase_UI/include/EAP_UI.h index 0b92fd3..f77d9e3 100644 --- a/lib/EAPBase_UI/include/EAP_UI.h +++ b/lib/EAPBase_UI/include/EAP_UI.h @@ -463,6 +463,30 @@ protected: }; +/// +/// Closes active window if exists +/// +class wxUICanceller +{ +public: + /// + /// Send WM_CLOSE to the active window if it exists. + /// + /// \param[inout] hWndCurrent Reference to a handle of the active window is stored. The variable should be shared between threads. + /// \param[in] hWnd Handle of a new window to be activated + /// + wxUICanceller(_Inout_ HWND volatile &hWndCurrent, _In_ HWND hWnd); + + /// + /// Clears the active window handle. + /// + ~wxUICanceller(); + +protected: + HWND volatile &m_hWndCurrent; +}; + + /// /// EAP general note /// diff --git a/lib/EAPBase_UI/src/EAP_UI.cpp b/lib/EAPBase_UI/src/EAP_UI.cpp index b8f6b69..09b0aa5 100644 --- a/lib/EAPBase_UI/src/EAP_UI.cpp +++ b/lib/EAPBase_UI/src/EAP_UI.cpp @@ -600,3 +600,24 @@ wxInitializerPeer::~wxInitializerPeer() wxCriticalSection wxInitializerPeer::s_lock; unsigned long wxInitializerPeer::s_init_ref_count = 0; wxLocale *wxInitializerPeer::s_locale = NULL; + + +////////////////////////////////////////////////////////////////////// +// wxUICanceller +////////////////////////////////////////////////////////////////////// + +wxUICanceller::wxUICanceller(_Inout_ HWND volatile &hWndCurrent, _In_ HWND hWnd) : + m_hWndCurrent(hWndCurrent) +{ + HWND hWndPrev = (HWND)InterlockedCompareExchangePointer((PVOID volatile *)&m_hWndCurrent, hWnd, NULL); + if (hWndPrev) { + PostMessage(hWndPrev, WM_CLOSE, 0, 0); + throw winstd::win_runtime_error(ERROR_CANCELLED, __FUNCTION__ " Aborted."); + } +} + + +wxUICanceller::~wxUICanceller() +{ + InterlockedExchangePointer((PVOID volatile *)&m_hWndCurrent, NULL); +} diff --git a/lib/TTLS_UI/src/Module.cpp b/lib/TTLS_UI/src/Module.cpp index d5c1350..cfd43f6 100644 --- a/lib/TTLS_UI/src/Module.cpp +++ b/lib/TTLS_UI/src/Module.cpp @@ -83,28 +83,10 @@ void eap::peer_ttls_ui::invoke_identity_ui( _Out_ DWORD *pdwUserDataOutSize, _Out_ LPWSTR *ppwszIdentity) { - static HWND volatile hWndCurrent = NULL; - - class ui_canceller - { - public: - ui_canceller(_In_ HWND hWnd) - { - HWND hWndPrev = (HWND)InterlockedCompareExchangePointer((PVOID volatile *)&hWndCurrent, hWnd, NULL); - if (hWndPrev) { - PostMessage(hWndPrev, WM_CLOSE, 0, 0); - throw win_runtime_error(ERROR_CANCELLED, __FUNCTION__ " Aborted."); - } - } - - ~ui_canceller() - { - InterlockedExchangePointer((PVOID volatile *)&hWndCurrent, NULL); - } - }; - assert(ppwszIdentity); + static HWND volatile hWndCurrent = NULL; + // Unpack configuration. config_connection cfg(*this); unpack(cfg, pConnectionData, dwConnectionDataSize); @@ -129,7 +111,7 @@ void eap::peer_ttls_ui::invoke_identity_ui( if (cfg.m_providers.size() > 1) { // Multiple identity providers: User has to select one first. wxEAPProviderSelectDialog dlg(cfg, init.m_parent); - ui_canceller lock(dlg.GetHWND()); + wxUICanceller lock(hWndCurrent, dlg.GetHWND()); // Centre and display dialog. dlg.Centre(wxBOTH); @@ -186,7 +168,7 @@ void eap::peer_ttls_ui::invoke_identity_ui( { // Build dialog to prompt for outer credentials. wxEAPCredentialsDialog dlg(*cfg_prov, init.m_parent); - ui_canceller lock(dlg.GetHWND()); + wxUICanceller lock(hWndCurrent, dlg.GetHWND()); if (eap::config_method::status_t::cred_begin <= cfg_method->m_last_status && cfg_method->m_last_status < eap::config_method::status_t::cred_end) dlg.AddContent(new wxEAPCredentialWarningPanel(*cfg_prov, cfg_method->m_last_status, &dlg)); auto panel = new wxTLSCredentialsPanel(*cfg_prov, *cfg_method, *cred, &dlg, false); @@ -275,7 +257,7 @@ void eap::peer_ttls_ui::invoke_identity_ui( { // Native inner methods. Build dialog to prompt for inner credentials. wxEAPCredentialsDialog dlg(*cfg_prov, init.m_parent); - ui_canceller lock(dlg.GetHWND()); + wxUICanceller lock(hWndCurrent, dlg.GetHWND()); if (eap::config_method::status_t::cred_begin <= cfg_method->m_inner->m_last_status && cfg_method->m_inner->m_last_status < eap::config_method::status_t::cred_end) dlg.AddContent(new wxEAPCredentialWarningPanel(*cfg_prov, cfg_method->m_inner->m_last_status, &dlg)); wxEAPCredentialsPanelBase *panel = NULL;