Răsfoiți Sursa

!4 closeCommonPage in uos system

chenliangyu 1 an în urmă
părinte
comite
2a757a3b69

+ 21 - 1
Module/mod_chromium/baseEx.cpp

@@ -26,6 +26,11 @@ using namespace boost::interprocess;
 
 #if (defined _WIN32 || defined _WIN64)
 #define BOOST_INTERPROCESS_SHARED_DIR_PATH "C:\\"
+#else
+#include <sys/types.h>
+#include <unistd.h>
+#include <cstring>
+#include <signal.h>
 #endif
 
 void* logProducer = nullptr;
@@ -902,4 +907,19 @@ bool SM2_Encrypt_Manager::verifySM2Manager()
 	if (m_opposite_public_key_buf == NULL || m_public_key_buf == NULL || m_private_key_buf == NULL)
 		return false;
 	return true;
-}
+}
+#ifdef RVC_OS_LINUX
+std::vector<int> getUosBrowserPIDs()
+{
+	std::vector<int> pids;
+	FILE* fp = popen("ps -ef | grep uosbrowser | grep -v grep | awk '{print $2}'", "r");
+	if (fp) {
+		char buffer[256];
+		while (fgets(buffer, sizeof(buffer), fp) != NULL) {
+			pids.push_back(static_cast<pid_t>(std::atoi(buffer)));
+		}
+		pclose(fp);
+	}
+	return pids;
+}
+#endif

+ 4 - 0
Module/mod_chromium/baseEx.h

@@ -52,6 +52,10 @@ bool modifyBySpecialStr(std::wstring& src);
 void receivehexdump(const char* buf, const int num);
 
 void doWithDebugModeData(const char* strMethod, const char* buf);
