windows-nt/Source/XPSP1/NT/inetsrv/iis/svcs/cmp/asp/cookies.h
2020-09-26 16:20:57 +08:00

232 lines
5.9 KiB
C++

/*===================================================================
Microsoft Denali
Microsoft Confidential.
Copyright 1996 Microsoft Corporation. All Rights Reserved.
Component: Request, Response objects
File: cookies.h
Owner: DGottner
This file contains the definiton of the CCookie class, which
contains all of the state for an HTTP cookie
===================================================================*/
#include "denpre.h"
#pragma hdrstop
#include "asptlb.h"
#include "dispatch.h"
#include "hashing.h"
#include "memcls.h"
class CCookie;
// Type for an object-destroyed callback
typedef void (*PFNDESTROYED)(void);
/* C C o o k i e P a i r
*
* Implements a name/value pair in the Cookie dictionary
*/
class CCookiePair : public CLinkElem
{
public:
char *m_szValue;
BOOL m_fDuplicate; // TRUE if we have a strdup'ed copy of m_pKey, m_szValue
HRESULT Init(const char *szKey, const char *szValue, BOOL fDuplicate = FALSE);
CCookiePair();
~CCookiePair();
};
/*
* C C o o k i e S u p p o r t E r r
*
* Implements ISupportErrorInfo for the CCookie class. The CSupportError class
* is not adequate because it will only report a max of one interface which
* supports error info. (We have two)
*/
class CCookieSupportErr : public ISupportErrorInfo
{
private:
CCookie * m_pCookie;
public:
CCookieSupportErr(CCookie *pCookie);
// IUnknown members that delegate to m_pCookie
//
STDMETHODIMP QueryInterface(const GUID &, void **);
STDMETHODIMP_(ULONG) AddRef(void);
STDMETHODIMP_(ULONG) Release(void);
// ISupportErrorInfo members
//
STDMETHODIMP InterfaceSupportsErrorInfo(const GUID &);
};
/*
* C W r i t e C o o k i e
*
* Implements IWriteCookie which is the interface that Response.Cookies
* returns.
*/
class CWriteCookie : public IWriteCookieImpl
{
private:
CCookie * m_pCookie;
public:
CWriteCookie(CCookie *);
// The Big Three
//
STDMETHODIMP QueryInterface(const IID &rIID, void **ppvObj);
STDMETHODIMP_(ULONG) AddRef();
STDMETHODIMP_(ULONG) Release();
// IWriteCookie implementation
//
STDMETHODIMP put_Item(VARIANT varKey, BSTR bstrValue);
STDMETHODIMP put_Expires(DATE dtExpires);
STDMETHODIMP put_Domain(BSTR bstrDomain);
STDMETHODIMP put_Path(BSTR bstrPath);
STDMETHODIMP put_Secure(VARIANT_BOOL fSecure);
STDMETHODIMP get_HasKeys(VARIANT_BOOL *pfHasKeys);
STDMETHODIMP get__NewEnum(IUnknown **ppEnum);
};
/*
* C R e a d C o o k i e
*
* Implements IReadCookie which is the interface that Request.Cookies
* returns.
*/
class CReadCookie : public IReadCookieImpl
{
private:
CCookie * m_pCookie;
public:
CReadCookie(CCookie *);
// The Big Three
//
STDMETHODIMP QueryInterface(const IID &rIID, void **ppvObj);
STDMETHODIMP_(ULONG) AddRef();
STDMETHODIMP_(ULONG) Release();
// IReadCookie implementation
//
STDMETHODIMP get_Item(VARIANT i, VARIANT *pVariantReturn);
STDMETHODIMP get_HasKeys(VARIANT_BOOL *pfHasKeys);
STDMETHODIMP get__NewEnum(IUnknown **ppEnumReturn);
STDMETHODIMP get_Count(int *pcValues);
STDMETHODIMP get_Key(VARIANT VarKey, VARIANT *pvar);
};
/*
* C C o o k i e
*
* Implements CCookie, which is the object stored in the Request.Cookies
* dictionary.
*/
class CCookie : public IUnknown
{
friend class CWriteCookie;
friend class CReadCookie;
friend class CCookieIterator;
protected:
ULONG m_cRefs; // reference count
PFNDESTROYED m_pfnDestroy; // To call on closure
private:
CWriteCookie m_WriteCookieInterface; // implementation of IWriteCookie
CReadCookie m_ReadCookieInterface; // implementation of IStringList
CCookieSupportErr m_CookieSupportErrorInfo; // implementation of ISupportErrorInfo
CIsapiReqInfo * m_pIReq; // pointer to CIsapiReqInfo for this cookie
UINT m_lCodePage; // code page used for UNICODE conversions
char * m_szValue; // value of cookie when not a dictionary
CHashTableMBStr m_mpszValues; // dictionary of values for the cookie
time_t m_tExpires; // date & time when cookie expires
char * m_szDomain; // Cookie's domain
CHAR * m_szPath; // Cookie's path (If UNICODE, stored as UTF-8)
VARIANT_BOOL m_fSecure:1; // does cookie require security?
BOOL m_fDirty:1; // does cookie need to be sent?
BOOL m_fDuplicate:1; // does cookie contain dynamically allocated string?
public:
CCookie(CIsapiReqInfo *, UINT lCodePage, IUnknown * = NULL, PFNDESTROYED = NULL);
~CCookie();
HRESULT AddValue(char *szValue, BOOL fDuplicate = FALSE);
HRESULT AddKeyAndValue(char *szKey, char *szValue, BOOL fDuplicate = FALSE);
size_t GetHTTPCookieSize(); // return information on how big a buffer should be
char * GetHTTPCookie(char *szBuffer); // return the cookie value HTTP encoded
size_t GetCookieHeaderSize(const char *szName); // return buffer size needed for Set-Cookie header
char *GetCookieHeader(const char *szName, char *szBuffer); // return cookie header
BOOL IsDirty() { return m_fDirty; }
HRESULT Init();
// The Big Three
//
STDMETHODIMP QueryInterface(const GUID &Iid, void **ppvObj);
STDMETHODIMP_(ULONG) AddRef();
STDMETHODIMP_(ULONG) Release();
// Cache on per-class basis
ACACHE_INCLASS_DEFINITIONS()
};
/*
* C C o o k i e I t e r a t o r
*
* IEnumVariant implementation for Cookie dictionaries
*/
class CCookieIterator : public IEnumVARIANT
{
public:
CCookieIterator(CCookie *pCookie);
~CCookieIterator();
// The Big Three
STDMETHODIMP QueryInterface(const GUID &, void **);
STDMETHODIMP_(ULONG) AddRef();
STDMETHODIMP_(ULONG) Release();
// standard methods for iterators
STDMETHODIMP Clone(IEnumVARIANT **ppEnumReturn);
STDMETHODIMP Next(unsigned long cElements, VARIANT *rgVariant, unsigned long *pcElementsFetched);
STDMETHODIMP Skip(unsigned long cElements);
STDMETHODIMP Reset();
private:
ULONG m_cRefs; // reference count
CCookie *m_pCookie; // pointer to iteratee
CCookiePair *m_pCurrent; // pointer to current item
};