#include "StdAfx.h" #include "OpMeeting.h" #include "VirtualChan.h" #include "OperationReactor.h" #include "FsProxy.h" #include "Config.h" #include "ChanExten.h" COpMeeting::COpMeeting(COperationReactor* pParent, LONG Instance) : COperation(pParent, Instance), m_pAssoChan(NULL), m_Step(0) { } COpMeeting::~COpMeeting(void) { } /***************************************************************** **【函数名称】 _end **【函数功能】 操作完成 **【参数】 IsSucceed 操作是否成功 lpData 随路数据 **【返回值】 ****************************************************************/ void COpMeeting::_end(bool IsSucceed) { // 返回执行结果 if (m_Step == 5) // 拉回三方 { if (IsSucceed) { LOGGER(LOG_LEVEL_NORMAL, _T("{OpMeeting}: 分机[%lu]执行接回会议成功, DestNum = %s"), m_pHostChan->no(), m_DestNumber); } else { LOGGER(LOG_LEVEL_WARNING, _T("{OpMeeting}: 分机[%lu]执行接回会议失败, DestNum = %s"), m_pHostChan->no(), m_DestNumber); } if (IsSucceed) m_pParent->onOpResult(m_Instance, this, IsSucceed); else m_pParent->onOpResult(m_Instance, IsSucceed); } else { if (IsSucceed) { LOGGER(LOG_LEVEL_NORMAL, _T("{OpMeeting}: 分机[%lu]执行会议成功, DestNum = %s"), m_pHostChan->no(), m_DestNumber); } else { LOGGER(LOG_LEVEL_WARNING, _T("{OpMeeting}: 分机[%lu]执行会议失败, DestNum = %s"), m_pHostChan->no(), m_DestNumber); } if (!IsSucceed) m_pParent->onOpResult(m_Instance, this, IsSucceed); else m_pParent->onOpResult(m_Instance, IsSucceed); } } /***************************************************************** **【函数名称】 start **【函数功能】 执行操作 **【参数】 **【返回值】 *****************************************************************/ bool COpMeeting::start(LineOpParam* pParam) { // 校验状态 if (m_pHostChan->state() != CHAN_LOGIC_STATE_TALKING) return false; m_MeetingId.Format(_T("%d"), pParam->nParam1); m_CallerNum = pParam->szParam1; m_DestNumber = pParam->szParam2; // 判断被邀请会议的是否是内线分机 UINT ExtenNo = 0; sscanf_s(pParam->szParam2, "%lu", &ExtenNo); CChanExten* pExten = CFsProxy::GetInstance().getExten(ExtenNo); if (pExten != NULL) { if (!pExten->isFree()) { LOGGER(LOG_LEVEL_WARNING, _T("{OpMeeting}: 分机[%lu]执行会议失败, 目标分机[%lu]非空闲"), m_pHostChan->no(), ExtenNo); return false; } // 若主叫为空,则置为发起会议的分机通道号 if (m_CallerNum == _T("")) m_CallerNum.Format(_T("%lu"), m_pHostChan->no()); } // 通知启动日志 LOGGER(LOG_LEVEL_NORMAL, _T("{OpMeeting}: 分机[%lu]执行会议, DestNum = %s"), m_pHostChan->no(), m_DestNumber); if (m_pHostChan->isInMeeting()) { m_Step = 3; return CFsProxy::GetInstance().meeting(uniqueId(), m_CallerNum, m_DestNumber, m_MeetingId); } else { m_Step = 1; m_pAssoChan = CFsProxy::GetInstance().getAssoChanInSession(m_pHostChan); if (m_pAssoChan == NULL) { return false; } return CFsProxy::GetInstance().meeting(uniqueId(), m_CallerNum, m_DestNumber, m_MeetingId); } } bool COpMeeting::cancel(LONG InstanceCancel) { LOGGER(LOG_LEVEL_NORMAL, _T("{OpMeeting }: 分机[%lu]呼叫接回主叫"), m_pHostChan->no()); //m_InstanceCancel = InstanceCancel; m_Instance = InstanceCancel; if (m_pAssoChan != NULL) { m_Step = 5; //CFsProxy::GetInstance().setConferenceExitSound(m_MeetingId, true); bool ret = CFsProxy::GetInstance().setConferenceIsMute(uniqueId(), m_MeetingId, m_memberId,false); return ret; } else { LOGGER(LOG_LEVEL_ERROR, _T("{OpMeeting }: 分机[%lu]呼叫接回主叫失败,主叫已挂机"), m_pHostChan->no()); } m_pHostChan->releaseOp(m_pHostChan->currOp()); return false; } /***************************************************************** **【函数名称】 onBackgroudJobDone **【函数功能】 后台命令执行结束事件处理 **【参数】 **【返回值】 *****************************************************************/ void COpMeeting::onBackgroudJobDone(PBG_JOB_NOTIFY pNotify) { if (lstrcmp(pNotify->JobCmd, ESL_CMD_MAKE_CALL) == 0) // 先呼叫 { if (strstr(pNotify->JobBody, ESL_JOB_DONE_RES_OK) == NULL) _end(false); } else { if (strstr(pNotify->JobBody, ESL_JOB_DONE_RES_OK) == NULL) _end(false); else { if (m_Step == 2) { for (int i = 0; i < 1000*2 / 300; i++) { Sleep(300); if (!CFsProxy::GetInstance().getConferenceMemberId(m_MeetingId, m_pAssoChan->chanId(), m_memberId)) { LOGGER(LOG_LEVEL_WARNING, _T("{OpMeeting}: 分机[%lu]执行会议失败, 会议成员id获取失败"), m_pHostChan->no()); //_end(false); m_memberId = "-1"; } else { LOGGER(LOG_LEVEL_WARNING, _T("{OpMeeting}: 分机[%lu]执行会议成员id获取成功,tie = %d"), m_pHostChan->no(), i); break; } } //else { CFsProxy::GetInstance().setConferenceExitSound(m_MeetingId, true); CFsProxy::GetInstance().setConferenceIsMute(-1, m_MeetingId, m_memberId, true); _end(true); } } else if (m_Step == 4) { _end(true); } else if (m_Step == 5) { _end(true); } } } } /***************************************************************** **【函数名称】 onAssoChanStateUpdated **【函数功能】 相关通道状态更新处理 **【参数】 **【返回值】 *****************************************************************/ void COpMeeting::onAssoChanStateUpdated(CVirtualChan* pAssoChan) { ASSERT(pAssoChan != NULL); switch (pAssoChan->state()) { case CHAN_LOGIC_STATE_ALERTING: case CHAN_LOGIC_STATE_RING_BACK: m_pParent->onOpProcess(m_Instance, m_pHostChan->no(), pAssoChan->no(), pAssoChan->type(), m_CallerNum, m_DestNumber); break; case CHAN_LOGIC_STATE_FREE: { if (m_Step == 2 || m_Step == 4) // 三方接通后挂机,自动接回主叫 2022-01-14 { if (m_pAssoChan) CFsProxy::GetInstance().setConferenceIsMute(-1, m_MeetingId, m_memberId, false); } _end(false); } break; case CHAN_LOGIC_STATE_TALKING: // 2021-12-17 第三个人成功之后,关联的外线/第一条线路 { if (m_Step == 1) { m_pHostChan->isInMeeting() = true; if (m_pAssoChan != NULL) m_pAssoChan->isInMeeting() = true; m_Step = 2; if (!CFsProxy::GetInstance().transfer2Context(uniqueId(), m_pHostChan->chanId(), m_MeetingId, CConfig::meetingContext(), true)) _end(false); } else if (m_Step == 3) { m_Step = 4; if (m_pAssoChan != NULL) { if (!CFsProxy::GetInstance().setConferenceIsMute(uniqueId(), m_MeetingId, m_memberId, true)) _end(false); } else { _end(false); } } } break; } } void COpMeeting::onSessionChanStateUpdated(CVirtualChan* pChan) { if (m_pAssoChan != pChan || m_pAssoChan == NULL || pChan == NULL) return; switch (pChan->state()) { case CHAN_LOGIC_STATE_FREE: { LOGGER(LOG_LEVEL_ERROR, _T("{OpMeeting }: 分机[%lu]呼叫接回之前主叫挂机,主叫已挂机"), m_pHostChan->no()); m_pHostChan->releaseOp(m_pHostChan->currOp()); } break; } }