ソースを参照

Z991239-5381 #comment 优化销售录像实体跨平台实现方式

80274480 1 年間 前
コミット
6703fa5be9

+ 1 - 6
Module/mod_SalesRecorder/CMakeLists.txt

@@ -3,7 +3,7 @@ define_module("SalesRecorder")
 set(${MODULE_PREFIX}_SRCS
 	Event.h
 	mod_SalesRecorder.h
-	${CMAKE_CURRENT_SOURCE_DIR}/${MODULE_PLAFORM_SUBDIR}/mod_SalesRecorder.cpp
+	${CMAKE_CURRENT_SOURCE_DIR}/mod_SalesRecorder.cpp
 	${MODULE_BASE_DIR}/mod_recorder/recordinfo.h
 	${MODULE_BASE_DIR}/mod_recorder/recordinfo.cpp
 )
@@ -27,13 +27,8 @@ target_link_directories(${MODULE_NAME} PRIVATE
 	${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
 )
 
-
 # 添加实体需要依赖的其他共享库(包括系统库)
-if(WIN32)
-set(${MODULE_PREFIX}_LIBS  ${MODULE_BASE_LIBS} ${RVCCOMM_LIB} libvideorecord libfilecryption)
-else(WIN32)
 set(${MODULE_PREFIX}_LIBS  ${MODULE_BASE_LIBS} ${RVCCOMM_LIB} libvideorecord libfilecryption)
-endif(WIN32)
 
 target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS})
 

+ 304 - 77
Module/mod_SalesRecorder/unix/mod_SalesRecorder.cpp → Module/mod_SalesRecorder/mod_SalesRecorder.cpp

@@ -1,7 +1,7 @@
 #include "stdafx.h"
 #include "mod_SalesRecorder.h"
 #include "Event.h"
-#include "rvcmediacommon/rvc_media_common.h"
+#include "rvc_media_common.h"
 #include "fileutil.h"
 #include "array.h"
 #include <memutil.h>
@@ -24,10 +24,6 @@
 #include "EventCode.h"
 #include <string.h>
 
-#include "mod_interactivecontrol/InteractiveControl_client_g.h"
-#include "mod_interactivecontrol/InteractiveControl_def_g.h"
-#include "../mod_interactivecontrol/Event.h"
-
 
 #ifndef RVC_MIN_FILESIZE
 #define RVC_MIN_FILESIZE 10240
@@ -60,12 +56,14 @@ static BOOL CheckDiskStatus(const char *szRoot, int nPercent, int *pFreeRatio)
 	BOOL ret = GetDiskFreeSpaceEx(szRoot, &lpFreeBytesAvailableToCaller, &lpTotalNumberOfBytes, &lpTotalNumberOfFreeBytes);
 	if (ret == 0)
 	{
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("CheckDiskStatus.GetDiskFreeSpaceEx failed(%d).",GetLastError());
 		return FALSE;
 	}
 	DWORD dwTotal = lpTotalNumberOfBytes.QuadPart/1048576;
 	DWORD dwTotalFree = lpTotalNumberOfFreeBytes.QuadPart/1048576;
 	int ratio = dwTotalFree*100/dwTotal;
 	*pFreeRatio = ratio;
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("free disk %d MB, %d percent free.", dwTotalFree, ratio);
 	//if (ratio < (100-MAX_DISK_PERCENT))
 	if (ratio < (100-nPercent))
 	{
@@ -112,14 +110,61 @@ static CSimpleStringA VideoSerialID2TimeString(const char *videoserialid)
 
 static void CStringSplit(char* str, char** result, const char* del)
 {
-	char* ptr = NULL;
-	char* p = strtok_r(str, del, &ptr);
-	while (p != NULL){
+	char* pdata = NULL;
+	char* p = NULL;
+#ifdef RVC_OS_WIN
+	p = strtok_s(str, del, &pdata);
+#else
+	p = strtok_r(str, del, &pdata);
+#endif // RVC_OS_WIN
+
+	while (p != NULL) {
 		*result++ = p;
-		p = strtok_r(NULL, del, &ptr);
+#ifdef RVC_OS_WIN
+		p = strtok_s(NULL, del, &pdata);
+#else
+		p = strtok_r(NULL, del, &pdata);
+#endif
 	}
 }
 
+
+static bool rvcMoveFile(const char* strSrcFile, const char* strDstFile)
+{
+	bool bRet = false;
+	if (NULL == strSrcFile || NULL == strDstFile) {
+		return bRet;
+	}
+#ifdef RVC_OS_WIN
+	bRet = MoveFile(strSrcFile, strDstFile);
+#else
+	if (0 == rename(strSrcFile, strDstFile)) {
+		bRet = true;
+	}
+#endif // RVC_OS_WIN
+	return bRet;
+}
+
+
+static bool RvcDeleteFile(const char* strSrcFile)
+{
+	bool bRet = false;
+	if (NULL == strSrcFile) {
+		return bRet;
+	}
+
+#ifdef RVC_OS_WIN
+	bRet = DeleteFile(strSrcFile);
+#else
+	if (0 == remove(strSrcFile)) {
+		bRet = true;
+	}
+#endif // RVC_OS_WIN
+
+	return bRet;
+}
+
+
 #ifdef RVC_OS_WIN
 // 寻找某目录下与通配符匹配的文件
 static BOOL FindMatchedFile(LPCSTR sFindPath, LPCSTR sFindFileName, ULONGLONG& uCountFile)
@@ -244,11 +289,28 @@ static CSimpleStringA DecryptString(LPCTSTR lpszEncrpyted)
 }
 
 
-static unsigned long GetFileSize(const char* filename)
+static unsigned long GetFileSize(const char* pfilename)
 {
+#ifdef RVC_OS_WIN
+	unsigned long usize = 0;
+	if (NULL == pfilename) {
+		return usize;
+	}
+
+	FILE* pFile = fopen(pfilename, "rb");
+	if (pFile) {
+		fseek(pFile, 0, SEEK_END);
+		usize = ftell(pFile);
+		fclose(pFile);
+	}
+
+	return usize;
+#else
 	struct stat statbuf;
-	stat(filename, &statbuf);
+	stat(pfilename, &statbuf);
 	return statbuf.st_size;
+#endif
+
 }
 
 void SalesRecordServiceSession::Handle_GetOFLVideoRecords( SpReqAnsContext<SalesRecorderSerVice_GetOFLVideoRecords_Req, SalesRecorderSerVice_GetOFLVideoRecords_Ans>::Pointer ctx )
@@ -325,7 +387,11 @@ void SalesRecordServiceSession::Handle_DeleteVideo(SpReqAnsContext<SalesRecorder
 void SalesRecordServiceSession::Handle_AppendWatermark(SpReqAnsContext<SalesRecorderSerVice_AppendWatermark_Req, SalesRecorderSerVice_AppendWatermark_Ans>::Pointer ctx)
 {
 	DbgToBeidou(ctx->link, __FUNCTION__)();
+#ifdef RVC_OS_WIN
+	ErrorCodeEnum ErrorCode = m_pEntity->HandleVideoAppendWatermark(CSimpleStringW2A(ctx->Req.VideoName).GetData(), CSimpleStringW2A(ctx->Req.Watermark).GetData());
+#else
 	ErrorCodeEnum ErrorCode = m_pEntity->HandleVideoAppendWatermark(CSimpleStringW2A(ctx->Req.VideoName).GetData(), ctx->Req.Watermark.GetData());
+#endif
 	ctx->Answer(ErrorCode);
 }
 
@@ -357,6 +423,15 @@ ErrorCodeEnum CSalesRecorderEntity::__OnStart( ErrorCodeEnum preOperationError )
 	m_strAppVersion = NULL;
 	m_strTerminalId = NULL;
 	m_bPostOn = false;
+	m_bWholeSection = false;
+
+#ifdef RVC_OS_WIN
+	m_xIdlePre = m_xKernelPre = m_xUserPre = 0;
+
+	if (SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS)) {
+		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Set Process(%d) RealTime Priority Success.", GetCurrentProcessId());
+	}
+#endif // RVC_OS_WIN
 
 	m_eDeviceType = RvcGetDeviceType();
 
@@ -366,7 +441,6 @@ ErrorCodeEnum CSalesRecorderEntity::__OnStart( ErrorCodeEnum preOperationError )
 	int iAudioChannels = 1;
 	int iLogLevel = 1;
 	int iLowestLevel = 1;
-	int iRecordType = 0;
 	int iTimeOut = RVC_HTTPTIMEOUT;
 	CSimpleStringA strHttpServerAddr("");
 	int iPostOn = 0;
@@ -425,10 +499,6 @@ ErrorCodeEnum CSalesRecorderEntity::__OnStart( ErrorCodeEnum preOperationError )
 		m_bWholeSection = FALSE;
 	}
 
-	if (m_bApplyHighQuality != 0 && m_bApplyHighQuality != 1){
-		m_bApplyHighQuality = FALSE;
-	}
-
 	if (preOperationError != Error_Succeed) {
 		return preOperationError;
 	}
@@ -500,8 +570,9 @@ void CSalesRecorderEntity::OnStarted()
 		m_strAppVersion = si.InstallVersion.ToString();
 		m_strTerminalId = si.strTerminalID;
 	}
-
+#ifndef RVC_OS_WIN
 	InitSalesRecorder();
+#endif
 	LogEvent(Severity_Middle, LOG_EVT_MOD_SALESRECORDER_STARTED_SUCCESS, "sales recorder entity started successfully.");
 }
 
@@ -526,9 +597,9 @@ ErrorCodeEnum CSalesRecorderEntity::__OnClose( ErrorCodeEnum preOperationError )
 	GetFunction()->UnregistSysVarEvent(SYSVAR_CAMERASTATE);
 
 	StopRecord();
-
+#ifndef RVC_OS_WIN
 	ReleaseSalesRecorder();
-
+#endif
 	return Error_Succeed;
 }
 
