Listing 21-7 contains a few things that we omitted during the course of this chapter for the sake of brevity.
#include <atlstencil.> #include <passport.h> template < class THandler, class ThreadModel=CComSingleThreadModel, class TagReplacerType=CHtmlTagReplacer< THandler > > class CPassportHandlerT : public CRequestHandlerT< THandler, ThreadModel, TagReplacerType > { protected: typedef CRequestHandlerT< THandler, ThreadModel, TagReplacerType> baseType; IPassportManager2 *m_passportManager; CComVariant m_returnURL; CComVariant m_timeWindow; CComVariant m_forceLogin; CComVariant m_coBrandArgs; CComVariant m_langId; CComVariant m_usingHTTPS; CComVariant m_namespace; CComVariant m_kpp; CComVariant m_useSecureAuth; public: CPassportHandlerT() : m_passportManager(NULL), m_forceLogin(true), m_langId(GetThreadLocale()) {} virtual ~CPassportHandlerT(void) {} HTTP_CODE Uninitialize(HTTP_CODE hcError) { if (m_passportManager) { m_passportManager->Release(); m_passportManager = NULL; } return hcError; } HTTP_CODE InitializeHandler( AtlServerRequest *pRequestInfo, IServiceProvider *pProvider ) { HTTP_CODE httpCode = baseType::InitializeHandler(pRequestInfo, pProvider); if (httpCode == HTTP_SUCCESS) { if (!m_passportManager) { if (FAILED(CoCreateInstance(CLSID_Manager, NULL, CLSCTX_INPROC_SERVER, IID_IPassportManager2, (void**)&m_passportManager))) { return HTTP_S_FALSE; } } DWORD bufferSize(ATL_MAX_COOKIE_LEN); CHAR cookieHeader[ATL_MAX_COOKIE_LEN + 1]; cookieHeader[0] = 0; if (FAILED(m_passportManager-> OnStartPageECB((BYTE*)pRequestInfo->pECB, &bufferSize, cookieHeader))) { return HTTP_S_FALSE; } CString url; bool https(false); if (!GetURL(url, https)) { return HTTP_S_FALSE; } m_returnURL = url; m_usingHTTPS = https; m_HttpResponse.SetCacheControl("no-cache"); m_HttpResponse.SetContentType("text/html"); } return httpCode; } bool GetURL(CString& url, bool& bHttps) { CHAR szURL[ATL_URL_MAX_URL_LENGTH]; DWORD dwUrlSize = sizeof(szURL) * sizeof(CHAR); CHAR szServer[ATL_URL_MAX_HOST_NAME_LENGTH]; DWORD dwServerSize = sizeof(szServer) * sizeof(CHAR); CHAR szHttps[10]; DWORD dwHttpsLen = sizeof(szHttps) * sizeof(CHAR); if (m_spServerContext->GetServerVariable("URL", szURL, &dwUrlSize) != FALSE) { if (m_spServerContext->GetServerVariable("SERVER_NAME", szServer, &dwServerSize) != FALSE) { bHttps = false; if ((m_spServerContext->GetServerVariable("HTTPS", szHttps, &dwHttpsLen) != FALSE) && (!_stricmp(szHttps, "ON"))) { bHttps = true; } _ATLTRY { url.Format("http%s://%s%s", bHttps ? "s" : "", szServer, szURL); return true; } _ATLCATCHALL() { return false; } } } return false; } HTTP_CODE OnLogoTag() { BSTR logoTag(NULL); if (FAILED(m_passportManager->LogoTag(m_returnURL, m_timeWindow, m_forceLogin, m_coBrandArgs, m_langId, m_usingHTTPS, m_namespace, m_kpp, m_useSecureAuth, &logoTag))) { m_HttpResponse << "ERROR - could not get LogoTag"; return HTTP_S_FALSE; } m_HttpResponse << logoTag; ::SysFreeString(logoTag); return HTTP_SUCCESS; } HTTP_CODE OnIsAuthenticated() { VARIANT_BOOL isAuthenticated(VARIANT_FALSE); if (FAILED(m_passportManager->IsAuthenticated(m_timeWindow, m_forceLogin, m_useSecureAuth, &isAuthenticated))) { return HTTP_S_FALSE; } return isAuthenticated == VARIANT_TRUE ? HTTP_SUCCESS : HTTP_S_FALSE; } HTTP_CODE OnGetProfile(char *profileName) { CComVariant value; if (FAILED(m_passportManager->get_Profile(CComBSTR(profileName), &value))) { return HTTP_S_FALSE; } switch (value.vt) { case VT_I1: m_HttpResponse << value.cVal; break; case VT_I4: m_HttpResponse << value.intVal; break; case VT_BSTR: m_HttpResponse << value.bstrVal; break; default: m_HttpResponse << "Unknown type!"; break; } return HTTP_SUCCESS; } BEGIN_REPLACEMENT_METHOD_MAP(THandler) REPLACEMENT_METHOD_ENTRY("Passport_LogoTag", OnLogoTag) REPLACEMENT_METHOD_ENTRY("Passport_IsAuthenticated", OnIsAuthenticated) REPLACEMENT_METHOD_ENTRY_EX_STR("Passport_GetProfile", OnGetProfile) END_REPLACEMENT_METHOD_MAP() };
Now that you ve built your new request handler, you ll come full circle in the next section and see how you can use it to implement the scenario you ve been looking at throughout this chapter.