#include "StdAfx.h" #include "AvayaLinkGw.h" #include "VsControl.h" #include "TapiControl.h" #include "TrunkContainer.h" CAvayaLinkGw::CAvayaLinkGw(void) { __init(); } CAvayaLinkGw::~CAvayaLinkGw(void) { } /***************************************************************** **【函数名称】 __init **【函数功能】 成员变量初始化 **【参数】 **【返回值】 ****************************************************************/ void CAvayaLinkGw::__init( void ) { m_EventType = DEV_LINK_EVENT_TYPE_S; m_CallId = CONST_DEV_LINK_CALL_NULL; m_AState = CSIdle; m_BState = CSIdle; m_AConnected = -1; m_BConnected = -1; ZeroMemory(m_ASlot, MAX_FIELD_LEN); ZeroMemory(m_BSlot, MAX_FIELD_LEN); m_IsInternalCall = -1; ZeroMemory(m_AName, MAX_FIELD_LEN); ZeroMemory(m_BName, MAX_FIELD_LEN); ZeroMemory(m_BList, MAX_FIELD_LEN); ZeroMemory(m_TargetUserName, MAX_FIELD_LEN); ZeroMemory(m_ParkSlotNum, MAX_FIELD_LEN); ZeroMemory(m_Tag, MAX_FIELD_LEN); ZeroMemory(m_AccountCode, MAX_FIELD_LEN); ZeroMemory(m_CallerNum, MAX_FIELD_LEN); ZeroMemory(m_CalleeNum, MAX_FIELD_LEN); } /***************************************************************** **【函数名称】 __getFieldPosition **【函数功能】 取得指定消息域的位置 **【参数】 Pos 消息域类型 Info DevLink消息串 **【返回值】 起始位置 ****************************************************************/ int CAvayaLinkGw::__getFieldPosition( int Field, char* Info ) { int Pos = CALL_IDENT_LEN; // skip "CALL:x" identifier, x is 'S', 'D' or 'A' int Comma = 0; // count 'nField' comas while(Comma < Field) { if(Info[Pos++] == COMMA) Comma++; } // end while return Pos; } /***************************************************************** **【函数名称】 __getIntFromField **【函数功能】 取得指定位置的整数值 **【参数】 Pos 起始位置 Info DevLink消息串 **【返回值】 ****************************************************************/ int CAvayaLinkGw::__getIntFromField( int Pos, char* Info ) { if((Info + Pos) == NULL) return 0; else return atoi(Info + Pos); } /***************************************************************** **【函数名称】 __getStrFromField **【函数功能】 取得指定位置的字符串 **【参数】 Pos 起始位置 Info DevLink消息串 **【返回值】 ****************************************************************/ void CAvayaLinkGw::__getStrFromField( int Pos, char* Result, char* Info ) { int Index = 0; int i = Pos; ::ZeroMemory(Result, MAX_FIELD_LEN); // skip white spaces at the begining while(Info[i] == ' ') i++; while((Index < MAX_FIELD_LEN) && (Info[i] != COMMA)) { Result[Index++] = Info[i++]; } // end while } /***************************************************************** **【函数名称】 __parseEventType **【函数功能】 解析事件类型 **【参数】 Info DevLink消息串 **【返回值】 ****************************************************************/ void CAvayaLinkGw::__parseEventType( char* Info ) { m_EventType = DEV_LINK_EVENT_TYPE_S; char* pTmpStr = strstr(Info, "CALL:"); if(pTmpStr != NULL) { switch(pTmpStr[5]) { case 'S': m_EventType = DEV_LINK_EVENT_TYPE_S; break; case 'D': m_EventType = DEV_LINK_EVENT_TYPE_D; break; case 'A': m_EventType = DEV_LINK_EVENT_TYPE_A; break; } // end switch } // end if } /***************************************************************** **【函数名称】 __parseEventA **【函数功能】 解析A事件 **【参数】 Info DevLink消息串 **【返回值】 ****************************************************************/ void CAvayaLinkGw::__parseEventA( char* Info ) { int Pos = __getFieldPosition(2, Info); m_CallId = __getIntFromField(Pos, Info); } /***************************************************************** **【函数名称】 __parseEventD **【函数功能】 解析D事件 **【参数】 Info DevLink消息串 **【返回值】 ****************************************************************/ void CAvayaLinkGw::__parseEventD( char* Info ) { int Pos = __getFieldPosition(2, Info); m_CallId = __getIntFromField(Pos, Info); } /***************************************************************** **【函数名称】 __parseEventS **【函数功能】 解析S事件 **【参数】 Info DevLink消息串 **【返回值】 ****************************************************************/ void CAvayaLinkGw::__parseEventS( char* Info ) { int Pos = __getFieldPosition(CALL_ID, Info); m_CallId = __getIntFromField(Pos, Info); Pos = __getFieldPosition(ASTATE, Info); m_AState = (DEV_LINK_CALL_STATE)__getIntFromField(Pos, Info); Pos = __getFieldPosition(BSTATE, Info); m_BState = (DEV_LINK_CALL_STATE)__getIntFromField(Pos, Info); Pos = __getFieldPosition(ACONNECTED, Info); m_AConnected = __getIntFromField(Pos, Info); Pos = __getFieldPosition(BCONNECTED, Info); m_BConnected = __getIntFromField(Pos, Info); Pos = __getFieldPosition(ASLOT, Info); __getStrFromField(Pos, m_ASlot, Info); Pos = __getFieldPosition(BSLOT, Info); __getStrFromField(Pos, m_BSlot, Info); Pos = __getFieldPosition(CALLING_NUM, Info); __getStrFromField(Pos, m_CallerNum, Info); Pos = __getFieldPosition(CALLED_NUM, Info); __getStrFromField(Pos, m_CalleeNum, Info); Pos = __getFieldPosition(IS_INTERNAL_CALL, Info); m_IsInternalCall = __getIntFromField(Pos, Info); Pos = __getFieldPosition(CALL_ID, Info); m_CallId = __getIntFromField(Pos, Info); Pos = __getFieldPosition(ANAME, Info); __getStrFromField(Pos, m_AName, Info); Pos = __getFieldPosition(BNAME, Info); __getStrFromField(Pos, m_BName, Info); Pos = __getFieldPosition(BLIST, Info); __getStrFromField(Pos, m_BList, Info); Pos = __getFieldPosition(TARG_UNAME, Info); __getStrFromField(Pos, m_TargetUserName, Info); Pos = __getFieldPosition(PARK_SLOT_NUMBER, Info); __getStrFromField(Pos, m_ParkSlotNum, Info); Pos = __getFieldPosition(RTE_TAG, Info); __getStrFromField(Pos, m_Tag, Info); Pos = __getFieldPosition(ACCOUNT_CODE, Info); __getStrFromField(Pos, m_AccountCode, Info); } /***************************************************************** **【函数名称】 __isTrunk **【函数功能】 判定设备名称是否为外线 **【参数】 **【返回值】 ****************************************************************/ bool CAvayaLinkGw::__isTrunk( const CString& Name ) { if(Name.GetLength() < 5 || Name.Left(4) != _T("Line")) return false; else return true; } /***************************************************************** **【函数名称】 __getTrunkId **【函数功能】 根据名称和Slot号获取中继编号 **【参数】 Name 名称 Slot Slot号 **【返回值】 szTrunkId 中继编号 ****************************************************************/ void CAvayaLinkGw::__getTrunkId( CHAR* TrunkId, const CString& Name, LPCTSTR Slot ) { // 得到线路主ID int LineId = 0; sscanf_s(Name.Right(Name.GetLength() - 5), _T("%lu"), &LineId); int PcmId = 0; int SlotId = 0; sscanf_s(Slot, _T("%d.%d"), &SlotId, &PcmId); TrunkType Trunk = CTrunkContainer::getTrunkType(LineId); switch(Trunk) { case TRUNK_DT: { // 数字中继下 Pcm ID 修正 while(PcmId > 32) PcmId = PcmId - 32; PcmId = PcmId > 17 ? PcmId - 2 : PcmId - 1; sprintf_s(TrunkId, MAX_FIELD_LEN, _T("%lu"), LineId * CONST_IPO_DTC_SEED + PcmId); } break; case TRUNK_ANA: { sprintf_s(TrunkId, MAX_FIELD_LEN, _T("%lu"), LineId * CONST_IPO_DTC_SEED); } break; case TRUNK_H323: case TRUNK_SIP: default: { sprintf_s(TrunkId, MAX_FIELD_LEN, _T("%lu"), LineId * CONST_IPO_DTC_SEED + PcmId); } break; } // end if } /***************************************************************** **【函数名称】 __getDevInfoA **【函数功能】 读取A端设备信息 **【参数】 DevId A端设备ID **【返回值】 A端设备类型 ****************************************************************/ DEV_RES_TYPE CAvayaLinkGw::__getDevInfoA( CHAR* DevId ) { DEV_RES_TYPE DevType = DEV_RES_TYPE_UNKNOWN; CString Name = m_AName; if(__isTrunk(Name)) // 外线 { DevType = DEV_RES_TYPE_TRUNK; // 线路类型 __getTrunkId(DevId, Name, m_ASlot); // 线路ID } else // 内线 { int IndexB = Name.Find('('); int IndexE = Name.Find(')'); int Len = IndexE - IndexB - 1; if(Len > 0) { DevType = DEV_RES_TYPE_EXT; lstrcpy(DevId, Name.Mid(IndexB + 1, Len)); } else if(Name.Left(2) == _T("IP")) { DevType = DEV_RES_TYPE_EXT; lstrcpy(DevId, Name.Mid(2, Name.GetLength() - 2)); } else if(Name.Left(4) == _T("Extn")) { DevType = DEV_RES_TYPE_EXT; lstrcpy(DevId, Name.Mid(4, Name.GetLength() - 4)); } } // end if return DevType; } /***************************************************************** **【函数名称】 __getDevInfoB **【函数功能】 读取B端设备信息 **【参数】 DevId B端设备ID **【返回值】 B端设备类型 ****************************************************************/ DEV_RES_TYPE CAvayaLinkGw::__getDevInfoB( CHAR* DevId ) { DEV_RES_TYPE DevType = DEV_RES_TYPE_UNKNOWN; CString Name = (strlen(m_BName) != 0) ? m_BName : m_BList; if(__isTrunk(Name)) // 外线 { DevType = DEV_RES_TYPE_TRUNK; // 线路类型 __getTrunkId(DevId, Name, m_BSlot); // 线路ID } else // 内线 { int IndexB = Name.Find('('); int IndexE = Name.Find(')'); int Len = IndexE - IndexB - 1; if(Len > 0) { DevType = DEV_RES_TYPE_EXT; lstrcpy(DevId, Name.Mid(IndexB + 1, Len)); } else if(Name.Left(2) == _T("IP")) { DevType = DEV_RES_TYPE_EXT; lstrcpy(DevId, Name.Mid(2, Name.GetLength() - 2)); } else if(Name.Left(4) == _T("Extn")) { DevType = DEV_RES_TYPE_EXT; lstrcpy(DevId, Name.Mid(4, Name.GetLength() - 4)); } else if(Name == _T("RAS")) { Name = m_CalleeNum; if(Name.Left(5) == _T("#Extn")) { DevType = DEV_RES_TYPE_EXT; lstrcpy(DevId, Name.Mid(5, Name.GetLength() - 5)); } else { DevType = DEV_RES_TYPE_IVR; lstrcpy(DevId, Name); } } } // end if return DevType; } /***************************************************************** **【函数名称】 __procEventS **【函数功能】 对S事件的逻辑解析处理 **【参数】 **【返回值】 ****************************************************************/ void CAvayaLinkGw::__procEventS( void ) { switch(m_AState) { case CSIdle: __procEventS_Idle(); break; case CSRinging: __procEventS_Ringing(); break; case CSConnected: __procEventS_Connected(); break; case CSDisconnected: __procEventS_DisConnected(); break; case CSDialling: __procEventS_Dialling(); break; case CSDialled: __procEventS_Dialled(); break; case CSLocalDial: __procEventS_LocalDial(); break; case CSParked: case CSSuspending: case CSSuspended: case CSResuming: case CSQueued: case CSHeld: case CSReDialling: break; } // end switch } /***************************************************************** **【函数名称】 __procEventS_LocalDial **【函数功能】 S事件A端 Local Dial 状态处理 **【参数】 **【返回值】 ****************************************************************/ void CAvayaLinkGw::__procEventS_LocalDial( void ) { DevLinkInfoS info = { 0 }; // 填充内容 info.nDevLinkCallId = m_CallId; info.nResType = __getDevInfoA(info.szResId); info.nResStatus = INNER_STATE_INIT; info.nPeerResType = DEV_RES_TYPE_UNKNOWN; // 触发TAPI事件 CTapiControl::GetInstance().onDevLinkEventS(&info); } /***************************************************************** **【函数名称】 __procEventS_Dialling **【函数功能】 S事件A端 Dialling 状态处理 **【参数】 **【返回值】 ****************************************************************/ void CAvayaLinkGw::__procEventS_Dialling( void ) { DevLinkInfoS info = { 0 }; // 填充内容 info.nDevLinkCallId = m_CallId; info.nResType = __getDevInfoA(info.szResId); info.nResStatus = INNER_STATE_DIALING; info.nPeerResType = DEV_RES_TYPE_UNKNOWN; // 触发TAPI事件 CTapiControl::GetInstance().onDevLinkEventS(&info); } /***************************************************************** **【函数名称】 __procEventS_Dialled **【函数功能】 S事件A端 Dialled 状态处理 **【参数】 **【返回值】 ****************************************************************/ void CAvayaLinkGw::__procEventS_Dialled( void ) { // 相关变量初始化 DevLinkInfoS info = { 0 }; CHAR szIDA[MAX_FIELD_LEN] = { 0 }; // A端设备ID CHAR szIDB[MAX_FIELD_LEN] = { 0 }; // B端设备ID DEV_RES_TYPE nTypeA = __getDevInfoA(szIDA); // A端设备类型 DEV_RES_TYPE nTypeB = __getDevInfoB(szIDB); // B端设备类型 // 垃圾消息过滤 if(nTypeB == DEV_RES_TYPE_UNKNOWN || m_BState == CSIdle) return; // 填充内容(主叫端) info.nDevLinkCallId = m_CallId; info.nResType = nTypeA; lstrcpy(info.szResId, szIDA); info.nResStatus = ((nTypeA == DEV_RES_TYPE_EXT) ? INNER_STATE_RING_BACK : TRUNK_STATE_RING_BACK); info.nPeerResType = nTypeB; lstrcpy(info.szPeerResId, szIDB); lstrcpy(info.szCallerNum, m_CallerNum); lstrcpy(info.szCalleeNum, m_CalleeNum); CTapiControl::GetInstance().onDevLinkEventS(&info); // 触发TAPI事件 // 填充内容(被叫端) ZeroMemory(&info, sizeof(DevLinkInfoS)); info.nDevLinkCallId = m_CallId; info.nResType = nTypeB; lstrcpy(info.szResId, szIDB); info.nResStatus = ((nTypeB == DEV_RES_TYPE_EXT) ? INNER_STATE_RING_BACK : TRUNK_STATE_RING_BACK); info.nPeerResType = nTypeA; lstrcpy(info.szPeerResId, szIDA); lstrcpy(info.szCallerNum, m_CallerNum); lstrcpy(info.szCalleeNum, m_CalleeNum); CTapiControl::GetInstance().onDevLinkEventS(&info); // 触发TAPI事件 } /***************************************************************** **【函数名称】 __procEventS_Ringing **【函数功能】 S事件A端 Ringing 状态处理 **【参数】 **【返回值】 ****************************************************************/ void CAvayaLinkGw::__procEventS_Ringing( void ) { // 相关变量初始化 DevLinkInfoS info = { 0 }; CHAR szIDA[MAX_FIELD_LEN] = { 0 }; // A端设备ID CHAR szIDB[MAX_FIELD_LEN] = { 0 }; // B端设备ID DEV_RES_TYPE nTypeA = __getDevInfoA(szIDA); // A端设备类型 DEV_RES_TYPE nTypeB = __getDevInfoB(szIDB); // B端设备类型 // 填充内容(主叫端) info.nDevLinkCallId = m_CallId; info.nResType = nTypeA; lstrcpy(info.szResId, szIDA); info.nResStatus = ((nTypeA == DEV_RES_TYPE_EXT) ? INNER_STATE_RING_BACK : TRUNK_STATE_RING_BACK); info.nPeerResType = nTypeB; lstrcpy(info.szPeerResId, szIDB); lstrcpy(info.szCallerNum, m_CallerNum); lstrcpy(info.szCalleeNum, m_CalleeNum); CTapiControl::GetInstance().onDevLinkEventS(&info); // 触发TAPI事件 // 填充内容(被叫端) if(nTypeB == DEV_RES_TYPE_UNKNOWN) return; ZeroMemory(&info, sizeof(DevLinkInfoS)); info.nDevLinkCallId = m_CallId; info.nResType = nTypeB; lstrcpy(info.szResId, szIDB); info.nResStatus = ((nTypeB == DEV_RES_TYPE_EXT) ? INNER_STATE_ALERTING : TRUNK_STATE_ALERTING); info.nPeerResType = nTypeA; lstrcpy(info.szPeerResId, szIDA); lstrcpy(info.szCallerNum, m_CallerNum); lstrcpy(info.szCalleeNum, m_CalleeNum); CTapiControl::GetInstance().onDevLinkEventS(&info); // 触发TAPI事件 } /***************************************************************** **【函数名称】 __procEventS_Idle **【函数功能】 S事件A端 Idle 状态处理 **【参数】 **【返回值】 ****************************************************************/ void CAvayaLinkGw::__procEventS_Idle( void ) { DevLinkInfoS info = { 0 }; // 外线来电 if(m_AConnected == 1 && __isTrunk(m_AName) && m_BConnected == 0 && m_BState == CSIdle) { ZeroMemory(&info, sizeof(DevLinkInfoS)); info.nDevLinkCallId = m_CallId; // CallId info.nResType = DEV_RES_TYPE_TRUNK; __getTrunkId(info.szResId, m_AName, m_ASlot); info.nResStatus = TRUNK_STATE_ALERTING; lstrcpy(info.szCallerNum, m_CallerNum); lstrcpy(info.szCalleeNum, m_CalleeNum); CTapiControl::GetInstance().onDevLinkEventS(&info); // 触发TAPI事件 return; } // A端主动挂机 if((m_BState == CSConnected && m_AConnected == 0) || (m_AConnected == 0 && m_BConnected == 0 && m_BState == CSIdle)) { CHAR szIDA[MAX_FIELD_LEN] = { 0 }; // A端设备ID CHAR szIDB[MAX_FIELD_LEN] = { 0 }; // B端设备ID DEV_RES_TYPE nTypeA = __getDevInfoA(szIDA); // A端设备类型 DEV_RES_TYPE nTypeB = __getDevInfoB(szIDB); // B端设备类型 // 填充内容(主叫端) ZeroMemory(&info, sizeof(DevLinkInfoS)); info.nDevLinkCallId = m_CallId; info.nResType = nTypeA; lstrcpy(info.szResId, szIDA); info.nResStatus = ((nTypeA == DEV_RES_TYPE_EXT) ? INNER_STATE_FREE : TRUNK_STATE_FREE); info.nPeerResType = nTypeB; lstrcpy(info.szPeerResId, szIDB); info.nFlag = 0; CTapiControl::GetInstance().onDevLinkEventS(&info); // 触发TAPI事件 // 填充内容(被叫端) if(nTypeB == DEV_RES_TYPE_UNKNOWN) return; ZeroMemory(&info, sizeof(DevLinkInfoS)); info.nDevLinkCallId = m_CallId; info.nResType = nTypeB; lstrcpy(info.szResId, szIDB); info.nResStatus = ((nTypeB == DEV_RES_TYPE_EXT) ? INNER_STATE_FREE : TRUNK_STATE_FREE); info.nPeerResType = nTypeA; lstrcpy(info.szPeerResId, szIDA); info.nFlag = 1; CTapiControl::GetInstance().onDevLinkEventS(&info); // 触发TAPI事件 } // end if } /***************************************************************** **【函数名称】 __procEventS_Connected **【函数功能】 S事件A端 Connected 状态处理 **【参数】 **【返回值】 ****************************************************************/ void CAvayaLinkGw::__procEventS_Connected( void ) { DevLinkInfoS info = { 0 }; CHAR szIDA[MAX_FIELD_LEN] = { 0 }; // A端设备ID CHAR szIDB[MAX_FIELD_LEN] = { 0 }; // B端设备ID DEV_RES_TYPE nTypeA = __getDevInfoA(szIDA); // A端设备类型 DEV_RES_TYPE nTypeB = __getDevInfoB(szIDB); // B端设备类型 // 两端通话建立 if(m_BState == CSConnected && m_AConnected == 1 && m_BConnected == 1) { // 被叫号码修正 if(nTypeB == DEV_RES_TYPE_EXT) lstrcpy(m_CalleeNum, szIDB); // 填充内容(主叫端) ZeroMemory(&info, sizeof(DevLinkInfoS)); info.nDevLinkCallId = m_CallId; info.nResType = nTypeA; lstrcpy(info.szResId, szIDA); info.nResStatus = ((nTypeA == DEV_RES_TYPE_EXT) ? INNER_STATE_TALKING : TRUNK_STATE_TALKING); info.nPeerResType = nTypeB; lstrcpy(info.szPeerResId, szIDB); info.nFlag = 0; lstrcpy(info.szCallerNum, m_CallerNum); lstrcpy(info.szCalleeNum, m_CalleeNum); CTapiControl::GetInstance().onDevLinkEventS(&info); // 触发TAPI事件 // 填充内容(被叫端) if(nTypeB == DEV_RES_TYPE_UNKNOWN) return; ZeroMemory(&info, sizeof(DevLinkInfoS)); info.nDevLinkCallId = m_CallId; info.nResType = nTypeB; lstrcpy(info.szResId, szIDB); info.nResStatus = ((nTypeB == DEV_RES_TYPE_EXT) ? INNER_STATE_TALKING : TRUNK_STATE_TALKING); info.nPeerResType = nTypeA; lstrcpy(info.szPeerResId, szIDA); info.nFlag = 1; lstrcpy(info.szCallerNum, m_CallerNum); lstrcpy(info.szCalleeNum, m_CalleeNum); CTapiControl::GetInstance().onDevLinkEventS(&info); // 触发TAPI事件 return; } // end if // B端主动挂机 if(m_BState == CSDisconnected && m_BConnected == 0) { // 填充内容(主叫端) ZeroMemory(&info, sizeof(DevLinkInfoS)); info.nDevLinkCallId = m_CallId; info.nResType = nTypeA; lstrcpy(info.szResId, szIDA); info.nResStatus = ((nTypeA == DEV_RES_TYPE_EXT) ? INNER_STATE_FREE : TRUNK_STATE_FREE); info.nPeerResType = nTypeB; lstrcpy(info.szPeerResId, szIDB); info.nFlag = 1; CTapiControl::GetInstance().onDevLinkEventS(&info); // 触发TAPI事件 // 填充内容(被叫端) if(nTypeB == DEV_RES_TYPE_UNKNOWN) return; ZeroMemory(&info, sizeof(DevLinkInfoS)); info.nDevLinkCallId = m_CallId; info.nResType = nTypeB; lstrcpy(info.szResId, szIDB); info.nResStatus = ((nTypeB == DEV_RES_TYPE_EXT) ? INNER_STATE_FREE : TRUNK_STATE_FREE); info.nPeerResType = nTypeA; lstrcpy(info.szPeerResId, szIDA); info.nFlag = 0; CTapiControl::GetInstance().onDevLinkEventS(&info); // 触发TAPI事件 return; } // end if // A端保持 if(m_AState == CSConnected && m_BState == CSConnected && m_AConnected == 0 && m_BConnected == 1) { // 填充内容(主叫端) ZeroMemory(&info, sizeof(DevLinkInfoS)); info.nDevLinkCallId = m_CallId; info.nResType = nTypeA; lstrcpy(info.szResId, szIDA); info.nResStatus = INNER_STATE_HELD; info.nPeerResType = -1; CTapiControl::GetInstance().onDevLinkEventS(&info); // 触发TAPI事件 return; } // end if // B端保持 if(m_AState == CSConnected && m_BState == CSConnected && m_AConnected == 1 && m_BConnected == 0) { // 填充内容(被叫端) ZeroMemory(&info, sizeof(DevLinkInfoS)); info.nDevLinkCallId = m_CallId; info.nResType = nTypeB; lstrcpy(info.szResId, szIDB); info.nResStatus = INNER_STATE_HELD; info.nPeerResType = -1; CTapiControl::GetInstance().onDevLinkEventS(&info); // 触发TAPI事件 return; } // end if } /***************************************************************** **【函数名称】 __procEventS_DisConnected **【函数功能】 S事件A端 DisConnected 状态处理 **【参数】 **【返回值】 ****************************************************************/ void CAvayaLinkGw::__procEventS_DisConnected( void ) { // 相关变量初始化 DevLinkInfoS info = { 0 }; CHAR szIDA[MAX_FIELD_LEN] = { 0 }; // A端设备ID CHAR szIDB[MAX_FIELD_LEN] = { 0 }; // B端设备ID DEV_RES_TYPE nTypeA = __getDevInfoA(szIDA); // A端设备类型 DEV_RES_TYPE nTypeB = __getDevInfoB(szIDB); // B端设备类型 // 填充内容(主叫端) ZeroMemory(&info, sizeof(DevLinkInfoS)); info.nDevLinkCallId = m_CallId; info.nResType = nTypeA; lstrcpy(info.szResId, szIDA); info.nResStatus = ((nTypeA == DEV_RES_TYPE_EXT) ? INNER_STATE_FREE : TRUNK_STATE_FREE); info.nPeerResType = nTypeB; lstrcpy(info.szPeerResId, szIDB); info.nFlag = 0; CTapiControl::GetInstance().onDevLinkEventS(&info); // 触发TAPI事件 } /***************************************************************** **【函数名称】 parse **【函数功能】 DevLink消息解析主入口函数 **【参数】 Info DevLink消息串 **【返回值】 ****************************************************************/ void CAvayaLinkGw::parse( char* Info ) { __init(); // 初始化 __parseEventType(Info); // 解析消息类型 // 根据消息类型进行下一步解析 switch(m_EventType) { case DEV_LINK_EVENT_TYPE_S: // S事件 __parseEventS(Info); break; case DEV_LINK_EVENT_TYPE_D: // D事件 __parseEventD(Info); break; case DEV_LINK_EVENT_TYPE_A: // A事件 __parseEventA(Info); break; } // end switch } /***************************************************************** **【函数名称】 dispatchTapiEvent **【函数功能】 根据消息内容分发Tapi事件 **【参数】 **【返回值】 ****************************************************************/ void CAvayaLinkGw::dispatchTapiEvent( void ) { switch(m_EventType) { case DEV_LINK_EVENT_TYPE_S: __procEventS(); break; case DEV_LINK_EVENT_TYPE_A: CTapiControl::GetInstance().onDevLinkEventA(m_CallId); break; case DEV_LINK_EVENT_TYPE_D: CTapiControl::GetInstance().onDevLinkEventD(m_CallId); break; } // end switch }