//--------------------------------------------------------------------------------------- // // @doc // // @module pphandlerbase.h // // Author: stevefu // // Date: 04/28/2000 // // Copyright 1999-2000 Microsoft Corporation. All Rights Reserved. // //--------------------------------------------------------------------------------------- #if !defined(PPHANDLERBASE_H_INCLUDED__) #define PPHANDLERBASE_H_INCLUDED__ #pragma once #if (!defined(_UNICODE) || !defined(UNICODE) ) #error Passport Handler must be built with _UNICODE and UNICODE defined. #endif // built w/ UNICODE only, all CString are assumed as CStringW #include "pputils.h" #include "ppurl.h" #include "passportexception.h" #include "ppmgrver.h" class CPassportLocale; class CBrowserInfo; class CPassportCommonUIInfo; //----------------------------------------------------------------------------- // // @class CPassportHandlerBase | non-template interface class. // If your codes are being used within a Passport ISAPI Handler, you can // get access to the current active handler by calling // CPassportHandlerBase::GetPPHandler(). That saves you from passing // a global pointer everywhere in your codes. // Note there are some caveats: // 1. This works on per-thread scope. If you write an async handler, // you will have some glitch. // 2. If you have a handler include chain (in a single processing thread), // only the top level handler is returned by CPassportHandlerBase::GetPPHandler(). // 3. This method does not work with multiple handler DLLs. In other word, // child ( sub or include )handlers in a different DLL can NOT get to the // top level handler. // // If you have a CPassportHandlerBase object/pointer you can also use // GetTopHandler to get access to the first handler within a request. // This does NOT limit to single thread request and works across multiple // request handler DLL. // // Parent and child handlers can also communicate with each other by calling // AddPerRequestObj, GetPerRequestObj, RemovePerRequestObj. Note you must // remove all objects before the destrutor of top handler to avoid memory leak. // //----------------------------------------------------------------------------- class CPassportHandlerBase { public: // @cmember static function to retrieve per-thread handler object inline static CPassportHandlerBase* GetPPHandler() { ATLASSERT(m_TlsIndex.x > 0 ); CPassportHandlerBase* h = (CPassportHandlerBase*)TlsGetValue(m_TlsIndex.x); if ( GetLastError() != 0 ) return NULL; else return h; } // Numeric constants to control parameter translation, can be ORed. // UNICODE conversion is always performed. enum INPUT_CONVERSION_FLAG { CI_HTML_NUMERIC_DECODE = 0x1, CI_ESCAPE_SCRIPT_INJECTION = 0x2, CI_URL_UNESCAPE = 0x4, CI_FLAG_DEFAULT = CI_HTML_NUMERIC_DECODE }; enum OUTPUT_CONVERSION_FLAG { CO_HTML_NUMERIC_ENCODE = 0x1, CO_ESCAPE_SCRIPT_INJECTION = 0x2, CO_URL_ESCAPE = 0x4, CO_FLAG_DEFAULT = CO_HTML_NUMERIC_ENCODE | CO_ESCAPE_SCRIPT_INJECTION }; // @cmember retrieve the top level handler object virtual CPassportHandlerBase* GetTopHandler() = 0; virtual BOOL IsTopHandler() = 0; enum { OBJID_TOPHANDLER = 0, // reserve ID 0 to support GetTopHandler OBJID_BASEID_END = 100, // custom ID should be after this one OBJID_LOGIN_REQUEST = 101 // login request object. }; // @cmember support per-request object sharing virtual BOOL AddPerRequestObj(unsigned id, void* pObj) = 0; virtual BOOL RemovePerRequestObj(unsigned id ) = 0; virtual void* GetPerRequestObj(unsigned id ) = 0; // @cmember retrieve global object virtual HRESULT GetGlobalObj(REFGUID objid, REFIID riid, void**pobj) = 0; // @cmember retrieve and convert parameter from query string virtual void GetWParam(LPCSTR szParamName, CStringW& wOut, unsigned flag = CI_FLAG_DEFAULT) = 0; // @cmember retrieve and convert parameter from query string and/or form variable virtual void GetWFormVar(LPCSTR szParamName, CStringW& wOut, unsigned flag = CI_FLAG_DEFAULT) = 0; // @cmember retrieve and convert cookie virtual void GetWCookie(LPCSTR szParamName, CStringW& wOut, unsigned flag = CI_FLAG_DEFAULT) = 0; // @cmember retrieve and convert cookie virtual void GetACookie(LPCSTR szParamName, CStringA& wOut, unsigned flag = CI_FLAG_DEFAULT) = 0; // @cmember retrieve and convert server variable virtual void GetWServerVariable(LPCSTR szParamName, CStringW& wOut, unsigned flag = 0) = 0; virtual void GetAServerVariable(LPCSTR szParamName, CStringA& aOut, unsigned flag = 0) = 0; // @cmember retrieve and convert a request item from query string, form, cookies // or server variables. virtual void GetWItem(LPCSTR szItem, CStringW& wOut, unsigned flag = CI_FLAG_DEFAULT) = 0; // @cmember retrieve and convert parameter from query string. // note the contents of parameter must be in ASCII only, not MBCS. virtual void GetAParam(LPCSTR szParamName, CStringA& aOut, unsigned flag = CI_FLAG_DEFAULT) = 0; // @cmember retrieve and convert item // note the contents of retrieved item must be in ASCII only, not MBCS. virtual void GetAItem( LPCSTR szItemName, CStringA& aOut, unsigned flag = CI_FLAG_DEFAULT) = 0; // @cmember retrieve a long parameter virtual long GetParamLong(LPCSTR szParamName) = 0; // @cmember retrieve a long item virtual long GetItemLong(LPCSTR szItemName) = 0; // @cemeber return browser info object virtual CBrowserInfo* GetBrowserInfo() = 0; // @cmember retrieve the full locale object virtual CPassportLocale* GetRequestLocale() = 0 ; // @cmember retrieve the ui info object virtual CPassportCommonUIInfo* GetCommonUIInfo() = 0 ; // @cmember retrieve the http request object virtual CHttpRequest* GetHttpRequest() = 0 ; // @cmember retrieve the http response object virtual CHttpResponse* GetHttpResponse() = 0; // @cmember MBCS/Unicode helper using codepage for the active request virtual void Mbcs2Unicode(LPCSTR pszIn, BOOL bNEC, CStringW& wOut) = 0; // @cmember Unicode/MBCS helper using codepage for the active request virtual void Unicode2Mbcs(LPCWSTR pwszIn, BOOL bNEC, CStringA& aOut) = 0; // @cmember add a cookie to the current response virtual void SetCookie(LPCSTR szName, LPCSTR szValue, LPCSTR szExpiration= NULL, LPCSTR szCookieDomain = NULL, LPCSTR szCookiePath = NULL, bool bSecure = false ) = 0; // @cmember add a cookie to the current response virtual void SetCookie(LPCSTR szName, LPCWSTR szValue, LPCSTR szExpiration= NULL, LPCSTR szCookieDomain = NULL, LPCSTR szCookiePath = NULL, bool bSecure = false ) = 0; // @cmember add a cookie to the current response virtual void SetCookie(CCookie& cookie) = 0; // @cmember get domain attribute from PassportManager virtual HRESULT GetDomainAttribute( const BSTR bstrAttrName, //@parm the attribute name LPCWSTR pwszDomain, CComBSTR& cbstrValue) = 0; // @cmember sets PP_SERVICE parameter for cobranding virtual void SetPPService(LPCSTR strService) = 0; // @cmember sets PP_PAGE parameter for cobranding virtual void SetPPPage(LPCSTR strPage) = 0; virtual long GetPassportID() = 0; #pragma warning( disable: 4172 ) virtual const PPMGRVer & GetPPMgrVersion() { ATLASSERT(false); return PPMGRVer(); }; #pragma warning( default: 4172 ) virtual void AddGlobalCarryThru(CPPUrl &url) { ATLASSERT(false); } protected: // @cmember is used for Tls purpose. Note this is global to // the whole DLL. static struct CTlsIndex { DWORD x; CTlsIndex() { x = TlsAlloc(); } ~CTlsIndex() { if ( x ) TlsFree(x); } } m_TlsIndex; }; //----------------------------------------------------------------------------- // Static member init. // Note constructor is called before DllMain() with runtime // static/global init so that we don't have to force re-write // DllMain for every single handler DLL //----------------------------------------------------------------------------- __declspec(selectany) struct CPassportHandlerBase::CTlsIndex CPassportHandlerBase::m_TlsIndex; #endif //PPHANDLERBASE_H_INCLUDED__