/*++ Copyright (c) 1997-1999 Microsoft Corporation Module Name: agent.cpp Abstract: Implementation of the Agent object for TAPI 3.0. CAgent class CAgentEvent class Author: noela - 11/04/97 Notes: optional-notes Revision History: --*/ #include "stdafx.h" DWORD MapAgentStateFrom3to2(AGENT_STATE tapi3State); HRESULT MapAgentStateFrom2to3(DWORD tapi2State, AGENT_STATE *tapi3State); ///////////////////////////////////////////////////////////////////////////// // CAgent //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Class : CAgent // Method : Initialize // // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STDMETHODIMP CAgent::Initialize( HAGENT hAgent, PWSTR pszUserName, PWSTR pszID, PWSTR pszPIN, CAgentHandler * pHandler ) { HRESULT hr = S_OK; LOG((TL_TRACE, "Initialize - enter" )); m_bRegisteredForAgentEvents = FALSE; m_bRegisteredForAgentSessionEvents = FALSE; m_bRequiresUpdating = TRUE; m_pHandler = pHandler; m_hAgent = hAgent; m_AgentState = AS_UNKNOWN; m_szAgentUserName = NULL; m_szAgentID = NULL; m_szPIN = NULL; if (pszUserName != NULL) { m_szAgentUserName = (PWSTR) ClientAlloc((lstrlenW(pszUserName) + 1) * sizeof (WCHAR)); if (m_szAgentUserName != NULL) { // Copy the name string lstrcpyW(m_szAgentUserName,pszUserName); } else { LOG((TL_ERROR, "Initialize - Alloc m_szAgentUserName failed" )); hr = E_OUTOFMEMORY; } } else // Agent Name is aNULL string { LOG((TL_ERROR, "Initialize - Agent Name is NULL" )); } // Now do the Agent ID if (pszID != NULL) { m_szAgentID = (PWSTR) ClientAlloc((lstrlenW(pszID) + 1) * sizeof (WCHAR)); if (m_szAgentID != NULL) { lstrcpyW(m_szAgentID,pszID); } else { LOG((TL_ERROR, "Initialize - Alloc m_szAgentID failed" )); hr = E_OUTOFMEMORY; } } else // ID is a NULL string { LOG((TL_INFO, "Initialize - Agent ID is NULL" )); } // Now do the Agent PIN if (pszPIN != NULL) { m_szPIN = (PWSTR) ClientAlloc((lstrlenW(pszPIN) + 1) * sizeof (WCHAR)); if (m_szPIN != NULL) { lstrcpyW(m_szPIN,pszPIN); } else { LOG((TL_ERROR, "Initialize - Alloc m_szPIN failed" )); hr = E_OUTOFMEMORY; } } else // PIN is a NULL string { LOG((TL_INFO, "Initialize - Agent PIN is NULL" )); } // Get Agent Info from Proxy // UpdateInfo(); if ( SUCCEEDED(hr) ) { // Fire an event here CAgentEvent::FireEvent(this, AE_UNKNOWN); } LOG((TL_TRACE, "Initialize Agent - %S, %S", m_szAgentUserName, m_szAgentID )); LOG((TL_TRACE, hr, "Initialize - exit" )); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Class : CAgent // Method : FinalRelease // // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ void CAgent::FinalRelease() { LOG((TL_TRACE, "FinalRelease Agent - %S", m_szAgentUserName )); if ( m_szAgentUserName != NULL ) { ClientFree(m_szAgentUserName); } if ( m_szAgentID != NULL ) { ClientFree(m_szAgentID); } if (m_szPIN != NULL) { ClientFree(m_szPIN); } m_AgentSessionArray.Shutdown(); LOG((TL_TRACE, "FinalRelease Agent - exit")); } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Class : CAgent // Method : UpdateInfo // // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STDMETHODIMP CAgent::UpdateInfo() { HRESULT hr = S_OK; LINEAGENTINFO AgentInfo; LOG((TL_TRACE, "UpdateInfo - enter" )); AgentInfo.dwTotalSize = sizeof(LINEAGENTINFO); AgentInfo.dwNeededSize = sizeof(LINEAGENTINFO); AgentInfo.dwUsedSize = sizeof(LINEAGENTINFO); // ************************************************** // Get Agent Info from Proxy hr = lineGetAgentInfo( m_pHandler->getHLine(), m_hAgent, &AgentInfo); if( SUCCEEDED(hr) ) { // wait for async reply hr = WaitForReply( hr ); if ( SUCCEEDED(hr) ) { Lock(); if( FAILED( MapAgentStateFrom2to3(AgentInfo.dwAgentState, &m_AgentState) ) ) { LOG((TL_ERROR, "UpdateInfo - AgentState is invalid %d - setting to AS_UNKNOWN", AgentInfo.dwAgentState)); } if( FAILED( MapAgentStateFrom2to3(AgentInfo.dwNextAgentState, &m_NextAgentState) ) ) { LOG((TL_ERROR, "UpdateInfo - NextAgentState is invalid %d - setting to AS_UNKNOWN",AgentInfo.dwNextAgentState)); } m_dwMeasurementPeriod = AgentInfo.dwMeasurementPeriod; m_cyOverallCallRate = AgentInfo.cyOverallCallRate; m_dwNumberOfACDCalls = AgentInfo.dwNumberOfACDCalls; m_dwNumberOfIncomingCalls = AgentInfo.dwNumberOfIncomingCalls; m_dwNumberOfOutgoingCalls = AgentInfo.dwNumberOfOutgoingCalls; m_dwTotalACDTalkTime = AgentInfo.dwTotalACDTalkTime; m_dwTotalACDCallTime = AgentInfo.dwTotalACDCallTime; m_dwTotalACDWrapUpTime = AgentInfo.dwTotalACDWrapUpTime; m_bRequiresUpdating = FALSE; Unlock(); } else { LOG((TL_ERROR, "UpdateInfo - call to lineGetAgentInfo failed async" )); } } else { LOG((TL_ERROR, "UpdateInfo - call to lineGetAgentInfo failed" )); } LOG((TL_TRACE, hr, "UpdateInfo - exit" )); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Class : CAgent // Method : CheckIfUpToDate // // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STDMETHODIMP CAgent::CheckIfUpToDate() { HRESULT hr = S_OK; if (m_bRequiresUpdating) { hr = UpdateInfo(); } return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Class : CAgent // Interface : ITAgent // Method : EnumerateAgentSessions // // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STDMETHODIMP CAgent::EnumerateAgentSessions(IEnumAgentSession ** ppEnumAgentSession) { ITAgent* pITAgent; CAgent * pAgent; HRESULT hr = S_OK; LOG((TL_TRACE, "EnumerateAgentSessions - enter" )); LOG((TL_TRACE, "EnumerateAgentSessions - ppEnumAgentSessions %p", ppEnumAgentSession )); if(!TAPIIsBadWritePtr( ppEnumAgentSession, sizeof(IEnumAgentSession *) ) ) { Lock(); // // create the enumerator // CComObject< CTapiEnum > * pEnum; hr = CComObject< CTapiEnum > ::CreateInstance( &pEnum ); if ( SUCCEEDED (hr) ) { // // initialize it with our Session list // pEnum->Initialize(m_AgentSessionArray); // // return it *ppEnumAgentSession = pEnum; } else { LOG((TL_TRACE, "EnumerateAgentSessions - could not create enum" )); } Unlock(); } else { LOG((TL_ERROR, "EnumerateAgentSessions - bad ppEnumAgentSession pointer" )); hr = E_POINTER; } LOG((TL_ERROR, hr, "EnumerateAgentSessions - exit" )); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Class : CAgent // Interface : ITAgent // Method : get_AgentSessions // // Return a collection of agent sessions // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STDMETHODIMP CAgent::get_AgentSessions(VARIANT * pVariant) { HRESULT hr = S_OK; IDispatch * pDisp = NULL; LOG((TL_TRACE, "get_AgentSessions - enter")); if (!TAPIIsBadWritePtr( pVariant, sizeof(VARIANT) ) ) { // // create the collection // CComObject< CTapiCollection< ITAgentSession > > * p; hr = CComObject< CTapiCollection< ITAgentSession > >::CreateInstance( &p ); if (SUCCEEDED(hr) ) { // initialize it with our address list Lock(); hr = p->Initialize( m_AgentSessionArray ); Unlock(); if ( SUCCEEDED(hr) ) { // get the IDispatch interface hr = p->_InternalQueryInterface( IID_IDispatch, (void **) &pDisp ); if ( SUCCEEDED(hr) ) { // put it in the variant VariantInit(pVariant); pVariant->vt = VT_DISPATCH; pVariant->pdispVal = pDisp; } else { LOG((TL_ERROR, "get_AgentSessions - could not get IDispatch interface" )); delete p; } } else { LOG((TL_ERROR, "get_AgentSessions - could not initialize collection" )); delete p; } } else { LOG((TL_ERROR, "get_AgentSessions - could not create collection" )); } } else { LOG((TL_ERROR, "get_AgentSessions - bad pVariant pointer" )); hr = E_POINTER; } LOG((TL_TRACE, hr, "get_AgentSessions - exit")); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Class : CAgent // Interface : ITAgent // Method : RegisterAgentEvents // // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STDMETHODIMP CAgent::RegisterAgentEvents(VARIANT_BOOL bNotify) { HRESULT hr = S_OK; LOG((TL_TRACE, "RegisterAgentEvents - enter" )); m_bRegisteredForAgentEvents = bNotify; LOG((TL_TRACE, "RegisterAgentEvents - exit" )); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Class : CAgent // Interface : ITAgent // Method : RegisterAgentSessionEvents // // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STDMETHODIMP CAgent::RegisterAgentSessionEvents(VARIANT_BOOL bNotify) { HRESULT hr = S_OK; LOG((TL_TRACE, "RegisterAgentSessionEvents - enter" )); m_bRegisteredForAgentSessionEvents = bNotify; LOG((TL_TRACE, hr, "RegisterAgentSessionEvents - exit" )); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Class : CAgent // Interface : ITAgent // Method : CreateSessionWithPIN // // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STDMETHODIMP CAgent::CreateSessionWithPIN(ITACDGroup * pACDGroup, ITAddress * pAddress, BSTR pPIN, ITAgentSession ** ppAgentSession ) { HRESULT hr = S_OK; LOG((TL_TRACE, "CreateSessionWithPIN - enter" )); if ( agentHasID() ) { if(!TAPIIsBadWritePtr( ppAgentSession, sizeof(ITAgentSession *) ) ) { if (!IsBadStringPtrW( pPIN, -1 )) { // Pointer OK, is it empty ? if( pPIN != NULL) { hr = InternalCreateSession(pACDGroup, pAddress, pPIN, ppAgentSession); } else // PIN is NULL { LOG((TL_ERROR, "CreateSessionWithPIN - failed, PIN is NULL")); hr = E_INVALIDARG; } } else // bad BSTR pointer { LOG((TL_ERROR, "CreateSessionWithPIN - invalid pPIN pointer" )); hr = E_POINTER; } } else { LOG((TL_ERROR, "CreateSessionWithPIN - invalid ppAgentSession pointer" )); hr = E_POINTER; } } else // no ID { LOG((TL_ERROR, "CreateSessionWithPIN - Agent not created by CreateAgentWithID()" )); hr = TAPI_E_CALLCENTER_NO_AGENT_ID; } LOG((TL_TRACE, hr, "CreateSessionWithPIN - exit" )); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Class : CAgent // Interface : ITAgent // Method : CreateSession // // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STDMETHODIMP CAgent::CreateSession(ITACDGroup * pACDGroup, ITAddress * pAddress, ITAgentSession ** ppAgentSession ) { HRESULT hr = S_OK; LOG((TL_TRACE, "CreateSession - enter" )); if(!TAPIIsBadWritePtr( ppAgentSession, sizeof(ITAgentSession *) ) ) { hr = InternalCreateSession(pACDGroup, pAddress, m_szPIN, ppAgentSession); } else { LOG((TL_ERROR, "CreateSession - invalid ppAgentSession pointer" )); hr = E_POINTER; } LOG((TL_TRACE, hr, "CreateSession - exit" )); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Class : CAgent // Interface : ITAgent // Method : CreateSession // // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STDMETHODIMP CAgent::InternalCreateSession(ITACDGroup * pACDGroup, ITAddress * pAddress, PWSTR pszPIN, ITAgentSession ** ppAgentSession) { HAGENTSESSION hAgentSession; LINEAGENTENTRY Agent; DWORD dwAddressID; GUID GroupID; CACDGroup * pGroup = NULL; CAddress * pCAddress = NULL; CComObject * pAgentSession; AddressLineStruct * pAddressLine; HRESULT hr = S_OK; LOG((TL_TRACE, "InternalCreateSession - enter" )); // check for a valid ACD group & get its address ID pGroup = dynamic_cast*>(pACDGroup); if (pGroup != NULL) { GroupID = pGroup->getID(); // check for a valid address & get its address ID pCAddress = dynamic_cast*>(pAddress); if (pCAddress != NULL) { dwAddressID = pCAddress->GetAddressID(); hr = pCAddress->FindOrOpenALine (LINEMEDIAMODE_INTERACTIVEVOICE, &pAddressLine); if(SUCCEEDED(hr) ) { // All OK so far, try to create session (sends request to proxy) hr = LineCreateAgentSession( pAddressLine->t3Line.hLine, m_hAgent, pszPIN, dwAddressID, &GroupID, &hAgentSession ); if ( SUCCEEDED(hr) ) { hr = WaitForReply( hr ); if ( SUCCEEDED(hr) ) { LOG((TL_INFO, "InternalCreateSession - create new session" )); hr = CComObject::CreateInstance( &pAgentSession ); if ( SUCCEEDED(hr) ) { ITAgentSession * pITAgentSession; hr = pAgentSession->QueryInterface(IID_ITAgentSession, (void **)&pITAgentSession); if ( SUCCEEDED(hr) ) { // initialize the Agent hr = pAgentSession->Initialize( hAgentSession, this, pACDGroup, pAddress, m_pHandler, pAddressLine ); if ( SUCCEEDED(hr) ) { // add to list Lock(); m_AgentSessionArray.Add( pITAgentSession ); Unlock(); pITAgentSession->Release(); // This is the clients reference pAgentSession->AddRef(); try { // set return value *ppAgentSession = pAgentSession; } catch(...) { hr = E_POINTER; } } else //(FAILED (hr) ) pAgentSession->Initialize { LOG((TL_ERROR, "InternalCreateSession - failed to initialize new object" )); delete pAgentSession; } } else //(FAILED (hr) ) pAgentSession->QueryInterface { LOG((TL_ERROR, "InternalCreateSession - failed to query interface" )); delete pAgentSession; } } else //(FAILED (hr) ) CreateInstance { LOG((TL_ERROR, "InternalCreateSession - createInstance failed for COM object" )); } } else // LineCreateAgentSession failed async { LOG((TL_ERROR, "InternalCreateSession - LineCreateAgentSession failed async" )); } } else //(FAILED (hr) ) LineCreateAgentSession { LOG((TL_ERROR, "InternalCreateSession - LineCreateAgentSession failed" )); } } else { LOG((TL_ERROR, "InternalCreateSession - Failed to open a line for the target Address" )); hr = E_UNEXPECTED; } } else //(pCAddress == NULL) { LOG((TL_ERROR, "InternalCreateSession - invalid Destination Address" )); hr = E_INVALIDARG; } } else //(pGroup == NULL) { LOG((TL_ERROR, "InternalCreateSession - invalid ACDGroup" )); hr = E_INVALIDARG; } LOG((TL_TRACE, hr, "InternalCreateSession - exit" )); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Class : CAgent // Interface : ITAgent // Method : ID // // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STDMETHODIMP CAgent::get_ID(BSTR * pID) { HRESULT hr = S_OK; LOG((TL_TRACE, "ID - enter" )); Lock(); if ( !agentHasID() ) { LOG((TL_ERROR, "ID - Agent not created by CreateAgentWithID()" )); hr = TAPI_E_CALLCENTER_NO_AGENT_ID; } if(!TAPIIsBadWritePtr( pID, sizeof(BSTR) ) ) { if (m_szAgentID == NULL) { *pID = NULL; } else { *pID = SysAllocString(m_szAgentID); if (*pID == NULL) { hr = E_OUTOFMEMORY; } } } else { LOG((TL_ERROR, "ID - bad pID pointer" )); hr = E_POINTER; } Unlock(); LOG((TL_TRACE, hr, "ID - exit" )); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Class : CAgent // Interface : ITAgent // Method : User // // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STDMETHODIMP CAgent::get_User(BSTR * ppUser) { HRESULT hr = S_OK; LOG((TL_TRACE, "User - enter" )); Lock(); if(!TAPIIsBadWritePtr( ppUser, sizeof(BSTR) ) ) { *ppUser = SysAllocString(m_szAgentUserName); if (*ppUser == NULL) { hr = E_OUTOFMEMORY; } } else { LOG((TL_ERROR, "User - bad ppUser pointer" )); hr = E_POINTER; } Unlock(); LOG((TL_TRACE, hr, "User - exit" )); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Class : CAgent // Interface : ITAgent // Method : put_State // // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STDMETHODIMP CAgent::put_State(AGENT_STATE AgentState) { HRESULT hr = S_OK; HLINE hLine; DWORD dwState = 0; LOG((TL_TRACE, "put_State - enter" )); Lock(); hLine = (GetAgentHandler() )->getHLine(); Unlock(); dwState = MapAgentStateFrom3to2(AgentState); hr = lineSetAgentStateEx (hLine, m_hAgent, dwState, 0 //MapAgentStateFrom3to2(m_NextAgentState) ); if( SUCCEEDED(hr) ) { // wait for async reply hr = WaitForReply( hr ); if ( SUCCEEDED(hr) ) { Lock(); m_AgentState = AgentState; Unlock(); switch(AgentState) { case AS_NOT_READY: CAgentEvent::FireEvent(this, AE_NOT_READY); break; case AS_READY: CAgentEvent::FireEvent(this, AE_READY); break; case AS_BUSY_ACD: CAgentEvent::FireEvent(this, AE_BUSY_ACD); break; case AS_BUSY_INCOMING: CAgentEvent::FireEvent(this, AE_BUSY_INCOMING); break; case AS_BUSY_OUTGOING: CAgentEvent::FireEvent(this, AE_BUSY_OUTGOING); case AS_UNKNOWN: CAgentEvent::FireEvent(this, AE_UNKNOWN); break; } } else { LOG((TL_ERROR, "put_State - lineSetAgentStateEx failed async" )); } } else { LOG((TL_ERROR, "put_State - lineSetAgentStateEx failed" )); } LOG((TL_TRACE, hr, "put_State - exit" )); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Class : CAgent // Interface : ITAgent // Method : get_State // // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STDMETHODIMP CAgent::get_State(AGENT_STATE * pAgentState) { HRESULT hr = S_OK; LOG((TL_TRACE, "get_State - enter" )); if(!TAPIIsBadWritePtr( pAgentState, sizeof(AGENT_STATE) ) ) { Lock(); *pAgentState = m_AgentState; Unlock(); } else { LOG((TL_ERROR, "get_State - bad pAgentState pointer")); hr = E_POINTER; } LOG((TL_TRACE, hr, "get_State - exit" )); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Class : CAgent // Interface : ITAgent // Method : put_MeasurementPeriod // // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STDMETHODIMP CAgent::put_MeasurementPeriod(long ulPeriod) { HRESULT hr = S_OK; LOG((TL_TRACE, "put_MeasurementPeriod - enter" )); // Tell Proxy hr = lineSetAgentMeasurementPeriod( m_pHandler->getHLine(), m_hAgent, ulPeriod); if( SUCCEEDED(hr) ) { // wait for async reply hr = WaitForReply( hr ); if ( SUCCEEDED(hr) ) { Lock(); m_dwMeasurementPeriod = ulPeriod; Unlock(); } else { LOG((TL_ERROR, "put_MeasurementPeriod - call to LineSetAgentMeasurementPeriod failed async" )); } } else { LOG((TL_ERROR, "put_MeasurementPeriod - call to LineSetAgentMeasurementPeriod failed" )); } LOG((TL_TRACE, hr, "put_MeasurementPeriod - exit" )); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Class : CAgent // Interface : ITAgent // Method : get_MeasurementPeriod // // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STDMETHODIMP CAgent::get_MeasurementPeriod(long * pulPeriod) { HRESULT hr = S_OK; DWORD period; LOG((TL_TRACE, "get_MeasurementPeriod - enter" )); if(!TAPIIsBadWritePtr( pulPeriod, sizeof(long) ) ) { hr = CheckIfUpToDate(); if ( SUCCEEDED(hr) ) { Lock(); *pulPeriod = m_dwMeasurementPeriod; Unlock(); } else { LOG((TL_ERROR, "get_MeasurementPeriod - Object update failed")); } } else { LOG((TL_ERROR, "get_MeasurementPeriod -bad pulPeriod pointer" )); hr = E_POINTER; } LOG((TL_TRACE, hr, "get_MeasurementPeriod - exit" )); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Class : CAgent // Interface : ITAgent // Method : OverallCallrate // // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STDMETHODIMP CAgent::get_OverallCallRate(CURRENCY * pcyCallrate) { HRESULT hr = S_OK; LOG((TL_TRACE, "OverallCallrate - enter" )); if (!TAPIIsBadWritePtr( pcyCallrate, sizeof(CURRENCY) ) ) { hr = CheckIfUpToDate(); if ( SUCCEEDED(hr) ) { Lock(); *pcyCallrate = m_cyOverallCallRate; Unlock(); } else { LOG((TL_ERROR, "get_OverallCallRate - Object update failed")); } } else { LOG((TL_ERROR, "get_OverallCallRate - bad pcyCallrate pointer")); hr = E_POINTER; } LOG((TL_TRACE, hr, "OverallCallrate - exit" )); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Class : CAgent // Interface : ITAgent // Method : NumberOfACDCalls // // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STDMETHODIMP CAgent::get_NumberOfACDCalls(long * pulCalls) { HRESULT hr = S_OK; LOG((TL_TRACE, "NumberOfACDCalls - enter" )); if (!TAPIIsBadWritePtr( pulCalls, sizeof(long) ) ) { hr = CheckIfUpToDate(); if ( SUCCEEDED(hr) ) { Lock(); *pulCalls = m_dwNumberOfACDCalls; Unlock(); } else { LOG((TL_ERROR, "get_NumberOfACDCalls - Object update failed")); } } else { LOG((TL_ERROR, "get_NumberOfACDCalls - bad pulCalls pointer")); hr = E_POINTER; } LOG((TL_TRACE, hr, "NumberOfACDCalls - exit" )); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Class : CAgent // Interface : ITAgent // Method : NumberOfIncomingCalls // // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STDMETHODIMP CAgent::get_NumberOfIncomingCalls(long * pulCalls) { HRESULT hr = S_OK; LOG((TL_TRACE, "NumberOfIncomingCalls - enter" )); if (!TAPIIsBadWritePtr( pulCalls, sizeof(long) ) ) { hr = CheckIfUpToDate(); if ( SUCCEEDED(hr) ) { Lock(); *pulCalls = m_dwNumberOfIncomingCalls; Unlock(); } else { LOG((TL_ERROR, "get_NumberOfIncomingCalls - Object update failed")); } } else { LOG((TL_ERROR, "get_NumberOfIncomingCalls - bad pulCalls pointer")); hr = E_POINTER; } LOG((TL_TRACE, hr, "NumberOfIncomingCalls - exit" )); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Class : CAgent // Interface : ITAgent // Method : NumberOfOutgoingCalls // // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STDMETHODIMP CAgent::get_NumberOfOutgoingCalls(long * pulCalls) { HRESULT hr = S_OK; LOG((TL_TRACE, "NumberOfOutgoingCalls - enter" )); if (!TAPIIsBadWritePtr( pulCalls, sizeof(long) ) ) { hr = CheckIfUpToDate(); if ( SUCCEEDED(hr) ) { Lock(); *pulCalls = m_dwNumberOfOutgoingCalls; Unlock(); } else { LOG((TL_ERROR, "get_NumberOfOutgoingCalls - Object update failed")); } } else { LOG((TL_ERROR, "get_NumberOfOutgoingCalls - bad pulCalls pointer")); hr = E_POINTER; } LOG((TL_TRACE, hr, "NumberOfOutgoingCalls - exit" )); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Class : CAgent // Interface : ITAgent // Method : TotalACDTalkTime // // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STDMETHODIMP CAgent::get_TotalACDTalkTime(long * pulTalkTime) { HRESULT hr = S_OK; LOG((TL_TRACE, "TotalACDTalkTime - enter" )); if (!TAPIIsBadWritePtr( pulTalkTime, sizeof(long) ) ) { hr = CheckIfUpToDate(); if ( SUCCEEDED(hr) ) { Lock(); *pulTalkTime = m_dwTotalACDTalkTime; Unlock(); } else { LOG((TL_ERROR, "get_TotalACDTalkTime - Object update failed")); } } else { LOG((TL_ERROR, "get_TotalACDTalkTime - bad pulTalkTime pointer")); hr = E_POINTER; } LOG((TL_TRACE, hr, "TotalACDTalkTime - exit" )); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Class : CAgent // Interface : ITAgent // Method : TotalACDCallTime // // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STDMETHODIMP CAgent::get_TotalACDCallTime(long * pulCallTime) { HRESULT hr = S_OK; LOG((TL_TRACE, "TotalACDCallTime - enter" )); if (!TAPIIsBadWritePtr( pulCallTime, sizeof(long) ) ) { hr = CheckIfUpToDate(); if ( SUCCEEDED(hr) ) { Lock(); *pulCallTime = m_dwTotalACDCallTime; Unlock(); } else { LOG((TL_ERROR, "get_TotalACDCallTime - Object update failed")); } } else { LOG((TL_ERROR, "get_TotalACDCallTime - bad pulCallTime pointer")); hr = E_POINTER; } LOG((TL_TRACE, hr, "TotalACDCallTime - exit" )); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Class : CAgent // Interface : ITAgent // Method : TotalWrapUpTime // // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STDMETHODIMP CAgent::get_TotalWrapUpTime(long * pulWrapUpTime) { HRESULT hr = S_OK; LOG((TL_TRACE, "TotalWrapUpTime - enter" )); if (!TAPIIsBadWritePtr( pulWrapUpTime, sizeof(long) ) ) { hr = CheckIfUpToDate(); if ( SUCCEEDED(hr) ) { Lock(); *pulWrapUpTime = m_dwTotalACDWrapUpTime; Unlock(); } else { LOG((TL_ERROR, "get_TotalWrapUpTime - Object update failed")); } } else { LOG((TL_ERROR, "get_TotalWrapUpTime - bad pulWrapUpTime pointer")); hr = E_POINTER; } LOG((TL_TRACE, hr, "TotalWrapUpTime - exit" )); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Class : CAgent // Interface : ITAgent // Method : put_PIN // // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STDMETHODIMP CAgent::put_PIN(BSTR pPIN) { HRESULT hr = S_OK; LOG((TL_TRACE, "put_PIN - enter" )); if (!IsBadStringPtrW( pPIN, -1 )) { // Pointer OK, is it empty ? if( pPIN != NULL) { // do we have an existng PIN ? if (m_szPIN != NULL) { LOG((TL_INFO, "put_PIN - Overwrite exising PIN")); ClientFree(m_szPIN); } // Alloc space for new PIN m_szPIN = (PWSTR) ClientAlloc((lstrlenW(pPIN) + 1) * sizeof (WCHAR)); if (m_szPIN != NULL) { lstrcpyW(m_szPIN, pPIN); } else { LOG((TL_ERROR, "put_PIN - ClientAlloc m_szPIN failed" )); hr = E_OUTOFMEMORY; } } else // PIN is NULL { LOG((TL_ERROR, "put_PIN - failed, PIN is NULL")); hr = E_INVALIDARG; } } else // bad BSTR pointer { LOG((TL_ERROR, "put_PIN - invalid pointer" )); return E_POINTER; } LOG((TL_TRACE, hr, "put_PIN - exit" )); return hr; } ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// // CAgentEvent //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Class : CAgentEvent // Method : FireEvent // // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ HRESULT CAgentEvent::FireEvent(CAgent* pAgent, AGENT_EVENT Event) { HRESULT hr = S_OK; CComObject * pEvent; IDispatch * pIDispatch; // // create event // hr = CComObject::CreateInstance( &pEvent ); if ( SUCCEEDED(hr) ) { // // initialize // pEvent->m_AgentEvent = Event; pEvent->m_pAgent= dynamic_cast(pAgent); pEvent->m_pAgent->AddRef(); // // get idisp interface // hr = pEvent->QueryInterface( IID_IDispatch, (void **)&pIDispatch ); if ( SUCCEEDED(hr) ) { // // get callback & fire event // CTAPI *pTapi = (pAgent->GetAgentHandler() )->GetTapi(); pTapi->Event( TE_AGENT, pIDispatch ); // release stuff // pIDispatch->Release(); } else { STATICLOG((TL_ERROR, "(Event)FireEvent - Could not get disp interface of AgentEvent object")); delete pEvent; } } else { STATICLOG((TL_ERROR, "(Event)FireEvent - Could not create AgentEvent object")); } STATICLOG((TL_TRACE, hr, "(Event)FireEvent - exit")); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Class : CAgentEvent // Method : FinalRelease // // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ void CAgentEvent::FinalRelease() { m_pAgent->Release(); } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Class : CAgentEvent // Interface : ITAgentEvent // Method : Agent // // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STDMETHODIMP CAgentEvent::get_Agent(ITAgent ** ppAgent) { HRESULT hr = S_OK; LOG((TL_TRACE, "(Event)Agent - enter" )); if(!TAPIIsBadWritePtr( ppAgent, sizeof(ITAgent *) ) ) { *ppAgent = m_pAgent; m_pAgent->AddRef(); } else { LOG((TL_ERROR, "(Event)Agent - bad ppAgent pointer")); hr = E_POINTER; } LOG((TL_TRACE, hr, "(Event)Agent - exit")); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Class : CAgentEvent // Interface : ITAgentEvent // Method : Event // // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STDMETHODIMP CAgentEvent::get_Event(AGENT_EVENT * pEvent) { HRESULT hr = S_OK; LOG((TL_TRACE, "Event - enter" )); if(!TAPIIsBadWritePtr( pEvent, sizeof(AGENT_EVENT) ) ) { *pEvent = m_AgentEvent; } else { LOG((TL_ERROR, "Event - bad pEvent pointer")); hr = E_POINTER; } LOG((TL_TRACE, hr, "Event - exit")); return hr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Function : MapAgentStateFrom3to2 // // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DWORD MapAgentStateFrom3to2(AGENT_STATE tapi3State) { DWORD tapi2State = 0; switch(tapi3State) { case AS_NOT_READY: tapi2State = LINEAGENTSTATEEX_NOTREADY; break; case AS_READY: tapi2State = LINEAGENTSTATEEX_READY; break; case AS_BUSY_ACD: tapi2State = LINEAGENTSTATEEX_BUSYACD; break; case AS_BUSY_INCOMING: tapi2State = LINEAGENTSTATEEX_BUSYINCOMING; break; case AS_BUSY_OUTGOING: tapi2State = LINEAGENTSTATEEX_BUSYOUTGOING; break; case AS_UNKNOWN: tapi2State = LINEAGENTSTATEEX_UNKNOWN; break; default: break; } return tapi2State; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Function : MapAgentStateFrom2to3 // // // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ HRESULT MapAgentStateFrom2to3(DWORD tapi2State, AGENT_STATE *tapi3State) { HRESULT hr = S_OK; if (tapi2State & LINEAGENTSTATEEX_NOTREADY) { *tapi3State = AS_NOT_READY; } else if (tapi2State & LINEAGENTSTATEEX_READY) { *tapi3State = AS_READY; } else if (tapi2State & LINEAGENTSTATEEX_BUSYACD) { *tapi3State = AS_BUSY_ACD; } else if (tapi2State & LINEAGENTSTATEEX_BUSYINCOMING) { *tapi3State = AS_BUSY_INCOMING; } else if (tapi2State & LINEAGENTSTATEEX_BUSYOUTGOING) { *tapi3State = AS_BUSY_OUTGOING; } else if (tapi2State & LINEAGENTSTATEEX_UNKNOWN) { *tapi3State = AS_UNKNOWN; } else { *tapi3State = AS_UNKNOWN; // default hr = E_INVALIDARG; } return hr; }