IVS_INT32 CDomainRouteMgr::GetSameSuperDomainCode(const std::string& strDomainCode1,
	const std::string& strDomainCode2, std::string& strSuperDomainCode)
{
	DOMAIN_CODE_LIST_MAP_ITER iter = m_domainCodeMap.begin();
	DOMAIN_CODE_LIST_MAP_ITER iterEnd = m_domainCodeMap.end();
	if (iter == iterEnd)
	{
		BP_RUN_LOG_INF("Get Same Super Domain Info", "No Domain Info");
		return IVS_FAIL;
	}
	IVS_INT32 iRet = IVS_FAIL;
	SUPER_DOMAIN_CODE_LIST superDomainCodeList1;	//域1的所有上级域List
	SUPER_DOMAIN_CODE_LIST superDomainCodeList2;	//域2的所有上级域List
	iRet = GetSuperDomainCodeList(superDomainCodeList1,strDomainCode1);
	iRet += GetSuperDomainCodeList(superDomainCodeList2,strDomainCode2);
	if(IVS_SUCCEED != iRet)
	{
		BP_RUN_LOG_INF("Get Same Super Domain Info", "Find Super Domain Info Error");
		return IVS_FAIL;
	}
	//如果其中一个没有
	if (superDomainCodeList1.size() >= superDomainCodeList2.size())
	{
		iRet = FindSameSuperDomainCode(superDomainCodeList1,superDomainCodeList2,strSuperDomainCode);
	}
	else
	{
		iRet = FindSameSuperDomainCode(superDomainCodeList2,superDomainCodeList1,strSuperDomainCode);
	}
	return iRet;
}
int CSDKMainctrl::Init()
{
	// 使用PID去初始化参数,第二个参数只有4位,用UUID生成被截断 不通进程同时开启有概率一样,mod by z0019317
    CMKTransID::Instance().SetTransParam("SDK#", CToolsHelp::Int2Str((int)ACE_OS::getpid()));  
	if (IVS_SUCCEED != CMainCtrl::Init())
	{
		BP_RUN_LOG_ERR(IVS_FAIL, "Init failed","NA");
		return IVS_FAIL;
	}
	BP_RUN_LOG_INF("Init success","NA");
	if (IVS_SUCCEED != CMainCtrl::LoadNetService())
	{
		BP_RUN_LOG_ERR(IVS_FAIL, "LoadNetService failed","NA");
		return IVS_FAIL;
	}
	BP_RUN_LOG_INF("CMainCtrl::LoadNetService success","NA");
    if (IVS_SUCCEED != CMainCtrl::LoadBusinessService(false))
    {
		BP_RUN_LOG_ERR(IVS_FAIL, "LoadBusinessService failed","NA");
        return IVS_FAIL;
    }
	BP_RUN_LOG_INF("LoadBusinessService success","NA");

	return IVS_SUCCEED;
}
//extern VOS_Sem* s_pGetSdpSem;
void CSDKMainctrl::OnLinkOpened(const std::string& strDevName, int iNetElementType, const std::string& strLinkID, const std::string& strIP, int iPort)
{

    // note by wanglei 00165153:2014.1.26 该逻辑未被调用,需要与BP确认原因 


    // 记录网元链接变更信息
    BP_RUN_LOG_INF("net element status change notify.", "linkage opened, ip:[%s], port:[%d], element type:[%d], link id:[%s].", 
        strIP.c_str(), iPort, iNetElementType, strLinkID.c_str());

    //根据linkId查找sessionID,查找CUserMgr对象
    int iSessionID = CLinkRouteMgr::instance().FindSessionIDByLinkID(strLinkID);
    if (SDK_SESSIONID_INIT == iSessionID)
    {
        BP_RUN_LOG_INF("can't find sessionID by strLinkID, strLinkID is:","%s",strLinkID.c_str());
        return;
    }
    if (NULL == g_pNvs)
    {
        BP_RUN_LOG_INF("link opened","g_pNvs is null");
        return;
    }
    CUserMgr *pUserMgr = g_pNvs->GetUserMgr(iSessionID);
    if (NULL == pUserMgr)
    {
        BP_RUN_LOG_INF("link opened","pUserMgr is null");
        return;
    }

    CLinkRouteMgr::instance().SetLinkIDStatus(strLinkID, LINKID_STATUS_OPENED);
}
//根据map填充结构体
IVS_INT32 CDomainRouteMgr::GetDomainRouteStruct( IVS_DOMAIN_ROUTE_LIST* pDomainRouteList, IVS_UINT32 uiReqNum )
{
    BP_RUN_LOG_INF("Get Domain Route Info ", "Enter");

    IVS_UINT32 uiLen = m_domainCodeMap.size();

    //若map里面没有值,或者请求的大于最大值,则返回,告诉上层,要重新获取
    if ((0 == uiLen) || (uiLen > IVS_MAX_DOMAIN_ROUTE_NUM))
    {
        BP_RUN_LOG_ERR(IVS_FAIL, "Get Domain Route Info", "Can not find Domain Route Info");
        ClearDomainRouteMap();
        return IVS_FAIL;
    }

    DOMAIN_CODE_LIST_MAP_ITER domainInter = m_domainCodeMap.begin();
    DOMAIN_CODE_LIST_MAP_ITER domainInterEnd = m_domainCodeMap.end();
    IVS_UINT32 uiStLen = sizeof(IVS_DOMAIN_ROUTE);

    //这里要跟请求的数量进行比较
    for (IVS_UINT32 uiIndex = 0; uiIndex < uiReqNum && domainInter != domainInterEnd; uiIndex++, domainInter++)
    {
        IVS_DOMAIN_ROUTE &stRoute = pDomainRouteList->stDomainRoute[uiIndex];
        if (NULL != domainInter->second)
        {
            memcpy(&stRoute, domainInter->second, uiStLen);
        }
    }

    pDomainRouteList->uiTotal = uiLen;
    //pDomainRouteList->stIndexRange.uiFromIndex = 1;
    //pDomainRouteList->stIndexRange.uiToIndex = uiLen;
    BP_RUN_LOG_INF("Get Domain Route Info", "Leave");
    return IVS_SUCCEED;
}
void CSDKMainctrl::OnLinkClosed(const std::string& strDevName, int iNetElementType, const std::string& strLinkID, const std::string& strIP, int iPort)
{

    // 记录网元链接变更信息
    BP_RUN_LOG_INF("net element status change notify.", "linkage closed, ip:[%s], port:[%d], element type:[%d], link id:[%s].", 
        strIP.c_str(), iPort, iNetElementType, strLinkID.c_str());


	// TODO 重连等操作
    //根据linkId查找sessionID,设置连接状态为断   
    CLinkRouteMgr::instance().SetLinkIDStatus(strLinkID, LINKID_STATUS_CLOSED);
    
	int iSessionID = CLinkRouteMgr::instance().FindSessionIDByLinkID(strLinkID);
	if (SDK_SESSIONID_INIT == iSessionID)
	{
		BP_RUN_LOG_INF("can't find sessionID by strLinkID, strLinkID is:","%s",strLinkID.c_str());
		return;
	}
	if (NULL == g_pNvs)
	{
		BP_RUN_LOG_INF("link opened","g_pNvs is nul");
		return;
	}
	CUserMgr *pUserMgr = g_pNvs->GetUserMgr(iSessionID);
	if (NULL == pUserMgr)
	{
		BP_RUN_LOG_INF("link opened","pUserMgr is null");
		return;
	}

	pUserMgr->AddLinkIdToBusinessResumeList(strLinkID,iNetElementType,strIP,iPort,TYPE_ADD_RELINK/*TYPE_ADD_CLOSECOUNT*/);
}
 // 实现外域发送消息公共方法(支持重定向)
 IVS_INT32 CXmlProcess::GetCommSendMgrForRedirect(CXml &xml, CUserMgr* pUserMgr, NSS_MSG_TYPE_E msgType, IVS_INT32 iType, const IVS_CHAR* pCameraCode,const IVS_CHAR* pDomainCode)
 {
	 CHECK_POINTER(pDomainCode, IVS_OPERATE_MEMORY_ERROR);
	 CHECK_POINTER(pUserMgr, IVS_OPERATE_MEMORY_ERROR);

	 IVS_UINT32 xmlLen = 0;
	 const IVS_CHAR* pReq = xml.GetXMLStream(xmlLen);
	 CHECK_POINTER(pReq, IVS_OPERATE_MEMORY_ERROR);

	 BP_RUN_LOG_INF("Get CommSendMgr For Redirect", "send XML = %s", pReq);

	 // 构造带域的请求消息,并发送
	 CSendNssMsgInfo sendNssMsgInfo;
	 sendNssMsgInfo.SetNeedXml(TYPE_NSS_XML);
	 sendNssMsgInfo.SetNetElemType(NET_ELE_SMU_NSS);
	 sendNssMsgInfo.SetReqID(msgType);
	 sendNssMsgInfo.SetReqData(pReq);
	 sendNssMsgInfo.SetCameraCode(pCameraCode);
	 sendNssMsgInfo.SetDomainCode(pDomainCode);
	 std::string strpRsp;
	 IVS_INT32 iNeedRedirect = IVS_FAIL;
	 IVS_INT32 iRet = pUserMgr->SendCmd(sendNssMsgInfo,strpRsp,iNeedRedirect);

     if (IVS_SUCCEED != iRet)
     {
          BP_RUN_LOG_ERR(iRet,"Get CommSendMgr For Redirect", "seng cmd fail");
          return iRet;
     }

	 if(NSS_GET_VOICE_INFO_REQ == msgType || NSS_GET_CAMERA_CFG_REQ == msgType)
	 {
		 if (IVS_SUCCEED == iNeedRedirect)
		 {
			 iRet = pUserMgr->SendRedirectServe(sendNssMsgInfo,strpRsp);
		 }
	 }

	 // 返回相应消息
	 if (BUILSTRING == iType)
	 {
		 if (strpRsp.empty())
		 {
			 BP_RUN_LOG_ERR(iRet,"NULL == strpRsp", "iRet = %d", iRet);
			 return iRet;
		 }
		 if(iRet == IVS_SUCCEED)
		 { 
			 iRet = IVS_XML_INVALID;
			 xml.RemoveElem();
			 if(xml.Parse(strpRsp.c_str()))
			 {
				 iRet = IVS_SUCCEED;
			 }
		 }
		 BP_RUN_LOG_INF("Get CommSendMgr For Redirect", "revice XML = %s", strpRsp.c_str());
	 }

	 return iRet;
 }
