#include "StdAfx.h" #include "AvayaLinkControl.h" #include "../3rd/ipo/devlink.h" #include "DevControl.h" #include "AvayaLinkGw.h" #include "Config.h" SINGLETON_IMPLEMENT(CAvayaLinkControl) CAvayaLinkControl::CAvayaLinkControl(void) : m_Stop(true), m_EventThread(NULL) { } CAvayaLinkControl::~CAvayaLinkControl(void) { __freeAllLinkGw(); } /***************************************************************** **【函数名称】 __devLinkCommsEvent **【函数功能】 DevLink主应用事件回调接口 **【参数】 **【返回值】 ****************************************************************/ void CALLBACK CAvayaLinkControl::__devLinkCommsEvent( DWORD hPbx, DWORD nEvent, DWORD nParam1 ) { switch(nEvent) { case DEVLINK_COMMS_OPERATIONAL: // 连接成功 CAvayaLinkControl::GetInstance().__onConnectResult(true); break; case DEVLINK_COMMS_NORESPONSE: // 连接失败 case DEVLINK_COMMS_REJECTED: case DEVLINK_COMMS_MISSEDPACKETS: CAvayaLinkControl::GetInstance().__onConnectResult(false); break; } // end switch } /***************************************************************** **【函数名称】 __devLinkDetailEvent **【函数功能】 DevLink明细事件回调接口 **【参数】 **【返回值】 ****************************************************************/ void CALLBACK CAvayaLinkControl::__devLinkDetailEvent( DWORD hPbx, char* pszInfo ) { CAvayaLinkControl::GetInstance().__onDetailEvent(pszInfo); } /***************************************************************** **【函数名称】 __wait **【函数功能】 置线程于等待信号状态 **【参数】 **【返回值】 ****************************************************************/ void CAvayaLinkControl::__wait( void ) { m_ThreadWaitFlag.Lock(); } /***************************************************************** **【函数名称】 __dispatchEvent **【函数功能】 分发DevLink事件的线程函数 **【参数】 **【返回值】 ****************************************************************/ UINT CAvayaLinkControl::__dispatchEvent( LPVOID pParam ) { CAvayaLinkControl* pLinkCtrl = (CAvayaLinkControl*)pParam; ASSERT(pLinkCtrl != NULL); while(!pLinkCtrl->m_Stop) { if(pLinkCtrl->__procEvent() == 0) pLinkCtrl->__wait(); } // end while return 0; } /***************************************************************** **【函数名称】 __onConnectResult **【函数功能】 DevLink连接结果事件 **【参数】 IsSucceed 连接是否成功 **【返回值】 ****************************************************************/ void CAvayaLinkControl::__onConnectResult( bool IsSucceed ) { if(IsSucceed) { CDevControl::GetInstance().onEventLog(LOG_LEVEL_NORMAL, _T("{AvayaLink}: DevLink打开成功")); // 注册DevLink明细事件响应接口 DLRegisterType2CallDeltas(0, __devLinkDetailEvent); m_Stop = false; // 启动队列处理线程 m_EventThread = AfxBeginThread(__dispatchEvent, this); } else { CDevControl::GetInstance().onEventLog(LOG_LEVEL_WARNING, _T("{AvayaLink}: DevLink链接中断, 重新连接中...")); close(); open(); } // end if } /***************************************************************** **【函数名称】 __onDetailEvent **【函数功能】 DevLink明细消息事件 **【参数】 Info 消息内容 **【返回值】 ****************************************************************/ void CAvayaLinkControl::__onDetailEvent( char* Info ) { // 解析事件内容并存入待处理缓冲区 CAvayaLinkGw* pLinkGw = new CAvayaLinkGw(); pLinkGw->parse(Info); m_LockSection.Lock(); // 互斥加锁 m_ListDevLinkGw.AddTail(pLinkGw); m_LockSection.Unlock(); // 互斥解锁 m_ThreadWaitFlag.SetEvent(); } /***************************************************************** **【函数名称】 __procEvent **【函数功能】 将事件队列中的事件进行分发处理 **【参数】 **【返回值】 当前队列中结余的事件数 ****************************************************************/ UINT CAvayaLinkControl::__procEvent( void ) { if(m_ListDevLinkGw.GetCount() > 0) { m_LockSection.Lock(); CAvayaLinkGw* pLinkGw = m_ListDevLinkGw.RemoveHead(); m_LockSection.Unlock(); pLinkGw->dispatchTapiEvent(); delete pLinkGw; } // end if return m_ListDevLinkGw.GetCount(); } /***************************************************************** **【函数名称】 __freeAllLinkGw **【函数功能】 销毁所有Avaya link网关 **【参数】 **【返回值】 当前队列中结余的事件数 ****************************************************************/ void CAvayaLinkControl::__freeAllLinkGw( void ) { m_LockSection.Lock(); while(m_ListDevLinkGw.GetCount() > 0) { delete m_ListDevLinkGw.RemoveHead(); } m_LockSection.Unlock(); } /***************************************************************** **【函数名称】 open **【函数功能】 打开DevLink连接 **【参数】 **【返回值】 ****************************************************************/ void CAvayaLinkControl::open( void ) { CString LinkIp = CConfig::devLinkIp(); CString LinkPwd = CConfig::devLinkPwd(); CDevControl::GetInstance().onEventLog(LOG_LEVEL_NORMAL, _T("{AvayaLink}: 开始打开DevLink, IP = %s, Password = %s"), LinkIp, LinkPwd); DLOpen(0, LinkIp.GetBuffer(), LinkPwd.GetBuffer(), NULL, NULL, __devLinkCommsEvent); } /***************************************************************** **【函数名称】 close **【函数功能】 关闭DevLink连接 **【参数】 **【返回值】 ****************************************************************/ void CAvayaLinkControl::close( void ) { m_Stop = true; DLClose(0); // 关闭连接 // 关闭队列处理线程 if(m_EventThread != NULL) { DWORD ExitCode; GetExitCodeThread(m_EventThread->m_hThread, &ExitCode); if(ExitCode == STILL_ACTIVE) { m_ThreadWaitFlag.SetEvent(); WaitForSingleObject(m_EventThread->m_hThread, INFINITE); } m_EventThread = NULL; } __freeAllLinkGw(); }