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

IprControl.cpp 30KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007
  1. #include "StdAfx.h"
  2. #include "IprControl.h"
  3. #include "LineRecordIpra.h"
  4. #include "LineRecordIprr.h"
  5. #include "Config.h"
  6. #include <sys/stat.h>
  7. SINGLETON_IMPLEMENT(CIprControl)
  8. CIprControl::CIprControl(void) : m_IprBoardId(CONST_BOARD_NULL), m_IpaBoardId(CONST_BOARD_NULL), m_SlaverCount(0)
  9. {
  10. ZeroMemory(&m_IprSlaver, sizeof(IPR_SLAVERADDR));
  11. }
  12. CIprControl::~CIprControl(void)
  13. {
  14. }
  15. /*****************************************************************
  16. **【函数名称】 __checkRecFileEnv
  17. **【函数功能】 检查录音文件环境
  18. **【参数】 WaveFile: 文件路径
  19. **【返回值】
  20. ****************************************************************/
  21. DWORD CIprControl::__checkRecFileEnv( LPCTSTR RecFile )
  22. {
  23. struct stat st;
  24. if(stat(RecFile, &st) == 0)
  25. return st.st_size;
  26. else
  27. {
  28. if(errno == ENOENT)
  29. {
  30. CString tmpPath = RecFile;
  31. int index = tmpPath.ReverseFind('\\');
  32. if (index == -1)
  33. index = tmpPath.ReverseFind('/');
  34. tmpPath = tmpPath.Left(index + 1);
  35. SHCreateDirectoryEx(NULL, tmpPath, NULL);
  36. }
  37. return 0;
  38. }
  39. }
  40. /*****************************************************************
  41. **【函数名称】 __scanIprSlaver
  42. **【函数功能】 扫描slaver资源
  43. **【参数】
  44. **【返回值】
  45. ****************************************************************/
  46. void CIprControl::__scanIprSlaver( void )
  47. {
  48. m_SlaverCount = SsmIPRGetRecSlaverCount(m_IprBoardId);
  49. if(m_SlaverCount > 0)
  50. {
  51. // 目前仅考虑适用单路slaver
  52. if(SsmIPRGetRecSlaverList(m_IprBoardId, 1, &m_SlaverCount, &m_IprSlaver) < 0)
  53. {
  54. char szErrMsg[DEV_OP_BUF_LEN];
  55. SsmGetLastErrMsg(szErrMsg);
  56. ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_WARNING, _T("{IprCtrl}: 获取IPR Slaver信息失败, Cause = %s"), szErrMsg);
  57. }
  58. }
  59. }
  60. /*****************************************************************
  61. **【函数名称】 __openIprSlaver
  62. **【函数功能】 分配slaver资源
  63. **【参数】
  64. **【返回值】
  65. ****************************************************************/
  66. void CIprControl::__openIprSlaver( void )
  67. {
  68. if(m_SlaverCount > 0)
  69. {
  70. SYSTEM_INFO si;
  71. ZeroMemory(&si, sizeof(SYSTEM_INFO));
  72. GetSystemInfo(&si);
  73. int ThreadPairs = si.dwNumberOfProcessors;
  74. int TotalResources = m_IprrLineArray.GetCount();
  75. // 目前仅考虑适用单路slaver
  76. if(SsmIPRStartRecSlaver(m_IprBoardId, m_IprSlaver.nRecSlaverID, &TotalResources, &ThreadPairs) < 0)
  77. {
  78. char szErrMsg[DEV_OP_BUF_LEN];
  79. SsmGetLastErrMsg(szErrMsg);
  80. ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_WARNING, _T("{IprCtrl}: 启动IPR Slaver失败, Cause = %s"), szErrMsg);
  81. }
  82. else
  83. {
  84. ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_NORMAL, _T("{IprCtrl}: 启动IPR Slaver成功"));
  85. }
  86. }
  87. else
  88. {
  89. ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_WARNING, _T("{IprCtrl}: 启动IPR Slaver失败, 无可用的Slaver"));
  90. }
  91. }
  92. /*****************************************************************
  93. **【函数名称】 __closeIprSlaver
  94. **【函数功能】 释放slaver资源
  95. **【参数】
  96. **【返回值】
  97. ****************************************************************/
  98. void CIprControl::__closeIprSlaver( void )
  99. {
  100. if(m_SlaverCount > 0)
  101. {
  102. // 目前仅考虑适用单路slaver
  103. SsmIPRCloseRecSlaver(m_IprBoardId, m_IprSlaver.nRecSlaverID);
  104. ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_NORMAL, _T("{IprCtrl}: 关闭IPR Slaver"));
  105. }
  106. }
  107. /*****************************************************************
  108. **【函数名称】 __findLineIpraBySessionId
  109. **【函数功能】 根据会话ID查找IPRA线路
  110. **【参数】
  111. **【返回值】
  112. ****************************************************************/
  113. CLineRecordIpra* CIprControl::__findLineIpraBySessionId( int SessionId )
  114. {
  115. int Count = m_IpraLineArray.GetCount();
  116. for (int i = 0; i < Count; ++i)
  117. {
  118. CLineRecordIpra* pLine = m_IpraLineArray[i];
  119. ASSERT(pLine != NULL);
  120. if (pLine->sessionId() == SessionId)
  121. return pLine;
  122. }
  123. return NULL;
  124. }
  125. /*****************************************************************
  126. **【函数名称】 __findLineIprrByStationId
  127. **【函数功能】 根据Station ID查找IPRR线路
  128. **【参数】
  129. **【返回值】
  130. ****************************************************************/
  131. CLineRecordIprr* CIprControl::__findLineIprrByStationId( int StationId )
  132. {
  133. int Count = m_IprrLineArray.GetCount();
  134. for (int i = 0; i < Count; ++i)
  135. {
  136. CLineRecordIprr* pLine = m_IprrLineArray[i];
  137. ASSERT(pLine != NULL);
  138. if (pLine->stationId() == StationId)
  139. return pLine;
  140. }
  141. return NULL;
  142. }
  143. /*****************************************************************
  144. **【函数名称】 __startRecord
  145. **【函数功能】 录音
  146. **【参数】 pLine: 录音线路
  147. FileName: 录音文件完全路径
  148. **【返回值】 成功TRUE, 失败FALSE
  149. ****************************************************************/
  150. bool CIprControl::__startRecord( CLineRecordIprr* pLine, LPCTSTR FileName )
  151. {
  152. int LineID = pLine->id();
  153. if(pLine->recState() == REC_STATE_ACTIVED)
  154. {
  155. // 当前正在录音,停止录音
  156. __stopRecord(pLine);
  157. ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_WARNING, _T("{IprCtrl}: 线路[%d]开始录音前已处于录音状态, 录音被终止"), LineID);
  158. return false;
  159. }
  160. // 当前已关联会话
  161. if(pLine->isSessionActived())
  162. {
  163. //检测文件环境
  164. DWORD StartPos = __checkRecFileEnv(FileName);
  165. SsmIPRSetMixerType(LineID, 2); // 混音录音
  166. int Res = SsmRecToFile(LineID, FileName, CONST_IPR_FILE_FORMAT, StartPos, -1, -1, 0);
  167. if(Res < 0)
  168. {
  169. char szErrMsg[DEV_OP_BUF_LEN] = { 0 };
  170. SsmGetLastErrMsg(szErrMsg);
  171. ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_WARNING, _T("{IprCtrl}: 线路[%d]启动录音出错, Cause = %s"), LineID, szErrMsg);
  172. return false;
  173. }
  174. else
  175. {
  176. ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_NORMAL, _T("{IprCtrl}: 线路[%d]启动录音, FileName = %s, StartPos = %u"), LineID, FileName, StartPos);
  177. return true;
  178. }
  179. }
  180. else
  181. {
  182. ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_NORMAL, _T("{IprCtrl}: 线路[%d]启动录音时会话尚未激活, FileName = %s"), LineID, FileName);
  183. return true;
  184. }
  185. }
  186. /*****************************************************************
  187. **【函数名称】 __stopRecord
  188. **【函数功能】 停止留言
  189. **【参数】 pLine: 线路
  190. **【返回值】
  191. ****************************************************************/
  192. bool CIprControl::__stopRecord( CLineRecordIprr* pLine )
  193. {
  194. int LineID = pLine->id();
  195. switch(pLine->recState())
  196. {
  197. case REC_STATE_ACTIVED:
  198. case REC_STATE_PAUSED:
  199. {
  200. pLine->resetRecContext();
  201. if(SsmIPRDeActiveAndStopRecToFile(pLine->id()) < 0)
  202. {
  203. char szErrMsg[DEV_OP_BUF_LEN] = { 0 };
  204. SsmGetLastErrMsg(szErrMsg);
  205. ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_WARNING, _T("{IprCtrl}: 线路[%d]停止录音失败, Cause = %s"), LineID, szErrMsg);
  206. return false;
  207. }
  208. }
  209. break;
  210. case REC_STATE_WAIT:
  211. {
  212. pLine->resetRecContext();
  213. if(SsmIPRDeActiveSession(pLine->id()) < 0)
  214. {
  215. char szErrMsg[DEV_OP_BUF_LEN] = { 0 };
  216. SsmGetLastErrMsg(szErrMsg);
  217. ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_WARNING, _T("{IprCtrl}: 线路[%d]去激活会话失败, Cause = %s"), LineID, szErrMsg);
  218. return false;
  219. }
  220. }
  221. break;
  222. default:
  223. pLine->resetRecContext();
  224. ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_WARNING, _T("{IprCtrl}: 线路[%d]停止录音时状态已空闲"), LineID);
  225. return false;
  226. }
  227. ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_NORMAL, _T("{IprCtrl}: 线路[%d]停止录音成功"), LineID);
  228. return true;
  229. }
  230. /*****************************************************************
  231. **【函数名称】 __pauseRecord
  232. **【函数功能】 暂停录音
  233. **【参数】 pLine: 线路
  234. **【返回值】 成功TRUE, 失败FALSE
  235. ****************************************************************/
  236. bool CIprControl::__pauseRecord( CLineRecordIprr* pLine )
  237. {
  238. int LineID = pLine->id();
  239. if(pLine->recState() != REC_STATE_ACTIVED)
  240. {
  241. ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_WARNING, _T("{IprCtrl}: 线路[%d]未进行录音或录音已暂停"), LineID);
  242. return false;
  243. }
  244. //暂停录音
  245. if (SsmPauseRecToFile(LineID) == 0)
  246. {
  247. return true;
  248. }
  249. else
  250. {
  251. char szErrMsg[DEV_OP_BUF_LEN] = { 0 };
  252. SsmGetLastErrMsg(szErrMsg);
  253. ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_WARNING, _T("{IprCtrl}: 线路[%d]暂停录音失败, Cause = %s"), LineID, szErrMsg);
  254. return false;
  255. }
  256. }
  257. /*****************************************************************
  258. **【函数名称】 __resumeRecord
  259. **【函数功能】 继续录音
  260. **【参数】 pLine: 线路
  261. **【返回值】 成功TRUE, 失败FALSE
  262. ****************************************************************/
  263. bool CIprControl::__resumeRecord( CLineRecordIprr* pLine )
  264. {
  265. int LineID = pLine->id();
  266. if(pLine->recState() != REC_STATE_PAUSED)
  267. {
  268. ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_WARNING, _T("{IprCtrl}: 线路[%d]没有被暂停的录音任务"), LineID);
  269. return false;
  270. }
  271. if (SsmRestartRecToFile(LineID) == -1)
  272. {
  273. char szErrMsg[DEV_OP_BUF_LEN] = { 0 };
  274. SsmGetLastErrMsg(szErrMsg);
  275. ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_WARNING, _T("{IprCtrl}: 线路[%d]重启录音失败, Cause = %s"), LineID, szErrMsg);
  276. return false;
  277. }
  278. else
  279. {
  280. return true;
  281. }
  282. }
  283. /*****************************************************************
  284. **【函数名称】 init
  285. **【函数功能】 初始化
  286. **【参数】
  287. **【返回值】
  288. ****************************************************************/
  289. void CIprControl::init( void )
  290. {
  291. int TotalBoards = SsmGetMaxUsableBoard();
  292. for(int i = 0; i < TotalBoards; ++i)
  293. {
  294. if(SsmGetBoardModel(i) == CONST_BOARD_IPRR) // IPRecorder card type is 0xfd
  295. {
  296. m_IprBoardId = i;
  297. break;
  298. }
  299. }
  300. if(m_IprBoardId == CONST_BOARD_NULL)
  301. {
  302. ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_WARNING, _T("{IprCtrl}: 未检测到IPRecorder卡"));
  303. return;
  304. }
  305. for(int i = 0; i < TotalBoards; ++i)
  306. {
  307. if(SsmGetBoardModel(i) == CONST_BOARD_IPRA) // IPAnalyzer card type is 0xfe
  308. {
  309. m_IpaBoardId = i;
  310. break;
  311. }
  312. }
  313. if(m_IpaBoardId == CONST_BOARD_NULL)
  314. {
  315. ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_WARNING, _T("{IprCtrl}: 未检测到IPAnalyzer卡"));
  316. return;
  317. }
  318. // 映射分机
  319. CHAR ExtenNum[PHONE_NUM_LEN] = { 0 };
  320. for(int i = 0; i < m_IprrLineArray.GetCount(); ++i)
  321. {
  322. CLineRecordIprr* pLine = m_IprrLineArray[i];
  323. ASSERT(pLine != NULL);
  324. int IpoLineId = pLine->assoIpoId();
  325. if(IpoLineId > 0)
  326. {
  327. ZeroMemory(ExtenNum, PHONE_NUM_LEN);
  328. sprintf_s(ExtenNum, _T("%d"), pLine->assoIpoId());
  329. if(SsmIPRAddStationToMapEx(m_IpaBoardId, i, NULL, 0, ExtenNum, NULL) < 0)
  330. ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_WARNING, _T("{IprCtrl}: 映射分机[%d-%d]失败"), IpoLineId, i);
  331. else
  332. pLine->stationId() = i;
  333. }
  334. }
  335. }
  336. /*****************************************************************
  337. **【函数名称】 release
  338. **【函数功能】 释放资源
  339. **【参数】
  340. **【返回值】
  341. ****************************************************************/
  342. void CIprControl::release( void )
  343. {
  344. __closeIprSlaver();
  345. for(int i = 0; i < m_IprrLineArray.GetCount(); ++i)
  346. {
  347. ASSERT(m_IprrLineArray[i] != NULL);
  348. delete m_IprrLineArray[i];
  349. }
  350. m_IprrLineArray.RemoveAll();
  351. for(int i = 0; i < m_IpraLineArray.GetCount(); ++i)
  352. {
  353. ASSERT(m_IpraLineArray[i] != NULL);
  354. delete m_IpraLineArray[i];
  355. }
  356. m_IpraLineArray.RemoveAll();
  357. }
  358. /*****************************************************************
  359. **【函数名称】 newIprrLine
  360. **【函数功能】 创建IPRR线路
  361. **【参数】
  362. **【返回值】
  363. ****************************************************************/
  364. void CIprControl::newIprrLine( int LineID )
  365. {
  366. CLineRecordIprr* pLine = new CLineRecordIprr(LineID);
  367. m_IprrLineArray.Add(pLine);
  368. CMsgCenter::GetInstance().pushMsg(VS_MSG_LINE_STATE_UPDATE, reinterpret_cast<const PARAM>(LineID));
  369. }
  370. /*****************************************************************
  371. **【函数名称】 newIpraLine
  372. **【函数功能】 创建IPRA线路
  373. **【参数】
  374. **【返回值】
  375. ****************************************************************/
  376. void CIprControl::newIpraLine( int LineID )
  377. {
  378. CLineRecordIpra* pLine = new CLineRecordIpra(LineID);
  379. m_IpraLineArray.Add(pLine);
  380. }
  381. /*****************************************************************
  382. **【函数名称】 findLineByID
  383. **【函数功能】 根据线路逻辑号查找线路对象
  384. **【参数】 LineID:线路逻辑号
  385. **【返回值】 线路对象
  386. ****************************************************************/
  387. CLine* CIprControl::findLineByID( int LineID )
  388. {
  389. int Count = m_IprrLineArray.GetCount();
  390. for (int i = 0; i < Count; ++i)
  391. {
  392. CLine* pLine = m_IprrLineArray[i];
  393. ASSERT(pLine != NULL);
  394. if (pLine->id() == LineID)
  395. return pLine;
  396. }
  397. Count = m_IpraLineArray.GetCount();
  398. for(int i = 0; i < Count; ++i)
  399. {
  400. CLine* pLine = m_IpraLineArray[i];
  401. ASSERT(pLine != NULL);
  402. if (pLine->id() == LineID)
  403. return pLine;
  404. }
  405. return NULL;
  406. }
  407. /*****************************************************************
  408. **【函数名称】 findLineByIPOLineID
  409. **【函数功能】 根据IPO的线路ID查找线路
  410. **【参数】
  411. **【返回值】
  412. ****************************************************************/
  413. CLineRecordIprr* CIprControl::findLineByIPOLineID( int IpoLineID )
  414. {
  415. // 仅查找IPRR线路
  416. int Count = m_IprrLineArray.GetCount();
  417. for (int i = 0; i < Count; ++i)
  418. {
  419. CLineRecordIprr* pLine = m_IprrLineArray[i];
  420. ASSERT(pLine != NULL);
  421. if (pLine->assoIpoId() == IpoLineID)
  422. return pLine;
  423. }
  424. return NULL;
  425. }
  426. /*****************************************************************
  427. **【函数名称】 onCmdLineRecord
  428. **【函数功能】 录音线路命令处理
  429. **【参数】 pLine 放音线路指针
  430. pPdu 命令指针
  431. **【返回值】
  432. ****************************************************************/
  433. void CIprControl::onCmdLineRecord( CLineRecordIprr* pLine, CPduEntity* pPdu )
  434. {
  435. CString szRecFileName = pPdu->GetDataString(3); //录音文件名
  436. switch(pPdu->GetDataInt(2))
  437. {
  438. case RECORD_CONTROL_BEGIN: // 录音开始
  439. {
  440. ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_NORMAL, _T("{IprCtrl}: 线路[%d]收到开始录音命令, RecFile = %s"), pLine->id(), szRecFileName);
  441. __startRecord(pLine, szRecFileName);
  442. pLine->setCmd(pPdu);
  443. }
  444. break;
  445. case RECORD_CONTROL_END: // 停止录音
  446. {
  447. ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_NORMAL, _T("{IprCtrl}: 线路[%d]收到停止录音命令, RecFile = %s"), pLine->id(), szRecFileName);
  448. __stopRecord(pLine);
  449. }
  450. break;
  451. case RECORD_CONTROL_PAUSE: // 暂停录音
  452. {
  453. ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_NORMAL, _T("{IprCtrl}: 线路[%d]收到暂停录音命令, RecFile = %s"), pLine->id(), szRecFileName);
  454. __pauseRecord(pLine);
  455. }
  456. break;
  457. case RECORD_CONTROL_RESUME: // 继续录音
  458. {
  459. ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_NORMAL, _T("{IprCtrl}: 线路[%d]收到继续录音命令, RecFile = %s"), pLine->id(), szRecFileName);
  460. __resumeRecord(pLine);
  461. }
  462. break;
  463. } // end switch
  464. }
  465. /*****************************************************************
  466. **【函数名称】 onCmdLineControl
  467. **【函数功能】 录音线路控制命令处理
  468. **【参数】 pLine 放音线路指针
  469. pPduEntity 命令指针
  470. **【返回值】
  471. ****************************************************************/
  472. void CIprControl::onCmdLineControl( CLineRecordIprr* pLine, CPduEntity* pPdu )
  473. {
  474. int lineControl = pPdu->GetDataInt(1);
  475. if(lineControl == IVR_LINE_HANG_UP)
  476. {
  477. ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_NORMAL, _T("{IprCtrl}: 录音线路[%d]收到挂机控制命令"), pLine->id());
  478. pLine->freeCmd();
  479. __stopRecord(pLine);
  480. }
  481. }
  482. /*****************************************************************
  483. **【函数名称】 onEventUsbKeyRemoved
  484. **【函数功能】 授权狗被移除事件处理
  485. **【参数】
  486. **【返回值】
  487. ****************************************************************/
  488. void CIprControl::onEventUsbKeyRemoved( PSSM_EVENT pEvent )
  489. {
  490. ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_WARNING, _T("{IprCtrl}: 录音授权USB KEY被移除"));
  491. }
  492. /*****************************************************************
  493. **【函数名称】 onEventAuthOverflow
  494. **【函数功能】 授权溢出事件处理
  495. **【参数】
  496. **【返回值】
  497. ****************************************************************/
  498. void CIprControl::onEventAuthOverflow( PSSM_EVENT pEvent )
  499. {
  500. ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_WARNING, _T("{IprCtrl}: 录音授权溢出"));
  501. }
  502. /*****************************************************************
  503. **【函数名称】 onEventSlaverConnected
  504. **【函数功能】 检测到录音Slaver连接的处理函数
  505. **【参数】
  506. **【返回值】
  507. ****************************************************************/
  508. void CIprControl::onEventSlaverConnected( PSSM_EVENT pEvent )
  509. {
  510. if(m_SlaverCount == 0)
  511. {
  512. __scanIprSlaver();
  513. __openIprSlaver();
  514. }
  515. }
  516. /*****************************************************************
  517. **【函数名称】 onEventSlaverDisconnected
  518. **【函数功能】 检测到录音Slaver连接中断的处理函数
  519. **【参数】
  520. **【返回值】
  521. ****************************************************************/
  522. void CIprControl::onEventSlaverDisconnected( PSSM_EVENT pEvent )
  523. {
  524. if((int)(pEvent->dwParam >> 16) == m_IprSlaver.nRecSlaverID)
  525. {
  526. __closeIprSlaver();
  527. __scanIprSlaver();
  528. }
  529. }
  530. /*****************************************************************
  531. **【函数名称】 onEventStartSlaverCb
  532. **【函数功能】 启动slaver反馈事件的处理
  533. **【参数】
  534. **【返回值】
  535. ****************************************************************/
  536. void CIprControl::onEventStartSlaverCb( PSSM_EVENT pEvent )
  537. {
  538. int SlaverId = pEvent->dwParam >> 16;
  539. int CbCode = pEvent->dwParam & 0xffff;
  540. if(CbCode != 0)
  541. {
  542. __closeIprSlaver();
  543. __scanIprSlaver();
  544. __openIprSlaver();
  545. ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_WARNING, _T("{IprCtrl}: IPR Slaver[%d]启动失败, ErrCode = %d"), SlaverId, CbCode);
  546. }
  547. }
  548. /*****************************************************************
  549. **【函数名称】 onEventCloseSlaverCb
  550. **【函数功能】 关闭slaver反馈事件的处理
  551. **【参数】
  552. **【返回值】
  553. ****************************************************************/
  554. void CIprControl::onEventCloseSlaverCb( PSSM_EVENT pEvent )
  555. {
  556. #ifdef _DEBUG
  557. int SlaverId = pEvent->dwParam >> 16;
  558. int CbCode = pEvent->dwParam & 0xffff;
  559. if(CbCode == 0)
  560. {
  561. ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_NORMAL, _T("{IprCtrl}: IPR Slaver[%d]已关闭"), SlaverId);
  562. }
  563. else
  564. {
  565. ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_WARNING, _T("{IprCtrl}: IPR Slaver[%d]关闭失败, ErrCode = %d"), SlaverId, CbCode);
  566. }
  567. #endif
  568. }
  569. /*****************************************************************
  570. **【函数名称】 onEventStationAdd
  571. **【函数功能】 station添加事件的处理
  572. **【参数】
  573. **【返回值】
  574. ****************************************************************/
  575. void CIprControl::onEventStationAdd( PSSM_EVENT pEvent )
  576. {
  577. int PtlType = pEvent->dwXtraInfo >> 16;
  578. int StationId = pEvent->dwXtraInfo & 0xffff;
  579. if(PtlType != PTL_AVAYA_H323)
  580. return;
  581. CLineRecordIprr* pLine = __findLineIprrByStationId(StationId);
  582. ASSERT(pLine != NULL);
  583. if(pLine != NULL)
  584. ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_NORMAL, _T("{IprCtrl}: 分机[%d]注册, StationId = %d"), pLine->assoIpoId(), StationId);
  585. }
  586. /*****************************************************************
  587. **【函数名称】 onEventStationRemoved
  588. **【函数功能】 station删除事件的处理
  589. **【参数】
  590. **【返回值】
  591. ****************************************************************/
  592. void CIprControl::onEventStationRemoved( PSSM_EVENT pEvent )
  593. {
  594. int PtlType = pEvent->dwXtraInfo >> 16;
  595. int StationId = pEvent->dwXtraInfo & 0xffff;
  596. if(PtlType != PTL_AVAYA_H323)
  597. return;
  598. CLineRecordIprr* pLine = __findLineIprrByStationId(StationId);
  599. ASSERT(pLine != NULL);
  600. if(pLine != NULL)
  601. ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_NORMAL, _T("{IprCtrl}: 分机[%d]注销, StationId = %d"), pLine->assoIpoId(), StationId);
  602. }
  603. /*****************************************************************
  604. **【函数名称】 onEventDChannel
  605. **【函数功能】 D线路信令事件处理
  606. **【参数】
  607. **【返回值】
  608. ****************************************************************/
  609. void CIprControl::onEventDChannel( PSSM_EVENT pEvent )
  610. {
  611. int PtlType = pEvent->dwXtraInfo >> 16;
  612. int StationId = pEvent->dwXtraInfo & 0xffff;
  613. if(PtlType != PTL_AVAYA_H323)
  614. return;
  615. switch(pEvent->dwParam)
  616. {
  617. case DST_CALL_IN_PROGRESS:
  618. case DE_CALL_ALERTING:
  619. case DE_CALL_CONNECTED:
  620. {
  621. CLineRecordIprr* pLineIprr = __findLineIprrByStationId(StationId);
  622. ASSERT(pLineIprr != NULL);
  623. if(pLineIprr != NULL)
  624. {
  625. TRACE(_T("IPO Call[0x%x-%d]: IpoLineId = %d \r\n"), pEvent->dwParam, StationId, pLineIprr->assoIpoId());
  626. }
  627. }
  628. break;
  629. }
  630. }
  631. /*****************************************************************
  632. **【函数名称】 onEventIprState
  633. **【函数功能】 IPR录音事件处理
  634. **【参数】 pLine IPR录音线路指针
  635. int State 状态类型
  636. **【返回值】
  637. ****************************************************************/
  638. void CIprControl::onEventIprState( CLineRecordIprr* pLine, int State )
  639. {
  640. ASSERT(pLine != NULL);
  641. pLine->state() = State;
  642. switch(State)
  643. {
  644. case S_CALL_STANDBY:
  645. case S_CALL_UNAVAILABLE:
  646. case S_IPR_COMMUNICATING:
  647. case S_IPR_USING:
  648. pLine->show();
  649. break;
  650. }
  651. }
  652. /*****************************************************************
  653. **【函数名称】 onEventIpaState
  654. **【函数功能】 IPA录音事件处理
  655. **【参数】 pLine IPA录音线路指针
  656. int State 状态类型
  657. **【返回值】
  658. ****************************************************************/
  659. void CIprControl::onEventIpaState( CLineRecordIpra* pLine, int State )
  660. {
  661. ASSERT(pLine != NULL);
  662. pLine->state() = State;
  663. }
  664. /*****************************************************************
  665. **【函数名称】 onEventStartRecCb
  666. **【函数功能】 开始录音反馈事件的处理
  667. **【参数】
  668. **【返回值】
  669. ****************************************************************/
  670. void CIprControl::onEventStartRecCb( CLineRecordIprr* pLine, PSSM_EVENT pEvent )
  671. {
  672. int SlaverId = pEvent->dwParam >> 16;
  673. int CbCode = pEvent->dwParam & 0xffff;
  674. if(CbCode != 0)
  675. {
  676. ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_WARNING, _T("{IprCtrl}: 线路[%d]录音失败, ErrCode = %d"), pLine->id(), CbCode);
  677. }
  678. else
  679. {
  680. pLine->recState() = REC_STATE_ACTIVED;
  681. ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_NORMAL, _T("{IprCtrl}: 线路[%d]开始录音"), pLine->id());
  682. }
  683. }
  684. /*****************************************************************
  685. **【函数名称】 onEventStopRecCb
  686. **【函数功能】 结束录音反馈事件的处理
  687. **【参数】
  688. **【返回值】
  689. ****************************************************************/
  690. void CIprControl::onEventStopRecCb( CLineRecordIprr* pLine, PSSM_EVENT pEvent )
  691. {
  692. int SlaverId = pEvent->dwParam >> 16;
  693. int CbCode = pEvent->dwParam & 0xffff;
  694. if(CbCode != 0)
  695. {
  696. ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_WARNING, _T("{IprCtrl}: 线路[%d]停止录音失败, ErrCode = %d"), pLine->id(), CbCode);
  697. }
  698. }
  699. /*****************************************************************
  700. **【函数名称】 onEventPauseRecCb
  701. **【函数功能】 暂停录音反馈事件的处理
  702. **【参数】
  703. **【返回值】
  704. ****************************************************************/
  705. void CIprControl::onEventPauseRecCb( CLineRecordIprr* pLine, PSSM_EVENT pEvent )
  706. {
  707. int SlaverId = pEvent->dwParam >> 16;
  708. int CbCode = pEvent->dwParam & 0xffff;
  709. if(CbCode != 0)
  710. {
  711. ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_WARNING, _T("{IprCtrl}: 线路[%d]暂停录音失败, ErrCode = %d"), pLine->id(), CbCode);
  712. }
  713. else
  714. {
  715. pLine->recState() = REC_STATE_PAUSED;
  716. ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_NORMAL, _T("{IprCtrl}: 线路[%d]录音暂停"), pLine->id());
  717. }
  718. }
  719. /*****************************************************************
  720. **【函数名称】 onEventRestartRecCb
  721. **【函数功能】 重启录音反馈事件的处理
  722. **【参数】
  723. **【返回值】
  724. ****************************************************************/
  725. void CIprControl::onEventRestartRecCb( CLineRecordIprr* pLine, PSSM_EVENT pEvent )
  726. {
  727. int SlaverId = pEvent->dwParam >> 16;
  728. int CbCode = pEvent->dwParam & 0xffff;
  729. if(CbCode != 0)
  730. {
  731. ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_WARNING, _T("{IprCtrl}: 线路[%d]重启录音失败, ErrCode = %d"), pLine->id(), CbCode);
  732. }
  733. else
  734. {
  735. pLine->recState() = REC_STATE_ACTIVED;
  736. ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_NORMAL, _T("{IprCtrl}: 线路[%d]已重启录音"), pLine->id());
  737. }
  738. }
  739. /*****************************************************************
  740. **【函数名称】 onEventActiveSessionCb
  741. **【函数功能】 激活会话反馈事件的处理
  742. **【参数】
  743. **【返回值】
  744. ****************************************************************/
  745. void CIprControl::onEventActiveSessionCb( CLineRecordIprr* pLine, PSSM_EVENT pEvent )
  746. {
  747. int SlaverId = pEvent->dwParam >> 16;
  748. int CbCode = pEvent->dwParam & 0xffff;
  749. ASSERT(SlaverId == m_IprSlaver.nRecSlaverID);
  750. if(CbCode == 0) // 会话激活成功
  751. {
  752. pLine->isSessionActived() = true;
  753. CString RecFile;
  754. if(pLine->isReady4Rec(RecFile)) // 已收到录音命令,可以开始录音
  755. __startRecord(pLine, RecFile);
  756. else // 尚未收到录音命令,将录音状态置为等待
  757. pLine->recState() = REC_STATE_WAIT;
  758. CLineRecordIpra* pLineIpra = __findLineIpraBySessionId(pLine->sessionId());
  759. ASSERT(pLineIpra != NULL);
  760. if(pLineIpra == NULL)
  761. {
  762. ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_WARNING, _T("{IprCtrl}: 线路[%d]激活会话失败, 未找到关联IPRA线路, Session = %d"),
  763. pLine->id(), pLine->sessionId());
  764. return;
  765. }
  766. CHAR AddrSlaver[IP_PORT_LEN] = { 0 };
  767. sprintf_s(AddrSlaver, _T("%d.%d.%d.%d"), m_IprSlaver.ipAddr.S_un_b.s_b1, m_IprSlaver.ipAddr.S_un_b.s_b2,
  768. m_IprSlaver.ipAddr.S_un_b.s_b3, m_IprSlaver.ipAddr.S_un_b.s_b4);
  769. if(SsmIPRSendSession(pLineIpra->id(), AddrSlaver, pLine->forwardingPPort(), AddrSlaver, pLine->forwardingSPort()) < 0)
  770. {
  771. char szErrMsg[DEV_OP_BUF_LEN] = { 0 };
  772. SsmGetLastErrMsg(szErrMsg);
  773. ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_WARNING, _T("{IprCtrl}: 线路[%d]激活会话时发送会话失败, Cause = %s"), pLine->id(), szErrMsg);
  774. }
  775. }
  776. else
  777. {
  778. ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_WARNING, _T("{IprCtrl}: 线路[%d]激活会话失败, ErrCode = %d"), pLine->id(), CbCode);
  779. }
  780. }
  781. /*****************************************************************
  782. **【函数名称】 onEventDeactiveSessionCb
  783. **【函数功能】 去激活会话反馈事件的处理
  784. **【参数】
  785. **【返回值】
  786. ****************************************************************/
  787. void CIprControl::onEventDeactiveSessionCb( CLineRecordIprr* pLine, PSSM_EVENT pEvent )
  788. {
  789. int SlaverId = pEvent->dwParam >> 16;
  790. int CbCode = pEvent->dwParam & 0xffff;
  791. ASSERT(SlaverId == m_IprSlaver.nRecSlaverID);
  792. if(CbCode != 0)
  793. {
  794. ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_WARNING, _T("{IprCtrl}: 线路[%d]去激活会话失败, ErrCode = %d"), pLine->id(), CbCode);
  795. }
  796. }
  797. /*****************************************************************
  798. **【函数名称】 onEventActiveAndRecCb
  799. **【函数功能】 激活会话并录音反馈事件的处理
  800. **【参数】
  801. **【返回值】
  802. ****************************************************************/
  803. void CIprControl::onEventActiveAndRecCb( CLineRecordIprr* pLine, PSSM_EVENT pEvent )
  804. {
  805. int SlaverId = pEvent->dwParam >> 16;
  806. int CbCode = pEvent->dwParam & 0xffff;
  807. ASSERT(SlaverId == m_IprSlaver.nRecSlaverID);
  808. if(CbCode == 0)
  809. {
  810. CLineRecordIpra* pLineIpra = __findLineIpraBySessionId(pLine->sessionId());
  811. ASSERT(pLineIpra != NULL);
  812. if(pLineIpra == NULL)
  813. {
  814. ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_WARNING, _T("{IprCtrl}: 线路[%d]激活会话并录音失败, 未找到关联IPRA线路, Session = %d"),
  815. pLine->id(), pLine->sessionId());
  816. return;
  817. }
  818. CHAR AddrSlaver[IP_PORT_LEN] = { 0 };
  819. sprintf_s(AddrSlaver, _T("%d.%d.%d.%d"), m_IprSlaver.ipAddr.S_un_b.s_b1, m_IprSlaver.ipAddr.S_un_b.s_b2,
  820. m_IprSlaver.ipAddr.S_un_b.s_b3, m_IprSlaver.ipAddr.S_un_b.s_b4);
  821. if(SsmIPRSendSession(pLineIpra->id(), AddrSlaver, pLine->forwardingPPort(), AddrSlaver, pLine->forwardingSPort()) < 0)
  822. {
  823. char szErrMsg[DEV_OP_BUF_LEN] = { 0 };
  824. SsmGetLastErrMsg(szErrMsg);
  825. ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_WARNING, _T("{IprCtrl}: 线路[%d]激活会话并录音时发送会话失败, Cause = %s"), pLine->id(), szErrMsg);
  826. }
  827. }
  828. else
  829. {
  830. ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_WARNING, _T("{IprCtrl}: 线路[%d]激活会话并录音失败, ErrCode = %d"), pLine->id(), CbCode);
  831. }
  832. }
  833. /*****************************************************************
  834. **【函数名称】 onEventDeactiveAndStopRecCb
  835. **【函数功能】 去激活停止录音反馈事件的处理
  836. **【参数】
  837. **【返回值】
  838. ****************************************************************/
  839. void CIprControl::onEventDeactiveAndStopRecCb( CLineRecordIprr* pLine, PSSM_EVENT pEvent )
  840. {
  841. int SlaverId = pEvent->dwParam >> 16;
  842. int CbCode = pEvent->dwParam & 0xffff;
  843. if(CbCode != 0)
  844. {
  845. ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_WARNING, _T("{IprCtrl}: 线路[%d]去激活会话并停止录音失败, ErrCode = %d"), pLine->id(), CbCode);
  846. }
  847. }
  848. /*****************************************************************
  849. **【函数名称】 onEventMediaSessionStarted
  850. **【函数功能】 媒体会话开始事件的处理
  851. **【参数】
  852. **【返回值】
  853. ****************************************************************/
  854. void CIprControl::onEventMediaSessionStarted( CLineRecordIpra* pLine, PSSM_EVENT pEvent )
  855. {
  856. int Protocol = pEvent->dwXtraInfo >> 16;
  857. int StationId = pEvent->dwXtraInfo & 0xffff;
  858. pIPR_SessionInfo pSessionInfo = (pIPR_SessionInfo)pEvent->pvBuffer;
  859. ASSERT(pSessionInfo != NULL);
  860. if(Protocol != PTL_AVAYA_H323)
  861. return;
  862. pLine->stationId() = StationId;
  863. pLine->sessionId() = pSessionInfo->dwSessionId;
  864. CLineRecordIprr* pLineIprr = __findLineIprrByStationId(StationId);
  865. if(pLineIprr == NULL)
  866. return;
  867. CHAR AddrSlaver[IP_PORT_LEN] = { 0 };
  868. sprintf_s(AddrSlaver, _T("%d.%d.%d.%d"), m_IprSlaver.ipAddr.S_un_b.s_b1, m_IprSlaver.ipAddr.S_un_b.s_b2,
  869. m_IprSlaver.ipAddr.S_un_b.s_b3, m_IprSlaver.ipAddr.S_un_b.s_b4);
  870. if(SsmIPRActiveSession(pLineIprr->id(), m_IprSlaver.nRecSlaverID, pSessionInfo->dwSessionId,
  871. AddrSlaver, 0, &pSessionInfo->nFowardingPPort, pSessionInfo->nPrimaryCodec,
  872. AddrSlaver, 0, &pSessionInfo->nFowardingSPort, pSessionInfo->nSecondaryCodec) < 0)
  873. {
  874. char szErrMsg[DEV_OP_BUF_LEN] = { 0 };
  875. SsmGetLastErrMsg(szErrMsg);
  876. ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_WARNING, _T("{IprCtrl}: IPRA线路[%d]处理媒体会话时激活会话失败, IPRR Line = %d, Cause = %s"),
  877. pLine->id(), pLineIprr->id(), szErrMsg);
  878. return;
  879. }
  880. pLineIprr->sessionId() = pSessionInfo->dwSessionId;
  881. pLineIprr->forwardingPPort() = pSessionInfo->nFowardingPPort;
  882. pLineIprr->forwardingSPort() = pSessionInfo->nFowardingSPort;
  883. ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_NORMAL, _T("{IprCtrl}: IPRA线路[%d]处理媒体会话时激活会话成功, IPRR Line = %d"),
  884. pLine->id(), pLineIprr->id());
  885. }
  886. /*****************************************************************
  887. **【函数名称】 onEventMediaSessionStoped
  888. **【函数功能】 媒体会话结束事件的处理
  889. **【参数】
  890. **【返回值】
  891. ****************************************************************/
  892. void CIprControl::onEventMediaSessionStoped( CLineRecordIpra* pLine, PSSM_EVENT pEvent )
  893. {
  894. int Protocol = pEvent->dwXtraInfo >> 16;
  895. int StationId = pEvent->dwXtraInfo & 0xffff;
  896. pIPR_SessionInfo pSessionInfo = (pIPR_SessionInfo)pEvent->pvBuffer;
  897. ASSERT(pSessionInfo != NULL);
  898. if(Protocol != PTL_AVAYA_H323)
  899. return;
  900. pLine->resetRecContext();
  901. CLineRecordIprr* pLineIprr = __findLineIprrByStationId(StationId);
  902. if(pLineIprr == NULL)
  903. return;
  904. if(!__stopRecord(pLineIprr))
  905. ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_WARNING, _T("{IprCtrl}: IPRA线路[%d]在媒体会话结束时停止录音失败, IPRR Line = %d"), pLine->id(), pLineIprr->id());
  906. }