213 lines
8.6 KiB
C++
213 lines
8.6 KiB
C++
//---------------------------------------------------------------------------------------
|
|
//
|
|
// @doc
|
|
//
|
|
// @module pphandlerbase.h
|
|
//
|
|
// Author: stevefu
|
|
//
|
|
// Date: 04/28/2000
|
|
//
|
|
// Copyright <cp> 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 <md m_TlsIndex> 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__
|