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

AvayaLinkControl.cpp 5.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. #include "StdAfx.h"
  2. #include "AvayaLinkControl.h"
  3. #include "../3rd/ipo/devlink.h"
  4. #include "DevControl.h"
  5. #include "AvayaLinkGw.h"
  6. #include "Config.h"
  7. SINGLETON_IMPLEMENT(CAvayaLinkControl)
  8. CAvayaLinkControl::CAvayaLinkControl(void) : m_Stop(true), m_EventThread(NULL)
  9. {
  10. }
  11. CAvayaLinkControl::~CAvayaLinkControl(void)
  12. {
  13. __freeAllLinkGw();
  14. }
  15. /*****************************************************************
  16. **【函数名称】 __devLinkCommsEvent
  17. **【函数功能】 DevLink主应用事件回调接口
  18. **【参数】
  19. **【返回值】
  20. ****************************************************************/
  21. void CALLBACK CAvayaLinkControl::__devLinkCommsEvent( DWORD hPbx, DWORD nEvent, DWORD nParam1 )
  22. {
  23. switch(nEvent)
  24. {
  25. case DEVLINK_COMMS_OPERATIONAL: // 连接成功
  26. CAvayaLinkControl::GetInstance().__onConnectResult(true);
  27. break;
  28. case DEVLINK_COMMS_NORESPONSE: // 连接失败
  29. case DEVLINK_COMMS_REJECTED:
  30. case DEVLINK_COMMS_MISSEDPACKETS:
  31. CAvayaLinkControl::GetInstance().__onConnectResult(false);
  32. break;
  33. } // end switch
  34. }
  35. /*****************************************************************
  36. **【函数名称】 __devLinkDetailEvent
  37. **【函数功能】 DevLink明细事件回调接口
  38. **【参数】
  39. **【返回值】
  40. ****************************************************************/
  41. void CALLBACK CAvayaLinkControl::__devLinkDetailEvent( DWORD hPbx, char* pszInfo )
  42. {
  43. CAvayaLinkControl::GetInstance().__onDetailEvent(pszInfo);
  44. }
  45. /*****************************************************************
  46. **【函数名称】 __wait
  47. **【函数功能】 置线程于等待信号状态
  48. **【参数】
  49. **【返回值】
  50. ****************************************************************/
  51. void CAvayaLinkControl::__wait( void )
  52. {
  53. m_ThreadWaitFlag.Lock();
  54. }
  55. /*****************************************************************
  56. **【函数名称】 __dispatchEvent
  57. **【函数功能】 分发DevLink事件的线程函数
  58. **【参数】
  59. **【返回值】
  60. ****************************************************************/
  61. UINT CAvayaLinkControl::__dispatchEvent( LPVOID pParam )
  62. {
  63. CAvayaLinkControl* pLinkCtrl = (CAvayaLinkControl*)pParam;
  64. ASSERT(pLinkCtrl != NULL);
  65. while(!pLinkCtrl->m_Stop)
  66. {
  67. if(pLinkCtrl->__procEvent() == 0)
  68. pLinkCtrl->__wait();
  69. } // end while
  70. return 0;
  71. }
  72. /*****************************************************************
  73. **【函数名称】 __onConnectResult
  74. **【函数功能】 DevLink连接结果事件
  75. **【参数】 IsSucceed 连接是否成功
  76. **【返回值】
  77. ****************************************************************/
  78. void CAvayaLinkControl::__onConnectResult( bool IsSucceed )
  79. {
  80. if(IsSucceed)
  81. {
  82. CDevControl::GetInstance().onEventLog(LOG_LEVEL_NORMAL, _T("{AvayaLink}: DevLink打开成功"));
  83. // 注册DevLink明细事件响应接口
  84. DLRegisterType2CallDeltas(0, __devLinkDetailEvent);
  85. m_Stop = false;
  86. // 启动队列处理线程
  87. m_EventThread = AfxBeginThread(__dispatchEvent, this);
  88. }
  89. else
  90. {
  91. CDevControl::GetInstance().onEventLog(LOG_LEVEL_WARNING, _T("{AvayaLink}: DevLink链接中断, 重新连接中..."));
  92. close();
  93. open();
  94. } // end if
  95. }
  96. /*****************************************************************
  97. **【函数名称】 __onDetailEvent
  98. **【函数功能】 DevLink明细消息事件
  99. **【参数】 Info 消息内容
  100. **【返回值】
  101. ****************************************************************/
  102. void CAvayaLinkControl::__onDetailEvent( char* Info )
  103. {
  104. // 解析事件内容并存入待处理缓冲区
  105. CAvayaLinkGw* pLinkGw = new CAvayaLinkGw();
  106. pLinkGw->parse(Info);
  107. m_LockSection.Lock(); // 互斥加锁
  108. m_ListDevLinkGw.AddTail(pLinkGw);
  109. m_LockSection.Unlock(); // 互斥解锁
  110. m_ThreadWaitFlag.SetEvent();
  111. }
  112. /*****************************************************************
  113. **【函数名称】 __procEvent
  114. **【函数功能】 将事件队列中的事件进行分发处理
  115. **【参数】
  116. **【返回值】 当前队列中结余的事件数
  117. ****************************************************************/
  118. UINT CAvayaLinkControl::__procEvent( void )
  119. {
  120. if(m_ListDevLinkGw.GetCount() > 0)
  121. {
  122. m_LockSection.Lock();
  123. CAvayaLinkGw* pLinkGw = m_ListDevLinkGw.RemoveHead();
  124. m_LockSection.Unlock();
  125. pLinkGw->dispatchTapiEvent();
  126. delete pLinkGw;
  127. } // end if
  128. return m_ListDevLinkGw.GetCount();
  129. }
  130. /*****************************************************************
  131. **【函数名称】 __freeAllLinkGw
  132. **【函数功能】 销毁所有Avaya link网关
  133. **【参数】
  134. **【返回值】 当前队列中结余的事件数
  135. ****************************************************************/
  136. void CAvayaLinkControl::__freeAllLinkGw( void )
  137. {
  138. m_LockSection.Lock();
  139. while(m_ListDevLinkGw.GetCount() > 0)
  140. {
  141. delete m_ListDevLinkGw.RemoveHead();
  142. }
  143. m_LockSection.Unlock();
  144. }
  145. /*****************************************************************
  146. **【函数名称】 open
  147. **【函数功能】 打开DevLink连接
  148. **【参数】
  149. **【返回值】
  150. ****************************************************************/
  151. void CAvayaLinkControl::open( void )
  152. {
  153. CString LinkIp = CConfig::devLinkIp();
  154. CString LinkPwd = CConfig::devLinkPwd();
  155. CDevControl::GetInstance().onEventLog(LOG_LEVEL_NORMAL, _T("{AvayaLink}: 开始打开DevLink, IP = %s, Password = %s"), LinkIp, LinkPwd);
  156. DLOpen(0, LinkIp.GetBuffer(), LinkPwd.GetBuffer(), NULL, NULL, __devLinkCommsEvent);
  157. }
  158. /*****************************************************************
  159. **【函数名称】 close
  160. **【函数功能】 关闭DevLink连接
  161. **【参数】
  162. **【返回值】
  163. ****************************************************************/
  164. void CAvayaLinkControl::close( void )
  165. {
  166. m_Stop = true;
  167. DLClose(0); // 关闭连接
  168. // 关闭队列处理线程
  169. if(m_EventThread != NULL)
  170. {
  171. DWORD ExitCode;
  172. GetExitCodeThread(m_EventThread->m_hThread, &ExitCode);
  173. if(ExitCode == STILL_ACTIVE)
  174. {
  175. m_ThreadWaitFlag.SetEvent();
  176. WaitForSingleObject(m_EventThread->m_hThread, INFINITE);
  177. }
  178. m_EventThread = NULL;
  179. }
  180. __freeAllLinkGw();
  181. }