IVS_INT32 CXmlProcess::GetCommBuildRet( CXml &xml, NSS_MSG_TYPE_E msgType, IVS_INT32 iType, const std::string& strLinkID)
{
    IVS_UINT32 xmlLen = 0;
    const IVS_CHAR* pReq = xml.GetXMLStream(xmlLen);
    CHECK_POINTER(pReq, IVS_OPERATE_MEMORY_ERROR);

	BP_RUN_LOG_INF("COCXXmlProcess::GetCommBuildRet", "send XML = %s", pReq);
    //创建要发送的CMD,拼装了NSS消息头
    CCmd* pCmd = CNSSOperator::instance().BuildSMUCmd(msgType, pReq, strLinkID);
    CHECK_POINTER(pCmd, IVS_SDK_RET_BP_CMD_REQ_INVALID);

    //发送消息
    CCmd *pCmdRsp = CNSSOperator::instance().SendSyncCmd(pCmd);
    CHECK_POINTER(pCmdRsp, IVS_NET_RECV_TIMEOUT);

    //返回响应消息
    IVS_INT32 iRet = IVS_SUCCEED;
    const IVS_CHAR* pRsp = NULL;
    if (BUILDRET == iType)
    {
        iRet = CNSSOperator::instance().ParseCmd2NSS(pCmdRsp);
    }
    else
    {
        pRsp = CNSSOperator::instance().ParseCmd2XML(pCmdRsp, iRet);        
    }
	BP_RUN_LOG_INF("GetCommBuildRet", "revice XML = %s", pRsp);

    HW_DELETE(pCmdRsp);
    if (BUILSTRING == iType)
    {
        if (NULL == pRsp)
        {
            BP_RUN_LOG_ERR(iRet,"NULL == pRsp", "iRet = %d", iRet);
            return iRet;
        }

        if(iRet == IVS_SUCCEED)
        { 
            iRet = IVS_XML_INVALID;
            xml.RemoveElem();
            if(xml.Parse(pRsp))
            {
                iRet = IVS_SUCCEED;
            }
            IVS_DELETE(pRsp, MUILI);
        }
    }
    BP_RUN_LOG_INF("GetCommBuildRet", "iType = %d,iRet = %d", iType, iRet);
	return iRet;
}
 //获取平台录像计划;
 IVS_INT32 CRecordPlanMgr::GetRecordPlan(const char* pCameraCode,IVS_UINT32 uiRecordMethod,
	 IVS_RECORD_PLAN* pRecordPlan)
 {
	 CHECK_POINTER(pCameraCode, IVS_PARA_INVALID);
	 CHECK_POINTER(pRecordPlan, IVS_PARA_INVALID);
	 CHECK_POINTER(m_UserMgr, IVS_OPERATE_MEMORY_ERROR);
	 IVS_DEBUG_TRACE("");
	 //数据结构拼装XML并转换为const IVS_CHAR *
	 CXml xmlReq;
	 IVS_INT32 iRet = CRecordXMLProcess::GetRecordPlanGetXML(pCameraCode, uiRecordMethod, xmlReq);

	 unsigned int xmlLen = 0;
	 const IVS_CHAR * pReqPlan = xmlReq.GetXMLStream(xmlLen);
	 CHECK_POINTER(pReqPlan, IVS_OPERATE_MEMORY_ERROR);

	 IVS_CHAR chDevCode[IVS_DEV_CODE_LEN+1];
	 memset(chDevCode, 0, sizeof(chDevCode));

	 IVS_CHAR chDomaCode[IVS_DOMAIN_CODE_LEN+1];
	 memset(chDomaCode, 0, sizeof(chDomaCode));

	 (IVS_VOID)CXmlProcess::ParseDevCode(pCameraCode, chDevCode, chDomaCode);
	 //发送nss协议
	 CSendNssMsgInfo sendNssMsgInfo;	
	 sendNssMsgInfo.SetNeedXml(TYPE_NSS_XML);
	 sendNssMsgInfo.SetNetElemType(NET_ELE_SMU_NSS);
	 sendNssMsgInfo.SetReqID(NSS_GET_RECORD_PLAN_REQ);
	 sendNssMsgInfo.SetReqData(pReqPlan); 
	 sendNssMsgInfo.SetCameraCode(chDevCode);
	 sendNssMsgInfo.SetDomainCode(chDomaCode);

	 std::string strpRsp;
	 IVS_INT32 iNeedRedirect = IVS_FAIL;
	 iRet = m_UserMgr->SendCmd(sendNssMsgInfo,strpRsp,iNeedRedirect);
	 if(IVS_SUCCEED != iRet)
	 {
		 BP_RUN_LOG_INF("Get Platform Record Plan", "ok", "Get Platform RecordPlan Success.pResultList size is 0.");
		 return iRet;
	 }

	 // 将xml转化成结构体返回
	 CXml xmlRsp;
	 (void)xmlRsp.Parse(strpRsp.c_str());
	 IVS_INT32 iParseRSPRet = CRecordXMLProcess::GetRecordPlanParseRSP(pRecordPlan,xmlRsp);

	 BP_RUN_LOG_INF("Get Record Plan", "ok", "msg have Parsed");
	 return iRet;
 }//lint !e1762 !e818 !e529
