/////////////////////////////////////////////////////////////////////////// // // 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 #include #include 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, public CComCoClass, public IDispatchImpl { ////////////////////////////////////////////////////////////// // CRequestState - Implementation of IRequestState ////////////////////////////////////////////////////////////// class CRequestState : public IRequestState { // Outer unknown CRequest* m_pRequest; list 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 AttributeObjectList; typedef AttributeObjectList::iterator AttributeObjectListIterator; AttributeObjectList m_listAttributeObjects; // // List of raw attributes // typedef list 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_