linux版本中间件

OperationReactor.cpp 23KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746
  1. #include "OperationReactor.h"
  2. #include "Operation.h"
  3. #include "ChanExten.h"
  4. #include "ChanTrunk.h"
  5. #include "Log.h"
  6. #include "OpMakeCall.h"
  7. #include "OpTransfer.h"
  8. #include "OpMeeting.h"
  9. #include "OpMultiMeeting.h"
  10. #include "OpHoldon.h"
  11. #include "OpHangup.h"
  12. #include "OpListen.h"
  13. #include "OpInsert.h"
  14. #include "OpInstead.h"
  15. #include "OpIntercept.h"
  16. #include "OpMute.h"
  17. #include "OpRecord.h"
  18. #include "OpMyd.h"
  19. #include "OpAutoCall.h"
  20. #include "OpForceAgentState.h"
  21. #include "OpSendDtmf.h"
  22. #include "VirtualChan.h"
  23. #include "FsProxy.h"
  24. #include "JsonStringMaker.h"
  25. COperationReactor::COperationReactor()
  26. {
  27. }
  28. COperationReactor::~COperationReactor()
  29. {
  30. }
  31. bool COperationReactor::procOperation(long Instance, uint32_t OpType, uint32_t ResID, LineOpParam * pParam)
  32. {
  33. LOG_INFO("{OperationReactor}: 通道操作, OpType = %lu,通道[%lu]", OpType, ResID);
  34. bool Res = false;
  35. switch (OpType)
  36. {
  37. case LINE_OP_MAKE_CALL: // 座席外呼
  38. Res = __procOpMakeCall(Instance, ResID, pParam);
  39. break;
  40. case LINE_OP_HANG_UP: // 挂机
  41. Res = __procOpHangUp(Instance, ResID, pParam);
  42. break;
  43. case LINE_OP_TRANSFER: // 呼叫转移
  44. Res = __procOpTransfer(Instance, ResID, pParam);
  45. break;
  46. case LINE_OP_CONFERENCE: // 单步会议
  47. Res = __procOpMeeting(Instance, ResID, pParam);
  48. break;
  49. case LINE_OP_MULTI_CONFERENCE: // 多步会议
  50. Res = __procOpMultiMeeting(Instance, ResID, pParam);
  51. break;
  52. case LINE_OP_MULTI_CONFERENCE_TAKEBACK: // 多步会议接回
  53. Res = __procOpMultiMeetingTakeBack(Instance, ResID, pParam);
  54. case LINE_OP_HOLD: // 保持
  55. Res = __procOpHold(Instance, ResID, pParam);
  56. break;
  57. case LINE_OP_TAKEBACK: // 接回
  58. Res = __procOpTakeBack(Instance, ResID, pParam);
  59. break;
  60. case LINE_OP_LISTEN: // 监听
  61. Res = __procOpListen(Instance, ResID, pParam);
  62. break;
  63. case LINE_OP_INSERT: // 强插
  64. Res = __procOpInsert(Instance, ResID, pParam);
  65. break;
  66. case LINE_OP_INSTEAD: // 代接
  67. Res = __procOpInstead(Instance, ResID, pParam);
  68. break;
  69. case LINE_OP_GRAB : // 强截
  70. Res = __procOpIntercept(Instance, ResID, pParam);
  71. break;
  72. case LINE_OP_RECORD: // 录音
  73. Res = __procOpRecord(Instance, ResID, pParam);
  74. break;
  75. case LINE_OP_TURNIVR: // 满意度
  76. Res = __procOpMyd(Instance, ResID, pParam);
  77. break;
  78. case LINE_OP_MUTE_BEGIN: // 静音开始
  79. Res = __procOpMuteOn(Instance, ResID, pParam);
  80. break;
  81. case LINE_OP_MUTE_END: // 静音结束
  82. Res = __procOpMuteOff(Instance, ResID, pParam);
  83. break;
  84. case LINE_OP_AUTO_CALL: // 自动外呼
  85. Res = __procOpAutoCall(Instance, ResID, pParam);
  86. break;
  87. case LINE_OP_AGENT_MONI_FORCE_STATE: // 强制状态控制
  88. Res = __procOpForceAgentState(Instance, ResID, pParam);
  89. break;
  90. case LINE_OP_SEND_DTMF: // 发送按键
  91. Res=__procOpSendDtmf(Instance, ResID, pParam);
  92. break;
  93. default:
  94. break;
  95. }
  96. return Res;
  97. }
  98. void COperationReactor::onOpProcess(long Instance, uint32_t HostChanNo, uint32_t AssoChanNo, DEV_RES_TYPE AssoChanType, std::string CallerNum, std::string CalleeNum)
  99. {
  100. }
  101. void COperationReactor::onOpResult(long Instance, bool IsSucceed)
  102. {
  103. // 通知操作结果
  104. }
  105. void COperationReactor::onOpResult(long Instance, COperation * pOp, bool IsSucceed, std::string DestNum, std::string CurOpType)
  106. {
  107. if (pOp == nullptr) return;
  108. int OpType = pOp->type();
  109. if ((CurOpType != "MuteOn" && (CurOpType != "Hold")&&(CurOpType!="MultiMeeting")) || IsSucceed == false) // 静音,保持操作时不能释放op
  110. {
  111. if (__delOperation(pOp)) // 非取消操作的返回结果
  112. {
  113. LOG_DEBUG("释放操作[%d]", pOp->type());
  114. // 关闭线路关联
  115. pOp->detachHostChan();
  116. // 释放操作
  117. FS_LINK_DELETE(pOp);
  118. } // end if
  119. }
  120. std::string data;
  121. switch (OpType)
  122. {
  123. case LINE_OP_MAKE_CALL: // 外呼
  124. data = CFsProxy::GetInstance().creatJson("MakeCall", IsSucceed);
  125. break;
  126. case LINE_OP_HANG_UP: // 挂机
  127. data = CFsProxy::GetInstance().creatJson("DropCall", IsSucceed);
  128. break;
  129. case LINE_OP_HOLD: // 保持
  130. data = CFsProxy::GetInstance().creatJson("Hold", IsSucceed);
  131. break;
  132. //case LINE_OP_TAKEBACK: // 接回
  133. // data = CFsProxy::GetInstance().creatJson("Retrieve", IsSucceed);
  134. // break;
  135. case LINE_OP_TRANSFER: // 转移
  136. data = CFsProxy::GetInstance().creatJson("Transfer", IsSucceed);
  137. break;
  138. case LINE_OP_CONFERENCE: // 会议
  139. data = CFsProxy::GetInstance().creatJson("Meeting", IsSucceed);
  140. break;
  141. case LINE_OP_MULTI_CONFERENCE: // 多步会议
  142. data = CFsProxy::GetInstance().creatJson(CurOpType, IsSucceed);
  143. break;
  144. case LINE_OP_LISTEN: // 监听
  145. data = CFsProxy::GetInstance().creatJson("Listen", IsSucceed);
  146. break;
  147. case LINE_OP_INSERT: // 强插
  148. data = CFsProxy::GetInstance().creatJson("Insert", IsSucceed);
  149. break;
  150. case LINE_OP_INSTEAD: // 代接
  151. data = CFsProxy::GetInstance().creatJson("Instead", IsSucceed);
  152. break;
  153. case LINE_OP_GRAB: // 强截
  154. data = CFsProxy::GetInstance().creatJson("Intercept", IsSucceed);
  155. break;
  156. case LINE_OP_RECORD: // 录音
  157. //data = CFsProxy::GetInstance().creatJson("Record", IsSucceed);
  158. break;
  159. case LINE_OP_MUTE_BEGIN: // 静音开始
  160. {
  161. data = CFsProxy::GetInstance().creatJson("MuteOn", IsSucceed);
  162. if (CurOpType == "MuteOff")
  163. data = CFsProxy::GetInstance().creatJson("MuteOff", IsSucceed);
  164. }
  165. break;
  166. //case LINE_OP_MUTE_END: // 静音结束
  167. // data = CFsProxy::GetInstance().creatJson("MuteOff", IsSucceed);
  168. // break;
  169. case LINE_OP_SEND_DTMF:
  170. data = CFsProxy::GetInstance().creatJson("SendDtmf", IsSucceed);
  171. break;
  172. default:
  173. data = CFsProxy::GetInstance().creatJson(CurOpType, IsSucceed);
  174. break;
  175. }
  176. if (CurOpType == "Break" || CurOpType == "Retrieve" || CurOpType == "MultiTakeback")
  177. data = CFsProxy::GetInstance().creatJson(CurOpType, IsSucceed);
  178. if(!data.empty())
  179. CFsProxy::GetInstance().send2Agent(DestNum, data);
  180. }
  181. void COperationReactor::onOpFromDev(VirtualChan * pChan, DEV_OP OpType, std::string CallerNum, std::string CalleeNum)
  182. {
  183. }
  184. void COperationReactor::releaseOpResult(COperation * pOp)
  185. {
  186. if (pOp == NULL)return;
  187. pOp->clean();
  188. if (__delOperation(pOp)) // 非取消操作的返回结果
  189. {
  190. // 关闭线路关联
  191. pOp->detachHostChan();
  192. // 释放操作
  193. FS_LINK_DELETE(pOp);
  194. } // end if
  195. }
  196. bool COperationReactor::onExtenCallFromDev(VirtualChan * pHostChan, PCHAN_EVENT_NOTIFY pNotify)
  197. {
  198. COpMakeCall* pMakeCall = new COpMakeCall(this, FS_LINK_INSTANCE_INVALID);
  199. pMakeCall->attachHostChan(pHostChan);
  200. if (pMakeCall->start(pNotify))
  201. {
  202. __addOperation(pMakeCall);
  203. return true;
  204. }
  205. else
  206. {
  207. pMakeCall->detachHostChan();
  208. FS_LINK_DELETE(pMakeCall);
  209. return false;
  210. }
  211. }
  212. void COperationReactor::onEslEvtBgJobDone(PBG_JOB_NOTIFY pNotify)
  213. {
  214. if (pNotify == nullptr) return;
  215. COperation* pOperation = __getOperation(pNotify->JobInstance);
  216. if (pOperation != nullptr)
  217. pOperation->onBackgroudJobDone(pNotify);
  218. }
  219. void COperationReactor::onEslEvtChanState(long OpInstance, VirtualChan * pChan)
  220. {
  221. COperation* pOperation = __getOperation(OpInstance);
  222. if (pOperation != nullptr)
  223. pOperation->onAssoChanStateUpdated(pChan);
  224. }
  225. void COperationReactor::__addOperation(COperation * pOperation)
  226. {
  227. std::unique_lock<std::mutex> lock(m_TaskLock);
  228. m_TableOperation[pOperation->uniqueId()] = pOperation;
  229. }
  230. bool COperationReactor::__delOperation(COperation * pOperation)
  231. {
  232. std::unique_lock<std::mutex> lock(m_TaskLock);
  233. size_t i = m_TableOperation.erase(pOperation->uniqueId());
  234. return i > 0 ? true : false;
  235. }
  236. COperation * COperationReactor::__getOperation(long OpId)
  237. {
  238. std::unique_lock<std::mutex> lock(m_TaskLock);
  239. auto it = m_TableOperation.find(OpId);
  240. if (it != m_TableOperation.end()) return it->second;
  241. return nullptr;
  242. }
  243. bool COperationReactor::__execOp(COperation * pOp, LineOpParam * pParam)
  244. {
  245. __addOperation(pOp);
  246. if (pOp->start(pParam))
  247. return true;
  248. if (__delOperation(pOp))
  249. {
  250. pOp->detachHostChan();
  251. FS_LINK_DELETE(pOp);
  252. }
  253. return false;
  254. }
  255. bool COperationReactor::__procOpMakeCall(long Instance, uint32_t ResID, LineOpParam * pParam)
  256. {
  257. ChanExten* pExten = CFsProxy::GetInstance().getExten(ResID);
  258. if (pExten == nullptr)
  259. {
  260. LOG_WARN(("{OperationReactor}: 执行分机呼叫失败, 未找到分机通道[%lu], DestNum = %s"), ResID, pParam->szParam2.c_str());
  261. return false;
  262. }
  263. // 生成外呼操作类
  264. COperation* pOp = new COpMakeCall(this, Instance);
  265. if (!pOp->attachHostChan(pExten))
  266. {
  267. // 如果线路正在执行其它操作
  268. LOG_WARN(("{OperationReactor}: 执行分机呼叫失败, 无法绑定通道[%lu], ChanCurTask = %d, DestNum = %s"), ResID,
  269. (pExten->currOp() == NULL ? LINE_OP_UNKNOWN : pExten->currOp()->type()), pParam->szParam2.c_str());
  270. FS_LINK_DELETE(pOp);
  271. return false;
  272. }
  273. // 启动操作
  274. return __execOp(pOp, pParam);
  275. }
  276. bool COperationReactor::__procOpHangUp(long Instance, uint32_t ResID, LineOpParam * pParam)
  277. {
  278. // 查找要挂机的线路
  279. VirtualChan* pChan = CFsProxy::GetInstance().getExten(ResID);
  280. if (pChan == nullptr)
  281. pChan = CFsProxy::GetInstance().getTrunk(ResID);
  282. if (pChan == nullptr)
  283. {
  284. LOG_WARN(("{OperationReactor}: 执行挂机操作失败, 未找到通道[%lu]"), ResID);
  285. return false;
  286. } // end if
  287. // 如果线路正在执行其它操作
  288. if (pChan->currOp() != nullptr)
  289. {
  290. if (pChan->currOp()->type() == LINE_OP_HANG_UP)
  291. {
  292. LOG_INFO(("{OperationReactor}: 当前线路正在执行挂机"));
  293. return false; // 使任务删除
  294. }
  295. LOG_INFO(("{OperationReactor}: 执行挂机, 当前线路绑定操作, Operation = %d"), pChan->currOp()->type());
  296. return pChan->currOp()->hangup(Instance);
  297. }
  298. if (pChan->state() == CHAN_LOGIC_STATE_FREE || pChan->state() == CHAN_LOGIC_STATE_DISABLED)
  299. {
  300. LOG_INFO(("{OperationReactor}: 当前线路已挂机"));
  301. return false; // 使任务删除
  302. }
  303. // 执行挂机操作
  304. COperation* pOp = new COpHangup(this, Instance);
  305. if (!pOp->attachHostChan(pChan))
  306. {
  307. LOG_WARN(("{OperationReactor}: 执行挂机操作失败, 无法绑定通道[%lu], ChanCurTask = %d"), ResID,
  308. (pChan->currOp() == nullptr ? LINE_OP_UNKNOWN : pChan->currOp()->type()));
  309. FS_LINK_DELETE(pOp);
  310. return false;
  311. }
  312. // 启动操作
  313. return __execOp(pOp, pParam);
  314. }
  315. bool COperationReactor::__procOpTransfer(long Instance, uint32_t ResID, LineOpParam * pParam)
  316. {
  317. // 通过设备资源查找主控线路
  318. ChanExten* pExten = CFsProxy::GetInstance().getExten(ResID);
  319. if (pExten == nullptr)
  320. {
  321. LOG_WARN(("{OperationReactor}: 执行呼叫转移失败, 未找到分机通道[%lu], DestNum = %s"), ResID, pParam->szParam2.c_str());
  322. return false;
  323. }
  324. COperation* pOp = new COpTransfer(this, Instance);
  325. if (!pOp->attachHostChan(pExten))
  326. {
  327. // 如果通道正在执行其它操作
  328. LOG_WARN(("{OperationReactor}: 执行呼叫转移失败, 无法绑定通道[%lu], ChanCurTask = %d, DestNum = %s"), ResID,
  329. (pExten->currOp() == NULL ? LINE_OP_UNKNOWN : pExten->currOp()->type()), pParam->szParam2.c_str());
  330. FS_LINK_DELETE(pOp);
  331. return false;
  332. }
  333. // 启动操作
  334. return __execOp(pOp, pParam);
  335. }
  336. bool COperationReactor::__procOpMeeting(long Instance, uint32_t ResID, LineOpParam * pParam)
  337. {
  338. // 通过设备资源查找主控线路
  339. ChanExten* pExten = CFsProxy::GetInstance().getExten(ResID);
  340. if (pExten == nullptr)
  341. {
  342. LOG_WARN(("{OperationReactor}: 执行会议操作失败, 未找到分机通道[%lu], DestNum = %s"), ResID, pParam->szParam2.c_str());
  343. return false;
  344. }
  345. COperation* pOp = new COpMeeting(this, Instance);
  346. if (!pOp->attachHostChan(pExten))
  347. {
  348. // 如果线路正在执行其它操作
  349. LOG_WARN(("{OperationReactor}: 执行会议操作失败, 无法绑定通道[%lu], ChanCurTask = %d, DestNum = %s"), ResID,
  350. (pExten->currOp() == NULL ? LINE_OP_UNKNOWN : pExten->currOp()->type()), pParam->szParam2.c_str());
  351. FS_LINK_DELETE(pOp);
  352. return false;
  353. }
  354. // 启动操作
  355. return __execOp(pOp, pParam);
  356. }
  357. bool COperationReactor::__procOpMultiMeeting(long Instance, uint32_t ResID, LineOpParam * pParam)
  358. {
  359. // 通过设备资源查找主控线路
  360. ChanExten* pExten = CFsProxy::GetInstance().getExten(ResID);
  361. if (pExten == nullptr)
  362. {
  363. LOG_WARN(("{OperationReactor}: 执行多步会议操作失败, 未找到分机通道[%lu], DestNum = %s"), ResID, pParam->szParam2.c_str());
  364. return false;
  365. }
  366. COperation* pOp = new COpMultiMeeting(this, Instance);
  367. if (!pOp->attachHostChan(pExten))
  368. {
  369. // 如果线路正在执行其它操作
  370. LOG_WARN(("{OperationReactor}: 执行多步会议操作失败, 无法绑定通道[%lu], ChanCurTask = %d, DestNum = %s"), ResID,
  371. (pExten->currOp() == NULL ? LINE_OP_UNKNOWN : pExten->currOp()->type()), pParam->szParam2.c_str());
  372. FS_LINK_DELETE(pOp);
  373. return false;
  374. }
  375. // 启动操作
  376. return __execOp(pOp, pParam);
  377. }
  378. bool COperationReactor::__procOpMultiMeetingTakeBack(long Instance, uint32_t ResID, LineOpParam * pParam)
  379. {
  380. // 通过设备资源查找主控线路
  381. ChanExten* pExten = CFsProxy::GetInstance().getExten(ResID);
  382. if (pExten == nullptr)
  383. {
  384. LOG_WARN(("{OperationReactor}: 执行多步会议接回操作失败, 未找到分机通道[%lu]"), ResID);
  385. return false;
  386. }
  387. // 如果线路正在执行其它操作
  388. COperation* pCurrOp = pExten->currOp();
  389. if (pCurrOp == nullptr || pCurrOp->type() != LINE_OP_MULTI_CONFERENCE)
  390. {
  391. LOG_WARN(("{OperationReactor}: 执行多步会议接回操作失败, 分机通道[%lu]当前未多步会议"), ResID);
  392. return false;
  393. }
  394. // 执行会议接回操作
  395. return pCurrOp->cancel(Instance);
  396. }
  397. bool COperationReactor::__procOpHold(long Instance, uint32_t ResID, LineOpParam * pParam)
  398. {
  399. // 通过设备资源查找主控线路
  400. ChanExten* pExten = CFsProxy::GetInstance().getExten(ResID);
  401. if (pExten == nullptr)
  402. {
  403. LOG_WARN(("{OperationReactor}: 执行保持操作失败, 未找到分机通道[%lu]"), ResID);
  404. return false;
  405. }
  406. // 生成保持操作类
  407. COperation* pOp = new COpHoldon(this, Instance);
  408. if (!pOp->attachHostChan(pExten))
  409. {
  410. // 如果线路正在执行其它操作
  411. LOG_WARN(("{OperationReactor}: 执行保持操作失败, 无法绑定通道[%lu], ChanCurTask = %d"), ResID,
  412. (pExten->currOp() == nullptr ? LINE_OP_UNKNOWN : pExten->currOp()->type()));
  413. FS_LINK_DELETE(pOp);
  414. return false;
  415. }
  416. // 启动操作
  417. return __execOp(pOp, pParam);
  418. }
  419. bool COperationReactor::__procOpTakeBack(long Instance, uint32_t ResID, LineOpParam * pParam)
  420. {
  421. // 通过设备资源查找主控线路
  422. ChanExten* pExten = CFsProxy::GetInstance().getExten(ResID);
  423. if (pExten == nullptr)
  424. {
  425. LOG_WARN(("{OperationReactor}: 执行保持接回操作失败, 未找到分机通道[%lu]"), ResID);
  426. return false;
  427. }
  428. // 如果线路正在执行其它操作
  429. COperation* pCurrOp = pExten->currOp();
  430. if (pCurrOp == nullptr || pCurrOp->type() != LINE_OP_HOLD)
  431. {
  432. LOG_WARN(("{OperationReactor}: 执行保持接回操作失败, 分机通道[%lu]当前未保持"), ResID);
  433. return false;
  434. }
  435. // 执行取消静音操作
  436. return pCurrOp->cancel(Instance);
  437. }
  438. bool COperationReactor::__procOpMuteOn(long Instance, uint32_t ResID, LineOpParam * pParam)
  439. {
  440. // 通过设备资源查找主控线路
  441. ChanExten* pExten = CFsProxy::GetInstance().getExten(ResID);
  442. if (pExten == nullptr)
  443. {
  444. LOG_WARN("{OperationReactor}: 执行静音操作失败, 未找到分机通道[%lu]", ResID);
  445. return false;
  446. }
  447. // 生成静音操作类
  448. COperation* pOp = new COpMute(this, Instance);
  449. if (!pOp->attachHostChan(pExten))
  450. {
  451. // 如果线路正在执行其它操作
  452. LOG_WARN("{OperationReactor}: 执行静音操作失败, 无法绑定通道[%lu], ChanCurTask = %d", ResID,
  453. (pExten->currOp() == nullptr ? LINE_OP_UNKNOWN : pExten->currOp()->type()));
  454. FS_LINK_DELETE(pOp);
  455. return false;
  456. }
  457. // 启动操作
  458. return __execOp(pOp, pParam);
  459. }
  460. bool COperationReactor::__procOpMuteOff(long Instance, uint32_t ResID, LineOpParam * pParam)
  461. {
  462. // 通过设备资源查找主控线路
  463. ChanExten* pExten = CFsProxy::GetInstance().getExten(ResID);
  464. if (pExten == nullptr)
  465. {
  466. LOG_WARN("{OperationReactor}: 执行取消静音操作失败, 未找到分机通道[%lu]", ResID);
  467. return false;
  468. }
  469. // 如果线路正在执行其它操作
  470. COperation* pCurrOp = pExten->currOp();
  471. if (pCurrOp == nullptr || pCurrOp->type() != LINE_OP_MUTE_BEGIN)
  472. {
  473. LOG_WARN("{OperationReactor}: 执行取消静音操作失败, 分机通道[%lu]当前未静音", ResID);
  474. return false;
  475. }
  476. // 执行取消静音操作
  477. return pCurrOp->cancel(Instance);
  478. }
  479. bool COperationReactor::__procOpListen(long Instance, uint32_t ResID, LineOpParam * pParam)
  480. {
  481. // 通过设备资源查找主控线路
  482. ChanExten* pExten = CFsProxy::GetInstance().getExten(ResID);
  483. if (pExten == nullptr)
  484. {
  485. LOG_WARN("{OperationReactor}: 执行监听操作失败, 未找到分机通道[%lu], DestNum = %s",ResID, pParam->szParam2.c_str());
  486. return false;
  487. }
  488. // 生成强插操作类
  489. COperation* pOp = new COpListen(this, Instance);
  490. if (!pOp->attachHostChan(pExten))
  491. {
  492. // 如果线路正在执行其它操作
  493. LOG_WARN("{OperationReactor}: 执行监听操作失败, 无法绑定通道[%lu], ChanCurTask = %d, DestNum = %s",
  494. ResID, (pExten->currOp() == nullptr ? LINE_OP_UNKNOWN : pExten->currOp()->type()), pParam->szParam2.c_str());
  495. FS_LINK_DELETE(pOp);
  496. return false;
  497. }
  498. // 启动操作
  499. return __execOp(pOp, pParam);
  500. }
  501. bool COperationReactor::__procOpInsert(long Instance, uint32_t ResID, LineOpParam * pParam)
  502. {
  503. // 通过设备资源查找主控线路
  504. ChanExten* pExten = CFsProxy::GetInstance().getExten(ResID);
  505. if (pExten == nullptr)
  506. {
  507. LOG_WARN("{OperationReactor}: 执行强插操作失败, 未找到分机通道[%lu], DestNum = %s", ResID, pParam->szParam2.c_str());
  508. return false;
  509. }
  510. // 生成强插操作类
  511. COperation* pOp = new COpInsert(this, Instance);
  512. if (!pOp->attachHostChan(pExten))
  513. {
  514. // 如果线路正在执行其它操作
  515. LOG_WARN("{OperationReactor}: 执行强插操作失败, 无法绑定通道[%lu], ChanCurTask = %d, DestNum = %s",
  516. ResID, (pExten->currOp() == NULL ? LINE_OP_UNKNOWN : pExten->currOp()->type()), pParam->szParam2.c_str());
  517. FS_LINK_DELETE(pOp);
  518. return false;
  519. }
  520. // 启动操作
  521. return __execOp(pOp, pParam);
  522. }
  523. bool COperationReactor::__procOpInstead(long Instance, uint32_t ResID, LineOpParam * pParam)
  524. {
  525. // 通过设备资源查找主控线路
  526. ChanExten* pExten = CFsProxy::GetInstance().getExten(ResID);
  527. if (pExten == nullptr)
  528. {
  529. LOG_WARN("{OperationReactor}: 执行代接操作失败, 未找到分机通道[%lu], DestNum = %s", ResID, pParam->szParam2.c_str());
  530. return false;
  531. }
  532. // 生成代接操作类
  533. COperation* pOp = new COpInstead(this, Instance);
  534. if (!pOp->attachHostChan(pExten))
  535. {
  536. // 如果线路正在执行其它操作
  537. LOG_WARN("{OperationReactor}: 执行代接操作失败, 无法绑定通道[%lu], ChanCurTask = %d, DestNum = %s",
  538. ResID, (pExten->currOp() == nullptr ? LINE_OP_UNKNOWN : pExten->currOp()->type()), pParam->szParam2.c_str());
  539. FS_LINK_DELETE(pOp);
  540. return false;
  541. }
  542. // 启动操作
  543. return __execOp(pOp, pParam);
  544. }
  545. bool COperationReactor::__procOpIntercept(long Instance, uint32_t ResID, LineOpParam * pParam)
  546. {
  547. // 通过设备资源查找主控线路
  548. ChanExten* pExten = CFsProxy::GetInstance().getExten(ResID);
  549. if (pExten == nullptr)
  550. {
  551. LOG_WARN("{OperationReactor}: 执行强截操作失败, 未找到分机通道[%lu], DestNum = %s", ResID, pParam->szParam2.c_str());
  552. return false;
  553. }
  554. // 生成强截操作类
  555. COperation* pOp = new COpIntercept(this, Instance);
  556. if (!pOp->attachHostChan(pExten))
  557. {
  558. // 如果线路正在执行其它操作
  559. LOG_WARN("{OperationReactor}: 执行强截操作失败, 无法绑定通道[%lu], ChanCurTask = %d, DestNum = %s",
  560. ResID, (pExten->currOp() == NULL ? LINE_OP_UNKNOWN : pExten->currOp()->type()), pParam->szParam2.c_str());
  561. FS_LINK_DELETE(pOp);
  562. return false;
  563. }
  564. // 启动操作
  565. return __execOp(pOp, pParam);
  566. }
  567. bool COperationReactor::__procOpRecord(long Instance, uint32_t ResID, LineOpParam * pParam)
  568. {
  569. // 查找要录音的线路
  570. VirtualChan* pChan = CFsProxy::GetInstance().getTrunk(ResID);
  571. if (pChan == nullptr)
  572. pChan = CFsProxy::GetInstance().getExten(ResID);
  573. if (pChan == nullptr)
  574. {
  575. LOG_WARN("{OperationReactor}: 执行录音操作失败, 未找到通道[%lu]", ResID);
  576. return false;
  577. } // end if
  578. // 生成录音操作类
  579. COperation* pOp = new COpRecord(this, Instance);
  580. if (!pOp->attachHostChan(pChan))
  581. {
  582. // 如果线路正在执行其它操作
  583. LOG_WARN("{OperationReactor}: 执行录音操作失败, 无法绑定通道[%lu], ChanCurTask = %d", ResID,
  584. (pChan->currOp() == nullptr ? LINE_OP_UNKNOWN : pChan->currOp()->type()));
  585. FS_LINK_DELETE(pOp);
  586. return false;
  587. }
  588. // 启动操作
  589. return __execOp(pOp, pParam);
  590. }
  591. bool COperationReactor::__procOpMyd(long Instance, uint32_t ResID, LineOpParam * pParam)
  592. {
  593. // 查找要转IVR的线路
  594. ChanExten* pExten = CFsProxy::GetInstance().getExten(ResID);
  595. if (pExten == nullptr)
  596. {
  597. LOG_WARN("{OperationReactor}: 执行跳转IVR操作失败, 未找到分机通道[%lu]", ResID);
  598. return false;
  599. } // end if
  600. // 执行转IVR操作
  601. COperation* pOp = new COpMyd(this, Instance);
  602. if (!pOp->attachHostChan(pExten))
  603. {
  604. LOG_WARN("{OperationReactor}: 执行跳转IVR操作失败, 无法绑定通道[%lu], ChanCurTask = %d", ResID,
  605. (pExten->currOp() == nullptr ? LINE_OP_UNKNOWN : pExten->currOp()->type()));
  606. FS_LINK_DELETE(pOp);
  607. return false;
  608. } // end if
  609. return __execOp(pOp, pParam);
  610. }
  611. bool COperationReactor::__procOpAutoCall(long Instance, uint32_t ResID, LineOpParam * pParam)
  612. {
  613. ChanExten* pExten = CFsProxy::GetInstance().getExten(ResID);
  614. if (pExten == nullptr)
  615. {
  616. LOG_WARN(("{OperationReactor}: 执行分机自动呼叫失败, 未找到分机通道[%lu], DestNum = %s"), ResID, pParam->szParam2.c_str());
  617. return false;
  618. }
  619. // 生成自动呼叫操作类
  620. COperation* pOp = new COpAutoCall(this, Instance);
  621. if (!pOp->attachHostChan(pExten))
  622. {
  623. // 如果线路正在执行其它操作
  624. LOG_WARN(("{OperationReactor}: 执行分机自动呼叫失败, 无法绑定通道[%lu], ChanCurTask = %d, DestNum = %s"), ResID,
  625. (pExten->currOp() == NULL ? LINE_OP_UNKNOWN : pExten->currOp()->type()), pParam->szParam2.c_str());
  626. FS_LINK_DELETE(pOp);
  627. return false;
  628. }
  629. // 启动操作
  630. return __execOp(pOp, pParam);
  631. }
  632. bool COperationReactor::__procOpForceAgentState(long Instance, uint32_t ResID, LineOpParam * pParam)
  633. {
  634. // 生成自动呼叫操作类
  635. COperation* pOp = new COpForceAgentState(this, Instance);
  636. // 启动操作
  637. return __execOp(pOp, pParam);
  638. }
  639. bool COperationReactor::__procOpSendDtmf(long Instance, uint32_t ResID, LineOpParam * pParam)
  640. {
  641. VirtualChan* pChan = CFsProxy::GetInstance().getTrunk(ResID);
  642. if (pChan == nullptr) {
  643. pChan = CFsProxy::GetInstance().getExten(ResID);
  644. }
  645. if (pChan == nullptr)
  646. {
  647. LOG_WARN(("{OperationReactor}: 执行发送按键失败, 未找到分机通道[%lu]"), ResID);
  648. return false;
  649. }
  650. auto pOp = new COpSendDtmf(this, Instance);
  651. if (!pOp->attachHostChan(pChan))
  652. {
  653. // 如果线路正在执行其它操作
  654. LOG_WARN(("{OperationReactor}: 执行发送按键叫失败, 无法绑定通道[%lu], ChanCurTask = %d"), ResID,
  655. (pChan->currOp() == NULL ? LINE_OP_UNKNOWN : pChan->currOp()->type()));
  656. FS_LINK_DELETE(pOp);
  657. return false;
  658. }
  659. // 启动操作
  660. return __execOp(pOp, pParam);
  661. }
  662. COperationReactor COperationReactor::instance;