| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802 |
- #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
- }
|