@@ -598,12 +669,23 @@ int CSalesRecorderEntity::GetCameraState()
 
 void CSalesRecorderEntity::OnRecordFailed(eRvcRecordFailedCase eCase, const char* pszMessage, bool bRecordDevFault)
 {
-	if (eCase < eDefault && eCase >= 0) {
+#ifdef RVC_OS_WIN
+	double fCpuUsage = GetSystemCpuUsage();
+	if (fCpuUsage > 50.0){
+		LogWarn(Severity_Low, Error_Debug, LOG_EVT_UI_RECORDFAILED_FOR_HIGHCPU, "more than 50 percent.");
+	}
+#endif
+
+	if (eCase < eDefault && eCase >= 0){
 		LogEvent(Severity_Middle, LOG_EVT_UI_RECORDFAILED, record_failed_case_table[eCase]);
 	}
 
+	m_loglevel = RECORD_LOG_INFO;
+#ifdef RVC_OS_WIN
+	LogWarn(Severity_Middle, Error_Debug, LOG_EVT_SALESRECORD_FAILED, CSimpleStringA::Format("{%s} current memory usage is %d, and cpu usage is %f.", pszMessage ? pszMessage : " ", GetSystemMemoryUsage(), fCpuUsage).GetData());
+#else
 	LogWarn(Severity_Middle, Error_Debug, LOG_EVT_SALESRECORD_FAILED, CSimpleStringA::Format("%s", pszMessage ? pszMessage : " ").GetData());
-
+#endif
 	if (eBeginFailed == eCase) {
 		m_bNeedRestart = true;
 		RealSelfCheck();
@@ -618,7 +700,6 @@ void CSalesRecorderEntity::OnRecordEntityExcption()
 	LogWarn(Severity_Low, Error_Debug, LOG_EVT_RECORD_ENTITY_EXCEPTION, "sales record entity exception!");
 }
 
-
 void CSalesRecorderEntity::OnRecordFinished()
 {
 	LogEvent(Severity_High, LOG_EVT_SALESRECORD_FINISHED, "现场销售双录已完成.");
@@ -626,8 +707,6 @@ void CSalesRecorderEntity::OnRecordFinished()
 }
 
 
-
-
 void CSalesRecorderEntity::OnTimeout( DWORD dwTimerID )
 {
 
@@ -637,6 +716,7 @@ void CSalesRecorderEntity::OnSysVarEvent( const char *pszKey, const char *pszVal
 {
 	if (_stricmp(pszKey, SYSVAR_CAMERASTATE) == 0)
 	{
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("OnSysVarEvent Key = %s, Value = %s.", pszKey, pszValue);
 		m_iCameraState = pszValue[0]; 
 		if (pszValue[0] == 'E')
 		{
@@ -649,6 +729,7 @@ void CSalesRecorderEntity::OnSysVarEvent( const char *pszKey, const char *pszVal
 	}
 	else if (_stricmp(pszKey, SYSVAR_ACTIVETRACKINGCAMERA) == 0)
 	{
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("OnSysVarEvent Key = %s, Value = %s.", pszKey, pszValue);
 		if (m_iCameraState == 'N')
 		{
 			if (pszValue[0] == 'E')
@@ -678,13 +759,13 @@ void CSalesRecorderEntity::OnSysVarEvent( const char *pszKey, const char *pszVal
 	}
 }
 
-void CSalesRecorderEntity::OnLog( const CAutoArray<CUUID> &SubIDs, const CUUID nLogID,const LogTypeEnum eLogType, const SeverityLevelEnum eLevel, const DWORD dwSysError,const DWORD dwUserCode,const DWORD dwEntityInstanceID, const WORD wEntityDevelID, const CAutoArray<DWORD> &Param, const char *pszEntityName, const char *pszModuleName,const char *pszMessage, const linkContext& pLinkInfo)
+void CSalesRecorderEntity::OnLog( const CAutoArray<CUUID> &SubIDs, const CUUID nLogID,const LogTypeEnum eLogType, const SeverityLevelEnum eLevel, const DWORD dwSysError,const DWORD dwUserCode,const DWORD dwEntityInstanceID, const WORD wEntityDevelID, const CAutoArray<DWORD> &Param, const char *pszEntityName, const char *pszModuleName,const char *pszMessage, const linkContext &pLinkInfo)
 {
 	// 响应客户经理销售录像相关的事件
 	switch (dwUserCode)
 	{
 	case LOG_EVT_UI_RETURNMENU:
-		//HandleReturnMenu();
+		HandleReturnMenu();
 		break;
 
 	case LOG_EVT_SALESRECORD_ENTITY_EXCEPTION:
@@ -699,7 +780,7 @@ void CSalesRecorderEntity::OnLog( const CAutoArray<CUUID> &SubIDs, const CUUID n
 
 bool CSalesRecorderEntity::GetStandardQualityOnSiteSalesRecorder()
 {
-	bool bRet = FALSE;
+	bool bRet = false;
 
 	m_pRecorder = new Clibvideorecord(&bRet, this, REC_COMMON_AUDIO_SHM_QUEUE, REC_COMMON_VIDEO_ENV_SHM_SNAPSHOT_QUEUE,
 				REC_COMMON_VIDEO_OPT_SHM_SNAPSHOT_QUEUE, REC_COMMON_AUDIO_SALES_SHM_QUEUE, REC_COMMON_VIDEO_REMOTE_SHM_RTP_QUEUE, REC_COMMON_REMOTEAUDIO_SHM_QUEUE);
@@ -719,8 +800,18 @@ bool CSalesRecorderEntity::GetHighQualityOnSiteSalesRecorder()
 }
 
 
-void CSalesRecorderEntity::StartOnSiteSalesRecord(const int fps, const char* videofilename, int videoquality, int audioOutBitRate, SubtitleParam* subtitleParam, BOOL bWholeSection, BOOL bSessionManage, eRvcRecordType eRecordType)
+void CSalesRecorderEntity::StartOnSiteSalesRecord(const int fps, const char* videofilename, int videoquality, int audioOutBitRate, SubtitleParam* subtitleParam, bool bWholeSection, bool bSessionManage, eRvcRecordType eRecordType)
 {
+#ifdef RVC_OS_WIN
+	bool bRet = false;
+
+	bRet = GetStandardQualityOnSiteSalesRecorder();
+
+	if (false == bRet){
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("get onsite sales recorder failed.");
+		return;
+	}
+#endif
 	Rvc_RecordAudioParam_t tAudioParams;
 	tAudioParams.eRecordType = eRecordType;
 	tAudioParams.eOutPutType = m_eAudioOutQuality;
@@ -750,9 +841,9 @@ void CSalesRecorderEntity::StartOnSiteSalesRecord(const int fps, const char* vid
 	}
 }
 
-void CSalesRecorderEntity::StartRecord(const char * videofilename, int videoquality, int audioOutBitRate, SubtitleParam *subtitleParam /* = NULL */, BOOL bWholeSection /* = FALSE */, BOOL bSessionManage /* = FALSE */, eRvcRecordType eRecordType /* = eSingleSide */)
+void CSalesRecorderEntity::StartRecord(const char * pszVideoName, int videoquality, int audioOutBitRate, SubtitleParam *subtitleParam /* = NULL */, bool bWholeSection /* = false */, bool bSessionManage /* = false */, eRvcRecordType eRecordType /* = eSingleSide */)
 {
-	StartOnSiteSalesRecord(10, videofilename, videoquality, audioOutBitRate, subtitleParam, bWholeSection, bSessionManage, eRecordType);
+	StartOnSiteSalesRecord(10, pszVideoName, videoquality, audioOutBitRate, subtitleParam, bWholeSection, bSessionManage, eRecordType);
 }
 
 ErrorCodeEnum CSalesRecorderEntity::StopRecord()
@@ -760,8 +851,11 @@ ErrorCodeEnum CSalesRecorderEntity::StopRecord()
 	ErrorCodeEnum eCode = Error_Succeed;
 	if (m_bStarted) {
 		m_pRecorder->StopVideoRecord();
-
-		m_bStarted = FALSE;
+#ifdef RVC_OS_WIN
+		delete m_pRecorder; 
+		m_pRecorder = NULL;
+#endif
+		m_bStarted = false;
 	}
 	else{
 		eCode = Error_InvalidState;
@@ -771,8 +865,42 @@ ErrorCodeEnum CSalesRecorderEntity::StopRecord()
 }
 
 
+void CSalesRecorderEntity::DeleteAllVideo( const char * pszVideoName)
+{
+	if(!m_bStarted)
+	{
+		CSimpleStringA strPath;
+		ErrorCodeEnum Error = GetFunction()->GetPath("Temp", strPath);
+		if (Error == Error_Succeed) {
+			if (strPath.GetLength() > 0 && strPath[strPath.GetLength()-1] != SPLIT_SLASH) {
+				strPath += SPLIT_SLASH_STR;
+			}
+			ULONGLONG uVideoCount = 0;
+			CSimpleStringA strFindFileName = CSimpleStringA::Format("S_%s*.%s", pszVideoName, RECORD_MP4_SUFFIX);
+			BOOL bRet = FindMatchedFile((LPCSTR)strPath, (LPCSTR)strFindFileName, uVideoCount);
+			if(bRet)
+			{
+				strFindFileName = strFindFileName.SubString(0,strFindFileName.GetLength()-5);
+				//DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("succeed to get sales record count while delete video!");
+				CSimpleStringA fileName("");
+				bool bDeleteSucc = true;
+				for(int i = 0; i != uVideoCount; ++i)
+				{
+					fileName = CSimpleStringA::Format("%s%s_%d.%s", (LPCSTR)strPath, (LPCSTR)strFindFileName, i, RECORD_MP4_SUFFIX);
 
-
+					bRet = RvcDeleteFile(fileName.GetData());
+					if(!bRet) {
+						bDeleteSucc = false;
+						DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Error Code %lu while delete %s ", GetLastError(), (LPCSTR)fileName);
+					}
+				}
+				if (!bDeleteSucc) {
+					DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("failed to delete sales video!");
+				}
+			}
+		}			
+	}
+}
 
 
 ErrorCodeEnum CSalesRecorderEntity::DeleteVideo( const char *videofilename)
@@ -792,14 +920,19 @@ ErrorCodeEnum CSalesRecorderEntity::DeleteVideo( const char *videofilename)
 			if(bRet)
 			{
 				CSimpleStringA fileName;
-				BOOL bDeleteSucc = TRUE;
+				bool bDeleteSucc = true;
 				for(int i = 0; i != uVideoCount; ++i)
 				{
 					fileName = CSimpleStringA::Format("%s%s_%d.%s", (LPCSTR)strPath, videofilename, i, RECORD_MP4_SUFFIX);
 
-					if(remove(fileName.GetData())) {
-						bDeleteSucc = FALSE;
+					bRet = RvcDeleteFile(fileName.GetData());
+					if(!bRet) {
+						bDeleteSucc = false;
+					#ifdef RVC_OS_WIN
+						DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Error Code %lu while delete %s ", GetLastError(), (LPCSTR)fileName);
+					#else
 						DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Error Code %lu while delete %s ", errno, fileName.GetData());
+					#endif
 					}
 				}
 				if (!bDeleteSucc) {
@@ -835,8 +968,6 @@ Error_NotExist		not exist
 Error_NotImpl		方法执行失败
 */
 
-
-
 ErrorCodeEnum CSalesRecorderEntity::SaveVideo( const char * videofilename)
 {
 	ErrorCodeEnum ErrorCode = Error_Succeed;
@@ -851,7 +982,6 @@ ErrorCodeEnum CSalesRecorderEntity::SaveVideo( const char * videofilename)
 				sourPath += SPLIT_SLASH_STR;
 			}
 			ULONGLONG uVideoCount = 0;
-
 			CSimpleStringA strFindFileName = CSimpleStringA::Format("S_%s*.%s", videofilename, RECORD_MP4_SUFFIX);
 			BOOL bRet = FindMatchedFile((LPCSTR)sourPath, (LPCSTR)strFindFileName, uVideoCount);
 			if(bRet)
@@ -865,17 +995,25 @@ ErrorCodeEnum CSalesRecorderEntity::SaveVideo( const char * videofilename)
 						destPath += SPLIT_SLASH_STR;
 					}
 					CSimpleStringA sourFileName(""), destFileName("");
-					BOOL bMoveSucc = TRUE;
+					bool bMoveSucc = true;
 					for(int i = 0; i != uVideoCount; ++i)
 					{
 						sourFileName = CSimpleStringA::Format("%s%s_%d.%s", (LPCSTR)sourPath, (LPCSTR)strFindFileName, i, RECORD_MP4_SUFFIX);
 						destFileName = CSimpleStringA::Format("%s%s_%d.%s", (LPCSTR)destPath, (LPCSTR)strFindFileName, i, RECORD_MP4_SUFFIX);
 						unsigned long ufilesize = GetFileSize(sourFileName.GetData());
 						LogWarn(Severity_Low, Error_Debug, LOG_EVT_RECORD_FILESIZE, CSimpleStringA::Format("%s file size is %u byte.", sourFileName.GetData(), ufilesize).GetData());
-						if(rename(sourFileName.GetData(), destFileName.GetData())) {
-							bMoveSucc = FALSE;
+						bRet = rvcMoveFile(sourFileName.GetData(), destFileName.GetData());
+						if (!bRet) {
+							bMoveSucc = false;
 							ErrorCode = Error_NotImpl;
-							LogWarn(Severity_Middle, Error_Debug, LOG_EVT_RECORD_SAVED_FAILED, CSimpleStringA::Format("Error Code %lu while move %s.", errno, sourFileName.GetData()).GetData());
+#ifdef RVC_OS_WIN
+							LogWarn(Severity_Middle, Error_Debug, LOG_EVT_RECORD_SAVED_FAILED, CSimpleStringA::Format("Error Code %lu while move %s.", GetLastError(), sourFileName.GetData()).GetData());
+							if (183 == GetLastError()) {
+								ErrorCode = Error_InvalidState;
+							}
+#else
+							LogWarn(Severity_Middle, Error_Debug, LOG_EVT_RECORD_SAVED_FAILED, CSimpleStringA::Format("%s(%d) while move %s.", strerror(errno), errno, sourFileName.GetData()).GetData());
+#endif // RVC_OS_WIN
 						}
 						else {
 							CSimpleStringA strVideoName = CSimpleStringA::Format("%s_%d.%s", strFindFileName.GetData(), i, RECORD_MP4_SUFFIX);
@@ -921,19 +1059,6 @@ CSimpleStringA CSalesRecorderEntity::GetTerminalStage()
 }
 
 
-bool CSalesRecorderEntity::SecureClientConnect()
-{
-	SecureClientRelease();
-
-	return true;
-}
-
-void CSalesRecorderEntity::SecureClientRelease()
-{
-
-}
-
-
 ErrorCodeEnum CSalesRecorderEntity::HandleStartRecord(const char *pszMessage, const bool bRemoteRecord)
 {
 	ErrorCodeEnum Error = Error_Succeed;
@@ -944,7 +1069,22 @@ ErrorCodeEnum CSalesRecorderEntity::HandleStartRecord(const char *pszMessage, co
 
 	size_t ulen = strlen(pszMessage);
 	char *tmp = new char[ulen+1];
+#ifdef RVC_OS_WIN
+	strncpy_s(tmp, ulen+1, pszMessage, ulen);
+	
+	char *result[16] = {0};
+	//CStringSplit(tmp, result, "@");
+	// 解决中文stringsplit偶现乱码的问题 edit by ly@2018/07/04
+	auto arr1 = CSimpleStringA2W(tmp).Split('@');
+	auto arr2 = CAutoArray<CSimpleStringA>(arr1.GetCount());
+	for (int i = 0; i < arr1.GetCount(); ++i)
+	{
+		arr2[i] = CSimpleStringW2A(arr1[i]);
+		result[i] = const_cast<LPSTR>(arr2[i].GetData());
+	}
 
+	sprintf(m_SalesVideoName, "%s", result[4]);//录像名:录像类型标志_录像流水号(如S_C13213EF)
+#else
 	strncpy(tmp, pszMessage, ulen);
 	
 	char *result[32] = {0};
@@ -954,14 +1094,14 @@ ErrorCodeEnum CSalesRecorderEntity::HandleStartRecord(const char *pszMessage, co
 	if (result[4]) {
 		snprintf(m_SalesVideoName, MAX_PATH, "%s", result[4]);//录像名:录像类型标志_录像流水号(如S_C13213EF)
 	}
-	
+#endif	
 	RecordSubTitle subTitle;
 	ZeroMemory(&subTitle,sizeof(RecordSubTitle));
 
 	if (result[5]) {
 		CSimpleStringA strCardNo = DecryptString(result[5]);
 		if (sizeof(subTitle.CustCardNo) > strCardNo.GetLength()) {
-			strcpy_s(subTitle.CustCardNo, 24, strCardNo.GetData());
+			snprintf(subTitle.CustCardNo, sizeof(subTitle.CustCardNo), "%s", strCardNo.GetData());
 		}
 		else {
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Invalid CustCardNo.");
@@ -1035,16 +1175,26 @@ ErrorCodeEnum CSalesRecorderEntity::HandleStartRecord(const char *pszMessage, co
 	subtitleParam.bSubtitle = TRUE;
 	subtitleParam.bSubtitleSection = TRUE;
 	subtitleParam.topSubtitleData[0] = '\0';
-	if (strlen(subTitle.SapID)>0&&strlen(subTitle.CustManagerName)>0)
-	{
+#ifdef RVC_OS_WIN
+	if (strlen(subTitle.SapID)>0&&strlen(subTitle.CustManagerName)>0){
+		sprintf(subtitleParam.bottomSubtitleData1, "%s  %s  %s", subTitle.CustCardNo, subTitle.CustName, subTitle.ProductCode);
+		sprintf(subtitleParam.bottomSubtitleData2, "%s  %s  %s", subTitle.ProductName, subTitle.SapID, subTitle.CustManagerName);
+	}
+	else{
+		sprintf(subtitleParam.bottomSubtitleData1, "%s  %s", subTitle.CustCardNo, subTitle.CustName);
+		sprintf(subtitleParam.bottomSubtitleData2, "%s  %s", subTitle.ProductCode, subTitle.ProductName);
+	}
+#else
+	if (strlen(subTitle.SapID)>0&&strlen(subTitle.CustManagerName)>0){
 		swprintf(subtitleParam.bottomSubtitleData1, MAX_PATH, L"%s  %s  %s", subTitle.CustCardNo, subTitle.CustName, subTitle.ProductCode);
 		swprintf(subtitleParam.bottomSubtitleData2, MAX_PATH, L"%s  %s  %s", subTitle.ProductName, subTitle.SapID, subTitle.CustManagerName);
 	}
-	else
-	{
+	else{
 		swprintf(subtitleParam.bottomSubtitleData1, MAX_PATH, L"%s  %s", subTitle.CustCardNo, subTitle.CustName);
 		swprintf(subtitleParam.bottomSubtitleData2, MAX_PATH, L"%s  %s", subTitle.ProductCode, subTitle.ProductName);
 	}
+#endif
+
 
 	int i_audio_out_bitrate = m_audio_out_bitrate;
 
@@ -1058,7 +1208,7 @@ ErrorCodeEnum CSalesRecorderEntity::HandleStartRecord(const char *pszMessage, co
 		}
 	} 
 
-	StartRecord(m_SalesVideoName, 90, i_audio_out_bitrate, &subtitleParam, m_bWholeSection, FALSE, eRecordType);
+	StartRecord(m_SalesVideoName, 90, i_audio_out_bitrate, &subtitleParam, m_bWholeSection, false, eRecordType);
 
 	LogWarn(Severity_Low, Error_Debug, LOG_EVT_START_REMOTERECORD, CSimpleStringA::Format("start remote record %s.", m_SalesVideoName).GetData());
 
@@ -1110,15 +1260,41 @@ void CSalesRecorderEntity::HandleReturnMenu()
 		if (m_bStarted) // 如果正在进行客户经理录像
 		{
 			// 停止录像
+			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("stop record and return menu!");
 			StopRecord();
 		}
 
-		ZeroMemory(m_SalesVideoName, sizeof(m_SalesVideoName));
+		// 删除tmp中的视频
+		if (strlen(m_SalesVideoName) > 0)
+		{
+			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("delete sales record!");
+			DeleteAllVideo(m_SalesVideoName+2); 
+		}
+
+		ZeroMemory(m_SalesVideoName,sizeof(m_SalesVideoName));
 	}
 }
 
+#ifdef RVC_OS_WIN
+ErrorCodeEnum CSalesRecorderEntity::HandleVideoAppendWatermark(const char* pszVideoName, const char* pszWaterMark)
+{
+	ErrorCodeEnum Error = Error_Failed;
+	if (NULL == pszWaterMark) {
+		return Error_Param;
+	}
+
+	if (m_bStarted && (NULL != m_pRecorder)) {
+		if (m_pRecorder->SetRightVideoWaterMark(pszWaterMark)) {
+			Error = Error_Succeed;
+		}
+	}
+
+	return Error;
+}
 
+#else
 ErrorCodeEnum CSalesRecorderEntity::HandleVideoAppendWatermark(const char* pszVideoName, const wchar_t* pszWaterMark)
+
 {
 	ErrorCodeEnum Error = Error_Failed;
 	if (NULL == pszWaterMark){
@@ -1133,6 +1309,8 @@ ErrorCodeEnum CSalesRecorderEntity::HandleVideoAppendWatermark(const char* pszVi
 
 	return Error;
 }
+#endif
+
 
 ErrorCodeEnum CSalesRecorderEntity::HandleSalesRecordEntityException(const char* pszMessage)
 {
@@ -1153,19 +1331,13 @@ ErrorCodeEnum CSalesRecorderEntity::HandleSalesRecordEntityException(const char*
 	return Error_Succeed;
 }
 
-
+#ifdef RVC_OS_LINUX
 bool CSalesRecorderEntity::InitSalesRecorder()
 {
-	bool bRet = FALSE;
-	if (m_bApplyHighQuality)
-	{
-		bRet = GetHighQualityOnSiteSalesRecorder();
-	}
-	else
-	{
-		bRet = GetStandardQualityOnSiteSalesRecorder();
-	}
+	bool bRet = false;
 
+	bRet = GetStandardQualityOnSiteSalesRecorder();
+	
 	return bRet;
 }
 
@@ -1178,7 +1350,7 @@ bool CSalesRecorderEntity::ReleaseSalesRecorder()
 	}
 	return true;
 }
-
+#endif
 
 ErrorCodeEnum CSalesRecorderEntity::RealSelfCheck()
 {
@@ -1210,7 +1382,6 @@ ErrorCodeEnum CSalesRecorderEntity::RealSelfCheck()
 
 
 #ifdef RVC_OS_WIN
-
 bool IsMatchedVideo(WIN32_FIND_DATA fileData)
 {
 	bool bRet = false;
@@ -1250,7 +1421,7 @@ void CSalesRecorderEntity::UploadTempPathVideos()
 		WIN32_FIND_DATA FindFileData;
 		HANDLE hFind;
 		BOOL fFinished = FALSE;
-		sprintf_s(srcFilePath, MAX_PATH, "%s*.%s", sourPath, m_eRecordType == eMP4 ? RECORD_MP4_SUFFIX : RECORD_WMV_SUFFIX);
+		sprintf_s(srcFilePath, MAX_PATH, "%s*.%s", sourPath, RECORD_MP4_SUFFIX);
 
 		hFind = FindFirstFile(srcFilePath, &FindFileData);
 
@@ -1291,6 +1462,62 @@ void CSalesRecorderEntity::UploadTempPathVideos()
 	}	
 }
 
+
+int CSalesRecorderEntity::GetSystemMemoryUsage()
+{
+
+	// Use to convert bytes to KB
+#define DIV 1024
+
+	MEMORYSTATUSEX statex;
+
+	statex.dwLength = sizeof (statex);
+
+	GlobalMemoryStatusEx (&statex);
+
+	return statex.dwMemoryLoad;
+}
+
+
+double CSalesRecorderEntity::GetSystemCpuUsage()
+{
+	double ratio = 0;
+#define _WIN32_WINNT   0x0601
+	FILETIME idleTime,kernelTime,userTime;
+	BOOL ret = GetSystemTimes(&idleTime,&kernelTime,&userTime);
+	if (ret == 0)
+	{
+		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("GetSystemCPUStatus.GetSystemTimes failed(%d).",GetLastError());
+		return 80.0;
+	}
+	__int64  xIdle,xKernel,xUser;
+	xIdle = idleTime.dwHighDateTime;
+	xIdle <<= 32;
+	xIdle |= idleTime.dwLowDateTime;
+	xKernel = kernelTime.dwHighDateTime;
+	xKernel <<= 32;
+	xKernel |= kernelTime.dwLowDateTime;
+	xUser = userTime.dwHighDateTime;
+	xUser <<= 32;
+	xUser |= userTime.dwLowDateTime;
+
+	if (m_xIdlePre != 0)
+	{
+		__int64 xI,xK,xU;
+		xI = xIdle - m_xIdlePre;
+		xK = xKernel - m_xKernelPre;
+		xU = xUser - m_xUserPre;
+		
+		if ((xK +xU) != 0)
+			ratio = (xK - xI + xU) * 100 / (xK + xU);
+	}
+	m_xIdlePre = xIdle;
+	m_xKernelPre = xKernel;
+	m_xUserPre = xUser;
+
+	return ratio;
+}
+
 #else
 
 /*

+ 13 - 44
Module/mod_SalesRecorder/mod_SalesRecorder.h

@@ -62,7 +62,7 @@ namespace SalesRecorder {
 	class CSalesRecorderEntity : public CEntityBase, public CHostApi, public ILogListener,public ISysVarListener, public ITimerListener
 	{
 	public:
-		CSalesRecorderEntity() : m_pRecorder(NULL), m_bStarted(false), m_loglevel(RECORD_LOG_INFO), m_lowestlevel(RECORD_LOG_DEBUG), m_eRecordType(eWMV) { ZeroMemory(m_SalesVideoName, MAX_PATH); }
+		CSalesRecorderEntity() : m_pRecorder(NULL), m_bStarted(false), m_loglevel(RECORD_LOG_INFO), m_lowestlevel(RECORD_LOG_DEBUG) { ZeroMemory(m_SalesVideoName, MAX_PATH); }
 #else
 	class CSalesRecorderEntity : public CEntityBase, public CHostApi, public ILogListener, public ISysVarListener, public ITimerListener
 	{
@@ -115,44 +115,26 @@ namespace SalesRecorder {
 			const CAutoArray<DWORD> &Param, const char *pszEntityName, const char *pszModuleName,const char *pszMessage, const linkContext& pLinkInfo);
 
 #if defined(RVC_OS_WIN)
-		void StartRecord(const char* wmvfilename, int videoquality, int audioOutBitRate, SubtitleParam* subtitleParam = NULL, BOOL bWholeSection = FALSE, BOOL bSessionManage = FALSE, eRvcRecordType eRecordType = eSingleSide);
-
-		void StartPhone2PadRecord(const int fps, const char* wmvfilename, int videoquality, int audioOutBitRate, SubtitleParam* subtitleParam, BOOL bWholeSection, BOOL bSessionManage, eRvcRecordType eRecordType);
-
-		void StartOnSiteSalesRecord(const int fps, const char* videofilename, int videoquality, int audioOutBitRate, SubtitleParam* subtitleParam, BOOL bWholeSection, BOOL bSessionManage, eRvcRecordType eRecordType);
-
-		void DeleteAllVideo(const char* wmvfilename);
-
-		ErrorCodeEnum DeleteVideo(const char* wmvfilename);
-
-		void HandleUkeyPullout();
-
 		int GetSystemMemoryUsage();
 
 		double GetSystemCpuUsage();
 
-		ErrorCodeEnum HandleSetAudioTransmissionFlag(bool bFlag);
-
 		ErrorCodeEnum HandleVideoAppendWatermark(const char* pszVideoName, const char* pszWaterMark);
-
 #else
-		void StartRecord(const char* videofilename, int videoquality, int audioOutBitRate, SubtitleParam* subtitleParam = NULL, BOOL bWholeSection = FALSE, BOOL bSessionManage = FALSE, eRvcRecordType eRecordType = eSingleSide);
-
-		void StartOnSiteSalesRecord(const int fps, const char* videofilename, int videoquality, int audioOutBitRate, SubtitleParam* subtitleParam, BOOL bWholeSection, BOOL bSessionManage, eRvcRecordType eRecordType);
-
-		ErrorCodeEnum DeleteVideo(const char* videofilename);
-
-		bool SecureClientConnect();
+		bool InitSalesRecorder();
 
-		void SecureClientRelease();
+		bool ReleaseSalesRecorder();
 
 		ErrorCodeEnum HandleVideoAppendWatermark(const char* pszVideoName, const wchar_t* pszWaterMark);
+#endif //RVC_OS_WIN
+		void StartRecord(const char* pszVideoName, int videoquality, int audioOutBitRate, SubtitleParam* subtitleParam = NULL, bool bWholeSection = false, bool bSessionManage = false, eRvcRecordType eRecordType = eSingleSide);
 
-		bool InitSalesRecorder();
+		void StartOnSiteSalesRecord(const int fps, const char* pszVideoName, int videoquality, int audioOutBitRate, SubtitleParam* subtitleParam, bool bWholeSection, bool bSessionManage, eRvcRecordType eRecordType);
 
-		bool ReleaseSalesRecorder();
+		void DeleteAllVideo(const char* pszVideoName);
+
+		ErrorCodeEnum DeleteVideo(const char* pszVideoName);
 
-#endif //RVC_OS_WIN
 		bool GetStandardQualityOnSiteSalesRecorder();
 
 		bool GetHighQualityOnSiteSalesRecorder();
@@ -160,18 +142,12 @@ namespace SalesRecorder {
 		ErrorCodeEnum StopRecord();
 
 		ErrorCodeEnum HandleStopRecord(const char* pszMessage);
-		
-		ErrorCodeEnum ShowVideo(const char *videofilename);
-		
-		ErrorCodeEnum PlaySalesRecordVideo(const char *videofilename, int iWndX, int iWndY, int iWndWidth, int iWndHeight);
 
-		ErrorCodeEnum SaveVideo(const char *videofilename);
+		ErrorCodeEnum SaveVideo(const char * pszVideoName);
 
 		// 获取终端准入状态(这个系统变量为A是表示准入通过)
 		CSimpleStringA GetTerminalStage();
 
-		ErrorCodeEnum HandleDisplayVideo();
-
 		ErrorCodeEnum HandleSaveVideo();
 
 		ErrorCodeEnum HandleDeleteVideo();
@@ -194,28 +170,21 @@ namespace SalesRecorder {
 
 		DeviceTypeEnum RvcGetDeviceType();
 
-		ErrorCodeEnum HandleStopShowVideo();
-
-		ErrorCodeEnum HandlePlaySalesRecordVideo(int iWndX, int iWndY, int iWndWidth, int iWndHeight);
-
 		ErrorCodeEnum PostSalesRecordInfos();
 
 		ErrorCodeEnum AddToSalesRecordList(const char* videopath, const char* strfilename, unsigned long ufilesize);
+
 	private:
 		DeviceTypeEnum m_eDeviceType;
 		int m_iActiveCamera;
 		int m_iCameraState;
 		bool m_bNeedRestart;
+		bool m_bWholeSection;
 
 #ifdef RVC_OS_WIN
-		BOOL m_bWholeSection;
-		BOOL m_bApplyHighQuality;
 		__int64  m_xIdlePre, m_xKernelPre, m_xUserPre;
-		eVideoFormat m_eRecordType;
-#else
-		bool m_bWholeSection;
-		bool m_bApplyHighQuality;
 #endif // RVC_OS_WIN
+
 		CAutoArray<CUUID> m_arrListener;
 		char m_SalesVideoName[MAX_PATH];
 		int  m_nSysCallType;                

+ 0 - 1506
Module/mod_SalesRecorder/win/mod_SalesRecorder.cpp

@@ -1,1506 +0,0 @@
-#include "stdafx.h"
-#include "mod_SalesRecorder.h"
-
-#include "rvc_media_common.h"
-#include "fileutil.h"
-#include "array.h"
-#include <memutil.h>
-#include <algorithm>
-#include "y2k_time.h"
-#include <Windows.h>
-
-#include "Event.h"
-
-#include "mod_customeraware/Event.h"
-#include "mod_facetracking/sysvar.h"
-
-#include <assert.h>
-
-#include "EventCode.h"
-
-
-#ifndef RVC_MIN_FILESIZE
-#define RVC_MIN_FILESIZE 10240
-#endif
-
-
-#define SYSVAR_CALLTYPE	"CallType"
-#define CALLTYPE_NORMAL 'N'          // 呼叫类型,普通模式
-#define CALLTYPE_MOBILE	'M'          // 呼叫类型,手机模式
-
-#define MAX_DISK_PERCENT	95      // 磁盘最大占用百分比
-
-static const char* record_failed_case_table[] = {
-	"[RTA3L01] 启动录像失败,初始化失败",
-	"[RTA3L02] 启动录像失败,字体为空,添加水印失败",
-	"[RTA3L03] 开始录像失败,请稍后(约30秒)再试",
-	"[RTA3L04] 录像失败,摄像头故障,获取不到视频,请联系厂商进行维修",
-	"[RTA3L05] 录像失败,获取不到远端音频,请检查风险提示音是否正常播放且音量大小是否正常",
-	"[RTA3L06] 录像失败,麦克风故障,获取不到本地音频,请联系厂商进行维修",
-	"[RTA3L07] 录像失败,系统不支持当前音频采样率",
-	"[RTA3L08] 录像失败,音频流写入失败,请稍后(约30秒)再试",
-	"[RTA3L09] 录像失败,获取不到远端视频,请稍后(约30秒)再试"
-};
-
-
-static BOOL CheckDiskStatus(const char *szRoot, int nPercent, int *pFreeRatio)
-{
-#ifdef RVC_OS_WIN
-	_ULARGE_INTEGER lpFreeBytesAvailableToCaller = {}, lpTotalNumberOfBytes = {}, lpTotalNumberOfFreeBytes = {};
-	BOOL ret = GetDiskFreeSpaceEx(szRoot, &lpFreeBytesAvailableToCaller, &lpTotalNumberOfBytes, &lpTotalNumberOfFreeBytes);
-	if (ret == 0)
-	{
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("CheckDiskStatus.GetDiskFreeSpaceEx failed(%d).",GetLastError());
-		return FALSE;
-	}
-	DWORD dwTotal = lpTotalNumberOfBytes.QuadPart/1048576;
-	DWORD dwTotalFree = lpTotalNumberOfFreeBytes.QuadPart/1048576;
-	int ratio = dwTotalFree*100/dwTotal;
-	*pFreeRatio = ratio;
-	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("free disk %d MB, %d percent free.", dwTotalFree, ratio);
-	//if (ratio < (100-MAX_DISK_PERCENT))
-	if (ratio < (100-nPercent))
-	{
-		return FALSE;
-	}
-	return TRUE;
-#else
-	//todo 调用resourcewatcher
-	return TRUE;
-#endif
-
-}
-
-
-static int hch2int(char hch)
-{
-	if (hch >= '0' && hch <= '9')
-		return hch-'0';
-	else if (hch >= 'a' && hch <= 'f')
-		return hch-'a'+10;
-	else if (hch >= 'A' && hch <= 'F')
-		return hch-'A'+10;
-
-	return 0;
-}
-
-static long hexstr2int(const char *str, int len)
-{
-	long result = 0;
-	if (str && len <= strlen(str)) {
-		for (int i = 0; i < len; ++i) {
-			result += (hch2int(str[i]) << ((len-i-1) << 2));
-		}
-	}
-	return result;
-}
-
-static CSimpleStringA VideoSerialID2TimeString(const char *videoserialid)
-{
-	DWORD nTimeTicks = hexstr2int(videoserialid,8);
-	return ((CSmallDateTime)nTimeTicks).ToTimeString();
-}
-
-
-static void CStringSplit(char* str, char** result, const char* del)
-{
-	char *p = strtok(str, del);
-	while(p != NULL)
-	{
-		*result++ = p;
-		p = strtok(NULL, del);
-	}
-}
-
-// 寻找某目录下与通配符匹配的文件
-static BOOL FindMatchedFile(LPCSTR sFindPath, LPCSTR sFindFileName, ULONGLONG& uCountFile)
-{
-	char sPath[MAX_PATH];
-	ZeroMemory(sPath, MAX_PATH);
-	char sFormatFileName[MAX_PATH + 2] = "*";
-	WIN32_FIND_DATA FindFileData;
-	HANDLE hFind;
-	BOOL fFinished = FALSE;
-
-	strcpy(sFormatFileName, sFindPath);
-	if (sFindPath[strlen(sFindPath) - 1] != SPLIT_SLASH)
-	{
-		strcat(sFormatFileName, SPLIT_SLASH_STR);
-		strcat(sFormatFileName, "*");
-	}
-	else
-	{
-		strcat(sFormatFileName, "*");
-	}
-	strcat(sFormatFileName, sFindFileName);
-	strcat(sFormatFileName, "*");
-
-	hFind = FindFirstFile(sFormatFileName, &FindFileData);
-
-	if (hFind == INVALID_HANDLE_VALUE)
-	{
-		return FALSE;
-	}
-	else
-	{
-		while (!fFinished)
-		{
-			strcpy(sPath, sFindPath);
-			if (sPath[strlen(sPath) - 1] != SPLIT_SLASH)
-			{
-				strcat(sPath, SPLIT_SLASH_STR);
-			}
-			strcat(sPath, FindFileData.cFileName);
-
-			if (!(FILE_ATTRIBUTE_DIRECTORY & FindFileData.dwFileAttributes))
-			{
-				++uCountFile;
-			}
-
-			if (!FindNextFile(hFind, &FindFileData))
-			{
-				if (GetLastError() == ERROR_NO_MORE_FILES)
-				{
-					fFinished = TRUE;
-				}
-				else
-				{
-					break;
-				}
-			}
-		}
-
-		FindClose(hFind);
-	}
-
-	return TRUE; 
-}
-
-
-static CSimpleStringA DecryptString(LPCTSTR lpszEncrpyted)
-{
-	if (NULL == lpszEncrpyted) {
-		return CSimpleStringA("");
-	}
-
-	int	iEncrypt = 0;
-	int len = strlen(lpszEncrpyted);
-	CSimpleStringA csPlainTxt('\0', (len) / 2 + 1);
-	int iCh = 0;
-	for (int i = 0; i < len; i += 2) {
-		sscanf(lpszEncrpyted + i, "%02X", &iCh);
-		csPlainTxt[i / 2] = (char)(((char)iCh) ^ (128 | (iEncrypt++ & 127)));
-	}
-	return CSimpleStringA((LPCTSTR)csPlainTxt);
-}
-
-
-static unsigned long GetFileSize(const char* pfilename)
-{
-	unsigned long usize = 0;
-	if (NULL == pfilename){
-		return usize;
-	}
-
-	FILE* pFile = fopen(pfilename, "rb");
-	if (pFile){
-		fseek(pFile, 0, SEEK_END);
-		usize = ftell(pFile);
-		fclose(pFile);
-	}
-
-	return usize;
-}
-
-void SalesRecordServiceSession::Handle_GetOFLVideoRecords( SpReqAnsContext<SalesRecorderSerVice_GetOFLVideoRecords_Req, SalesRecorderSerVice_GetOFLVideoRecords_Ans>::Pointer ctx )
-{
-	DbgToBeidou(ctx->link, __FUNCTION__)();
-	ctx->Answer(Error_Succeed);
-}
-
-void SalesRecordServiceSession::Handle_CheckVideoDiskStatus( SpReqAnsContext<SalesRecorderSerVice_CheckVideoDiskStatus_Req, SalesRecorderSerVice_CheckVideoDiskStatus_Ans>::Pointer ctx )
-{
-	DbgToBeidou(ctx->link, __FUNCTION__)();
-	int nFreeRatio = 0;
-	int bSufficient = CheckDiskStatus((LPCTSTR)ctx->Req.DriveLetter,m_pEntity->m_max_disk_percent,&nFreeRatio);
-	ctx->Ans.IsSufficient = bSufficient;
-	ctx->Ans.FreeRatio = nFreeRatio;
-	ctx->Answer(Error_Succeed);
-}
-
-void SalesRecordServiceSession::Handle_PlayVideo(SpReqAnsContext<SalesRecorderSerVice_PlayVideo_Req, SalesRecorderSerVice_PlayVideo_Ans>::Pointer ctx)
-{
-	DbgToBeidou(ctx->link, __FUNCTION__)();
-	ctx->Answer(Error_Succeed);
-}
-
-void SalesRecordServiceSession::Handle_SaveVideo(SpReqAnsContext<SalesRecorderSerVice_SaveVideo_Req, SalesRecorderSerVice_SaveVideo_Ans>::Pointer ctx)
-{
-	DbgToBeidou(ctx->link, __FUNCTION__)();
-	ErrorCodeEnum ErrorCode = m_pEntity->HandleSaveVideo();
-	ctx->Answer(ErrorCode);
-}
-
-void SalesRecordServiceSession::Handle_StopRecord(SpReqAnsContext<SalesRecorderSerVice_StopRecord_Req, SalesRecorderSerVice_StopRecord_Ans>::Pointer ctx)
-{
-	DbgToBeidou(ctx->link, __FUNCTION__)();
-	ErrorCodeEnum ErrorCode = m_pEntity->HandleStopRecord((LPCTSTR)CSimpleStringW2A(ctx->Req.VideoName));
-	ctx->Answer(ErrorCode);
-}
-
-
-void SalesRecordServiceSession::Handle_SetAudioTransFlag(SpReqAnsContext<SalesRecorderSerVice_SetAudioTransFlag_Req, SalesRecorderSerVice_SetAudioTransFlag_Ans>::Pointer ctx)
-{
-	DbgToBeidou(ctx->link, __FUNCTION__)();
-	ctx->Answer(Error_Succeed);
-}
-
-
-void SalesRecordServiceSession::Handle_StopShowVideo(SpReqAnsContext<SalesRecorderSerVice_StopShowVideo_Req, SalesRecorderSerVice_StopShowVideo_Ans>::Pointer ctx)
-{
-	DbgToBeidou(ctx->link, __FUNCTION__)();
-	ctx->Answer(Error_Succeed);
-}
-
-void SalesRecordServiceSession::Handle_PlaySalesRecord(SpReqAnsContext<SalesRecorderSerVice_PlaySalesRecord_Req, SalesRecorderSerVice_PlaySalesRecord_Ans>::Pointer ctx)
-{
-	DbgToBeidou(ctx->link, __FUNCTION__)();
-	ctx->Answer(Error_Succeed);
-}
-
-void SalesRecordServiceSession::Handle_StartRemoteRecord(SpReqAnsContext<SalesRecorderSerVice_StartRemoteRecord_Req, SalesRecorderSerVice_StartRemoteRecord_Ans>::Pointer ctx)
-{
-	DbgToBeidou(ctx->link, __FUNCTION__)();
-	ErrorCodeEnum ErrorCode = m_pEntity->HandleStartRecord(ctx->Req.VideoName.GetData(), true);
-	ctx->Answer(ErrorCode);
-}
-
-
-void SalesRecordServiceSession::Handle_DeleteVideo(SpReqAnsContext<SalesRecorderSerVice_DeleteVideo_Req, SalesRecorderSerVice_DeleteVideo_Ans>::Pointer ctx)
-{
-	DbgToBeidou(ctx->link, __FUNCTION__)();
-	ErrorCodeEnum ErrorCode = m_pEntity->HandleDeleteVideo();
-	ctx->Answer(ErrorCode);
-}
-
-void SalesRecordServiceSession::Handle_AppendWatermark(SpReqAnsContext<SalesRecorderSerVice_AppendWatermark_Req, SalesRecorderSerVice_AppendWatermark_Ans>::Pointer ctx)
-{
-	DbgToBeidou(ctx->link, __FUNCTION__)();
-	ErrorCodeEnum ErrorCode = m_pEntity->HandleVideoAppendWatermark(CSimpleStringW2A(ctx->Req.VideoName).GetData(), CSimpleStringW2A(ctx->Req.Watermark).GetData());
-	ctx->Answer(ErrorCode);
-}
-
-CServerSessionBase * CSalesRecorderEntity::OnNewSession( const char* pszRemoteEntityName, const char * pszClass )
-{
-	return new SalesRecordServiceSession(this);
-}
-
-void CSalesRecorderEntity::OnPreStart( CAutoArray<CSimpleStringA> strArgs,CSmartPointer<ITransactionContext> pTransactionContext )
-{
-	ErrorCodeEnum Error = __OnStart(Error_Succeed);
-	pTransactionContext->SendAnswer(Error);
-}
-
-ErrorCodeEnum CSalesRecorderEntity::__OnStart( ErrorCodeEnum preOperationError )
-{
-	//MessageBoxA(0,0,0,0);
-	m_eDeviceType = eStand2sType;
-	m_nSysCallType = 0;
-	m_bNeedRestart = false;
-	m_eAudioOutQuality = eUltraHD;
-	m_bIsAudioNsOn = false;
-	m_iAudioNsPolicy = 2;
-	m_iAudioChannels = 1;
-	
-	m_strHttpServerAPI = RVC_UPLOAD_VIDEORECORDING_HTTP_API;
-	m_iHttpTimeOut = RVC_HTTPTIMEOUT;
-	m_strHttpServerAddr = RVC_UPLOAD_VIDEORECORDING_HTTP_ADDR;
-	m_strAppVersion = NULL;
-	m_strTerminalId = NULL;
-	m_bPostOn = false;
-
-	m_xIdlePre = m_xKernelPre = m_xUserPre = 0;
-
-	if (SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS)){
-		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Set Process(%d) RealTime Priority Success.",GetCurrentProcessId());
-	}
-
-	m_eDeviceType = RvcGetDeviceType();
-
-	int iAudioQuality = 3;
-	int iAudioNsPolicy = 2;
-	int iIsAudioNsOn = 0;
-	int iAudioChannels = 1;
-	int iLogLevel = 1;
-	int iLowestLevel = 1;
-	int iTimeOut = RVC_HTTPTIMEOUT;
-	CSimpleStringA strHttpServerAddr("");
-	int iPostOn = 0;
-	m_max_disk_percent = MAX_DISK_PERCENT; 
-	m_audio_samplerate = 8;
-	CSmartPointer<IConfigInfo> spConfig;
-	CSmartPointer<IEntityFunction> spFunction = GetFunction();
-	if (spFunction->OpenConfig(Config_CenterSetting, spConfig) == Error_Succeed) {
-		spConfig->ReadConfigValueInt("SalesRecorder","MaxDiskPercent",m_max_disk_percent);
-		spConfig->ReadConfigValueInt("SalesRecorder","AudioSampleRate",m_audio_samplerate);
-		spConfig->ReadConfigValueInt("SalesRecorder","AudioBitRate",m_audio_out_bitrate);
-		spConfig->ReadConfigValueInt("SalesRecorder","AudioNsPolicy",iAudioNsPolicy);
-		spConfig->ReadConfigValueInt("SalesRecorder","IsAudioNsOn",iIsAudioNsOn);
-		spConfig->ReadConfigValueInt("SalesRecorder","AudioQuality",iAudioQuality);
-		spConfig->ReadConfigValueInt("SalesRecorder","AudioChannels",iAudioChannels);
-		spConfig->ReadConfigValueInt("SalesRecorder","LogLevel",iLogLevel);
-		spConfig->ReadConfigValueInt("SalesRecorder","LowestLevel",iLowestLevel);
-		spConfig->ReadConfigValueInt("SalesRecorder", "post_salesrecord_info_on", iPostOn);
-		spConfig->ReadConfigValue("Recorder", "http_video_record_addr", strHttpServerAddr);
-		spConfig->ReadConfigValueInt("Recorder", "http_timeout", iTimeOut);
-	}
-
-	if (m_max_disk_percent <= 0 || m_max_disk_percent >= 100) {
-		m_max_disk_percent = MAX_DISK_PERCENT;
-	}
-
-	if (iLogLevel <= RECORD_LOG_ERROR && iLogLevel > 0){
-		m_loglevel = (record_loglevel)iLogLevel;
-	}
-
-	if (iLowestLevel <= RECORD_LOG_ERROR && iLowestLevel > 0){
-		m_lowestlevel = (record_loglevel)iLowestLevel;
-	}
-
-	m_eRecordType = eMP4;
-
-	if (strHttpServerAddr.GetLength() > 0) {
-		m_strHttpServerAddr = strHttpServerAddr;
-	}
-
-	if (iTimeOut > 0 && iTimeOut < 20 * RVC_HTTPTIMEOUT) {
-		m_iHttpTimeOut = iTimeOut;
-	}
-
-	if (1 == iPostOn) {
-		m_bPostOn = true;
-	}
-
-	SetRecordAudioQuality(iAudioQuality);
-	SetRecordAudioNsPolicy(iAudioNsPolicy);
-	SetRecordAudioChannles(iAudioChannels);
-
-	if (0 != iIsAudioNsOn){
-		m_bIsAudioNsOn = true;
-	}
-
-	if (preOperationError != Error_Succeed) {
-		return preOperationError;
-	}
-
-	ErrorCodeEnum Error = Error_Succeed;
-	m_iActiveCamera = CAMERA_TYPE_ENV;
-	m_iCameraState = 'N';
-	
-	int i = 0;
-
-	m_arrListener.Init(2);
-	GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_UI_RETURNMENU, NULL, false);
-	GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_High, Error_IgnoreAll, LOG_EVT_SALESRECORD_ENTITY_EXCEPTION, NULL, false);
-	
-	GetFunction()->RegistSysVarEvent(SYSVAR_ACTIVETRACKINGCAMERA,this);
-	GetFunction()->RegistSysVarEvent(SYSVAR_CAMERASTATE,this);
-	CSimpleStringA strValue;
-	GetFunction()->GetSysVar(SYSVAR_CAMERASTATE, strValue);
-	m_iCameraState = strValue[0];
-	if (strValue[0] == 'E'){
-		m_iActiveCamera = CAMERA_TYPE_OPT;
-	}
-	else{
-		m_iActiveCamera = CAMERA_TYPE_ENV;
-	}
-
-	GetFunction()->RegistSysVarEvent(SYSVAR_CALLTYPE, this);
-	GetFunction()->GetSysVar(SYSVAR_CALLTYPE, strValue);
-	if (strValue[0] == CALLTYPE_NORMAL) {
-		m_nSysCallType = 0;
-	} 
-	else if (strValue[0] == CALLTYPE_MOBILE) {
-		m_nSysCallType = 1;
-	} 
-	else {
-		assert(0);
-	}
-
-	Error = GetFunction()->RegistSysVarEvent("SessionID", this);
-	if (Error != Error_Succeed) {
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("register sysvar %s failed!", "SessionID");
-	}
-
-	Error = GetFunction()->GetPath("Temp", m_TempDir);
-	if (Error != Error_Succeed) {
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("get global record temp path failed!");
-	}
-
-	if (m_TempDir.GetLength() > 0 && m_TempDir[m_TempDir.GetLength()-1] != SPLIT_SLASH) {
-		m_TempDir += SPLIT_SLASH_STR;
-	}
-	Error = GetFunction()->GetPath("UploadVideo", m_RecordSaveDir);
-	if (Error != Error_Succeed) {
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("get global record save path failed!");
-	}
-
-	if (m_RecordSaveDir.GetLength() > 0 && m_RecordSaveDir[m_RecordSaveDir.GetLength()-1] != SPLIT_SLASH) {
-		m_RecordSaveDir += SPLIT_SLASH_STR;
-	}
-
-	return Error;
-}
-
-void CSalesRecorderEntity::OnStarted()
-{
-	CSystemStaticInfo si;
-	ErrorCodeEnum Error = GetFunction()->GetSystemStaticInfo(si);
-	if (Error == Error_Succeed) {
-		m_strAppVersion = si.InstallVersion.ToString();
-		m_strTerminalId = si.strTerminalID;
-	}
-	LogEvent(Severity_Middle, LOG_EVT_MOD_SALESRECORDER_STARTED_SUCCESS, "sales recorder entity started successfully.");
-}
-
-void CSalesRecorderEntity::OnPreClose( EntityCloseCauseEnum eCloseCause,CSmartPointer<ITransactionContext> pTransactionContext )
-{
-	ErrorCodeEnum Error = __OnClose(Error_Succeed);
-	pTransactionContext->SendAnswer(Error);
-}
-
-ErrorCodeEnum CSalesRecorderEntity::__OnClose( ErrorCodeEnum preOperationError )
-{
-	if (preOperationError != Error_Succeed) {
-		return preOperationError;
-	}
-		
-	CSmartPointer<IEntityFunction> spFunction = GetFunction();
-	for (int i = 0; i < m_arrListener.GetCount(); ++i) {
-		spFunction->UnsubscribeLog(m_arrListener[i]);
-	}
-
-	GetFunction()->UnregistSysVarEvent(SYSVAR_ACTIVETRACKINGCAMERA);
-	GetFunction()->UnregistSysVarEvent(SYSVAR_CAMERASTATE);
-
-	StopRecord();
-
-	return Error_Succeed;
-}
-
-void CSalesRecorderEntity::OnSelfTest(EntityTestEnum eTestType,CSmartPointer<ITransactionContext> pTransactionContext)
-{
-	if (Test_ShakeHand == eTestType)
-	{
-		if (m_bNeedRestart){
-			pTransactionContext->SendAnswer(Error_Unexpect);
-		}
-		else{
-			pTransactionContext->SendAnswer(Error_Succeed);
-		}
-	}
-}
-
-void CSalesRecorderEntity::Debug(record_loglevel elevel, const char* fmt, ...)
-{
-	record_loglevel entitylevel = (m_lowestlevel > m_loglevel) ? m_lowestlevel : m_loglevel;
-	if (entitylevel <= elevel) {
-		va_list arg;
-		va_start(arg, fmt);
-		int n = vsnprintf(NULL, 0, fmt, arg);
-		if (n >= MAX_PATH) {
-			char* buf = (char*)malloc((size_t)(n + 1));
-			vsnprintf(buf, n + 1, fmt, arg);
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("%s", buf);
-			free(buf);
-		}
-		else {
-			char strlog[MAX_PATH] = { 0 };
-			vsnprintf(strlog, MAX_PATH, fmt, arg);
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("%s", strlog);
-		}
-		va_end(arg);
-	}
-}
-
-void CSalesRecorderEntity::vDebug(record_loglevel elevel, const char* str, va_list list)
-{
-	record_loglevel entitylevel = (m_lowestlevel > m_loglevel) ? m_lowestlevel : m_loglevel;
-	if (entitylevel <= elevel) {
-		int n = vsnprintf(NULL, 0, str, list);
-		if (n >= MAX_PATH) {
-			char* buf = (char*)malloc((size_t)(n + 1));
-			vsnprintf(buf, n + 1, str, list);
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("%s", buf);
-			free(buf);
-		}
-		else {
-			char strlog[MAX_PATH] = { 0 };
-			vsnprintf(strlog, MAX_PATH, str, list);
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("%s", strlog);
-		}
-	}
-}
-
-int CSalesRecorderEntity::GetActiveCamera()
-{
-	return m_iActiveCamera;
-}
-
-int CSalesRecorderEntity::GetCameraState()
-{
-	return m_iCameraState;
-}
-
-void CSalesRecorderEntity::OnRecordFailed(eRvcRecordFailedCase eCase, const char* pszMessage, bool bRecordDevFault)
-{
-	double fCpuUsage = GetSystemCpuUsage();
-	if (fCpuUsage > 50.0){
-		LogWarn(Severity_Low, Error_Debug, LOG_EVT_UI_RECORDFAILED_FOR_HIGHCPU, "more than 50 percent.");
-	}
-
-	if (eCase < eDefault && eCase >= 0){
-		LogEvent(Severity_Middle, LOG_EVT_UI_RECORDFAILED, record_failed_case_table[eCase]);
-	}
-
-	m_loglevel = RECORD_LOG_INFO;
-	
-	LogWarn(Severity_Middle, Error_Debug, LOG_EVT_SALESRECORD_FAILED, CSimpleStringA::Format("{%s} current memory usage is %d, and cpu usage is %f.", pszMessage ? pszMessage : " ", GetSystemMemoryUsage(), fCpuUsage).GetData());
-
-	if (eBeginFailed == eCase) {
-		m_bNeedRestart = true;
-		RealSelfCheck();
-	}
-
-	m_eBusinessStatus = eInterrupt;
-}
-
-void CSalesRecorderEntity::OnRecordEntityExcption()
-{
-	LogEvent(Severity_High,LOG_EVT_SALESRECORD_ENTITY_EXCEPTION,"现场销售双录出现异常,请稍候重录,系统正在恢复中,预计60秒!");
-	LogWarn(Severity_Low, Error_Debug, LOG_EVT_RECORD_ENTITY_EXCEPTION, "sales record entity exception!");
-}
-
-
-void CSalesRecorderEntity::OnRecordFinished()
-{
-	LogEvent(Severity_High, LOG_EVT_SALESRECORD_FINISHED, "现场销售双录已完成.");
-	LogWarn(Severity_Low, Error_Debug, LOG_EVT_RECORD_FINISHED, "现场销售双录已完成.");
-}
-
-
-
-
-void CSalesRecorderEntity::OnTimeout( DWORD dwTimerID )
-{
-
-}
-
-void CSalesRecorderEntity::OnSysVarEvent( const char *pszKey, const char *pszValue,const char *pszOldValue,const char *pszEntityName )
-{
-	if (_stricmp(pszKey, SYSVAR_CAMERASTATE) == 0)
-	{
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("OnSysVarEvent Key = %s, Value = %s.", pszKey, pszValue);
-		m_iCameraState = pszValue[0]; 
-		if (pszValue[0] == 'E')
-		{
-			m_iActiveCamera = CAMERA_TYPE_OPT;
-		}
-		else
-		{
-			m_iActiveCamera = CAMERA_TYPE_ENV;
-		}
-	}
-	else if (_stricmp(pszKey, SYSVAR_ACTIVETRACKINGCAMERA) == 0)
-	{
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("OnSysVarEvent Key = %s, Value = %s.", pszKey, pszValue);
-		if (m_iCameraState == 'N')
-		{
-			if (pszValue[0] == 'E')
-			{
-				m_iActiveCamera = CAMERA_TYPE_ENV;
-			}
-			else if (pszValue[0] == 'O')
-			{
-				m_iActiveCamera = CAMERA_TYPE_OPT;
-			}
-		}
-	}
-	else if (_stricmp(pszKey, SYSVAR_CALLTYPE) == 0)
-	{
-		if(pszValue[0] == CALLTYPE_NORMAL)
-		{
-			m_nSysCallType = 0;
-		} 
-		else if(pszValue[0] == CALLTYPE_MOBILE)
-		{
-			m_nSysCallType = 1;
-		}
-		else 
-		{
-			m_nSysCallType = -1;
-		}
-	}
-}
-
-void CSalesRecorderEntity::OnLog( const CAutoArray<CUUID> &SubIDs, const CUUID nLogID,const LogTypeEnum eLogType, const SeverityLevelEnum eLevel, const DWORD dwSysError,const DWORD dwUserCode,const DWORD dwEntityInstanceID, const WORD wEntityDevelID, const CAutoArray<DWORD> &Param, const char *pszEntityName, const char *pszModuleName,const char *pszMessage, const linkContext &pLinkInfo)
-{
-	// 响应客户经理销售录像相关的事件
-	switch (dwUserCode)
-	{
-	case LOG_EVT_UI_RETURNMENU:
-		HandleReturnMenu();
-		break;
-
-	case LOG_EVT_SALESRECORD_ENTITY_EXCEPTION:
-		HandleSalesRecordEntityException(pszMessage);
-		break;
-
-	default:
-		break;
-	}
-}
-
-
-bool CSalesRecorderEntity::GetStandardQualityOnSiteSalesRecorder()
-{
-	bool bRet = false;
-
-	m_pRecorder = new Clibvideorecord(&bRet, this, REC_COMMON_AUDIO_SHM_QUEUE, REC_COMMON_VIDEO_ENV_SHM_SNAPSHOT_QUEUE,
-				REC_COMMON_VIDEO_OPT_SHM_SNAPSHOT_QUEUE, REC_COMMON_AUDIO_SALES_SHM_QUEUE, REC_COMMON_VIDEO_REMOTE_SHM_RTP_QUEUE, REC_COMMON_REMOTEAUDIO_SHM_QUEUE);
-		
-	return bRet;
-}
-
-
-bool CSalesRecorderEntity::GetHighQualityOnSiteSalesRecorder()
-{
-	bool bRet = false;
-
-	m_pRecorder = new Clibvideorecord(&bRet, this, REC_COMMON_AUDIO_SHM_QUEUE, REC_COMMON_VIDEO_ENV_SHM_SNAPSHOT_QUEUE,
-				REC_COMMON_VIDEO_OPT_SHM_SNAPSHOT_QUEUE, REC_COMMON_AUDIO_SALES_SHM_QUEUE, REC_COMMON_VIDEO_REMOTE_SHM_RTP_QUEUE, REC_COMMON_REMOTEAUDIO_SHM_QUEUE);
-
-	return bRet;
-}
-
-
-void CSalesRecorderEntity::StartOnSiteSalesRecord(const int fps, const char* videofilename, int videoquality, int audioOutBitRate, SubtitleParam* subtitleParam, BOOL bWholeSection, BOOL bSessionManage, eRvcRecordType eRecordType)
-{
-	bool bRet = false;
-
-	bRet = GetStandardQualityOnSiteSalesRecorder();
-
-	if (false == bRet){
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("get onsite sales recorder failed.");
-		return;
-	}
-
-	Rvc_RecordAudioParam_t tAudioParams;
-	tAudioParams.eRecordType = eRecordType;
-	tAudioParams.eOutPutType = m_eAudioOutQuality;
-	tAudioParams.bIsNsOn = m_bIsAudioNsOn;
-	tAudioParams.iNsPolicy = m_iAudioNsPolicy;
-	tAudioParams.iAudioOutBitRate = audioOutBitRate;
-	tAudioParams.bIsTransOn = false;
-	tAudioParams.iAudioChannels = m_iAudioChannels;
-
-	if (eStand2Agent == eRecordType) {
-		tAudioParams.eOutPutType = eLowDefinition;
-		tAudioParams.bIsNsOn = false;
-	}
-
-	//DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("init record lib success! and record type is %s and output audio quality is %s, audio noise suppression flag is %s. noise suppression policy is %d, video format is %s.", record_type_table[eRecordType], audio_quality_type_table[m_eAudioOutQuality], tAudioParams.bIsNsOn ? "true" : "false", tAudioParams.iNsPolicy, m_eRecordType == eMP4 ? RECORD_MP4_SUFFIX : RECORD_WMV_SUFFIX);
-	if (m_pRecorder->StartVideoRecord(fps, videoquality, m_eRecordType, &tAudioParams, subtitleParam, bWholeSection, FALSE, m_TempDir.GetData(),
-		m_TempDir.GetLength(), videofilename, strlen(videofilename)))
-	{
-		m_eBusinessStatus = eSuccess;
-		m_bStarted = true;
-	}
-	else {
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Start VideoRecord failed!");
-		m_eBusinessStatus = eFailed;
-		if (m_bPostOn) {
-			PostSalesRecordInfos();
-		}
-	}
-}
-
-void CSalesRecorderEntity::StartRecord(const char * videofilename, int videoquality, int audioOutBitRate, SubtitleParam *subtitleParam /* = NULL */, BOOL bWholeSection /* = FALSE */, BOOL bSessionManage /* = FALSE */, eRvcRecordType eRecordType /* = eSingleSide */)
-{
-	StartOnSiteSalesRecord(5, videofilename, videoquality, audioOutBitRate, subtitleParam, bWholeSection, bSessionManage, eRecordType);
-}
-
-ErrorCodeEnum CSalesRecorderEntity::StopRecord()
-{
-	ErrorCodeEnum eCode = Error_Succeed;
-	if (m_bStarted) {
-		m_pRecorder->StopVideoRecord();
-		delete m_pRecorder; 
-		m_pRecorder = NULL;
-		m_bStarted = FALSE;
-	}
-	//else{
-	//	eCode = Error_InvalidState;
-	//}
-
-	return eCode;
-}
-
-
-void CSalesRecorderEntity::DeleteAllVideo( const char *wmvfilename )
-{
-	if(!m_bStarted)
-	{
-		CSimpleStringA strPath;
-		ErrorCodeEnum Error = GetFunction()->GetPath("Temp", strPath);
-		if (Error == Error_Succeed) {
-			if (strPath.GetLength() > 0 && strPath[strPath.GetLength()-1] != '\\') {
-				strPath += "\\";
-			}
-			ULONGLONG uVideoCount = 0;
-			CSimpleStringA strFindFileName = CSimpleStringA::Format("S_%s*.%s", wmvfilename, m_eRecordType == eMP4 ? RECORD_MP4_SUFFIX : RECORD_WMV_SUFFIX);
-			BOOL bRet = FindMatchedFile((LPCSTR)strPath, (LPCSTR)strFindFileName, uVideoCount);
-			if(bRet)
-			{
-				strFindFileName = strFindFileName.SubString(0,strFindFileName.GetLength()-5);
-				//DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("succeed to get sales record count while delete video!");
-				CSimpleStringA fileName("");
-				BOOL bDeleteSucc = TRUE;
-				for(int i = 0; i != uVideoCount; ++i)
-				{
-					fileName = CSimpleStringA::Format("%s%s_%d.%s", (LPCSTR)strPath, (LPCSTR)strFindFileName, i, m_eRecordType == eMP4 ? RECORD_MP4_SUFFIX : RECORD_WMV_SUFFIX);
-
-					bRet = DeleteFile((LPCSTR)fileName);
-					if(!bRet) {
-						bDeleteSucc = FALSE;
-						DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Error Code %lu while delete %s ", GetLastError(), (LPCSTR)fileName);
-					}
-				}
-				if (!bDeleteSucc) {
-					DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("failed to delete sales video!");
-				}
-			}
-
-			// 删除见证录像
-			uVideoCount = 0;
-			strFindFileName = CSimpleStringA::Format("W_%s*.%s", wmvfilename, m_eRecordType == eMP4 ? RECORD_MP4_SUFFIX : RECORD_WMV_SUFFIX);
-			bRet = FindMatchedFile((LPCSTR)strPath, (LPCSTR)strFindFileName, uVideoCount);
-			if(bRet)
-			{
-				strFindFileName = strFindFileName.SubString(0,strFindFileName.GetLength()-5);
-				//DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("succeed to get witness record count while delete video!");
-				CSimpleStringA fileName;
-				BOOL bDeleteSucc = TRUE;
-				//DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("uVideoCount=%d", uVideoCount);
-				for(int i = 0; i != uVideoCount; ++i)
-				{
-					fileName = CSimpleStringA::Format("%s%s_%d.%s", (LPCSTR)strPath, (LPCSTR)strFindFileName, i, m_eRecordType == eMP4 ? RECORD_MP4_SUFFIX : RECORD_WMV_SUFFIX);
-
-					bRet = DeleteFile((LPCSTR)fileName);
-					if(!bRet) {
-						bDeleteSucc = FALSE;
-						DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Error Code %lu while delete %s ", GetLastError(), (LPCSTR)fileName);
-					}
-				}
-				//if (bDeleteSucc) {
-				//	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("succeed to delete witness video!");
-				//}
-			}
-			//else
-			//{
-			//	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("witness videos not exist or have been deleted!");
-			//}
-		}			
-	}
-}
-
-ErrorCodeEnum CSalesRecorderEntity::DeleteVideo( const char *videofilename)
-{
-	ErrorCodeEnum ErrorCode = Error_Succeed;
-	if(!m_bStarted)
-	{
-		CSimpleStringA strPath;
-		ErrorCodeEnum Error = GetFunction()->GetPath("Temp", strPath);
-		if (Error == Error_Succeed) {
-			if (strPath.GetLength() > 0 && strPath[strPath.GetLength()-1] != '\\') {
-				strPath += "\\";
-			}
-			CSimpleStringA strFindFileName = CSimpleStringA::Format("%s*.%s", videofilename, m_eRecordType == eMP4 ? RECORD_MP4_SUFFIX : RECORD_WMV_SUFFIX);
-			ULONGLONG uVideoCount = 0;
-			BOOL bRet = FindMatchedFile((LPCSTR)strPath, (LPCTSTR)strFindFileName, uVideoCount);
-			if(bRet)
-			{
-				CSimpleStringA fileName;
-				BOOL bDeleteSucc = TRUE;
-				for(int i = 0; i != uVideoCount; ++i)
-				{
-					fileName = CSimpleStringA::Format("%s%s_%d.%s", (LPCSTR)strPath, videofilename, i, m_eRecordType == eMP4 ? RECORD_MP4_SUFFIX : RECORD_WMV_SUFFIX);
-
-					bRet = DeleteFile((LPCSTR)fileName);
-					if(!bRet) {
-						bDeleteSucc = FALSE;
-						DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Error Code %lu while delete %s ", GetLastError(), (LPCSTR)fileName);
-					}
-				}
-				if (!bDeleteSucc) {
-					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("delete videos failed!");
-				}
-			}
-			else
-			{
-				ErrorCode = Error_NotExist;
-			}
-		}
-	}
-	else {
-		ErrorCode = Error_NotImpl;
-	}
-
-	if (eInterrupt != m_eBusinessStatus) {
-		m_eBusinessStatus = eCancel;
-	}
-
-	if (m_bPostOn) {
-		PostSalesRecordInfos();
-	}
-
-	return ErrorCode;
-}
-
-
-/*
-SaveVideo包含两步,找到录像和移动录像
-Error_Succeed		提交上传成功
-Error_NotExist		not exist
-Error_NotImpl		方法执行失败
-*/
-
-ErrorCodeEnum CSalesRecorderEntity::SaveVideo( const char * videofilename)
-{
-	ErrorCodeEnum ErrorCode = Error_Succeed;
-
-	if(!m_bStarted)
-	{
-		CSimpleStringA sourPath;
-		ErrorCodeEnum Error = GetFunction()->GetPath("Temp", sourPath);
-		if(Error == Error_Succeed)
-		{
-			if (sourPath.GetLength() > 0 && sourPath[sourPath.GetLength()-1] != '\\') {
-				sourPath += "\\";
-			}
-			ULONGLONG uVideoCount = 0;
-			CSimpleStringA strFindFileName = CSimpleStringA::Format("S_%s*.%s", videofilename, m_eRecordType == eMP4 ? RECORD_MP4_SUFFIX : RECORD_WMV_SUFFIX);
-			BOOL bRet = FindMatchedFile((LPCSTR)sourPath, (LPCSTR)strFindFileName, uVideoCount);
-			if(bRet)
-			{
-				strFindFileName = strFindFileName.SubString(0,strFindFileName.GetLength()-5);
-				CSimpleStringA destPath;
-				Error = GetFunction()->GetPath("UploadVideo", destPath);
-				if(Error == Error_Succeed)
-				{
-					if (destPath.GetLength() > 0 && destPath[destPath.GetLength()-1] != '\\') {
-						destPath += "\\";
-					}
-					CSimpleStringA sourFileName(""), destFileName("");
-					BOOL bMoveSucc = TRUE;
-					for(int i = 0; i != uVideoCount; ++i)
-					{
-						sourFileName = CSimpleStringA::Format("%s%s_%d.%s", (LPCSTR)sourPath, (LPCSTR)strFindFileName, i, m_eRecordType == eMP4 ? RECORD_MP4_SUFFIX : RECORD_WMV_SUFFIX);
-						destFileName = CSimpleStringA::Format("%s%s_%d.%s", (LPCSTR)destPath, (LPCSTR)strFindFileName, i, m_eRecordType == eMP4 ? RECORD_MP4_SUFFIX : RECORD_WMV_SUFFIX);
-						unsigned long ufilesize = GetFileSize(sourFileName.GetData());
-						LogWarn(Severity_Low, Error_Debug, LOG_EVT_RECORD_FILESIZE, CSimpleStringA::Format("%s file size is %u byte.", sourFileName.GetData(), ufilesize).GetData());
-						bRet = MoveFile((LPCSTR)sourFileName, (LPCSTR)destFileName);
-						if (!bRet) {
-							bMoveSucc = FALSE;
-							ErrorCode = Error_NotImpl;
-							LogWarn(Severity_Middle, Error_Debug, LOG_EVT_RECORD_SAVED_FAILED, CSimpleStringA::Format("Error Code %lu while move %s.", GetLastError(), sourFileName.GetData()).GetData());
-							if (183 == GetLastError()) {
-								ErrorCode = Error_InvalidState;
-							}
-						}
-						else 
-							{
-							CSimpleStringA strVideoName = CSimpleStringA::Format("%s_%d.%s", strFindFileName.GetData(), i, RECORD_MP4_SUFFIX);
-							if (m_bPostOn) {
-								AddToSalesRecordList(destFileName.GetData(), strVideoName.GetData(), ufilesize);
-							}
-						}
-
-						if (RVC_MIN_FILESIZE > ufilesize){
-							LogWarn(Severity_Low, Error_Debug, LOG_EVT_RECORD_INVALID_FILE, CSimpleStringA::Format("%s file size is %u.", sourFileName.GetData(), ufilesize).GetData());
-						}
-					}
-					if (bMoveSucc) {
-						LogWarn(Severity_Low, Error_Debug, LOG_EVT_RECORD_SAVED_SUCCESS, CSimpleStringA::Format("succeed to save sales video, move it from %s to %s.", sourFileName.GetData(), destFileName.GetData()).GetData());
-						if (m_bPostOn) {
-							if (Error_Succeed != PostSalesRecordInfos()) {
-								ErrorCode = Error_Failed;
-							}
-						}
-					}
-				}
-			}
-			else{
-				LogWarn(Severity_Middle, Error_Debug, LOG_EVT_RECORD_SAVED_FAILED, "sales videos not exist or have been deleted");
-				ErrorCode = Error_NotExist;
-			}
-		}
-	}
-	else{
-		ErrorCode = Error_InvalidState;
-	}
-
-	return ErrorCode;
-}
-
-
-CSimpleStringA CSalesRecorderEntity::GetTerminalStage()
-{
-	CSmartPointer<IEntityFunction> Func = GetFunction();
-	CSimpleStringA strValue = "";
-	Func->GetSysVar("TerminalStage", strValue);
-	return strValue;
-}
-
-
-ErrorCodeEnum CSalesRecorderEntity::HandleStartRecord(const char *pszMessage, const bool bRemoteRecord)
-{
-	ErrorCodeEnum Error = Error_Succeed;
-	eRvcRecordType eRecordType = eSingleSide;
-	if (NULL == pszMessage){
-		return Error_Param;
-	}
-
-	size_t ulen = strlen(pszMessage);
-	char *tmp = new char[ulen+1];
-
-	strncpy_s(tmp, ulen+1, pszMessage, ulen);
-	
-	char *result[16] = {0};
-	//CStringSplit(tmp, result, "@");
-	// 解决中文stringsplit偶现乱码的问题 edit by ly@2018/07/04
-	auto arr1 = CSimpleStringA2W(tmp).Split('@');
-	auto arr2 = CAutoArray<CSimpleStringA>(arr1.GetCount());
-	for (int i = 0; i < arr1.GetCount(); ++i)
-	{
-		arr2[i] = CSimpleStringW2A(arr1[i]);
-		result[i] = const_cast<LPSTR>(arr2[i].GetData());
-	}
-
-	sprintf(m_SalesVideoName, "%s", result[4]);//录像名:录像类型标志_录像流水号(如S_C13213EF)
-	RecordSubTitle subTitle;
-	ZeroMemory(&subTitle,sizeof(RecordSubTitle));
-	CSimpleStringA strCardNo = DecryptString(result[5]);
-	if (sizeof(subTitle.CustCardNo) > strCardNo.GetLength()){
-		strcpy_s(subTitle.CustCardNo, strCardNo.GetData());
-	}
-	else{
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Invalid CustCardNo.");
-	}
-	
-
-	char* pStr = result[6];
-	if (pStr) {
-		CSimpleStringW szCustName = CSimpleStringA2W(pStr);
-		if (szCustName.GetLength() <= 4) {
-			strcpy(subTitle.CustName, pStr);
-		}
-		else {
-			CSimpleStringW aa = szCustName.SubString(0, 4);
-			sprintf(subTitle.CustName, "%s...", (LPCTSTR)CSimpleStringW2A(aa));
-		}
-	}
-
-	pStr = result[7];
-	if (pStr) {
-		int nProductCodeLen = strlen(pStr);
-		if (nProductCodeLen <= 10) {
-			strcpy(subTitle.ProductCode, pStr);
-		}
-		else {
-			char aa[5] = { 0 }, bb[5] = { 0 };
-			strncpy(aa, pStr, 4);
-			strncpy(bb, pStr + nProductCodeLen - 4, 4);
-			sprintf(subTitle.ProductCode, "%s...%s", aa, bb);
-		}
-	}
-
-	pStr = result[8];
-	if (pStr) {
-		CSimpleStringW szProductName = CSimpleStringA2W(pStr);
-		if (szProductName.GetLength() <= 5) {
-			strcpy(subTitle.ProductName, pStr);
-		}
-		else {
-			CSimpleStringW aa = szProductName.SubString(0, 3);
-			CSimpleStringW bb = szProductName.SubString(szProductName.GetLength() - 2, 2);
-			sprintf(subTitle.ProductName, "%s...%s", (LPCTSTR)CSimpleStringW2A(aa), (LPCTSTR)CSimpleStringW2A(bb));
-		}
-	}
-
-	if (result[9]) {
-		strcpy(subTitle.SapID, result[9]);
-	} else {
-		subTitle.SapID[0] = '\0';
-	}
-
-	if (result[10]) {
-		pStr = result[10];
-		CSimpleStringW szCustManagerName = CSimpleStringA2W(pStr);
-		if (szCustManagerName.GetLength() <= 4) {
-			strcpy(subTitle.CustManagerName, result[10]);
-		}
-		else {
-			CSimpleStringW aa = szCustManagerName.SubString(0,4);
-			sprintf(subTitle.CustManagerName,"%s...",(LPCTSTR)CSimpleStringW2A(aa));
-		}
-	} else {
-		subTitle.CustManagerName[0] = '\0';
-	}
-
-	delete[] tmp;
-	tmp = NULL;
-
-	SubtitleParam subtitleParam;
-	ZeroMemory(&subtitleParam,sizeof(SubtitleParam));
-	subtitleParam.bSubtitle = TRUE;
-	subtitleParam.bSubtitleSection = TRUE;
-	subtitleParam.topSubtitleData[0] = '\0';
-	if (strlen(subTitle.SapID)>0&&strlen(subTitle.CustManagerName)>0){
-		sprintf(subtitleParam.bottomSubtitleData1, "%s  %s  %s", subTitle.CustCardNo, subTitle.CustName, subTitle.ProductCode);
-		sprintf(subtitleParam.bottomSubtitleData2, "%s  %s  %s", subTitle.ProductName, subTitle.SapID, subTitle.CustManagerName);
-	}
-	else{
-		sprintf(subtitleParam.bottomSubtitleData1, "%s  %s", subTitle.CustCardNo, subTitle.CustName);
-		sprintf(subtitleParam.bottomSubtitleData2, "%s  %s", subTitle.ProductCode, subTitle.ProductName);
-	}
-
-	int i_audio_out_bitrate = m_audio_out_bitrate;
-
-	if (bRemoteRecord){
-		if (eStand2sType == m_eDeviceType || eStand1SPlusType == m_eDeviceType)  {	//如果是大机
-			eRecordType = eStand2Agent;   //可视柜台大机的双向录像
-		} 
-
-		if(256 == m_audio_out_bitrate){
-			i_audio_out_bitrate = 128;
-		}
-	} 
-
-	StartRecord(m_SalesVideoName, 90, i_audio_out_bitrate, &subtitleParam, FALSE, FALSE, eRecordType);
-
-	LogWarn(Severity_Low, Error_Debug, LOG_EVT_START_REMOTERECORD, CSimpleStringA::Format("start remote record %s.", m_SalesVideoName).GetData());
-
-	return Error;
-}
-
-
-
-ErrorCodeEnum CSalesRecorderEntity::HandleStopRecord(const char *pszMessage)
-{
-	ErrorCodeEnum ErrorCode = StopRecord();
-
-	return ErrorCode;
-}
-
-
-ErrorCodeEnum CSalesRecorderEntity::HandleSaveVideo()
-{
-	ErrorCodeEnum ErrorCode = Error_Succeed;
-
-	// 将视频从tmp移动到uploadvideo
-	ErrorCode = SaveVideo(m_SalesVideoName+2);
-
-	ZeroMemory(m_SalesVideoName,sizeof(m_SalesVideoName));
-
-	return ErrorCode;
-}
-
-
-ErrorCodeEnum CSalesRecorderEntity::HandleDeleteVideo()
-{
-	ErrorCodeEnum ErrorCode = Error_Succeed;
-
-	// 删除tmp中的视频
-	ErrorCode = DeleteVideo(m_SalesVideoName);
-
-	ZeroMemory(m_SalesVideoName,sizeof(m_SalesVideoName));
-
-	return ErrorCode;
-}
-
-
-void CSalesRecorderEntity::HandleReturnMenu()
-{
-	CSimpleStringA strValue;
-	GetFunction()->GetSysVar("DesktopType", strValue);
-	if (strValue != CSimpleStringA("U"))
-	{
-		if (m_bStarted) // 如果正在进行客户经理录像
-		{
-			// 停止录像
-			//DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("stop record and return menu!");
-			StopRecord();
-		}
-
-		// 删除tmp中的视频
-		if (strlen(m_SalesVideoName) > 0)
-		{
-			//DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("delete sales record!");
-			//DeleteAllVideo(m_SalesVideoName+2); 
-		}
-
-		ZeroMemory(m_SalesVideoName,sizeof(m_SalesVideoName));
-	}
-}
-
-
-ErrorCodeEnum CSalesRecorderEntity::HandleVideoAppendWatermark(const char* pszVideoName, const char* pszWaterMark)
-{
-	ErrorCodeEnum Error = Error_Failed;
-	if (NULL == pszWaterMark){
-		return Error_Param;
-	}
-
-	if (m_bStarted && (NULL != m_pRecorder)){
-		if (m_pRecorder->SetRightVideoWaterMark(pszWaterMark)) {
-			Error = Error_Succeed;
-		}
-	}
-
-	return Error;
-}
-
-ErrorCodeEnum CSalesRecorderEntity::HandleSalesRecordEntityException(const char* pszMessage)
-{
-	// 通知到业务中台
-	SalesRecordException evt;
-	evt.failedmsg = CSimpleStringA2W(pszMessage==NULL?"现场销售双录过程出现异常!":pszMessage);
-	SpSendBroadcast(GetFunction(), SP_MSG_OF(SalesRecordException), SP_MSG_SIG_OF(SalesRecordException), evt);
-	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("[dbg] SalesRecord entity exception broadcast sent!");
-
-	//停止录像
-	StopRecord();
-
-	m_bNeedRestart = true;
-
-	//重启实体
-	RealSelfCheck();
-
-	return Error_Succeed;
-}
-
-
-ErrorCodeEnum CSalesRecorderEntity::RealSelfCheck()
-{
-	ErrorCodeEnum Error = Error_Succeed;
-	HealthManagerService_ClientBase* pHMClient = new HealthManagerService_ClientBase(this);
-	Error = pHMClient->Connect();
-	if (Error != Error_Succeed){
-		pHMClient->SafeDelete();
-		pHMClient = NULL;
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("pHMClient connect fail!");
-	}
-
-	if (pHMClient)
-	{
-		HealthManagerService_RealCheck_Req req;
-		req.name = GetEntityName();
-		HealthManagerService_RealCheck_Ans ans;
-		DWORD Timeout = 500;
-		Error = pHMClient->RealCheck(req,ans,Timeout);
-		if (Error!=Error_Succeed){
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("RealSelfcheck fail!");
-		}
-	}
-
-	LogWarn(Severity_Middle, Error_Debug, LOG_EVT_ENTITY_RESTART, "sales record entity self restart.");
-
-	return Error;
-}
-
-bool IsMatchedVideo(WIN32_FIND_DATA fileData)
-{
-	bool bRet = false;
-	
-	if ('S' == fileData.cFileName[0] || 'W' == fileData.cFileName[0]){
-		SYSTEMTIME sysTime;
-		FileTimeToSystemTime(&fileData.ftCreationTime, &sysTime);
-		//DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("File %s create data info is %d %d %d.", fileData.cFileName, sysTime.wYear, sysTime.wMonth, sysTime.wDay);
-		if ((2020 == sysTime.wYear) && (sysTime.wMonth == 1)){
-			if (sysTime.wDay >= 3 && sysTime.wDay <= 10){
-				bRet = true;
-			}
-		}
-	}
-	
-	return bRet;
-}
-
-void CSalesRecorderEntity::UploadTempPathVideos()
-{
-	CSimpleStringA sourPath;
-	CSimpleStringA destPath;
-	ErrorCodeEnum Error = GetFunction()->GetPath("Temp", sourPath);
-	Error = GetFunction()->GetPath("UploadVideo", destPath);
-	
-	if (sourPath.GetLength() > 0 && sourPath[sourPath.GetLength()-1] != SPLIT_SLASH) {
-		sourPath += SPLIT_SLASH_STR;
-	}
-
-	if (destPath.GetLength() > 0 && destPath[destPath.GetLength()-1] != SPLIT_SLASH) {
-		destPath += SPLIT_SLASH_STR;
-	}
-
-	if(Error == Error_Succeed)
-	{
-		char srcFilePath[MAX_PATH]={0};
-		WIN32_FIND_DATA FindFileData;
-		HANDLE hFind;
-		BOOL fFinished = FALSE;
-		sprintf_s(srcFilePath, MAX_PATH, "%s*.%s", sourPath, m_eRecordType == eMP4 ? RECORD_MP4_SUFFIX : RECORD_WMV_SUFFIX);
-
-		hFind = FindFirstFile(srcFilePath, &FindFileData);
-
-		if (INVALID_HANDLE_VALUE != hFind)
-		{
-			while (!fFinished)
-			{
-				if (FILE_ATTRIBUTE_DIRECTORY & FindFileData.dwFileAttributes)
-				{
-					continue;
-				}
-
-				if (IsMatchedVideo(FindFileData)){
-					CSimpleStringA sourFileName = CSimpleStringA::Format("%s%s", (LPCSTR)sourPath, FindFileData.cFileName);
-					CSimpleStringA destFileName = CSimpleStringA::Format("%sBAK_%s", (LPCSTR)destPath, FindFileData.cFileName);
-					if(!MoveFile((LPCSTR)sourFileName, (LPCSTR)destFileName)) {
-						DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Error Code %lu while move %s ", GetLastError(), (LPCSTR)sourFileName);
-					}
-				}
-				else{
-					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("File (%s) is not matched.", FindFileData.cFileName);
-				}
-
-				if (!FindNextFile(hFind, &FindFileData))
-				{
-					if (GetLastError() == ERROR_NO_MORE_FILES)
-					{
-						fFinished = TRUE;
-					}
-					else
-					{
-						break;
-					}
-				}
-			}
-			FindClose(hFind);
-		}
-	}	
-}
-
-
-int CSalesRecorderEntity::GetSystemMemoryUsage()
-{
-
-	// Use to convert bytes to KB
-#define DIV 1024
-
-	MEMORYSTATUSEX statex;
-
-	statex.dwLength = sizeof (statex);
-
-	GlobalMemoryStatusEx (&statex);
-
-	return statex.dwMemoryLoad;
-}
-
-
-double CSalesRecorderEntity::GetSystemCpuUsage()
-{
-	double ratio = 0;
-#define _WIN32_WINNT   0x0601
-	FILETIME idleTime,kernelTime,userTime;
-	BOOL ret = GetSystemTimes(&idleTime,&kernelTime,&userTime);
-	if (ret == 0)
-	{
-		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("GetSystemCPUStatus.GetSystemTimes failed(%d).",GetLastError());
-		return 80.0;
-	}
-	__int64  xIdle,xKernel,xUser;
-	xIdle = idleTime.dwHighDateTime;
-	xIdle <<= 32;
-	xIdle |= idleTime.dwLowDateTime;
-	xKernel = kernelTime.dwHighDateTime;
-	xKernel <<= 32;
-	xKernel |= kernelTime.dwLowDateTime;
-	xUser = userTime.dwHighDateTime;
-	xUser <<= 32;
-	xUser |= userTime.dwLowDateTime;
-
-	if (m_xIdlePre != 0)
-	{
-		__int64 xI,xK,xU;
-		xI = xIdle - m_xIdlePre;
-		xK = xKernel - m_xKernelPre;
-		xU = xUser - m_xUserPre;
-		
-		if ((xK +xU) != 0)
-			ratio = (xK - xI + xU) * 100 / (xK + xU);
-	}
-	m_xIdlePre = xIdle;
-	m_xKernelPre = xKernel;
-	m_xUserPre = xUser;
-
-	return ratio;
-}
-
-
-ErrorCodeEnum CSalesRecorderEntity::SetRecordAudioQuality(int iAudioQuality)
-{
-	ErrorCodeEnum eRet = Error_Succeed;
-
-	switch (iAudioQuality)
-	{
-	case 1:
-		m_eAudioOutQuality = eLowDefinition;
-		break;
-	case 2:
-		m_eAudioOutQuality = eStandardDefinition;
-		break;
-	case 3:
-		m_eAudioOutQuality = eHighDefinition;
-		break;
-	case 4:
-		m_eAudioOutQuality = eUltraHD;
-		break;
-	default:
-		m_eAudioOutQuality = eUltraHD;
-		break;
-	}
-
-	return eRet;
-}
-
-
-ErrorCodeEnum CSalesRecorderEntity::SetRecordAudioNsPolicy(int iNsPolicy)
-{
-	ErrorCodeEnum eRet = Error_Succeed;
-
-	if (1 == iNsPolicy || 3 == iNsPolicy){
-		m_iAudioNsPolicy = iNsPolicy;
-	}
-	else{
-		m_iAudioNsPolicy = 2;
-	}
-
-	return eRet;
-}
-
-
-ErrorCodeEnum CSalesRecorderEntity::SetRecordAudioChannles(int iAudioChannles)
-{
-	ErrorCodeEnum eRet = Error_Succeed;
-
-	m_iAudioChannels = 2;
-
-	return eRet;
-}
-
-
-DeviceTypeEnum CSalesRecorderEntity::RvcGetDeviceType()
-{
-	DeviceTypeEnum eType = eStand2sType;
-	CSmartPointer<IEntityFunction> spFunction = GetFunction();
-	CSystemStaticInfo stStaticinfo;
-	spFunction->GetSystemStaticInfo(stStaticinfo);
-	m_terminalNo = stStaticinfo.strTerminalID;
-	if (_stricmp(stStaticinfo.strMachineType, "RVC.Stand1SPlus") == 0) {
-		eType = eStand1SPlusType;
-	}
-	else if (stricmp(stStaticinfo.strMachineType, "RVC.CardStore") == 0 || stricmp(stStaticinfo.strMachineType, "RVC.CardPrinter") == 0) {
-		eType = eCardStore;
-	}
-	else {
-		eType = eStand2sType;
-	}
-
-	if (eType >= 0 && eType < sizeof(Device_Type_Table) / sizeof(char*)) {
-		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("device type is %s.", Device_Type_Table[eType]);
-	}
-
-	return eType;
-}
-
-
-
-ErrorCodeEnum CSalesRecorderEntity::AddToSalesRecordList(const char* videopath, const char* strfilename, unsigned long ufilesize)
-{
-	ErrorCodeEnum Error = Error_Failed;
-	if (NULL == videopath || NULL == strfilename) {
-		return Error;
-	}
-
-	record_item_t* item = new record_item_t();
-
-	item->file_path = videopath;
-
-	item->file_length = (int)ufilesize;
-
-	item->file_name = strfilename;
-	
-	m_vRecordList.push_back(*item);
-
-	Error = Error_Succeed;
-
-	return Error;
-}
-
-ErrorCodeEnum CSalesRecorderEntity::PostSalesRecordInfos()
-{
-	ErrorCodeEnum Error = Error_Failed;
-
-	char strtimenow[MAX_PATH] = { 0 };
-	y2k_time_t nowtime = y2k_time_now();
-	y2k_to_string(nowtime, strtimenow, MAX_PATH);
-
-	video_record_info_t video_params;
-	video_params.strServerURL = m_strHttpServerAddr;
-	video_params.strAPI = m_strHttpServerAPI;
-	video_params.strAppVersion = m_strAppVersion;
-	video_params.strRecordEndTime = strtimenow;
-
-	video_params.strTerminalNo = m_strTerminalId;
-
-	video_params.iBusinessStatus = (int)m_eBusinessStatus;
-	if (eFailed == m_eBusinessStatus) {
-		if (m_vRecordList.size() > 0) {
-			video_params.iBusinessStatus = eInterrupt;
-		}
-	}
-
-	video_params.strRecordID = m_SalesVideoName + strlen(RVC_SALES_RECORD_SUFFIX);
-	for (vector<record_item_t>::iterator it = m_vRecordList.begin(); it < m_vRecordList.end(); ++it) {
-		video_params.vRecordList.push_back(*it);
-	}
-
-	unsigned int uposttime = 0;
-	CSimpleStringA strErrorMsg("");
-	if (0 == post_video_recordinfo_list(uposttime, strErrorMsg, &video_params, m_iHttpTimeOut, false)) {
-		LogWarn(Severity_Low, Error_Debug, LOG_EVT_POST_SALESRECORD_INFO_COST_TIME, CSimpleStringA::Format("post video record infos cost time is %ums.", uposttime).GetData());
-		Error = Error_Succeed;
-	}
-	else {
-		LogWarn(Severity_Middle, Error_Exception, LOG_EVT_POST_SALESRECORD_INFO_FAILED, strErrorMsg.GetData());
-	}
-
-	m_vRecordList.clear();
-
-	return Error;
-}
-
-
-
-SP_BEGIN_ENTITY_MAP()
-SP_ENTITY(CSalesRecorderEntity)
-SP_END_ENTITY_MAP()