修改三方通话功能,在发起三方通话时,先保持住主叫,然后再拉回主叫到会议

NetLinkMgr.cpp 5.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. #include "StdAfx.h"
  2. #include "NetLinkMgr.h"
  3. #include "Config.h"
  4. #include "ControlShell.h"
  5. #include "ProxyShell.h"
  6. SINGLETON_IMPLEMENT(CNetLinkMgr)
  7. CNetLinkMgr::CNetLinkMgr(void) : m_ClientCount(0)
  8. {
  9. }
  10. CNetLinkMgr::~CNetLinkMgr(void)
  11. {
  12. }
  13. /*****************************************************************
  14. **【函数名称】 onClientConnect
  15. **【函数功能】 客户端连接的处理函数
  16. **【参数】
  17. **【返回值】
  18. ****************************************************************/
  19. void CNetLinkMgr::__onClientConnect( const PduLinkContent& linkContent )
  20. {
  21. if(m_ClientCount >= NET_MAX_CLIENT)
  22. {
  23. LOGGER(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{Net}: 网络客户端已达到最大值, 将丢弃新连接, FarEnd[%s:%d]"),
  24. linkContent.szFarIp, linkContent.nFarPort);
  25. CInterfaceWindow::getIocpLinkInstance()->ClosePduClient(linkContent.nFarType, linkContent.nFarId);
  26. }
  27. else ++m_ClientCount;
  28. }
  29. /*****************************************************************
  30. **【函数名称】 __onClinetReg
  31. **【函数功能】 客户端注册的处理函数
  32. **【参数】
  33. **【返回值】
  34. ****************************************************************/
  35. void CNetLinkMgr::__onClientReg( const PduLinkContent& linkContent )
  36. {
  37. CProxyShell::GetInstance().onNetworkClientReg(linkContent.nFarType, linkContent.nFarId);
  38. }
  39. /*****************************************************************
  40. **【函数名称】 __procReqReg
  41. **【函数功能】 客户端注册的处理函数
  42. **【参数】
  43. **【返回值】
  44. ****************************************************************/
  45. void CNetLinkMgr::__procReqReg( CPduEntity* a_pReq )
  46. {
  47. bool RegResult = false;
  48. if(a_pReq->GetLocalDevType() == PDU_DEV_TYPE_SC_CLIENT)
  49. RegResult = true;
  50. // 发送注册结果
  51. a_pReq->SetToExecReturn();
  52. a_pReq->SetDataBool(0, RegResult);
  53. CInterfaceWindow::getIocpCommInstance()->Send(a_pReq, a_pReq->GetLocalDevType(), a_pReq->GetLocalDevId());
  54. }
  55. /*****************************************************************
  56. **【函数名称】 open
  57. **【函数功能】 打开网络连接
  58. **【参数】
  59. **【返回值】
  60. ****************************************************************/
  61. bool CNetLinkMgr::open( void )
  62. {
  63. // 初始化命令配置
  64. #ifdef _DEBUG
  65. CPduDataFormat::getInstance()->Load("../StableCore/ScPduFormat.ini");
  66. #else
  67. CPduDataFormat::getInstance()->Load("./ScPduFormat.ini");
  68. #endif
  69. // 注册事件响应接口
  70. CInterfaceWindow::getIocpLinkInstance()->RegistPduLinkProc(this, TRUE);
  71. CInterfaceWindow::getIocpCommInstance()->RegistPduCommProc(this, TRUE);
  72. if(!CInterfaceWindow::getIocpLinkInstance()->CreatePduServer(CConfig::listenPort(), PDU_DEV_TYPE_SC_SERVER, 0))
  73. {
  74. LOGGER(LOG_CLASS_BUSI, LOG_LEVEL_ERROR, _T("{NetLinkMgr}: 创建网络服务端失败, ListenPort = %d"), CConfig::listenPort());
  75. return false;
  76. }
  77. else
  78. {
  79. LOGGER(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{NetLinkMgr}: 创建网络服务端成功, ListenPort = %d"), CConfig::listenPort());
  80. return true;
  81. }
  82. }
  83. /*****************************************************************
  84. **【函数名称】 close
  85. **【函数功能】 关闭网络连接
  86. **【参数】
  87. **【返回值】
  88. ****************************************************************/
  89. void CNetLinkMgr::close( void )
  90. {
  91. CInterfaceWindow::getIocpLinkInstance()->StopAll();
  92. }
  93. /*****************************************************************
  94. **【函数名称】 send
  95. **【函数功能】 发送数据
  96. **【参数】
  97. **【返回值】
  98. ****************************************************************/
  99. void CNetLinkMgr::send( CPduEntity* a_pPdu )
  100. {
  101. CInterfaceWindow::getIocpCommInstance()->Send2All(a_pPdu);
  102. }
  103. /*****************************************************************
  104. **【函数名称】 send
  105. **【函数功能】 发送数据
  106. **【参数】
  107. **【返回值】
  108. ****************************************************************/
  109. bool CNetLinkMgr::send( CPduEntity* a_pPdu, PDU_DEV_TYPE a_DestType, int a_DestId )
  110. {
  111. return CInterfaceWindow::getIocpCommInstance()->Send(a_pPdu, a_DestType, a_DestId) ? true : false;
  112. }
  113. /*****************************************************************
  114. **【函数名称】 OnLinkStateChanged
  115. **【函数功能】 连接状态信息变化
  116. **【参数】
  117. **【返回值】
  118. ****************************************************************/
  119. void CNetLinkMgr::OnLinkStateChanged( const PduLinkContent& linkContent )
  120. {
  121. // 连接信息日志显示
  122. LOG_LEVEL nLogLevel = LOG_LEVEL_WARNING;
  123. CString Msg;
  124. switch(linkContent.nLinkState)
  125. {
  126. case PDU_LINK_STATE_ACCEPTED:
  127. {
  128. Msg.Format(_T("{Net}: FarEnd[%s:%d] Accepted"), linkContent.szFarIp, linkContent.nFarPort);
  129. nLogLevel = LOG_LEVEL_NORMAL;
  130. __onClientConnect(linkContent);
  131. }
  132. break;
  133. case PDU_LINK_STATE_DISCONNECTED:
  134. {
  135. Msg.Format(_T("{Net}: FarEnd[%s:%d] Disconnected"), linkContent.szFarIp, linkContent.nFarPort);
  136. nLogLevel = LOG_LEVEL_WARNING;
  137. --m_ClientCount;
  138. }
  139. break;
  140. case PDU_LINK_STATE_REG_OK:
  141. {
  142. Msg.Format(_T("{Net}: FarEnd[%s:%d] Reg OK"), linkContent.szFarIp, linkContent.nFarPort);
  143. nLogLevel = LOG_LEVEL_NORMAL;
  144. __onClientReg(linkContent);
  145. }
  146. break;
  147. case PDU_LINK_STATE_REG_FAILED:
  148. {
  149. Msg.Format(_T("{Net}: FarEnd[%s:%d] Reg Failed"), linkContent.szFarIp, linkContent.nFarPort);
  150. nLogLevel = LOG_LEVEL_WARNING;
  151. }
  152. break;
  153. default:
  154. {
  155. ASSERT(FALSE);
  156. Msg.Format(_T("{Net}: FarEnd[%s:%d] Unknown Netlink State"), linkContent.szFarIp, linkContent.nFarPort);
  157. nLogLevel = LOG_LEVEL_WARNING;
  158. }
  159. break;
  160. }
  161. // 通知日志
  162. LOGGER(LOG_CLASS_SOCKET, nLogLevel, _T("%s"), Msg);
  163. }
  164. /*****************************************************************
  165. **【函数名称】 OnRecvCommand
  166. **【函数功能】 Pdu命令处理接口
  167. **【参数】 a_pPduEntity:消息实体
  168. **【返回值】
  169. ****************************************************************/
  170. void CNetLinkMgr::OnRecvCommand( CPduEntity* a_pPduEntity )
  171. {
  172. ASSERT(a_pPduEntity != NULL);
  173. if(a_pPduEntity->GetCmdType() == PDU_CMD_LISTEN)
  174. return;
  175. if(a_pPduEntity->GetCmdType() == PDU_CMD_REG)
  176. __procReqReg(a_pPduEntity);
  177. else
  178. CProxyShell::GetInstance().onNetworkClientReq(a_pPduEntity); // 将PDU交由上层处理
  179. }