// 对xml添加一个loginID,并发送到SMU
IVS_INT32 CNSSOperator::AddLoginIdAndSendCmd(unsigned short iReqID, const IVS_CHAR* pReqXml) const
{
	CHECK_POINTER(pReqXml, IVS_OPERATE_MEMORY_ERROR);
	BP_RUN_LOG_INF("Add login id and send cmd", "send xml = %s", pReqXml);
	CCmd* pCmd = CNSSOperator::instance().BuildSMUCmd(iReqID, pReqXml);
	CHECK_POINTER(pCmd, IVS_OPERATE_MEMORY_ERROR);

	// 同步发送消息
	CCmd *pCmdRsp = CNSSOperator::instance().SendSyncCmd(pCmd);
	CHECK_POINTER(pCmdRsp, IVS_NET_RECV_TIMEOUT);
	IVS_INT32 iRet = CNSSOperator::instance().ParseCmd2NSS(pCmdRsp);
	BP_RUN_LOG_INF("send cmd", "iRet= %d", iRet);
	HW_DELETE(pCmdRsp);

	return iRet;
}
// 设置平台录像码流回放速度
int CTPPlayChannel::SetPlayBackSpeedByIP(IVS_FLOAT fSpeed)
{
	IVS_DEBUG_TRACE("Speed: %f", fSpeed);

	RTSP_SESSION_STATUS state = RTSP_CLIENT_GetStatus(m_iRtspHandle);
	if (RTSP_SESSION_STATUS_PLAYING == state ||
		RTSP_SESSION_STATUS_READY   == state)
	{
		float fSendScale = fSpeed;
		(void)CToolsHelp::GetSendScale(SERVICE_TYPE_PLAYBACK, fSpeed, fSendScale);
		MEDIA_RANGE_S stMdieaRange;
		memset(&stMdieaRange, 0x0, sizeof(MEDIA_RANGE_S));
		stMdieaRange.enRangeType = RANGE_TYPE_NPT;
		stMdieaRange.MediaBeginOffset = OFFSET_CUR;

		IVS_INT32 iRet = RTSP_CLIENT_SendPlayMsg(m_iRtspHandle, m_strURL.c_str(), (double)fSendScale, &stMdieaRange, RTSP_CLIENT_TIMEOUT);
		if (IVS_SUCCEED != iRet)
		{  
			(void)RTSP_CLIENT_SendTeardownMsg(m_iRtspHandle, m_strURL.c_str(), 1);
			(void)RTSP_CLIENT_FreeHandle(m_iRtspHandle);
			BP_RUN_LOG_ERR(iRet, "Set PlayBack Speed", "Send Play Message failed.");
			return IVS_PLAYER_RET_RTSP_SEND_PLAY_FAIL;
		}
		m_fRTSPSpeed = fSendScale;
		
        BP_RUN_LOG_INF("Set PlayBack Speed", "m_fRTSPSpeed:[%f], fSpeed:[%f].", m_fRTSPSpeed, fSpeed);
		return IVS_SUCCEED;
	}

	BP_RUN_LOG_ERR(IVS_FAIL, "Set PlayBack Speed", "fSpeed:[%f], RTSP Session Status: %d", fSpeed, state);
	return IVS_FAIL;
}
IVS_INT32 CDomainRouteMgr::GetDomainRoute()
{
    BP_RUN_LOG_INF("Get DomainRoute", "Enter");
    IVS_INT32 iRet = IVS_FAIL;
    CXml xmlRsp;
    iRet = SendCmdAndGetInfo(xmlRsp);
    if (IVS_SUCCEED != iRet)
    {
        BP_RUN_LOG_ERR(iRet, "Get DomainRoute", "Get DomainRoute Info Error");
        return iRet;
    }

    DOMAIN_CODE_LIST stCodeInfoList;
	iRet = GetDomainRouteToListParseXML(stCodeInfoList, xmlRsp);
    if (IVS_SUCCEED == iRet)
    {
		ClearDomainRouteMap();
        DOMAIN_CODE_LIST_ITER iterBegin = stCodeInfoList.begin();
        DOMAIN_CODE_LIST_ITER iterEnd = stCodeInfoList.end();
//         DOMAIN_CODE_LIST_MAP_ITER mapIter;
//         DOMAIN_CODE_LIST_MAP_ITER mapIterEnd = m_domainCodeMap.end();
        char szDomainCode[IVS_DOMAIN_CODE_LEN + 1];
        unsigned int uiCopyLen = IVS_DOMAIN_CODE_LEN;
        IVS_DOMAIN_ROUTE* pstDomainRout = NULL;
        for (; iterBegin != iterEnd; iterBegin++)
        {
            pstDomainRout = *iterBegin;
            if (NULL == pstDomainRout)
            {
                continue;
            }
            //确保数组最后一位为“/0”
            memset(szDomainCode, 0, IVS_DOMAIN_CODE_LEN + 1);
            (void)CToolsHelp::Memcpy(szDomainCode, uiCopyLen, pstDomainRout->cDomainCode, uiCopyLen);
            //插入Map表
            (IVS_VOID)m_domainCodeMap.insert(std::make_pair(szDomainCode, pstDomainRout));
        }
        stCodeInfoList.clear();
    }
    m_proxyDomainCodeMap.clear(); // 清除代理域map
    BP_RUN_LOG_INF("Get DomainRoute", "Leave");
    return iRet;
}
// 推送发现到的前端设备
int CSDKMainctrl::OnDisCoveredDevNotify(CCmd* pCmd)const
{
	BP_RUN_LOG_INF("OnDisCoveredDevNotify", "Begin");
	CHECK_POINTER(pCmd, IVS_OPERATE_MEMORY_ERROR);
	
	IVS_CHAR* pData = CSDKMainService::ProcessDevNotify(pCmd);
	CHECK_POINTER(pData, IVS_OPERATE_MEMORY_ERROR);

	int iSessionID = CLinkRouteMgr::instance().FindSessionIDByLinkID(pCmd->GetNetLinkID());  //lint !e1013 !e1055 !e746 !e64
	if (SDK_SESSIONID_INIT == iSessionID)
	{
		BP_RUN_LOG_ERR(IVS_SDK_RET_INVALID_SESSION_ID, "linkage action", "iSessionID is -1");
		IVS_DELETE(pData, MUILI);
		return IVS_FAIL;
	}
	CEventCallBackJob::instance().PostEvent(iSessionID, IVS_EVENT_FIND_DEVICE, pData, static_cast<IVS_INT32>(strlen(pData)) + 1);
    IVS_DELETE(pData, MUILI);
	BP_RUN_LOG_INF("OnDisCoveredDevNotify", "End");
	return IVS_SUCCEED;

}
//设置平台录像码流回放时间
IVS_INT32 CTPPlayChannel::SetPlayBackTimeByIP(IVS_UINT32 uiTime)
{
	IVS_INT32 iRet = GetPlayBackTimeSpan(m_strURL, m_stTimeSpanInter);
	if (IVS_SUCCEED != iRet)
	{
		BP_RUN_LOG_ERR(IVS_FAIL, "Set PlayBack Time ByIP", "Get PlayBack TimeSpan failed");
		return iRet;
	}

	IVS_UINT32 uiTime2Set = (unsigned int)m_stTimeSpanInter.iStartTime + uiTime;
	if (uiTime2Set >= (unsigned int)m_stTimeSpanInter.iEndTime)
	{
		BP_RUN_LOG_ERR(IVS_PARA_INVALID, 
			"Set PlayBack Time ByIP", 
			"Param invalid, uiTime is over end time, startTime = %d, end time = %d, set Time = %d", 
			m_stTimeSpanInter.iStartTime, 
			m_stTimeSpanInter.iEndTime, 
			uiTime);
		return IVS_PARA_INVALID;
	}

	BP_RUN_LOG_INF("Set PlayBack Time ByIP", "RTSP_CLIENT_SendPlayMsg begin, rtsphandle=%d, speed=%f, settime=%u.", m_iRtspHandle, m_fRTSPSpeed, uiTime);

	MEDIA_RANGE_S stRange;
	memset(&stRange, 0x0, sizeof(MEDIA_RANGE_S));
	stRange.enRangeType      = RANGE_TYPE_NPT;
	stRange.MediaBeginOffset = uiTime;
	
	iRet = RTSP_CLIENT_SendPlayMsg(m_iRtspHandle, m_strURL.c_str(), (double)m_fRTSPSpeed, &stRange, RTSP_CLIENT_TIMEOUT);

	BP_RUN_LOG_INF("Set PlayBack Time ByIP", "RTSP_CLIENT_SendPlayMsg end, iRet=%d.", iRet);

	if (IVS_SUCCEED != iRet)
	{
		BP_RUN_LOG_ERR(IVS_PLAYER_RET_RTSP_SEND_PLAY_FAIL,"Set PlayBack Time ByIP", "RTSP_CLIENT_SendPlayMsg failed.");
		return IVS_PLAYER_RET_RTSP_SEND_PLAY_FAIL;
	}

	return IVS_SUCCEED;
}
IVS_INT32 CDomainRouteMgr::SendCmdAndGetInfo(CXml& xmlRsp) const
{
    IVS_INT32 iRet = IVS_FAIL;
    CHECK_POINTER(m_pUserMgr,IVS_OPERATE_MEMORY_ERROR);
    // 获取本域SMU连接
    std::string strSMULinkID;
    IVS_INT32 iGetLinkRet = m_pUserMgr->GetLocalDomainLinkID(NET_ELE_SMU_NSS, strSMULinkID);
    if (IVS_SUCCEED != iGetLinkRet)
    {
        BP_RUN_LOG_ERR(iGetLinkRet, "Get LocalDomainLinkID failed", "NA");
        return iGetLinkRet;
    }
    //创建要发送的CMD,拼装了NSS消息头
    CCmd* pCmd = CNSSOperator::instance().BuildSMUCmd(NSS_GET_DOMAIN_ROUTE_REQ, NULL, strSMULinkID);

    CHECK_POINTER(pCmd, IVS_OPERATE_MEMORY_ERROR);

    //发送消息
    CCmd *pCmdRsp = CNSSOperator::instance().SendSyncCmd(pCmd);
    CHECK_POINTER(pCmdRsp, IVS_NET_RECV_TIMEOUT);

    const IVS_CHAR* pRsp = CNSSOperator::instance().ParseCmd2XML(pCmdRsp, iRet);
    HW_DELETE(pCmdRsp);
    CHECK_POINTER(pRsp, iRet);
    if (IVS_SUCCEED != iRet)
    {
		 BP_RUN_LOG_INF("Send Command get return value", " Error");
		 IVS_DELETE(pRsp, MUILI); //lint !e605
		 return IVS_FAIL;
	}
	iRet = IVS_XML_INVALID;
    BP_RUN_LOG_INF("Get domain route ", "pRsp:%s", pRsp);
    if (xmlRsp.Parse(pRsp))
    {
		iRet = IVS_SUCCEED;
    }
    IVS_DELETE(pRsp, MUILI); //lint !e605
    return iRet;
}
// 获取数据格式类型从字符串到整形
IVS_INT32 CDevEnum::GetDataFormatINT(const IVS_CHAR* pDataFormat)
{
	CHECK_POINTER(pDataFormat, IVS_OPERATE_MEMORY_ERROR);
	IVS_INT32 iRet = -1;
	IVS_INT32 iLen = sizeof(chDataFormat)/sizeof(chDataFormat[0]);
	for (int i = 1; i < iLen; i++)
	{
		if (0 == strcmp(chDataFormat[i], pDataFormat))
		{
			iRet = i;
			break;
		}
	}
	BP_RUN_LOG_INF("Get DataFormat", "resolution=%d",iRet);
	return iRet;
}
IVS_INT32 CDomainRouteMgr::GetSuperDomainCodeList(SUPER_DOMAIN_CODE_LIST& superDomainCodeList, const std::string& strDomainCode)
{
	DOMAIN_CODE_LIST_MAP_ITER iter = m_domainCodeMap.find(strDomainCode);
	DOMAIN_CODE_LIST_MAP_ITER iterEnd = m_domainCodeMap.end();
	if (iter == iterEnd)
	{
		BP_RUN_LOG_INF("Get Super Domain Info", "No Find Domain Info");
		return IVS_FAIL;
	}
	std::string strFatherDomainCode;
	char szDomainCode[IVS_DOMAIN_CODE_LEN + 1];
	unsigned int uiCopyLen = IVS_DOMAIN_CODE_LEN;
	unsigned int uiMapSize = m_domainCodeMap.size();
	unsigned int loopNum = 0; //定义循环次数限制,防止死循环发生
	IVS_DOMAIN_ROUTE* pDomainRoute = NULL;
	//先将自己所在的域信息加入到List(解决如果当前域就是最上级域的问题)
	superDomainCodeList.push_back(strDomainCode);
	//递归查找某个域的所有上级域信息
	do 
	{
		//取出查找的域信息
		pDomainRoute = dynamic_cast <IVS_DOMAIN_ROUTE*>(iter->second);//lint !e611
		if (NULL == pDomainRoute)
		{
			return IVS_FAIL;
		}
		//拷贝出父域信息
		memset(szDomainCode, 0, IVS_DOMAIN_CODE_LEN + 1);
		if (!CToolsHelp::Memcpy(szDomainCode, uiCopyLen, pDomainRoute->cSuperDomain, uiCopyLen))
		{
			BP_RUN_LOG_ERR(IVS_ALLOC_MEMORY_ERROR, "Get Super Domain Route Info", "DomainCode Memcpy error.");
			return false;
		}
		//获取该域的父域Code
		strFatherDomainCode = szDomainCode;
		//查找父域在Map表中的信息
		iter = m_domainCodeMap.find(strFatherDomainCode);
		if (iter == iterEnd)
		{
			break;
		}
		//如果父域信息在Map表中可以找到,将父域信息加入List
		superDomainCodeList.push_back(strFatherDomainCode);
	} while (loopNum < uiMapSize);

	return IVS_SUCCEED;
}
// 获取编码格式
IVS_INT32 CDevEnum::GetEnCodeModeEnum(const IVS_CHAR* pCodeMode)
{
    CHECK_POINTER(pCodeMode, IVS_OPERATE_MEMORY_ERROR);

    IVS_INT32 iRet = 0;

    IVS_INT32 iLen = sizeof(chEnCodeModeCHType)/sizeof(chEnCodeModeCHType[0]);
    for (IVS_INT32 i = 0; i < iLen; i++ )
    {
        if (0 == strcmp(chEnCodeModeCHType[i], pCodeMode))
        {
            iRet = i ;
        }
    }
    BP_RUN_LOG_INF("Get H264ProfileEnum fail", "VideoType=%d",iRet);

    return iRet;
}
// 获取可靠传输类型从字符串到整形
IVS_INT32 CDevEnum::GetReliableTransTypeINT(const IVS_CHAR* pTransType)
{
	CHECK_POINTER(pTransType, IVS_OPERATE_MEMORY_ERROR);

	IVS_INT32 iRet = -1;
	IVS_INT32 iLen = sizeof(chTransType) / sizeof(chTransType[0]);
	for (int i = 0;i < iLen;i++)
	{
		if (0 == strcmp(chTransType[i], pTransType))
		{
			iRet = i;
			break;
		}
	}

	BP_RUN_LOG_INF("Get ReliableTransType", "resolution=%d",iRet);	

	return iRet;
}
IVS_INT32 CDomainRouteMgr::FindSameSuperDomainCode(SUPER_DOMAIN_CODE_LIST& superDomainCodeList1,
	SUPER_DOMAIN_CODE_LIST& superDomainCodeList2, std::string& strSuperDomainCode)
{
	unsigned int  iSizeTolist1 = superDomainCodeList1.size();
	unsigned int  iSizeTolist2 = superDomainCodeList2.size();
	if (iSizeTolist1 < iSizeTolist2)
	{
		BP_RUN_LOG_INF("Find Same Super Domain Code", "Use Function Error");
		return IVS_FAIL;
	}
	//所有list的迭代器初始化
	SUPER_DOMAIN_CODE_LIST_ITER list1Iter = superDomainCodeList1.begin();
	SUPER_DOMAIN_CODE_LIST_ITER list1IterEnd = superDomainCodeList1.end();
	SUPER_DOMAIN_CODE_LIST_ITER list2Iter = superDomainCodeList2.begin();
	SUPER_DOMAIN_CODE_LIST_ITER list2IterEnd = superDomainCodeList2.end();
	//list的大小差异
	unsigned int  iDifSize = iSizeTolist1 - iSizeTolist2;
	//首先查找list1比list2多出的部分
	for (unsigned int i = 0; i < iDifSize ; i++)
	{
		//如果父域相同
		if (0 == strcmp((*list1Iter).c_str(),(*list2Iter).c_str()))
		{
			strSuperDomainCode = *list1Iter;
			return IVS_SUCCEED;
		}
		list1Iter++;
	}
	//剩余相等部分
	for (;list1Iter != list1IterEnd && list2Iter != list2IterEnd ;)
	{
		//如果父域相同
		if (0 == strcmp((*list1Iter).c_str(),(*list2Iter).c_str()))
		{
			strSuperDomainCode = *list1Iter;
			return IVS_SUCCEED;
		}
		list1Iter++;
		list2Iter++;
	}
	return IVS_FAIL;
}//lint !e1762
// 获取镜头码流分辨率
IVS_INT32 CDevEnum::GetResolutionEnum(const IVS_CHAR*pResolution)
{

    IVS_INT32 iRet = 0;
    CHECK_POINTER(pResolution, IVS_OPERATE_MEMORY_ERROR);

    IVS_INT32 iLen = sizeof(chResolutionType)/sizeof(chResolutionType[0]);
    for (IVS_INT32 i = 0; i < iLen ; i ++)
    {
        if (0 == strcmp(chResolutionType[i], pResolution))
        {
            iRet = i;
			break;
        }
    }  
   
    BP_RUN_LOG_INF("Get ResolutionEnum fail", "resolution=%d",iRet);

    return iRet;
}
bool CI18N::SetLanguage(const std::string& strLanguageXMLPath)
{
    BP_RUN_LOG_INF("load language xml failed","strLanguageXMLPath %s", strLanguageXMLPath.c_str());
	CXml xml;
	if (!xml.Load(strLanguageXMLPath.c_str(), TIXML_ENCODING_UTF8))
	{
		//表示加载资源XML不成功
		BP_RUN_LOG_ERR(IVS_FAIL,"load language xml failed","NA");
		return false;
	}

	//如果加载成功了,就遍历xml将所有的资源和语言绑定并加入map表
	if (!xml.FindElemEx("Content"))
	{
		//没找到第一个结点
		return false;
	}

	//先进行清除
	Clear();

	do 
	{
		// 获取当前结点
		const char* ResourceNode = xml.GetElem();
		// 获取当前结点的值
		const char* ResourceNodeValue = xml.GetElemValue();
		// 转换编码,防止乱码
		char* xml2ANSI = CToolsHelp::UTF8ToANSI(ResourceNodeValue);
		//把结点和值绑定进行插入
		(void)VOS_MutexLock(m_pMutexLock);
		(void)m_mapResource2Language.insert(std::make_pair(ResourceNode, xml2ANSI));
		(void)VOS_MutexUnlock(m_pMutexLock);
		free(xml2ANSI);
	} while (xml.NextElem());

	return true;
}
IVS_INT32 CTPPlayChannel::GetPlayBackTimeSpan(const std::string& strURL, 
	TIME_SPAN_INTERNAL& stTimeSpan)
{
	//从URL中获取时间戳
	std::string strTimeSpan;
	IVS_UINT32 uiPos = m_strURL.find("TimeSpan=");
	if (std::string::npos == uiPos || uiPos >= m_strURL.size())
	{
		BP_RUN_LOG_ERR(IVS_FAIL, "Get PlayBack TimeSpan", "Can't find TimeSpan from URL");
		return IVS_FAIL;
	}
	strTimeSpan = m_strURL.substr(uiPos, m_strURL.size() - uiPos);

	uiPos = strTimeSpan.find("&");
	if (std::string::npos == uiPos)
	{
		BP_RUN_LOG_ERR(IVS_FAIL, "Get PlayBack TimeSpan", "Cant't find &, URL format error");
		return IVS_FAIL;
	}
	strTimeSpan = strTimeSpan.substr(strlen("TimeSpan="), uiPos - strlen("TimeSpan="));

	uiPos = strTimeSpan.find("-");
	if (std::string::npos == uiPos)
	{
		BP_RUN_LOG_ERR(IVS_FAIL, "Get PlayBack TimeSpan", "Can't find -, URL format error");
		return IVS_FAIL;
	}

	std::string strStartTime = strTimeSpan.substr(0, uiPos);
	std::string strEndTime = strTimeSpan.substr(uiPos + 1, strlen(IVS_DATE_TIME_NET_FORMAT));

	m_stTimeSpanInter.iStartTime = (IVS_INT32)CMediaBase::UTCStr2Time(strStartTime.c_str(), IVS_DATE_TIME_NET_FORMAT);
	m_stTimeSpanInter.iEndTime = (IVS_INT32)CMediaBase::UTCStr2Time(strEndTime.c_str(), IVS_DATE_TIME_NET_FORMAT);
	BP_RUN_LOG_INF("Get PlayBack TimeSpan", "strStartTime=%s strEndTime=%s iStartTime=%d iEndTime=%d.", 
		strStartTime.c_str(), strEndTime.c_str(), m_stTimeSpanInter.iStartTime, m_stTimeSpanInter.iEndTime);

	return IVS_SUCCEED;
}
//获取回放Url
int CPlayback::DoGetUrlPlayBack(const IVS_CHAR* pDomainCode,const IVS_CHAR* pNVRCode,
                                IVS_SERVICE_TYPE ServiceType,
                                const TIME_SPAN_INTERNAL& stTimeSpanInter,
                                const char *pFileName)
{
    IVS_DEBUG_TRACE("");

    int iRet = IVS_FAIL;

    //请求消息;
    memset(&m_stUrlMediaInfo, 0, sizeof(ST_URL_MEDIA_INFO));

    if(NULL != pNVRCode)
    {
        (void)CToolsHelp::Strncpy(m_stUrlMediaInfo.szNVRCode, sizeof(m_stUrlMediaInfo.szNVRCode),pNVRCode, strlen(pNVRCode));//lint !e534
    }
    else
    {
        memset(&m_stUrlMediaInfo.szNVRCode,0,IVS_NVR_CODE_LEN);//lint !e545
        m_pUserMgr->GetRecordList().GetRecordNVRInfo(m_stUrlMediaInfo.szSrcCode,stTimeSpanInter.iStartTime,stTimeSpanInter.iEndTime,m_stUrlMediaInfo.szNVRCode);
    }

    //校验参数
    if (NULL != pFileName)
    {
        (void)CToolsHelp::Strncpy(m_stUrlMediaInfo.szFileName, FILE_NAME_LEN,
                                  pFileName, strlen(pFileName)+1);
    }

    //TODO : szDstPort无实际作用,传一个固定值;打包协议类型szDstPP入参结构体未定义
    m_stUrlMediaInfo.ServiceType = ServiceType;

    std::string strCameraDomainCode = m_szCameraID;
    std::string strCameraCode;
    std::string strDomainCode;
    iRet = CToolsHelp::SplitCameraDomainCode(m_szCameraID, strCameraCode, strDomainCode);
    if (IVS_SUCCEED != iRet)
    {
        BP_RUN_LOG_ERR(iRet,"Do Get Url Play Back", "CToolsHelp::SplitCameraCode failed, RetCode=%d.", iRet);
        return iRet;
    }
    (void)CToolsHelp::Strncpy(m_stUrlMediaInfo.szSrcCode, sizeof(m_stUrlMediaInfo.szSrcCode), strCameraCode.c_str(), strCameraCode.size());//lint !e534
    (void)CToolsHelp::Strncpy(m_stUrlMediaInfo.szDstCode,sizeof(m_stUrlMediaInfo.szDstCode), "01",strlen("01"));//lint !e534

    if(NULL == pDomainCode)
    {

        (void)CToolsHelp::Strncpy(m_stUrlMediaInfo.cDomainCode,IVS_DOMAIN_CODE_LEN+1,  strDomainCode.c_str(), strDomainCode.size());//lint !e534
    }
    else
    {
        (void)CToolsHelp::Strncpy(m_stUrlMediaInfo.cDomainCode,IVS_DOMAIN_CODE_LEN+1,  pDomainCode, strlen(pDomainCode));//lint !e534
    }
    m_stUrlMediaInfo.MediaPara.StreamType = m_stuMediaParam.StreamType;
    m_stUrlMediaInfo.MediaPara.ProtocolType = m_stuMediaParam.ProtocolType;
    m_stUrlMediaInfo.PackProtocolType = PACK_PROTOCOL_ES;
    m_stUrlMediaInfo.MediaPara.BroadCastType = m_stuMediaParam.BroadCastType;
    m_stUrlMediaInfo.MediaPara.VideoDecType = m_stuMediaParam.VideoDecType;
    m_stUrlMediaInfo.MediaPara.AudioDecType = m_stuMediaParam.AudioDecType;
    m_stUrlMediaInfo.MediaPara.TransMode = m_stuMediaParam.TransMode;



    (void)CToolsHelp::Strncpy(m_stUrlMediaInfo.szDstIP, sizeof(m_stUrlMediaInfo.szDstIP), "",strlen(""));//lint !e534
    (void)CToolsHelp::Strncpy(m_stUrlMediaInfo.szDstPort, sizeof(m_stUrlMediaInfo.szDstPort), "35016",strlen("35016"));//lint !e534

    std::string strTime;
    UTCTime2Str((time_t)stTimeSpanInter.iStartTime, strTime, IVS_DATE_TIME_NET_FORMAT);
    strTime.append("-");
    std::string strEndTime;
    UTCTime2Str((time_t)stTimeSpanInter.iEndTime, strEndTime, IVS_DATE_TIME_NET_FORMAT);
    strTime.append(strEndTime);
    if (TIME_SPAN_LEN <= strTime.size())
    {
        BP_RUN_LOG_ERR(iRet,"Do Get Url Play Back", "Parse time span from rsp url failed. time string over max length. strTime=%s.", strTime.c_str());
        return iRet;
    }
    (void)CToolsHelp::Memcpy(m_stUrlMediaInfo.szTimeSpan,TIME_SPAN_LEN, strTime.c_str(), strTime.length());
    //获取媒体URL
    iRet = GetURL(CToolsHelp::GetSCCHead().c_str(), m_pUserMgr, m_stUrlMediaInfo, m_stMediaRsp, m_bAssociatedAudio);//lint !e838
    if (IVS_SUCCEED != iRet)
    {
        BP_RUN_LOG_ERR(iRet,"Do Get Url Play Back", "platform play back get URL failed!");
        return iRet;
    }

    iRet = ParseIPAddr(m_stMediaRsp.szURL,m_strMuIpAddr);
    if (IVS_SUCCEED != iRet)
    {
        BP_RUN_LOG_ERR(iRet,"Do Get Url RealPlay", "parse IP Addr failed from url: %s",
                       m_stMediaRsp.szURL);
        return iRet;
    }

    //解析URL,得到ServiceType,如果是组播实况(直连),那么协议类型转为udp
    std::string strServiceType;
    iRet = ParseURL(m_stMediaRsp.szURL, URL_SERVICE_TYPE_FLAG, strServiceType);
    if (IVS_SUCCEED != iRet)
    {
        BP_RUN_LOG_ERR(iRet,"Do Get Url Play Back", "parse service type from url failed, URL=%s",
                       m_stMediaRsp.szURL);
        return iRet;
    }
    int iServiceType = CToolsHelp::StrToInt(strServiceType);

    std::string strMediaTransMode;
    iRet = ParseURL(m_stMediaRsp.szURL, URL_MEDIA_TRANS_MODE, strMediaTransMode);
    if (IVS_SUCCEED != iRet)
    {
        BP_RUN_LOG_ERR(iRet,"Do Get Url Play Back", "parse media trans mode failed from url");
        return iRet;
    }
    int iMediaTransMode = CToolsHelp::StrToInt(strMediaTransMode);

    std::string strBroadcastType;
    iRet = ParseURL(m_stMediaRsp.szURL, URL_BROADCAST_TYPE, strBroadcastType);
    if (IVS_SUCCEED != iRet)
    {
        BP_RUN_LOG_ERR(iRet,"Do Get Url Play Back", "parse broadcast type failed from url");
        return iRet;
    }
    int iBroadcastType = CToolsHelp::StrToInt(strBroadcastType);

    std::string strTimeSpan;
    iRet = ParseURL(m_stMediaRsp.szURL, URL_TIME_SPAN, strTimeSpan);
    if (IVS_SUCCEED != iRet || strTimeSpan.empty())
    {
        BP_RUN_LOG_ERR(iRet,"Do Get Url Play Back", "parse timespan failed from url");
        return iRet;
    }

    unsigned int uiPos = strTimeSpan.find("-");
    if (std::string::npos == uiPos || uiPos >= strTimeSpan.length())
    {
        BP_RUN_LOG_ERR(iRet,"Do Get Url Play Back", "parse timespan failed from url,find spliter failed.");
        return iRet;
    }
    std::string strStartTime = strTimeSpan.substr(0, uiPos);
    if (std::string::npos == (uiPos+1) || (uiPos+1) >= strTimeSpan.length())
    {
        BP_RUN_LOG_ERR(iRet,"Do Get Url Play Back", "parse timespan failed from url,find spliter failed.");
        return iRet;
    }
    strEndTime = strTimeSpan.substr(uiPos+1, strlen(IVS_DATE_TIME_NET_FORMAT));

    m_stTimeSpanInter.iStartTime = (IVS_INT32)UTCStr2Time(strStartTime.c_str(), IVS_DATE_TIME_NET_FORMAT);
    m_stTimeSpanInter.iEndTime = (IVS_INT32)UTCStr2Time(strEndTime.c_str(), IVS_DATE_TIME_NET_FORMAT);

    BP_RUN_LOG_INF("Do Get Url Play Back", "strStartTime=%s strEndTime=%s iStartTime=%d iEndTime=%d.", strStartTime.c_str(), strEndTime.c_str(), m_stTimeSpanInter.iStartTime, m_stTimeSpanInter.iEndTime);

    m_enServiceType = (IVS_SERVICE_TYPE)iServiceType;
    m_stuMediaParam.TransMode = (IVS_MEDIA_TRANS_MODE)iMediaTransMode;
    m_stuMediaParam.BroadCastType = (IVS_BROADCAST_TYPE)iBroadcastType;


    // 直连组播实况,需要将协议类型转换为UDP;
    if (SERVICE_TYPE_REALVIDEO == m_enServiceType
            && MEDIA_DIRECT == m_stuMediaParam.TransMode
            && BROADCAST_MULTICAST == m_stuMediaParam.BroadCastType)
    {
        m_stuMediaParam.ProtocolType = PROTOCOL_RTP_OVER_UDP;
    }

    //// add for 流复用 [12/17/2012 z90003203] // TODO 疑问:这个流复用,服务器会给内容?
    //int iStreamType = 0;
    //iRet = ParseURL(m_stMediaRsp.szURL, URL_STREAM_TYPE, &iStreamType);
    //if (IVS_SUCCEED != iRet)
    //{
    //    BP_RUN_LOG_ERR(iRet,"GetUrlRealPlay", "parse stream type failed from url");
    //    return iRet;
    //}

    //m_stuMediaParam.StreamType = (IVS_STREAM_TYPE)iStreamType;

    //if (STREAM_TYPE_UNSPECIFIED == m_stuMediaParam.StreamType)
    //{
    //    m_stuMediaParam.StreamType = STREAM_TYPE_MAIN;
    //}
    //// end add

    return iRet;
}//lint !e529
//设置录像回放时间
int CPlayback::SetPlayBackTime(unsigned int uiTime)
{
    CLockGuard lock(m_pMediaMutex);

    // 支持拖动到开始时间,即0 == uiTime的情况合法;
    /*if (0 == uiTime)
    {
        BP_RUN_LOG_ERR(IVS_PARA_INVALID,
                        "SetPlayBackTime",
                        "Param invalid, setTime = 0");
        return IVS_PARA_INVALID;
    }*/

    IVS_PLAY_ResetData(m_ulPlayerChannel);

    if (!m_bLocalFile)
    {
        unsigned int uiTime2Set = (unsigned int)m_stTimeSpanInter.iStartTime + uiTime;
        if (uiTime2Set >= (unsigned int)m_stTimeSpanInter.iEndTime)
        {
            BP_RUN_LOG_ERR(IVS_PARA_INVALID,
                           "Set Play Back Time",
                           "Param invalid, uiTime is over end time, startTime = %d, end time = %d, set Time = %d",
                           m_stTimeSpanInter.iStartTime,
                           m_stTimeSpanInter.iEndTime,
                           uiTime);
            return IVS_PARA_INVALID;
        }

        BP_RUN_LOG_INF("Set Play Back Time", "RTSP_CLIENT_SendPlayMsg begin, rtsphandle=%d, speed=%f, settime=%u.", m_iRtspHandle, m_fSpeed, uiTime);

        MEDIA_RANGE_S stRange;
        memset(&stRange, 0x0, sizeof(MEDIA_RANGE_S));
        stRange.enRangeType      = RANGE_TYPE_NPT;
        stRange.MediaBeginOffset = uiTime;
        float fSendScale = 0.0;
        (void)CToolsHelp::GetSendScale(m_enServiceType, m_fSpeed, fSendScale);
        int iRet = RTSP_CLIENT_SendPlayMsg(m_iRtspHandle, m_stMediaRsp.szURL,
                                           (double)fSendScale, &stRange, RTSP_CLIENT_TIMEOUT);

        BP_RUN_LOG_INF("Set Play Back Time", "RTSP_CLIENT_SendPlayMsg end, iRet=%d.", iRet);

        if (0 != iRet)
        {
            BP_RUN_LOG_ERR(IVS_PLAYER_RET_RTSP_SEND_PLAY_FAIL,"Set Play Back Time", "RTSP_CLIENT_SendPlayMsg failed.");
            return IVS_PLAYER_RET_RTSP_SEND_PLAY_FAIL;
        }
    }


    IVS_PLAY_SetPlayTime(m_ulPlayerChannel, m_tmStart + uiTime);

    /*
     * DTS2013091303280
     * 暂停或单帧状态下设置播放时间,
     * 等待画面跳转到最新的时间点
     */
    if (m_bPaused || m_bStepPlay)
    {
        (void)IVS_PLAY_ResumePlay(m_ulPlayerChannel);

        unsigned long long t1 = (unsigned long long)((m_tmStart + uiTime) * 1000);
        unsigned long long t2 = t1;
        (void)IVS_PLAY_GetCurrentFrameTick(m_ulPlayerChannel, &t2);

        int loop = 100;
        while (t2 == t1 && --loop >= 0)
        {
            VOS_Sleep(20);
            (void)IVS_PLAY_GetCurrentFrameTick(m_ulPlayerChannel, &t2);
        }

        if (m_bPaused)
        {
            (void)RTSP_CLIENT_SendPauseMsg(m_iRtspHandle, m_stMediaRsp.szURL, RTSP_CLIENT_TIMEOUT);
        }
        (void)IVS_PLAY_PausePlay(m_ulPlayerChannel);
    }

    m_uiDragPlayTime = uiTime;
    return IVS_SUCCEED;
}
// 查询设备组列表
IVS_INT32 CDeviceGroupMgr::GetDeviceGroup(const IVS_CHAR* pDomainCode,
                                          const IVS_CHAR* pDevGroupCode,
                                          IVS_DEVICE_GROUP_LIST* pDeviceGroupList,
                                          IVS_UINT32 uiBufferSize)
{
    CHECK_POINTER(m_pUserMgr, IVS_OPERATE_MEMORY_ERROR);
    CHECK_POINTER(pDeviceGroupList, IVS_OPERATE_MEMORY_ERROR);
	IVS_DEBUG_TRACE("");

    // 校验内存
	IVS_INT32 iRet = IVS_FAIL;
	IVS_UINT32 uiSize = 0;
	for (IVS_INT32 i = 0; i != 2; i++)//0是本域,1是外部域
	{
		CXml xmlReq;
		(IVS_VOID)CDeviceMgrXMLProcess::GetDeviceGroupXML(i, pDomainCode, pDevGroupCode, xmlReq);

            IVS_UINT32 xmlLen = 0;
	    const IVS_CHAR* pReq = xmlReq.GetXMLStream(xmlLen);
	    CHECK_POINTER(pReq, IVS_OPERATE_MEMORY_ERROR);
           BP_RUN_LOG_INF("Get CommSendMgr", "send XML = %s", pReq);

	     // 构造带域的请求消息,并发送
	    CSendNssMsgInfo sendNssMsgInfo;
	    sendNssMsgInfo.SetNeedXml(TYPE_NSS_XML);
	    sendNssMsgInfo.SetNetElemType(NET_ELE_SMU_NSS);
	    sendNssMsgInfo.SetReqID(NSS_GET_DEV_GROUP_LIST_REQ);
	    sendNssMsgInfo.SetReqData(pReq);	
	    sendNssMsgInfo.SetDomainCode(pDomainCode);
	    std::string strpRsp;
	    IVS_INT32 iNeedRedirect = IVS_FAIL;
	    iRet = m_pUserMgr->SendCmd(sendNssMsgInfo,strpRsp,iNeedRedirect);
           if (IVS_SUCCEED != iRet && 0 == i)
           {
                BP_RUN_LOG_ERR(iRet, "Get DeviceGroup fail", "SendCmd fail");
                return iRet;
           }           

           CXml xmlRsp;
           if (iRet == IVS_SUCCEED)
           {
                iRet = IVS_XML_INVALID;
                if (xmlRsp.Parse(strpRsp.c_str()))
                {
                    iRet = IVS_SUCCEED;
                }
           }

           if (IVS_SUCCEED != iRet && 0 == i)
           {
                return iRet;
           }
           
           IVS_INT32 iReTurn = iRet;
	    iRet = IVS_SUCCEED;
	    if (IVS_SUCCEED == iReTurn)
           {                   
                iRet = CDeviceMgrXMLProcess::GetDeviceGroupParseXML(uiSize, pDeviceGroupList, uiBufferSize, xmlRsp); 
           }
	}
	pDeviceGroupList->uiTotal = uiSize;

    return iRet;
}
// 查询摄像机计划设置信息
IVS_INT32 CRecordPlanMgr::GetCameraPlanInfo(IVS_UINT32 uiPlanType, IVS_CHAR** pRspXml)
{
    CHECK_POINTER(m_UserMgr, IVS_OPERATE_MEMORY_ERROR);
    IVS_DEBUG_TRACE("");

    IVS_INT32 iRet = IVS_FAIL;
    std::vector<std::string> domainCodeList;
    domainCodeList.clear();
    iRet = m_UserMgr->GetDeviceMgr().GetDomainListByUserID(domainCodeList);
    if(IVS_SUCCEED != iRet)
    {
        BP_RUN_LOG_ERR(iRet, "Get Domain List By User ID","Failed");
        return iRet;
    }

    CmdMap cmdMap;

    std::map<std::string, std::string> domainCodeMap;
    std::map<std::string, std::string>::iterator domainCodeMapIter;
    IVS_UINT32 iSize = domainCodeList.size();
    for(IVS_UINT32 i = 0; i < iSize; i++)
    {
        std::string strDomainCode = domainCodeList.at(i);

        CXml xmlReq;
        CRecordXMLProcess::GetCameraPlanInfoGetXML(uiPlanType, strDomainCode.c_str(), xmlReq);
        IVS_UINT32 xmlLen = 0;
        const IVS_CHAR* pReq = xmlReq.GetXMLStream(xmlLen);
        CHECK_POINTER(pReq, IVS_OPERATE_MEMORY_ERROR);

        // 构造带域的请求消息,并发送
        CSendNssMsgInfo sendNssMsgInfo;
        sendNssMsgInfo.SetNeedXml(TYPE_NSS_XML);
        sendNssMsgInfo.SetNetElemType(NET_ELE_SMU_NSS);
        sendNssMsgInfo.SetReqID(NSS_GET_CAMERA_PLAN_INFO_REQ);
        sendNssMsgInfo.SetReqData(pReq);
        sendNssMsgInfo.SetDomainCode(strDomainCode);

        CCmd *pCmd = m_UserMgr->BuildCmd(sendNssMsgInfo);
		if (NULL == pCmd)
		{
			BP_RUN_LOG_INF("build cmd error","cmd req id=%d, domain code=%s",NSS_GET_CAMERA_PLAN_INFO_REQ,strDomainCode.c_str());
			continue;
		}
        (void)domainCodeMap.insert(std::make_pair(pCmd->GetTransID(), strDomainCode));
        (void)cmdMap.insert(std::make_pair(pCmd->GetTransID(), pCmd));
    }

    if (cmdMap.empty())
    {
        return IVS_SUCCEED;
    }
    IVS_UINT32 uiTimeout = CSDKConfig::instance().GetTimeOutValue();
    iRet = CDispatcher::instance().dispatcherSyncMsgOutBatch(cmdMap, uiTimeout);
    if(IVS_SUCCEED != iRet)
    {
        BP_RUN_LOG_ERR(iRet, "Get Camera Plan Info fail","SendCmd to SMU Return Failed");
        return iRet;
    }

    std::map<std::string, PLAN_INFO_VEC> m_PlanMap;
    CmdMapIterator cmdMapIter;
    std::string strDomainCode;
    CCmd *pCmdRsp = NULL;
    for (cmdMapIter = cmdMap.begin(); cmdMapIter != cmdMap.end(); cmdMapIter++)
    {
        domainCodeMapIter = domainCodeMap.find(cmdMapIter->first);
        if (domainCodeMapIter != domainCodeMap.end())
        {
            strDomainCode = domainCodeMapIter->second;
        }
        if(strDomainCode.empty())
        {
            continue;
        }

        pCmdRsp = static_cast<CCmd *>(cmdMapIter->second);//lint !e63
        IVS_CHAR* pRsp = CNSSOperator::instance().ParseCmd2XML(pCmdRsp, iRet);

        if (NULL == pRsp)
        {
            continue;
        }
        CXml xmlRsp;
        if(!xmlRsp.Parse(pRsp))        
        {
            BP_RUN_LOG_ERR(IVS_XML_INVALID, "Get Camera Plan Info", "xml parsing error");
            continue;
        }
        PLAN_INFO_VEC m_PlanList;
        m_PlanList.clear();
        iRet = CRecordXMLProcess::GetCameraPlanInfoParseXML(xmlRsp, m_PlanList);
        if(IVS_SUCCEED != iRet)
        {
            BP_RUN_LOG_ERR(iRet, "Get Camera PlanInfo ParseXML", "xml parsing error");
            continue;
        }
        (void)m_PlanMap.insert(std::make_pair(strDomainCode, m_PlanList));
    }
    CXml rspXml;
    CRecordXMLProcess::GetCameraPlanInfoGetXml(m_PlanMap, rspXml);
    IVS_UINT32 iLen = 0;

    const IVS_CHAR* pRsq = rspXml.GetXMLStream(iLen);
    IVS_DELETE(*pRspXml, MUILI);
    CHECK_POINTER(pRsq, IVS_OPERATE_MEMORY_ERROR);
    IVS_CHAR* pResult = IVS_NEW(pResult, strlen(pRsq) + 1);
    memset(pResult, 0x0, strlen(pRsq) + 1);
    if (!CToolsHelp::Memcpy(pResult, strlen(pRsq) + 1, pRsq, strlen(pRsq) + 1))
    {
        BP_RUN_LOG_ERR(IVS_ALLOC_MEMORY_ERROR, "CToolsHelp::Memcpy pRsq to pResult failed", "NA");
        return IVS_ALLOC_MEMORY_ERROR;
    }
    *pRspXml = pResult;

    return iRet;
}
//添加平台录像计划;
IVS_INT32 CRecordPlanMgr::AddRecordPlan(IVS_UINT32 uiDeviceNum,const IVS_DEVICE_CODE* pDeviceList,
	const IVS_RECORD_PLAN* pRecordPlan,IVS_RESULT_LIST* pResultList,IVS_UINT32 uiResultBufferSize)const
{
	CHECK_POINTER(pDeviceList, IVS_PARA_INVALID);
	CHECK_POINTER(pRecordPlan, IVS_PARA_INVALID);
	CHECK_POINTER(pResultList, IVS_PARA_INVALID);
	CHECK_POINTER(m_UserMgr, IVS_OPERATE_MEMORY_ERROR);
	IVS_DEBUG_TRACE("");

	IVS_UINT32 uiReqBufSize = sizeof(IVS_RESULT_LIST) + (uiDeviceNum-1)*sizeof(IVS_RESULT_INFO);
	if (uiReqBufSize > uiResultBufferSize)
	{
		BP_RUN_LOG_ERR(IVS_PARA_INVALID, "Add Record Plan", "Invalid DeviceNum or BufferSize");
		return IVS_PARA_INVALID;
	}

	if ((RECORD_PLAN_ALLDAY < pRecordPlan->uiRecordPlanType) ||
		(PLAN_WEEK == pRecordPlan->uiRecordPlanType && 7 < pRecordPlan->uiPlanInfoNum) ||
		(PLAN_DAY == pRecordPlan->uiRecordPlanType && 1 != pRecordPlan->uiPlanInfoNum) ||
		(PLAN_ALLDAY == pRecordPlan->uiRecordPlanType && 0 != pRecordPlan->uiPlanInfoNum))
	{
		pResultList->uiNum = uiDeviceNum;
		for (IVS_UINT32 i=0; i<pResultList->uiNum; i++)
		{
			pResultList->stInfo[i].uiSequence = i;
			pResultList->stInfo[i].iResult = IVS_PARA_INVALID;
			strncpy(pResultList->stInfo[i].cCode, pDeviceList[i].cDevCode, IVS_DEV_CODE_LEN);
		}
		BP_RUN_LOG_ERR(IVS_PARA_INVALID, "Add Record Plan", "Invalid PlanType or PlanInfoNum");
		return IVS_PARA_INVALID;
	}

	DeviceCodeMap deviceCodeMap;
	std::string strSendDomainCode;
	CmdMap cmdMap;
	CCmd *pCmd = NULL;
	IVS_INT32 iRet = m_UserMgr->RecollectCameraDomainCodes2Map(uiDeviceNum,pDeviceList,deviceCodeMap);

	DeviceCodeMapIterator deviceCodeMapIter = deviceCodeMap.begin();
	DeviceCodeMapIterator deviceCodeMapIterEnd = deviceCodeMap.end();
	for (; deviceCodeMapIter != deviceCodeMapIterEnd; deviceCodeMapIter++)
	{
		DeviceCodeList devList = static_cast<DeviceCodeList>(deviceCodeMapIter->second); //lint !e612 !e69
		strSendDomainCode = deviceCodeMapIter->first;//lint !e612

		//数据结构拼装XML并转换为const IVS_CHAR *
		CXml addRecordPlanXmlReq;
		iRet = CRecordXMLProcess::AddOrModRecordPlanGetXML(strSendDomainCode,devList, pRecordPlan, addRecordPlanXmlReq);
		if (IVS_SUCCEED != iRet)
		{
			pResultList->uiNum = uiDeviceNum;
			for (IVS_UINT32 i=0; i<pResultList->uiNum; i++)
			{
				pResultList->stInfo[i].uiSequence = i;
				pResultList->stInfo[i].iResult = iRet;
				strncpy(pResultList->stInfo[i].cCode, pDeviceList[i].cDevCode, IVS_DEV_CODE_LEN);
			}
			BP_RUN_LOG_ERR(iRet, "Add Record Plan", "Add Or Mod Record Plan Get XML failed");
			return iRet;
		}
		unsigned int xmlLen = 0;
		const IVS_CHAR* pReqPlan = addRecordPlanXmlReq.GetXMLStream(xmlLen);
		CHECK_POINTER(pReqPlan, IVS_OPERATE_MEMORY_ERROR);
		BP_DBG_LOG("ReqPlan:%s\n", pReqPlan);

		//构建发送nss协议
		CSendNssMsgInfo sendNssMsgInfo;	
		sendNssMsgInfo.SetNeedXml(TYPE_NSS_XML);
		sendNssMsgInfo.SetNetElemType(NET_ELE_SMU_NSS);
		sendNssMsgInfo.SetReqID(NSS_MOD_RECORD_PLAN_REQ);
		sendNssMsgInfo.SetReqData(pReqPlan); 
		sendNssMsgInfo.SetDomainCode(strSendDomainCode.c_str());
		pCmd = m_UserMgr->BuildCmd(sendNssMsgInfo);
		if (NULL == pCmd)
		{
			BP_RUN_LOG_INF("build cmd error","cmd req id=%d, domain code=%s",NSS_MOD_RECORD_PLAN_REQ,strSendDomainCode.c_str());
			continue;
		}
		(void)cmdMap.insert(std::make_pair(pCmd->GetTransID(), pCmd));
	}
	if (cmdMap.empty())
	{
		return IVS_SUCCEED;
	}

	IVS_UINT32 uiTimeOut =  CSDKConfig::instance().GetTimeOutValue();
	std::string strpRsp;
	iRet = CDispatcher::instance().dispatcherSyncMsgOutBatch(cmdMap, uiTimeOut);

	//IVS_UINT32 iSize = deviceCodeMap.size();	
	IVS_INT32 iEachRet = 0;
	IVS_UINT32 iFailCount = 0;
	IVS_UINT32 uiRecordNum = 0;
	CmdMapIterator cmdMapIter = cmdMap.begin();
	for (; cmdMapIter != cmdMap.end(); cmdMapIter++)
	{
		CCmd *pCmdRsp = cmdMapIter->second; //lint !e612
		if(NULL != pCmdRsp)
		{
			IVS_CHAR* pRsp = CNSSOperator::instance().ParseCmd2XML(pCmdRsp,iEachRet);
			if (IVS_SUCCEED != iEachRet)
			{
				iFailCount++;
				iRet = iEachRet;
				BP_RUN_LOG_ERR(iEachRet, "Add Record Plan", "Parse Cmd 2XML failed,rspCode = %d", iEachRet);

				// 解析响应的xml
				CXml xmlRsp;
				if (NULL != pRsp && xmlRsp.Parse(pRsp))
				{
					iEachRet = CRecordXMLProcess::RecordPlanParseRSP(uiDeviceNum,pDeviceList,pResultList,uiResultBufferSize,xmlRsp,uiRecordNum);
				}
			}
		}
	}


	if(iFailCount >0)
	{
		//iRet = IVS_FAIL;
		BP_RUN_LOG_ERR(iRet, "Add Platform Record Plan", "Add Platform Record Plan in some Domains failed.");
		return iRet;
	}

	BP_RUN_LOG_INF("Add Platform Record Plan", "ok", "msg have Parsed");
	return IVS_SUCCEED;
}//lint !e529 
 //删除平台录像计划;
