升龙物业 老版本 ocx IPO, 加密狗 转值班电话

ProxyVoip.cpp 13KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396
  1. #include "StdAfx.h"
  2. #include "ProxyVoip.h"
  3. #include "ReqBase.h"
  4. #include "ProxyShell.h"
  5. /*****************************************************************
  6. **【函数名称】 onNewCall
  7. **【函数功能】 线路进入会话事件
  8. **【参数】 Call 线路当前所属的主会话ID
  9. SubCall 线路当前所属的子会话ID
  10. **【返回值】
  11. ****************************************************************/
  12. void CProxyVoip::CImplement4Trunk::onNewCall( CProxyVoip& Proxy, long Call, long SubCall )
  13. {
  14. Proxy.m_ActiveCallId = Call;
  15. }
  16. /*****************************************************************
  17. **【函数名称】 onDevChEvent
  18. **【函数功能】 物理线路向上层发送的设备主动事件
  19. **【参数】 EvtType 事件类型
  20. lpContent 事件内容
  21. **【返回值】
  22. *****************************************************************/
  23. void CProxyVoip::CImplement4Trunk::onDevChEvent( CProxyVoip& Proxy, DEV_CH_EVT_TYPE EvtType, LPCTSTR lpContent )
  24. {
  25. if(Proxy.m_pLineReq != NULL)
  26. Proxy.m_pLineReq->onDevChEvent(&Proxy, EvtType, lpContent);
  27. }
  28. /*****************************************************************
  29. **【函数名称】 onLineStateChanged
  30. **【函数功能】 线路状态变化事件处理
  31. **【参数】 nCall 主会话ID
  32. nSubCall 子会话ID
  33. nStatus 线路基本状态
  34. lpCallerNum 主叫号码
  35. lpCalleeNum 被叫号码
  36. **【返回值】
  37. ****************************************************************/
  38. void CProxyVoip::CImplement4Trunk::onLineStateChanged( CProxyVoip& Proxy, long Call, long SubCall, VIRTUAL_LINE_STATE State, LPCTSTR lpCallerNum, LPCTSTR lpCalleeNum )
  39. {
  40. // 子呼叫空闲状态过滤
  41. if(Proxy.m_pLineReq != NULL && SubCall != SESSION_INVALID_SUB_CALL && State == VIRTUAL_LINE_STATE_FREE)
  42. {
  43. Proxy.m_pLineReq->onLineStateChanged(&Proxy, State, Call, SubCall, lpCallerNum, lpCalleeNum);
  44. return;
  45. } // end if
  46. // 处理线路状事件
  47. procLineState(Proxy, Call, SubCall, State, lpCallerNum, lpCalleeNum);
  48. // 保存呼叫信息
  49. Proxy.m_State = State;
  50. Proxy.m_CallerNum = lpCallerNum;
  51. Proxy.m_CalleeNum = lpCalleeNum;
  52. if(State == VIRTUAL_LINE_STATE_FREE)
  53. Proxy.m_ActiveCallId = SESSION_INVALID_CALL;
  54. else
  55. Proxy.m_ActiveCallId = Call;
  56. // 委托操作执行
  57. if(Proxy.m_pLineReq != NULL)
  58. Proxy.m_pLineReq->onLineStateChanged(&Proxy, State, Call, SubCall, lpCallerNum, lpCalleeNum);
  59. // 通知业务逻辑线路状态变化事件
  60. notifyLineState(Proxy);
  61. }
  62. /*****************************************************************
  63. **【函数名称】 procLineState
  64. **【函数功能】 线路状态变化事件处理
  65. **【参数】 Call 主会话ID
  66. SubCall 子会话ID
  67. State 线路基本状态
  68. lpCallerNum 主叫号码
  69. lpCalleeNum 被叫号码
  70. **【返回值】
  71. ****************************************************************/
  72. void CProxyVoip::CImplement4Trunk::procLineState( CProxyVoip& Proxy, long Call, long SubCall, VIRTUAL_LINE_STATE State, LPCTSTR lpCallerNum, LPCTSTR lpCalleeNum )
  73. {
  74. // 根据外线状态进行对应的逻辑处理
  75. if(Proxy.m_State == VIRTUAL_LINE_STATE_ALERTING && State == VIRTUAL_LINE_STATE_TALKING)
  76. {
  77. // 外线来电
  78. Proxy.m_CallerNum = lpCallerNum;
  79. Proxy.m_CalleeNum = lpCalleeNum;
  80. ASSERT(Proxy.m_pParent != NULL);
  81. Proxy.m_pParent->notifyLineOpEvent(Proxy.m_DevId.toIntId(), DEV_OP_CALL_IN, lpCallerNum, lpCalleeNum);
  82. }
  83. }
  84. /*****************************************************************
  85. **【函数名称】 notifyLineState
  86. **【函数功能】 通知上层逻辑线路状态变化事件
  87. **【参数】
  88. **【返回值】
  89. ****************************************************************/
  90. void CProxyVoip::CImplement4Trunk::notifyLineState( CProxyVoip& Proxy )
  91. {
  92. UINT State = transVirtualState2OuterState(Proxy.m_State);
  93. // 通知业务逻辑线路状态变化事件
  94. ASSERT(Proxy.m_pParent != NULL);
  95. Proxy.m_pParent->notifyDevResourceState(DEV_RES_TYPE_VOIP, Proxy.m_DevId.toIntId(), State, Proxy.m_CallerNum, Proxy.m_CalleeNum);
  96. }
  97. /*****************************************************************
  98. **【函数名称】 transVirtualState2OuterState
  99. **【函数功能】 翻译虚拟状态到真实外部状态
  100. **【参数】
  101. **【返回值】
  102. ****************************************************************/
  103. UINT CProxyVoip::CImplement4Trunk::transVirtualState2OuterState( VIRTUAL_LINE_STATE State ) const
  104. {
  105. switch(State)
  106. {
  107. case VIRTUAL_LINE_STATE_FREE: return VOIP_TRUNK_STATE_FREE;
  108. case VIRTUAL_LINE_STATE_DIALING: return VOIP_TRUNK_STATE_DIALING;
  109. case VIRTUAL_LINE_STATE_RING_BACK: return VOIP_TRUNK_STATE_RING_BACK;
  110. case VIRTUAL_LINE_STATE_ALERTING: return VOIP_TRUNK_STATE_ALERTING;
  111. case VIRTUAL_LINE_STATE_TALKING: return VOIP_TRUNK_STATE_TALKING;
  112. case VIRTUAL_LINE_STATE_DISABLED: return VOIP_TRUNK_STATE_DISABLED;
  113. default: ASSERT(FALSE);
  114. } // end switch
  115. return VOIP_TRUNK_STATE_UNKNOWN;
  116. }
  117. /*****************************************************************
  118. **【函数名称】 onNewCall
  119. **【函数功能】 线路进入会话事件
  120. **【参数】 Call 线路当前所属的主会话ID
  121. SubCall 线路当前所属的子会话ID
  122. **【返回值】
  123. ****************************************************************/
  124. void CProxyVoip::CImplement4Exten::onNewCall( CProxyVoip& Proxy, long Call, long SubCall )
  125. {
  126. ASSERT(Proxy.m_IAmExten != NULL);
  127. Proxy.m_IAmExten->onNewCall(Call, SubCall);
  128. Proxy.m_ActiveCallId = Call;
  129. }
  130. /*****************************************************************
  131. **【函数名称】 onDevChEvent
  132. **【函数功能】 物理线路向上层发送的设备主动事件
  133. **【参数】 EvtType 事件类型
  134. lpContent 事件内容
  135. **【返回值】
  136. *****************************************************************/
  137. void CProxyVoip::CImplement4Exten::onDevChEvent( CProxyVoip& Proxy, DEV_CH_EVT_TYPE EvtType, LPCTSTR lpContent )
  138. {
  139. ASSERT(Proxy.m_IAmExten != NULL);
  140. Proxy.m_IAmExten->onDevChEvent(EvtType, lpContent);
  141. }
  142. /*****************************************************************
  143. **【函数名称】 onLineStateChanged
  144. **【函数功能】 线路状态变化事件处理
  145. **【参数】 nCall 主会话ID
  146. nSubCall 子会话ID
  147. nStatus 线路基本状态
  148. lpCallerNum 主叫号码
  149. lpCalleeNum 被叫号码
  150. **【返回值】
  151. ****************************************************************/
  152. void CProxyVoip::CImplement4Exten::onLineStateChanged( CProxyVoip& Proxy, long Call, long SubCall, VIRTUAL_LINE_STATE State, LPCTSTR lpCallerNum, LPCTSTR lpCalleeNum )
  153. {
  154. CVirtualProxy* pExten = Proxy.m_IAmExten;
  155. if(pExten != NULL)
  156. {
  157. pExten->onLineStateChanged(Call, SubCall, State, lpCallerNum, lpCalleeNum);
  158. if(pExten->state() == VIRTUAL_LINE_STATE_FREE)
  159. {
  160. if(pExten->invalidFlag())
  161. Proxy.m_pParent->onLineDelete(pExten->devId());
  162. Proxy.m_IAmExten = NULL;
  163. Proxy.m_pImplement = &(Proxy.ms_Implement4Trunk);
  164. }
  165. }
  166. if(Proxy.m_State != State)
  167. {
  168. // 保存呼叫信息
  169. Proxy.m_State = State;
  170. Proxy.m_CallerNum = lpCallerNum;
  171. Proxy.m_CalleeNum = lpCalleeNum;
  172. if(State == VIRTUAL_LINE_STATE_FREE)
  173. Proxy.m_ActiveCallId = SESSION_INVALID_CALL;
  174. else
  175. Proxy.m_ActiveCallId = Call;
  176. // 通知业务逻辑线路状态变化事件
  177. notifyLineState(Proxy);
  178. }
  179. }
  180. /*****************************************************************
  181. **【函数名称】 procLineState
  182. **【函数功能】 线路状态变化事件处理
  183. **【参数】 Call 主会话ID
  184. SubCall 子会话ID
  185. State 线路基本状态
  186. lpCallerNum 主叫号码
  187. lpCalleeNum 被叫号码
  188. **【返回值】
  189. ****************************************************************/
  190. void CProxyVoip::CImplement4Exten::procLineState( CProxyVoip& Proxy, long Call, long SubCall, VIRTUAL_LINE_STATE State, LPCTSTR lpCallerNum, LPCTSTR lpCalleeNum )
  191. {
  192. }
  193. /*****************************************************************
  194. **【函数名称】 notifyLineState
  195. **【函数功能】 通知上层逻辑线路状态变化事件
  196. **【参数】
  197. **【返回值】
  198. ****************************************************************/
  199. void CProxyVoip::CImplement4Exten::notifyLineState( CProxyVoip& Proxy )
  200. {
  201. UINT State = transVirtualState2OuterState(Proxy.m_State);
  202. // 通知业务逻辑线路状态变化事件
  203. ASSERT(Proxy.m_pParent != NULL);
  204. Proxy.m_pParent->notifyDevResourceState(DEV_RES_TYPE_VOIP, Proxy.m_DevId.toIntId(), State, Proxy.m_CallerNum, Proxy.m_CalleeNum);
  205. }
  206. /*****************************************************************
  207. **【函数名称】 transVirtualState2OuterState
  208. **【函数功能】 翻译虚拟状态到真实外部状态
  209. **【参数】
  210. **【返回值】
  211. ****************************************************************/
  212. UINT CProxyVoip::CImplement4Exten::transVirtualState2OuterState( VIRTUAL_LINE_STATE State ) const
  213. {
  214. switch(State)
  215. {
  216. case VIRTUAL_LINE_STATE_FREE: return VOIP_EXT_STATE_FREE;
  217. case VIRTUAL_LINE_STATE_INIT: return VOIP_EXT_STATE_INIT;
  218. case VIRTUAL_LINE_STATE_DIALING: return VOIP_EXT_STATE_DIALING;
  219. case VIRTUAL_LINE_STATE_RING_BACK: return VOIP_EXT_STATE_RING_BACK;
  220. case VIRTUAL_LINE_STATE_ALERTING: return VOIP_EXT_STATE_ALERTING;
  221. case VIRTUAL_LINE_STATE_TALKING: return VOIP_EXT_STATE_TALKING;
  222. case VIRTUAL_LINE_STATE_DISABLED: return VOIP_EXT_STATE_DISABLED;
  223. default: ASSERT(FALSE);
  224. } // end switch
  225. return VOIP_EXT_STATE_DISABLED;
  226. }
  227. CProxyVoip::CImplement4Trunk CProxyVoip::ms_Implement4Trunk;
  228. CProxyVoip::CImplement4Exten CProxyVoip::ms_Implement4Exten;
  229. CProxyVoip::CProxyVoip(CProxyShell* pParent, CRDRID DevId) : CVirtualProxy(pParent, DevId), m_pImplement(&ms_Implement4Trunk), m_IAmExten(NULL)
  230. {
  231. ASSERT(m_pParent != NULL);
  232. }
  233. CProxyVoip::~CProxyVoip(void)
  234. {
  235. // 通知业务逻辑线路被删除
  236. ASSERT(m_pParent != NULL);
  237. m_pParent->notifyDevResourceState(DEV_RES_TYPE_VOIP, m_DevId.toIntId(), VOIP_TRUNK_STATE_DISABLED);
  238. }
  239. /*****************************************************************
  240. **【函数名称】 _procLineState
  241. **【函数功能】 线路状态变化事件处理
  242. **【参数】 Call 主会话ID
  243. SubCall 子会话ID
  244. State 线路基本状态
  245. lpCallerNum 主叫号码
  246. lpCalleeNum 被叫号码
  247. **【返回值】
  248. ****************************************************************/
  249. void CProxyVoip::_procLineState( long Call, long SubCall, VIRTUAL_LINE_STATE State, LPCTSTR lpCallerNum, LPCTSTR lpCalleeNum )
  250. {
  251. ASSERT(m_pImplement != NULL);
  252. m_pImplement->procLineState(*this, Call, SubCall, State, lpCallerNum, lpCalleeNum);
  253. }
  254. /*****************************************************************
  255. **【函数名称】 _notifyLineState
  256. **【函数功能】 通知上层逻辑线路状态变化事件
  257. **【参数】
  258. **【返回值】
  259. ****************************************************************/
  260. void CProxyVoip::_notifyLineState( void )
  261. {
  262. ASSERT(m_pImplement != NULL);
  263. m_pImplement->notifyLineState(*this);
  264. }
  265. /*****************************************************************
  266. **【函数名称】 onNewCall
  267. **【函数功能】 线路进入会话事件
  268. **【参数】 nCall 线路当前所属的主会话ID
  269. nSubCall 线路当前所属的子会话ID
  270. **【返回值】
  271. ****************************************************************/
  272. void CProxyVoip::onNewCall( long Call, long SubCall )
  273. {
  274. ASSERT(m_pImplement != NULL);
  275. m_pImplement->onNewCall(*this, Call, SubCall);
  276. }
  277. /*****************************************************************
  278. **【函数名称】 onDevChEvent
  279. **【函数功能】 物理线路向上层发送的设备主动事件
  280. **【参数】 nEvtType 事件类型
  281. lpContent 事件内容
  282. **【返回值】
  283. *****************************************************************/
  284. void CProxyVoip::onDevChEvent( DEV_CH_EVT_TYPE EvtType, LPCTSTR lpContent )
  285. {
  286. ASSERT(m_pImplement != NULL);
  287. m_pImplement->onDevChEvent(*this, EvtType, lpContent);
  288. }
  289. /*****************************************************************
  290. **【函数名称】 notifyLineInfo
  291. **【函数功能】 通知上层逻辑线路信息
  292. **【参数】
  293. **【返回值】
  294. ****************************************************************/
  295. void CProxyVoip::notifyLineInfo( PDU_DEV_TYPE DestType, int DestId ) const
  296. {
  297. // 通知业务逻辑线路状态变化事件
  298. ASSERT(m_pParent != NULL);
  299. m_pParent->notifyResourceDetail(DestType, DestId, DEV_RES_TYPE_VOIP, m_DevId.toIntId());
  300. ASSERT(m_pImplement != NULL);
  301. m_pParent->notifyDevResourceState(DestType, DestId, DEV_RES_TYPE_VOIP, m_DevId.toIntId(), m_pImplement->transVirtualState2OuterState(m_State), m_CallerNum, m_CalleeNum);
  302. }
  303. /*****************************************************************
  304. **【函数名称】 notifyLineInfo
  305. **【函数功能】 通知上层逻辑线路信息
  306. **【参数】
  307. **【返回值】
  308. ****************************************************************/
  309. void CProxyVoip::notifyLineInfo( void ) const
  310. {
  311. // 通知业务逻辑线路状态变化事件
  312. ASSERT(m_pParent != NULL);
  313. m_pParent->notifyResourceDetail(DEV_RES_TYPE_VOIP, m_DevId.toIntId());
  314. ASSERT(m_pImplement != NULL);
  315. m_pParent->notifyDevResourceState(DEV_RES_TYPE_VOIP, m_DevId.toIntId(), m_pImplement->transVirtualState2OuterState(m_State), m_CallerNum, m_CalleeNum);
  316. }
  317. /*****************************************************************
  318. **【函数名称】 onLineStateChanged
  319. **【函数功能】 线路状态变化事件处理
  320. **【参数】 nCall 主会话ID
  321. nSubCall 子会话ID
  322. nStatus 线路基本状态
  323. lpCallerNum 主叫号码
  324. lpCalleeNum 被叫号码
  325. **【返回值】
  326. ****************************************************************/
  327. void CProxyVoip::onLineStateChanged( long Call, long SubCall, VIRTUAL_LINE_STATE State, LPCTSTR lpCallerNum, LPCTSTR lpCalleeNum )
  328. {
  329. ASSERT(m_pImplement != NULL);
  330. m_pImplement->onLineStateChanged(*this, Call, SubCall, State, lpCallerNum, lpCalleeNum);
  331. }
  332. /*****************************************************************
  333. **【函数名称】 wrap
  334. **【函数功能】 包装为分机方式工作
  335. **【参数】
  336. **【返回值】
  337. ****************************************************************/
  338. void CProxyVoip::wrap( CVirtualProxy* pWrapper )
  339. {
  340. m_IAmExten = pWrapper;
  341. m_pImplement = &ms_Implement4Exten;
  342. }
  343. /*****************************************************************
  344. **【函数名称】 getAssoExtenNo
  345. **【函数功能】 获取VOIP线路关联的分机号码
  346. **【参数】
  347. **【返回值】
  348. ****************************************************************/
  349. void CProxyVoip::getAssoExtenNo( CString& ExtenNo )
  350. {
  351. if(m_IAmExten != NULL)
  352. ExtenNo.Format(_T("%lu"), m_IAmExten->lineId());
  353. }