windows-nt/Source/XPSP1/NT/net/ias/policy/inc/request.h
2020-09-26 16:20:57 +08:00

274 lines
6.9 KiB
C++

///////////////////////////////////////////////////////////////////////////
//
// Copyright(C) 1997-1998 Microsoft Corporation all rights reserved.
//
// Module: request.h
//
// Project: Everest
//
// Description: IAS request object definition
//
// Author: TLP 11/11/97
//
// Modification history:
//
// 06/12/1998 sbens Added SetResponse method.
// 05/21/1999 sbens Remove old style trace.
//
///////////////////////////////////////////////////////////////////////////
#ifndef __IAS_REQUEST_H_
#define __IAS_REQUEST_H_
#include "resource.h" // main symbols
#include <vector>
#include <list>
#include <stack>
using namespace std;
// Attribute position macros
#define IAS_INVALID_ATTRIBUTE_POSITION 0
#define IAS_RAW_CAST(x,y) *((x*)&y)
///////////
// CRequest
///////////
class ATL_NO_VTABLE CRequest :
public CComObjectRootEx<CComMultiThreadModel>,
public CComCoClass<CRequest, &CLSID_Request>,
public IDispatchImpl<IRequest, &IID_IRequest, &LIBID_IASPolicyLib>
{
//////////////////////////////////////////////////////////////
// CRequestState - Implementation of IRequestState
//////////////////////////////////////////////////////////////
class CRequestState : public IRequestState
{
// Outer unknown
CRequest* m_pRequest;
list<unsigned hyper> m_Stack;
public:
CRequestState(CRequest *pRequest);
~CRequestState();
//
// IUnknown methods - delegate to outer IUnknown
//
STDMETHOD(QueryInterface)(REFIID riid, void **ppv)
{ return m_pRequest->QueryInterface(riid, ppv); }
STDMETHOD_(ULONG,AddRef)(void)
{ return m_pRequest->AddRef(); }
STDMETHOD_(ULONG,Release)(void)
{ return m_pRequest->Release(); }
//
// IRequestState methods
//
STDMETHOD(Push)(/*[in]*/ unsigned hyper State);
STDMETHOD(Pop)(/*[out]*/ unsigned hyper* pState);
STDMETHOD(Top)(/*[out]*/ unsigned hyper* pState);
};
//////////////////////////////////////////////////////////////
// CAttributesRaw - C++ view of request's attribute collection
//////////////////////////////////////////////////////////////
class CAttributesRaw : public IAttributesRaw
{
// Outer unknown
CRequest* m_pRequest;
public:
CAttributesRaw(CRequest *pRequest);
~CAttributesRaw();
//
// IUnknown methods - delegate to outer IUnknown
//
STDMETHOD(QueryInterface)(REFIID riid, void **ppv)
{ return m_pRequest->QueryInterface(riid, ppv); }
STDMETHOD_(ULONG,AddRef)(void)
{ return m_pRequest->AddRef(); }
STDMETHOD_(ULONG,Release)(void)
{ return m_pRequest->Release(); }
//
// IAttributesRaw Interface
//
STDMETHOD(AddAttributes)(
/*[in]*/ DWORD dwPosCount,
/*[in, out]*/ PATTRIBUTEPOSITION pPositions
);
STDMETHOD(RemoveAttributes)(
/*[in]*/ DWORD dwPosCount,
/*[in]*/ PATTRIBUTEPOSITION pPositions
);
STDMETHOD(RemoveAttributesByType)(
/*[in]*/ DWORD dwAttrIDCount,
/*[in]*/ LPDWORD lpdwAttrIDs
);
STDMETHOD(GetAttributeCount)(
/*[in]*/ LPDWORD lpdwCount
);
STDMETHOD(GetAttributes)(
/*[in, out]*/ LPDWORD lpdwPosCount,
/*[out]*/ PATTRIBUTEPOSITION pPositions,
/*[in]*/ DWORD dwAttrIDCount,
/*[in]*/ LPDWORD lpdwAttrIDs
);
}; // End of nested class CAttributesRaw
//
// Request Properties
//
LONG m_lRequest;
LONG m_lResponse;
LONG m_lReason;
IASPROTOCOL m_eProtocol;
IRequestSource* m_pRequestSource;
//
// List of COM Attribute objects
//
typedef list<IAttribute*> AttributeObjectList;
typedef AttributeObjectList::iterator AttributeObjectListIterator;
AttributeObjectList m_listAttributeObjects;
//
// List of raw attributes
//
typedef list<PIASATTRIBUTE> AttributeList;
typedef AttributeList::iterator AttributeListIterator;
AttributeList m_listAttributes;
//
// The raw attributes interface
//
CAttributesRaw m_clsAttributesRaw;
//
// The request state interface
CRequestState m_clsRequestState;
// Let the raw attributes nested class access the data members of CRequest
friend class CAttributesRaw;
friend class CRequestState;
public:
IAS_DECLARE_REGISTRY(Request, 1, 0, IASPolicyLib)
DECLARE_NOT_AGGREGATABLE(CRequest)
BEGIN_COM_MAP(CRequest)
COM_INTERFACE_ENTRY(IRequest)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY_FUNC(IID_IAttributesRaw, 0, &CRequest::QueryInterfaceRaw)
COM_INTERFACE_ENTRY_FUNC(IID_IRequestState, 0, &CRequest::QueryInterfaceRaw)
END_COM_MAP()
CRequest();
~CRequest();
//
// IRequest Interface
//
///////////////////////////////////////////////////////////////////////////
// Property "get" - "set" assume that a request is always owned by the
// current handler and only a single thread context within a handler
// will touch it.
///////////////////////////////////////////////////////////////////////////
STDMETHOD(get_Request)(/*[out, retval]*/ LONG *pVal)
{
_ASSERTE ( NULL != pVal );
*pVal = m_lRequest;
return S_OK;
}
STDMETHOD(put_Request)(/*[in]*/ LONG newVal)
{
m_lRequest = newVal;
return S_OK;
}
STDMETHOD(get_Response)(/*[out, retval]*/ LONG *pVal)
{
_ASSERTE ( NULL != pVal );
*pVal = m_lResponse;
return S_OK;
}
STDMETHOD(get_Reason)(/*[out, retval]*/ LONG *pVal)
{
_ASSERTE ( NULL != pVal );
*pVal = m_lReason;
return S_OK;
}
STDMETHOD(get_Protocol)(/*[out, retval]*/ IASPROTOCOL *pVal)
{
_ASSERTE ( NULL != pVal );
*pVal = m_eProtocol;
return S_OK;
}
STDMETHOD(put_Protocol)(/*[in]*/ IASPROTOCOL newVal)
{
m_eProtocol = newVal;
return S_OK;
}
STDMETHOD(get_Source)(/*[out, retval]*/ IRequestSource** ppVal)
{
_ASSERTE ( NULL != ppVal );
if ( m_pRequestSource )
{
m_pRequestSource->AddRef();
}
*ppVal = m_pRequestSource;
return S_OK;
}
STDMETHOD(put_Source)(/*[in]*/ IRequestSource* newVal)
{
_ASSERTE( NULL != newVal );
if ( m_pRequestSource )
{
m_pRequestSource->Release();
}
m_pRequestSource = newVal;
m_pRequestSource->AddRef();
return S_OK;
}
STDMETHOD(get_Attributes)(/*[out, retval]*/ IDispatch** pVal);
STDMETHOD(SetResponse)(
/*[in]*/ IASRESPONSE eResponse,
/*[in]*/ LONG lReason
);
STDMETHOD(ReturnToSource)(
/*[in]*/ IASREQUESTSTATUS eRequestStatus
);
private:
// Called when someone queries for any of the
// request object's "Raw" interfaces.
static HRESULT WINAPI QueryInterfaceRaw(
void* pThis,
REFIID riid,
LPVOID* ppv,
DWORD_PTR dw
);
}; // End of class CRequest
#endif //__IAS_REQUEST_H_