修改三方通话功能,在发起三方通话时,先保持住主叫,然后再拉回主叫到会议

FaxChannel.cpp 6.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. #include "StdAfx.h"
  2. #include "FaxChannel.h"
  3. #include "MC.h"
  4. #include "OneLeg.h"
  5. #include "IpmChannel.h"
  6. CFaxChannel::CFaxChannel(int ChanNo) : m_ChanNo(ChanNo), m_Handle(DEV_HANDLE_INVALID), m_state(FS_IDLE), m_pLeg(NULL), m_pIpmChan(NULL)
  7. {
  8. }
  9. CFaxChannel::~CFaxChannel(void)
  10. {
  11. }
  12. /*****************************************************************
  13. **【函数名称】 __release
  14. **【函数功能】 资源释放
  15. **【参数】
  16. **【返回值】
  17. ****************************************************************/
  18. void CFaxChannel::__release( bool FaxResult )
  19. {
  20. m_state = FS_IDLE;
  21. ASSERT(m_pIpmChan != NULL);
  22. ASSERT(m_pLeg != NULL);
  23. CMC::GetInstance().bridgeDevice(m_pLeg->routeChannel(), m_pIpmChan, false, false);
  24. m_pIpmChan->stopFax();
  25. m_pIpmChan = NULL;
  26. m_pLeg->onFaxEnd(FaxResult, NULL);
  27. m_pLeg = NULL;
  28. }
  29. /*****************************************************************
  30. **【函数名称】 __onFaxError
  31. **【函数功能】 传真出错处理
  32. **【参数】
  33. **【返回值】
  34. ****************************************************************/
  35. void CFaxChannel::__onFaxError( void )
  36. {
  37. __release(false);
  38. LOGGER(LOG_CLASS_DEV, LOG_LEVEL_WARNING, _T("{FaxCh}: 通道[%d]收发传真失败, %s"),
  39. m_ChanNo, ISX_ATDV_ERRMSGP(m_Handle));
  40. }
  41. /*****************************************************************
  42. **【函数名称】 __onFaxEnd
  43. **【函数功能】 传真结束处理
  44. **【参数】
  45. **【返回值】
  46. ****************************************************************/
  47. void CFaxChannel::__onFaxEnd( void )
  48. {
  49. bool Res = false;
  50. int TermCode = ISX_ATFXS_TERMMSK(m_Handle);
  51. if(TermCode != AT_FAILURE)
  52. Res = (TermCode & TM_FXTERM) == TM_FXTERM ? true : false;
  53. __release(Res);
  54. LOGGER(LOG_CLASS_DEV, Res ? LOG_LEVEL_NORMAL : LOG_LEVEL_WARNING, _T("{FaxCh}: 通道[%d]收发传真结束, Result = %d"),
  55. m_ChanNo, Res);
  56. }
  57. /*****************************************************************
  58. **【函数名称】 open
  59. **【函数功能】 打开通道
  60. **【参数】
  61. **【返回值】
  62. ****************************************************************/
  63. bool CFaxChannel::open( void )
  64. {
  65. if(m_Handle != DEV_HANDLE_INVALID)
  66. return false;
  67. m_Handle = ISX_fxs_open(m_ChanNo, this);
  68. if(m_Handle < 0)
  69. {
  70. m_Handle = DEV_HANDLE_INVALID;
  71. return false;
  72. }
  73. return true;
  74. }
  75. /*****************************************************************
  76. **【函数名称】 close
  77. **【函数功能】 关闭通道
  78. **【参数】
  79. **【返回值】
  80. ****************************************************************/
  81. void CFaxChannel::close( void )
  82. {
  83. if(m_Handle != DEV_HANDLE_INVALID)
  84. {
  85. ISX_fxs_close(m_Handle);
  86. m_Handle = DEV_HANDLE_INVALID;
  87. }
  88. }
  89. /*****************************************************************
  90. **【函数名称】 send
  91. **【函数功能】 发送传真
  92. **【参数】
  93. **【返回值】
  94. ****************************************************************/
  95. bool CFaxChannel::send( COneLeg* pLeg, LPCTSTR FaxFile )
  96. {
  97. ASSERT(pLeg != NULL);
  98. ASSERT(FaxFile != NULL);
  99. CChannelResource* pDstChanRes = pLeg->routeChannel();
  100. ASSERT(pDstChanRes != NULL);
  101. CIpmChannel* pIpmChan = CMC::GetInstance().allocIpmCh4SipCh(pDstChanRes->nodeNo(), pDstChanRes->boardNo());
  102. if(pIpmChan == NULL)
  103. return false;
  104. pIpmChan->startFax();
  105. if(!CMC::GetInstance().bridgeDevice(pDstChanRes, pIpmChan, true, false))
  106. {
  107. pIpmChan->stopFax();
  108. LOGGER(LOG_CLASS_DEV, LOG_LEVEL_WARNING, _T("{FaxCh}: 通道[%d]发送传真失败, 无法建立IPM与CallLeg间的交换, File = %s"),
  109. m_ChanNo, FaxFile);
  110. return false;
  111. }
  112. SNDFAX_ITEMS FaxItem;
  113. memset(&FaxItem, 0, sizeof(SNDFAX_ITEMS));
  114. FaxItem.io_datatype = DF_TIFF;
  115. sprintf_s(FaxItem.szFileName, MAX_PATH, _T("%s"), FaxFile);
  116. if(ISX_fxs_sendfax(m_Handle, &FaxItem, 1, pIpmChan->handle()) == 0)
  117. {
  118. m_pLeg = pLeg;
  119. m_pIpmChan = pIpmChan;
  120. m_state = FS_SEND;
  121. LOGGER(LOG_CLASS_DEV, LOG_LEVEL_NORMAL, _T("{FaxCh}: 通道[%d]开始发送传真, File = %s"), m_ChanNo, FaxFile);
  122. return true;
  123. }
  124. else
  125. {
  126. CMC::GetInstance().bridgeDevice(pDstChanRes, pIpmChan, false, false);
  127. pIpmChan->stopFax();
  128. LOGGER(LOG_CLASS_DEV, LOG_LEVEL_WARNING, _T("{FaxCh}: 通道[%d]发送传真失败, File = %s"), m_ChanNo, FaxFile);
  129. return false;
  130. }
  131. }
  132. /*****************************************************************
  133. **【函数名称】 recv
  134. **【函数功能】 接收传真
  135. **【参数】
  136. **【返回值】
  137. ****************************************************************/
  138. bool CFaxChannel::recv( COneLeg* pLeg, LPCTSTR FaxFile )
  139. {
  140. ASSERT(pLeg != NULL);
  141. ASSERT(FaxFile != NULL);
  142. CChannelResource* pDstChanRes = pLeg->routeChannel();
  143. ASSERT(pDstChanRes != NULL);
  144. CIpmChannel* pIpmChan = CMC::GetInstance().allocIpmCh4SipCh(pDstChanRes->nodeNo(), pDstChanRes->boardNo());
  145. if(pIpmChan == NULL)
  146. return false;
  147. pIpmChan->stopFax();
  148. if(!CMC::GetInstance().bridgeDevice(pDstChanRes, pIpmChan, true, false))
  149. {
  150. pIpmChan->stopFax();
  151. LOGGER(LOG_CLASS_DEV, LOG_LEVEL_WARNING, _T("{FaxCh}: 通道[%d]接收传真失败, 无法建立IPM与CallLeg间的交换, File = %s"),
  152. m_ChanNo, FaxFile);
  153. return false;
  154. }
  155. char FileName[MAX_PATH];
  156. sprintf_s(FileName, MAX_PATH, _T("%s"), FaxFile);
  157. if(ISX_fxs_rcvfax(m_Handle, FileName, pIpmChan->handle()) == 0)
  158. {
  159. m_pLeg = pLeg;
  160. m_pIpmChan = pIpmChan;
  161. m_state = FS_RECV;
  162. LOGGER(LOG_CLASS_DEV, LOG_LEVEL_NORMAL, _T("{FaxCh}: 通道[%d]开始接收传真, File = %s"),
  163. m_ChanNo, FaxFile);
  164. return true;
  165. }
  166. else
  167. {
  168. CMC::GetInstance().bridgeDevice(pDstChanRes, pIpmChan, false, false);
  169. pIpmChan->stopFax();
  170. LOGGER(LOG_CLASS_DEV, LOG_LEVEL_WARNING, _T("{FaxCh}: 通道[%d]接收传真失败, File = %s"),
  171. m_ChanNo, FaxFile);
  172. return false;
  173. }
  174. }
  175. /*****************************************************************
  176. **【函数名称】 stop
  177. **【函数功能】 接收传真
  178. **【参数】
  179. **【返回值】
  180. ****************************************************************/
  181. bool CFaxChannel::stop( void )
  182. {
  183. LOGGER(LOG_CLASS_DEV, LOG_LEVEL_NORMAL, _T("{FaxCh}: 通道[%d]终止传真收发, State = %d"), m_ChanNo, m_state);
  184. if(m_state == FS_IDLE)
  185. return false;
  186. ISX_fxs_stopch(m_Handle);
  187. __release(false);
  188. return true;
  189. }
  190. /*****************************************************************
  191. **【函数名称】 onDevEvent
  192. **【函数功能】 系统事件处理
  193. **【参数】
  194. **【返回值】
  195. ****************************************************************/
  196. void CFaxChannel::onDevEvent( METAEVENT* pMetaEvent )
  197. {
  198. ASSERT(pMetaEvent != NULL);
  199. switch(pMetaEvent->evttype)
  200. {
  201. case TFX_FAXERROR:
  202. case TFX_STARTOP_ERR:
  203. __onFaxError();
  204. break;
  205. case TFX_FAXRECV:
  206. case TFX_FAXSEND:
  207. __onFaxEnd();
  208. break;
  209. }
  210. }