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

MC.cpp 34KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338
  1. #include "StdAfx.h"
  2. #include "MC.h"
  3. #include "Config.h"
  4. #include "ControlShell.h"
  5. #include "PBX.h"
  6. #include "SpanChannel.h"
  7. #include "DspChannel.h"
  8. #include "SessionShell.h"
  9. #include "VoipChannel.h"
  10. #include "IpmChannel.h"
  11. #include "FaxChannel.h"
  12. #include "ProxyShell.h"
  13. SINGLETON_IMPLEMENT(CMC)
  14. CMC::CMC(void) : m_pThreadObj(NULL), m_Stop(true), m_state(0)
  15. {
  16. }
  17. CMC::~CMC(void)
  18. {
  19. __freePbx();
  20. }
  21. /*****************************************************************
  22. **【函数名称】 __translateResType
  23. **【函数功能】 查找指定PBX
  24. **【参数】
  25. **【返回值】
  26. ****************************************************************/
  27. LPCTSTR CMC::__translateResType( DEV_RES_TYPE ResType ) const
  28. {
  29. switch(ResType)
  30. {
  31. case DEV_RES_TYPE_EXT: return _T("分机资源");
  32. case DEV_RES_TYPE_TRUNK: return _T("数字中继资源");
  33. case DEV_RES_TYPE_CONFERENCE: return _T("会议资源");
  34. case DEV_RES_TYPE_FAX: return _T("传真资源");
  35. case DEV_RES_TYPE_VOIP: return _T("VOIP资源");
  36. case DEV_RES_TYPE_DSP: return _T("DSP资源");
  37. case DEV_RES_TYPE_IPM: return _T("IPM资源");
  38. case DEV_RES_TYPE_MB: return _T("母板资源");
  39. default: return _T("未知资源");
  40. }
  41. }
  42. /*****************************************************************
  43. **【函数名称】 __getPbx
  44. **【函数功能】 查找指定PBX
  45. **【参数】
  46. **【返回值】
  47. ****************************************************************/
  48. CPBX* CMC::__getPbx( int IsxNo )
  49. {
  50. CPBX* pPbx = NULL;
  51. for(int i = 0; i < m_PbxList.GetCount(); ++i)
  52. {
  53. pPbx = m_PbxList[i];
  54. ASSERT(pPbx != NULL);
  55. if(pPbx->pbxNo() == IsxNo)
  56. return pPbx;
  57. }
  58. return NULL;
  59. }
  60. /*****************************************************************
  61. **【函数名称】 __newPbx
  62. **【函数功能】 创建新PBX
  63. **【参数】
  64. **【返回值】
  65. ****************************************************************/
  66. CPBX* CMC::__newPbx( int IsxNo )
  67. {
  68. CPBX* pPbx = __getPbx(IsxNo);
  69. if(pPbx == NULL)
  70. {
  71. pPbx = new CPBX(this, IsxNo);
  72. ASSERT(pPbx != NULL);
  73. m_PbxList.Add(pPbx);
  74. }
  75. return pPbx;
  76. }
  77. /*****************************************************************
  78. **【函数名称】 __freePbx
  79. **【函数功能】 释放PBX
  80. **【参数】
  81. **【返回值】
  82. ****************************************************************/
  83. void CMC::__freePbx( void )
  84. {
  85. for(int i = 0; i < m_PbxList.GetCount(); ++i)
  86. {
  87. delete m_PbxList[i];
  88. }
  89. m_PbxList.RemoveAll();
  90. }
  91. /*****************************************************************
  92. **【函数名称】 __regExten2Dev
  93. **【函数功能】 向设备注册分机信息
  94. **【参数】
  95. **【返回值】
  96. ****************************************************************/
  97. void CMC::__regExten2Dev( void )
  98. {
  99. CString ExtenId;
  100. CConfig::ExtenMap& ExtMap = CConfig::extenMap();
  101. const CConfig::ExtenMap::CPair* pPair = ExtMap.PGetFirstAssoc();
  102. while(pPair != NULL)
  103. {
  104. ExtenId.Format(_T("%u"), pPair->key);
  105. ISXE_gc_SipSetRegisterUser(ExtenId, ExtenId, pPair->value);
  106. pPair = ExtMap.PGetNextAssoc(pPair);
  107. }
  108. }
  109. /*****************************************************************
  110. **【函数名称】 __onSipUserNew
  111. **【函数功能】 SIP终端注册处理
  112. **【参数】
  113. **【返回值】
  114. ****************************************************************/
  115. void CMC::__onSipUserNew( void )
  116. {
  117. ISXSIP_REGUSER* pUserInfo = (ISXSIP_REGUSER*)ISX_sr_getevtdatap();
  118. ASSERT(pUserInfo != NULL);
  119. UINT UserId = atoi(pUserInfo->UserId);
  120. DEV_RES_ID ResId;
  121. ResId.ResType = DEV_RES_TYPE_EXT;
  122. ResId.ChanNo = UserId;
  123. CSessionShell::GetInstance().onDevResourceNew(ResId);
  124. //#ifdef _DEBUG
  125. LOGGER(LOG_CLASS_DEV, LOG_LEVEL_NORMAL, _T("{MC}: SIP用户[%d-%s]注册"), UserId, pUserInfo->IpAddr);
  126. //#endif
  127. }
  128. /*****************************************************************
  129. **【函数名称】 __onSipUserDel
  130. **【函数功能】 SIP终端注销处理
  131. **【参数】
  132. **【返回值】
  133. ****************************************************************/
  134. void CMC::__onSipUserDel( void )
  135. {
  136. ISXSIP_REGUSER* pUserInfo = (ISXSIP_REGUSER*)ISX_sr_getevtdatap();
  137. ASSERT(pUserInfo != NULL);
  138. UINT UserId = atoi(pUserInfo->UserId);
  139. DEV_RES_ID ResId;
  140. ResId.ResType = DEV_RES_TYPE_EXT;
  141. ResId.ChanNo = UserId;
  142. CSessionShell::GetInstance().onDevResourceDel(ResId);
  143. //#ifdef _DEBUG
  144. LOGGER(LOG_CLASS_DEV, LOG_LEVEL_NORMAL, _T("{MC}: SIP用户[%d-%s]注销"), UserId, pUserInfo->IpAddr);
  145. //#endif
  146. }
  147. /*****************************************************************
  148. **【函数名称】 __procResourceStateUpdate
  149. **【函数功能】 设备资源状态更新处理函数
  150. **【参数】
  151. **【返回值】
  152. ****************************************************************/
  153. void CMC::__procResourceStateUpdate( INT EvtType, SYS_EVT_DATA* pEvtData )
  154. {
  155. ASSERT(pEvtData != NULL);
  156. LOG_LEVEL Level;
  157. CHAR State = pEvtData->u.cStatus;
  158. if(State == STATUS_WORKING)
  159. Level = LOG_LEVEL_NORMAL;
  160. else
  161. Level = LOG_LEVEL_WARNING;
  162. switch(EvtType)
  163. {
  164. case SYSEV_MC_STATUS:
  165. {
  166. LOGGER(LOG_CLASS_DEV, Level, _T("{MC}: MC状态更新, state = %s"), transState(pEvtData->u.cStatus));
  167. if(m_state == STATUS_WORKING && State != STATUS_WORKING)
  168. CControlShell::GetInstance().onDevInvalid(DEVICE_MC_NO, DEVICE_MC_NO);
  169. m_state = State;
  170. }
  171. break;
  172. case SYSEV_DSP_STATUS:
  173. {
  174. if (m_DspIsxNo == -1) {
  175. m_DspIsxNo = pEvtData->cIsxNo;
  176. LOGGER(LOG_CLASS_DEV, Level, _T("{MC}: DSP状态更新,设置DSP节点[%d], state = %s"), m_DspIsxNo, transState(pEvtData->u.cStatus));
  177. }
  178. else if (m_DspIsxNo != pEvtData->cIsxNo)
  179. {
  180. LOGGER(LOG_CLASS_DEV, Level, _T("{MC}: DSP状态更新,mDspIsxNo[%d],DSP节点[%d], state = %s"), m_DspIsxNo, pEvtData->cIsxNo, transState(pEvtData->u.cStatus));
  181. }
  182. }
  183. case SYSEV_MB_STATUS:
  184. case SYSEV_PRI_STATUS:
  185. case SYSEV_SS7_STATUS:
  186. case SYSEV_SIP_STATUS:
  187. case SYSEV_XOIP_STATUS:
  188. case SYSEV_SPAN_STATUS:
  189. {
  190. CPBX* pPbx = __getPbx(pEvtData->cIsxNo);
  191. if(pPbx == NULL && State == STATUS_WORKING)
  192. pPbx = __newPbx(pEvtData->cIsxNo);
  193. if(pPbx != NULL)
  194. pPbx->onResourceStateUpdated(EvtType, pEvtData);
  195. }
  196. break;
  197. case SYSEV_PRD_STATUS:
  198. {
  199. LOGGER(LOG_CLASS_DEV, Level, _T("{MC}: PRD[%d]状态更新, state = %s"), pEvtData->cIsxNo, transState(pEvtData->u.cStatus));
  200. if(State == STATUS_WORKING)
  201. {
  202. if(!m_PrdDev.isOpened())
  203. m_PrdDev.open(pEvtData->cIsxNo);
  204. }
  205. else
  206. {
  207. if(m_PrdDev.isOpened() && m_PrdDev.devNo() == pEvtData->cIsxNo)
  208. m_PrdDev.close();
  209. }
  210. }
  211. break;
  212. case SYSEV_FXS_STATUS:
  213. {
  214. LOGGER(LOG_CLASS_DEV, Level, _T("{MC}: Fax设备状态更新, state = %s"), transState(pEvtData->u.cStatus));
  215. if(pEvtData->u.cStatus == STATUS_WORKING)
  216. {
  217. if(!m_FaxDev.isOpened())
  218. m_FaxDev.createFaxChannel();
  219. }
  220. else
  221. {
  222. if(m_FaxDev.isOpened())
  223. m_FaxDev.close();
  224. }
  225. }
  226. break;
  227. }
  228. }
  229. /*****************************************************************
  230. **【函数名称】 __procResourceAlarm
  231. **【函数功能】 设备资源状态告警处理函数
  232. **【参数】
  233. **【返回值】
  234. ****************************************************************/
  235. void CMC::__procResourceAlarm( INT EvtType, SYS_EVT_DATA* pEvtData )
  236. {
  237. CPBX* pPbx = __getPbx(pEvtData->cIsxNo);
  238. if(pPbx != NULL)
  239. pPbx->onResourceAlarm(EvtType, pEvtData);
  240. }
  241. /*****************************************************************
  242. **【函数名称】 __procResourceCapacity
  243. **【函数功能】 设备资源容量处理函数
  244. **【参数】
  245. **【返回值】
  246. ****************************************************************/
  247. void CMC::__procResourceCapacity( INT EvtType, SYS_EVT_DATA* pEvtData )
  248. {
  249. CPBX* pPbx = __getPbx(pEvtData->cIsxNo);
  250. if(pPbx != NULL)
  251. pPbx->onResourceCapacity(EvtType, pEvtData);
  252. }
  253. /*****************************************************************
  254. **【函数名称】 __procVoiceEvent
  255. **【函数功能】 处理语音相关事件
  256. **【参数】
  257. **【返回值】
  258. ****************************************************************/
  259. void CMC::__procVoiceEvent( METAEVENT* pMetaEvent )
  260. {
  261. CDspChannel* pChannel = NULL;
  262. if(ISX_dx_GetUsrAttr(pMetaEvent->evtdev, (void**)&pChannel) != 0)
  263. {
  264. ASSERT(FALSE);
  265. return;
  266. }
  267. ASSERT(pChannel != NULL);
  268. if(pChannel != NULL)
  269. pChannel->onDevEvent(pMetaEvent);
  270. }
  271. /*****************************************************************
  272. **【函数名称】 __procIpmEvent
  273. **【函数功能】 处理IPM通道相关事件
  274. **【参数】
  275. **【返回值】
  276. ****************************************************************/
  277. void CMC::__procIpmEvent( METAEVENT* pMetaEvent )
  278. {
  279. CIpmChannel* pChannel = NULL;
  280. if(ISX_ipm_GetUsrAttr(pMetaEvent->evtdev, (void**)&pChannel) != 0)
  281. {
  282. ASSERT(FALSE);
  283. return;
  284. }
  285. ASSERT(pChannel != NULL);
  286. if(pChannel != NULL)
  287. pChannel->onDevEvent(pMetaEvent);
  288. }
  289. /*****************************************************************
  290. **【函数名称】 __procFaxEvent
  291. **【函数功能】 处理fax通道相关事件
  292. **【参数】
  293. **【返回值】
  294. ****************************************************************/
  295. void CMC::__procFaxEvent( METAEVENT* pMetaEvent )
  296. {
  297. CFaxChannel* pChannel = NULL;
  298. if(ISX_fxs_GetUsrAttr(pMetaEvent->evtdev, (void**)&pChannel) != 0)
  299. {
  300. ASSERT(FALSE);
  301. return;
  302. }
  303. ASSERT(pChannel != NULL);
  304. if(pChannel != NULL)
  305. pChannel->onDevEvent(pMetaEvent);
  306. }
  307. /*****************************************************************
  308. **【函数名称】 __procSipRegEvent
  309. **【函数功能】 处理SIP注册发送事件
  310. **【参数】
  311. **【返回值】
  312. ****************************************************************/
  313. void CMC::__procSipRegSent( void )
  314. {
  315. SEND_SIPREG_RET* pSent = (SEND_SIPREG_RET*)ISX_sr_getevtdatap();
  316. ASSERT(pSent != NULL);
  317. CPBX* pPbx = __getPbx(pSent->RegisterId.ucIsxNo);
  318. ASSERT(pPbx != NULL);
  319. if(pPbx != NULL)
  320. pPbx->onSipRegSent(pSent);
  321. }
  322. /*****************************************************************
  323. **【函数名称】 __procSipRegAck
  324. **【函数功能】 处理SIP注册确认事件
  325. **【参数】
  326. **【返回值】
  327. ****************************************************************/
  328. void CMC::__procSipRegAck( void )
  329. {
  330. SIP_REGISTER_ACK* pAck = (SIP_REGISTER_ACK*)ISX_sr_getevtdatap();
  331. ASSERT(pAck != NULL);
  332. CPBX* pPbx = __getPbx(pAck->RegisterId.ucIsxNo);
  333. ASSERT(pPbx != NULL);
  334. if(pPbx != NULL)
  335. pPbx->onSipRegAck(pAck);
  336. }
  337. /*****************************************************************
  338. **【函数名称】 __procSipTransaction
  339. **【函数功能】 收到SIP事务事件的处理函数
  340. **【参数】
  341. **【返回值】
  342. ****************************************************************/
  343. void CMC::__procSipTransaction( void )
  344. {
  345. SIP_TRANSACTION_IND* pTransaction = (SIP_TRANSACTION_IND*)ISX_sr_getevtdatap();
  346. ASSERT(pTransaction != NULL);
  347. CPBX* pPbx = __getPbx(pTransaction->ucIsxNo);
  348. ASSERT(pPbx != NULL);
  349. if(pPbx != NULL)
  350. pPbx->onSipTransaction(pTransaction);
  351. }
  352. /*****************************************************************
  353. **【函数名称】 __onGcEvent
  354. **【函数功能】 GC事件处理函数
  355. **【参数】
  356. **【返回值】
  357. ****************************************************************/
  358. void CMC::__onGcEvent(METAEVENT* pMetaEvent)
  359. {
  360. CHAR SignallingType;
  361. ISX_gc_SignallingType(pMetaEvent->evtdev, &SignallingType);
  362. if(SignallingType == eGCPro_SIP)
  363. {
  364. CVoipChannel* pChannel = NULL;
  365. if(ISX_gc_GetUsrAttr(pMetaEvent->evtdev, (void**)&pChannel) != GC_SUCCESS)
  366. {
  367. ASSERT(FALSE);
  368. return;
  369. }
  370. ASSERT(pChannel != NULL);
  371. if(pChannel != NULL)
  372. pChannel->onDevEvent(pMetaEvent);
  373. }
  374. else
  375. {
  376. CSpanChannel* pChannel = NULL;
  377. if(ISX_gc_GetUsrAttr(pMetaEvent->evtdev, (void**)&pChannel) != GC_SUCCESS)
  378. {
  379. ASSERT(FALSE);
  380. return;
  381. }
  382. ASSERT(pChannel != NULL);
  383. if(pChannel != NULL)
  384. pChannel->onDevEvent(pMetaEvent);
  385. }
  386. }
  387. /*****************************************************************
  388. **【函数名称】 __onSysEvent
  389. **【函数功能】 系统事件处理函数
  390. **【参数】
  391. **【返回值】
  392. ****************************************************************/
  393. void CMC::__onSysEvent(METAEVENT* pMetaEvent)
  394. {
  395. switch(pMetaEvent->evttype)
  396. {
  397. case TDX_ERROR:
  398. case TDX_PLAY:
  399. case TDX_PLAYBEGIN:
  400. case TDX_RECORD:
  401. case TDX_RECBEGIN:
  402. case TDX_GETDIG:
  403. __procVoiceEvent(pMetaEvent);
  404. break;
  405. case SYSEV_SIP_REGUSER_NEW:
  406. __onSipUserNew();
  407. break;
  408. case SYSEV_SIP_REGUSER_DEL:
  409. __onSipUserDel();
  410. break;
  411. case IPMEV_ANSWER:
  412. case IPMEV_SET_PARM:
  413. case IPMEV_FAX:
  414. __procIpmEvent(pMetaEvent);
  415. break;
  416. case TFX_FAXERROR:
  417. case TFX_STARTOP_ERR:
  418. case TFX_FAXRECV:
  419. case TFX_FAXSEND:
  420. __procFaxEvent(pMetaEvent);
  421. break;
  422. case SYSEV_MC_STATUS:
  423. case SYSEV_MB_STATUS:
  424. case SYSEV_DSP_STATUS:
  425. case SYSEV_PRD_STATUS:
  426. case SYSEV_PRI_STATUS:
  427. case SYSEV_SS7_STATUS:
  428. case SYSEV_SIP_STATUS:
  429. case SYSEV_XOIP_STATUS:
  430. case SYSEV_SPAN_STATUS:
  431. case SYSEV_FXS_STATUS:
  432. __procResourceStateUpdate(pMetaEvent->evttype, (SYS_EVT_DATA*)pMetaEvent->evtdatap);
  433. break;
  434. case SYSEV_SPAN_ALARM:
  435. case SYSEV_PRIDCH_ALARM:
  436. case SYSEV_S7LINK_ALARM:
  437. __procResourceAlarm(pMetaEvent->evttype, (SYS_EVT_DATA*)pMetaEvent->evtdatap);
  438. break;
  439. case SYSEV_DSP_BRD_CAP:
  440. case SYSEV_SIP_BRD_CAP:
  441. case SYSEV_XOIP_BRD_CAP:
  442. __procResourceCapacity(pMetaEvent->evttype, (SYS_EVT_DATA*)pMetaEvent->evtdatap);
  443. break;
  444. case SYSEV_SIP_REGISTERSENT:
  445. __procSipRegSent();
  446. break;
  447. case SYSEV_SIP_RECVREGISTERACK:
  448. __procSipRegAck();
  449. break;
  450. case SYSEV_SIP_RECVTRANSACTION:
  451. __procSipTransaction();
  452. break;
  453. default:
  454. break;
  455. }
  456. }
  457. /*****************************************************************
  458. **【函数名称】 __pbxEvtThread
  459. **【函数功能】 设备事件处理线程
  460. **【参数】
  461. **【返回值】
  462. ****************************************************************/
  463. UINT CMC::__pbxEvtThread( LPVOID pParam )
  464. {
  465. CMC* pSelf = (CMC*)pParam;
  466. ASSERT(pSelf != NULL);
  467. int Res;
  468. METAEVENT metaevt;
  469. while (!pSelf->m_Stop)
  470. {
  471. Res = ISX_sr_waitevt(DEVICE_WAIT_TIME);
  472. if(Res != 0)
  473. continue;
  474. ISX_gc_GetMetaEvent(&metaevt);
  475. if(metaevt.flags & GCME_GC_EVENT) // global call event
  476. pSelf->__onGcEvent(&metaevt);
  477. else
  478. pSelf->__onSysEvent(&metaevt);
  479. }
  480. return 0;
  481. }
  482. /*****************************************************************
  483. **【函数名称】 open
  484. **【函数功能】 设备打开
  485. **【参数】
  486. **【返回值】 成功true,失败false
  487. ****************************************************************/
  488. bool CMC::open( void )
  489. {
  490. //m_ConfigLocal.load();
  491. LOGGER(LOG_CLASS_DEV, LOG_LEVEL_NORMAL, _T("{MC}: 开始初始化PBX设备"));
  492. m_DspIsxNo = -1;
  493. INT AutoDeleteDay = 2;
  494. ISX_sr_SetSysParam(SYS_PARMID_DAYNUM_FOR_AUTO_DELETE_LOG, &AutoDeleteDay);
  495. ISX_sr_Log2File(DEVICE_LOG_PATH);
  496. ISXE_gc_SipSetRegisterMode(SIP_REGMODE_INNER_AUTH);
  497. if(ISX_Api_Init(CConfig::mcAddr(), CConfig::mcPort(), DEVICE_KEEP_ALIVE) != 0)
  498. {
  499. LOGGER(LOG_CLASS_DEV, LOG_LEVEL_ERROR, _T("{MC}: 设备初始化失败"));
  500. return false;
  501. }
  502. __regExten2Dev();
  503. /*if(!m_FaxDev.open())
  504. {
  505. ISX_Api_Uninit();
  506. LOGGER(LOG_CLASS_DEV, LOG_LEVEL_ERROR, _T("{MC}: 设备初始化失败"));
  507. return false;
  508. }*/
  509. m_Stop = false;
  510. m_pThreadObj = AfxBeginThread(__pbxEvtThread, this);
  511. return true;
  512. }
  513. /*****************************************************************
  514. **【函数名称】 close
  515. **【函数功能】 设备关闭
  516. **【参数】
  517. **【返回值】
  518. ****************************************************************/
  519. void CMC::close( void )
  520. {
  521. m_Stop = true;
  522. ISX_Api_Uninit();
  523. /*if(m_pThreadObj != NULL)
  524. {
  525. DWORD ExitCode;
  526. GetExitCodeThread(m_pThreadObj->m_hThread, &ExitCode);
  527. if(ExitCode == STILL_ACTIVE)
  528. WaitForSingleObject(m_pThreadObj->m_hThread, INFINITE);
  529. m_pThreadObj = NULL;
  530. }*/
  531. }
  532. /*****************************************************************
  533. **【函数名称】 transState
  534. **【函数功能】 翻译状态码
  535. **【参数】
  536. **【返回值】
  537. ****************************************************************/
  538. LPCTSTR CMC::transState( INT Status )
  539. {
  540. switch(Status)
  541. {
  542. case STATUS_RESET: return "reset";
  543. case STATUS_OUT_OF_SRV: return "out of service";
  544. case STATUS_REQ_STOP: return "request stop";
  545. case STATUS_WORKING: return "working";
  546. default: break;
  547. }
  548. return "unknown state";
  549. }
  550. /*****************************************************************
  551. **【函数名称】 allocVoipCh
  552. **【函数功能】 为分机分配空闲VOIP线路
  553. **【参数】
  554. **【返回值】
  555. ****************************************************************/
  556. CVoipChannel* CMC::allocVoipCh4Exten( int IsxNo )
  557. {
  558. CVoipChannel* pChan = NULL;
  559. for(int i = 0; i < m_PbxList.GetCount(); ++i)
  560. {
  561. CPBX* pPbx = m_PbxList[i];
  562. ASSERT(pPbx != NULL);
  563. if(IsxNo == DEVICE_NODE_NO_ANY || pPbx->pbxNo() == IsxNo)
  564. {
  565. pChan = pPbx->allocVoipCh4Exten();
  566. if(pChan != NULL)
  567. break;
  568. }
  569. }
  570. return pChan;
  571. }
  572. /*****************************************************************
  573. **【函数名称】 allocIpmCh
  574. **【函数功能】 通道分配IPM通道
  575. **【参数】
  576. **【返回值】
  577. ****************************************************************/
  578. CIpmChannel* CMC::allocIpmCh4SipCh( int IsxNo, int BoardNo )
  579. {
  580. CPBX* pPbx = __getPbx(IsxNo);
  581. ASSERT(pPbx != NULL);
  582. if(pPbx != NULL)
  583. {
  584. ULONG SipNetId = pPbx->getVoipNetId(BoardNo);
  585. CIpmChannel* pChan = NULL;
  586. for(int i = 0; i < m_PbxList.GetCount(); ++i)
  587. {
  588. pChan = m_PbxList[i]->allocIpmCh(SipNetId);
  589. if(pChan != NULL)
  590. break;
  591. }
  592. return pChan;
  593. }
  594. else
  595. return NULL;
  596. }
  597. /*****************************************************************
  598. **【函数名称】 allocDspCh
  599. **【函数功能】 分配DSP通道
  600. **【参数】
  601. **【返回值】
  602. ****************************************************************/
  603. CDspChannel* CMC::allocDspCh( int IsxNo, int BoardNo )
  604. {
  605. //CPBX* pPbx = __getPbx(IsxNo);
  606. //2018.4.9
  607. CPBX* pPbx = __getPbx(m_DspIsxNo);
  608. ASSERT(pPbx != NULL);
  609. if(pPbx != NULL)
  610. return pPbx->allocDspCh(BoardNo);
  611. else
  612. return NULL;
  613. }
  614. /*****************************************************************
  615. **【函数名称】 allocFreeTrunk
  616. **【函数功能】 分配空闲中继线路
  617. **【参数】
  618. **【返回值】
  619. ****************************************************************/
  620. COneLeg* CMC::allocFreeTrunk( int IsxNo, int BoardNo, int SpanNo )
  621. {
  622. CPBX* pPbx = __getPbx(IsxNo);
  623. ASSERT(pPbx != NULL);
  624. if(pPbx != NULL)
  625. return pPbx->allocFreeTrunk(BoardNo, SpanNo);
  626. else
  627. return NULL;
  628. }
  629. /*****************************************************************
  630. **【函数名称】 getCallLeg
  631. **【函数功能】 查找通话线路
  632. **【参数】
  633. **【返回值】
  634. ****************************************************************/
  635. COneLeg* CMC::getCallLeg( CRDRID ResId )
  636. {
  637. CPBX* pPbx = __getPbx(ResId.NodeNo);
  638. ASSERT(pPbx != NULL);
  639. if(pPbx != NULL)
  640. return pPbx->findLeg(ResId);
  641. else
  642. return NULL;
  643. }
  644. /*****************************************************************
  645. **【函数名称】 isPbxOK
  646. **【函数功能】 设备状态是否正常
  647. **【参数】
  648. **【返回值】
  649. ****************************************************************/
  650. bool CMC::isPbxOK( int IsxNo )
  651. {
  652. CPBX* pPbx = __getPbx(IsxNo);
  653. if(pPbx != NULL)
  654. return pPbx->isOk();
  655. else
  656. return false;
  657. }
  658. /*****************************************************************
  659. **【函数名称】 onPbxResValid
  660. **【函数功能】 设备资源处于可用状态的处理函数
  661. **【参数】
  662. **【返回值】
  663. ****************************************************************/
  664. void CMC::onPbxResValid( int IsxNo )
  665. {
  666. CControlShell::GetInstance().onDevValid(IsxNo);
  667. }
  668. /*****************************************************************
  669. **【函数名称】 onPbxResInvalid
  670. **【函数功能】 设备资源处于不可用状态的处理函数
  671. **【参数】
  672. **【返回值】
  673. ****************************************************************/
  674. void CMC::onPbxResInvalid( int IsxNo, int BoardNo, DEV_RES_TYPE ResType )
  675. {
  676. LOGGER(LOG_CLASS_DEV, LOG_LEVEL_ERROR, _T("{MC}: %s[%d-%d]状态不可用"), __translateResType(ResType), IsxNo, BoardNo);
  677. CControlShell::GetInstance().onDevInvalid(IsxNo, BoardNo);
  678. }
  679. /*****************************************************************
  680. **【函数名称】 onDevResCreate
  681. **【函数功能】 设备资源创建的处理函数
  682. **【参数】
  683. **【返回值】
  684. ****************************************************************/
  685. void CMC::onDevResCreate( CRDRID ResId )
  686. {
  687. switch(ResId.ResType)
  688. {
  689. case DEV_RES_TYPE_TRUNK:
  690. case DEV_RES_TYPE_VOIP:
  691. CSessionShell::GetInstance().onDevResourceNew(ResId);
  692. #ifdef _SC_UI_MODE
  693. case DEV_RES_TYPE_IPM:
  694. case DEV_RES_TYPE_DSP:
  695. {
  696. CMsgCenter::GetInstance().pushMsg(SYS_MSG_RES_NEW, &ResId);
  697. }
  698. #endif
  699. break;
  700. }
  701. }
  702. /*****************************************************************
  703. **【函数名称】 onDevResDestroy
  704. **【函数功能】 设备资源销毁的处理函数
  705. **【参数】
  706. **【返回值】
  707. ****************************************************************/
  708. void CMC::onDevResDestroy( CRDRID ResId )
  709. {
  710. switch(ResId.ResType)
  711. {
  712. case DEV_RES_TYPE_TRUNK:
  713. case DEV_RES_TYPE_VOIP:
  714. CSessionShell::GetInstance().onDevResourceDel(ResId);
  715. #ifdef _SC_UI_MODE
  716. case DEV_RES_TYPE_IPM:
  717. case DEV_RES_TYPE_DSP:
  718. {
  719. CMsgCenter::GetInstance().pushMsg(SYS_MSG_RES_DEL, &ResId);
  720. }
  721. #endif
  722. break;
  723. }
  724. }
  725. /*****************************************************************
  726. **【函数名称】 onDevResState
  727. **【函数功能】 设备资源状态变化的处理函数
  728. **【参数】
  729. **【返回值】
  730. ****************************************************************/
  731. void CMC::onDevResState( CRDRID ResId )
  732. {
  733. #ifdef _SC_UI_MODE
  734. switch(ResId.ResType)
  735. {
  736. case DEV_RES_TYPE_TRUNK:
  737. case DEV_RES_TYPE_VOIP:
  738. case DEV_RES_TYPE_IPM:
  739. case DEV_RES_TYPE_DSP:
  740. CMsgCenter::GetInstance().pushMsg(SYS_MSG_RES_STATE, &ResId);
  741. break;
  742. }
  743. #endif
  744. }
  745. /*****************************************************************
  746. **【函数名称】 bridgeDevice
  747. **【函数功能】 设备双向连接/断开
  748. **【参数】 SrcId 源端设备ID
  749. DstId 目标设备ID
  750. IsLink 是否连接
  751. **【返回值】
  752. ****************************************************************/
  753. bool CMC::bridgeDevice( CRDRID SrcId, CRDRID DstId, bool IsLink )
  754. {
  755. COneLeg* pLegA = getCallLeg(SrcId);
  756. if(pLegA == NULL)
  757. return false;
  758. COneLeg* pLegB = getCallLeg(DstId);
  759. if(pLegB == NULL)
  760. return false;
  761. return bridgeDevice(pLegA->routeChannel(), pLegB->routeChannel(), IsLink, false);
  762. }
  763. /*****************************************************************
  764. **【函数名称】 bridgeDevice
  765. **【函数功能】 设备双向连接/断开
  766. **【参数】
  767. **【返回值】
  768. ****************************************************************/
  769. bool CMC::bridgeDevice( CChannelResource* pChanSrc, CChannelResource* pChanDst, bool IsLink, bool IsOneWay )
  770. {
  771. if(pChanSrc == NULL || pChanDst == NULL)
  772. return false;
  773. UCHAR mode = IsOneWay ? SC_HALFDUP : SC_FULLDUP;
  774. if(IsLink)
  775. return ISX_nr_scroute(pChanSrc->handle(), pChanSrc->type(), pChanDst->handle(), pChanDst->type(), mode) == 0;
  776. else
  777. return ISX_nr_scunroute(pChanSrc->handle(), pChanSrc->type(), pChanDst->handle(), pChanDst->type(), mode) == 0;
  778. }
  779. /*****************************************************************
  780. **【函数名称】 channelListen
  781. **【函数功能】 监听指定线路
  782. **【参数】 SrcId 源端设备ID
  783. PeerId 对端设备ID
  784. DstId 目标设备ID
  785. IsLink 是否连接
  786. **【返回值】
  787. ****************************************************************/
  788. bool CMC::channelListen( CRDRID SrcId, CRDRID PeerId, CRDRID DstId, bool IsLink )
  789. {
  790. // 查找监听主控线路
  791. COneLeg* pLegHost = getCallLeg(DstId);
  792. if(pLegHost == NULL)
  793. return false;
  794. // 查找被监听线路
  795. COneLeg* pLegSrc = getCallLeg(SrcId);
  796. if(pLegHost == NULL)
  797. return false;
  798. return pLegHost->monitor(pLegSrc, !IsLink);
  799. }
  800. /*****************************************************************
  801. **【函数名称】 meetingListen
  802. **【函数功能】 监听指定会议
  803. **【参数】
  804. **【返回值】
  805. ****************************************************************/
  806. bool CMC::meetingListen( CRDRID DstId, MeetingInfo& MeetingId, bool IsLink )
  807. {
  808. //CPBX* pPbx = __getPbx(MeetingId.NodeNo);
  809. //2018.4.9
  810. CPBX* pPbx = __getPbx(m_DspIsxNo);
  811. ASSERT(pPbx != NULL);
  812. // 查找监听主控线路
  813. COneLeg* pLegHost = getCallLeg(DstId);
  814. if(pLegHost == NULL)
  815. return false;
  816. if(IsLink)
  817. return pPbx->meetingJoin(MeetingId.BoardNo, pLegHost, MeetingId, true);
  818. else
  819. return pPbx->meetingRemove(MeetingId.BoardNo, pLegHost, MeetingId);
  820. }
  821. /*****************************************************************
  822. **【函数名称】 meetingMute
  823. **【函数功能】 静音会议中线路
  824. **【参数】
  825. **【返回值】
  826. ****************************************************************/
  827. bool CMC::meetingMute( CRDRID DstId, MeetingInfo& MeetingId, bool IsOff )
  828. {
  829. //CPBX* pPbx = __getPbx(MeetingId.NodeNo);
  830. //2018.4.9
  831. CPBX* pPbx = __getPbx(m_DspIsxNo);
  832. ASSERT(pPbx != NULL);
  833. // 查找静音主控线路
  834. COneLeg* pLegHost = getCallLeg(DstId);
  835. if(pLegHost == NULL)
  836. return false;
  837. return pPbx->meetingMute(MeetingId.BoardNo, pLegHost, MeetingId, IsOff);
  838. }
  839. /*****************************************************************
  840. **【函数名称】 meetingRemove
  841. **【函数功能】 线路离开会议
  842. **【参数】
  843. **【返回值】
  844. ****************************************************************/
  845. bool CMC::meetingRemove( COneLeg* pLeg, MeetingInfo& MeetingId )
  846. {
  847. //CPBX* pPbx = __getPbx(MeetingId.NodeNo);
  848. //2018.4.9
  849. CPBX* pPbx = __getPbx(m_DspIsxNo);
  850. ASSERT(pPbx != NULL);
  851. return pPbx->meetingRemove(MeetingId.BoardNo, pLeg, MeetingId);
  852. }
  853. /*****************************************************************
  854. **【函数名称】 meetingRecord
  855. **【函数功能】 会议录音
  856. **【参数】
  857. **【返回值】
  858. ****************************************************************/
  859. bool CMC::meetingRecord( COneLeg* pLeg, MeetingInfo& MeetingId, RecordContent* pContent, bool IsStop )
  860. {
  861. //CPBX* pPbx = __getPbx(MeetingId.NodeNo);
  862. //2018.4.9
  863. CPBX* pPbx = __getPbx(m_DspIsxNo);
  864. ASSERT(pPbx != NULL);
  865. return pPbx->meetingRecord(MeetingId.BoardNo, pLeg, MeetingId, pContent, IsStop);
  866. }
  867. /************************* ****************************************
  868. **【函数名称】 setSessionInfo2Line
  869. **【函数功能】 设定当前线路关联的会话
  870. **【参数】 LineId 线路ID
  871. SessionCode 会话ID
  872. **【返回值】
  873. ****************************************************************/
  874. void CMC::setSessionInfo2Line( CRDRID LineId, long SessionCode )
  875. {
  876. COneLeg* pLeg = getCallLeg(LineId);
  877. ASSERT(pLeg != NULL);
  878. if(pLeg != NULL)
  879. pLeg->sessionCode() = SessionCode;
  880. }
  881. /*****************************************************************
  882. **【函数名称】 startRecord
  883. **【函数功能】 线路录音启动
  884. **【参数】 LineId 要进行录音的线路ID
  885. pContent 录音内容
  886. **【返回值】
  887. ****************************************************************/
  888. bool CMC::startRecord( CRDRID LineId, RecordContent* pContent )
  889. {
  890. // 查找录音主控线路
  891. COneLeg* pLegHost = getCallLeg(LineId);
  892. ASSERT(pLegHost != NULL);
  893. if(pLegHost == NULL)
  894. return false;
  895. return pLegHost->startRecord(pContent);
  896. }
  897. /*****************************************************************
  898. **【函数名称】 stopRecord
  899. **【函数功能】 线路录音结束
  900. **【参数】 LineId 要停止录音的线路ID
  901. **【返回值】
  902. ****************************************************************/
  903. bool CMC::stopRecord( CRDRID LineId )
  904. {
  905. // 查找录音主控线路
  906. COneLeg* pLegHost = getCallLeg(LineId);
  907. ASSERT(pLegHost != NULL);
  908. if(pLegHost == NULL)
  909. return false;
  910. return pLegHost->stopRecord();
  911. }
  912. /*****************************************************************
  913. **【函数名称】 move2Meeting
  914. **【函数功能】 线路加入会议
  915. **【参数】 LineId 要加入会议的的线路ID
  916. ConfId 要加入的会议ID
  917. **【返回值】
  918. ****************************************************************/
  919. bool CMC::move2Meeting( CRDRID LineId, MeetingInfo& MeetId, bool IsOneWay )
  920. {
  921. //CPBX* pPbx = __getPbx(MeetId.NodeNo);
  922. //2018.4.9
  923. CPBX* pPbx = __getPbx(m_DspIsxNo);
  924. ASSERT(pPbx != NULL);
  925. // 查找线路
  926. COneLeg* pLegHost = getCallLeg(LineId);
  927. if(pLegHost == NULL)
  928. return false;
  929. return pPbx->meetingJoin(MeetId.BoardNo, pLegHost, MeetId, IsOneWay);
  930. }
  931. /*****************************************************************
  932. **【函数名称】 removeFromMeeting
  933. **【函数功能】 线路离开会议
  934. **【参数】 LineId 要离开会议的线路ID
  935. ConfId 要离开的会议ID
  936. **【返回值】
  937. ****************************************************************/
  938. bool CMC::removeFromMeeting( CRDRID LineId, MeetingInfo& MeetId )
  939. {
  940. CPBX* pPbx = __getPbx(MeetId.NodeNo);
  941. ASSERT(pPbx != NULL);
  942. // 查找线路
  943. COneLeg* pLegHost = getCallLeg(LineId);
  944. if(pLegHost == NULL)
  945. return false;
  946. return pPbx->meetingRemove(MeetId.BoardNo, pLegHost, MeetId);
  947. }
  948. /*****************************************************************
  949. **【函数名称】 playSound
  950. **【函数功能】 线路放音收号操作
  951. **【参数】 LineId 要放音的线路ID
  952. pContend 放音内容
  953. **【返回值】
  954. ****************************************************************/
  955. bool CMC::playSound( CRDRID LineId, PlayVoiceContent* pContent )
  956. {
  957. COneLeg* pLeg = getCallLeg(LineId);
  958. ASSERT(pLeg != NULL);
  959. if(pLeg == NULL)
  960. return false;
  961. return pLeg->playSound(pContent);
  962. }
  963. /*****************************************************************
  964. **【函数名称】 playStop
  965. **【函数功能】 线路停止放音操作
  966. **【参数】 LineId 要停止放音的线路ID
  967. **【返回值】
  968. ****************************************************************/
  969. bool CMC::playStop( CRDRID LineId )
  970. {
  971. COneLeg* pLeg = getCallLeg(LineId);
  972. ASSERT(pLeg != NULL);
  973. if(pLeg == NULL)
  974. return false;
  975. return pLeg->playStop();
  976. }
  977. /*****************************************************************
  978. **【函数名称】 dropCall
  979. **【函数功能】 线路挂机操作处理
  980. **【参数】 LineId 要挂机的线路ID
  981. bIsPassive 是否为被动挂机
  982. **【返回值】
  983. ****************************************************************/
  984. bool CMC::dropCall( CRDRID LineId, bool IsPassive )
  985. {
  986. COneLeg* pLeg = getCallLeg(LineId);
  987. ASSERT(pLeg != NULL);
  988. if(pLeg == NULL)
  989. return false;
  990. return pLeg->dropCall(IsPassive);
  991. }
  992. /*****************************************************************
  993. **【函数名称】 dial
  994. **【函数功能】 线路拨号
  995. **【参数】 LineId 要启动拨号的线路ID
  996. lpCalleeNum 被叫号码
  997. lpCallerNum 主叫号码
  998. **【返回值】
  999. ****************************************************************/
  1000. bool CMC::dial( CRDRID LineId, LPCTSTR Callee, LPCTSTR Caller, int AccountId )
  1001. {
  1002. COneLeg* pLeg = getCallLeg(LineId);
  1003. ASSERT(pLeg != NULL);
  1004. if(pLeg == NULL)
  1005. return false;
  1006. return pLeg->makeCall(Callee, Caller, AccountId);
  1007. }
  1008. /*****************************************************************
  1009. **【函数名称】 answer
  1010. **【函数功能】 应答呼叫
  1011. **【参数】 LineId 要应答呼叫的线路ID
  1012. **【返回值】
  1013. ****************************************************************/
  1014. bool CMC::answer( CRDRID LineId )
  1015. {
  1016. COneLeg* pLeg = getCallLeg(LineId);
  1017. ASSERT(pLeg != NULL);
  1018. if(pLeg == NULL)
  1019. return false;
  1020. return pLeg->answer();
  1021. }
  1022. /*****************************************************************
  1023. **【函数名称】 offHook
  1024. **【函数功能】 通知内线摘机(只对内线有效)
  1025. **【参数】 LineId 要进行摘机的线路ID
  1026. **【返回值】
  1027. ****************************************************************/
  1028. bool CMC::offHook( CRDRID LineId, bool IgnoreSession, LPCTSTR CallerNum /*= NULL*/ )
  1029. {
  1030. COneLeg* pLeg = getCallLeg(LineId);
  1031. ASSERT(pLeg != NULL);
  1032. if(pLeg == NULL)
  1033. return false;
  1034. return pLeg->offhook(IgnoreSession, CallerNum);
  1035. }
  1036. /*****************************************************************
  1037. **【函数名称】 fax
  1038. **【函数功能】 传真启动(只对外线有效)
  1039. **【参数】 LineId 要启动传真的线路
  1040. lpFileName 传真文件名
  1041. IsRevc 接收/发送
  1042. **【返回值】
  1043. ****************************************************************/
  1044. bool CMC::fax( CRDRID LineId, LPCTSTR lpFileName, bool IsRecv )
  1045. {
  1046. COneLeg* pLeg = getCallLeg(LineId);
  1047. ASSERT(pLeg != NULL);
  1048. if(pLeg == NULL)
  1049. return false;
  1050. if(IsRecv)
  1051. return m_FaxDev.recv(pLeg, lpFileName);
  1052. else
  1053. return m_FaxDev.send(pLeg, lpFileName);
  1054. }
  1055. /*****************************************************************
  1056. **【函数名称】 selfCheck
  1057. **【函数功能】 线路自检(只对模拟外线有效)
  1058. **【参数】 LineId 要进行自检的线路ID
  1059. **【返回值】
  1060. ****************************************************************/
  1061. bool CMC::selfCheck( CRDRID LineId )
  1062. {
  1063. COneLeg* pLeg = getCallLeg(LineId);
  1064. ASSERT(pLeg != NULL);
  1065. if(pLeg == NULL)
  1066. return false;
  1067. return pLeg->check();
  1068. }
  1069. /*****************************************************************
  1070. **【函数名称】 playTone
  1071. **【函数功能】 线路播放信号音
  1072. **【参数】 LineId 要播放信号音的线路ID
  1073. Type 信号音类型
  1074. **【返回值】
  1075. ****************************************************************/
  1076. bool CMC::playTone( CRDRID LineId, int Type )
  1077. {
  1078. COneLeg* pLeg = getCallLeg(LineId);
  1079. ASSERT(pLeg != NULL);
  1080. if(pLeg == NULL)
  1081. return false;
  1082. return pLeg->playTone(Type);
  1083. }
  1084. /*****************************************************************
  1085. **【函数名称】 createMeeting
  1086. **【函数功能】 创建会议
  1087. **【参数】
  1088. **【返回值】
  1089. ****************************************************************/
  1090. bool CMC::createMeeting( CRDRID LineId, MeetingInfo& MeetInfo )
  1091. {
  1092. //CPBX* pPbx = __getPbx(LineId.NodeNo);
  1093. //2018.4.9
  1094. CPBX* pPbx = __getPbx(m_DspIsxNo);
  1095. ASSERT(pPbx != NULL);
  1096. if (pPbx == NULL)
  1097. return false;
  1098. return pPbx->meetingCreate(DEVICE_BRD_NO_ANY, MeetInfo);
  1099. }
  1100. /*****************************************************************
  1101. **【函数名称】 deleteMeeting
  1102. **【函数功能】 创建会议
  1103. **【参数】
  1104. **【返回值】
  1105. ****************************************************************/
  1106. void CMC::deleteMeeting( MeetingInfo& MeetInfo )
  1107. {
  1108. //CPBX* pPbx = __getPbx(MeetInfo.NodeNo);
  1109. //2018.4.9
  1110. CPBX* pPbx = __getPbx(m_DspIsxNo);
  1111. ASSERT(pPbx != NULL);
  1112. return pPbx->meetingDelete(MeetInfo);
  1113. }
  1114. /*****************************************************************
  1115. **【函数名称】 freeChanResource
  1116. **【函数功能】 释放绑定资源
  1117. **【参数】
  1118. **【返回值】
  1119. ****************************************************************/
  1120. void CMC::freeChanResource( CRDRID LineId )
  1121. {
  1122. COneLeg* pLeg = getCallLeg(LineId);
  1123. ASSERT(pLeg != NULL);
  1124. if(pLeg == NULL)
  1125. return;
  1126. return pLeg->freeResBinded();
  1127. }
  1128. /*****************************************************************
  1129. **【函数名称】 findIpmCh
  1130. **【函数功能】 查找IPM通道
  1131. **【参数】
  1132. **【返回值】
  1133. ****************************************************************/
  1134. CIpmChannel* CMC::findIpmCh( CRDRID ResId )
  1135. {
  1136. CPBX* pPbx = __getPbx(ResId.NodeNo);
  1137. ASSERT(pPbx != NULL);
  1138. return pPbx->findIpmCh(ResId);
  1139. }
  1140. /*****************************************************************
  1141. **【函数名称】 findDspCh
  1142. **【函数功能】 查找DSP通道
  1143. **【参数】
  1144. **【返回值】
  1145. ****************************************************************/
  1146. CDspChannel* CMC::findDspCh( CRDRID ResId )
  1147. {
  1148. //CPBX* pPbx = __getPbx(ResId.NodeNo);2018.4.9
  1149. CPBX* pPbx = __getPbx(m_DspIsxNo);
  1150. ASSERT(pPbx != NULL);
  1151. return pPbx->findDspCh(ResId);
  1152. }
  1153. /*****************************************************************
  1154. **【函数名称】 findVoipCh
  1155. **【函数功能】 查找VOIP通道
  1156. **【参数】
  1157. **【返回值】
  1158. ****************************************************************/
  1159. CVoipChannel* CMC::findVoipCh( CRDRID ResId )
  1160. {
  1161. CPBX* pPbx = __getPbx(ResId.NodeNo);
  1162. ASSERT(pPbx != NULL);
  1163. return pPbx->findVoipCh(ResId);
  1164. }
  1165. /*****************************************************************
  1166. **【函数名称】 findSpanCh
  1167. **【函数功能】 查找SPAN通道
  1168. **【参数】
  1169. **【返回值】
  1170. ****************************************************************/
  1171. CSpanChannel* CMC::findSpanCh( CRDRID ResId )
  1172. {
  1173. CPBX* pPbx = __getPbx(ResId.NodeNo);
  1174. ASSERT(pPbx != NULL);
  1175. return pPbx->findSpanCh(ResId);
  1176. }