linux版本中间件

OperationReactor.cpp 18KB

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