#include "StdAfx.h" #include "NetworkAcd.h" #include "AcdCore.h" #include "Config.h" #include "./ACD.h" SINGLETON_IMPLEMENT(CNetworkAcd) CNetworkAcd::CNetworkAcd(void) : m_CtiDevID(0), m_IsCtiConnected(false) { } CNetworkAcd::~CNetworkAcd(void) { } /***************************************************************** **【函数名称】 OnLinkStateChanged **【函数功能】 PDU连接状态变化事件处理(重载函数) **【参数】 **【返回值】 ****************************************************************/ void CNetworkAcd::OnLinkStateChanged( const PduLinkContent& linkContent ) { CString Msg; LOG_LEVEL Level = LOG_LEVEL_NORMAL; switch(linkContent.nLinkState) { case PDU_LINK_STATE_SUCCESSED: // 请求连接成功 Msg.Format(_T("{Net}: Far End[IP = %s, Port = %d], Hint = 网络连接成功..."), linkContent.szFarIp, linkContent.nFarPort); break; case PDU_LINK_STATE_FAILED: // 请求连接失败 Msg.Format(_T("{Net}: Far End[IP = %s, Port = %d], Hint = 网络连接失败..."), linkContent.szFarIp, linkContent.nFarPort); Level = LOG_LEVEL_WARNING; break; case PDU_LINK_STATE_ACCEPTED: // 已接受对端连接 Msg.Format(_T("{Net}: Far End[IP = %s, Port = %d], Hint = 已接受远端网络连接..."), linkContent.szFarIp, linkContent.nFarPort); break; case PDU_LINK_STATE_DISCONNECTED: // 连接已断开 { Msg.Format(_T("{Net}: Far End[IP = %s, Port = %d], Hint = 网络连接已断开..."), linkContent.szFarIp, linkContent.nFarPort); if(linkContent.nFarType == PDU_DEV_TYPE_CTI) m_IsCtiConnected = false; CAcdCore::GetInstance().onNetLinkDown(linkContent); // 后续处理 } break; case PDU_LINK_STATE_REG_OK: // 注册成功 { Msg.Format(_T("{Net}: Far End[Type = %d, ID = %d, IP = %s, Port = %d], Hint = 网络连接注册成功..."), linkContent.nFarType, linkContent.nFarId, linkContent.szFarIp, linkContent.nFarPort); if(linkContent.nFarType == PDU_DEV_TYPE_CTI) { m_IsCtiConnected = true; m_CtiDevID = linkContent.nFarId; } } break; case PDU_LINK_STATE_REG_FAILED: // 注册失败 Msg.Format(_T("{Net}: Far End[IP = %s, Port = %d], Hint = 网络连接注册失败, 通讯禁止..."), linkContent.szFarIp, linkContent.nFarPort); Level = LOG_LEVEL_WARNING; break; default: Msg.Format(_T("{Net}: Far End[Type = %d, ID = %d, IP = %s, Port = %d]"), linkContent.nFarType, linkContent.nFarId, linkContent.szFarIp, linkContent.nFarPort); break; } // end switch ILogger::getInstance().log(LOG_CLASS_SOCKET, Level, "%s", Msg); } /***************************************************************** **【函数名称】 OnRecvCommand **【函数功能】 接收具体命令并进行处理 **【参数】 **【返回值】 ****************************************************************/ void CNetworkAcd::OnRecvCommand( CPduEntity* a_pPduEntity ) { PDU_CMD_TYPE Type = a_pPduEntity->GetCmdType(); // 心跳包不处理 if(Type == PDU_CMD_LISTEN) return; ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_NORMAL, "CNetworkAcd,PduCmdType=%d", a_pPduEntity->GetCmdType()); CAcdCore::GetInstance().onRecvCommand(a_pPduEntity); } /***************************************************************** **【函数名称】 init **【函数功能】 初始化 **【参数】 **【返回值】 ****************************************************************/ bool CNetworkAcd::init( void ) { // 初始化命令配置 #ifdef _DEBUG CPduDataFormat::getInstance()->Load("../NetLib/PDUFormat.ini"); #else CPduDataFormat::getInstance()->Load("./PDUFormat.ini"); #endif // 注册事件响应接口 CInterfaceWindow::getIocpLinkInstance()->RegistPduLinkProc(this, TRUE); CInterfaceWindow::getIocpCommInstance()->RegistPduCommProc(this, TRUE); // 连接到CTI CString Ip = CConfig::ctiIp(); int Port = CConfig::ctiPort(); // 创建SOCKET SERVER int ListenPort = CConfig::listenPort(); if(!CInterfaceWindow::getIocpLinkInstance()->CreatePduServer(ListenPort, PDU_DEV_TYPE_ACD, 0)) { ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_ERROR, _T("{Net}: 创建网络服务端失败, ListenPort = %d"), ListenPort); return false; } if(!CInterfaceWindow::getIocpLinkInstance()->CreatePduClient(Ip, Port, PDU_DEV_TYPE_ACD, 0, PDU_DEV_TYPE_CTI, 0, true)) { ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_ERROR, _T("{Net}: 连接CTI服务器[%s:%d]失败, 请检查网络配置是否正常!"), Ip, Port); return false; } // end if ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_NORMAL, _T("{Net}: 创建网络服务端成功, ListenPort = %d"), ListenPort); return true; } /***************************************************************** **【函数名称】 release **【函数功能】 连接释放 **【参数】 **【返回值】 ****************************************************************/ void CNetworkAcd::release( void ) { CInterfaceWindow::getIocpLinkInstance()->StopAll(); } /***************************************************************** **【函数名称】 send2Cti **【函数功能】 发送PDU到CTI **【参数】 **【返回值】 ****************************************************************/ bool CNetworkAcd::send2Cti( CPduEntity* a_pPduEntity ) { if(!m_IsCtiConnected) return false; CSingleLock Lock(&m_Lock4CTi, TRUE); return CInterfaceWindow::getIocpCommInstance()->Send(a_pPduEntity, PDU_DEV_TYPE_CTI, m_CtiDevID) == TRUE; } /***************************************************************** **【函数名称】 send2Agent **【函数功能】 发送PDU到Agent **【参数】 **【返回值】 ****************************************************************/ bool CNetworkAcd::send2Agent( int a_AgentId, CPduEntity* a_pPduEntity ) { return CInterfaceWindow::getIocpCommInstance()->Send(a_pPduEntity, PDU_DEV_TYPE_AGENT, a_AgentId) == TRUE; } /***************************************************************** **【函数名称】 getAgentLinkInfo **【函数功能】 获取Agent连接信息 **【参数】 **【返回值】 ****************************************************************/ bool CNetworkAcd::getAgentLinkInfo( int a_AgentId, CString& a_AgentIp, int& a_AgentPort ) { return CInterfaceWindow::getIocpLinkInstance()->GetLinkInfo(a_AgentIp, a_AgentPort, PDU_DEV_TYPE_AGENT, a_AgentId) == TRUE; } /***************************************************************** **【函数名称】 shutDownAgentLink **【函数功能】 关闭Agent连接 **【参数】 **【返回值】 ****************************************************************/ bool CNetworkAcd::shutDownAgentLink( int a_AgentId ) { return CInterfaceWindow::getIocpLinkInstance()->ClosePduClient(PDU_DEV_TYPE_AGENT, a_AgentId) == TRUE; } /***************************************************************** **【函数名称】 getPduSource **【函数功能】 获取PDU来源 **【参数】 **【返回值】 ****************************************************************/ bool CNetworkAcd::getPduSource( CPduEntity* a_pCmd, CString& a_SourceIp ) { return CInterfaceWindow::getIocpLinkInstance()->GetPeerIp(a_SourceIp, a_pCmd) == TRUE; } bool CNetworkAcd::send2Server( CPduEntity* a_pPduEntity ) { return CInterfaceWindow::getIocpCommInstance()->Send(a_pPduEntity, PDU_DEV_TYPE_SERVER,0) == TRUE; }