#include "OpRecord.h" #include "VirtualChan.h" #include "FsProxy.h" #include "Config.h" #include "OperationReactor.h" #include #include #include #include "Session.h" COpRecord::COpRecord(COperationReactor* pParent, long Instance) : COperation(pParent, Instance) { } COpRecord::~COpRecord(void) { } /***************************************************************** **【函数名称】 _end **【函数功能】 操作完成 **【参数】 IsSucceed 操作是否成功 lpData 随路数据 **【返回值】 ****************************************************************/ void COpRecord::_end(bool IsSucceed) { if (IsSucceed) { LOG_INFO("{OpRecord}: 通道[%lu]录音成功", m_pHostChan->no()); } else { LOG_WARN("{OpRecord}: 通道[%lu]录音失败", m_pHostChan->no()); } SqlWrite::GetInstance()->addSql(toSql(IsSucceed, "录音")); // 返回执行结果 if (m_InstanceCancel != FS_LINK_INSTANCE_INVALID) m_pParent->onOpResult(m_InstanceCancel, !IsSucceed); m_pParent->onOpResult(m_Instance, this, IsSucceed,std::to_string(m_pHostChan->no())); } /***************************************************************** **【函数名称】 __makeDir **【函数功能】 创建录音目录 **【参数】 **【返回值】 ****************************************************************/ bool COpRecord::__makeDir(std::string& RcdFile) { using namespace boost::gregorian; date d(day_clock::local_day()); std::string time = to_iso_extended_string(d); time = regex_replace(time,std::regex("-"),""); RcdFile.append(CConfig::GetInstance()->recordPath()).append("/"); RcdFile.append(time).append("/"); RcdFile.append(m_pHostChan->callerNum()).append(m_pHostChan->calleeNum()); RcdFile.append(m_pHostChan->sessionId()).append(".wav"); using namespace boost::filesystem; path p(RcdFile); if (exists(p)) { LOG_WARN("录音文件已存在,sessionid[%s],path[%s]", m_pHostChan->sessionId().c_str(),RcdFile.c_str()); return false; } return true; /*return create_directories(p);*/ } /***************************************************************** **【函数名称】 attachHostChan **【函数功能】 关联操作与主控通道 **【参数】 **【返回值】 *****************************************************************/ bool COpRecord::attachHostChan(VirtualChan* pChan) { m_pHostChan = pChan; return true; } /***************************************************************** **【函数名称】 detachHostChan **【函数功能】 取消通道关联 **【参数】 **【返回值】 *****************************************************************/ void COpRecord::detachHostChan(void) { m_pHostChan = nullptr; } /***************************************************************** **【函数名称】 start **【函数功能】 执行操作 **【参数】 **【返回值】 *****************************************************************/ bool COpRecord::start(LineOpParam* pParam) { LOG_INFO("{OpRecord}: 通道[%lu]执行录音,State:%d", m_pHostChan->no(), m_pHostChan->state()); // 校验状态 //if(m_pHostChan->state() != CHAN_LOGIC_STATE_TALKING || m_pHostChan->state()!= CHAN_LOGIC_STATE_STANDBY) // return false; /* std::string rcdFile; if (!__makeDir(rcdFile)) return false; LOG_INFO("{OpRecord}: 通道[%lu]执行录音, RecordFile = %s", m_pHostChan->no(), rcdFile.c_str()); m_SessionId = m_pHostChan->sessionId(); m_Caller = std::to_string(m_pHostChan->no()); m_CallerAgent = CFsProxy::GetInstance().getAgentByExten(m_Caller); m_OpTime = Util::CurTime(); auto pSession = CFsProxy::GetInstance().getSession(m_SessionId); if (pSession != nullptr) pSession->recordFile() = rcdFile; //pSession->recordFile() = rcdFile.substr(CConfig::GetInstance()->recordPath().length()+1, rcdFile.length()- CConfig::GetInstance()->recordPath().length()-1); */ std::string rcdFile = pParam->szParam3; LOG_INFO("{OpRecord}: 通道[%lu]执行录音, RecordFile = %s", m_pHostChan->no(), rcdFile.c_str()); m_SessionId = m_pHostChan->sessionId(); m_Caller = std::to_string(m_pHostChan->no()); m_CallerAgent = CFsProxy::GetInstance().getAgentByExten(m_Caller); m_OpTime = Util::CurTime(); return CFsProxy::GetInstance().record(uniqueId(), m_pHostChan, rcdFile); } /***************************************************************** **【函数名称】 onBackgroudJobDone **【函数功能】 后台命令执行结束事件处理 **【参数】 **【返回值】 *****************************************************************/ void COpRecord::onBackgroudJobDone(PBG_JOB_NOTIFY pNotify) { std::cout << pNotify->JobBody << std::endl; if (pNotify->JobBody.find(ESL_JOB_DONE_RES_OK) == string::npos) _end(false); else _end(true); }