中间件底层,websocket

Subject.cpp 5.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. #include "StdAfx.h"
  2. #include "Subject.h"
  3. #include "SubjectHost.h"
  4. #include "NetworkAcd.h"
  5. #include "AcdCore.h"
  6. #include "Exten.h"
  7. CSubject::CSubject(CSubjectRepository* pParent) : m_pParent(pParent)
  8. {
  9. }
  10. /*****************************************************************
  11. **【函数名称】 __getHost
  12. **【函数功能】 得到指定ID的观查者
  13. **【参数】 AgentId: 观查者座席工号
  14. **【返回值】
  15. ****************************************************************/
  16. CSubjectHost* CSubject::__getHost( UINT AgentId )
  17. {
  18. POSITION pos = m_HostList.GetHeadPosition();
  19. while(pos != NULL)
  20. {
  21. CSubjectHost* pHost = m_HostList.GetNext(pos);
  22. if(pHost->id() == AgentId)
  23. return pHost;
  24. } // end while
  25. return NULL;
  26. }
  27. /*****************************************************************
  28. **【函数名称】 __removeHost
  29. **【函数功能】 删除指定ID的观查者
  30. **【参数】 AgentId: 观查者座席工号
  31. **【返回值】
  32. ****************************************************************/
  33. void CSubject::__removeHost( UINT AgentId )
  34. {
  35. POSITION pos = m_HostList.GetHeadPosition();
  36. while(pos != NULL)
  37. {
  38. POSITION posPrev = pos;
  39. CSubjectHost* pHost = m_HostList.GetNext(pos);
  40. if(pHost->id() == AgentId)
  41. {
  42. m_HostList.RemoveAt(posPrev);
  43. delete pHost;
  44. pHost = NULL;
  45. return;
  46. } // end if
  47. } // end while
  48. }
  49. /*****************************************************************
  50. **【函数名称】 _dispatchEvent
  51. **【函数功能】 发送事件到指定座席
  52. **【参数】 pEvent: 事件内容
  53. AgentId: 目标座席工号
  54. **【返回值】
  55. ****************************************************************/
  56. void CSubject::_dispatchEvent( EventSubject* pEvent, UINT AgentId, CString szData)
  57. {
  58. // ych 2018.5.18
  59. CPduEntity cmd(PDU_CMD_ACD_SUBMIT_DATA);
  60. if (pEvent->nEventType == SUBJECT_AGENT_STATUS) // 座席状态变化
  61. {
  62. CExten* pExten = CAcdCore::GetInstance().getExtenCtrl().getExten(pEvent->SubData2); // 获取指定分机
  63. if (pExten == NULL)
  64. {
  65. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_ERROR, _T("{CSubject::_dispatchEvent}: pExten指针为NULL"));
  66. return;
  67. }
  68. szData.Format("%s|%d|%s|%s|%d", szData, pExten->state(), pExten->GetCallerNum(), pExten->GetCalleeNum(), AgentId);
  69. std::string strData;
  70. strData = szData.GetBuffer(0);
  71. szData.ReleaseBuffer();
  72. cmd.SetDataUInt(0, pEvent->SubData1); // AgentID
  73. cmd.SetDataUInt(1, pEvent->SubData2); // ExtID
  74. cmd.SetDataUInt(2, pEvent->nEventType); // SUBJECT_TYPE
  75. //cmd.SetDataString(3, pEvent->szData); // State
  76. // 2023-03-24 超过最大长度使用rcf
  77. if (strData.length() >= 511)
  78. {
  79. pushSubmitData(pEvent->SubData1,pEvent->nEventType, strData);
  80. strData = strData.substr(0, 511);
  81. }
  82. cmd.SetDataString(3, strData.c_str());
  83. cmd.SetDataUInt(5, AgentId);
  84. cmd.SetDataString(6, pEvent->szGroup);
  85. }
  86. else
  87. {
  88. // 通知事件到OCX端
  89. cmd.SetDataUInt(0, pEvent->SubData1);
  90. cmd.SetDataUInt(1, pEvent->SubData2);
  91. cmd.SetDataUInt(2, pEvent->nEventType);
  92. //cmd.SetDataString(3, pEvent->szData);
  93. std::string strData;
  94. strData = szData.GetBuffer(0);
  95. szData.ReleaseBuffer();
  96. // 2023-03-24 超过最大长度使用rcf
  97. if (strData.length() >= 511)
  98. {
  99. pushSubmitData(pEvent->SubData1, pEvent->nEventType, strData);
  100. strData = strData.substr(0, 511);
  101. }
  102. cmd.SetDataString(3, strData.c_str());
  103. cmd.SetDataUInt(5, AgentId);
  104. }
  105. //CNetworkAcd::GetInstance().send2Agent(AgentId, &cmd);
  106. CNetworkAcd::GetInstance().send2Server(&cmd);
  107. }
  108. /*****************************************************************
  109. **【函数名称】 onEvent
  110. **【函数功能】 订阅事件响应
  111. **【参数】 pEvent: 事件内容
  112. **【返回值】
  113. ****************************************************************/
  114. void CSubject::onEvent( EventSubject* pEvent, CString& szData)
  115. {
  116. // 通知所有的事件观查者
  117. POSITION pos = m_HostList.GetHeadPosition();
  118. while(pos != NULL)
  119. {
  120. CSubjectHost* pHost = m_HostList.GetNext(pos);
  121. //if(_isHostEvent(pEvent, pHost))
  122. if (pHost != NULL && _isHostEvent(pEvent, pHost)) // 2022-05-07
  123. _dispatchEvent(pEvent, pHost->id(),szData);
  124. } // end while
  125. }
  126. /*****************************************************************
  127. **【函数名称】 registObserver
  128. **【函数功能】 注册订阅
  129. **【参数】 AgentId: 观查者座席工号
  130. Data: 订阅参数
  131. Type: 订阅类型
  132. **【返回值】
  133. ****************************************************************/
  134. void CSubject::registObserver( UINT AgentId, int Data, SUBJECT_TYPE Type )
  135. {
  136. CSubjectHost* pHost = __getHost(AgentId);
  137. if(pHost == NULL)
  138. {
  139. pHost = new CSubjectHost(AgentId);
  140. m_HostList.AddTail(pHost);
  141. } // end if
  142. // 追加定阅数据
  143. _insertData(Data, pHost, Type);
  144. }
  145. /*****************************************************************
  146. **【函数名称】 removeObserver
  147. **【函数功能】 取消订阅
  148. **【参数】 AgentId: 观查者座席工号
  149. Data: 取消订阅参数
  150. **【返回值】
  151. ****************************************************************/
  152. void CSubject::removeObserver( UINT AgentId, int Data )
  153. {
  154. CSubjectHost* pHost = __getHost(AgentId);
  155. if(pHost != NULL)
  156. {
  157. _deleteData(Data, pHost); // 移除订阅数据
  158. if(pHost->isEmpty()) __removeHost(AgentId); // 如果已取消订阅了所有信息,移除订阅者
  159. } // end if
  160. }