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

180 lines
4.3 KiB
C++

///////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2000, Microsoft Corp. All rights reserved.
//
// FILE
//
// request.h
//
// SYNOPSIS
//
// Declares the class Request.
//
///////////////////////////////////////////////////////////////////////////////
#ifndef REQUEST_H
#define REQUEST_H
#if _MSC_VER >= 1000
#pragma once
#endif
#include "resource.h"
#include <iaspolcy.h>
#include <sdoias.h>
///////////////////////////////////////////////////////////////////////////////
//
// CLASS
//
// Request
//
///////////////////////////////////////////////////////////////////////////////
class ATL_NO_VTABLE Request :
public CComObjectRootEx<CComMultiThreadModel>,
public CComCoClass<Request, &__uuidof(Request)>,
public IRequest,
public IAttributesRaw,
public IRequestState
{
public:
DECLARE_REGISTRY_RESOURCEID(IDR_Registry)
DECLARE_NOT_AGGREGATABLE(Request)
BEGIN_COM_MAP(Request)
COM_INTERFACE_ENTRY_IID(__uuidof(IAttributesRaw), IAttributesRaw)
COM_INTERFACE_ENTRY_IID(__uuidof(Request), Request)
COM_INTERFACE_ENTRY_IID(__uuidof(IRequestState), IRequestState)
COM_INTERFACE_ENTRY_IID(__uuidof(IRequest), IRequest)
END_COM_MAP()
/////////
// Methods used by the Pipeline for routing requests.
/////////
IASREQUEST getRequest() const throw ()
{ return request; }
IASPROVIDER getProvider() const throw ()
{
PIASATTRIBUTE attr = findFirst(IAS_ATTRIBUTE_PROVIDER_TYPE);
return attr ? (IASPROVIDER)attr->Value.Enumerator : IAS_PROVIDER_NONE;
}
IASRESPONSE getResponse() const throw ()
{ return response; }
IASREASON getReason() const throw ()
{ return reason; }
void pushState(ULONG64 state) throw ()
{ *topOfStack++ = state; }
ULONG64 popState() throw ()
{ return *--topOfStack; }
void pushSource(IRequestSource* newVal) throw ()
{ pushState((ULONG64)source); source = newVal; }
void popSource() throw ()
{ source = (IRequestSource*)popState(); }
IASREQUEST getRoutingType() const throw ()
{ return routing; }
void setRoutingType(IASREQUEST newVal) throw ()
{ routing = newVal; }
PIASATTRIBUTE findFirst(DWORD id) const throw ();
static Request* narrow(IUnknown* pUnk) throw ();
/////////
// IRequest
/////////
STDMETHOD(get_Source)(IRequestSource** pVal);
STDMETHOD(put_Source)(IRequestSource* newVal);
STDMETHOD(get_Protocol)(IASPROTOCOL *pVal);
STDMETHOD(put_Protocol)(IASPROTOCOL newVal);
STDMETHOD(get_Request)(LONG *pVal);
STDMETHOD(put_Request)(LONG newVal);
STDMETHOD(get_Response)(LONG *pVal);
STDMETHOD(get_Reason)(LONG *pVal);
STDMETHOD(SetResponse)(IASRESPONSE eResponse, LONG lReason);
STDMETHOD(ReturnToSource)(IASREQUESTSTATUS eStatus);
/////////
// IAttributesRaw
/////////
STDMETHOD(AddAttributes)(
DWORD dwPosCount,
PATTRIBUTEPOSITION pPositions
);
STDMETHOD(RemoveAttributes)(
DWORD dwPosCount,
PATTRIBUTEPOSITION pPositions
);
STDMETHOD(RemoveAttributesByType)(
DWORD dwAttrIDCount,
DWORD *lpdwAttrIDs
);
STDMETHOD(GetAttributeCount)(
DWORD *lpdwCount
);
STDMETHOD(GetAttributes)(
DWORD *lpdwPosCount,
PATTRIBUTEPOSITION pPositions,
DWORD dwAttrIDCount,
DWORD *lpdwAttrIDs
);
/////////
// IRequestState
/////////
STDMETHOD(Push)(
ULONG64 state
);
STDMETHOD(Pop)(
ULONG64 *pState
);
STDMETHOD(Top)(
ULONG64 *pState
);
protected:
Request() throw ();
~Request() throw ();
private:
BOOL reserve(SIZE_T needed) throw ();
// Properties.
IRequestSource* source;
IASPROTOCOL protocol;
IASREQUEST request;
IASRESPONSE response;
IASREASON reason;
// More specific request type used for routing.
IASREQUEST routing;
// Attribute collection.
PIASATTRIBUTE* begin;
PIASATTRIBUTE* end;
PIASATTRIBUTE* capacity;
// State stack.
ULONG64 state[3];
PULONG64 topOfStack;
// Not implemented.
Request(const Request&) throw ();
Request& operator=(const Request&) throw ();
};
#endif // REQUEST_H