MiddleWares_YiHe 郑州颐和医院随访系统中间件

OpPlayAndDtmfExten.cpp 5.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. #include "StdAfx.h"
  2. #include "OpPlayAndDtmfExten.h"
  3. #include "ChanTrunk.h"
  4. #include "OperationReactor.h"
  5. #include "FsProxy.h"
  6. #include "ChanExten.h"
  7. COpPlayAndDtmfExten::COpPlayAndDtmfExten(COperationReactor* pParent, LONG Instance) : COperation(pParent, Instance), m_Dtmf("")
  8. {
  9. m_bExecuteEnd = FALSE;
  10. m_bDtmfEnd = FALSE;
  11. m_bDtmfFinish = FALSE;
  12. ZeroMemory(&m_PlayContent, sizeof(m_PlayContent));
  13. }
  14. COpPlayAndDtmfExten::~COpPlayAndDtmfExten(void)
  15. {
  16. }
  17. /*****************************************************************
  18. **【函数名称】 _end
  19. **【函数功能】 操作完成
  20. **【参数】 IsSucceed 操作是否成功
  21. lpData 随路数据
  22. **【返回值】
  23. ****************************************************************/
  24. void COpPlayAndDtmfExten::_end(bool IsSucceed)
  25. {
  26. if (IsSucceed)
  27. {
  28. LOGGER(LOG_LEVEL_NORMAL, _T("{OpPlayAndDtmf}: 中继[%lu]放音收号成功, DTMF = %s"), m_pHostChan->no(), m_Dtmf);
  29. }
  30. else
  31. {
  32. LOGGER(LOG_LEVEL_WARNING, _T("{OpPlayAndDtmf}: 中继[%lu]放音收号失败, DTMF = %s"), m_pHostChan->no(), m_Dtmf);
  33. }
  34. // 返回执行结果
  35. if (m_InstanceCancel != FS_LINK_INSTANCE_INVALID)
  36. m_pParent->onOpResult(m_InstanceCancel, !IsSucceed);
  37. m_pParent->onOpResult(m_Instance, this, IsSucceed, m_Dtmf);
  38. }
  39. /*****************************************************************
  40. **【函数名称】 start
  41. **【函数功能】 执行操作
  42. **【参数】
  43. **【返回值】
  44. *****************************************************************/
  45. bool COpPlayAndDtmfExten::start1(LineOpParam* pParam,int n)
  46. {
  47. if (m_pHostChan->state() != CHAN_LOGIC_STATE_STANDBY)
  48. return false;
  49. m_bExecuteEnd = FALSE;
  50. m_bDtmfEnd = FALSE;
  51. m_bDtmfFinish = FALSE;
  52. // 初始化放音内容
  53. ZeroMemory(&m_PlayContent, sizeof(m_PlayContent));
  54. m_PlayContent.nModel = (PlayVoiceMode)pParam->nParam1;
  55. lstrcpy(m_PlayContent.szFileName, pParam->szParam3);
  56. m_PlayContent.nDtmfCount = pParam->nParam7;
  57. m_PlayContent.nDtmfPeriod = pParam->nParam8;
  58. m_PlayContent.cDtmfEnd = pParam->szParam1[0];
  59. m_PlayContent.nTts = pParam->nParam2; // TTS类型
  60. m_PlayContent.nTtsDigitMode = pParam->nParam3; // TTS数字播报模式
  61. m_PlayContent.nTtsSpeed = pParam->nParam5; // TTS语速
  62. m_PlayContent.nTtsVolume = pParam->nParam6; // TTS音量
  63. // 放音启动日志
  64. LOGGER(LOG_LEVEL_NORMAL, _T("{OpPlayAndDtmf}: 中继[%lu]放音收号, FileName = %s, Mode = %lu"),
  65. m_pHostChan->no(), m_PlayContent.szFileName, m_PlayContent.nModel);
  66. return CFsProxy::GetInstance().playAndDtmf(dynamic_cast<CChanTrunk*>(m_pHostChan), &m_PlayContent);
  67. }
  68. bool COpPlayAndDtmfExten::start(LineOpParam* pParam)
  69. {
  70. CString EslCmd;
  71. // 初始化放音内容
  72. ZeroMemory(&m_PlayContent, sizeof(m_PlayContent));
  73. m_PlayContent.nModel = (PlayVoiceMode)pParam->nParam1;
  74. m_PlayContent.nTts = 1;
  75. lstrcpy(m_PlayContent.szFileName, "E:\\midware\\ivr\\ivr_Rongji\\wav\\mydstart.wav");
  76. return CFsProxy::GetInstance().playAndDtmf(dynamic_cast<CChanExten*>(m_pHostChan), &m_PlayContent);
  77. }
  78. /*****************************************************************
  79. **【函数名称】 cancel
  80. **【函数功能】 取消操作
  81. **【参数】
  82. **【返回值】
  83. *****************************************************************/
  84. bool COpPlayAndDtmfExten::cancel(LONG InstanceCancel)
  85. {
  86. // 放音停止日志
  87. LOGGER(LOG_LEVEL_NORMAL, _T("{OpPlayAndDtmf}: 中继[%lu]取消放音收号"), m_pHostChan->no());
  88. m_InstanceCancel = InstanceCancel;
  89. if (CFsProxy::GetInstance().cancel(dynamic_cast<CChanTrunk*>(m_pHostChan)))
  90. {
  91. _end(false);
  92. return true;
  93. }
  94. else
  95. {
  96. return false;
  97. }
  98. }
  99. /*****************************************************************
  100. **【函数名称】 hangup
  101. **【函数功能】 操作中挂机
  102. **【参数】
  103. **【返回值】
  104. *****************************************************************/
  105. bool COpPlayAndDtmfExten::hangup(LONG InstanceHangup)
  106. {
  107. if (m_InstanceCancel != FS_LINK_INSTANCE_INVALID)
  108. return false;
  109. LOGGER(LOG_LEVEL_NORMAL, _T("{OpPlayAndDtmf}: 中继[%lu]放音收号中挂机"), m_pHostChan->no());
  110. m_InstanceCancel = InstanceHangup;
  111. if (CFsProxy::GetInstance().hangup(dynamic_cast<CChanTrunk*>(m_pHostChan)))
  112. {
  113. _end(false);
  114. return true;
  115. }
  116. else
  117. {
  118. return false;
  119. }
  120. }
  121. /*****************************************************************
  122. **【函数名称】 onHostChanDtmf
  123. **【函数功能】 关联通道DTMF处理
  124. **【参数】
  125. **【返回值】
  126. *****************************************************************/
  127. void COpPlayAndDtmfExten::onHostChanDtmf(LPCTSTR Dtmf)
  128. {
  129. ASSERT(Dtmf != NULL);
  130. m_Dtmf += Dtmf;
  131. if (m_PlayContent.nDtmfCount <= m_Dtmf.GetLength())
  132. {
  133. m_bDtmfEnd = TRUE; // 收号完成
  134. }
  135. if (m_bExecuteEnd == TRUE && m_bDtmfEnd == TRUE) // 如果 onChanAppExecuted 先执行完成
  136. {
  137. _end(true);
  138. return;
  139. }
  140. else if (m_bDtmfEnd == TRUE)
  141. {
  142. m_bDtmfFinish = TRUE;
  143. return;
  144. }
  145. }
  146. /*****************************************************************
  147. **【函数名称】 onHostChanStateUpdated
  148. **【函数功能】 关联通道状态更新处理
  149. **【参数】
  150. **【返回值】
  151. *****************************************************************/
  152. void COpPlayAndDtmfExten::onHostChanStateUpdated(CVirtualChan* pHostChan)
  153. {
  154. if (m_pHostChan == NULL) return;
  155. if (m_pHostChan->state() == CHAN_LOGIC_STATE_FREE)
  156. _end(false);
  157. }
  158. /*****************************************************************
  159. **【函数名称】 onChanAppExecuted
  160. **【函数功能】 通道任务执行结束事件处理
  161. **【参数】
  162. **【返回值】
  163. *****************************************************************/
  164. void COpPlayAndDtmfExten::onChanAppExecuted(CVirtualChan* pHostChan, PAPP_EXEC_NOTIFY pNotify)
  165. {
  166. ASSERT(pNotify != NULL);
  167. if (pNotify == NULL)
  168. return;
  169. if (lstrcmp(pNotify->App, ESL_APP_PLAY_DTMF) == 0 || lstrcmp(pNotify->App, ESL_APP_PLAY) == 0)
  170. {
  171. if (m_PlayContent.nModel == PVM_PLAY_WAIT_DIGIT || m_PlayContent.nModel == PVM_WAIT_DIGIT)
  172. {
  173. if (m_bDtmfFinish == TRUE)
  174. {
  175. _end(true);
  176. return;
  177. }
  178. }
  179. else
  180. {
  181. _end(true);
  182. return;
  183. }
  184. m_bExecuteEnd = TRUE;
  185. return;
  186. }
  187. }