升龙物业 老版本 ocx IPO, 加密狗 转值班电话

Subject.cpp 3.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. #include "StdAfx.h"
  2. #include "Subject.h"
  3. #include "SubjectHost.h"
  4. #include "NetworkAcd.h"
  5. CSubject::CSubject(CSubjectRepository* pParent) : m_pParent(pParent)
  6. {
  7. }
  8. /*****************************************************************
  9. **【函数名称】 __getHost
  10. **【函数功能】 得到指定ID的观查者
  11. **【参数】 AgentId: 观查者座席工号
  12. **【返回值】
  13. ****************************************************************/
  14. CSubjectHost* CSubject::__getHost( UINT AgentId )
  15. {
  16. POSITION pos = m_HostList.GetHeadPosition();
  17. while(pos != NULL)
  18. {
  19. CSubjectHost* pHost = m_HostList.GetNext(pos);
  20. if(pHost->id() == AgentId)
  21. return pHost;
  22. } // end while
  23. return NULL;
  24. }
  25. /*****************************************************************
  26. **【函数名称】 __removeHost
  27. **【函数功能】 删除指定ID的观查者
  28. **【参数】 AgentId: 观查者座席工号
  29. **【返回值】
  30. ****************************************************************/
  31. void CSubject::__removeHost( UINT AgentId )
  32. {
  33. POSITION pos = m_HostList.GetHeadPosition();
  34. while(pos != NULL)
  35. {
  36. POSITION posPrev = pos;
  37. CSubjectHost* pHost = m_HostList.GetNext(pos);
  38. if(pHost->id() == AgentId)
  39. {
  40. m_HostList.RemoveAt(posPrev);
  41. delete pHost;
  42. return;
  43. } // end if
  44. } // end while
  45. }
  46. /*****************************************************************
  47. **【函数名称】 _dispatchEvent
  48. **【函数功能】 发送事件到指定座席
  49. **【参数】 pEvent: 事件内容
  50. AgentId: 目标座席工号
  51. **【返回值】
  52. ****************************************************************/
  53. void CSubject::_dispatchEvent( EventSubject* pEvent, UINT AgentId )
  54. {
  55. // 通知事件到OCX端
  56. CPduEntity cmd(PDU_CMD_ACD_SUBMIT_DATA);
  57. cmd.SetDataUInt(0, pEvent->SubData1);
  58. cmd.SetDataUInt(1, pEvent->SubData2);
  59. cmd.SetDataUInt(2, pEvent->nEventType);
  60. cmd.SetDataString(3, pEvent->szData);
  61. CNetworkAcd::GetInstance().send2Agent(AgentId, &cmd);
  62. }
  63. /*****************************************************************
  64. **【函数名称】 onEvent
  65. **【函数功能】 订阅事件响应
  66. **【参数】 pEvent: 事件内容
  67. **【返回值】
  68. ****************************************************************/
  69. void CSubject::onEvent( EventSubject* pEvent )
  70. {
  71. // 通知所有的事件观查者
  72. POSITION pos = m_HostList.GetHeadPosition();
  73. while(pos != NULL)
  74. {
  75. CSubjectHost* pHost = m_HostList.GetNext(pos);
  76. if(_isHostEvent(pEvent, pHost))
  77. _dispatchEvent(pEvent, pHost->id());
  78. } // end while
  79. }
  80. /*****************************************************************
  81. **【函数名称】 registObserver
  82. **【函数功能】 注册订阅
  83. **【参数】 AgentId: 观查者座席工号
  84. Data: 订阅参数
  85. Type: 订阅类型
  86. **【返回值】
  87. ****************************************************************/
  88. void CSubject::registObserver( UINT AgentId, int Data, SUBJECT_TYPE Type )
  89. {
  90. CSubjectHost* pHost = __getHost(AgentId);
  91. if(pHost == NULL)
  92. {
  93. pHost = new CSubjectHost(AgentId);
  94. m_HostList.AddTail(pHost);
  95. } // end if
  96. // 追加定阅数据
  97. _insertData(Data, pHost, Type);
  98. }
  99. /*****************************************************************
  100. **【函数名称】 removeObserver
  101. **【函数功能】 取消订阅
  102. **【参数】 AgentId: 观查者座席工号
  103. Data: 取消订阅参数
  104. **【返回值】
  105. ****************************************************************/
  106. void CSubject::removeObserver( UINT AgentId, int Data )
  107. {
  108. CSubjectHost* pHost = __getHost(AgentId);
  109. if(pHost != NULL)
  110. {
  111. _deleteData(Data, pHost); // 移除订阅数据
  112. if(pHost->isEmpty()) __removeHost(AgentId); // 如果已取消订阅了所有信息,移除订阅者
  113. } // end if
  114. }