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

ControlShell.cpp 6.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. #include "StdAfx.h"
  2. #include "ControlShell.h"
  3. #include "MsgCenter.h"
  4. #include "ProxyShell.h"
  5. #include "SessionShell.h"
  6. #include "MC.h"
  7. #include "NetLinkMgr.h"
  8. #include "Config.h"
  9. #include "DaemonClient.h"
  10. #include "TrunkAidedAllocator.h"
  11. SINGLETON_IMPLEMENT(CControlShell)
  12. CControlShell::CControlShell(void)
  13. {
  14. }
  15. CControlShell::~CControlShell(void)
  16. {
  17. }
  18. /*****************************************************************
  19. **【函数名称】 __openTts
  20. **【函数功能】 打开TTS
  21. **【参数】
  22. **【返回值】
  23. ****************************************************************/
  24. void CControlShell::__openTts( void )
  25. {
  26. TTS_TYPE TtsType = CConfig::ttsType();
  27. if(TtsType != TTS_NONE)
  28. {
  29. CHAR szErrCode[BUFFER_LENGTH];
  30. if(ITtsInterface::getInstance().init(TtsType, CConfig::ttsPath(), szErrCode))
  31. LOGGER(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{Core}: TTS打开成功"));
  32. else
  33. LOGGER(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{Core}: TTS打开失败, Reason = %s"), szErrCode);
  34. }
  35. }
  36. /*****************************************************************
  37. **【函数名称】 __closeTts
  38. **【函数功能】 关闭TTS
  39. **【参数】
  40. **【返回值】
  41. ****************************************************************/
  42. void CControlShell::__closeTts( void )
  43. {
  44. if(CConfig::ttsType() != TTS_NONE)
  45. ITtsInterface::getInstance().close();
  46. }
  47. /*****************************************************************
  48. **【函数名称】 __exitSystem
  49. **【函数功能】 退出系统
  50. **【参数】
  51. **【返回值】
  52. ****************************************************************/
  53. void CControlShell::__exitSystem( void )
  54. {
  55. // close();
  56. #ifdef _SC_UI_MODE
  57. AfxGetMainWnd()->PostMessage(WM_CLOSE);
  58. #else
  59. CMsgCenter::GetInstance().stopMsgPump();
  60. #endif
  61. TerminateProcess(GetCurrentProcess(), 0);
  62. }
  63. /*****************************************************************
  64. **【函数名称】 __isAlarmExist
  65. **【函数功能】 判断告警是否已存在
  66. **【参数】
  67. **【返回值】
  68. ****************************************************************/
  69. bool CControlShell::__isAlarmExist( int DevNo, int BoardNo )
  70. {
  71. AlarmMap::iterator itr;
  72. AlarmMap::iterator itrEnd;
  73. itr = m_DevAlarmMap.find(DevNo);
  74. if(itr == m_DevAlarmMap.end())
  75. return false;
  76. itrEnd = m_DevAlarmMap.upper_bound(DevNo);
  77. for(; itr != itrEnd; ++itr)
  78. {
  79. if(itr->second == BoardNo)
  80. return true;
  81. }
  82. return false;
  83. }
  84. /*****************************************************************
  85. **【函数名称】 stage1Start
  86. **【函数功能】 第一阶段启动
  87. **【参数】
  88. **【返回值】
  89. ****************************************************************/
  90. bool CControlShell::stage1Start( void )
  91. {
  92. // 加载配置
  93. if(!CConfig::load())
  94. {
  95. // 断开数据库连接
  96. AfxMessageBox(STR_ERR_CORE_INIT_CFG_LOAD);
  97. return false;
  98. }
  99. CTrunkAidedAllocator::GetInstance().init();
  100. return true;
  101. }
  102. /*****************************************************************
  103. **【函数名称】 stage2Start
  104. **【函数功能】 第二阶段启动
  105. **【参数】
  106. **【返回值】
  107. ****************************************************************/
  108. bool CControlShell::stage2Start( void )
  109. {
  110. CMsgCenter::GetInstance().startInThreadMode();
  111. __openTts();
  112. if(!CMC::GetInstance().open())
  113. {
  114. LOGGER(LOG_CLASS_BUSI, LOG_LEVEL_ERROR, _T("%s"), STR_ERR_CORE_INIT_MC_OPEN);
  115. return false;
  116. }
  117. if(!CNetLinkMgr::GetInstance().open())
  118. {
  119. CMC::GetInstance().close();
  120. LOGGER(LOG_CLASS_BUSI, LOG_LEVEL_ERROR, _T("%s"), STR_ERR_CORE_INIT_NET_SETUP);
  121. return false;
  122. }
  123. CSessionShell::GetInstance().start();
  124. CDaemonClient::GetInstance().doWork();
  125. return true;
  126. }
  127. /*****************************************************************
  128. **【函数名称】 startDirectly
  129. **【函数功能】 直接启动
  130. **【参数】
  131. **【返回值】
  132. ****************************************************************/
  133. bool CControlShell::startDirectly( void )
  134. {
  135. // 加载配置
  136. if(!CConfig::load())
  137. {
  138. // 断开数据库连接
  139. AfxMessageBox(STR_ERR_CORE_INIT_CFG_LOAD);
  140. return false;
  141. }
  142. CTrunkAidedAllocator::GetInstance().init();
  143. ILogger::getInstance().init(NULL, LOG_DEV_SC, CConfig::logFilePath());
  144. ILogger::getInstance().start();
  145. __openTts();
  146. if(!CMC::GetInstance().open())
  147. {
  148. LOGGER(LOG_CLASS_BUSI, LOG_LEVEL_ERROR, _T("%s"), STR_ERR_CORE_INIT_MC_OPEN);
  149. return false;
  150. }
  151. if(!CNetLinkMgr::GetInstance().open())
  152. {
  153. CMC::GetInstance().close();
  154. LOGGER(LOG_CLASS_BUSI, LOG_LEVEL_ERROR, _T("%s"), STR_ERR_CORE_INIT_NET_SETUP);
  155. return false;
  156. }
  157. CSessionShell::GetInstance().start();
  158. CDaemonClient::GetInstance().doWork();
  159. return true;
  160. }
  161. /*****************************************************************
  162. **【函数名称】 close
  163. **【函数功能】 关闭
  164. **【参数】
  165. **【返回值】
  166. ****************************************************************/
  167. void CControlShell::close( void )
  168. {
  169. CSessionShell::GetInstance().stop();
  170. CNetLinkMgr::GetInstance().close();
  171. CMC::GetInstance().close();
  172. __closeTts();
  173. ILogger::getInstance().close();
  174. }
  175. /*****************************************************************
  176. **【函数名称】 onDevValid
  177. **【函数功能】 设备状态可用的处理函数
  178. **【参数】
  179. **【返回值】
  180. ****************************************************************/
  181. void CControlShell::onDevValid( int DevNo )
  182. {
  183. m_DevAlarmMap.erase(DevNo);
  184. CProxyShell::GetInstance().notifyDevResourceState(DEV_RES_TYPE_MB, DevNo, DEVICE_STATE_ENABLE); // 通知设备状态可用
  185. }
  186. /*****************************************************************
  187. **【函数名称】 onDevInvalid
  188. **【函数功能】 设备状态不可用的处理函数
  189. **【参数】
  190. **【返回值】
  191. ****************************************************************/
  192. void CControlShell::onDevInvalid( int DevNo, int BoardNo )
  193. {
  194. bool NeedExit = false;
  195. if(DevNo == DEVICE_MC_NO)
  196. {
  197. NeedExit = true;
  198. LOGGER(LOG_CLASS_BUSI, LOG_LEVEL_ERROR, _T("{Core}: 收到MC不可用通知, 系统将退出"));
  199. CProxyShell::GetInstance().notifyDevResourceState(DEV_RES_TYPE_MB, DevNo, DEVICE_STATE_DISABLE); // 通知设备状态不可用
  200. }
  201. else
  202. {
  203. if(__isAlarmExist(DevNo, BoardNo))
  204. {
  205. NeedExit = true;
  206. LOGGER(LOG_CLASS_BUSI, LOG_LEVEL_ERROR, _T("{Core}: 收到设备[%d-%d]不可用通知且告警次数达到上限, 系统将退出"), DevNo, BoardNo);
  207. CProxyShell::GetInstance().notifyDevResourceState(DEV_RES_TYPE_MB, DevNo, DEVICE_STATE_DISABLE); // 通知设备状态不可用
  208. }
  209. else
  210. {
  211. m_DevAlarmMap.insert(pair<int, int>(DevNo, BoardNo)); // 插入告警
  212. }
  213. }
  214. if(NeedExit)
  215. __exitSystem();
  216. }