MiddleWares_YiHe 郑州颐和医院随访系统中间件

NetworkIvr.cpp 4.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. #include "StdAfx.h"
  2. #include "NetworkIvr.h"
  3. #include "Config.h"
  4. #include "IvrCore.h"
  5. SINGLETON_IMPLEMENT(CNetworkIvr)
  6. CNetworkIvr::CNetworkIvr(void) : m_CtiDevID(0), m_IsCtiConnected(false)
  7. {
  8. }
  9. CNetworkIvr::~CNetworkIvr(void)
  10. {
  11. }
  12. /*****************************************************************
  13. **【函数名称】 init
  14. **【函数功能】 初始化
  15. **【参数】
  16. **【返回值】
  17. ****************************************************************/
  18. BOOL CNetworkIvr::init( void )
  19. {
  20. // 初始化命令配置
  21. #ifdef _DEBUG
  22. CPduDataFormat::getInstance()->Load("../NetLib/PDUFormat.ini"); //../NetLib/PDUFormat.ini
  23. #else
  24. CPduDataFormat::getInstance()->Load("./PDUFormat.ini");
  25. #endif
  26. // 注册事件响应接口
  27. IPduLink* pPduLink = CInterfaceWindow::getLinkInstance();
  28. IPduComm* pPduComm = CInterfaceWindow::getCommInstance();
  29. pPduLink->RegistPduLinkProc(this, TRUE);
  30. pPduComm->RegistPduCommProc(this, TRUE);
  31. CString CtiIp = CConfig::ctiIp();
  32. int CtiPort = CConfig::ctiPort();
  33. // 连接到CTI
  34. if(!pPduLink->CreatePduClient(CtiIp, CtiPort, PDU_DEV_TYPE_IVR, 0, PDU_DEV_TYPE_CTI, 0, true))
  35. {
  36. ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_ERROR, _T("{Network}: 连接CTI服务器[%s:%d]失败, 请检查网络配置是否正常"), CtiIp, CtiPort);
  37. return FALSE;
  38. } // end if
  39. return TRUE;
  40. }
  41. /*****************************************************************
  42. **【函数名称】 release
  43. **【函数功能】 连接释放
  44. **【参数】
  45. **【返回值】
  46. ****************************************************************/
  47. void CNetworkIvr::release( void )
  48. {
  49. CInterfaceWindow::getLinkInstance()->StopAll();
  50. }
  51. /*****************************************************************
  52. **【函数名称】 Send
  53. **【函数功能】 发送消息
  54. **【参数】 设备类型,命令内容
  55. **【返回值】
  56. ****************************************************************/
  57. BOOL CNetworkIvr::send( CPduEntity& a_PduEntity )
  58. {
  59. if(!m_IsCtiConnected)
  60. return false;
  61. // 判断是返回消息还是主动给CTI的消息
  62. IPduComm* pComm = CInterfaceWindow::getCommInstance();
  63. if(a_PduEntity.GetIsExecReturn())
  64. return pComm->Send(&a_PduEntity, a_PduEntity.GetLocalDevType(), a_PduEntity.GetLocalDevId());
  65. return pComm->Send(&a_PduEntity, PDU_DEV_TYPE_CTI, m_CtiDevID);
  66. }
  67. /*****************************************************************
  68. **【函数名称】 OnLinkStateChanged
  69. **【函数功能】 连接状态变化事件
  70. **【参数】 linkContent 连接信息
  71. **【返回值】
  72. ****************************************************************/
  73. void CNetworkIvr::OnLinkStateChanged( const PduLinkContent& linkContent )
  74. {
  75. CString Msg;
  76. LOG_LEVEL Level = LOG_LEVEL_NORMAL;
  77. switch(linkContent.nLinkState)
  78. {
  79. case PDU_LINK_STATE_SUCCESSED: // 请求连接成功
  80. Msg.Format(_T("Far End[Ip = %s, Port = %d], Hint = 网络连接成功..."),
  81. linkContent.szFarIp,
  82. linkContent.nFarPort);
  83. break;
  84. case PDU_LINK_STATE_FAILED: // 请求连接失败
  85. Msg.Format(_T("Far End[Ip = %s, Port = %d], Hint = 网络连接失败..."),
  86. linkContent.szFarIp,
  87. linkContent.nFarPort);
  88. Level = LOG_LEVEL_ERROR;
  89. break;
  90. case PDU_LINK_STATE_DISCONNECTED: // 连接已断开
  91. {
  92. Msg.Format(_T("Far End[Ip = %s, Port = %d], Hint = 网络连接已断开..."),
  93. linkContent.szFarIp,
  94. linkContent.nFarPort);
  95. m_IsCtiConnected = false;
  96. CIvrCore::GetInstance().onNetLinkUpdated(false);
  97. Level = LOG_LEVEL_ERROR;
  98. }
  99. break;
  100. case PDU_LINK_STATE_REG_OK: // 注册成功
  101. {
  102. Msg.Format(_T("Far End[Type = %d, Id = %d, Ip = %s, Port = %d], Hint = 网络连接注册成功..."),
  103. linkContent.nFarType,
  104. linkContent.nFarId,
  105. linkContent.szFarIp,
  106. linkContent.nFarPort);
  107. if (linkContent.nFarType == PDU_DEV_TYPE_CTI)
  108. {
  109. m_IsCtiConnected = true;
  110. m_CtiDevID = linkContent.nFarId;
  111. CIvrCore::GetInstance().onNetLinkUpdated(true);
  112. }
  113. }
  114. break;
  115. case PDU_LINK_STATE_REG_FAILED: // 注册失败
  116. Msg.Format(_T("Far End[Ip = %s, Port = %d], Hint = 网络连接注册失败, 通讯禁止..."),
  117. linkContent.szFarIp,
  118. linkContent.nFarPort);
  119. Level = LOG_LEVEL_ERROR;
  120. break;
  121. default:
  122. Msg.Format(_T("Far End[Type = %d, Id = %d, Ip = %s, Port = %d]"),
  123. linkContent.nFarType,
  124. linkContent.nFarId,
  125. linkContent.szFarIp,
  126. linkContent.nFarPort);
  127. break;
  128. } // end switch
  129. ILogger::getInstance().log(LOG_CLASS_SOCKET, Level, _T("%s"), Msg);
  130. }
  131. /*****************************************************************
  132. **【函数名称】 OnRecvCommand
  133. **【函数功能】 接收具体命令并进行处理
  134. **【参数】
  135. **【返回值】
  136. ****************************************************************/
  137. void CNetworkIvr::OnRecvCommand( CPduEntity* a_pPduEntity )
  138. {
  139. PDU_CMD_TYPE Type = a_pPduEntity->GetCmdType();
  140. // 注册命令返回以及心跳包不处理
  141. if(Type == PDU_CMD_REG || Type == PDU_CMD_LISTEN)
  142. return;
  143. CIvrCore::GetInstance().procPdu(a_pPduEntity);
  144. }