多数据源中间件标准版1.0

Subject.cpp 4.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  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. return;
  45. } // end if
  46. } // end while
  47. }
  48. /*****************************************************************
  49. **【函数名称】 _dispatchEvent
  50. **【函数功能】 发送事件到指定座席
  51. **【参数】 pEvent: 事件内容
  52. AgentId: 目标座席工号
  53. **【返回值】
  54. ****************************************************************/
  55. void CSubject::_dispatchEvent( EventSubject* pEvent, UINT AgentId )
  56. {
  57. // ych 2018.5.18
  58. CPduEntity cmd(PDU_CMD_ACD_SUBMIT_DATA);
  59. if (pEvent->nEventType == SUBJECT_AGENT_STATUS) // 座席状态变化
  60. {
  61. CExten* pExten = CAcdCore::GetInstance().getExtenCtrl().getExten(pEvent->SubData2); // 获取指定分机
  62. if (pExten == NULL)
  63. {
  64. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_ERROR, _T("{CSubject::_dispatchEvent}: pExten指针为NULL"));
  65. return;
  66. }
  67. CHAR szAgentState[EVENT_SUBJECT_BUF_LEN] = { 0 };
  68. strcpy_s(szAgentState, pEvent->szData);
  69. sprintf_s(pEvent->szData, "%s|%d|%s|%s|%d", szAgentState, pExten->state(), pExten->GetCallerNum(), pExten->GetCalleeNum(), AgentId);
  70. cmd.SetDataUInt(0, pEvent->SubData1); // AgentID
  71. cmd.SetDataUInt(1, pEvent->SubData2); // ExtID
  72. cmd.SetDataUInt(2, pEvent->nEventType); // SUBJECT_TYPE
  73. cmd.SetDataString(3, pEvent->szData); // State
  74. cmd.SetDataUInt(5, AgentId);
  75. }
  76. else
  77. {
  78. // 通知事件到OCX端
  79. cmd.SetDataUInt(0, pEvent->SubData1);
  80. cmd.SetDataUInt(1, pEvent->SubData2);
  81. cmd.SetDataUInt(2, pEvent->nEventType);
  82. cmd.SetDataString(3, pEvent->szData);
  83. cmd.SetDataUInt(5, AgentId);
  84. }
  85. //CNetworkAcd::GetInstance().send2Agent(AgentId, &cmd);
  86. CNetworkAcd::GetInstance().send2Server(&cmd);
  87. }
  88. /*****************************************************************
  89. **【函数名称】 onEvent
  90. **【函数功能】 订阅事件响应
  91. **【参数】 pEvent: 事件内容
  92. **【返回值】
  93. ****************************************************************/
  94. void CSubject::onEvent( EventSubject* pEvent )
  95. {
  96. // 通知所有的事件观查者
  97. POSITION pos = m_HostList.GetHeadPosition();
  98. while(pos != NULL)
  99. {
  100. CSubjectHost* pHost = m_HostList.GetNext(pos);
  101. if(_isHostEvent(pEvent, pHost))
  102. _dispatchEvent(pEvent, pHost->id());
  103. } // end while
  104. }
  105. /*****************************************************************
  106. **【函数名称】 registObserver
  107. **【函数功能】 注册订阅
  108. **【参数】 AgentId: 观查者座席工号
  109. Data: 订阅参数
  110. Type: 订阅类型
  111. **【返回值】
  112. ****************************************************************/
  113. void CSubject::registObserver( UINT AgentId, int Data, SUBJECT_TYPE Type )
  114. {
  115. CSubjectHost* pHost = __getHost(AgentId);
  116. if(pHost == NULL)
  117. {
  118. pHost = new CSubjectHost(AgentId);
  119. m_HostList.AddTail(pHost);
  120. } // end if
  121. // 追加定阅数据
  122. _insertData(Data, pHost, Type);
  123. }
  124. /*****************************************************************
  125. **【函数名称】 removeObserver
  126. **【函数功能】 取消订阅
  127. **【参数】 AgentId: 观查者座席工号
  128. Data: 取消订阅参数
  129. **【返回值】
  130. ****************************************************************/
  131. void CSubject::removeObserver( UINT AgentId, int Data )
  132. {
  133. CSubjectHost* pHost = __getHost(AgentId);
  134. if(pHost != NULL)
  135. {
  136. _deleteData(Data, pHost); // 移除订阅数据
  137. if(pHost->isEmpty()) __removeHost(AgentId); // 如果已取消订阅了所有信息,移除订阅者
  138. } // end if
  139. }