Browse Source

Z991239-5022 #comment feat: merge chromium changes

陈良瑜80374463 1 year ago
parent
commit
07c9908888

+ 65 - 97
Module/mod_chromium/CModTools.cpp

@@ -503,6 +503,26 @@ namespace Chromium {
 #endif //_MSC_VER
 	}
 
+	std::string CModTools::generateInstallCmd(std::string installUrl)
+	{
+#if defined(RVC_OS_LINUX)
+		return generateBrowserCMDForEverything(AdUrl, 1);
+#else
+		CSimpleStringA strChromiumPath = GetCefHead(this->m_pEntity), strCmdLine = "";
+		strCmdLine.Append(strChromiumPath).Append(" --url=").Append(installUrl.c_str());
+		CSimpleStringA cachePath;
+		this->m_pEntity->GetFunction()->GetPath("Temp", cachePath);
+		cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("cefCache_").Append(m_strCacheHead.length() > 0 ? m_strCacheHead.c_str() : "").Append((+ERR_PAGE_REASON::Ad)._to_string());
+		strCmdLine.Append(" --cache-path=").Append(cachePath);
+		strCmdLine.Append(" --no-sandbox");
+		strCmdLine.Append(" --hide-controls");
+		strCmdLine.Append(" --hide-tabs");
+		strCmdLine.Append(" --logextend=").Append((+PAGE_TYPE::Install)._to_string());
+		DbgEx("cmdline : %s", strCmdLine.GetData());
+		return strCmdLine.GetData();
+#endif //RVC_OS_LINUX
+	}
+
 	std::string CModTools::generateSpecialPageFromOtherEntityCmd(std::string mainUrl)
 	{
 #if defined(RVC_OS_WIN)
@@ -675,7 +695,7 @@ namespace Chromium {
 			g_mutexFreerdp.unlock();
 			});
 
