linux版本中间件

ChanExten.cpp 4.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. #include "ChanExten.h"
  2. #include "FsProxy.h"
  3. #include "Operation.h"
  4. ChanExten::ChanExten(CFsProxy* pParent, uint32_t ChanNo) : VirtualChan(pParent, ChanNo), m_VoidFlag(false)
  5. {
  6. }
  7. ChanExten::~ChanExten()
  8. {
  9. m_pParent->onExtenDestroy(m_No);
  10. }
  11. bool ChanExten::isFree(void) const
  12. {
  13. return m_State == CHAN_LOGIC_STATE_FREE && m_pOperation == nullptr;
  14. }
  15. void ChanExten::regist(void) const
  16. {
  17. m_pParent->onChanRegist(DEV_RES_TYPE_EXT, m_No, m_State);
  18. }
  19. void ChanExten::onChanHold(EVENT_HOLD_TYPE HoldType)
  20. {
  21. uint32_t NewState = m_State;
  22. if (HoldType == EVENT_HOLD)
  23. NewState |= CHAN_LOGIC_STATE_HELD;
  24. else
  25. NewState &= HELD_STATE_FILTER_MASK;
  26. m_State = (CHAN_LOGIC_STATE)NewState;
  27. m_pParent->onChanStateUpdate(m_OpInstance, this);
  28. }
  29. void ChanExten::onChanEvent(PCHAN_EVENT_NOTIFY pNotify)
  30. {
  31. if (pNotify == nullptr) return;
  32. switch (pNotify->EventId)
  33. {
  34. case CHANNEL_EVENT_CREATE:
  35. {
  36. if(pNotify->CcId.empty())
  37. _setSession(pNotify->CallId, pNotify->ChanId);
  38. else
  39. _setSession(pNotify->CcId, pNotify->ChanId);
  40. m_CallerNum = pNotify->Caller;
  41. m_CalleeNum = pNotify->Callee;
  42. m_OpInstance = pNotify->ChanOpInstance;
  43. if (pNotify->Direction == CALL_DIRECTION_INBOUND) // 呼入FS
  44. {
  45. m_State = CHAN_LOGIC_STATE_DIALING;
  46. if (m_pOperation == NULL) // 如果通道未附加任何操作且变为呼出状态,则通知座席话机直呼操作
  47. m_pParent->onExtenDirectOp(DEV_OP_CALL_OUT, this, pNotify);
  48. }
  49. else // FS呼出
  50. {
  51. __setCallNumber();
  52. // 分机被呼叫过程中,通道无需更新状态,直到来电振铃
  53. return;
  54. }
  55. }
  56. break;
  57. case CHANNEL_EVENT_PROGRESS:
  58. case CHANNEL_EVENT_PROGRESS_MEDIA:
  59. {
  60. if (pNotify->Direction == CALL_DIRECTION_INBOUND) // 呼入FS
  61. {
  62. m_State = CHAN_LOGIC_STATE_RING_BACK;
  63. }
  64. else // FS呼出
  65. {
  66. if (pNotify->Caller == pNotify->Callee) // 自振分机
  67. {
  68. if ((m_pOperation != NULL && m_pOperation->type() == LINE_OP_MAKE_CALL) || pNotify->CallType == AGENT_CALL) // OCX外呼
  69. m_State = CHAN_LOGIC_STATE_INIT;
  70. else
  71. m_State = CHAN_LOGIC_STATE_ALERTING;
  72. }
  73. else
  74. {
  75. m_State = CHAN_LOGIC_STATE_ALERTING;
  76. }
  77. }
  78. }
  79. break;
  80. case CHANNEL_EVENT_ANSWER:
  81. {
  82. // 通过OCX外呼 命令外呼或自动外呼
  83. if ((m_pOperation != NULL && m_pOperation->type() == LINE_OP_MAKE_CALL && pNotify->Direction == CALL_DIRECTION_OUTBOUND) || (pNotify->Caller == pNotify->Callee && pNotify->CallType == AGENT_CALL))
  84. m_State = CHAN_LOGIC_STATE_DIALING;
  85. else
  86. m_State = CHAN_LOGIC_STATE_TALKING;
  87. }
  88. break;
  89. case CHANNEL_EVENT_HANGUP_COMPLETE:
  90. {
  91. m_State = CHAN_LOGIC_STATE_FREE;
  92. m_OpInstance = FS_LINK_INSTANCE_INVALID;
  93. _setSession("", "");
  94. _reset();
  95. }
  96. break;
  97. default:
  98. return;
  99. }
  100. if (m_pOperation != nullptr)
  101. m_pOperation->onHostChanStateUpdated(this);
  102. m_pParent->onChanStateUpdate(pNotify->ChanOpInstance, this);
  103. }
  104. void ChanExten::onSessionChanEvent(VirtualChan * pChanSession, PCHAN_EVENT_NOTIFY pNotify)
  105. {
  106. if (m_pOperation != nullptr)
  107. {
  108. if (m_pOperation->type() == LINE_OP_MAKE_CALL || pNotify->CallType == AGENT_CALL)
  109. {
  110. switch ((int)pNotify->EventId)
  111. {
  112. case CHANNEL_EVENT_PROGRESS:
  113. case CHANNEL_EVENT_PROGRESS_MEDIA:
  114. {
  115. if (m_State == CHAN_LOGIC_STATE_DIALING)
  116. {
  117. if (pNotify->Direction == CALL_DIRECTION_OUTBOUND)
  118. {
  119. m_State = CHAN_LOGIC_STATE_RING_BACK;
  120. m_pOperation->onHostChanStateUpdated(this);
  121. m_pParent->onChanStateUpdate(m_OpInstance, this);
  122. }
  123. }
  124. }
  125. break;
  126. case CHANNEL_EVENT_ANSWER:
  127. {
  128. if (m_State == CHAN_LOGIC_STATE_RING_BACK)
  129. {
  130. m_State = CHAN_LOGIC_STATE_TALKING;
  131. m_pOperation->onHostChanStateUpdated(this);
  132. m_pParent->onChanStateUpdate(m_OpInstance, this);
  133. }
  134. }
  135. break;
  136. }
  137. }
  138. m_pOperation->onSessionChanStateUpdated(pChanSession);
  139. }
  140. }
  141. void ChanExten::forceState(CHAN_LOGIC_STATE NewState)
  142. {
  143. /*if (m_State == NewState)
  144. return;*/
  145. m_State = NewState;
  146. if (m_pOperation != nullptr)
  147. m_pOperation->onHostChanStateUpdated(this);
  148. m_pParent->onChanStateUpdate(m_OpInstance, this);
  149. }
  150. /*****************************************************************
  151. **【函数名称】 __setCallNumber
  152. **【函数功能】 设置呼叫号码
  153. **【参数】
  154. **【返回值】
  155. ****************************************************************/
  156. void ChanExten::__setCallNumber(void)
  157. {
  158. if (m_pOperation == NULL)
  159. return;
  160. switch ((int)m_pOperation->type())
  161. {
  162. case LINE_OP_MAKE_CALL:
  163. {
  164. if (!m_OpNumber.empty())
  165. m_CalleeNum = m_OpNumber;
  166. }
  167. break;
  168. case LINE_OP_LISTEN:
  169. case LINE_OP_INSERT:
  170. case LINE_OP_INSTEAD:
  171. case LINE_OP_GRAB:
  172. {
  173. if (!m_OpNumber.empty())
  174. m_CallerNum = m_OpNumber;
  175. }
  176. break;
  177. }
  178. }