IVS_INT32 CRecordPlanMgr::DeleteRecordPlan(IVS_UINT32 uiDeviceNum,const IVS_DEVICE_CODE* pDeviceList,
	IVS_UINT32 uiRecordMethod,IVS_RESULT_LIST* pResultList,IVS_UINT32 uiResultBufferSize)const
 {
	 CHECK_POINTER(pDeviceList, IVS_PARA_INVALID);
	 CHECK_POINTER(pResultList, IVS_PARA_INVALID);
	 CHECK_POINTER(m_UserMgr, IVS_OPERATE_MEMORY_ERROR);
	 IVS_DEBUG_TRACE("");
 	
	DeviceCodeMap deviceCodeMap;
	std::string strSendDomainCode;
	CCmd *pCmd = NULL;
	CmdMap cmdMap;
	IVS_INT32 iRet = m_UserMgr->RecollectCameraDomainCodes2Map(uiDeviceNum,pDeviceList,deviceCodeMap);

	DeviceCodeMapIterator deviceCodeMapIter = deviceCodeMap.begin();
	DeviceCodeMapIterator deviceCodeMapIterEnd = deviceCodeMap.end();
	for (; deviceCodeMapIter != deviceCodeMapIterEnd; deviceCodeMapIter++)
	{
		DeviceCodeList devList = static_cast<DeviceCodeList>(deviceCodeMapIter->second); //lint !e612 !e69
		strSendDomainCode = deviceCodeMapIter->first;//lint !e612

		//数据结构拼装XML并转换为const IVS_CHAR *
		CXml delRecordPlanXmlReq;
		iRet = CRecordXMLProcess::DelRecordPlanGetXML(strSendDomainCode,devList, uiRecordMethod, delRecordPlanXmlReq);
		unsigned int xmlLen = 0;
		const IVS_CHAR* pReqPlan = delRecordPlanXmlReq.GetXMLStream(xmlLen);
		CHECK_POINTER(pReqPlan, IVS_OPERATE_MEMORY_ERROR);

		//构建发送nss协议
		CSendNssMsgInfo sendNssMsgInfo;	
		sendNssMsgInfo.SetNeedXml(TYPE_NSS_XML);
		sendNssMsgInfo.SetNetElemType(NET_ELE_SMU_NSS);
		sendNssMsgInfo.SetReqID(NSS_DEL_RECORD_PLAN_REQ);
		sendNssMsgInfo.SetReqData(pReqPlan); 
		sendNssMsgInfo.SetDomainCode(strSendDomainCode.c_str());
		pCmd = m_UserMgr->BuildCmd(sendNssMsgInfo);
		if (NULL == pCmd)
		{
			BP_RUN_LOG_INF("build cmd error","cmd req id=%d, domain code=%s",NSS_DEL_RECORD_PLAN_REQ,strSendDomainCode.c_str());
			continue;
		}
		(void)cmdMap.insert(std::make_pair(pCmd->GetTransID(), pCmd));
	}
	if (cmdMap.empty())
	{
		return IVS_SUCCEED;
	}

	std::string strpRsp;
	IVS_UINT32 uiTimeOut =  CSDKConfig::instance().GetTimeOutValue();
	iRet = CDispatcher::instance().dispatcherSyncMsgOutBatch(cmdMap, uiTimeOut);

	//IVS_UINT32 iSize = deviceCodeMap.size();	
	IVS_INT32 iEachRet = 0;
	IVS_UINT32 iFailCount = 0;
	IVS_UINT32 uiRecordNum = 0;
	CmdMapIterator cmdMapIter;
	for (cmdMapIter = cmdMap.begin(); cmdMapIter != cmdMap.end(); cmdMapIter++)
	{
		CCmd *pCmdRsp = cmdMapIter->second; //lint !e612
		if(NULL != pCmdRsp)
		{
			IVS_CHAR* pRsp = CNSSOperator::instance().ParseCmd2XML(pCmdRsp,iEachRet);
			if (IVS_SUCCEED != iEachRet)
			{
				iFailCount++;
				iRet = iEachRet;
				BP_RUN_LOG_ERR(iEachRet, "Delete Record Plan", "Parse Cmd 2XML failed,rspCode = %d", iEachRet);

				// 解析响应的xml
				CXml xmlRsp;
				if (NULL != pRsp && xmlRsp.Parse(pRsp))
				{
					iEachRet = CRecordXMLProcess::RecordPlanParseRSP(uiDeviceNum,pDeviceList,pResultList,uiResultBufferSize,xmlRsp,uiRecordNum);
				}
			}
		}
	}

	if(iFailCount >0)
	{
		//iRet = IVS_FAIL;
		BP_RUN_LOG_ERR(iRet, "Delete Platform Record Plan", "Delete Platform Record Plan in some Domains failed.");
		return iRet;
	}

	BP_RUN_LOG_INF("Delete Record Plan", "ok", "msg have Parsed");
 	return IVS_SUCCEED;
 }//lint !e529
