中间件底层,websocket

IncomingCallGroup.cpp 4.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. #include "StdAfx.h"
  2. #include "IncomingCallGroup.h"
  3. #include "IncomingCall.h"
  4. #include "MsgCenter.h"
  5. CIncomingCallGroup::CIncomingCallGroup(void)
  6. {
  7. }
  8. CIncomingCallGroup::~CIncomingCallGroup(void)
  9. {
  10. }
  11. /*****************************************************************
  12. **【函数名称】 __queue
  13. **【函数功能】 根据来电VIP级别排队
  14. **【参数】
  15. **【返回值】
  16. ****************************************************************/
  17. int CIncomingCallGroup::__queue( CIncomingCall* pCall )
  18. {
  19. int Index = m_nCount;
  20. if(Index == 0)
  21. {
  22. AddTail(pCall);
  23. return 0;
  24. }
  25. else
  26. {
  27. POSITION pos = GetTailPosition();
  28. POSITION FirstPos = GetHeadPosition();
  29. while(pos != NULL)
  30. {
  31. POSITION posPrev = pos;
  32. CIncomingCall* pTmpCall = GetPrev(pos);
  33. if(pTmpCall->vipLevel() >= pCall->vipLevel())
  34. {
  35. InsertAfter(posPrev, pCall);
  36. break;
  37. }
  38. if (posPrev == FirstPos)
  39. {
  40. InsertBefore(FirstPos, pCall);
  41. Index = 0;
  42. break;
  43. }
  44. --Index;
  45. } // end if
  46. return Index+1;
  47. } // end if
  48. }
  49. /*****************************************************************
  50. **【函数名称】 addCall
  51. **【函数功能】 添加呼叫
  52. **【参数】
  53. **【返回值】
  54. ****************************************************************/
  55. CIncomingCall* CIncomingCallGroup::addCall( CPduEntity* pCmd, int& Index )
  56. {
  57. CIncomingCall* pCall = new CIncomingCall(pCmd);
  58. ASSERT(pCall != NULL);
  59. Index = __queue(pCall);
  60. // 通知排队队列变化事件
  61. CMsgCenter::GetInstance().pushMsg(ACD_MSG_QUEUE_UPDATE, (PARAM)pCall->groupAsked());
  62. return pCall;
  63. }
  64. /*****************************************************************
  65. **【函数名称】 getCall
  66. **【函数功能】 查找指定索引的呼叫
  67. **【参数】
  68. **【返回值】
  69. ****************************************************************/
  70. CIncomingCall* CIncomingCallGroup::getCall( int Index )
  71. {
  72. CIncomingCall* pCall = NULL;
  73. POSITION pos = GetHeadPosition();
  74. while (pos != NULL)
  75. {
  76. pCall = GetNext(pos);
  77. if (pCall && pCall->index() == Index)
  78. return pCall;
  79. } // end while
  80. return NULL;
  81. }
  82. CIncomingCall * CIncomingCallGroup::getCallByCallID(unsigned long callID)
  83. {
  84. CIncomingCall* pCall = NULL;
  85. POSITION pos = GetHeadPosition();
  86. while (pos != NULL)
  87. {
  88. pCall = GetNext(pos);
  89. if (pCall && pCall->callId() == callID)
  90. return pCall;
  91. } // end while
  92. return NULL;
  93. }
  94. /*****************************************************************
  95. **【函数名称】 addCall
  96. **【函数功能】 添加呼叫
  97. **【参数】
  98. **【返回值】
  99. ****************************************************************/
  100. bool CIncomingCallGroup::delCall( int Index )
  101. {
  102. CIncomingCall* pCall = NULL;
  103. POSITION pos = GetHeadPosition();
  104. while(pos != NULL)
  105. {
  106. POSITION posPrev = pos;
  107. pCall = GetNext(pos);
  108. ASSERT(pCall != NULL);
  109. if(pCall->index() == Index)
  110. {
  111. // 删除呼叫
  112. RemoveAt(posPrev);
  113. // 通知排队队列变化事件
  114. CMsgCenter::GetInstance().pushMsg(ACD_MSG_QUEUE_UPDATE, (PARAM)pCall->groupAsked());
  115. delete pCall;
  116. pCall = NULL;
  117. return true;
  118. } // end if
  119. } // end while
  120. return false;
  121. }
  122. /*****************************************************************
  123. **【函数名称】 clear
  124. **【函数功能】 释放所有呼叫
  125. **【参数】
  126. **【返回值】
  127. ****************************************************************/
  128. void CIncomingCallGroup::clear( void )
  129. {
  130. CIncomingCall* pCall = NULL;
  131. // 清除所有呼叫
  132. while (m_nCount > 0)
  133. {
  134. pCall = RemoveHead();
  135. delete pCall;
  136. pCall = NULL;
  137. }
  138. }
  139. /*****************************************************************
  140. **【函数名称】 getCallInfo
  141. **【函数功能】 获取指定呼叫的相关信息用于UI展现
  142. **【参数】
  143. **【返回值】
  144. ****************************************************************/
  145. bool CIncomingCallGroup::getCallInfo( Call2Show& Info )
  146. {
  147. CIncomingCall* pCall = getCall(Info.Index);
  148. if(pCall != NULL)
  149. {
  150. Info.CallId = pCall->callId();
  151. Info.State = pCall->state();
  152. Info.VipLevel = pCall->vipLevel();
  153. Info.Group = pCall->groupAsked();
  154. Info.Strategy = pCall->agentStrategy();
  155. Info.Caller = pCall->callerNum();
  156. return true;
  157. }
  158. return false;
  159. }
  160. /*****************************************************************
  161. **【函数名称】 getTopWaitedCall
  162. **【函数功能】 得到当前可分配座席的呼叫
  163. **【参数】
  164. **【返回值】
  165. ****************************************************************/
  166. CIncomingCall* CIncomingCallGroup::getTopWaitedCall( void )
  167. {
  168. CIncomingCall* pCall = NULL;
  169. POSITION pos = GetHeadPosition();
  170. while(pos != NULL)
  171. {
  172. pCall = GetNext(pos);
  173. if(pCall->state() == OUTER_CALL_WAITING)
  174. return pCall;
  175. } // end while
  176. return NULL;
  177. }
  178. /*****************************************************************
  179. **【函数名称】 getCallWaitCount
  180. **【函数功能】 呼叫排队数
  181. **【参数】
  182. **【返回值】
  183. ****************************************************************/
  184. int CIncomingCallGroup::getCallWaitCount(void)
  185. {
  186. CIncomingCall* pCall;
  187. POSITION pos = GetHeadPosition();
  188. int t_cnt = 0;
  189. while (pos != NULL)
  190. {
  191. pCall = GetNext(pos);
  192. if (pCall->state() == OUTER_CALL_WAITING)
  193. t_cnt++;
  194. } // end while
  195. return t_cnt;
  196. }