| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 |
- #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);
- }
|