+#ifdef RVC_OS_LINUX
+std::vector<int> getUosBrowserPIDs();
+#endif
+
 
 class json_deal {
 public:

+ 77 - 19
Module/mod_chromium/mod_chromium.cpp

@@ -160,21 +160,67 @@ namespace Chromium {
 
 	void CChromiumEntity::OpenCommonPage(SpReqAnsContext<ChromiumSrv_OpenCommonPage_Req, ChromiumSrv_OpenCommonPage_Ans>::Pointer ctx)
 	{
-		std::string strTitle = ctx->Req.title.GetData();
-		std::string strUrl = ctx->Req.url.GetData();
-		int width = ctx->Req.width;
-		int height = ctx->Req.height;
-		int point_x = ctx->Req.point_x;
-		int point_y = ctx->Req.point_y;
-		std::string strTop = ctx->Req.top.GetData();
-		auto ret = CModTools::get_mutable_instance().startCommonPage(strTitle, strUrl, width, height, point_x, point_y, strTop);
-		ctx->Answer(ret.first, ret.first);
-	
+		auto openCommonPageThread = [this](SpReqAnsContext<ChromiumSrv_OpenCommonPage_Req, ChromiumSrv_OpenCommonPage_Ans>::Pointer ctx)
+		{
+			std::string strTitle = ctx->Req.title.GetData();
+			std::string strUrl = ctx->Req.url.GetData();
+			int width = ctx->Req.width;
+			int height = ctx->Req.height;
+			int point_x = ctx->Req.point_x;
+			int point_y = ctx->Req.point_y;
+			std::string strTop = ctx->Req.top.GetData();
+#ifdef RVC_OS_WIN
+			auto ret = CModTools::get_mutable_instance().startCommonPage(strTitle, strUrl, width, height, point_x, point_y, strTop);
+#else
+			auto srcPids = getUosBrowserPIDs();
+			auto ret = CModTools::get_mutable_instance().startCommonPage(strTitle, strUrl, width, height, point_x, point_y, strTop);
+			std::this_thread::sleep_for(std::chrono::seconds(2));
+			auto dstPids = getUosBrowserPIDs();
+
+			if (m_commonPageArr.find(strTitle) == m_commonPageArr.end())
+			{
+				std::vector<int> tmp;
+				m_commonPageArr[strTitle] = tmp;
+			}
+			std::vector<int> difference;
+			// 使用 std::set_difference 查找差值
+			std::set_difference(dstPids.begin(), dstPids.end(), srcPids.begin(), srcPids.end(), std::back_inserter(difference));
+			for (auto it : difference)
+			{
+				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("open commonPage %d", it);
+				m_commonPageArr[strTitle].push_back(it);
+			}
+
+			
+
+#endif
+			ctx->Answer(ret.first, ret.first);
+		};
+
+		std::thread(openCommonPageThread, ctx).detach();
 	}
 	void CChromiumEntity::CloseCommonPage(SpReqAnsContext<ChromiumSrv_CloseCommonPage_Req, ChromiumSrv_CloseCommonPage_Ans>::Pointer ctx)
 	{
 		std::string strName = ctx->Req.title.GetData();
+#ifdef RVC_OS_WIN
 		CModTools::get_mutable_instance().stopCommonPage(strName);
+#else
+		if (m_commonPageArr.find(strName) != m_commonPageArr.end())
+		{
+			auto arr = m_commonPageArr[strName];
+			for (auto it : arr)
+			{
+				CSimpleStringA cmd = CSimpleStringA::Format("sudo kill -9 %d", it);
+				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("CloseCommonPage %s", cmd.GetData());
+				system(cmd.GetData());
+			}
+			arr.clear();
+			m_commonPageArr[strName] = arr;
+			
+		}
+#endif // RVC_OS_WIN
+
+		
 		ctx->Answer(ErrorCodeEnum::Error_Succeed);
 	}
 
@@ -543,10 +589,6 @@ namespace Chromium {
 	{
 		OnPreStart_Init(m_strArgs, m_pTransactionContext);//初始化部分, perf ,killchromium, signal, get custom url
 
-#if defined(RVC_OS_LINUX)
-		Chromium::CModTools::get_mutable_instance().killAllChromium();//linux will kill all browser before open main page
-#endif // RVC_OS_UOS
-
 		
 		if (!IsConfigMode()) {
 			if (!OnPreStart_register(m_strArgs, m_pTransactionContext)) {
@@ -614,9 +656,8 @@ namespace Chromium {
 
 	void CChromiumEntity::OnPreStart(CAutoArray<CSimpleStringA> strArgs, CSmartPointer<ITransactionContext> pTransactionContext)
 	{
-		m_strArgs = strArgs;
-		m_pTransactionContext = pTransactionContext;
-		pTransactionContext->SendAnswer(Error_Succeed);
+
+
 
 #if defined(RVC_OS_LINUX)
 		// clear all the browser
@@ -715,9 +756,17 @@ namespace Chromium {
 			}
 				
 		};
-		
-		boost::thread(startFun).detach();
 
+		boost::thread t(startFun);
+
+		// 等待线程 3 秒,如果超时则 detach 线程
+		if (!t.timed_join(boost::chrono::seconds(3))) {
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("Timed out, detaching thread.");
+			t.detach();
+		}
+		m_strArgs = strArgs;
+		m_pTransactionContext = pTransactionContext;
+		pTransactionContext->SendAnswer(Error_Succeed);
 		
 	}
 
@@ -762,7 +811,12 @@ namespace Chromium {
 				{
 					if (CModTools::get_mutable_instance().IsConfigWork())//url正常时才关闭
 					{
+#if defined(RVC_OS_LINUX)
+						Chromium::CModTools::get_mutable_instance().killAllChromium();//linux will kill all browser before open main page
+#else
 						CModTools::get_mutable_instance().StopChromiumBrowser(ERR_PAGE_REASON::startup);
+#endif // RVC_OS_UOS
+						
 						if (m_runAd) openAdPage();
 						openMainPage();
 						CModTools::get_mutable_instance().StopChromiumBrowser(ERR_PAGE_REASON::breakdown);
@@ -776,7 +830,11 @@ namespace Chromium {
 				{
 					if (!m_withBrowser)
 					{
+#if defined(RVC_OS_LINUX)
+						Chromium::CModTools::get_mutable_instance().killAllChromium();//linux will kill all browser before open main page
+#else
 						CModTools::get_mutable_instance().StopChromiumBrowser(ERR_PAGE_REASON::startup);
+#endif // RVC_OS_UOS
 						
 						auto openRet = CModTools::get_mutable_instance().StartChromiumBrowser(
 							0 == CSimpleStringA("S").Compare(curEvent.value.c_str(), true) ? ERR_PAGE_REASON::warnPrompt : ERR_PAGE_REASON::breakdown,

+ 3 - 0
Module/mod_chromium/mod_chromium.h

@@ -136,6 +136,9 @@ namespace Chromium {
 		boost::condition_variable_any m_eventCondition;//满足有数据时激活线程
 		CAutoArray<CSimpleStringA> m_strArgs;
 		CSmartPointer<ITransactionContext> m_pTransactionContext;
+#ifdef RVC_OS_LINUX
+		std::map<std::string, std::vector<int>> m_commonPageArr;
+#endif
 	public:
 		boost::timed_mutex m_firstStartMain;//首次启动主页
 		int getBrowserStartTimes();

BIN
addin/res/ManagerDesktop/images/favicon.ico


+ 17 - 8
addin/res/ManagerDesktop/startPage.html

@@ -2,8 +2,9 @@
 <html xmlns="http://www.w3.org/1999/xhtml">
 	<head>
 		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-		<title>错误页-告警提示</title>
+		<title id="pageTitle"></title>
 		<meta name="viewport" content="width=device-width,initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
+		<link rel="icon" type="images/x-icon" href="./images/favicon.ico"/>
 		<link rel="stylesheet" type="text/css" href="css/errType.css" />
 		<link rel="stylesheet" type="text/css" href="css/loading.css" />
 		<link rel="stylesheet" type="text/css" href="css/non-ie-style.css" /> 
@@ -11,7 +12,7 @@
 
 		<style>
 			.start_page .logo{
-				height: 25px;
+				height: 20px;
     			margin: 10px 30px;
 				padding: 13px 0px;
 			}
@@ -88,14 +89,21 @@
 					height: 375px;
 				}
 			}
-			
+			.sub{
+				font-family: HYQiHei-EES;
+				font-size: 10px;
+				color: #272727;
+				font-weight: 400;
+				margin-left: 6px;
+			}
 		</style>
 	</head>
 	<body class="start_page">
 		<div class="logo">
 			<img height="100%" src="./images/logo_cmb.png" />
+			<span class="sub" id="deviceInfo"></span>
 		</div>
-		<h3 id="entityNum">正在启动(2/3)</h3>
+		<h3 id="entityNum"></h3>
 		<ul class="entity_list" id="logList">
 			<!-- <li>[-06-20 21:30:37] GUIConnsole 实体启动成功</li>-->
 		</ul>
@@ -135,11 +143,12 @@
 				if(ret.errorCode===0){
 					let data = JSON.parse(ret['{e12a3dc0-3a0b-47c4-a8c3-75190a42ae68}'])
 					// console.log('GetBasicInformation---data',data)
-					document.getElementById('entityNum').innerHTML = '「'+data.terminalNo+'」正在启动('+data.Idle_entityNum+'/'+data.total_entityNum+')'
+					document.getElementById('entityNum').innerHTML = '正在启动('+data.Idle_entityNum+'/'+data.total_entityNum+')'
 					// document.getElementById('terminalNo').innerHTML = data.terminalNo
-					document.getElementById('versionNo').innerHTML = 'V'+data.versionNo
-					document.getElementById('env').innerHTML = data.machineType+'-'+data.Env+'ver'
-					
+					// document.getElementById('versionNo').innerHTML = 'V'+data.versionNo
+					// document.getElementById('env').innerHTML = data.machineType+'-'+data.Env+'ver'
+					document.getElementById('deviceInfo').innerHTML = data.machineType+'-'+data.Env+'ver.['+data.terminalNo+' V'+data.versionNo+']'
+					document.getElementById('pageTitle').textContent ='.'// data.machineType+'-'+data.Env+'ver.['+data.terminalNo+' V'+data.versionNo+']'
 				}
 			})
 		}