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

AvayaLinkGw.cpp 22KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802
  1. #include "StdAfx.h"
  2. #include "AvayaLinkGw.h"
  3. #include "VsControl.h"
  4. #include "TapiControl.h"
  5. #include "TrunkContainer.h"
  6. CAvayaLinkGw::CAvayaLinkGw(void)
  7. {
  8. __init();
  9. }
  10. CAvayaLinkGw::~CAvayaLinkGw(void)
  11. {
  12. }
  13. /*****************************************************************
  14. **【函数名称】 __init
  15. **【函数功能】 成员变量初始化
  16. **【参数】
  17. **【返回值】
  18. ****************************************************************/
  19. void CAvayaLinkGw::__init( void )
  20. {
  21. m_EventType = DEV_LINK_EVENT_TYPE_S;
  22. m_CallId = CONST_DEV_LINK_CALL_NULL;
  23. m_AState = CSIdle;
  24. m_BState = CSIdle;
  25. m_AConnected = -1;
  26. m_BConnected = -1;
  27. ZeroMemory(m_ASlot, MAX_FIELD_LEN);
  28. ZeroMemory(m_BSlot, MAX_FIELD_LEN);
  29. m_IsInternalCall = -1;
  30. ZeroMemory(m_AName, MAX_FIELD_LEN);
  31. ZeroMemory(m_BName, MAX_FIELD_LEN);
  32. ZeroMemory(m_BList, MAX_FIELD_LEN);
  33. ZeroMemory(m_TargetUserName, MAX_FIELD_LEN);
  34. ZeroMemory(m_ParkSlotNum, MAX_FIELD_LEN);
  35. ZeroMemory(m_Tag, MAX_FIELD_LEN);
  36. ZeroMemory(m_AccountCode, MAX_FIELD_LEN);
  37. ZeroMemory(m_CallerNum, MAX_FIELD_LEN);
  38. ZeroMemory(m_CalleeNum, MAX_FIELD_LEN);
  39. }
  40. /*****************************************************************
  41. **【函数名称】 __getFieldPosition
  42. **【函数功能】 取得指定消息域的位置
  43. **【参数】 Pos 消息域类型
  44. Info DevLink消息串
  45. **【返回值】 起始位置
  46. ****************************************************************/
  47. int CAvayaLinkGw::__getFieldPosition( int Field, char* Info )
  48. {
  49. int Pos = CALL_IDENT_LEN; // skip "CALL:x" identifier, x is 'S', 'D' or 'A'
  50. int Comma = 0;
  51. // count 'nField' comas
  52. while(Comma < Field)
  53. {
  54. if(Info[Pos++] == COMMA)
  55. Comma++;
  56. } // end while
  57. return Pos;
  58. }
  59. /*****************************************************************
  60. **【函数名称】 __getIntFromField
  61. **【函数功能】 取得指定位置的整数值
  62. **【参数】 Pos 起始位置
  63. Info DevLink消息串
  64. **【返回值】
  65. ****************************************************************/
  66. int CAvayaLinkGw::__getIntFromField( int Pos, char* Info )
  67. {
  68. if((Info + Pos) == NULL)
  69. return 0;
  70. else
  71. return atoi(Info + Pos);
  72. }
  73. /*****************************************************************
  74. **【函数名称】 __getStrFromField
  75. **【函数功能】 取得指定位置的字符串
  76. **【参数】 Pos 起始位置
  77. Info DevLink消息串
  78. **【返回值】
  79. ****************************************************************/
  80. void CAvayaLinkGw::__getStrFromField( int Pos, char* Result, char* Info )
  81. {
  82. int Index = 0;
  83. int i = Pos;
  84. ::ZeroMemory(Result, MAX_FIELD_LEN);
  85. // skip white spaces at the begining
  86. while(Info[i] == ' ')
  87. i++;
  88. while((Index < MAX_FIELD_LEN) && (Info[i] != COMMA))
  89. {
  90. Result[Index++] = Info[i++];
  91. } // end while
  92. }
  93. /*****************************************************************
  94. **【函数名称】 __parseEventType
  95. **【函数功能】 解析事件类型
  96. **【参数】 Info DevLink消息串
  97. **【返回值】
  98. ****************************************************************/
  99. void CAvayaLinkGw::__parseEventType( char* Info )
  100. {
  101. m_EventType = DEV_LINK_EVENT_TYPE_S;
  102. char* pTmpStr = strstr(Info, "CALL:");
  103. if(pTmpStr != NULL)
  104. {
  105. switch(pTmpStr[5])
  106. {
  107. case 'S':
  108. m_EventType = DEV_LINK_EVENT_TYPE_S;
  109. break;
  110. case 'D':
  111. m_EventType = DEV_LINK_EVENT_TYPE_D;
  112. break;
  113. case 'A':
  114. m_EventType = DEV_LINK_EVENT_TYPE_A;
  115. break;
  116. } // end switch
  117. } // end if
  118. }
  119. /*****************************************************************
  120. **【函数名称】 __parseEventA
  121. **【函数功能】 解析A事件
  122. **【参数】 Info DevLink消息串
  123. **【返回值】
  124. ****************************************************************/
  125. void CAvayaLinkGw::__parseEventA( char* Info )
  126. {
  127. int Pos = __getFieldPosition(2, Info);
  128. m_CallId = __getIntFromField(Pos, Info);
  129. }
  130. /*****************************************************************
  131. **【函数名称】 __parseEventD
  132. **【函数功能】 解析D事件
  133. **【参数】 Info DevLink消息串
  134. **【返回值】
  135. ****************************************************************/
  136. void CAvayaLinkGw::__parseEventD( char* Info )
  137. {
  138. int Pos = __getFieldPosition(2, Info);
  139. m_CallId = __getIntFromField(Pos, Info);
  140. }
  141. /*****************************************************************
  142. **【函数名称】 __parseEventS
  143. **【函数功能】 解析S事件
  144. **【参数】 Info DevLink消息串
  145. **【返回值】
  146. ****************************************************************/
  147. void CAvayaLinkGw::__parseEventS( char* Info )
  148. {
  149. int Pos = __getFieldPosition(CALL_ID, Info);
  150. m_CallId = __getIntFromField(Pos, Info);
  151. Pos = __getFieldPosition(ASTATE, Info);
  152. m_AState = (DEV_LINK_CALL_STATE)__getIntFromField(Pos, Info);
  153. Pos = __getFieldPosition(BSTATE, Info);
  154. m_BState = (DEV_LINK_CALL_STATE)__getIntFromField(Pos, Info);
  155. Pos = __getFieldPosition(ACONNECTED, Info);
  156. m_AConnected = __getIntFromField(Pos, Info);
  157. Pos = __getFieldPosition(BCONNECTED, Info);
  158. m_BConnected = __getIntFromField(Pos, Info);
  159. Pos = __getFieldPosition(ASLOT, Info);
  160. __getStrFromField(Pos, m_ASlot, Info);
  161. Pos = __getFieldPosition(BSLOT, Info);
  162. __getStrFromField(Pos, m_BSlot, Info);
  163. Pos = __getFieldPosition(CALLING_NUM, Info);
  164. __getStrFromField(Pos, m_CallerNum, Info);
  165. Pos = __getFieldPosition(CALLED_NUM, Info);
  166. __getStrFromField(Pos, m_CalleeNum, Info);
  167. Pos = __getFieldPosition(IS_INTERNAL_CALL, Info);
  168. m_IsInternalCall = __getIntFromField(Pos, Info);
  169. Pos = __getFieldPosition(CALL_ID, Info);
  170. m_CallId = __getIntFromField(Pos, Info);
  171. Pos = __getFieldPosition(ANAME, Info);
  172. __getStrFromField(Pos, m_AName, Info);
  173. Pos = __getFieldPosition(BNAME, Info);
  174. __getStrFromField(Pos, m_BName, Info);
  175. Pos = __getFieldPosition(BLIST, Info);
  176. __getStrFromField(Pos, m_BList, Info);
  177. Pos = __getFieldPosition(TARG_UNAME, Info);
  178. __getStrFromField(Pos, m_TargetUserName, Info);
  179. Pos = __getFieldPosition(PARK_SLOT_NUMBER, Info);
  180. __getStrFromField(Pos, m_ParkSlotNum, Info);
  181. Pos = __getFieldPosition(RTE_TAG, Info);
  182. __getStrFromField(Pos, m_Tag, Info);
  183. Pos = __getFieldPosition(ACCOUNT_CODE, Info);
  184. __getStrFromField(Pos, m_AccountCode, Info);
  185. }
  186. /*****************************************************************
  187. **【函数名称】 __isTrunk
  188. **【函数功能】 判定设备名称是否为外线
  189. **【参数】
  190. **【返回值】
  191. ****************************************************************/
  192. bool CAvayaLinkGw::__isTrunk( const CString& Name )
  193. {
  194. if(Name.GetLength() < 5 || Name.Left(4) != _T("Line"))
  195. return false;
  196. else
  197. return true;
  198. }
  199. /*****************************************************************
  200. **【函数名称】 __getTrunkId
  201. **【函数功能】 根据名称和Slot号获取中继编号
  202. **【参数】 Name 名称
  203. Slot Slot号
  204. **【返回值】 szTrunkId 中继编号
  205. ****************************************************************/
  206. void CAvayaLinkGw::__getTrunkId( CHAR* TrunkId, const CString& Name, LPCTSTR Slot )
  207. {
  208. // 得到线路主ID
  209. int LineId = 0;
  210. sscanf_s(Name.Right(Name.GetLength() - 5), _T("%lu"), &LineId);
  211. int PcmId = 0;
  212. int SlotId = 0;
  213. sscanf_s(Slot, _T("%d.%d"), &SlotId, &PcmId);
  214. TrunkType Trunk = CTrunkContainer::getTrunkType(LineId);
  215. switch(Trunk)
  216. {
  217. case TRUNK_DT:
  218. {
  219. // 数字中继下 Pcm ID 修正
  220. while(PcmId > 32) PcmId = PcmId - 32;
  221. PcmId = PcmId > 17 ? PcmId - 2 : PcmId - 1;
  222. sprintf_s(TrunkId, MAX_FIELD_LEN, _T("%lu"), LineId * CONST_IPO_DTC_SEED + PcmId);
  223. }
  224. break;
  225. case TRUNK_ANA:
  226. {
  227. sprintf_s(TrunkId, MAX_FIELD_LEN, _T("%lu"), LineId * CONST_IPO_DTC_SEED);
  228. }
  229. break;
  230. case TRUNK_H323:
  231. case TRUNK_SIP:
  232. default:
  233. {
  234. sprintf_s(TrunkId, MAX_FIELD_LEN, _T("%lu"), LineId * CONST_IPO_DTC_SEED + PcmId);
  235. }
  236. break;
  237. } // end if
  238. }
  239. /*****************************************************************
  240. **【函数名称】 __getDevInfoA
  241. **【函数功能】 读取A端设备信息
  242. **【参数】 DevId A端设备ID
  243. **【返回值】 A端设备类型
  244. ****************************************************************/
  245. DEV_RES_TYPE CAvayaLinkGw::__getDevInfoA( CHAR* DevId )
  246. {
  247. DEV_RES_TYPE DevType = DEV_RES_TYPE_UNKNOWN;
  248. CString Name = m_AName;
  249. if(__isTrunk(Name)) // 外线
  250. {
  251. DevType = DEV_RES_TYPE_TRUNK; // 线路类型
  252. __getTrunkId(DevId, Name, m_ASlot); // 线路ID
  253. }
  254. else // 内线
  255. {
  256. int IndexB = Name.Find('(');
  257. int IndexE = Name.Find(')');
  258. int Len = IndexE - IndexB - 1;
  259. if(Len > 0)
  260. {
  261. DevType = DEV_RES_TYPE_EXT;
  262. lstrcpy(DevId, Name.Mid(IndexB + 1, Len));
  263. }
  264. else if(Name.Left(2) == _T("IP"))
  265. {
  266. DevType = DEV_RES_TYPE_EXT;
  267. lstrcpy(DevId, Name.Mid(2, Name.GetLength() - 2));
  268. }
  269. else if(Name.Left(4) == _T("Extn"))
  270. {
  271. DevType = DEV_RES_TYPE_EXT;
  272. lstrcpy(DevId, Name.Mid(4, Name.GetLength() - 4));
  273. }
  274. } // end if
  275. return DevType;
  276. }
  277. /*****************************************************************
  278. **【函数名称】 __getDevInfoB
  279. **【函数功能】 读取B端设备信息
  280. **【参数】 DevId B端设备ID
  281. **【返回值】 B端设备类型
  282. ****************************************************************/
  283. DEV_RES_TYPE CAvayaLinkGw::__getDevInfoB( CHAR* DevId )
  284. {
  285. DEV_RES_TYPE DevType = DEV_RES_TYPE_UNKNOWN;
  286. CString Name = (strlen(m_BName) != 0) ? m_BName : m_BList;
  287. if(__isTrunk(Name)) // 外线
  288. {
  289. DevType = DEV_RES_TYPE_TRUNK; // 线路类型
  290. __getTrunkId(DevId, Name, m_BSlot); // 线路ID
  291. }
  292. else // 内线
  293. {
  294. int IndexB = Name.Find('(');
  295. int IndexE = Name.Find(')');
  296. int Len = IndexE - IndexB - 1;
  297. if(Len > 0)
  298. {
  299. DevType = DEV_RES_TYPE_EXT;
  300. lstrcpy(DevId, Name.Mid(IndexB + 1, Len));
  301. }
  302. else if(Name.Left(2) == _T("IP"))
  303. {
  304. DevType = DEV_RES_TYPE_EXT;
  305. lstrcpy(DevId, Name.Mid(2, Name.GetLength() - 2));
  306. }
  307. else if(Name.Left(4) == _T("Extn"))
  308. {
  309. DevType = DEV_RES_TYPE_EXT;
  310. lstrcpy(DevId, Name.Mid(4, Name.GetLength() - 4));
  311. }
  312. else if(Name == _T("RAS"))
  313. {
  314. Name = m_CalleeNum;
  315. if(Name.Left(5) == _T("#Extn"))
  316. {
  317. DevType = DEV_RES_TYPE_EXT;
  318. lstrcpy(DevId, Name.Mid(5, Name.GetLength() - 5));
  319. }
  320. else
  321. {
  322. DevType = DEV_RES_TYPE_IVR;
  323. lstrcpy(DevId, Name);
  324. }
  325. }
  326. } // end if
  327. return DevType;
  328. }
  329. /*****************************************************************
  330. **【函数名称】 __procEventS
  331. **【函数功能】 对S事件的逻辑解析处理
  332. **【参数】
  333. **【返回值】
  334. ****************************************************************/
  335. void CAvayaLinkGw::__procEventS( void )
  336. {
  337. switch(m_AState)
  338. {
  339. case CSIdle:
  340. __procEventS_Idle();
  341. break;
  342. case CSRinging:
  343. __procEventS_Ringing();
  344. break;
  345. case CSConnected:
  346. __procEventS_Connected();
  347. break;
  348. case CSDisconnected:
  349. __procEventS_DisConnected();
  350. break;
  351. case CSDialling:
  352. __procEventS_Dialling();
  353. break;
  354. case CSDialled:
  355. __procEventS_Dialled();
  356. break;
  357. case CSLocalDial:
  358. __procEventS_LocalDial();
  359. break;
  360. case CSParked:
  361. case CSSuspending:
  362. case CSSuspended:
  363. case CSResuming:
  364. case CSQueued:
  365. case CSHeld:
  366. case CSReDialling:
  367. break;
  368. } // end switch
  369. }
  370. /*****************************************************************
  371. **【函数名称】 __procEventS_LocalDial
  372. **【函数功能】 S事件A端 Local Dial 状态处理
  373. **【参数】
  374. **【返回值】
  375. ****************************************************************/
  376. void CAvayaLinkGw::__procEventS_LocalDial( void )
  377. {
  378. DevLinkInfoS info = { 0 };
  379. // 填充内容
  380. info.nDevLinkCallId = m_CallId;
  381. info.nResType = __getDevInfoA(info.szResId);
  382. info.nResStatus = INNER_STATE_INIT;
  383. info.nPeerResType = DEV_RES_TYPE_UNKNOWN;
  384. // 触发TAPI事件
  385. CTapiControl::GetInstance().onDevLinkEventS(&info);
  386. }
  387. /*****************************************************************
  388. **【函数名称】 __procEventS_Dialling
  389. **【函数功能】 S事件A端 Dialling 状态处理
  390. **【参数】
  391. **【返回值】
  392. ****************************************************************/
  393. void CAvayaLinkGw::__procEventS_Dialling( void )
  394. {
  395. DevLinkInfoS info = { 0 };
  396. // 填充内容
  397. info.nDevLinkCallId = m_CallId;
  398. info.nResType = __getDevInfoA(info.szResId);
  399. info.nResStatus = INNER_STATE_DIALING;
  400. info.nPeerResType = DEV_RES_TYPE_UNKNOWN;
  401. // 触发TAPI事件
  402. CTapiControl::GetInstance().onDevLinkEventS(&info);
  403. }
  404. /*****************************************************************
  405. **【函数名称】 __procEventS_Dialled
  406. **【函数功能】 S事件A端 Dialled 状态处理
  407. **【参数】
  408. **【返回值】
  409. ****************************************************************/
  410. void CAvayaLinkGw::__procEventS_Dialled( void )
  411. {
  412. // 相关变量初始化
  413. DevLinkInfoS info = { 0 };
  414. CHAR szIDA[MAX_FIELD_LEN] = { 0 }; // A端设备ID
  415. CHAR szIDB[MAX_FIELD_LEN] = { 0 }; // B端设备ID
  416. DEV_RES_TYPE nTypeA = __getDevInfoA(szIDA); // A端设备类型
  417. DEV_RES_TYPE nTypeB = __getDevInfoB(szIDB); // B端设备类型
  418. // 垃圾消息过滤
  419. if(nTypeB == DEV_RES_TYPE_UNKNOWN || m_BState == CSIdle)
  420. return;
  421. // 填充内容(主叫端)
  422. info.nDevLinkCallId = m_CallId;
  423. info.nResType = nTypeA;
  424. lstrcpy(info.szResId, szIDA);
  425. info.nResStatus = ((nTypeA == DEV_RES_TYPE_EXT) ? INNER_STATE_RING_BACK : TRUNK_STATE_RING_BACK);
  426. info.nPeerResType = nTypeB;
  427. lstrcpy(info.szPeerResId, szIDB);
  428. lstrcpy(info.szCallerNum, m_CallerNum);
  429. lstrcpy(info.szCalleeNum, m_CalleeNum);
  430. CTapiControl::GetInstance().onDevLinkEventS(&info); // 触发TAPI事件
  431. // 填充内容(被叫端)
  432. ZeroMemory(&info, sizeof(DevLinkInfoS));
  433. info.nDevLinkCallId = m_CallId;
  434. info.nResType = nTypeB;
  435. lstrcpy(info.szResId, szIDB);
  436. info.nResStatus = ((nTypeB == DEV_RES_TYPE_EXT) ? INNER_STATE_RING_BACK : TRUNK_STATE_RING_BACK);
  437. info.nPeerResType = nTypeA;
  438. lstrcpy(info.szPeerResId, szIDA);
  439. lstrcpy(info.szCallerNum, m_CallerNum);
  440. lstrcpy(info.szCalleeNum, m_CalleeNum);
  441. CTapiControl::GetInstance().onDevLinkEventS(&info); // 触发TAPI事件
  442. }
  443. /*****************************************************************
  444. **【函数名称】 __procEventS_Ringing
  445. **【函数功能】 S事件A端 Ringing 状态处理
  446. **【参数】
  447. **【返回值】
  448. ****************************************************************/
  449. void CAvayaLinkGw::__procEventS_Ringing( void )
  450. {
  451. // 相关变量初始化
  452. DevLinkInfoS info = { 0 };
  453. CHAR szIDA[MAX_FIELD_LEN] = { 0 }; // A端设备ID
  454. CHAR szIDB[MAX_FIELD_LEN] = { 0 }; // B端设备ID
  455. DEV_RES_TYPE nTypeA = __getDevInfoA(szIDA); // A端设备类型
  456. DEV_RES_TYPE nTypeB = __getDevInfoB(szIDB); // B端设备类型
  457. // 填充内容(主叫端)
  458. info.nDevLinkCallId = m_CallId;
  459. info.nResType = nTypeA;
  460. lstrcpy(info.szResId, szIDA);
  461. info.nResStatus = ((nTypeA == DEV_RES_TYPE_EXT) ? INNER_STATE_RING_BACK : TRUNK_STATE_RING_BACK);
  462. info.nPeerResType = nTypeB;
  463. lstrcpy(info.szPeerResId, szIDB);
  464. lstrcpy(info.szCallerNum, m_CallerNum);
  465. lstrcpy(info.szCalleeNum, m_CalleeNum);
  466. CTapiControl::GetInstance().onDevLinkEventS(&info); // 触发TAPI事件
  467. // 填充内容(被叫端)
  468. if(nTypeB == DEV_RES_TYPE_UNKNOWN) return;
  469. ZeroMemory(&info, sizeof(DevLinkInfoS));
  470. info.nDevLinkCallId = m_CallId;
  471. info.nResType = nTypeB;
  472. lstrcpy(info.szResId, szIDB);
  473. info.nResStatus = ((nTypeB == DEV_RES_TYPE_EXT) ? INNER_STATE_ALERTING : TRUNK_STATE_ALERTING);
  474. info.nPeerResType = nTypeA;
  475. lstrcpy(info.szPeerResId, szIDA);
  476. lstrcpy(info.szCallerNum, m_CallerNum);
  477. lstrcpy(info.szCalleeNum, m_CalleeNum);
  478. CTapiControl::GetInstance().onDevLinkEventS(&info); // 触发TAPI事件
  479. }
  480. /*****************************************************************
  481. **【函数名称】 __procEventS_Idle
  482. **【函数功能】 S事件A端 Idle 状态处理
  483. **【参数】
  484. **【返回值】
  485. ****************************************************************/
  486. void CAvayaLinkGw::__procEventS_Idle( void )
  487. {
  488. DevLinkInfoS info = { 0 };
  489. // 外线来电
  490. if(m_AConnected == 1 && __isTrunk(m_AName) && m_BConnected == 0 && m_BState == CSIdle)
  491. {
  492. ZeroMemory(&info, sizeof(DevLinkInfoS));
  493. info.nDevLinkCallId = m_CallId; // CallId
  494. info.nResType = DEV_RES_TYPE_TRUNK;
  495. __getTrunkId(info.szResId, m_AName, m_ASlot);
  496. info.nResStatus = TRUNK_STATE_ALERTING;
  497. lstrcpy(info.szCallerNum, m_CallerNum);
  498. lstrcpy(info.szCalleeNum, m_CalleeNum);
  499. CTapiControl::GetInstance().onDevLinkEventS(&info); // 触发TAPI事件
  500. return;
  501. }
  502. // A端主动挂机
  503. if((m_BState == CSConnected && m_AConnected == 0) ||
  504. (m_AConnected == 0 && m_BConnected == 0 && m_BState == CSIdle))
  505. {
  506. CHAR szIDA[MAX_FIELD_LEN] = { 0 }; // A端设备ID
  507. CHAR szIDB[MAX_FIELD_LEN] = { 0 }; // B端设备ID
  508. DEV_RES_TYPE nTypeA = __getDevInfoA(szIDA); // A端设备类型
  509. DEV_RES_TYPE nTypeB = __getDevInfoB(szIDB); // B端设备类型
  510. // 填充内容(主叫端)
  511. ZeroMemory(&info, sizeof(DevLinkInfoS));
  512. info.nDevLinkCallId = m_CallId;
  513. info.nResType = nTypeA;
  514. lstrcpy(info.szResId, szIDA);
  515. info.nResStatus = ((nTypeA == DEV_RES_TYPE_EXT) ? INNER_STATE_FREE : TRUNK_STATE_FREE);
  516. info.nPeerResType = nTypeB;
  517. lstrcpy(info.szPeerResId, szIDB);
  518. info.nFlag = 0;
  519. CTapiControl::GetInstance().onDevLinkEventS(&info); // 触发TAPI事件
  520. // 填充内容(被叫端)
  521. if(nTypeB == DEV_RES_TYPE_UNKNOWN) return;
  522. ZeroMemory(&info, sizeof(DevLinkInfoS));
  523. info.nDevLinkCallId = m_CallId;
  524. info.nResType = nTypeB;
  525. lstrcpy(info.szResId, szIDB);
  526. info.nResStatus = ((nTypeB == DEV_RES_TYPE_EXT) ? INNER_STATE_FREE : TRUNK_STATE_FREE);
  527. info.nPeerResType = nTypeA;
  528. lstrcpy(info.szPeerResId, szIDA);
  529. info.nFlag = 1;
  530. CTapiControl::GetInstance().onDevLinkEventS(&info); // 触发TAPI事件
  531. } // end if
  532. }
  533. /*****************************************************************
  534. **【函数名称】 __procEventS_Connected
  535. **【函数功能】 S事件A端 Connected 状态处理
  536. **【参数】
  537. **【返回值】
  538. ****************************************************************/
  539. void CAvayaLinkGw::__procEventS_Connected( void )
  540. {
  541. DevLinkInfoS info = { 0 };
  542. CHAR szIDA[MAX_FIELD_LEN] = { 0 }; // A端设备ID
  543. CHAR szIDB[MAX_FIELD_LEN] = { 0 }; // B端设备ID
  544. DEV_RES_TYPE nTypeA = __getDevInfoA(szIDA); // A端设备类型
  545. DEV_RES_TYPE nTypeB = __getDevInfoB(szIDB); // B端设备类型
  546. // 两端通话建立
  547. if(m_BState == CSConnected && m_AConnected == 1 && m_BConnected == 1)
  548. {
  549. // 被叫号码修正
  550. if(nTypeB == DEV_RES_TYPE_EXT)
  551. lstrcpy(m_CalleeNum, szIDB);
  552. // 填充内容(主叫端)
  553. ZeroMemory(&info, sizeof(DevLinkInfoS));
  554. info.nDevLinkCallId = m_CallId;
  555. info.nResType = nTypeA;
  556. lstrcpy(info.szResId, szIDA);
  557. info.nResStatus = ((nTypeA == DEV_RES_TYPE_EXT) ? INNER_STATE_TALKING : TRUNK_STATE_TALKING);
  558. info.nPeerResType = nTypeB;
  559. lstrcpy(info.szPeerResId, szIDB);
  560. info.nFlag = 0;
  561. lstrcpy(info.szCallerNum, m_CallerNum);
  562. lstrcpy(info.szCalleeNum, m_CalleeNum);
  563. CTapiControl::GetInstance().onDevLinkEventS(&info); // 触发TAPI事件
  564. // 填充内容(被叫端)
  565. if(nTypeB == DEV_RES_TYPE_UNKNOWN)
  566. return;
  567. ZeroMemory(&info, sizeof(DevLinkInfoS));
  568. info.nDevLinkCallId = m_CallId;
  569. info.nResType = nTypeB;
  570. lstrcpy(info.szResId, szIDB);
  571. info.nResStatus = ((nTypeB == DEV_RES_TYPE_EXT) ? INNER_STATE_TALKING : TRUNK_STATE_TALKING);
  572. info.nPeerResType = nTypeA;
  573. lstrcpy(info.szPeerResId, szIDA);
  574. info.nFlag = 1;
  575. lstrcpy(info.szCallerNum, m_CallerNum);
  576. lstrcpy(info.szCalleeNum, m_CalleeNum);
  577. CTapiControl::GetInstance().onDevLinkEventS(&info); // 触发TAPI事件
  578. return;
  579. } // end if
  580. // B端主动挂机
  581. if(m_BState == CSDisconnected && m_BConnected == 0)
  582. {
  583. // 填充内容(主叫端)
  584. ZeroMemory(&info, sizeof(DevLinkInfoS));
  585. info.nDevLinkCallId = m_CallId;
  586. info.nResType = nTypeA;
  587. lstrcpy(info.szResId, szIDA);
  588. info.nResStatus = ((nTypeA == DEV_RES_TYPE_EXT) ? INNER_STATE_FREE : TRUNK_STATE_FREE);
  589. info.nPeerResType = nTypeB;
  590. lstrcpy(info.szPeerResId, szIDB);
  591. info.nFlag = 1;
  592. CTapiControl::GetInstance().onDevLinkEventS(&info); // 触发TAPI事件
  593. // 填充内容(被叫端)
  594. if(nTypeB == DEV_RES_TYPE_UNKNOWN)
  595. return;
  596. ZeroMemory(&info, sizeof(DevLinkInfoS));
  597. info.nDevLinkCallId = m_CallId;
  598. info.nResType = nTypeB;
  599. lstrcpy(info.szResId, szIDB);
  600. info.nResStatus = ((nTypeB == DEV_RES_TYPE_EXT) ? INNER_STATE_FREE : TRUNK_STATE_FREE);
  601. info.nPeerResType = nTypeA;
  602. lstrcpy(info.szPeerResId, szIDA);
  603. info.nFlag = 0;
  604. CTapiControl::GetInstance().onDevLinkEventS(&info); // 触发TAPI事件
  605. return;
  606. } // end if
  607. // A端保持
  608. if(m_AState == CSConnected && m_BState == CSConnected && m_AConnected == 0 && m_BConnected == 1)
  609. {
  610. // 填充内容(主叫端)
  611. ZeroMemory(&info, sizeof(DevLinkInfoS));
  612. info.nDevLinkCallId = m_CallId;
  613. info.nResType = nTypeA;
  614. lstrcpy(info.szResId, szIDA);
  615. info.nResStatus = INNER_STATE_HELD;
  616. info.nPeerResType = -1;
  617. CTapiControl::GetInstance().onDevLinkEventS(&info); // 触发TAPI事件
  618. return;
  619. } // end if
  620. // B端保持
  621. if(m_AState == CSConnected && m_BState == CSConnected && m_AConnected == 1 && m_BConnected == 0)
  622. {
  623. // 填充内容(被叫端)
  624. ZeroMemory(&info, sizeof(DevLinkInfoS));
  625. info.nDevLinkCallId = m_CallId;
  626. info.nResType = nTypeB;
  627. lstrcpy(info.szResId, szIDB);
  628. info.nResStatus = INNER_STATE_HELD;
  629. info.nPeerResType = -1;
  630. CTapiControl::GetInstance().onDevLinkEventS(&info); // 触发TAPI事件
  631. return;
  632. } // end if
  633. }
  634. /*****************************************************************
  635. **【函数名称】 __procEventS_DisConnected
  636. **【函数功能】 S事件A端 DisConnected 状态处理
  637. **【参数】
  638. **【返回值】
  639. ****************************************************************/
  640. void CAvayaLinkGw::__procEventS_DisConnected( void )
  641. {
  642. // 相关变量初始化
  643. DevLinkInfoS info = { 0 };
  644. CHAR szIDA[MAX_FIELD_LEN] = { 0 }; // A端设备ID
  645. CHAR szIDB[MAX_FIELD_LEN] = { 0 }; // B端设备ID
  646. DEV_RES_TYPE nTypeA = __getDevInfoA(szIDA); // A端设备类型
  647. DEV_RES_TYPE nTypeB = __getDevInfoB(szIDB); // B端设备类型
  648. // 填充内容(主叫端)
  649. ZeroMemory(&info, sizeof(DevLinkInfoS));
  650. info.nDevLinkCallId = m_CallId;
  651. info.nResType = nTypeA;
  652. lstrcpy(info.szResId, szIDA);
  653. info.nResStatus = ((nTypeA == DEV_RES_TYPE_EXT) ? INNER_STATE_FREE : TRUNK_STATE_FREE);
  654. info.nPeerResType = nTypeB;
  655. lstrcpy(info.szPeerResId, szIDB);
  656. info.nFlag = 0;
  657. CTapiControl::GetInstance().onDevLinkEventS(&info); // 触发TAPI事件
  658. }
  659. /*****************************************************************
  660. **【函数名称】 parse
  661. **【函数功能】 DevLink消息解析主入口函数
  662. **【参数】 Info DevLink消息串
  663. **【返回值】
  664. ****************************************************************/
  665. void CAvayaLinkGw::parse( char* Info )
  666. {
  667. __init(); // 初始化
  668. __parseEventType(Info); // 解析消息类型
  669. // 根据消息类型进行下一步解析
  670. switch(m_EventType)
  671. {
  672. case DEV_LINK_EVENT_TYPE_S: // S事件
  673. __parseEventS(Info);
  674. break;
  675. case DEV_LINK_EVENT_TYPE_D: // D事件
  676. __parseEventD(Info);
  677. break;
  678. case DEV_LINK_EVENT_TYPE_A: // A事件
  679. __parseEventA(Info);
  680. break;
  681. } // end switch
  682. }
  683. /*****************************************************************
  684. **【函数名称】 dispatchTapiEvent
  685. **【函数功能】 根据消息内容分发Tapi事件
  686. **【参数】
  687. **【返回值】
  688. ****************************************************************/
  689. void CAvayaLinkGw::dispatchTapiEvent( void )
  690. {
  691. switch(m_EventType)
  692. {
  693. case DEV_LINK_EVENT_TYPE_S:
  694. __procEventS();
  695. break;
  696. case DEV_LINK_EVENT_TYPE_A:
  697. CTapiControl::GetInstance().onDevLinkEventA(m_CallId);
  698. break;
  699. case DEV_LINK_EVENT_TYPE_D:
  700. CTapiControl::GetInstance().onDevLinkEventD(m_CallId);
  701. break;
  702. } // end switch
  703. }