#include "StdAfx.h" #include "NetworkIvr.h" #include "Config.h" #include "IvrCore.h" SINGLETON_IMPLEMENT(CNetworkIvr) CNetworkIvr::CNetworkIvr(void) : m_CtiDevID(0), m_IsCtiConnected(false) { } CNetworkIvr::~CNetworkIvr(void) { } /***************************************************************** **【函数名称】 init **【函数功能】 初始化 **【参数】 **【返回值】 ****************************************************************/ BOOL CNetworkIvr::init( void ) { // 初始化命令配置 #ifdef _DEBUG CPduDataFormat::getInstance()->Load("../NetLib/PDUFormat.ini"); //../NetLib/PDUFormat.ini #else CPduDataFormat::getInstance()->Load("./PDUFormat.ini"); #endif // 注册事件响应接口 IPduLink* pPduLink = CInterfaceWindow::getLinkInstance(); IPduComm* pPduComm = CInterfaceWindow::getCommInstance(); pPduLink->RegistPduLinkProc(this, TRUE); pPduComm->RegistPduCommProc(this, TRUE); CString CtiIp = CConfig::ctiIp(); int CtiPort = CConfig::ctiPort(); // 连接到CTI if(!pPduLink->CreatePduClient(CtiIp, CtiPort, PDU_DEV_TYPE_IVR, 0, PDU_DEV_TYPE_CTI, 0, true)) { ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_ERROR, _T("{Network}: 连接CTI服务器[%s:%d]失败, 请检查网络配置是否正常"), CtiIp, CtiPort); return FALSE; } // end if return TRUE; } /***************************************************************** **【函数名称】 release **【函数功能】 连接释放 **【参数】 **【返回值】 ****************************************************************/ void CNetworkIvr::release( void ) { CInterfaceWindow::getLinkInstance()->StopAll(); } /***************************************************************** **【函数名称】 Send **【函数功能】 发送消息 **【参数】 设备类型,命令内容 **【返回值】 ****************************************************************/ BOOL CNetworkIvr::send( CPduEntity& a_PduEntity ) { if(!m_IsCtiConnected) return false; // 判断是返回消息还是主动给CTI的消息 IPduComm* pComm = CInterfaceWindow::getCommInstance(); if(a_PduEntity.GetIsExecReturn()) return pComm->Send(&a_PduEntity, a_PduEntity.GetLocalDevType(), a_PduEntity.GetLocalDevId()); return pComm->Send(&a_PduEntity, PDU_DEV_TYPE_CTI, m_CtiDevID); } /***************************************************************** **【函数名称】 OnLinkStateChanged **【函数功能】 连接状态变化事件 **【参数】 linkContent 连接信息 **【返回值】 ****************************************************************/ void CNetworkIvr::OnLinkStateChanged( const PduLinkContent& linkContent ) { CString Msg; LOG_LEVEL Level = LOG_LEVEL_NORMAL; switch(linkContent.nLinkState) { case PDU_LINK_STATE_SUCCESSED: // 请求连接成功 Msg.Format(_T("Far End[Ip = %s, Port = %d], Hint = 网络连接成功..."), linkContent.szFarIp, linkContent.nFarPort); break; case PDU_LINK_STATE_FAILED: // 请求连接失败 Msg.Format(_T("Far End[Ip = %s, Port = %d], Hint = 网络连接失败..."), linkContent.szFarIp, linkContent.nFarPort); Level = LOG_LEVEL_ERROR; break; case PDU_LINK_STATE_DISCONNECTED: // 连接已断开 { Msg.Format(_T("Far End[Ip = %s, Port = %d], Hint = 网络连接已断开..."), linkContent.szFarIp, linkContent.nFarPort); m_IsCtiConnected = false; CIvrCore::GetInstance().onNetLinkUpdated(false); Level = LOG_LEVEL_ERROR; } break; case PDU_LINK_STATE_REG_OK: // 注册成功 { Msg.Format(_T("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; CIvrCore::GetInstance().onNetLinkUpdated(true); } } break; case PDU_LINK_STATE_REG_FAILED: // 注册失败 Msg.Format(_T("Far End[Ip = %s, Port = %d], Hint = 网络连接注册失败, 通讯禁止..."), linkContent.szFarIp, linkContent.nFarPort); Level = LOG_LEVEL_ERROR; break; default: Msg.Format(_T("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, _T("%s"), Msg); } /***************************************************************** **【函数名称】 OnRecvCommand **【函数功能】 接收具体命令并进行处理 **【参数】 **【返回值】 ****************************************************************/ void CNetworkIvr::OnRecvCommand( CPduEntity* a_pPduEntity ) { PDU_CMD_TYPE Type = a_pPduEntity->GetCmdType(); // 注册命令返回以及心跳包不处理 if(Type == PDU_CMD_REG || Type == PDU_CMD_LISTEN) return; CIvrCore::GetInstance().procPdu(a_pPduEntity); }