#include "StdAfx.h" #include "AgentMsgProc.h" #include "NetCtrlInterface.h" #include "PduEntity.h" #include "AgentClient.h" #include "AgentEventManager.h" #include "AgentLog.h" #include "TFBCtrl.h" #include "AgentOp.h" #include "PduDataFormat.h" #include "TFBTimer.h" CAgentMsgProc::CAgentMsgProc(CAgentClient* pClient) { m_pAgentClient = pClient; // 注册PDU命令到达事件处理 CInterfaceWindow::getCommInstance()->RegistPduCommProc(this, TRUE); } CAgentMsgProc::~CAgentMsgProc(void) { // PDU命令到达事件反注册 CInterfaceWindow::getCommInstance()->RegistPduCommProc(this, FALSE); } /***************************************************************** **【函数名称】 OnRecvCommand **【函数功能】 PDU命令到达事件处理 **【参数】 **【返回值】 void ****************************************************************/ void CAgentMsgProc::OnRecvCommand(CPduEntity* a_pPduEntity) { if(a_pPduEntity->GetIsExecReturn()) { __ProcCmdReturn(a_pPduEntity); // 处理ACD的返回命令 } else { __ProcCmdAcd(a_pPduEntity); // 处理ACD主动发来的命令 } } /***************************************************************** **【函数名称】 __ProcCmdReturn **【函数功能】 PDU返回命令处理 **【参数】 **【返回值】 void ****************************************************************/ void CAgentMsgProc::__ProcCmdReturn(CPduEntity* a_pPduEntity) { switch(a_pPduEntity->GetCmdType()) { case PDU_CMD_AGENT_LOGIN: // 签入 { if(a_pPduEntity->GetDataBool(0)) { // 签入成功 m_pAgentClient->GetEventManager()->Fire_Evt_LogIn( true, 0 ); m_pAgentClient->GetAgentLog()->Log( "ACD返回执行结果:PDU_CMD_AGENT_LOGIN 成功" ); } else { int nErrCode = (int)a_pPduEntity->GetDataUInt(6); m_pAgentClient->SetErrorCode(nErrCode); m_pAgentClient->GetEventManager()->Fire_Evt_LogIn( false, nErrCode); m_pAgentClient->GetAgentLog()->Log( "ACD返回执行结果:PDU_CMD_AGENT_LOGIN 失败" ); // 关闭Socket连接 if(!m_pAgentClient->CloseClient()) { m_pAgentClient->SetErrorCode( ERR_CLOSE_SOCKET ); m_pAgentClient->GetEventManager()->Fire_Evt_SysError( ERR_CLOSE_SOCKET ); return; } // 设置连接状态 m_pAgentClient->m_nAgentLinkState = PDU_LINK_STATE_DISCONNECTED; m_pAgentClient->GetEventManager()->Fire_Evt_AgentLinkStateChanged(PDU_LINK_STATE_DISCONNECTED); } } break; case PDU_CMD_AGENT_SETSTATE: // 设置坐席状态 { if(a_pPduEntity->GetDataUInt(3) == AGENT_STATE_FREE) { // 示闲成功 if(a_pPduEntity->GetDataBool(0)) { m_pAgentClient->GetEventManager()->Fire_Evt_SayFree( true, 0 ); m_pAgentClient->GetAgentLog()->Log( "ACD返回执行结果:PDU_CMD_AGENT_SETSTATE->AGENT_STATE_FREE 成功" ); } else { m_pAgentClient->SetErrorCode( ERR_SAY_FREE ); m_pAgentClient->GetEventManager()->Fire_Evt_SayFree( false, ERR_SAY_FREE ); m_pAgentClient->GetAgentLog()->Log( "ACD返回执行结果:PDU_CMD_AGENT_SETSTATE->AGENT_STATE_FREE 失败" ); } } else if(a_pPduEntity->GetDataUInt(3) == AGENT_STATE_REPOSE) { // 示忙成功 if(a_pPduEntity->GetDataBool(0)) { m_pAgentClient->GetEventManager()->Fire_Evt_SayBusy( true, 0 ); m_pAgentClient->GetAgentLog()->Log( "ACD返回执行结果:PDU_CMD_AGENT_SETSTATE->AGENT_STATE_FREE 成功" ); } else { m_pAgentClient->SetErrorCode( ERR_SAY_BUSY ); m_pAgentClient->GetEventManager()->Fire_Evt_SayBusy( false, ERR_SAY_BUSY ); m_pAgentClient->GetAgentLog()->Log( "ACD返回执行结果:PDU_CMD_AGENT_SETSTATE->Fire_Evt_SayBusy 失败" ); } } } break; case PDU_CMD_AGENT_RESET: // 重置 { if(a_pPduEntity->GetDataBool(0)) { m_pAgentClient->GetEventManager()->Fire_Evt_ResetAgent( true, 0 ); m_pAgentClient->GetAgentLog()->Log( "ACD返回执行结果:PDU_CMD_AGENT_RESET 成功" ); } else { m_pAgentClient->SetErrorCode( ERR_RESET_AGENT ); m_pAgentClient->GetEventManager()->Fire_Evt_ResetAgent( false, ERR_RESET_AGENT ); m_pAgentClient->GetAgentLog()->Log( "ACD返回执行结果:PDU_CMD_AGENT_RESET 失败" ); } } break; case PDU_CMD_AGENT_MAKECALL: // 外呼 { if(a_pPduEntity->GetDataBool(0)) { m_pAgentClient->GetEventManager()->Fire_Evt_MakeCall( true, a_pPduEntity->GetDataUInt(6), m_pAgentClient->m_sOuterNumber, m_pAgentClient->m_nCallID, 0); m_pAgentClient->GetAgentLog()->Log( "ACD返回执行结果:PDU_CMD_AGENT_MAKECALL 成功" ); } else { m_pAgentClient->SetErrorCode( ERR_MAKE_CALL ); m_pAgentClient->GetEventManager()->Fire_Evt_MakeCall( false, a_pPduEntity->GetDataUInt(6), m_pAgentClient->m_sOuterNumber, m_pAgentClient->m_nCallID, ERR_MAKE_CALL); m_pAgentClient->GetAgentLog()->Log( "ACD返回执行结果:PDU_CMD_AGENT_MAKECALL 失败" ); } } break; case PDU_CMD_AGENT_ANSWER: // 应答 { if(a_pPduEntity->GetDataBool(0)) { m_pAgentClient->GetEventManager()->Fire_Evt_AnswerCall( true, m_pAgentClient->m_nCallID, 0); m_pAgentClient->GetAgentLog()->Log( "ACD返回执行结果:PDU_CMD_AGENT_ANSWER 成功" ); } else { m_pAgentClient->SetErrorCode( ERR_ANSWER_CALL ); m_pAgentClient->GetEventManager()->Fire_Evt_AnswerCall( false, m_pAgentClient->m_nCallID, ERR_ANSWER_CALL); m_pAgentClient->GetAgentLog()->Log( "ACD返回执行结果:PDU_CMD_AGENT_ANSWER 失败" ); } } break; case PDU_CMD_AGENT_HANGUP: // 挂机 { if(a_pPduEntity->GetDataBool(0)) { m_pAgentClient->GetEventManager()->Fire_Evt_DropCall( true, 1, m_pAgentClient->m_nCallID, 0); m_pAgentClient->GetAgentLog()->Log( "ACD返回执行结果:PDU_CMD_AGENT_HANGUP 成功" ); } else { m_pAgentClient->SetErrorCode( ERR_DROP_CALL ); m_pAgentClient->GetEventManager()->Fire_Evt_DropCall( false, 1, m_pAgentClient->m_nCallID, ERR_DROP_CALL); m_pAgentClient->GetAgentLog()->Log( "ACD返回执行结果:PDU_CMD_AGENT_HANGUP 失败" ); } } break; case PDU_CMD_AGENT_CANCEL: // 取消操作 { if(a_pPduEntity->GetDataBool(0)) { m_pAgentClient->GetEventManager()->Fire_Evt_Cancel( true, m_pAgentClient->m_nCallID, 0); m_pAgentClient->GetAgentLog()->Log( "ACD返回执行结果:PDU_CMD_AGENT_CANCEL 成功" ); } else { m_pAgentClient->SetErrorCode( ERR_CANCEL ); m_pAgentClient->GetEventManager()->Fire_Evt_Cancel( false, m_pAgentClient->m_nCallID, ERR_DROP_CALL); m_pAgentClient->GetAgentLog()->Log( "ACD返回执行结果:PDU_CMD_AGENT_CANCEL 失败" ); } } break; case PDU_CMD_AGENT_HOLD: // 保持 { if(a_pPduEntity->GetDataBool(0)) { m_pAgentClient->GetEventManager()->Fire_Evt_Hold( true, m_pAgentClient->m_nCallID, 0); m_pAgentClient->GetAgentLog()->Log( "ACD返回执行结果:PDU_CMD_AGENT_HOLD 成功" ); } else { m_pAgentClient->SetErrorCode( ERR_HOLD ); m_pAgentClient->GetEventManager()->Fire_Evt_Hold( false, m_pAgentClient->m_nCallID, ERR_HOLD); m_pAgentClient->GetAgentLog()->Log( "ACD返回执行结果:PDU_CMD_AGENT_HOLD 失败" ); } } break; case PDU_CMD_AGENT_TAKEBACK: // 接回 { if(a_pPduEntity->GetDataBool(0)) { m_pAgentClient->GetEventManager()->Fire_Evt_UnHold( true, m_pAgentClient->m_nCallID, 0); m_pAgentClient->GetAgentLog()->Log( "ACD返回执行结果:PDU_CMD_AGENT_TAKEBACK 成功" ); } else { m_pAgentClient->SetErrorCode( ERR_UN_HOLD ); m_pAgentClient->GetEventManager()->Fire_Evt_UnHold( false, m_pAgentClient->m_nCallID, ERR_UN_HOLD); m_pAgentClient->GetAgentLog()->Log( "ACD返回执行结果:PDU_CMD_AGENT_TAKEBACK 失败" ); } } break; case PDU_CMD_AGENT_TRANSTALK: // 转移 { if(a_pPduEntity->GetDataBool(0)) { m_pAgentClient->GetEventManager()->Fire_Evt_Transfer( true, m_pAgentClient->m_nCallID, 0); m_pAgentClient->GetAgentLog()->Log( "ACD返回执行结果:PDU_CMD_AGENT_TRANSTALK 成功" ); } else { m_pAgentClient->SetErrorCode( ERR_TRANSFER ); m_pAgentClient->GetEventManager()->Fire_Evt_Transfer( false, m_pAgentClient->m_nCallID, ERR_TRANSFER); m_pAgentClient->GetAgentLog()->Log( "ACD返回执行结果:PDU_CMD_AGENT_TRANSTALK 失败" ); } } break; case PDU_CMD_AGENT_THREETALK: // 三方 { if(a_pPduEntity->GetDataBool(0)) { m_pAgentClient->GetEventManager()->Fire_Evt_ThreeTalk( true, m_pAgentClient->m_nCallID, 0); m_pAgentClient->GetAgentLog()->Log( "ACD返回执行结果:PDU_CMD_AGENT_THREETALK 成功" ); } else { m_pAgentClient->SetErrorCode( ERR_THREE_TALK ); m_pAgentClient->GetEventManager()->Fire_Evt_ThreeTalk( false, m_pAgentClient->m_nCallID, ERR_THREE_TALK); m_pAgentClient->GetAgentLog()->Log( "ACD返回执行结果:PDU_CMD_AGENT_THREETALK 失败" ); } } break; case PDU_CMD_AGENT_MONI_REPLACE: // 代接返回 { if(a_pPduEntity->GetDataBool(0)) { m_pAgentClient->GetEventManager()->Fire_Evt_Instead( true, m_pAgentClient->m_nCallID, 0); } else { m_pAgentClient->SetErrorCode( ERR_INSTEAD ); m_pAgentClient->GetEventManager()->Fire_Evt_Instead( false, m_pAgentClient->m_nCallID, ERR_INSTEAD); } } break; case PDU_CMD_AGENT_MONI_LISTEN: // 监听座席 { if(a_pPduEntity->GetDataBool(0)) { m_pAgentClient->GetEventManager()->Fire_Evt_ListenAgent( true, m_pAgentClient->m_nCallID, 0); } else { m_pAgentClient->SetErrorCode( ERR_LISTEN_AGENT ); m_pAgentClient->GetEventManager()->Fire_Evt_ListenAgent( false, m_pAgentClient->m_nCallID, ERR_LISTEN_AGENT); } } break; case PDU_CMD_AGENT_MONI_INSERT: // 强插座席 { if(a_pPduEntity->GetDataBool(0)) { m_pAgentClient->GetEventManager()->Fire_Evt_InsertAgent( true, m_pAgentClient->m_nCallID, 0); } else { m_pAgentClient->SetErrorCode( ERR_INSERT_AGENT ); m_pAgentClient->GetEventManager()->Fire_Evt_InsertAgent( false, m_pAgentClient->m_nCallID, ERR_INSERT_AGENT); } } break; case PDU_CMD_AGENT_MONI_INTERCEPT: // 强截座席 { if(a_pPduEntity->GetDataBool(0)) { m_pAgentClient->GetEventManager()->Fire_Evt_InterceptAgent( true, m_pAgentClient->m_nCallID, 0); } else { m_pAgentClient->SetErrorCode( ERR_INTERCEPT_AGENT ); m_pAgentClient->GetEventManager()->Fire_Evt_InterceptAgent( false, m_pAgentClient->m_nCallID, ERR_INTERCEPT_AGENT); } } break; case PDU_CMD_AGENT_MONI_CUT: // 强拆座席 { if(a_pPduEntity->GetDataBool(0)) { m_pAgentClient->GetEventManager()->Fire_Evt_CutAgent( true, m_pAgentClient->m_nCallID, 0); } else { m_pAgentClient->SetErrorCode( ERR_CUT_AGENT ); m_pAgentClient->GetEventManager()->Fire_Evt_CutAgent( false, m_pAgentClient->m_nCallID, ERR_CUT_AGENT); } } break; case PDU_CMD_AGENT_FAX: // 传真 { if(a_pPduEntity->GetDataBool(0)) { if(a_pPduEntity->GetDataUInt(4) == 0) m_pAgentClient->GetEventManager()->Fire_Evt_SendFax( true, m_pAgentClient->m_nCallID, 0); else m_pAgentClient->GetEventManager()->Fire_Evt_RecvFax( true, m_pAgentClient->m_nCallID, 0); } else { if(a_pPduEntity->GetDataUInt(4) == 0) { m_pAgentClient->SetErrorCode( ERR_SEND_FAX ); m_pAgentClient->GetEventManager()->Fire_Evt_SendFax( false, m_pAgentClient->m_nCallID, ERR_SEND_FAX); } else { m_pAgentClient->SetErrorCode( ERR_RECV_FAX ); m_pAgentClient->GetEventManager()->Fire_Evt_RecvFax( false, m_pAgentClient->m_nCallID, ERR_RECV_FAX); } } } break; case PDU_CMD_AGENT_TURN_TO_IVR: // 转IVR { if(a_pPduEntity->GetDataBool(0)) { m_pAgentClient->GetEventManager()->Fire_Evt_TransferToIvr( true, m_pAgentClient->m_nCallID, 0); } else { m_pAgentClient->SetErrorCode( ERR_TRANSFER_TO_IVR ); m_pAgentClient->GetEventManager()->Fire_Evt_TransferToIvr( false, m_pAgentClient->m_nCallID, ERR_TRANSFER_TO_IVR); } } break; case PDU_CMD_AGENT_MONI_FORCE_LOGOUT: // 强制签出 { if(a_pPduEntity->GetDataBool(0)) { m_pAgentClient->GetEventManager()->Fire_Evt_ForceLogOut( true, 0); } else { m_pAgentClient->SetErrorCode( ERR_FORCE_LOGOUT_AGENT ); m_pAgentClient->GetEventManager()->Fire_Evt_ForceLogOut( false, ERR_FORCE_CONTROL_AGENT); } } break; case PDU_CMD_AGENT_MONI_FORCE_STATE: // 被强制签出事件 { if(a_pPduEntity->GetDataBool(0)) { m_pAgentClient->GetEventManager()->Fire_Evt_ForceControlAgent( true, m_pAgentClient->m_nCallID, 0); } else { m_pAgentClient->SetErrorCode( ERR_FORCE_CONTROL_AGENT ); m_pAgentClient->GetEventManager()->Fire_Evt_ForceControlAgent( false, m_pAgentClient->m_nCallID, ERR_FORCE_CONTROL_AGENT); } } break; case PDU_CMD_AGENT_CONSULTATION_CALL: // 协商呼叫结果 { if(a_pPduEntity->GetDataBool(0)) { m_pAgentClient->GetEventManager()->Fire_Evt_Consult(true, m_pAgentClient->m_nCallID, 0); } else { m_pAgentClient->SetErrorCode(ERR_CONSULTATION_CALL); m_pAgentClient->GetEventManager()->Fire_Evt_Consult(false, m_pAgentClient->m_nCallID, ERR_CONSULTATION_CALL); } } break; case PDU_CMD_AGENT_CONFIRM_TRANSFER: // 确认转移结果 { if(a_pPduEntity->GetDataBool(0)) { m_pAgentClient->GetEventManager()->Fire_Evt_Confirm(true, m_pAgentClient->m_nCallID, 0); } else { m_pAgentClient->SetErrorCode(ERR_CONFIRM_TRANSFER); m_pAgentClient->GetEventManager()->Fire_Evt_Confirm(false, m_pAgentClient->m_nCallID, ERR_CONFIRM_TRANSFER); } } break; case PDU_CMD_AGENT_MUTE: // 静音 { if(a_pPduEntity->GetDataUInt(3) == 0) // 开始静音 { if(a_pPduEntity->GetDataBool(0)) { m_pAgentClient->GetEventManager()->Fire_Evt_BeginMute( true, m_pAgentClient->m_nCallID, 0); m_pAgentClient->GetAgentLog()->Log( "ACD返回执行结果:PDU_CMD_AGENT_MUTE 成功" ); } else { m_pAgentClient->SetErrorCode( ERR_HOLD ); m_pAgentClient->GetEventManager()->Fire_Evt_BeginMute( false, m_pAgentClient->m_nCallID, ERR_BEGIN_MUTE); m_pAgentClient->GetAgentLog()->Log( "ACD返回执行结果:PDU_CMD_AGENT_MUTE 失败" ); } } else { if(a_pPduEntity->GetDataBool(0)) { m_pAgentClient->GetEventManager()->Fire_Evt_EndMute( true, m_pAgentClient->m_nCallID, 0); m_pAgentClient->GetAgentLog()->Log( "ACD返回执行结果:PDU_CMD_AGENT_MUTE 成功" ); } else { m_pAgentClient->SetErrorCode( ERR_HOLD ); m_pAgentClient->GetEventManager()->Fire_Evt_EndMute( false, m_pAgentClient->m_nCallID, ERR_END_MUTE); m_pAgentClient->GetAgentLog()->Log( "ACD返回执行结果:PDU_CMD_AGENT_MUTE 失败" ); } } } break; default: break; } } /***************************************************************** **【函数名称】 __ProcCmdAcd **【函数功能】 ACD主动发送命令处理 **【参数】 **【返回值】 void ****************************************************************/ void CAgentMsgProc::__ProcCmdAcd(CPduEntity* a_pPduEntity) { ASSERT(a_pPduEntity != NULL); switch(a_pPduEntity->GetCmdType()) { case PDU_CMD_ACD_AGENT_STATE: // 坐席状态 { __ProcAgentStateChanged(a_pPduEntity); } break; case PDU_CMD_CTI_LINE_STATE: // 线路状态 { __ProcLineStateChanged(a_pPduEntity); } break; case PDU_CMD_CTI_DEV_CALL: // 分机物理外呼 { m_pAgentClient->GetEventManager()->Fire_Evt_MakeCall(a_pPduEntity->GetDataBool(0), a_pPduEntity->GetDataUInt(5), a_pPduEntity->GetDataString(4), a_pPduEntity->GetDataULong(3), 0); } break; case PDU_CMD_ACD_CALL_NUM: // 来电数量 { // 触发来电数量事件 m_pAgentClient->GetEventManager()->Fire_Evt_CallInQueue_Changed(a_pPduEntity->GetDataUInt(0)); } break; case PDU_CMD_CTI_RECORD: // 录音信息 { // 设置坐席的录音文件路径 m_pAgentClient->m_sRecordFilePath = a_pPduEntity->GetDataString(2); // 触发开始录音事件 m_pAgentClient->GetEventManager()->Fire_Evt_RecordInform(a_pPduEntity->GetDataString(2), m_pAgentClient->m_nCallID); } break; case PDU_CMD_ACD_SUBMIT_DATA: // 订阅事件变化通知 { m_pAgentClient->GetEventManager()->Fire_Evt_SubDataChanged(a_pPduEntity->GetDataUInt(2), a_pPduEntity->GetDataUInt(0), a_pPduEntity->GetDataUInt(1), a_pPduEntity->GetDataString(3)); } break; case PDU_CMD_AGENT_MONI_FORCE_LOGOUT: // 被强制签出 { __ProcForceLogOut(); m_pAgentClient->GetEventManager()->Fire_Evt_LogOutByForce(a_pPduEntity->GetDataUInt(2), a_pPduEntity->GetDataString(5)); } break; default: break; } } /***************************************************************** **【函数名称】 __ProcForceLogOut **【函数功能】 处理坐席被强制签出 **【参数】 **【返回值】 void ****************************************************************/ void CAgentMsgProc::__ProcForceLogOut() { // 关闭Socket连接 if(!m_pAgentClient->CloseClient()) { m_pAgentClient->SetErrorCode( ERR_CLOSE_SOCKET ); m_pAgentClient->GetEventManager()->Fire_Evt_SysError( ERR_CLOSE_SOCKET ); m_pAgentClient->GetEventManager()->Fire_Evt_LogOut(false, ERR_CLOSE_SOCKET); return; } // 签出成功 m_pAgentClient->GetEventManager()->Fire_Evt_LogOut( true, 0 ); m_pAgentClient->GetAgentLog()->Log( "ACD返回执行结果:Cmd_Agent_Acd_LogOut 成功" ); // 坐席信息反初始化 m_pAgentClient->m_nAgentState = AGENT_STATE_LOGOUT; m_pAgentClient->GetEventManager()->Fire_Evt_AgentStateChanged( m_pAgentClient->m_nAgentState ); m_pAgentClient->m_nAgentLineState = INNER_STATE_DISABLED; m_pAgentClient->GetEventManager()->Fire_Evt_AgentLineStateChanged( m_pAgentClient->m_nAgentLineState ); // 触发连接断开事件 m_pAgentClient->m_nAgentLinkState = PDU_LINK_STATE_DISCONNECTED; m_pAgentClient->GetEventManager()->Fire_Evt_AgentLinkStateChanged(PDU_LINK_STATE_DISCONNECTED); } /***************************************************************** **【函数名称】 __ProcAgentStateChanged **【函数功能】 处理坐席状态变化 **【参数】 **【返回值】 void ****************************************************************/ void CAgentMsgProc::__ProcAgentStateChanged(CPduEntity* a_pPduEntity) { // 判断是否是当前坐席 if( a_pPduEntity->GetDataUInt(1) == m_pAgentClient->m_nAgentNumber ) { // 分析坐席状态 __AnalyzeAgentState(a_pPduEntity); // 保存信息 m_pAgentClient->m_nAgentState = a_pPduEntity->GetDataUInt(2); m_pAgentClient->GetEventManager()->Fire_Evt_AgentStateChanged( m_pAgentClient->m_nAgentState ); } } /***************************************************************** **【函数名称】 __ProcLineStateChanged **【函数功能】 处理线路状态变化 **【参数】 **【返回值】 void ****************************************************************/ void CAgentMsgProc::__ProcLineStateChanged(CPduEntity* a_pPduEntity) { // 判断是否是当前坐席 if(a_pPduEntity->GetDataUInt(0) == m_pAgentClient->m_nAgentExtension ) { // 分析线路状态 __AnalyzeLineState(a_pPduEntity); // 保存信息 m_pAgentClient->m_nCallID = a_pPduEntity->GetDataULong(2); // 设置坐席CallID m_pAgentClient->m_nAgentLineState = a_pPduEntity->GetDataUInt(1); // 保存线路状态 // 触发线路状态变化事件 m_pAgentClient->GetEventManager()->Fire_Evt_AgentLineStateChanged(a_pPduEntity->GetDataUInt(1)); } } /***************************************************************** **【函数名称】 __AnalyzeAgentState **【函数功能】 分析坐席状态 **【参数】 **【返回值】 void ****************************************************************/ void CAgentMsgProc::__AnalyzeAgentState(CPduEntity* a_pPduEntity) { return; } /***************************************************************** **【函数名称】 __AnalyzeLineState **【函数功能】 分析线路状态 **【参数】 **【返回值】 void ****************************************************************/ void CAgentMsgProc::__AnalyzeLineState(CPduEntity* a_pPduEntity) { switch(a_pPduEntity->GetDataUInt(1)) { case INNER_STATE_FREE: { // CallId不为0时线路空闲判定为挂机 if(m_pAgentClient->m_nCallID != 0) { // 触发线路的挂机事件 m_pAgentClient->GetEventManager()->Fire_Evt_Line_HangUp(1, a_pPduEntity->GetDataULong(2)); // 清空外部号码 m_pAgentClient->m_sOuterNumber.Empty(); // 清空随路数据 memset(m_pAgentClient->m_sAssoData, 0, MAX_DATA_BUF_LEN); } // 记录到日志 m_pAgentClient->GetAgentLog()->Log( "Acd设置座席的线路状态为:INNER_STATE_FREE" ); m_pAgentClient->GetAgentLog()->Log( "线路空闲" ); } break; case INNER_STATE_TALKING: { // 通话中 m_pAgentClient->GetEventManager()->Fire_Evt_Line_Talk(a_pPduEntity->GetDataULong(2)); // 监听、强插在通话时发送外部号码信息 if(a_pPduEntity->GetDataUInt(10) == PDU_CMD_AGENT_MONI_LISTEN || a_pPduEntity->GetDataUInt(10) == PDU_CMD_AGENT_MONI_INSERT) { m_pAgentClient->GetEventManager()->Fire_Evt_Line_Talk(a_pPduEntity->GetDataULong(2),a_pPduEntity->GetDataString(5)); } else if (a_pPduEntity->GetDataUInt(10) == PDU_CMD_AGENT_MONI_REPLACE || a_pPduEntity->GetDataUInt(10) == PDU_CMD_AGENT_MONI_INTERCEPT) { m_pAgentClient->GetEventManager()->Fire_Evt_Line_Talk(a_pPduEntity->GetDataULong(2),a_pPduEntity->GetDataString(4)); } } break; case INNER_STATE_ALERTING: { // 保存外部号码 m_pAgentClient->m_sOuterNumber = a_pPduEntity->GetDataString(4); lstrcpy(m_pAgentClient->m_sAssoData, a_pPduEntity->GetDataString(6)); // 保存随路数据 // 触发来电振铃事件 m_pAgentClient->GetEventManager()->Fire_Evt_Line_Offering(m_pAgentClient->m_sOuterNumber, a_pPduEntity->GetDataUInt(7), a_pPduEntity->GetDataULong(2), a_pPduEntity->GetDataUInt(8)); // 看是否自动应答 if(m_pAgentClient->m_bAutoAnswer) { m_pAgentClient->GetAgentTimer()->SetTimerAnswer(1); } } break; case INNER_STATE_RING_BACK: { // 保存外部号码 m_pAgentClient->m_sOuterNumber = a_pPduEntity->GetDataString(5); // 触发呼出振铃事件 m_pAgentClient->GetEventManager()->Fire_Evt_Line_RingBack(m_pAgentClient->m_sOuterNumber, a_pPduEntity->GetDataULong(2)); } default: break; } // end switch }