/*++ Copyright (c) 1997 Microsoft Corporation Module Name: agentsess.cpp Abstract: Implementation of the Agent Session object for TAPI 3.0. CAgentSession class CAgentSessionEvent class Author: noela - 11/04/97 Notes: optional-notes Revision History: --*/ #include "stdafx.h" #include "lmcons.h" DWORD MapAgentSessionStateFrom3to2(AGENT_SESSION_STATE tapi3State); HRESULT MapAgentSessionStateFrom2to3(DWORD tapi2State, AGENT_SESSION_STATE *tapi3State); ///////////////////////////////////////////////////////////////////////////// // CAgentSession //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Class : CAgentSession // Method : Initialize // // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STDMETHODIMP CAgentSession::Initialize( HAGENTSESSION hAgentSession, ITAgent * pAgent, ITACDGroup * pGroup, ITAddress * pAddress, CAgentHandler * pHandler, AddressLineStruct * pAddressLine ) { HRESULT hr = S_OK; LOG((TL_TRACE, "Initialize - enter, sessionhandle :%d", hAgentSession )); m_SessionState = ASST_NOT_READY; m_hAgentSession = hAgentSession; m_pAgent = pAgent; m_pGroup = pGroup; m_pReceiveCallsOnThisAddress = pAddress; pAddress->AddRef(); m_pHandler = pHandler; m_pAddressLine = pAddressLine; m_bRequiresUpdating = TRUE; // Now add to AgentHandler hash table m_pHandler->AddAgentSessionToHash(m_hAgentSession, this); // UpdateInfo(); // Fire an event here CAgentSessionEvent::FireEvent(this, ASE_NOT_READY); LOG((TL_TRACE, hr, "Initialize - exit" )); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Class : CAgentSession // Method : FinalRelease // // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ void CAgentSession::FinalRelease() { LOG((TL_TRACE, "FinalRelease session %d", m_hAgentSession )); // Now Remove to AgentHandler hash table //m_pHandler->RemoveAgentSessionFromHash(m_hAgentSession); // And then close our line CAddress *pAddress = (CAddress*)m_pReceiveCallsOnThisAddress; pAddress->MaybeCloseALine (&m_pAddressLine); pAddress->Release(); } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Class : CAgentSession // Method : UpdateInfo // // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STDMETHODIMP CAgentSession::UpdateInfo() { HRESULT hr2,hr = S_OK; LINEAGENTSESSIONINFO AgentSessionInfo; LOG((TL_TRACE, "UpdateInfo - enter" )); AgentSessionInfo.dwTotalSize = sizeof(LINEAGENTSESSIONINFO); AgentSessionInfo.dwNeededSize = sizeof(LINEAGENTSESSIONINFO); AgentSessionInfo.dwUsedSize = sizeof(LINEAGENTSESSIONINFO); // ************************************************** // Get Agent Info from Proxy hr = lineGetAgentSessionInfo( m_pAddressLine->t3Line.hLine, m_hAgentSession, &AgentSessionInfo); if( SUCCEEDED(hr) ) { // wait for async reply hr = WaitForReply( hr ); if ( SUCCEEDED(hr) ) { Lock(); if( FAILED( MapAgentSessionStateFrom2to3(AgentSessionInfo.dwAgentSessionState, &m_SessionState) ) ) { LOG((TL_ERROR, "UpdateInfo - AgentSessionState is invalid %d - setting to ASST_NOT_READY",AgentSessionInfo.dwAgentSessionState)); } if( FAILED( MapAgentSessionStateFrom2to3(AgentSessionInfo.dwNextAgentSessionState, &m_NextSessionState) ) ) { LOG((TL_ERROR, "UpdateInfo - NextAgentSessionState is invalid %d - setting to ASST_NOT_READY",AgentSessionInfo.dwAgentSessionState)); } m_dwSessionStartTime = AgentSessionInfo.dateSessionStartTime; m_dwSessionDuration = AgentSessionInfo.dwSessionDuration; m_dwNumberOfCalls = AgentSessionInfo.dwNumberOfCalls; m_dwTotalTalkTime = AgentSessionInfo.dwTotalTalkTime; m_dwAverageTalkTime = AgentSessionInfo.dwAverageTalkTime; m_dwTotalCallTime = AgentSessionInfo.dwTotalCallTime; m_dwAverageCallTime = AgentSessionInfo.dwAverageCallTime; m_dwTotalWrapUpTime = AgentSessionInfo.dwTotalWrapUpTime; m_dwAverageWrapUpTime = AgentSessionInfo.dwAverageWrapUpTime; m_dwACDCallRate = AgentSessionInfo.cyACDCallRate; m_dwLongestTimeToAnswer = AgentSessionInfo.dwLongestTimeToAnswer; m_dwAverageTimeToAnswer = AgentSessionInfo.dwAverageTimeToAnswer; m_bRequiresUpdating = FALSE; Unlock(); } else { LOG((TL_ERROR, "UpdateInfo - call to lineGetAgentSessionInfo failed async" )); } } else { LOG((TL_ERROR, "UpdateInfo - call to lineGetAgentSessionInfo failed" )); } LOG((TL_TRACE, hr, "UpdateInfo - exit" )); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Class : CAgentSession // Method : CheckIfUpToDate // // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STDMETHODIMP CAgentSession::CheckIfUpToDate() { HRESULT hr = S_OK; if (m_bRequiresUpdating) { hr = UpdateInfo(); } return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Class : CAgentSession // Interface : ITAgentSession // Method : AverageTimeToAnswer // // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STDMETHODIMP CAgentSession::get_AverageTimeToAnswer(long * pulAnswerTime) { HRESULT hr = S_OK; LOG((TL_TRACE, "AverageTimeToAnswer - enter" )); if (!TAPIIsBadWritePtr( pulAnswerTime, sizeof(long) ) ) { hr = CheckIfUpToDate(); if ( SUCCEEDED(hr) ) { Lock(); *pulAnswerTime = m_dwAverageTimeToAnswer; Unlock(); } else { LOG((TL_ERROR, "get_AverageTimeToAnswer - Object update failed")); } } else { LOG((TL_ERROR, "get_AverageTimeToAnswer - bad pulAnswerTime pointer")); hr = E_POINTER; } LOG((TL_TRACE, hr, "AverageTimeToAnswer - exit" )); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Class : CAgentSession // Interface : ITAgentSession // Method : LongestTimeToAnswer // // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STDMETHODIMP CAgentSession::get_LongestTimeToAnswer(long * pulAnswerTime) { HRESULT hr = S_OK; LOG((TL_TRACE, "LongestTimeToAnswer - enter" )); if (!TAPIIsBadWritePtr( pulAnswerTime, sizeof(long) ) ) { hr = CheckIfUpToDate(); if ( SUCCEEDED(hr) ) { Lock(); *pulAnswerTime = m_dwLongestTimeToAnswer; Unlock(); } else { LOG((TL_ERROR, "get_LongestTimeToAnswer - Object update failed")); } } else { LOG((TL_ERROR, "get_LongestTimeToAnswer - bad pulAnswerTime pointer")); hr = E_POINTER; } LOG((TL_TRACE, hr, "LongestTimeToAnswer - exit" )); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Class : CAgentSession // Interface : ITAgentSession // Method : ACDCallRate // // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STDMETHODIMP CAgentSession::get_ACDCallRate(CURRENCY * pcyCallrate) { HRESULT hr = S_OK; LOG((TL_TRACE, "ACDCallRate - enter" )); if (!TAPIIsBadWritePtr( pcyCallrate, sizeof(CURRENCY) ) ) { hr = CheckIfUpToDate(); if ( SUCCEEDED(hr) ) { Lock(); *pcyCallrate = m_dwACDCallRate; Unlock(); } else { LOG((TL_ERROR, "get_ACDCallRate - Object update failed")); } } else { LOG((TL_ERROR, "get_ACDCallRate - bad pcyCallrate pointer")); hr = E_POINTER; } LOG((TL_TRACE, hr, "ACDCallRate - exit" )); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Class : CAgentSession // Interface : ITAgentSession // Method : AverageWrapUpTime // // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STDMETHODIMP CAgentSession::get_AverageWrapUpTime(long * pulAverageWrapUpTime) { HRESULT hr = S_OK; LOG((TL_TRACE, "AverageWrapUpTime - enter" )); if (!TAPIIsBadWritePtr( pulAverageWrapUpTime, sizeof(long) ) ) { hr = CheckIfUpToDate(); if ( SUCCEEDED(hr) ) { Lock(); *pulAverageWrapUpTime = m_dwAverageWrapUpTime; Unlock(); } else { LOG((TL_ERROR, "get_AverageWrapUpTime - Object update failed")); } } else { LOG((TL_ERROR, "get_AverageWrapUpTime - bad pulAverageWrapUpTime pointer")); hr = E_POINTER; } LOG((TL_TRACE, hr, "AverageWrapUpTime - exit" )); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Class : CAgentSession // Interface : ITAgentSession // Method : TotalWrapUpTime // // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STDMETHODIMP CAgentSession::get_TotalWrapUpTime(long * pulTotalWrapUpTime) { HRESULT hr = S_OK; LOG((TL_TRACE, "TotalWrapUpTime - enter" )); if (!TAPIIsBadWritePtr( pulTotalWrapUpTime, sizeof(long) ) ) { hr = CheckIfUpToDate(); if ( SUCCEEDED(hr) ) { Lock(); *pulTotalWrapUpTime = m_dwTotalWrapUpTime; Unlock(); } else { LOG((TL_ERROR, "get_TotalWrapUpTime - Object update failed")); } } else { LOG((TL_ERROR, "get_TotalWrapUpTime - bad pulTotalWrapUpTime pointer")); hr = E_POINTER; } LOG((TL_TRACE, hr, "TotalWrapUpTime - exit" )); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Class : CAgentSession // Interface : ITAgentSession // Method : AverageCallTime // // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STDMETHODIMP CAgentSession::get_AverageCallTime(long * pulAverageCallTime) { HRESULT hr = S_OK; LOG((TL_TRACE, "AverageCallTime - enter" )); if (!TAPIIsBadWritePtr( pulAverageCallTime, sizeof(long) ) ) { hr = CheckIfUpToDate(); if ( SUCCEEDED(hr) ) { Lock(); *pulAverageCallTime = m_dwTotalCallTime; Unlock(); } else { LOG((TL_ERROR, "get_AverageCallTime - Object update failed")); } } else { LOG((TL_ERROR, "get_AverageCallTime - bad pulAverageCallTime pointer")); hr = E_POINTER; } LOG((TL_TRACE, hr, "AverageCallTime - exit" )); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Class : CAgentSession // Interface : ITAgentSession // Method : TotalCallTime // // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STDMETHODIMP CAgentSession::get_TotalCallTime(long * pulTotalCallTime) { HRESULT hr = S_OK; LOG((TL_TRACE, "TotalCallTime - enter" )); if (!TAPIIsBadWritePtr( pulTotalCallTime, sizeof(long) ) ) { hr = CheckIfUpToDate(); if ( SUCCEEDED(hr) ) { Lock(); *pulTotalCallTime = m_dwTotalCallTime; Unlock(); } else { LOG((TL_ERROR, "get_TotalCallTime - Object update failed")); } } else { LOG((TL_ERROR, "get_TotalCallTime - bad pulTotalCallTime pointer")); hr = E_POINTER; } LOG((TL_TRACE, hr, "TotalCallTime - exit" )); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Class : CAgentSession // Interface : ITAgentSession // Method : AverageTalkTime // // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STDMETHODIMP CAgentSession::get_AverageTalkTime(long * pulAverageTalkTime) { HRESULT hr = S_OK; LOG((TL_TRACE, "AverageTalkTime - enter" )); if (!TAPIIsBadWritePtr( pulAverageTalkTime, sizeof(long) ) ) { hr = CheckIfUpToDate(); if ( SUCCEEDED(hr) ) { Lock(); *pulAverageTalkTime = m_dwAverageTalkTime; Unlock(); } else { LOG((TL_ERROR, "get_AverageTalkTime - Object update failed")); } } else { LOG((TL_ERROR, "get_AverageTalkTime - bad pulAverageTalkTime pointer")); hr = E_POINTER; } LOG((TL_TRACE, hr, "AverageTalkTime - exit" )); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Class : CAgentSession // Interface : ITAgentSession // Method : TotalTalkTime // // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STDMETHODIMP CAgentSession::get_TotalTalkTime(long * pulTotalTalkTime) { HRESULT hr = S_OK; LOG((TL_TRACE, "TotalTalkTime - enter" )); if (!TAPIIsBadWritePtr( pulTotalTalkTime, sizeof(long) ) ) { hr = CheckIfUpToDate(); if ( SUCCEEDED(hr) ) { Lock(); *pulTotalTalkTime = m_dwTotalTalkTime; Unlock(); } else { LOG((TL_ERROR, "get_TotalTalkTime - Object update failed")); } } else { LOG((TL_ERROR, "get_TotalTalkTime - bad pulTotalTalkTime pointer")); hr = E_POINTER; } LOG((TL_TRACE, hr, "TotalTalkTime - exit" )); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Class : CAgentSession // Interface : ITAgentSession // Method : NumberOfCalls // // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STDMETHODIMP CAgentSession::get_NumberOfCalls(long * pulNumberOfCalls) { HRESULT hr = S_OK; LOG((TL_TRACE, "NumberOfCalls - enter" )); if (!TAPIIsBadWritePtr( pulNumberOfCalls, sizeof(long) ) ) { hr = CheckIfUpToDate(); if ( SUCCEEDED(hr) ) { Lock(); *pulNumberOfCalls = m_dwNumberOfCalls; Unlock(); } else { LOG((TL_ERROR, "get_NumberOfCalls - Object update failed")); } } else { LOG((TL_ERROR, "get_NumberOfCalls - bad pulNumberOfCalls pointer")); hr = E_POINTER; } LOG((TL_TRACE, hr, "NumberOfCalls - exit" )); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Class : CAgentSession // Interface : ITAgentSession // Method : SessionDuration // // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STDMETHODIMP CAgentSession::get_SessionDuration(long * pulSessionDuration) { HRESULT hr = S_OK; LOG((TL_TRACE, "SessionDuration - enter" )); if (!TAPIIsBadWritePtr( pulSessionDuration, sizeof(long) ) ) { hr = CheckIfUpToDate(); if ( SUCCEEDED(hr) ) { Lock(); *pulSessionDuration = m_dwSessionDuration; Unlock(); } else { LOG((TL_ERROR, "get_SessionDuration - Object update failed")); } } else { LOG((TL_ERROR, "get_SessionDuration - bad pulSessionDuration pointer")); hr = E_POINTER; } LOG((TL_TRACE, hr, "SessionDuration - exit" )); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Class : CAgentSession // Interface : ITAgentSession // Method : SessionStartTime // // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STDMETHODIMP CAgentSession::get_SessionStartTime(DATE * dateSessionStart) { HRESULT hr = S_OK; LOG((TL_TRACE, "SessionStartTime - enter" )); if (!TAPIIsBadWritePtr( dateSessionStart, sizeof(DATE) ) ) { hr = CheckIfUpToDate(); if ( SUCCEEDED(hr) ) { Lock(); *dateSessionStart = m_dwSessionStartTime; Unlock(); } else { LOG((TL_ERROR, "get_SessionStartTime - Object update failed")); } } else { LOG((TL_ERROR, "get_SessionStartTime - bad dateSessionStart pointer")); hr = E_POINTER; } LOG((TL_TRACE, hr, "SessionStartTime - exit" )); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Class : CAgentSession // Interface : ITAgentSession // Method : get_State // // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STDMETHODIMP CAgentSession::get_State(AGENT_SESSION_STATE * pSessionState) { HRESULT hr = S_OK; LOG((TL_TRACE, "get_State - enter" )); if (!TAPIIsBadWritePtr( pSessionState, sizeof(AGENT_SESSION_STATE) ) ) { Lock(); *pSessionState = m_SessionState; Unlock(); } else { LOG((TL_ERROR, "get_State - bad pSessionState pointer")); hr = E_POINTER; } LOG((TL_TRACE, hr, "get_State - exit" )); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Class : CAgentSession // Interface : ITAgentSession // Method : put_State // // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STDMETHODIMP CAgentSession::put_State(AGENT_SESSION_STATE sessionState) { HRESULT hr = S_OK; HLINE hLine; DWORD dwSessionState = 0; LOG((TL_TRACE, "put_State - enter" )); Lock(); hLine = m_pAddressLine->t3Line.hLine; Unlock(); dwSessionState = MapAgentSessionStateFrom3to2(sessionState); if( 0 == dwSessionState ) { hr = E_INVALIDARG; } else { hr = lineSetAgentSessionState (hLine, m_hAgentSession, dwSessionState, 0 // MapAgentSessionStateFrom3to2(m_NextSessionState) ); if( SUCCEEDED(hr) ) { // wait for async reply hr = WaitForReply( hr ); if ( SUCCEEDED(hr) ) { Lock(); m_SessionState = sessionState; Unlock(); switch( sessionState ) { case ASST_NOT_READY: CAgentSessionEvent::FireEvent(this, ASE_NOT_READY); break; case ASST_READY: CAgentSessionEvent::FireEvent(this, ASE_READY); break; case ASST_BUSY_ON_CALL: CAgentSessionEvent::FireEvent(this, ASE_BUSY); break; case ASST_BUSY_WRAPUP: CAgentSessionEvent::FireEvent(this, ASE_WRAPUP); break; case ASST_SESSION_ENDED: CAgentSessionEvent::FireEvent(this, ASE_END); break; } } else { LOG((TL_ERROR, "put_State - lineSetAgentSessionState failed async" )); } } else { LOG((TL_ERROR, "put_State - lineSetAgentSessionState failed" )); } } LOG((TL_TRACE, hr, "put_State - exit" )); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Class : CAgentSession // Interface : ITAgentSession // Method : ACDGroup // // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STDMETHODIMP CAgentSession::get_ACDGroup(ITACDGroup **ppACDGroup) { HRESULT hr = S_OK; LOG((TL_TRACE, "ACDGroup - enter" )); if (!TAPIIsBadWritePtr( ppACDGroup, sizeof(ITACDGroup *) ) ) { Lock(); *ppACDGroup = m_pGroup; Unlock(); } else { LOG((TL_ERROR, "get_ACDGroup - bad ppACDGroup pointer")); hr = E_POINTER; } LOG((TL_TRACE, hr, "ACDGroup - exit" )); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Class : CAgentSession // Interface : ITAgentSession // Method : Address // // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STDMETHODIMP CAgentSession::get_Address(ITAddress **ppAddress) { HRESULT hr = S_OK; LOG((TL_TRACE, "Address - enter" )); if (!TAPIIsBadWritePtr( ppAddress, sizeof(ITAddress *) ) ) { Lock(); *ppAddress = m_pReceiveCallsOnThisAddress; Unlock(); } else { LOG((TL_ERROR, "get_Address - bad ppAddress pointer")); hr = E_POINTER; } LOG((TL_TRACE, hr, "Address - exit" )); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Class : CAgentSession // Interface : ITAgentSession // Method : Agent // // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STDMETHODIMP CAgentSession::get_Agent(ITAgent **ppAgent) { HRESULT hr = S_OK; LOG((TL_TRACE, "Agent - enter" )); if (!TAPIIsBadWritePtr( ppAgent, sizeof(ITAgent *) ) ) { Lock(); *ppAgent = m_pAgent; Unlock(); } else { LOG((TL_ERROR, "get_Agent - bad ppAgent pointer")); hr = E_POINTER; } LOG((TL_TRACE, hr, "Agent - exit" )); return hr; } ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// // CAgentSessionEvent //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Class : CAgentSessionEvent // Method : FireEvent // // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ HRESULT CAgentSessionEvent::FireEvent(CAgentSession * pAgentSession, AGENT_SESSION_EVENT event) { HRESULT hr = S_OK; CComObject * pEvent; IDispatch * pIDispatch; CAgentHandler * pAgentHandler = NULL; // // create event // hr = CComObject::CreateInstance( &pEvent ); if ( SUCCEEDED(hr) ) { // // initialize // pEvent->m_SessionEvent = event; pEvent->m_pSession= dynamic_cast(pAgentSession); pEvent->m_pSession->AddRef(); // // get idisp interface // hr = pEvent->QueryInterface( IID_IDispatch, (void **)&pIDispatch ); if ( SUCCEEDED(hr) ) { // // get callback & fire event // pAgentHandler = pAgentSession->GetAgentHandler(); if( pAgentHandler != NULL) { CTAPI *pTapi = pAgentHandler->GetTapi(); pTapi->Event( TE_AGENTSESSION, pIDispatch ); } // release stuff // pIDispatch->Release(); } else { STATICLOG((TL_ERROR, "(Event)FireEvent - Could not get disp interface of AgentSessionEvent object")); delete pEvent; } } else { STATICLOG((TL_ERROR, "(Event)FireEvent - Could not create AgentSessionEvent object")); } STATICLOG((TL_TRACE, hr, "(Event)FireEvent - exit")); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Class : CAgentSessionEvent // Method : FinalRelease // // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ void CAgentSessionEvent::FinalRelease() { m_pSession->Release(); } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Class : CAgentSessionEvent // Interface : ITAgentSessionEvent // Method : Session // // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STDMETHODIMP CAgentSessionEvent::get_Session(ITAgentSession * * ppSession) { HRESULT hr = S_OK; LOG((TL_TRACE, "(Event)Session - enter" )); if (!TAPIIsBadWritePtr( ppSession, sizeof(ITAgentSession *) ) ) { *ppSession = m_pSession; m_pSession->AddRef(); } else { LOG((TL_ERROR, "(Event)Session - bad ppSession pointer")); hr = E_POINTER; } LOG((TL_TRACE, hr, "(Event)Session - exit")); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Class : CAgentSessionEvent . // Interface : ITAgentSessionEvent // Method : Event // // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STDMETHODIMP CAgentSessionEvent::get_Event(AGENT_SESSION_EVENT * pEvent) { HRESULT hr = S_OK; LOG((TL_TRACE, "Event - enter" )); if (!TAPIIsBadWritePtr( pEvent, sizeof(AGENT_SESSION_EVENT) ) ) { *pEvent = m_SessionEvent; } else { LOG((TL_ERROR, "Event - bad pEvent pointer")); hr = E_POINTER; } LOG((TL_TRACE, hr, "Event - exit")); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Function : MapAgentSessionStateFrom3to2 // // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DWORD MapAgentSessionStateFrom3to2(AGENT_SESSION_STATE tapi3State) { DWORD tapi2State = 0; switch(tapi3State) { case ASST_NOT_READY: tapi2State = LINEAGENTSESSIONSTATE_NOTREADY; break; case ASST_READY: tapi2State = LINEAGENTSESSIONSTATE_READY; break; case ASST_BUSY_ON_CALL: tapi2State = LINEAGENTSESSIONSTATE_BUSYONCALL; break; case ASST_BUSY_WRAPUP: tapi2State = LINEAGENTSESSIONSTATE_BUSYWRAPUP; break; case ASST_SESSION_ENDED: tapi2State = LINEAGENTSESSIONSTATE_ENDED; break; default: break; } /*Nikhilb:Assuming that 0 is not a valid state. So if this function returns 0 then it is assumed that it was passed an invalid state*/ return tapi2State; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Function : MapAgentSessionStateFrom2to3 // // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ HRESULT MapAgentSessionStateFrom2to3(DWORD tapi2State, AGENT_SESSION_STATE *tapi3State) { HRESULT hr = S_OK; if (tapi2State & LINEAGENTSESSIONSTATE_NOTREADY) { *tapi3State = ASST_NOT_READY; } else if (tapi2State & LINEAGENTSESSIONSTATE_READY) { *tapi3State = ASST_READY; } else if (tapi2State & LINEAGENTSESSIONSTATE_BUSYONCALL) { *tapi3State = ASST_BUSY_ON_CALL; } else if (tapi2State & LINEAGENTSESSIONSTATE_BUSYWRAPUP) { *tapi3State = ASST_BUSY_WRAPUP; } else if (tapi2State & LINEAGENTSESSIONSTATE_ENDED) { *tapi3State = ASST_SESSION_ENDED; } else { *tapi3State = ASST_NOT_READY; // default hr = E_INVALIDARG; } return hr; }