//#-------------------------------------------------------------- // // File: sendtopipe.cpp // // Synopsis: Implementation of CSendToPipe class methods // // // History: 11/22/97 MKarki Created // 06/12/98 SBens Changed put_Response to SetResponse. // // Copyright (C) 1997-98 Microsoft Corporation // All rights reserved. // //---------------------------------------------------------------- #include "radcommon.h" #include "sendtopipe.h" //+++------------------------------------------------------------- // // Function: CSendToPipe // // Synopsis: This is the constructor of the CSendToPipe // class method // // Arguments: NONE // // Returns: NONE // // History: MKarki Created 11/22/97 // //---------------------------------------------------------------- CSendToPipe::CSendToPipe() : m_pIRequestHandler (NULL), m_pIRequestSource (NULL), m_pIClassFactory (NULL), m_pCVSAFilter (NULL), m_pCReportEvent (NULL) { } // end of CSendToPipe constructor //++-------------------------------------------------------------- // // Function: ~CSendToPipe // // Synopsis: This is the destructor of the CSendToPipe // class method // // Arguments: NONE // // Returns: NONE // // History: MKarki Created 11/22/97 // //---------------------------------------------------------------- CSendToPipe::~CSendToPipe() { if (m_pIClassFactory) { m_pIClassFactory->Release(); } } // end of CSendToPipe destructor //+++------------------------------------------------------------- // // Function: Process // // Synopsis: This is the public method of the CSendToPipe class // that gets hold of a IRequestRaw interface, puts the // data in it and sends it on its way. // // Arguments: // [in] CPacketRadius* // // Returns: HRESULT - status // // History: MKarki Created 11/22/97 // //---------------------------------------------------------------- HRESULT CSendToPipe::Process( CPacketRadius *pCPacketRadius ) { BOOL bRetVal = FALSE; BOOL bStatus = FALSE; HRESULT hr = S_OK; IRequest *pIRequest = NULL; IAttributesRaw *pIAttributesRaw = NULL; PATTRIBUTEPOSITION pIasAttribPos = NULL; DWORD dwCount = 0; DWORD dwRetVal = 0; PACKETTYPE ePacketType; IRequestHandler *pIRequestHandler = m_pIRequestHandler; _ASSERT (pCPacketRadius); __try { // // check if the pipeline is present to process our // request // if (NULL != pIRequestHandler) { pIRequestHandler->AddRef (); } else { // // should never reach here // _ASSERT (0); IASTracePrintf ( "Unable to send request to backend as request handler " "unavailable" ); hr = E_FAIL; __leave; } // // create the Request COM object here // hr = m_pIClassFactory->CreateInstance ( NULL, __uuidof (IRequest), reinterpret_cast (&pIRequest) ); if (FAILED (hr)) { IASTracePrintf ( "Unable to create a Request object from class factory " "before sending request to backend" ); __leave; } // // get the packettype // ePacketType = pCPacketRadius->GetInCode (); // // get the attributes collection // get the total attributes in the collection // get as many IASATTRIBUTE structs // fill in the IAS attribute structs with the appropriate // values // dwCount = pCPacketRadius->GetInAttributeCount(); if (dwCount > 0) { // // get the attributes collection now // pIasAttribPos = pCPacketRadius->GetInAttributes (); // // if the attribute count is greater than 0 there // should always be attributes around // _ASSERT (pIasAttribPos); // // get IAttributesRaw interface // hr = pIRequest->QueryInterface ( __uuidof (IAttributesRaw), reinterpret_cast (&pIAttributesRaw) ); if (FAILED (hr)) { IASTracePrintf ( "Unable to obtain Attributes interface in request object " "before sending request to backend" ); __leave; } // // put the attributes collection into the request // hr = pIAttributesRaw->AddAttributes (dwCount, pIasAttribPos); if (FAILED (hr)) { IASTracePrintf ( "Unable to add Attributes to request object " "before sending request to backend" ); __leave; } } // // set IRequestRaw interface properties // hr = SetRequestProperties ( pIRequest, pCPacketRadius, ePacketType ); if (FAILED (hr)) { __leave; } // // convert the VSA attributes into IAS format // hr = m_pCVSAFilter->radiusToIAS (pIAttributesRaw); if (FAILED (hr)) { IASTracePrintf ( "Unable to convert Radius VSAs to IAS attributes in " "request object before sending it to backend" ); __leave; } // // now the packet is ready for sending out // hr = pIRequestHandler->OnRequest (pIRequest); if (FAILED (hr)) { IASTracePrintf ("Unable to send request object to backend"); __leave; } // // success // } __finally { if (pIRequestHandler) {pIRequestHandler->Release ();} if (pIAttributesRaw) {pIAttributesRaw->Release();} if (pIRequest) {pIRequest->Release();} } return (hr); } // end of CSendToPipe::Process method //+++------------------------------------------------------------- // // Function: Init // // Synopsis: This is the CSendToPipe class public method which // initializes the class object // // Arguments: // [in] IRequestSource* // // Returns: BOOL - status // // History: MKarki Created 11/22/97 // //---------------------------------------------------------------- BOOL CSendToPipe::Init ( IRequestSource *pIRequestSource, VSAFilter *pCVSAFilter, CReportEvent *pCReportEvent ) { BOOL bStatus = TRUE; HRESULT hr = S_OK; _ASSERT (pIRequestSource && pCReportEvent && pCVSAFilter); m_pCReportEvent = pCReportEvent; m_pCVSAFilter = pCVSAFilter; // // get the IClassFactory interface to be used to create // the Request COM object // TODO - replace CLSID with __uuidof // hr = ::CoGetClassObject ( CLSID_Request, CLSCTX_INPROC_SERVER, NULL, IID_IClassFactory, reinterpret_cast (&m_pIClassFactory) ); if (FAILED (hr)) { IASTracePrintf ( "Unable to obtain Request object class factory" ); bStatus = FALSE; } else { m_pIRequestSource = pIRequestSource; } return (bStatus); } // end of CSendToPipe::Init method //+++------------------------------------------------------------- // // Function: StartProcessing // // Synopsis: This is the CSendToPipe class public method which // gets object ready to send data to the PipeLine // // Arguments: // [in] IRequestHandler* // // Returns: BOOL - status // // History: MKarki Created 11/22/97 // //---------------------------------------------------------------- BOOL CSendToPipe::StartProcessing ( IRequestHandler *pIRequestHandler ) { _ASSERT (pIRequestHandler); // // set the value of the handler // m_pIRequestHandler = pIRequestHandler; return (TRUE); } // end of CSendToPipe::StartProcessing method //+++------------------------------------------------------------- // // Function: StopProcessing // // Synopsis: This is the CSendToPipe class public method which // gets object to stop sending data to the PipeLine // // Arguments: none // // Returns: BOOL - status // // History: MKarki Created 11/22/97 // //---------------------------------------------------------------- BOOL CSendToPipe::StopProcessing ( VOID ) { // // set the value of the handlers // m_pIRequestHandler = NULL; return (TRUE); } // end of CSendToPipe::StartProcessing method //+++------------------------------------------------------------- // // Function: SetRequestProperties // // Synopsis: This is the CSendToPipe class public method which // set the properties in the IRequestRaw object // // Arguments: // [in] IRequesetRaw* // [in] CPacketRadius* // [in] PACKETTYPE // // Returns: HRESULT - status // // History: MKarki Created 11/22/97 // //---------------------------------------------------------------- HRESULT CSendToPipe::SetRequestProperties ( IRequest *pIRequest, CPacketRadius *pCPacketRadius, PACKETTYPE ePacketType ) { IRequestState *pIRequestState = NULL; IASREQUEST eRequest; IASRESPONSE eResponse; HRESULT hr = S_OK; _ASSERT (pIRequest && pCPacketRadius); __try { // // decide the Request and Response Type // switch (ePacketType) { case ACCESS_REQUEST: eRequest = IAS_REQUEST_ACCESS_REQUEST; eResponse = IAS_RESPONSE_ACCESS_ACCEPT; break; case ACCOUNTING_REQUEST: eRequest = IAS_REQUEST_ACCOUNTING; eResponse = IAS_RESPONSE_ACCOUNTING; break; case ACCESS_ACCEPT: eRequest = IAS_REQUEST_PROXY_PACKET; eResponse = IAS_RESPONSE_ACCESS_ACCEPT; break; case ACCOUNTING_RESPONSE: eRequest = IAS_REQUEST_PROXY_PACKET; eResponse = IAS_RESPONSE_ACCOUNTING; break; case ACCESS_CHALLENGE: eRequest = IAS_REQUEST_PROXY_PACKET; eResponse = IAS_RESPONSE_ACCESS_CHALLENGE; break; default: // // should never reach here // _ASSERT (0); IASTracePrintf ( "Packet of unsupported type:%d, before sending request to " "backend", static_cast (ePacketType) ); hr = E_FAIL; __leave; break; } // // set the request type now // hr = pIRequest->put_Request (eRequest); if (FAILED (hr)) { IASTracePrintf ( "Unable to set request type in request before sending " "it to the backend" ); __leave; } // // set the protocol now // hr = pIRequest->put_Protocol (IAS_PROTOCOL_RADIUS); if (FAILED (hr)) { IASTracePrintf ( "Unable to set protocol type in request before sending " "it to the backend" ); __leave; } // // Set source callback // hr = pIRequest->put_Source (m_pIRequestSource); if (FAILED (hr)) { IASTracePrintf ( "Unable to set request source type in request before sending " "it to the backend" ); __leave; } // // get the request state interface to put in our state now // // hr = pIRequest->QueryInterface ( __uuidof (IRequestState), reinterpret_cast (&pIRequestState) ); if (FAILED (hr)) { IASTracePrintf ( "Unable to get RequestState interface from request object " "before sending it to the backend" ); __leave; } // // put in the request state now // hr = pIRequestState->Push ( reinterpret_cast (pCPacketRadius) ); if (FAILED (hr)) { IASTracePrintf ( "Unable to set information in request state " "before sending request to backend" ); __leave; } // // success // } __finally { if (pIRequestState) { pIRequestState->Release (); } } return (hr); } // end of CSendToPipe::SetRequestProperties method