/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Microsoft Windows, Copyright (C) Microsoft Corporation, 2000 File: DialogUI.h Content: Declaration of DialogUI. History: 11-15-99 dsie created ------------------------------------------------------------------------------*/ #ifndef __DIALOGUI_H_ #define __DIALOGUI_H_ #include "Resource.h" /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Function : UserApprovedOperation Synopsis : Pop UI to prompt user to approve an operation. Parameter: DWORD iddDialog - ID of dialog to display. LPWSTR pwszDomain - DNS name. Remark : ------------------------------------------------------------------------------*/ HRESULT UserApprovedOperation (DWORD iddDialog, LPWSTR pwszDomain); // // IPromptUser // template class ATL_NO_VTABLE IPromptUser : public IObjectWithSiteImpl { public: STDMETHODIMP OperationApproved(DWORD iddDialog) { HRESULT hr = S_OK; CComBSTR bstrUrl; CComBSTR bstrDomain; INTERNET_SCHEME nScheme; DebugTrace("Entering IPromptUser::OperationApproved().\n"); if (FAILED(hr = GetCurrentUrl(&bstrUrl))) { DebugTrace("Error [%#x]: IPromptUser::GetCurrentUrl() failed.\n", hr); goto CommonExit; } DebugTrace("Info: Site URL = %ls.\n", bstrUrl); if (FAILED(hr = GetDomainAndScheme(bstrUrl, &bstrDomain, &nScheme))) { DebugTrace("Error [%#x]: IPromptUser::GetDomainAndScheme() failed.\n", hr); goto CommonExit; } DebugTrace("Info: DNS = %ls, Scheme = %#x.\n", bstrDomain, nScheme); if (INTERNET_SCHEME_HTTP == nScheme || INTERNET_SCHEME_HTTPS == nScheme) { if (FAILED(hr = ::UserApprovedOperation(iddDialog, bstrDomain))) { DebugTrace("Error [%#x]: UserApprovedOperation() failed.\n", hr); goto CommonExit; } } CommonExit: DebugTrace("Leaving IPromptUser::OperationApproved().\n"); return hr; } private: STDMETHODIMP GetDomainAndScheme (LPWSTR wszUrl, BSTR * pbstrDomain, INTERNET_SCHEME * pScheme) { HRESULT hr = S_OK; OLECHAR wszDomain[INTERNET_MAX_HOST_NAME_LENGTH]; OLECHAR wszDecodedUrl[INTERNET_MAX_URL_LENGTH]; URL_COMPONENTSW uc = {0}; DWORD cchDomain = ARRAYSIZE(wszDomain); DWORD cchDecodedUrl = ARRAYSIZE(wszDecodedUrl); // // CanonicalizeUrl will change "/foo/../bar" into "/bar". // if (!::InternetCanonicalizeUrlW(wszUrl, wszDecodedUrl, &cchDecodedUrl, ICU_DECODE)) { hr = HRESULT_FROM_WIN32(::GetLastError()); DebugTrace("Error [%#x]: InternetCanonicalizeUrlW() failed.\n", hr); return hr; } // // Crack will break it down into components. // uc.dwStructSize = sizeof(uc); uc.lpszHostName = wszDomain; uc.dwHostNameLength = cchDomain; if (!InternetCrackUrlW(wszDecodedUrl, cchDecodedUrl, ICU_DECODE, &uc)) { hr = HRESULT_FROM_WIN32(::GetLastError()); DebugTrace("Error [%#x]: InternetCrackUrlW() failed.\n", hr); return hr; } // // Return domain name. // if (NULL == (*pbstrDomain = ::SysAllocString(wszDomain))) { hr = E_OUTOFMEMORY; DebugTrace("Error {%#x]: SysAllocString() failed.\n", hr); return hr; } *pScheme = uc.nScheme; return hr; } STDMETHODIMP GetCurrentUrl (BSTR * pbstrUrl) { HRESULT hr = S_OK; CComBSTR bstrUrl; CComPtr spSrvProv; CComPtr spWebBrowser; ATLASSERT(pbstrUrl); *pbstrUrl = NULL; if (FAILED(hr = GetSite(IID_IServiceProvider, (void **) &spSrvProv))) { DebugTrace("Error [%#x]: IPromptUser::GetSite() failed.\n", hr); return hr; } if (FAILED(hr = spSrvProv->QueryService(SID_SWebBrowserApp, IID_IWebBrowser2, (void**) &spWebBrowser))) { DebugTrace("Error [%#x]: spSrvProv->QueryService() failed.\n", hr); return hr; } if (FAILED(hr = spWebBrowser->get_LocationURL(&bstrUrl))) { DebugTrace("Error [%#x]: spWebBrowser->get_LocationURL() failed.\n", hr); return hr; } *pbstrUrl = bstrUrl.Detach(); return hr; }; }; #endif //__DIALOGUI_H_