中间件底层,websocket

OperationReactor.cpp 40KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360
  1. #include "StdAfx.h"
  2. #include "OperationReactor.h"
  3. #include "DevControl.h"
  4. #include "ChanExten.h"
  5. #include "ChanTrunk.h"
  6. #include "FsProxy.h"
  7. #include "OpAnswer.h"
  8. #include "OpHangup.h"
  9. #include "OpConsult.h"
  10. #include "OpInsert.h"
  11. #include "OpInstead.h"
  12. #include "OpIntercept.h"
  13. #include "OpLeaveWord.h"
  14. #include "OpListen.h"
  15. #include "OpMakeCall.h"
  16. #include "OpTransfer.h"
  17. #include "OpTurnExten.h"
  18. #include "OpTrunk2Trunk.h"
  19. #include "OpTurnIvr.h"
  20. #include "OpMeeting.h"
  21. #include "OpHoldon.h"
  22. #include "OpMute.h"
  23. #include "OpPlayAndDtmf.h"
  24. #include "OpRecord.h"
  25. #include "OpPredictionCall.h"
  26. #include "OpSetChannelVar.h"
  27. #include "OpSendDtmf.h"
  28. SINGLETON_IMPLEMENT(COperationReactor)
  29. COperationReactor::COperationReactor(void)
  30. {
  31. }
  32. COperationReactor::~COperationReactor(void)
  33. {
  34. }
  35. /*****************************************************************
  36. **【函数名称】 __addOperation
  37. **【函数功能】 存储一个操作
  38. **【参数】
  39. **【返回值】
  40. *****************************************************************/
  41. void COperationReactor::__addOperation( COperation* pOperation )
  42. {
  43. m_TaskLock.Lock();
  44. m_TableOperation.SetAt(pOperation->uniqueId(), pOperation);
  45. m_TaskLock.Unlock();
  46. }
  47. /*****************************************************************
  48. **【函数名称】 __delOperation
  49. **【函数功能】 删除指定操作
  50. **【参数】
  51. **【返回值】
  52. *****************************************************************/
  53. bool COperationReactor::__delOperation( COperation* pOperation )
  54. {
  55. m_TaskLock.Lock();
  56. bool b= m_TableOperation.RemoveKey(pOperation->uniqueId()) == TRUE;
  57. m_TaskLock.Unlock();
  58. return b;
  59. }
  60. /*****************************************************************
  61. **【函数名称】 __getOperation
  62. **【函数功能】 获取指定操作
  63. **【参数】
  64. **【返回值】
  65. *****************************************************************/
  66. COperation* COperationReactor::__getOperation( LONG OpId )
  67. {
  68. m_TaskLock.Lock();
  69. COperation* pOp = NULL;
  70. m_TableOperation.Lookup(OpId, pOp);
  71. m_TaskLock.Unlock();
  72. return pOp;
  73. }
  74. /*****************************************************************
  75. **【函数名称】 __execOp
  76. **【函数功能】 执行OP
  77. **【参数】 pOp 操作实体
  78. pParam 操作参数
  79. **【返回值】
  80. ****************************************************************/
  81. bool COperationReactor::__execOp( COperation* pOp, LineOpParam* pParam )
  82. {
  83. __addOperation(pOp);
  84. if(pOp->start(pParam))
  85. return true;
  86. if(__delOperation(pOp))
  87. {
  88. pOp->detachHostChan();
  89. FS_LINK_DELETE(pOp);
  90. }
  91. return false;
  92. }
  93. /*****************************************************************
  94. **【函数名称】 __procOpMakeCall
  95. **【函数功能】 坐席外呼处理
  96. **【参数】
  97. **【返回值】
  98. ****************************************************************/
  99. bool COperationReactor::__procOpMakeCall( LONG Instance, ULONG ResID, LineOpParam* pParam )
  100. {
  101. // 通过设备资源查找主控线路
  102. CChanExten* pExten = CFsProxy::GetInstance().getExten(ResID);
  103. if(pExten == NULL)
  104. {
  105. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行分机呼叫失败, 未找到分机通道[%lu], DestNum = %s"), ResID, pParam->szParam2);
  106. return false;
  107. }
  108. // 生成外呼操作类
  109. COperation* pOp = new(std::nothrow) COpMakeCall(this, Instance);
  110. if (pOp == NULL) {
  111. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行分机呼叫失败,内存不足"));
  112. return false;
  113. }
  114. if(!pOp->attachHostChan(pExten))
  115. {
  116. // 如果线路正在执行其它操作
  117. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行分机呼叫失败, 无法绑定通道[%lu], ChanCurTask = %d, DestNum = %s"), ResID,
  118. (pExten->currOp() == NULL ? LINE_OP_UNKNOWN : pExten->currOp()->type()), pParam->szParam2);
  119. FS_LINK_DELETE(pOp);
  120. return false;
  121. }
  122. // 启动操作
  123. return __execOp(pOp, pParam);
  124. }
  125. /*****************************************************************
  126. **【函数名称】 __procPredictionCall
  127. **【函数功能】 预测外呼
  128. **【参数】
  129. **【返回值】
  130. ****************************************************************/
  131. bool COperationReactor::__procOpPCall( LONG Instance, ULONG ResID, LineOpParam* pParam )
  132. {
  133. // 生成自动呼叫操作类
  134. COperation* pOp = new(std::nothrow) COpPredictionCall(this, Instance);
  135. if (pOp == NULL) {
  136. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行预测外呼,内存不足"));
  137. return false;
  138. }
  139. // 启动操作
  140. return __execOp(pOp, pParam);
  141. }
  142. /*****************************************************************
  143. **【函数名称】 __procOpAnswerCall
  144. **【函数功能】 应答呼叫
  145. **【参数】
  146. **【返回值】
  147. ****************************************************************/
  148. bool COperationReactor::__procOpAnswerCall( LONG Instance, ULONG ResID, LineOpParam* pParam )
  149. {
  150. // 查找要应答呼叫的线路
  151. CChanExten* pExten = CFsProxy::GetInstance().getExten(ResID);
  152. if(pExten == NULL)
  153. {
  154. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行分机应答失败, 未找到分机通道[%lu]"), ResID);
  155. return false;
  156. }
  157. // 生成应答呼叫操作类
  158. COperation* pOp = new(std::nothrow) COpAnswer(this, Instance);
  159. if (pOp == NULL) {
  160. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行应答,内存不足"));
  161. return false;
  162. }
  163. if(!pOp->attachHostChan(pExten))
  164. {
  165. // 如果线路正在执行其它操作
  166. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行分机应答失败, 无法绑定通道[%lu], ChanCurTask = %d"), ResID,
  167. (pExten->currOp() == NULL ? LINE_OP_UNKNOWN : pExten->currOp()->type()));
  168. FS_LINK_DELETE(pOp);
  169. return false;
  170. }
  171. // 启动操作
  172. return __execOp(pOp, pParam);
  173. }
  174. /*****************************************************************
  175. **【函数名称】 __procOpHangUp
  176. **【函数功能】 挂机操作处理
  177. **【参数】
  178. **【返回值】
  179. ****************************************************************/
  180. bool COperationReactor::__procOpHangUp( LONG Instance, ULONG ResID, LineOpParam* pParam )
  181. {
  182. // 查找要挂机的线路
  183. CVirtualChan* pChan = CFsProxy::GetInstance().getExten(ResID);
  184. if(pChan == NULL)
  185. pChan = CFsProxy::GetInstance().getTrunk(ResID);
  186. if(pChan == NULL)
  187. {
  188. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行挂机操作失败, 未找到通道[%lu]"), ResID);
  189. return false;
  190. } // end if
  191. // 如果线路正在执行其它操作
  192. if (pChan->currOp() != NULL)
  193. {
  194. if (pChan->currOp()->type() == LINE_OP_HANG_UP)
  195. {
  196. LOGGER(LOG_LEVEL_NORMAL, _T("{OperationReactor}: 当前线路正在执行挂机"));
  197. return false; // 使任务删除
  198. }
  199. LOGGER(LOG_LEVEL_NORMAL, _T("{OperationReactor}: 执行挂机, 当前线路绑定操作, Operation = %d"), pChan->currOp()->type());
  200. return pChan->currOp()->hangup(Instance);
  201. }
  202. if (pChan->state() == CHAN_LOGIC_STATE_FREE || pChan->state() == CHAN_LOGIC_STATE_DISABLED)
  203. {
  204. LOGGER(LOG_LEVEL_NORMAL, _T("{OperationReactor}: 当前线路已挂机"));
  205. return false; // 使任务删除
  206. }
  207. // 执行挂机操作
  208. COperation* pOp = new(std::nothrow) COpHangup(this, Instance);
  209. if (pOp == NULL) {
  210. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行挂机操作,内存不足"));
  211. return false;
  212. }
  213. if(!pOp->attachHostChan(pChan))
  214. {
  215. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行挂机操作失败, 无法绑定通道[%lu], ChanCurTask = %d"), ResID,
  216. (pChan->currOp() == NULL ? LINE_OP_UNKNOWN : pChan->currOp()->type()));
  217. FS_LINK_DELETE(pOp);
  218. return false;
  219. }
  220. // 启动操作
  221. return __execOp(pOp, pParam);
  222. }
  223. /*****************************************************************
  224. **【函数名称】 __procOpTransfer
  225. **【函数功能】 座席呼叫转移
  226. **【参数】
  227. **【返回值】
  228. ****************************************************************/
  229. bool COperationReactor::__procOpTransfer( LONG Instance, ULONG ResID, LineOpParam* pParam )
  230. {
  231. // 通过设备资源查找主控线路
  232. CChanExten* pExten = CFsProxy::GetInstance().getExten(ResID);
  233. if(pExten == NULL)
  234. {
  235. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行呼叫转移失败, 未找到分机通道[%lu], DestNum = %s"), ResID, pParam->szParam2);
  236. return false;
  237. }
  238. COperation* pOp = new(std::nothrow) COpTransfer(this, Instance);
  239. if (pOp == NULL) {
  240. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行转移,内存不足"));
  241. return false;
  242. }
  243. if(!pOp->attachHostChan(pExten))
  244. {
  245. // 如果通道正在执行其它操作
  246. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行呼叫转移失败, 无法绑定通道[%lu], ChanCurTask = %d, DestNum = %s"), ResID,
  247. (pExten->currOp() == NULL ? LINE_OP_UNKNOWN : pExten->currOp()->type()), pParam->szParam2);
  248. FS_LINK_DELETE(pOp);
  249. return false;
  250. }
  251. // 启动操作
  252. return __execOp(pOp, pParam);
  253. }
  254. /*****************************************************************
  255. **【函数名称】 __procOpTurnAgent
  256. **【函数功能】 外线转座席
  257. **【参数】
  258. **【返回值】
  259. ****************************************************************/
  260. bool COperationReactor::__procOpTurnAgent( LONG Instance, ULONG ResID, LineOpParam* pParam )
  261. {
  262. // 通过设备资源查找主控线路
  263. CVirtualChan* pChan = CFsProxy::GetInstance().getTrunk(ResID);
  264. if(pChan == NULL)
  265. {
  266. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行中继转座席失败, 未找到中继通道[%lu], ExtenNum = %s"), ResID, pParam->szParam2);
  267. return false;
  268. }
  269. // 生成外线呼叫转移操作类
  270. COperation* pOp = new(std::nothrow) COpTurnExten(this, Instance);
  271. if (pOp == NULL) {
  272. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行外线呼叫转移,内存不足"));
  273. return false;
  274. }
  275. if(!pOp->attachHostChan(pChan))
  276. {
  277. // 当前线路是否正在进行其它操作
  278. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行中继转座席失败, 无法绑定通道[%lu], ChanCurTask = %d, ExtenNum = %s"), ResID,
  279. (pChan->currOp() == NULL ? LINE_OP_UNKNOWN : pChan->currOp()->type()), pParam->szParam2);
  280. FS_LINK_DELETE(pOp);
  281. return false;
  282. }
  283. // 启动操作
  284. return __execOp(pOp, pParam);
  285. }
  286. /*****************************************************************
  287. **【函数名称】 __procOpTurnOut
  288. **【函数功能】 外线呼叫跳转
  289. **【参数】
  290. **【返回值】
  291. ****************************************************************/
  292. bool COperationReactor::__procOpTurnOut( LONG Instance, ULONG ResID, LineOpParam* pParam )
  293. {
  294. // 通过设备资源查找主控线路
  295. CVirtualChan* pChan = CFsProxy::GetInstance().getTrunk(ResID);
  296. if(pChan == NULL)
  297. {
  298. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行中继呼叫跳转失败, 未找到中继通道[%lu], DestNum = %s"), ResID, pParam->szParam2);
  299. return false;
  300. }
  301. // 生成外线呼叫转移操作类
  302. COperation* pOp = new(std::nothrow) COpTrunk2Trunk(this, Instance);
  303. if (pOp == NULL) {
  304. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行外线呼叫转移,内存不足"));
  305. return false;
  306. }
  307. if(!pOp->attachHostChan(pChan))
  308. {
  309. // 当前线路是否正在进行其它操作
  310. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行中继呼叫跳转失败, 无法绑定通道[%lu], ChanCurTask = %d, DestNum = %s"), ResID,
  311. (pChan->currOp() == NULL ? LINE_OP_UNKNOWN : pChan->currOp()->type()), pParam->szParam2);
  312. FS_LINK_DELETE(pOp);
  313. return false;
  314. }
  315. // 启动操作
  316. return __execOp(pOp, pParam);
  317. }
  318. /*****************************************************************
  319. **【函数名称】 __procOpTurnIvr
  320. **【函数功能】 转IVR
  321. **【参数】
  322. **【返回值】
  323. ****************************************************************/
  324. bool COperationReactor::__procOpTurnIvr( LONG Instance, ULONG ResID, LineOpParam* pParam )
  325. {
  326. // 查找要转IVR的线路
  327. CChanExten* pExten = CFsProxy::GetInstance().getExten(ResID);
  328. if(pExten == NULL)
  329. {
  330. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行跳转IVR操作失败, 未找到分机通道[%lu]"), ResID);
  331. return false;
  332. } // end if
  333. // 执行转IVR操作
  334. COperation* pOp = new(std::nothrow) COpTurnIvr(this, Instance);
  335. if (pOp == NULL) {
  336. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行转IVR,内存不足"));
  337. return false;
  338. }
  339. if(!pOp->attachHostChan(pExten))
  340. {
  341. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行跳转IVR操作失败, 无法绑定通道[%lu], ChanCurTask = %d"), ResID,
  342. (pExten->currOp() == NULL ? LINE_OP_UNKNOWN : pExten->currOp()->type()));
  343. FS_LINK_DELETE(pOp);
  344. return false;
  345. } // end if
  346. return __execOp(pOp, pParam);
  347. }
  348. /*****************************************************************
  349. **【函数名称】 __procReqMeeting
  350. **【函数功能】 单步会议
  351. **【参数】
  352. **【返回值】
  353. ****************************************************************/
  354. bool COperationReactor::__procOpMeeting( LONG Instance, ULONG ResID, LineOpParam* pParam )
  355. {
  356. // 通过设备资源查找主控线路
  357. CChanExten* pExten = CFsProxy::GetInstance().getExten(ResID);
  358. if(pExten == NULL)
  359. {
  360. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行会议操作失败, 未找到分机通道[%lu], DestNum = %s"), ResID, pParam->szParam2);
  361. return false;
  362. }
  363. COperation* pOp = new(std::nothrow) COpMeeting(this, Instance);
  364. if (pOp == NULL) {
  365. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行会议,内存不足"));
  366. return false;
  367. }
  368. if(!pOp->attachHostChan(pExten))
  369. {
  370. // 如果线路正在执行其它操作
  371. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行会议操作失败, 无法绑定通道[%lu], ChanCurTask = %d, DestNum = %s"), ResID,
  372. (pExten->currOp() == NULL ? LINE_OP_UNKNOWN : pExten->currOp()->type()), pParam->szParam2);
  373. FS_LINK_DELETE(pOp);
  374. return false;
  375. }
  376. // 启动操作
  377. return __execOp(pOp, pParam);
  378. }
  379. bool COperationReactor::__procOpMeetingTackBack(LONG Instance, ULONG ResID, LineOpParam * pParam)
  380. {
  381. // 通过设备资源查找主控线路
  382. CChanExten* pExten = CFsProxy::GetInstance().getExten(ResID);
  383. if (pExten == NULL)
  384. {
  385. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行会议接回操作失败, 未找到分机通道[%lu]"), ResID);
  386. return false;
  387. }
  388. // 如果线路正在执行其它操作
  389. COperation* pCurrOp = pExten->currOp();
  390. if (pCurrOp == NULL || pCurrOp->type() != LINE_OP_CONFERENCE)
  391. {
  392. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行会议接回操作失败, 分机通道[%lu]当前未在会议"), ResID);
  393. return false;
  394. }
  395. // 执行会议接回主叫操作
  396. return pCurrOp->cancel(Instance);
  397. }
  398. /*****************************************************************
  399. **【函数名称】 __procOpHold
  400. **【函数功能】 座席通话保持操作处理
  401. **【参数】 Instance 调用标识
  402. ResID 操作的主控资源ID
  403. LineOpParam* 操作信息
  404. **【返回值】 启动操作是否成功
  405. ****************************************************************/
  406. bool COperationReactor::__procOpHold( LONG Instance, ULONG ResID, LineOpParam* pParam )
  407. {
  408. // 通过设备资源查找主控线路
  409. CChanExten* pExten = CFsProxy::GetInstance().getExten(ResID);
  410. if(pExten == NULL)
  411. {
  412. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行保持操作失败, 未找到分机通道[%lu]"), ResID);
  413. return false;
  414. }
  415. // 生成保持操作类
  416. COperation* pOp = new(std::nothrow) COpHoldon(this, Instance);
  417. if (pOp == NULL) {
  418. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行保持,内存不足"));
  419. return false;
  420. }
  421. if(!pOp->attachHostChan(pExten))
  422. {
  423. // 如果线路正在执行其它操作
  424. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行保持操作失败, 无法绑定通道[%lu], ChanCurTask = %d"), ResID,
  425. (pExten->currOp() == NULL ? LINE_OP_UNKNOWN : pExten->currOp()->type()));
  426. FS_LINK_DELETE(pOp);
  427. return false;
  428. }
  429. // 启动操作
  430. return __execOp(pOp, pParam);
  431. }
  432. /*****************************************************************
  433. **【函数名称】 __procOpTakeBack
  434. **【函数功能】 座席通话接回操作处理
  435. **【参数】 Instance 调用标识
  436. ResID 操作的主控资源ID
  437. LineOpParam* 操作信息
  438. **【返回值】 启动操作是否成功
  439. ****************************************************************/
  440. bool COperationReactor::__procOpTakeBack( LONG Instance, ULONG ResID, LineOpParam* pParam )
  441. {
  442. // 通过设备资源查找主控线路
  443. CChanExten* pExten = CFsProxy::GetInstance().getExten(ResID);
  444. if(pExten == NULL)
  445. {
  446. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行保持接回操作失败, 未找到分机通道[%lu]"), ResID);
  447. return false;
  448. }
  449. // 如果线路正在执行其它操作
  450. COperation* pCurrOp = pExten->currOp();
  451. if(pCurrOp == NULL || pCurrOp->type() != LINE_OP_HOLD)
  452. {
  453. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行保持接回操作失败, 分机通道[%lu]当前未保持"), ResID);
  454. return false;
  455. }
  456. // 执行取消静音操作
  457. return pCurrOp->cancel(Instance);
  458. }
  459. /*****************************************************************
  460. **【函数名称】 __procOpMuteOn
  461. **【函数功能】 静音启动
  462. **【参数】
  463. **【返回值】
  464. ****************************************************************/
  465. bool COperationReactor::__procOpMuteOn( LONG Instance, ULONG ResID, LineOpParam* pParam )
  466. {
  467. // 通过设备资源查找主控线路
  468. CChanExten* pExten = CFsProxy::GetInstance().getExten(ResID);
  469. if(pExten == NULL)
  470. {
  471. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行静音操作失败, 未找到分机通道[%lu]"), ResID);
  472. return false;
  473. }
  474. // 生成静音操作类
  475. COperation* pOp = new(std::nothrow) COpMute(this, Instance);
  476. if (pOp == NULL) {
  477. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行静音,内存不足"));
  478. return false;
  479. }
  480. if(!pOp->attachHostChan(pExten))
  481. {
  482. // 如果线路正在执行其它操作
  483. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行静音操作失败, 无法绑定通道[%lu], ChanCurTask = %d"), ResID,
  484. (pExten->currOp() == NULL ? LINE_OP_UNKNOWN : pExten->currOp()->type()));
  485. FS_LINK_DELETE(pOp);
  486. return false;
  487. }
  488. // 启动操作
  489. return __execOp(pOp, pParam);
  490. }
  491. /*****************************************************************
  492. **【函数名称】 __procOpMuteOff
  493. **【函数功能】 静音取消
  494. **【参数】
  495. **【返回值】
  496. ****************************************************************/
  497. bool COperationReactor::__procOpMuteOff( LONG Instance, ULONG ResID, LineOpParam* pParam )
  498. {
  499. // 通过设备资源查找主控线路
  500. CChanExten* pExten = CFsProxy::GetInstance().getExten(ResID);
  501. if(pExten == NULL)
  502. {
  503. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行取消静音操作失败, 未找到分机通道[%lu]"), ResID);
  504. return false;
  505. }
  506. // 如果线路正在执行其它操作
  507. COperation* pCurrOp = pExten->currOp();
  508. if(pCurrOp == NULL || pCurrOp->type() != LINE_OP_MUTE_BEGIN)
  509. {
  510. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行取消静音操作失败, 分机通道[%lu]当前未静音"), ResID);
  511. return false;
  512. }
  513. // 执行取消静音操作
  514. return pCurrOp->cancel(Instance);
  515. }
  516. /*****************************************************************
  517. **【函数名称】 __procOpReset
  518. **【函数功能】 重置
  519. **【参数】
  520. **【返回值】
  521. ****************************************************************/
  522. bool COperationReactor::__procOpReset( LONG Instance, ULONG ResID, LineOpParam* pParam )
  523. {
  524. // 通过设备资源查找主控线路
  525. CChanExten* pExten = CFsProxy::GetInstance().getExten(ResID);
  526. if(pExten == NULL)
  527. {
  528. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行通道重置操作失败, 未找到分机通道[%lu]"), ResID);
  529. return false;
  530. }
  531. LOGGER(LOG_LEVEL_NORMAL, _T("{OperationReactor}: 执行通道重置操作, ChanNo = %lu"), ResID);
  532. // 清除关联操作
  533. COperation* pOp = pExten->currOp();
  534. if(pOp != NULL)
  535. {
  536. pOp->hangup(FS_LINK_INSTANCE_INVALID);
  537. if(__delOperation(pOp))
  538. {
  539. pOp->detachHostChan();
  540. FS_LINK_DELETE(pOp);
  541. }
  542. }
  543. else
  544. {
  545. if(!pExten->isFree())
  546. CFsProxy::GetInstance().kill(FS_LINK_JOBID_INVALID, pExten);
  547. } // end if
  548. // 2023-05-06 向上层提交线路空闲状态
  549. pExten->forceState(CHAN_LOGIC_STATE_FREE);
  550. CDevControl::GetInstance().onEventResState(pExten->type(), pExten->no(), INNER_STATE_FREE, "", "", 0, pExten->TmpChanID());
  551. return true;
  552. }
  553. /*****************************************************************
  554. **【函数名称】 __procOpListen
  555. **【函数功能】 监听
  556. **【参数】
  557. **【返回值】
  558. ****************************************************************/
  559. bool COperationReactor::__procOpListen( LONG Instance, ULONG ResID, LineOpParam* pParam )
  560. {
  561. // 通过设备资源查找主控线路
  562. CChanExten* pExten = CFsProxy::GetInstance().getExten(ResID);
  563. if(pExten == NULL)
  564. {
  565. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行监听操作失败, 未找到分机通道[%lu], DestNum = %s"),
  566. ResID, pParam->szParam2);
  567. return false;
  568. }
  569. // 生成强插操作类
  570. COperation* pOp = new(std::nothrow) COpListen(this, Instance);
  571. if (pOp == NULL) {
  572. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行监听,内存不足"));
  573. return false;
  574. }
  575. if(!pOp->attachHostChan(pExten))
  576. {
  577. // 如果线路正在执行其它操作
  578. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行监听操作失败, 无法绑定通道[%lu], ChanCurTask = %d, DestNum = %s"),
  579. ResID, (pExten->currOp() == NULL ? LINE_OP_UNKNOWN : pExten->currOp()->type()), pParam->szParam2);
  580. FS_LINK_DELETE(pOp);
  581. return false;
  582. }
  583. // 启动操作
  584. return __execOp(pOp, pParam);
  585. }
  586. /*****************************************************************
  587. **【函数名称】 __procOpInsert
  588. **【函数功能】 强插
  589. **【参数】
  590. **【返回值】
  591. ****************************************************************/
  592. bool COperationReactor::__procOpInsert( LONG Instance, ULONG ResID, LineOpParam* pParam )
  593. {
  594. // 通过设备资源查找主控线路
  595. CChanExten* pExten = CFsProxy::GetInstance().getExten(ResID);
  596. if(pExten == NULL)
  597. {
  598. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行强插操作失败, 未找到分机通道[%lu], DestNum = %s"), ResID, pParam->szParam2);
  599. return false;
  600. }
  601. // 生成强插操作类
  602. COperation* pOp = new(std::nothrow) COpInsert(this, Instance);
  603. if (pOp == NULL) {
  604. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行强插,内存不足"));
  605. return false;
  606. }
  607. if(!pOp->attachHostChan(pExten))
  608. {
  609. // 如果线路正在执行其它操作
  610. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行强插操作失败, 无法绑定通道[%lu], ChanCurTask = %d, DestNum = %s"),
  611. ResID, (pExten->currOp() == NULL ? LINE_OP_UNKNOWN : pExten->currOp()->type()), pParam->szParam2);
  612. FS_LINK_DELETE(pOp);
  613. return false;
  614. }
  615. // 启动操作
  616. return __execOp(pOp, pParam);
  617. }
  618. /*****************************************************************
  619. **【函数名称】 __procReqInstead
  620. **【函数功能】 代接
  621. **【参数】
  622. **【返回值】
  623. ****************************************************************/
  624. bool COperationReactor::__procOpInstead( LONG Instance, ULONG ResID, LineOpParam* pParam )
  625. {
  626. // 通过设备资源查找主控线路
  627. CChanExten* pExten = CFsProxy::GetInstance().getExten(ResID);
  628. if(pExten == NULL)
  629. {
  630. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行代接操作失败, 未找到分机通道[%lu], DestNum = %s"), ResID, pParam->szParam2);
  631. return false;
  632. }
  633. // 生成代接操作类
  634. COperation* pOp = new(std::nothrow) COpInstead(this, Instance);
  635. if (pOp == NULL) {
  636. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行代接,内存不足"));
  637. return false;
  638. }
  639. if(!pOp->attachHostChan(pExten))
  640. {
  641. // 如果线路正在执行其它操作
  642. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行代接操作失败, 无法绑定通道[%lu], ChanCurTask = %d, DestNum = %s"),
  643. ResID, (pExten->currOp() == NULL ? LINE_OP_UNKNOWN : pExten->currOp()->type()), pParam->szParam2);
  644. FS_LINK_DELETE(pOp);
  645. return false;
  646. }
  647. // 启动操作
  648. return __execOp(pOp, pParam);
  649. }
  650. /*****************************************************************
  651. **【函数名称】 __procReqIntercept
  652. **【函数功能】 强截
  653. **【参数】
  654. **【返回值】
  655. ****************************************************************/
  656. bool COperationReactor::__procOpIntercept( LONG Instance, ULONG ResID, LineOpParam* pParam )
  657. {
  658. // 通过设备资源查找主控线路
  659. CChanExten* pExten = CFsProxy::GetInstance().getExten(ResID);
  660. if(pExten == NULL)
  661. {
  662. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行强截操作失败, 未找到分机通道[%lu], DestNum = %s"), ResID, pParam->szParam2);
  663. return false;
  664. }
  665. // 生成强截操作类
  666. COperation* pOp = new(std::nothrow) COpIntercept(this, Instance);
  667. if (pOp == NULL) {
  668. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行强截,内存不足"));
  669. return false;
  670. }
  671. if(!pOp->attachHostChan(pExten))
  672. {
  673. // 如果线路正在执行其它操作
  674. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行强截操作失败, 无法绑定通道[%lu], ChanCurTask = %d, DestNum = %s"),
  675. ResID, (pExten->currOp() == NULL ? LINE_OP_UNKNOWN : pExten->currOp()->type()), pParam->szParam2);
  676. FS_LINK_DELETE(pOp);
  677. return false;
  678. }
  679. // 启动操作
  680. return __execOp(pOp, pParam);
  681. }
  682. /*****************************************************************
  683. **【函数名称】 __procOpInfoTransaction
  684. **【函数功能】 数据交互
  685. **【参数】
  686. **【返回值】 启动操作是否成功
  687. ****************************************************************/
  688. bool COperationReactor::__procOpInfoTransaction( LONG Instance, ULONG ResID, LineOpParam* pParam )
  689. {
  690. // 通过设备资源查找主控线路
  691. CChanExten* pExten = CFsProxy::GetInstance().getExten(ResID);
  692. if(pExten == NULL)
  693. {
  694. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行数据交换操作失败, 未找到分机通道[%lu]"), ResID);
  695. return false;
  696. }
  697. // 查找线路关联的操作
  698. COperation* pCurrOp = pExten->currOp();
  699. if(pCurrOp == NULL)
  700. {
  701. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行数据交换操作失败, 分机通道[%lu]未绑定任务"), ResID);
  702. return false;
  703. }
  704. // 执行信息交互
  705. pCurrOp->setOpInstance(Instance);
  706. return true;
  707. }
  708. /*****************************************************************
  709. **【函数名称】 __procOpConsultBegin
  710. **【函数功能】 协商呼叫启动
  711. **【参数】
  712. **【返回值】
  713. ****************************************************************/
  714. bool COperationReactor::__procOpConsultBegin( LONG Instance, ULONG ResID, LineOpParam* pParam )
  715. {
  716. // 通过设备资源查找主控线路
  717. CChanExten* pExten = CFsProxy::GetInstance().getExten(ResID);
  718. if(pExten == NULL)
  719. {
  720. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行协商呼叫操作失败, 未找到分机通道[%lu], DestNum = %s"), ResID, pParam->szParam2);
  721. return false;
  722. }
  723. // 生成协商呼叫操作类
  724. COperation* pOp = new(std::nothrow) COpConsult(this, Instance);
  725. if (pOp == NULL) {
  726. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行协商呼叫,内存不足"));
  727. return false;
  728. }
  729. if(!pOp->attachHostChan(pExten))
  730. {
  731. // 如果线路正在执行其它操作
  732. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行协商呼叫操作失败, 无法绑定通道[%lu], ChanCurTask = %d, DestNum = %s"),
  733. ResID, (pExten->currOp() == NULL ? LINE_OP_UNKNOWN : pExten->currOp()->type()), pParam->szParam2);
  734. FS_LINK_DELETE(pOp);
  735. return false;
  736. }
  737. // 启动操作
  738. return __execOp(pOp, pParam);
  739. }
  740. /*****************************************************************
  741. **【函数名称】 __procOpConsultConfirm
  742. **【函数功能】 协商呼叫确认
  743. **【参数】
  744. **【返回值】
  745. ****************************************************************/
  746. bool COperationReactor::__procOpConsultConfirm( LONG Instance, ULONG ResID, LineOpParam* pParam )
  747. {
  748. // 通过设备资源查找主控线路
  749. CChanExten* pExten = CFsProxy::GetInstance().getExten(ResID);
  750. if(pExten == NULL)
  751. {
  752. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行协商确认操作失败, 未找到分机通道[%lu]"), ResID);
  753. return false;
  754. }
  755. // 如果线路未执行协商呼叫操作
  756. COperation* pCurrOp = pExten->currOp();
  757. if(pCurrOp == NULL || pCurrOp->type() != LINE_OP_CONSULT_CALL_BEGIN)
  758. {
  759. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行协商确认操作失败, 分机通道[%lu]未在协商呼叫环境中"), ResID);
  760. return false;
  761. }
  762. if (pParam->nParam1==3)
  763. {
  764. // 执行操作确认
  765. if(!pCurrOp->cancel(Instance))
  766. {
  767. if(__delOperation(pCurrOp))
  768. {
  769. pCurrOp->detachHostChan();
  770. FS_LINK_DELETE(pCurrOp);
  771. }
  772. return false;
  773. } // end if
  774. }
  775. else
  776. {
  777. // 执行操作确认
  778. if(!pCurrOp->next(Instance))
  779. {
  780. if(__delOperation(pCurrOp))
  781. {
  782. pCurrOp->detachHostChan();
  783. FS_LINK_DELETE(pCurrOp);
  784. }
  785. return false;
  786. } // end if
  787. }
  788. return true;
  789. }
  790. /*****************************************************************
  791. **【函数名称】 __procOpPlayAndDtmf
  792. **【函数功能】 线路放音收号
  793. **【参数】
  794. **【返回值】
  795. ****************************************************************/
  796. bool COperationReactor::__procOpPlayAndDtmf( LONG Instance, ULONG ResID, LineOpParam* pParam )
  797. {
  798. // 通过设备资源查找主控线路
  799. CVirtualChan* pChan = CFsProxy::GetInstance().getTrunk(ResID);
  800. if(pChan == NULL)
  801. {
  802. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行放音收号操作失败, 未找到通道[%lu], mode = %d, AudioFile = %s"),
  803. ResID, pParam->nParam1, pParam->szParam3);
  804. return false;
  805. }
  806. COperation* pCurrOp = pChan->currOp();
  807. if(pParam->nParam1 == PVM_STOP_PLAY) // 停止放音
  808. {
  809. // 如果线路未在执行放音操作
  810. if(pCurrOp == NULL || pCurrOp->type() != LINE_OP_PLAY_VOICE)
  811. {
  812. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行停止放音操作失败, 通道[%lu]未执行放音操作"), ResID);
  813. return false;
  814. }
  815. else
  816. return pCurrOp->cancel(Instance); // 执行取消操作
  817. }
  818. else // 启动放音
  819. {
  820. // 生成放音操作类
  821. COperation* pOp = new(std::nothrow) COpPlayAndDtmf(this, Instance);
  822. if (pOp == NULL) {
  823. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行放音,内存不足"));
  824. return false;
  825. }
  826. if(!pOp->attachHostChan(pChan))
  827. {
  828. // 如果线路正在执行其它操作
  829. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行放音收号操作失败, 无法绑定通道[%lu], ChanCurTask = %d, AudioFile = %s"),
  830. ResID, (pChan->currOp() == NULL ? LINE_OP_UNKNOWN : pChan->currOp()->type()), pParam->szParam3);
  831. FS_LINK_DELETE(pOp);
  832. return false;
  833. }
  834. // 启动操作
  835. return __execOp(pOp, pParam);
  836. }
  837. }
  838. /*****************************************************************
  839. **【函数名称】 __procOpRecord
  840. **【函数功能】 线路录音
  841. **【参数】
  842. **【返回值】
  843. ****************************************************************/
  844. bool COperationReactor::__procOpRecord( LONG Instance, ULONG ResID, LineOpParam* pParam )
  845. {
  846. // 查找要录音的线路
  847. CVirtualChan* pChan = CFsProxy::GetInstance().getTrunk(ResID);
  848. if(pChan == NULL)
  849. pChan = CFsProxy::GetInstance().getExten(ResID);
  850. if(pChan == NULL)
  851. {
  852. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行录音操作失败, 未找到通道[%lu]"), ResID);
  853. return false;
  854. } // end if
  855. // 生成录音操作类
  856. COperation* pOp = new(std::nothrow) COpRecord(this, Instance);
  857. if (pOp == NULL) {
  858. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行录音,内存不足"));
  859. return false;
  860. }
  861. if(!pOp->attachHostChan(pChan))
  862. {
  863. // 如果线路正在执行其它操作
  864. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行录音操作失败, 无法绑定通道[%lu], ChanCurTask = %d"), ResID,
  865. (pChan->currOp() == NULL ? LINE_OP_UNKNOWN : pChan->currOp()->type()));
  866. FS_LINK_DELETE(pOp);
  867. return false;
  868. }
  869. // 启动操作
  870. return __execOp(pOp, pParam);
  871. }
  872. /*****************************************************************
  873. **【函数名称】 __procOpLeaveWord
  874. **【函数功能】 留言录音
  875. **【参数】
  876. **【返回值】
  877. ****************************************************************/
  878. bool COperationReactor::__procOpLeaveWord( LONG Instance, ULONG ResID, LineOpParam* pParam )
  879. {
  880. // 查找要留言的线路
  881. CVirtualChan* pChan = CFsProxy::GetInstance().getTrunk(ResID); // 外线
  882. if(pChan == NULL)
  883. {
  884. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行留言操作失败, 未找到通道[%lu]"), ResID);
  885. return false;
  886. } // end if
  887. // 生成留言操作类
  888. COperation* pOp = new(std::nothrow) COpLeaveWord(this, Instance);
  889. if (pOp == NULL) {
  890. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行留言,内存不足"));
  891. return false;
  892. }
  893. if(!pOp->attachHostChan(pChan))
  894. {
  895. // 如果线路正在执行其它操作
  896. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行留言操作失败, 无法绑定通道[%lu], ChanCurTask = %d"), ResID,
  897. (pChan->currOp() == NULL ? LINE_OP_UNKNOWN : pChan->currOp()->type()));
  898. FS_LINK_DELETE(pOp);
  899. return false;
  900. }
  901. // 启动操作
  902. return __execOp(pOp, pParam);
  903. }
  904. /*****************************************************************
  905. **【函数名称】 __procOpFax
  906. **【函数功能】 传真
  907. **【参数】
  908. **【返回值】
  909. ****************************************************************/
  910. bool COperationReactor::__procOpFax( LONG Instance, ULONG ResID, LineOpParam* pParam )
  911. {
  912. return false;
  913. }
  914. /*****************************************************************
  915. **【函数名称】 __procOpSetChannelVar
  916. **【函数功能】 设置通道变量
  917. **【参数】
  918. **【返回值】
  919. ****************************************************************/
  920. bool COperationReactor::__procOpSetChannelVar(LONG Instance, ULONG ResID, LineOpParam * pParam)
  921. {
  922. // 查找要设置通道变量的线路
  923. CVirtualChan* pChan = CFsProxy::GetInstance().getTrunk(ResID);
  924. if (pChan == NULL)
  925. pChan = CFsProxy::GetInstance().getExten(ResID);
  926. if (pChan == NULL)
  927. {
  928. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行设置通道变量操作失败, 未找到通道[%lu]"), ResID);
  929. return false;
  930. } // end if
  931. // 生成设置通道变量操作类
  932. COperation* pOp = new(std::nothrow) COpSetChannelVar(this, Instance);
  933. if (pOp == NULL) {
  934. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行设置通道变量,内存不足"));
  935. return false;
  936. }
  937. if (pOp == NULL) {
  938. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行放音,内存不足"));
  939. return false;
  940. }
  941. if (!pOp->attachHostChan(pChan))
  942. {
  943. // 如果线路正在执行其它操作
  944. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行设置通道变量操作失败, 无法绑定通道[%lu], ChanCurTask = %d"), ResID,
  945. (pChan->currOp() == NULL ? LINE_OP_UNKNOWN : pChan->currOp()->type()));
  946. FS_LINK_DELETE(pOp);
  947. return false;
  948. }
  949. // 启动操作
  950. return __execOp(pOp, pParam);
  951. }
  952. bool COperationReactor::__procOpSendDtmf(LONG Instance, ULONG ResID, LineOpParam * pParam)
  953. {
  954. // 查找要设置通道变量的线路
  955. CVirtualChan* pChan = CFsProxy::GetInstance().getTrunk(ResID);
  956. if (pChan == NULL)
  957. pChan = CFsProxy::GetInstance().getExten(ResID);
  958. if (pChan == NULL)
  959. {
  960. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行发送按键操作失败, 未找到通道[%lu]"), ResID);
  961. return false;
  962. } // end if
  963. // 生成设置通道变量操作类
  964. COperation* pOp = new(std::nothrow) COpSendDtmf(this, Instance);
  965. if (pOp == NULL) {
  966. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行发送按键,内存不足"));
  967. return false;
  968. }
  969. if (!pOp->attachHostChan(pChan))
  970. {
  971. // 如果线路正在执行其它操作
  972. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行发送按键操作失败, 无法绑定通道[%lu], ChanCurTask = %d"), ResID,
  973. (pChan->currOp() == NULL ? LINE_OP_UNKNOWN : pChan->currOp()->type()));
  974. FS_LINK_DELETE(pOp);
  975. return false;
  976. }
  977. // 启动操作
  978. return __execOp(pOp, pParam);
  979. }
  980. /*****************************************************************
  981. **【函数名称】 procOperation
  982. **【函数功能】 线路操作处理
  983. **【参数】
  984. **【返回值】
  985. ****************************************************************/
  986. bool COperationReactor::procOperation( LONG Instance, UINT OpType, ULONG ResID, LineOpParam* pParam )
  987. {
  988. LOGGER(LOG_LEVEL_NORMAL, _T("{OperationReactor}: 通道操作, OpType = %lu,通道[%lu]"), OpType, ResID);
  989. bool Res = false;
  990. // 根据操作类型进行分类处理
  991. switch(OpType)
  992. {
  993. case LINE_OP_MAKE_CALL: // 座席外呼
  994. Res = __procOpMakeCall(Instance, ResID, pParam);
  995. break;
  996. case LINE_OP_ANSWER_CALL: // 应答呼叫
  997. Res = __procOpAnswerCall(Instance, ResID, pParam);
  998. break;
  999. case LINE_OP_PREDICTION_CALL: // 预测外呼
  1000. Res = __procOpPCall(Instance, ResID, pParam);
  1001. break;
  1002. case LINE_OP_HANG_UP: // 挂机
  1003. Res = __procOpHangUp(Instance, ResID, pParam);
  1004. break;
  1005. case LINE_OP_TRANSFER: // 呼叫转移
  1006. Res = __procOpTransfer(Instance, ResID, pParam);
  1007. break;
  1008. case LINE_OP_TURNAGENT: // 转坐席
  1009. Res = __procOpTurnAgent(Instance, ResID, pParam);
  1010. break;
  1011. case LINE_OP_TURNOUT: // 转外线
  1012. Res = __procOpTurnOut(Instance, ResID, pParam);
  1013. break;
  1014. case LINE_OP_TURNIVR: // 转IVR
  1015. Res = __procOpTurnIvr(Instance, ResID, pParam);
  1016. break;
  1017. case LINE_OP_CONFERENCE: // 单步会议
  1018. Res = __procOpMeeting(Instance, ResID, pParam);
  1019. break;
  1020. case LINE_OP_CONFERENCE_TAKEBACK: // 会议接回主叫
  1021. Res = __procOpMeetingTackBack(Instance, ResID, pParam);
  1022. break;
  1023. case LINE_OP_LISTEN: // 监听
  1024. Res = __procOpListen(Instance, ResID, pParam);
  1025. break;
  1026. case LINE_OP_INSERT: // 强插
  1027. Res = __procOpInsert(Instance, ResID, pParam);
  1028. break;
  1029. case LINE_OP_RESET: // 重置
  1030. Res = __procOpReset(Instance, ResID, pParam);
  1031. break;
  1032. case LINE_OP_INSTEAD: // 代接
  1033. Res = __procOpInstead(Instance, ResID, pParam);
  1034. break;
  1035. case LINE_OP_GRAB: // 强截
  1036. Res = __procOpIntercept(Instance, ResID, pParam);
  1037. break;
  1038. case LINE_OP_TRANSFER_INFO: // 信息交互
  1039. Res = __procOpInfoTransaction(Instance, ResID, pParam);
  1040. break;
  1041. case LINE_OP_PLAY_VOICE: // 放音收号
  1042. Res = __procOpPlayAndDtmf(Instance, ResID, pParam);
  1043. break;
  1044. case LINE_OP_FAX: // 传真
  1045. Res = __procOpFax(Instance, ResID, pParam);
  1046. break;
  1047. case LINE_OP_RECORD: // 录音
  1048. Res = __procOpRecord(Instance, ResID, pParam);
  1049. break;
  1050. case LINE_OP_LEAVEWORD: // 留言
  1051. Res = __procOpLeaveWord(Instance, ResID, pParam);
  1052. break;
  1053. case LINE_OP_MUTE_BEGIN: // 静音开始
  1054. Res = __procOpMuteOn(Instance, ResID, pParam);
  1055. break;
  1056. case LINE_OP_MUTE_END: // 静音结束
  1057. Res = __procOpMuteOff(Instance, ResID, pParam);
  1058. break;
  1059. case LINE_OP_HOLD: // 保持
  1060. Res = __procOpHold(Instance, ResID, pParam);
  1061. break;
  1062. case LINE_OP_TAKEBACK: // 接回
  1063. Res = __procOpTakeBack(Instance, ResID, pParam);
  1064. break;
  1065. case LINE_OP_CONSULT_CALL_BEGIN: // 协商呼叫启动
  1066. Res = __procOpConsultBegin(Instance, ResID, pParam);
  1067. break;
  1068. case LINE_OP_CONSULT_CALL_CONFIRM: // 协商呼叫确认
  1069. Res = __procOpConsultConfirm(Instance, ResID, pParam);
  1070. break;
  1071. case LINE_OP_IVRFAX_TRANSFER:
  1072. {
  1073. CDevControl::GetInstance().onEventOpResult(Instance, true, NULL);
  1074. Res = true;
  1075. }
  1076. break;
  1077. case LINE_OP_SET_CHANNEL_VARIABLE: // 设置通道变量
  1078. Res = __procOpSetChannelVar(Instance, ResID, pParam);
  1079. break;
  1080. case LINE_OP_SEND_DTMF: // 发送按键
  1081. Res = __procOpSendDtmf(Instance, ResID, pParam);
  1082. break;
  1083. default:
  1084. ASSERT(FALSE);
  1085. } // end switch
  1086. return Res;
  1087. }
  1088. /*****************************************************************
  1089. **【函数名称】 onOpProcess
  1090. **【函数功能】 操作进展返回
  1091. **【参数】 Instance 调用标识
  1092. HostLine 主控线路ID
  1093. AssoLine 关联线路ID
  1094. AssoLineType 关联线路类型
  1095. CallerNum 主叫号码
  1096. CalleeNum 被叫号码
  1097. **【返回值】
  1098. ****************************************************************/
  1099. void COperationReactor::onOpProcess( LONG Instance, UINT HostChanNo, UINT AssoChanNo, DEV_RES_TYPE AssoChanType, LPCTSTR CallerNum, LPCTSTR CalleeNum )
  1100. {
  1101. CDevControl::GetInstance().onEventOpProcess(Instance, HostChanNo, AssoChanNo, AssoChanType, CallerNum, CalleeNum);
  1102. }
  1103. /*****************************************************************
  1104. **【函数名称】 onOpResult
  1105. **【函数功能】 操作结果返回
  1106. **【参数】 Instance 调用标识
  1107. IsSucceed 操作结果
  1108. pInfo 附加信息
  1109. **【返回值】
  1110. ****************************************************************/
  1111. void COperationReactor::onOpResult( LONG Instance, bool IsSucceed )
  1112. {
  1113. CDevControl::GetInstance().onEventOpResult(Instance, IsSucceed, NULL);
  1114. }
  1115. /*****************************************************************
  1116. **【函数名称】 onOpResult
  1117. **【函数功能】 操作结果返回
  1118. **【参数】 Instance 调用标识
  1119. pOp 返回操作结果的操作实体指针
  1120. IsSucceed 操作结果
  1121. pInfo 附加信息
  1122. **【返回值】
  1123. ****************************************************************/
  1124. void COperationReactor::onOpResult( LONG Instance, COperation* pOp, bool IsSucceed, CString Data /*= _T("")*/ )
  1125. {
  1126. ASSERT(pOp != NULL);
  1127. if (pOp == NULL)return;
  1128. if (__delOperation(pOp)) // 非取消操作的返回结果
  1129. {
  1130. // 关闭线路关联
  1131. pOp->detachHostChan();
  1132. // 释放操作
  1133. FS_LINK_DELETE(pOp);
  1134. } // end if
  1135. // 返回执行结果
  1136. CDevControl::GetInstance().onEventOpResult(Instance, IsSucceed, Data);
  1137. }
  1138. //2019.3.7
  1139. void COperationReactor::releaseOpResult( COperation* pOp)
  1140. {
  1141. if (pOp == NULL)return;
  1142. pOp->clean();
  1143. if (__delOperation(pOp)) // 非取消操作的返回结果
  1144. {
  1145. // 关闭线路关联
  1146. pOp->detachHostChan();
  1147. // 释放操作
  1148. FS_LINK_DELETE(pOp);
  1149. } // end if
  1150. }
  1151. /*****************************************************************
  1152. **【函数名称】 onOpFromDev
  1153. **【函数功能】 设备主动操作事件
  1154. **【参数】 pChan 主动操作的通道
  1155. OpType 操作类型
  1156. CallerNum 主叫号码
  1157. CalleeNum 被叫号码
  1158. **【返回值】
  1159. ****************************************************************/
  1160. void COperationReactor::onOpFromDev( CVirtualChan* pChan, DEV_OP OpType, LPCTSTR CallerNum, LPCTSTR CalleeNum )
  1161. {
  1162. CDevControl::GetInstance().onEventDevOperation(pChan->no(), OpType, CallerNum, CalleeNum);
  1163. }
  1164. /*****************************************************************
  1165. **【函数名称】 onExtenCallFromDev
  1166. **【函数功能】 分机直接外呼
  1167. **【参数】
  1168. **【返回值】
  1169. *****************************************************************/
  1170. bool COperationReactor::onExtenCallFromDev( CVirtualChan* pHostChan, PCHAN_EVENT_NOTIFY pNotify )
  1171. {
  1172. COpMakeCall* pMakeCall = new(std::nothrow) COpMakeCall(this, FS_LINK_INSTANCE_INVALID);
  1173. if (pMakeCall == NULL) {
  1174. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行分机直呼,内存不足"));
  1175. return false;
  1176. }
  1177. pMakeCall->attachHostChan(pHostChan);
  1178. if(pMakeCall->start(pNotify))
  1179. {
  1180. __addOperation(pMakeCall);
  1181. return true;
  1182. }
  1183. else
  1184. {
  1185. pMakeCall->detachHostChan();
  1186. FS_LINK_DELETE(pMakeCall);
  1187. return false;
  1188. }
  1189. }
  1190. /*****************************************************************
  1191. **【函数名称】 onEslEvtBgJobDone
  1192. **【函数功能】 后台任务执行结束事件处理
  1193. **【参数】
  1194. **【返回值】
  1195. *****************************************************************/
  1196. void COperationReactor::onEslEvtBgJobDone( PBG_JOB_NOTIFY pNotify )
  1197. {
  1198. ASSERT(pNotify != NULL);
  1199. COperation* pOperation = __getOperation(pNotify->JobInstance);
  1200. if(pOperation != NULL)
  1201. pOperation->onBackgroudJobDone(pNotify);
  1202. }
  1203. /*****************************************************************
  1204. **【函数名称】 onEslEvtChanState
  1205. **【函数功能】 通道状态事件处理
  1206. **【参数】
  1207. **【返回值】
  1208. *****************************************************************/
  1209. void COperationReactor::onEslEvtChanState( LONG OpInstance, CVirtualChan* pChan )
  1210. {
  1211. COperation* pOperation = __getOperation(OpInstance);
  1212. if(pOperation != NULL)
  1213. pOperation->onAssoChanStateUpdated(pChan);
  1214. }