Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

205 lines
6.4 KiB

// stdcooki.h : Declaration of base cookie class and related classes
#ifndef __STDCOOKI_H_INCLUDED__
#define __STDCOOKI_H_INCLUDED__
// forward declarations
class CCookie;
class CRefcountedObject
{
public:
inline CRefcountedObject()
: m_nRefcount( 1 )
{};
virtual ~CRefcountedObject() {};
inline void AddRef() {m_nRefcount++;}
inline void Release()
{
if (0 >= --m_nRefcount)
delete this;
}
private:
int m_nRefcount;
};
class CHasMachineName
{
public:
virtual void SetMachineName( LPCTSTR lpcszMachineName ) = 0;
virtual LPCTSTR QueryNonNULLMachineName() = 0;
virtual LPCTSTR QueryTargetServer() = 0;
// returns <0, 0 or >0
HRESULT CompareMachineNames( CHasMachineName& refHasMachineName, int* pnResult );
};
//
// CBaseCookieBlock holds a block of cookies and the data
// to which the cookies point. It starts off with a
// reference count of 1. When a data object is created
// which references one of these cookies, AddRef() the cookie block; when such
// a data object is released, Release() the cookie block. Similarly,
// when the parent cookie is finished with the cookie block, it should
// Release() the cookie block. The cookie block will delete itself
// when the reference count reaches 0. Do not attempt to explicitly
// delete the cookie block.
//
class CBaseCookieBlock : public CRefcountedObject
{
public:
virtual CCookie* QueryBaseCookie(int i) = 0;
virtual int QueryNumCookies() = 0;
};
template<class COOKIE_TYPE>
class CCookieBlock
: public CBaseCookieBlock
{
private:
COOKIE_TYPE* m_aCookies;
int m_cCookies;
public:
CCookieBlock(COOKIE_TYPE* aCookies, // use vector ctor, we use vector dtor
int cCookies );
virtual ~CCookieBlock();
virtual CCookie* QueryBaseCookie(int i);
virtual int QueryNumCookies();
};
#define DEFINE_COOKIE_BLOCK(COOKIE_TYPE) \
CCookieBlock<COOKIE_TYPE>::CCookieBlock<COOKIE_TYPE> \
(COOKIE_TYPE* aCookies, int cCookies) \
: m_aCookies( aCookies ) \
, m_cCookies( cCookies ) \
{ \
ASSERT(NULL != aCookies && 0 < cCookies); \
} \
CCookieBlock<COOKIE_TYPE>::~CCookieBlock<COOKIE_TYPE>() \
{ \
delete[] m_aCookies; \
} \
CCookie* CCookieBlock<COOKIE_TYPE>::QueryBaseCookie(int i) \
{ \
return (CCookie*)&(m_aCookies[i]); \
} \
int CCookieBlock<COOKIE_TYPE>::QueryNumCookies() \
{ \
return m_cCookies; \
}
#define COMPARESIMILARCOOKIE_FULL -1
//
// I am trying to allow child classes to derive from CCookie using
// multiple inheritance, but this is tricky
//
class CCookie
{
public:
CTypedPtrList<CPtrList, CBaseCookieBlock*> m_listScopeCookieBlocks;
CTypedPtrList<CPtrList, CBaseCookieBlock*> m_listResultCookieBlocks;
HSCOPEITEM m_hScopeItem;
private:
LONG m_nResultCookiesRefcount;
public:
inline CCookie()
: m_nResultCookiesRefcount( 0 ),
m_hScopeItem (0)
{
}
inline void ReleaseScopeChildren()
{
while ( !m_listScopeCookieBlocks.IsEmpty() )
{
(m_listScopeCookieBlocks.RemoveHead())->Release();
}
}
// returns new refcount
inline ULONG AddRefResultChildren()
{
return ++m_nResultCookiesRefcount;
}
inline void ReleaseResultChildren()
{
ASSERT( 0 < m_nResultCookiesRefcount );
if ( 0 >= --m_nResultCookiesRefcount )
{
while ( !m_listResultCookieBlocks.IsEmpty() )
{
(m_listResultCookieBlocks.RemoveHead())->Release();
}
}
}
virtual ~CCookie();
// On entry, if not COMPARESIMILARCOOKIE_FULL, *pnResult is the column on which to sort,
// otherwise, try to do a full cookie comparison.
// On exit, *pnResult should be <0, 0 or >0.
// Note that this is a sorting function and should not be used to establish
// object identity where better identity functions are available.
virtual HRESULT CompareSimilarCookies( CCookie* pOtherCookie, int* pnResult ) = 0;
};
#define DECLARE_FORWARDS_MACHINE_NAME(targ) \
virtual LPCTSTR QueryNonNULLMachineName(); \
virtual LPCTSTR QueryTargetServer(); \
virtual void SetMachineName( LPCTSTR lpcszMachineName );
#define DEFINE_FORWARDS_MACHINE_NAME(thisclass,targ) \
LPCTSTR thisclass::QueryNonNULLMachineName() \
{ \
ASSERT( (targ) != NULL ); \
return ((CHasMachineName*)(targ))->QueryNonNULLMachineName(); \
} \
LPCTSTR thisclass::QueryTargetServer() \
{ \
ASSERT( (targ) != NULL ); \
return ((CHasMachineName*)(targ))->QueryTargetServer(); \
} \
void thisclass::SetMachineName( LPCTSTR lpcszMachineName ) \
{ \
ASSERT( (targ) != NULL ); \
((CHasMachineName*)(targ))->SetMachineName( lpcszMachineName ); \
}
#define STORES_MACHINE_NAME \
public: \
CString m_strMachineName; \
virtual void SetMachineName( LPCTSTR lpcszMachineName ) \
{ \
m_strMachineName = lpcszMachineName; \
} \
virtual LPCTSTR QueryNonNULLMachineName() \
{ \
return (LPCTSTR)m_strMachineName; \
} \
virtual LPCTSTR QueryTargetServer() \
{ \
return (m_strMachineName.IsEmpty()) \
? NULL : (LPCTSTR)(m_strMachineName); \
}
class CStoresMachineName : public CHasMachineName
{
public:
CStoresMachineName( LPCTSTR lpcszMachineName )
: m_strMachineName( lpcszMachineName )
{}
STORES_MACHINE_NAME;
};
#endif // ~__STDCOOKI_H_INCLUDED__