-		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("start browser %d", reason._to_integral());
+		DbgEx("start browser %d", reason._to_integral());
 
 		if (reason._to_integral() == ERR_PAGE_REASON::main)
 		{
@@ -723,7 +743,7 @@ namespace Chromium {
 	        if (Error_Succeed == openCefRet.first)
 	            return std::make_pair(Error_Succeed, openCefRet.second);
 		 	else 
-				DbgEx("open cef for OutsideRequest failed: %d", openCefRet.first);
+				DbgEx("open cef for %s failed: %d", reason._to_string(), openCefRet.first);
 	    }
 		 else if (reason._to_integral() == ERR_PAGE_REASON::SpecialPageFromOtherEntity)
 		{
@@ -732,7 +752,37 @@ namespace Chromium {
 			if (Error_Succeed == openCefRet.first)
 				return std::make_pair(Error_Succeed, openCefRet.second);
 			else
-				Dbg("open cef for SpecialPageFromOtherEntity failed: %d", openCefRet.first);
+				DbgEx("open cef for %s failed: %d", reason._to_string(), openCefRet.first);
+		}
+		 else if (reason._to_integral() == ERR_PAGE_REASON::Install)
+		{
+			std::vector<std::string> installUrls;
+#ifdef DEVOPS_ON_ST /*DevOps流水线编译,ST环境*/
+			installUrls.push_back("http://deviceinstallweb.paasst.cmbchina.cn");
+			installUrls.push_back("http://deviceinstallweb.paasst.cmbchina.com");
+#elif defined(DEVOPS_ON_UAT)/*DevOps流水线编译,UAT环境*/
+			installUrls.push_back("http://deviceinstallweb.paasuat.cmbchina.cn");
+			installUrls.push_back("http://deviceinstallweb.paasuat.cmbchina.com");
+#elif defined(DEVOPS_ON_PRD)/*DevOps流水线编译,PRD环境*/
+			installUrls.push_back("http://deviceinstallweb.paas.cmbchina.cn");
+			installUrls.push_back("http://deviceinstallweb.paas.cmbchina.com");
+#else/*本地编译等非DevOps环境编译的版本*/
+			installUrls.push_back("http://deviceinstallweb.paasst.cmbchina.cn");
+			installUrls.push_back("http://deviceinstallweb.paasst.cmbchina.com");
+#endif
+			auto checkRet = DetectActiveHttp(installUrls);
+			if (!checkRet.first)
+			{
+				LogWarn(Severity_High, Error_NetBroken, LOG_WARN_CHROMIUM_INSTALL_URLS_CHECK,
+					CSimpleString::Format("install page check err, can not connect to %s or %s", installUrls[0].c_str(), installUrls[1].c_str()).GetData());
+			}
+			std::string dstInstallUrl = checkRet.first ? checkRet.second : installUrls[0];
+			auto strCmdLine = generateInstallCmd(dstInstallUrl);
+			auto openCefRet = openCef(strCmdLine, false);
+			if (Error_Succeed == openCefRet.first)
+				return std::make_pair(Error_Succeed, openCefRet.second);
+			else
+				Dbg("open cef for %s failed: %d", reason._to_string(), openCefRet.first);
 		}
 		else
 		{
@@ -850,96 +900,6 @@ namespace Chromium {
 		return false;
 	}
 
-	TradeManageCodeEnum CModTools::CheckJobLimited()
-	{
-		if (!isOutsidePad())
-		{
-			return TradeManageCodeEnum::Undefined;
-		}
-		CSmartPointer<IConfigInfo> spConfig;
-		ErrorCodeEnum BootTimeCfgError = m_pEntity->GetFunction()->OpenConfig(Config_Run, spConfig);
-		CSimpleStringA strLastRecordTime = "", strControl = "", strExpirationDate = "";
-		time_t now = time(0);
-		localtime(&now);
-		ErrorCodeEnum errorRead = Error_Succeed;
-		if (Error_Succeed != spConfig->ReadConfigValue("Record", "LastRecordTime", strLastRecordTime))
-		{
-			DbgEx("Read Record LastRecordTime -> Failed! Maybe LastRecordTime not exist!");
-			strLastRecordTime = "";
-		}
-
-		if (Error_Succeed != spConfig->ReadConfigValue("Record", "Control", strControl))
-		{
-			DbgEx("Read Record Control -> Failed! Maybe Control not exist!");
-			strControl = "";
-		}
-
-		if (Error_Succeed != spConfig->ReadConfigValue("Record", "ExpirationDate", strExpirationDate))
-		{
-			DbgEx("Read Record ExpirationDate -> Failed! Maybe ExpirationDate not exist!");
-			strExpirationDate = "";
-		}
-		if (strControl.Compare("on") == 0)
-		{
-			// 控制标识为on时,检查过期时间,过期时间之前都设置为启用
-			if (strExpirationDate == "")
-			{
-				DbgEx("CheckJobLimited -> on -> strExpirationDate=null ");
-				setLimitReason("");
-				return TradeManageCodeEnum::Trade;
-			}
-			int timestamp_expiration = StandardToStamp(strExpirationDate.Append(" 23:59:59"), false);
-
-			if (now < timestamp_expiration)
-			{
-				// 过期之前都可以进行交易
-				DbgEx("CheckJobLimited -> on -> strExpirationDate>now ");
-				setLimitReason("");
-				return TradeManageCodeEnum::Trade;
-			}
-			else {
-				// 过期之后 设置为normal
-				spConfig->WriteConfigValue("Record", "Control", "normal");
-				strControl = "normal";
-				DbgEx("CheckJobLimited -> on -> strExpirationDate<now -> control to normal");
-			}
-		}
-
-		if (strControl.Compare("off") == 0)
-		{
-			// 展示交易暂停页面
-			DbgEx("CheckJobLimited -> off ");
-			setLimitReason("disabled");
-			return TradeManageCodeEnum::Disabled;
-		}
-
-		if (strControl.Compare("normal") == 0 || strControl.IsNullOrEmpty())
-		{
-			if (strLastRecordTime == "")
-			{
-				DbgEx("CheckJobLimited -> normal -> strLastRecordTime=null ");
-				setLimitReason("");
-				return TradeManageCodeEnum::Trade;
-			}
-			int timestamp_lastRecordTime = StandardToStamp(strLastRecordTime, true);
-
-			if (now < timestamp_lastRecordTime + 3600 * 24 * 2)
-			{
-				DbgEx("CheckJobLimited -> normal -> now < lastRecordTime + 3600*24*2 ");
-				setLimitReason("");
-				return TradeManageCodeEnum::Trade;
-			}
-			else if (CheckTradeRecord()) {
-				// 展示交易暂停页面
-				DbgEx("CheckJobLimited -> normal -> now < CheckTradeRecord = true ");
-				setLimitReason("jobuncomplete");
-				return TradeManageCodeEnum::JobUncomplete;
-			}
-		}
-		// 理论上不会流转到这里来
-		setLimitReason("");
-		return TradeManageCodeEnum::Trade;
-	}
 
 	bool CModTools::findRestartCode(DWORD userCode) {
 		DWORD authArr_noretry_norestart[] = ERRARR_ACCESSAUTH_NORETRY_NORESTART;
@@ -1165,20 +1125,28 @@ namespace Chromium {
 		return std::make_pair(Error_Succeed, 0);
 	}
 
-	void CModTools::RestartProxyServer() {
+	bool CModTools::RestartProxyServer() {
 		// start tcp bridge service
 		ErrorCodeEnum Error;
 		CSmartPointer<IEntityFunction> spEntityFunction = this->m_pEntity->GetFunction();
 		Error = spEntityFunction->StopTcpBridgeServer();
 
 		if (Error != Error_Succeed)
-			LOG_TRACE("stop tcp bridge server failed! error = %d", Error);
+		{
+			DbgEx("stop tcp bridge server failed! error = %d", Error);
+			return false;
+		}
+			
 
 		Error = spEntityFunction->StartTcpBridgeServer(4504);
 
 		if (Error != Error_Succeed)
-			LOG_TRACE("start tcp bridge server failed! error = %d", Error);
-		return;
+		{
+			DbgEx("start tcp bridge server failed! error = %d", Error);
+			return false;
+		}
+			
+		return true;
 	}
 
 	std::tuple<CSimpleStringA, CSimpleStringA, CSimpleStringA, CSimpleStringA, CSimpleStringA> CModTools::ReadCenterConfigStr(CSimpleStringA entityName) {

+ 5 - 5
Module/mod_chromium/CModTools.h

@@ -20,9 +20,9 @@
 namespace Chromium {
 
 	BETTER_ENUM(ERR_PAGE_REASON, int, CameraConfig, CardStoreIsBusy, MachineTypeError, TerminalManagerKickOut,
-		TerminalManagerOff, breakdown, warnPrompt, disabled, jobuncomplete, ErrNotify, main, Ad, extend, OutsideRequest, SpecialPageFromOtherEntity)
+		TerminalManagerOff, breakdown, warnPrompt, disabled, jobuncomplete, ErrNotify, main, Ad, extend, OutsideRequest, SpecialPageFromOtherEntity, Install)
 
-		BETTER_ENUM(PAGE_TYPE, int, Deploy, CameraConfig, TerminalManager, errPage, Ad, slv, init, TradeManager, breakdown, extend, CardStoreIsBusy)
+		BETTER_ENUM(PAGE_TYPE, int, Deploy, CameraConfig, TerminalManager, errPage, Ad, slv, init, TradeManager, breakdown, extend, CardStoreIsBusy, Install)
 
 		BETTER_ENUM(TradeManageCodeEnum, int, Undefined, Trade, JobUncomplete, Disabled)
 
@@ -43,8 +43,7 @@ namespace Chromium {
 		bool killAllChromium();	//通过taskkill 关闭掉所有的cefclient
 		void killAllChromiumByThread(int seconds);
 		bool killChromiumByName(std::string name);
-		void RestartProxyServer();
-		TradeManageCodeEnum CheckJobLimited();
+		bool RestartProxyServer();
 		void setWithMin(bool t_withMin) { m_withMin = t_withMin; };
 		void setWithClose(bool t_withClose) { m_withClose = t_withClose; };
 		void setWithDebugMode(bool t_withDebugMode) { m_withDebugMode = t_withDebugMode; };
@@ -78,6 +77,7 @@ namespace Chromium {
 		std::string generateCefclientCmd(bool isExtend, std::string mainUrl);
 #endif //RVC_OS_WIN
 		std::string generateMainCmd(std::string mainUrl);
+		std::string generateInstallCmd(std::string installUrl);
 		std::string generateAdCmd(std::string AdUrl);
 		std::string generateSpecialPageFromOtherEntityCmd(std::string mainUrl);
 #if defined(RVC_OS_LINUX)
@@ -99,7 +99,7 @@ namespace Chromium {
 		std::pair<bool, std::string> GenerateErrPage(ERR_PAGE_REASON errType,
 			std::tuple < std::string, std::string> norParam, std::tuple<std::string, std::string, std::string, DWORD, DWORD> exParam);
 #if defined(_MSC_VER)
-        std::pair<ErrorCodeEnum, int> openCef(std::string cmdline, bool isGuard = true, bool usingSystemCmd = true);
+        std::pair<ErrorCodeEnum, int> openCef(std::string cmdline, bool isGuard = false, bool usingSystemCmd = true);
 #else
         std::pair<ErrorCodeEnum, int> openCef(std::string cmdline, bool isGuard = false, bool usingSystemCmd = false);
 #endif //_MSC_VER

+ 18 - 6
Module/mod_chromium/CSocketClient.cpp

@@ -17,12 +17,18 @@ using boost::asio::ip::tcp;
 
 
 bool checkHttpThreadFun(const std::string url) {
+
+#if defined(RVC_OS_WIN)
 	return checkHttpActive(url.c_str());
+#else
+	string msg;
+	int curFlag = HttpProbe(csHttAddr.GetData(), msg, 5);
+	return curFlag > 0 && curFlag < 400;
+#endif // #if defined(RVC_OS_WIN)
 }
 
 std::pair<bool, std::string> DetectActiveHttp(std::vector<std::string> urlArr)
 {
-	return std::make_pair(true, urlArr[0]);
 	try {
 		std::vector<boost::shared_future<bool>> threadArr;
 #if (defined _WIN32 || defined _WIN64)
@@ -135,9 +141,7 @@ namespace Chromium {
 
 	ErrorCodeEnum CSocketClient::StartSocketService() {
 		if (NULL == m_pNetThread)
-		{
 			m_pNetThread = new boost::thread(boost::bind(&CSocketClient::thread_recv, this));
-		}
 
 		return Error_Succeed;
 	}
@@ -176,9 +180,13 @@ namespace Chromium {
 
 	ErrorCodeEnum CSocketClient::Reconnect()
 	{
+		/*
 		boost::system::error_code ec;
 		DbgEx("CSocketClient method -> reconnect thread_id = %ld, object=%ld", boost::this_thread::get_id(), this);
-		CModTools::get_mutable_instance().RestartProxyServer();
+		if (!CModTools::get_mutable_instance().RestartProxyServer())
+			return Error_Unexpect;
+		m_psocket->close();
+		
 		m_psocket->connect(m_ep, ec);
 		if (ec)
 		{
@@ -190,6 +198,7 @@ namespace Chromium {
 			if (ec)return Error_IO;
 		}
 		DbgEx("CSocketClient method -> reconnect  succeed!");
+		*/
 		return Error_Succeed;
 	}
 
@@ -239,7 +248,7 @@ namespace Chromium {
 			CMessage msg(MAX_TRANSFER_LEN);	//以能传输1MB数据为目标
 			bool isFindMsg = true;
 
-			while (true)
+			while (!boost::this_thread::interruption_requested())
 			{
 				boost::this_thread::sleep(boost::posix_time::milliseconds(isFindMsg ? 1 : 5));
 				boost::system::error_code ec;
@@ -266,7 +275,7 @@ namespace Chromium {
 				else if (sel < 0 && errno != EINTR) {
 					// select error
 					DbgEx("select error sel = %d", sel);
-					ErrorCodeEnum ec = this->Reconnect();
+					ErrorCodeEnum ec = (boost::this_thread::interruption_requested() ? ErrorCodeEnum::Error_Succeed :this->Reconnect());
 					if (Error_Succeed != ec)
 					{
 						DbgEx("Socket select error and reconnect failed. Restart this entity please!");
@@ -296,6 +305,9 @@ namespace Chromium {
 					if (0 >= len || len > MAX_TRANSFER_LEN)
 					{
 						DbgEx("socket has been closed! cur Len: %d, may make the read buffer err");
+						if (!boost::this_thread::interruption_requested())
+							break;
+							
 						this->Reconnect();
 						boost::this_thread::sleep(boost::posix_time::milliseconds(100));
 					}

+ 108 - 8
Module/mod_chromium/CWebsocketServer.cpp

@@ -189,12 +189,16 @@ namespace Chromium {
 			switch (messageType)
 			{
 			case METHOD_SYSTEM_LOG_DEBUG:
+			case METHOD_SYSTEM_DETAIL_LOG_DEBUG:
 				return LOG_LEVEL_DEBUG;
 			case METHOD_SYSTEM_LOG_INFO:
+			case METHOD_SYSTEM_DETAIL_LOG_INFO:
 				return LOG_LEVEL_INFO;
 			case METHOD_SYSTEM_LOG_WARN:
+			case METHOD_SYSTEM_DETAIL_LOG_WARN:
 				return LOG_LEVEL_WARN;
 			case METHOD_SYSTEM_LOG_ERROR:
+			case METHOD_SYSTEM_DETAIL_LOG_ERROR:
 				return LOG_LEVEL_ERROR;
 			default:
 				return LOG_LEVEL_DEBUG;
@@ -218,6 +222,100 @@ namespace Chromium {
 				.withLogProducer(logProducer).setAPI("logMsg").withExtendLog(false).setResultMsg(msg.second.GetData())();
 			break;
 		}
+		case METHOD_SYSTEM_DETAIL_LOG_DEBUG:
+		case METHOD_SYSTEM_DETAIL_LOG_INFO:
+		case METHOD_SYSTEM_DETAIL_LOG_WARN:
+		case METHOD_SYSTEM_DETAIL_LOG_ERROR:
+		{
+			const char* msg_nodeName = "ResultMsg";
+			const char* msg_EntityName = "EntityName";
+			const char* msg_logType = "LogType";
+			const char* msg_CostTime = "CostTime";
+			const char* msg_ResultCode = "ResultCode";
+			const char* msg_LogCode = "LogCode";
+			const char* msg_API = "API";
+			const char* msg_SourceType = "SourceType";
+			const char* msg_BussID = "BussID";
+			const char* msg_TipMsg = "TipMsg";
+			const char* msg_BeginTime = "BeginTime";
+			const char* msg_EndTime = "EndTime";
+
+
+			auto msg = json_deal::getStringFromCjsonObj(pJson.get(), msg_nodeName);
+			if (!msg.first)//must have
+			{
+				DbgEx("do not has node %s", msg_nodeName);
+				break;
+			}
+			auto t_entityName = json_deal::getStringFromCjsonObj(pJson.get(), msg_EntityName);
+			if(!t_entityName.first)
+			{
+				DbgEx("do not has node %s", msg_EntityName);
+				break;
+			}
+
+			//create the logProduer if not exist
+			if (g_logProducerArr.find(t_entityName.second.GetData()) == g_logProducerArr.end())//can not find the logProducer
+			{
+				void *t_producer = create_log_producer_storage(t_entityName.second.GetData(), "0", "");
+				if (!t_producer)
+				{
+					DbgEx("create producer failed, %s", t_entityName.second.GetData());
+					break;
+				}
+				g_logProducerArr.insert(std::make_pair(t_entityName.second.GetData(), t_producer));
+			}
+			auto t_logProducer = g_logProducerArr[t_entityName.second.GetData()];
+
+
+			auto logType = json_deal::getStringFromCjsonObj(pJson.get(), msg_logType);//it can be equal to Sys/User
+			LOG_TYPE_E t_type = (logType.second.Compare("User", true) == 0) ? LOG_TYPE_BUSINESS_USER : LOG_TYPE_BUSINESS_SYSTEM;
+
+			//通过变量方式进行处理
+			DbgWithLink t_obj(changeMessageTypeToLogLevel(messageType), t_type);
+			t_obj.withExtendLog(false);
+			t_obj.withLogProducer(t_logProducer);
+			t_obj.setResultMsg(msg.second.GetData());
+			
+			auto t_costTime = json_deal::getIntergerFromCjsonObj(pJson.get(), msg_CostTime);
+			if (t_costTime.first)
+				t_obj.setCostTime(t_costTime.second);
+
+			auto t_resultCode = json_deal::getStringFromCjsonObj(pJson.get(), msg_ResultCode);
+			if (t_resultCode.first)
+				t_obj.setResultCode(t_resultCode.second.GetData());
+
+			auto t_logcode = json_deal::getStringFromCjsonObj(pJson.get(), msg_LogCode);
+			if (t_logcode.first)
+				t_obj.setLogCode(t_logcode.second.GetData());
+
+			auto t_api = json_deal::getStringFromCjsonObj(pJson.get(), msg_API);
+			if (t_api.first)
+				t_obj.setAPI(t_api.second.GetData());
+
+			auto t_sourceType = json_deal::getStringFromCjsonObj(pJson.get(), msg_SourceType);
+			if (t_sourceType.first)
+				t_obj.setSourceType(t_sourceType.second.GetData());
+
+			auto t_BussID = json_deal::getStringFromCjsonObj(pJson.get(), msg_BussID);
+			if (t_BussID.first)
+				t_obj.setBussID(t_BussID.second.GetData());
+
+			auto t_TipMsg = json_deal::getStringFromCjsonObj(pJson.get(), msg_TipMsg);
+			if (t_TipMsg.first)
+				t_obj.setTipMsg(t_TipMsg.second.GetData());
+
+			auto t_BeginTime = json_deal::getIntergerFromCjsonObj(pJson.get(), msg_BeginTime);
+			if (t_BeginTime.first)
+				t_obj.setBeginTime(t_BeginTime.second);
+
+			auto t_EndTime = json_deal::getIntergerFromCjsonObj(pJson.get(), msg_EndTime);
+			if (t_EndTime.first)
+				t_obj.setEndTime(t_EndTime.second);
+
+			t_obj();
+			break;
+		}
 
 		case METHOD_BEIDOU_LOG:
 		{
@@ -568,7 +666,7 @@ namespace Chromium {
 
 		// Start the Asio io_service run loop
 		DbgEx("Start the Asio io_service run loop");
-		while (true)
+		while (!boost::this_thread::interruption_requested())
 		{
 			try
 			{
@@ -607,11 +705,13 @@ namespace Chromium {
 		};
 
 
-		while (true)
+		while (!boost::this_thread::interruption_requested())
 		{
 			try
 			{
 				boost::this_thread::sleep_for(boost::chrono::seconds(10));
+				if (boost::this_thread::interruption_requested())
+					break;
 				auto unlinkArr = m_esm->queryUnLinkSession();
 				boost::lock_guard<boost::mutex> lock(m_dealMsgLock);
 				std::string breakEntityStr = "";
@@ -670,8 +770,8 @@ namespace Chromium {
 	void CWebsocketServer::run() {
 		DbgEx("CWebsocketServer -> run");
 
-		boost::thread thread1(boost::bind(&CWebsocketServer::do_run, this));
-		boost::thread thread2(boost::bind(&CWebsocketServer::do_relink, this));
+		m_doRunThread = boost::thread(boost::bind(&CWebsocketServer::do_run, this));
+		m_doReLinkThread = boost::thread(boost::bind(&CWebsocketServer::do_relink, this));
 
 	}
 
@@ -756,7 +856,7 @@ namespace Chromium {
 	void CWebsocketServer::do_sendJson(std::string js, int messageType, int hdlID, unsigned int id)
 	{
 		js = restroreTransId(js);
-		if(messageType != MessageType::RequestAck)
+		if(messageType != MessageType::RequestAck && messageType != MessageType::Event)//do not upload message which messageType equals to RequestAck or Event
 			DbgEx("WebSocket Search message_from_socket : json = %s", js.c_str());
 		if (js.empty())
 		{
@@ -827,7 +927,7 @@ namespace Chromium {
 
 		unsigned int hdlID = 0;
 		std::vector<std::pair<int, int>> sendArr;
-		if (8 == msg.getMessageType())
+		if (MessageType::Event == msg.getMessageType())
 		{
 			m_esm->AskProcessEvent(&msg, sendArr);
 			if (sendArr.size() == 0)
@@ -839,7 +939,7 @@ namespace Chromium {
 				do_sendJson(js, msg.getMessageType(), i->second, id);
 			}
 		}
-		else if (2 == msg.getMessageType())	//session end
+		else if (MessageType::EndSession == msg.getMessageType())	//session end
 		{
 			int sessionId = msg.getTransID();
 
@@ -850,7 +950,7 @@ namespace Chromium {
 				DbgEx("MessgeType:%s, detect session %d lost!remove failed", GetMessageTypeString(2).c_str(), sessionId);
 
 		}
-		else if (5 == msg.getMessageType())
+		else if (MessageType::SessionAck == msg.getMessageType())
 		{//sessionAck
 			auto ret = m_esm->AskProcessSession(&msg, hdlID);
 			auto sessionId = msg.getSessionID();

+ 10 - 3
Module/mod_chromium/CWebsocketServer.h

@@ -22,11 +22,17 @@ namespace Chromium {
 	class CWebsocketServer : public ISocketCallback {
 	public:
 		CWebsocketServer(const char* strPath, CEntityBase* m_pEntity);
-		~CWebsocketServer()
-		{
+		
+		static void stopServer() {
 			m_wsserver.stop();
 		}
-		static void stopServer() {
+
+		~CWebsocketServer()
+		{
+			m_doRunThread.interrupt();
+			m_doReLinkThread.interrupt();
+			m_doRunThread.join();
+			m_doReLinkThread.join();
 			m_wsserver.stop();
 		}
 
@@ -75,6 +81,7 @@ namespace Chromium {
 		CSocketClient* m_socket;
 		EntitySessionManager* m_esm;
 		boost::asio::io_service m_ios;
+		boost::thread m_doRunThread, m_doReLinkThread;
 		std::map<unsigned int, websocketpp::connection_hdl> m_connection_hdls;
 		std::map<std::string, std::vector<std::pair<websocketpp::connection_hdl, std::string>> > m_msg_pool;
 		std::map<std::string, std::string> m_entityAndClass;//不知道为什么不能用map<string,map<>>,猜测应该是websocketpp::connection_hdl生成问题

+ 12 - 0
Module/mod_chromium/MessageType.cpp

@@ -34,6 +34,10 @@ std::string GetMessageTypeString(int messageType) {
 		CASE(METHOD_SYSTEM_LOG_INFO);
 		CASE(METHOD_SYSTEM_LOG_WARN);
 		CASE(METHOD_SYSTEM_LOG_ERROR);
+		CASE(METHOD_SYSTEM_DETAIL_LOG_DEBUG);
+		CASE(METHOD_SYSTEM_DETAIL_LOG_INFO);
+		CASE(METHOD_SYSTEM_DETAIL_LOG_WARN);
+		CASE(METHOD_SYSTEM_DETAIL_LOG_ERROR);
 		CASE(METHOD_BEIDOU_LOG);
 		CASE(METHOD_SYSTEM_END);
 	default:
@@ -96,6 +100,14 @@ std::string GetMessageTypeString(int messageType) {
 		return "METHOD_SYSTEM_LOG_WARN";
 	case METHOD_SYSTEM_LOG_ERROR:
 		return "METHOD_SYSTEM_LOG_ERROR";
+	case METHOD_SYSTEM_DETAIL_LOG_DEBUG:
+		return "METHOD_SYSTEM_DETAIL_LOG_DEBUG";
+	case METHOD_SYSTEM_DETAIL_LOG_INFO:
+		return "METHOD_SYSTEM_DETAIL_LOG_INFO";
+	case METHOD_SYSTEM_DETAIL_LOG_WARN:
+		return "METHOD_SYSTEM_DETAIL_LOG_WARN";
+	case METHOD_SYSTEM_DETAIL_LOG_ERROR:
+		return "METHOD_SYSTEM_DETAIL_LOG_ERROR";
 	case METHOD_BEIDOU_LOG:
 		return "METHOD_BEIDOU_LOG";
 	case METHOD_SYSTEM_END:

+ 39 - 1
Module/mod_chromium/MessageType.h

@@ -37,6 +37,10 @@ enum MessageType : int
 	METHOD_SYSTEM_LOG_INFO,
 	METHOD_SYSTEM_LOG_WARN,
 	METHOD_SYSTEM_LOG_ERROR,
+	METHOD_SYSTEM_DETAIL_LOG_DEBUG,
+	METHOD_SYSTEM_DETAIL_LOG_INFO,
+	METHOD_SYSTEM_DETAIL_LOG_WARN,
+	METHOD_SYSTEM_DETAIL_LOG_ERROR,
 	METHOD_SYSTEM_END = 0x2FFFFF,
 	METHOD_BEIDOU_LOG = 0x3F0001,
 };
@@ -57,4 +61,38 @@ typedef struct {
 //(1)发现linux下inline有问题,扩展不开(2)存在宏定义拼接时,出现问题
 std::string GetMessageTypeString(int messageType);
 
-#endif
+#endif
+
+/* log detail
+MessageType include:METHOD_SYSTEM_DETAIL_LOG_DEBUG(3080197),	METHOD_SYSTEM_DETAIL_LOG_INFO,	METHOD_SYSTEM_DETAIL_LOG_WARN,	METHOD_SYSTEM_DETAIL_LOG_ERROR,
+{
+	"messageType": 3080198,
+	"EntityName": "postmanpostman",
+	"ResultMsg": "for LogTest from postman",
+	"LogType": "User",
+	"CostTime": 444,
+	"ResultCode": "RTA444444",
+	"LogCode": "ASDASSD",
+	"API": "postman::test",
+	"SourceType": "test.cpp",
+	"BussID":"asdfafwerwqerqwerwerqwerwqerwerwqerwqerqwer",
+	"TipMsg":"fjoawjerfownfojinwiqfneuiwnefionwfnewqionr",
+	"BeginTime":123456,
+	"EndTime":234567
+}
+messageType must have
+EntityName must have, it mean your upload entityName
+ResultMsg must have, it means your log
+LogType Not necessarily needed, if it equals to User, means upload it as LOG_TYPE_USER, otherwise, upload as LOG_TYPE_SYSTEM
+CostTime Not necessarily needed, it means how much time used
+ResultCode Not necessarily needed, Commonly, filling it with error code.
+LogCode Not necessarily needed, Commonly, filling it such as QLR0402402Z00001
+API Not necessarily needed, current API which you are using
+SourceType Not necessarily needed, current file and line when the code is running
+BussID Not necessarily needed,like the beidou
+TipMsg Not necessarily needed,what the msg you desired to show when errors cause
+BegtinTime Not necessarily needed, begin Time
+EndTime Not necessarily needed, end Time
+
+
+*/

+ 1 - 0
Module/mod_chromium/baseEx.cpp

@@ -27,6 +27,7 @@ using namespace boost::interprocess;
 #endif
 
 void* logProducer = nullptr;
+std::map<std::string, void*> g_logProducerArr;
 bool g_useMagic = false;
 bool g_loggerInitSuccess = false;
 bool g_logToFile = true;

+ 2 - 0
Module/mod_chromium/baseEx.h

@@ -2,8 +2,10 @@
 #include "SpBase.h"
 #include<vector>
 #include<string>
+#include<map>
 
 extern void* logProducer;
+extern std::map<std::string, void*> g_logProducerArr;
 extern bool g_useMagic;
 extern bool g_logToFile;
 

+ 56 - 77
Module/mod_chromium/mod_chromium.cpp

@@ -66,7 +66,7 @@ namespace Chromium {
 
 	CChromiumEntity::CChromiumEntity() :m_pWsServer(NULL), m_iTcpBridgePort(4504), m_pTimerListener(NULL), m_strCustomMainUrl(true)
 		, m_runAd(false), m_runMain(false), m_runExtend(false), m_runLogin(false), m_withBrowser(false), m_withMin(false), m_withClose(false)
-		, m_withDebugMode(false), m_withMagic(false), m_withNoFileLog(false)
+		, m_withDebugMode(false), m_withMagic(false), m_withNoFileLog(false), m_installMode(false)
 	{
 		DbgEx("CChromiumEntity constructor");
 
@@ -216,7 +216,8 @@ namespace Chromium {
 #endif // OPEN_PERF
 	}
 
-	void CChromiumEntity::OnPreStart_Init(CAutoArray<CSimpleStringA>& strArgs, CSmartPointer<ITransactionContext>& pTransactionContext) {
+	void CChromiumEntity::OnPreStart_Init(CAutoArray<CSimpleStringA>& strArgs, CSmartPointer<ITransactionContext>& pTransactionContext)
+	{
 #ifdef OPEN_PERF
 		auto profStr = CSimpleString::Format("chromiumAnalyze_%s.prof", generateTimeStr(true).c_str());
 		std::thread([](std::string str) {
@@ -224,20 +225,16 @@ namespace Chromium {
 			DbgEx("Generate chromiumAnalyze, %s", str.c_str());
 			}, profStr.GetData()).detach();
 #endif // OPEN_PERF
-#if (defined _WIN32 || defined _WIN64)
-			CModTools::get_mutable_instance().InitCModTools(this);
-			//CModTools::get_mutable_instance().killAllChromium();
-			//shell启动过程,已经进行了cef的kill操作。这里可能会把启动时间延长很多
-#else
+
+			//init the chrome params from centersetting
 			FetchCustomMainUrl(strArgs);
 			CModTools::get_mutable_instance().InitCModTools(this);
+
+#if defined(RVC_OS_LINUX)
+			// clear all the browser
 			CModTools::get_mutable_instance().killAllChromium();
 			DoBrowserCacheClearJob();
-#endif
 
-#if (defined _WIN32 || defined _WIN64)
-			//SetUnhandledExceptionFilter(&printSEG);
-#else
 			CSimpleStringA strDbgPath;
 			GetFunction()->GetPath("Dbg", strDbgPath);
 			set_traceback_path(strDbgPath.GetData());
@@ -354,20 +351,7 @@ namespace Chromium {
 				{
 					DbgEx("can not open centerSetting, maybe fault");
 				}
-#if (defined _WIN32 || defined _WIN64)
-				if (!logProducer)
-					logProducer = create_log_producer_storage("cefclient_logger", "0", "");
-#else
-				CSimpleString dbgPath;
-				GetFunction()->GetPath("Dbg", dbgPath);
-				std::string dstDbgPath = dbgPath.GetData();
-				dstDbgPath.append(SPLIT_SLASH_STR).append("mod_chromium");
-				if (InitFileLogger(dstDbgPath))
-					DbgToFileLogger("================");
-				else
-					DbgEx("[ERROR]logger init failed!");
 
-#endif
 				CSimpleString translatePath;
 				GetFunction()->GetPath("Cfg", translatePath);
 				translatePath.Append(CSimpleStringA(SPLIT_SLASH_STR) + "UserCodeToMsgTip.ini");
@@ -417,19 +401,8 @@ namespace Chromium {
         }
 #endif //RVC_OS_LINUX
 
-		//与browser进行交互所必须,移除browser的机型不需要订阅browser相关
-		if (m_withBrowser)
+		if (!m_withBrowser)
 		{
-			if (Error_Succeed != (Error = GetFunction()->SubscribeBroadcast("IEBrowser", "CustomerCmd", this, m_uidBrowserListenser))) {
-				DbgEx("subscribe browser CustomerCmd failed!");
-				pTransactionContext->SendAnswer(Error);
-			}
-			else
-				DbgEx("subscribe browser CustomerCmd success!");
-
-			if (Error_Succeed != (Error = GetFunction()->SubscribeLog(m_uidCameraListener, this, Log_Event, Severity_None, Error_IgnoreAll, -1, "CameraConfigManage")))
-				DbgEx("subscribe Camera log failed!"); //非必须
-		} else {//有browser的时候不需要订阅这一堆
 			DbgEx("subscribe AccessAuthorization %s, %d",
 				Error_Succeed == (Error = GetFunction()->SubscribeLog(m_uuidAccessAuth, this, Log_Event, Severity_None, Error_IgnoreAll, -1, "AccessAuthorization")) ? "success" : "failed", Error);
 
@@ -526,8 +499,34 @@ namespace Chromium {
 		DbgEx("open page extend %s, pid:%d", Error_Succeed == openRet.first ? "success" : "fail", openRet.second);
 	}
 
+	void CChromiumEntity::openInstallPage()
+	{
+		LogWarn(Severity_Middle, Error_NotSupport, LOG_WARN_CHROMIUM_INSTALL_NOTSURPORT,
+			CSimpleStringA::Format("Not surport install mode").GetData());
+		return;
+		auto openRet = CModTools::get_mutable_instance().StartChromiumBrowser(ERR_PAGE_REASON::Install);
+		DbgEx("open page install %s, pid:%d", Error_Succeed == openRet.first ? "success" : "fail", openRet.second);
+	}
+
+
 	void CChromiumEntity::startWithCfg()
 	{
+		// init cef logger first
+#if (defined _WIN32 || defined _WIN64)
+		if (!logProducer)
+			logProducer = create_log_producer_storage("cefclient_logger", "0", "");
+#else
+		CSimpleString dbgPath;
+		GetFunction()->GetPath("Dbg", dbgPath);
+		std::string dstDbgPath = dbgPath.GetData();
+		dstDbgPath.append(SPLIT_SLASH_STR).append("mod_chromium");
+		if (InitFileLogger(dstDbgPath))
+			DbgToFileLogger("================");
+		else
+			DbgEx("[ERROR]logger init failed!");
+
+#endif
+		
 		OnPreStart_Init(m_strArgs, m_pTransactionContext);//初始化部分, perf ,killchromium, signal, get custom url
 		if (!OnPreStart_socketStart(m_strArgs, m_pTransactionContext)) {//OnPreStart_socketStart()->new CWebsocketServer(strStructPath, this) 时间过长
 			return;
@@ -551,12 +550,28 @@ namespace Chromium {
 				return;
 			}
 		}
+		else
+			openInstallPage();
 	}
 
 	void CChromiumEntity::OnPreStart(CAutoArray<CSimpleStringA> strArgs, CSmartPointer<ITransactionContext> pTransactionContext)
 	{
 		m_strArgs = strArgs;
 		m_pTransactionContext = pTransactionContext;
+		pTransactionContext->SendAnswer(Error_Succeed);
+
+		//all the init,register,openWeb run thread
+		auto startFun = [&]() {
+			//the system info may be not complete.If the device is not install ,it can't not read the terminalNo.
+			CSystemStaticInfo t_sysInfo;
+			GetFunction()->GetSystemStaticInfo(t_sysInfo);
+			if (t_sysInfo.strTerminalID.GetLength() == 0)// the machine is in install mode, hence start a simple init and open the install page 
+			{
+				m_installMode = true;
+				startWithCfg();
+				return;
+			}
+
 
 		CSimpleStringA t_terminalState;
 		if (ErrorCodeEnum::Error_Succeed == GetFunction()->GetSysVar("TerminalStage", t_terminalState))
@@ -565,11 +580,13 @@ namespace Chromium {
 			startWithCfg();//属于chromium重启或者其他情况,已经初始化好配置
 		}
 		else
-		DbgEx("subscribe VtmLoader %s",
-			(Error_Succeed == GetFunction()->SubscribeLog(m_uuidVTMLoader, this, Log_Event, Severity_None, Error_IgnoreAll, -1, "VtmLoader")) ? "success" : "failed");
+			DbgEx("subscribe VtmLoader %s",
+				(Error_Succeed == GetFunction()->SubscribeLog(m_uuidVTMLoader, this, Log_Event, Severity_None, Error_IgnoreAll, -1, "VtmLoader")) ? "success" : "failed");
+		};
+		
+		boost::thread(startFun).detach();
 
 		
-		pTransactionContext->SendAnswer(Error_Succeed);
 	}
 
 	bool CChromiumEntity::CheckIsCardStore() {
@@ -810,39 +827,6 @@ namespace Chromium {
 
 
 
-	void CChromiumEntity::OnBusinessLimitTimerListener(void* pData)
-	{
-		DbgEx("定时任务检查业务禁用");
-		// 检查是否禁用业务,做交易限制的检查
-		TradeManageCodeEnum jobLimit = CModTools::get_mutable_instance().CheckJobLimited();
-
-		DbgEx("ShowLimitScreen : TradeManageCodeEnum=%s", jobLimit._to_string());
-
-
-		switch (jobLimit) {
-		case TradeManageCodeEnum::Trade:
-			CModTools::get_mutable_instance().killChromiumByName((+PAGE_TYPE::TradeManager)._to_string());
-			break;
-		case TradeManageCodeEnum::Disabled:
-		{
-			auto openRet = CModTools::get_mutable_instance().StartChromiumBrowser(ERR_PAGE_REASON::disabled,
-				std::tuple < std::string, std::string>(m_sysInfo.strTerminalID.GetData(), generateTimeStr()));
-			DbgEx("TradeManageCodeEnum Disabled, open page %s, %d", Error_Succeed == openRet.first ? "success" : "fail", openRet.second);
-		}
-		break;
-		case TradeManageCodeEnum::JobUncomplete:
-		{
-			auto openRet = CModTools::get_mutable_instance().StartChromiumBrowser(ERR_PAGE_REASON::jobuncomplete,
-				std::tuple < std::string, std::string>(m_sysInfo.strTerminalID.GetData(), generateTimeStr()));
-			DbgEx("TradeManageCodeEnum JobUncomplete, open page %s, %d", Error_Succeed == openRet.first ? "success" : "fail", openRet.second);
-		}
-		break;
-		default:
-			break;
-		}
-
-		GetFunction()->ResetTimer(BROWSER_TIMER_ID, BROWSER_TIMER_INTERVAL);
-	}
 
 	void CChromiumEntity::OnBrowserCacheClean(const char* pszEntityName, DWORD dwMessageId, DWORD dwMessageSignature, ResourceWatcher::BrowserCacheClean& evt)
 	{
@@ -910,11 +894,6 @@ namespace Chromium {
 
 	}
 
-	void CChromiumEntity::generateBussinessLimitTimer() {
-		DbgEx("Start BusinessLimitTimer");
-		pBusinessLimitTimerListener = new TimerOutHelper<CChromiumEntity>(this, &CChromiumEntity::OnBusinessLimitTimerListener, NULL, false);
-		GetFunction()->SetTimer(BROWSER_TIMER_ID, pBusinessLimitTimerListener, 5000);
-	}
 
 	int CChromiumEntity::getBrowserStartTimes() {
 		CAutoArray<CSimpleStringA> t_names;

+ 3 - 20
Module/mod_chromium/mod_chromium.h

@@ -95,22 +95,7 @@ namespace Chromium {
 		const char* GetCustomAdUrl()  const { return m_strCustomAdUrl; }
 		bool IsConfigMode() 
 		{
-#if (defined _WIN32 || defined _WIN64)
-			return false;
-#else
-			static bool first(true);
-			static bool result(false);
-
-			if (first) {
-				first = false;
-				CSystemRunInfo runInfo;
-				GetFunction()->GetSystemRunInfo(runInfo);
-				if (runInfo.eState == FrameworkState_NotConfig)
-					result = true;
-			}
-
-			return result;
-#endif
+			return m_installMode;
 		}
 
 	private:
@@ -120,10 +105,10 @@ namespace Chromium {
 #endif
 		void OnBrowserCacheClean(const char* pszEntityName, DWORD dwMessageId, DWORD dwMessageSignature, ResourceWatcher::BrowserCacheClean& evt);
 		void generateCefclientTimer();
-		void generateBussinessLimitTimer();
 		void openMainPage();
 		void openAdPage();
 		void openExtendPage();
+		void openInstallPage();
 		void startWithCfg();
 		bool CheckIsCardStore();
 
@@ -137,7 +122,7 @@ namespace Chromium {
 		CSimpleStringA m_strCustomMainUrl, m_strCustomAdUrl;
 		bool m_runAd/*广告*/, m_runMain/*业务*/, m_runExtend/*低柜副屏*/, m_runLogin/*用户桌面,可能木有用*/, m_withBrowser/*是否需要与browser交互*/;
 		bool m_withDebugMode/*是否启动debug模式*/, m_withMagic/*启用随机共享内存*/, m_withNoFileLog/*是否不需要本地日志落盘*/;
-		bool m_withMin, m_withClose;
+		bool m_withMin, m_withClose, m_installMode;
 
 		boost::container::deque<SYS_EVENT_PARAM> m_eventArr;
 		boost::mutex m_eventContorl, m_eventConditionMu; //sysvarEvent变化时阻塞修改
@@ -160,8 +145,6 @@ namespace Chromium {
 
 		void OnTerminalManage(const char* pszEntityName, DWORD dwMessageId, DWORD dwMessageSignature, HealthManager::TerminalManager& evt);//终端锁定罚出
 
-		void OnBusinessLimitTimerListener(void* pData);//每3600s检测业务禁用
-
 		void checkUrlStartTime();
 
 		void DoBrowserCacheClearJob();