274 lines
6.9 KiB
C++
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_
|