int CSDKMainctrl::OnDevAlarmNotify(CCmd* pCmd)const
{
	BP_RUN_LOG_INF("OnDevAlarmNotify", "Begin");
	CHECK_POINTER(pCmd, IVS_OPERATE_MEMORY_ERROR);
	IVS_CHAR* pData = IVS_NEW(pData, sizeof(IVS_DEVICE_ALARM_NOTIFY));
    CHECK_POINTER(pData, IVS_OPERATE_MEMORY_ERROR);
	memset(pData, 0x0, sizeof(IVS_DEVICE_ALARM_NOTIFY));
	IVS_DEVICE_ALARM_NOTIFY* pDevAlarmNotify = reinterpret_cast<IVS_DEVICE_ALARM_NOTIFY*>(pData); //lint !e826
//     if (NULL == pDevAlarmNotify)
//     {
//         BP_RUN_LOG_ERR(IVS_SDK_RET_INTRINSIC_PTR_ERROR, "pDevAlarmNotify is null", "NA");
//         IVS_DELETE(pData, MUILI);
//         return IVS_SDK_RET_INTRINSIC_PTR_ERROR;
//     }
	IVS_INT32 iRet = CSDKMainService::ProcessDevAlarmNotify(pCmd, pDevAlarmNotify);
	
	// NSS头
	TNssMsgHeader m_header;
	memset(&m_header, 0, sizeof(TNssMsgHeader));
	m_header.usiProtocolVersion = 0x0100;
	m_header.usiMsgType = NSS_OMU_ALARM_CU_REPORT_RSP;
	m_header.uiSeqID = 0; 
	m_header.uiTraceID = 0;
	if (!CToolsHelp::Strncpy(m_header.szTransactionNo, TRANSACTIONNO_LEN, pCmd->GetTransID().c_str(), strlen(pCmd->GetTransID().c_str())))
	{
		BP_RUN_LOG_ERR(IVS_ALLOC_MEMORY_ERROR, "CToolsHelp::Strncpy(m_header.szTransactionNo, TRANSACTIONNO_LEN, pCmd->GetTransID().c_str(), 64)", "NA");
		IVS_DELETE(pData, MUILI);
		return IVS_ALLOC_MEMORY_ERROR;
	}
	m_header.uiRspCode = static_cast<IVS_UINT32>(iRet);  
	m_header.uiPacketLength = sizeof(TNssMsgHeader);

	// 转换网络字节序
	m_header.usiProtocolVersion = ntohs(m_header.usiProtocolVersion);
	m_header.usiMsgType = ntohs(m_header.usiMsgType);
	m_header.uiSeqID = ntohl(m_header.uiSeqID);
	m_header.uiTraceID = ntohl(m_header.uiTraceID);
	m_header.uiRspCode = ntohl(m_header.uiRspCode);
	m_header.uiPacketLength = ntohl(m_header.uiPacketLength);

	// 定义ACE的消息缓冲,这个在cmd里面去释放,这里不释放
	ACE_Message_Block* pMsgBlock = new ACE_Message_Block(sizeof(TNssMsgHeader)); 

	pMsgBlock->copy((char*)&m_header, sizeof(TNssMsgHeader));
	CDispatcher::instance().dispatcherOutWithoutTransaction(pCmd->GetNetElemType(), pCmd->GetNetLinkID().c_str(), pCmd->GetTransID().c_str(), NSS_OMU_ALARM_CU_REPORT_RSP, pMsgBlock);
	if (IVS_SUCCEED == iRet)
	{
		int iSessionID = CLinkRouteMgr::instance().FindSessionIDByLinkID(pCmd->GetNetLinkID());  //lint !e1013 !e1055 !e746 !e64
		if (SDK_SESSIONID_INIT == iSessionID)
		{
			BP_RUN_LOG_ERR(IVS_FAIL, "session id invalid","NA");
			IVS_DELETE(pData, MUILI);
			return IVS_FAIL;
		}	

		// utf8->ansi
		char cAlarmDest[IVS_ALARM_DESCRIPTION_LEN + 1] = {0};
		(void)CToolsHelp::Memcpy(cAlarmDest, IVS_ALARM_DESCRIPTION_LEN, pDevAlarmNotify->cAlarmDest,IVS_ALARM_DESCRIPTION_LEN);
		char* pAlarmDest = CToolsHelp::UTF8ToANSI(cAlarmDest);
		if (NULL != pAlarmDest)
		{
			// 清理掉先
			memset(pDevAlarmNotify->cAlarmDest, 0, IVS_ALARM_DESCRIPTION_LEN);
			(void)CToolsHelp::Memcpy(pDevAlarmNotify->cAlarmDest, IVS_ALARM_DESCRIPTION_LEN, pAlarmDest,strlen(pAlarmDest));
			free(pAlarmDest);
			pAlarmDest = NULL;
		}

		char cAlarmInName[IVS_ALARM_NAME_LEN + 1] = {0};
		(void)CToolsHelp::Memcpy(cAlarmInName, IVS_ALARM_NAME_LEN, pDevAlarmNotify->cAlarmInName,IVS_ALARM_NAME_LEN);
		char* pAlarmInName = CToolsHelp::UTF8ToANSI(cAlarmInName);
		if (NULL != pAlarmInName)
		{
			// 清理掉先
			memset(pDevAlarmNotify->cAlarmInName, 0, IVS_ALARM_NAME_LEN);
			(void)CToolsHelp::Memcpy(pDevAlarmNotify->cAlarmInName, IVS_ALARM_NAME_LEN, pAlarmInName,strlen(pAlarmInName));
			free(pAlarmInName);
			pAlarmInName = NULL;
		}

		CEventCallBackJob::instance().PostEvent(iSessionID, IVS_EVENT_OMU_REPORT_ALARM, pDevAlarmNotify, sizeof(IVS_DEVICE_ALARM_NOTIFY));
	}
    IVS_DELETE(pData, MUILI);
	BP_RUN_LOG_INF("OnDevAlarmNotify", "End");
	return iRet;
}
//获取录像回放时间
int CPlayback::GetPlayBackTime(IVS_PLAYBACK_TIME& stPlayBackTime)
{
    CLockGuard lock(m_pMediaMutex);

    memset(&stPlayBackTime, 0, sizeof(stPlayBackTime));
    //unsigned int uiPlayTime = 0;

    unsigned long long uiPlayTime = 0;

    int iRet = IVS_PLAY_GetCurrentFrameTick(m_ulPlayerChannel, &uiPlayTime);
    if (IVS_SUCCEED != iRet)
    {
        BP_RUN_LOG_ERR(iRet,"Get Play Back Time", "Get play time failed");
        return iRet;
    }

    uiPlayTime = uiPlayTime/1000; // 转换为秒;
    if (m_bLocalFile)
    {
        memset(&stPlayBackTime, 0, sizeof(stPlayBackTime));
        snprintf(stPlayBackTime.cPlayBackTime, sizeof(stPlayBackTime.cPlayBackTime) - 1, "%u", uiPlayTime);
        return IVS_SUCCEED;
    }

    if (0 == uiPlayTime)
    {
        if (m_fSpeed > 0)
        {
            uiPlayTime = m_stTimeSpanInter.iStartTime;//lint !e732
        }
        else
        {
            uiPlayTime = m_stTimeSpanInter.iEndTime;//lint !e732
        }
    }

    std::string strCurPlayTime;
    UTCTime2Str((time_t)uiPlayTime, strCurPlayTime, IVS_DATE_TIME_FORMAT);
    std::string strStartTimeTmp;
    UTCTime2Str((time_t)m_stTimeSpanInter.iStartTime, strStartTimeTmp, IVS_DATE_TIME_FORMAT);
    BP_RUN_LOG_INF("Get Play Back Time ", "Start time = %s %d Current time = %s.", strStartTimeTmp.c_str(), m_stTimeSpanInter.iStartTime, strCurPlayTime.c_str());
    bool bRet = CToolsHelp::Strncpy(stPlayBackTime.cPlayBackTime,IVS_TIME_LEN, strCurPlayTime.c_str(), strCurPlayTime.length());
    if(false == bRet)
    {
        BP_RUN_LOG_ERR(IVS_ALLOC_MEMORY_ERROR,"Get Play Back Time", "Strncpy error.");
        return IVS_ALLOC_MEMORY_ERROR;
    }

    std::string strStartTime;
    UTCTime2Str((time_t)m_stTimeSpanInter.iStartTime, strStartTime, IVS_DATE_TIME_FORMAT);
    bRet = CToolsHelp::Strncpy(stPlayBackTime.cPlayBackStartTime,IVS_TIME_LEN+1, strStartTime.c_str(),strStartTime.length());
    if(false == bRet)
    {
        BP_RUN_LOG_ERR(IVS_ALLOC_MEMORY_ERROR,"Get Play Back Time", "Strncpy error.");
        return IVS_ALLOC_MEMORY_ERROR;
    }

    std::string strEndTime;
    UTCTime2Str((time_t)m_stTimeSpanInter.iEndTime, strEndTime, IVS_DATE_TIME_FORMAT);
    bRet = CToolsHelp::Strncpy(stPlayBackTime.cPlayBackEndTime,IVS_TIME_LEN, strEndTime.c_str(), strEndTime.length());
    if(false == bRet)
    {
        BP_RUN_LOG_ERR(IVS_ALLOC_MEMORY_ERROR,"Get Play Back Time", "Strncpy error.");
        return IVS_ALLOC_MEMORY_ERROR;
    }
    return iRet;
}