| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215 |
- #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();
- }
|