Browse Source

#IQRV #comment [Chromium] Windows 第一次tongbu

gifur 2 years ago
parent
commit
0ecb9b2d26

+ 172 - 50
Module/mod_chromium/CModTools.cpp

@@ -108,6 +108,7 @@ namespace Chromium {
 #if defined(RVC_OS_LINUX)
         InitBrowserUseMode();
 #endif //RVC_OS_LINUX
+		SetSpecialPageParam("", "", "", 0);
 	}
 
 
@@ -173,78 +174,63 @@ namespace Chromium {
 		return strUrl.length() > 0 ? std::make_pair(true, strUrl) : std::make_pair(false, strUrl);
 	}
 
-	std::pair<bool, std::string> CModTools::getErrUrl()
+	std::pair<bool, std::string> CModTools::getErrUrl(ERR_PAGE_REASON errType)
 	{
 		CSimpleStringA errPagePath;
 		m_pEntity->GetFunction()->GetPath("Base", errPagePath);
 		errPagePath.Append(SPLIT_SLASH_STR).Append("res").Append(SPLIT_SLASH_STR);
-#if (defined _WIN32 || defined _WIN64)
-		errPagePath.Append("ManagerDesktop").Append(SPLIT_SLASH_STR).Append("H5Page").Append(SPLIT_SLASH_STR);
-#else
 		errPagePath.Append("ManagerDesktop").Append(SPLIT_SLASH_STR);
-#endif
-		errPagePath.Append("errPage.html");
+		if (errType._to_integral() == ERR_PAGE_REASON::breakdown)
+			errPagePath.Append("entityCheck.html");
+		else if (errType._to_integral() == ERR_PAGE_REASON::warnPrompt)
+			errPagePath.Append("serverNoAccess.html");
+		else if (errType._to_integral() == ERR_PAGE_REASON::CardStoreIsBusy)
+			errPagePath.Append("cardStore.html");
+		else if (errType._to_integral() == ERR_PAGE_REASON::main)
+			errPagePath.Append("homePageErr.html");
+		else
+			errPagePath.Append("entityCheck.html");
 
 		return std::make_pair(true, errPagePath.GetData());
 	}
 
 	std::pair<bool, std::string> CModTools::GenerateErrPage(ERR_PAGE_REASON errType, std::tuple < std::string, std::string> norParam, std::tuple<std::string, std::string, std::string, DWORD, DWORD> exParam)
 	{
-		auto errUrlRet = getErrUrl();
+		auto errUrlRet = getErrUrl(errType);
 		CSimpleStringA errPagePathBase = errUrlRet.second.c_str();
 		CSimpleStringA errPageParams(true);
+		CSimpleStringA needGuardian = "Y";
+		auto rc = this->m_pEntity->GetFunction()->GetSysVar("NeedGuardian", needGuardian);
+		bool showRebootTime = true;
+		if (rc == Error_Succeed && needGuardian.Compare("Y", false))
+			showRebootTime = false;
+		DbgEx("NeedGuardian:%s", needGuardian.GetData());
 
 		switch (errType)
 		{
 		case ERR_PAGE_REASON::CardStoreIsBusy:
-		{
-            std::string in = "卡库正在使用中";
-            std::string rs = UrlEncoder::Encode(in).c_str();
-            errPageParams.Append(CSimpleStringA("reason=") + errType._to_string() + "\\&errmsg=").Append(rs.c_str());
-            setLimitReason(errType._to_string());
-		}
 			break;
 		case ERR_PAGE_REASON::breakdown:
+		case ERR_PAGE_REASON::warnPrompt:
 		{
-			CSimpleStringA m_sAuthErrMsg, ts;
-			this->m_pEntity->GetFunction()->GetSysVar("TerminalStage", ts);
-			auto rc = this->m_pEntity->GetFunction()->GetSysVar("AuthErrMsg", m_sAuthErrMsg);
-			DbgEx("准入没过,展示交易暂停页面 TerminalStage=%c, AuthErrMsg=%s", ts[0], m_sAuthErrMsg.GetData());
-			DWORD usercode = spiltErrMsg(m_sAuthErrMsg.GetData());
-            std::string in = m_sAuthErrMsg.GetData();
-            std::string rs = UrlEncoder::Encode(in).c_str();
-			if (usercode == ERR_ACCESSAUTH_TERMINAL_PENALTY_OUT)
-				errPageParams.Append("errmsg=").Append(rs.c_str());
-			else
-				errPageParams.Append(CSimpleStringA("reason=")).Append(errType._to_string()).Append("\\&errmsg=").Append(rs.c_str());
-
-			if (findRestartCode(usercode)) {
-				errPageParams.Append("\\&reboottime=").Append(GetSpShellNextRebootTime().c_str());
-			}
-			errPageParams.Append(CSimpleStringA("\\&showlimit=")).Append(std::to_string((unsigned long long)1).c_str());
-			if (m_withMin)
-			{
+			errPageParams.Append(CSimpleStringA("showlimit=1"));
+			if (m_withMin) {
 				errPageParams.Append(CSimpleStringA("\\&showmin=1"));
 			}
-			errPageParams.Append(CSimpleStringA("\\&terminalno=")).Append(std::get<0>(norParam).c_str());
-			errPageParams.Append(CSimpleStringA("\\&errtime=")).Append(std::get<1>(norParam).c_str());
 		}
 		break;
 		case ERR_PAGE_REASON::ErrNotify:
 		{
-            std::string in = std::get<1>(exParam).c_str();
-            std::string rs = UrlEncoder::Encode(in).c_str();
-			errPageParams.Append(CSimpleStringA("reason=")).Append(std::get<0>(exParam).c_str()).Append("\\&errmsg=").Append(rs.c_str());
-			if (std::get<2>(exParam).length() > 5) {
+			errPageParams.Append(CSimpleStringA("reason=")).Append(std::get<0>(exParam).c_str()).Append("\\&errmsg=").Append(std::get<1>(exParam).c_str());
+            if (std::get<2>(exParam).length() > 5 && showRebootTime)
 				errPageParams.Append("\\&reboottime=").Append(std::get<2>(exParam).c_str());
-			}
 
 			errPageParams.Append(CSimpleStringA("\\&showlimit=")).Append(std::to_string((unsigned long long)1).c_str());
 			errPageParams.Append(CSimpleStringA("\\&terminalno=")).Append(std::get<0>(norParam).c_str());
 			errPageParams.Append(CSimpleStringA("\\&errtime=")).Append(std::get<1>(norParam).c_str());
 
-			CSimpleStringA strSysCode = CSimpleStringA::Format("0x%X", std::get<3>(exParam));
-			CSimpleStringA strUsrCode = CSimpleStringA::Format("0x%X", std::get<4>(exParam));
+            CSimpleStringA strSysCode = CSimpleStringA::Format("0x%X", std::get<3>(exParam));
+            CSimpleStringA strUsrCode = CSimpleStringA::Format("0x%X", std::get<4>(exParam));
 
 			errPageParams.Append(CSimpleStringA("\\&syscode=")).Append(strSysCode);
 			errPageParams.Append(CSimpleStringA("\\&usercode=")).Append(strUsrCode);
@@ -256,14 +242,54 @@ namespace Chromium {
 
 		CSimpleStringA errPageUrl(true);
 		if (!errPageParams.IsNullOrEmpty()) {
-            //std::string in = errPageParams.GetData();
-            //errPageParams = UrlEncoder::Encode(in).c_str();
 			errPageUrl = CSimpleStringA("file:///") + errPagePathBase + "?" + errPageParams;
 		} else {
 			errPageUrl = CSimpleStringA("file:///") + errPagePathBase;
 		}
+#if defined(RVC_OS_WIN)
+        std::string in = errPageUrl.GetData();
+		errPageUrl = UrlEncoder::Encode(in).c_str();
+
+		errPageUrl.Append(" ");
+        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(errType._to_string());
+		errPageUrl.Append(" --cache-path=").Append(cachePath);
+        if (g_useMagic)
+			errPageUrl.Append(" --magic-str=").Append(m_magicStr.c_str());
+		errPageUrl.Append(" --no-sandbox").Append(" --hide-controls").Append(" --hide-tabs");
+		errPageUrl.Append(" --top=-1");
+
+        switch (errType) {
+        case ERR_PAGE_REASON::TerminalManagerKickOut:
+        case ERR_PAGE_REASON::TerminalManagerOff:
+			errPageUrl.Append(" --logextend=").Append((+PAGE_TYPE::TerminalManager)._to_string());
+            break;
+        case ERR_PAGE_REASON::CardStoreIsBusy:
+			errPageUrl.Append(" --logextend=").Append((+PAGE_TYPE::CardStoreIsBusy)._to_string());
+            break;
+        case ERR_PAGE_REASON::CameraConfig:
+			errPageUrl.Append(" --logextend=").Append((+PAGE_TYPE::CameraConfig)._to_string());
+            break;
+        case ERR_PAGE_REASON::disabled:
+        case ERR_PAGE_REASON::jobuncomplete:
+			errPageUrl.Append(" --logextend=").Append((+PAGE_TYPE::TradeManager)._to_string());
+            break;
+        case ERR_PAGE_REASON::warnPrompt:
+        case ERR_PAGE_REASON::breakdown:
+			errPageUrl.Append(" --logextend=").Append((+PAGE_TYPE::breakdown)._to_string());
+            break;
+        default:
+			errPageUrl.Append(" --logextend=").Append((+PAGE_TYPE::errPage)._to_string());
+            break;
+        }
+		CSimpleStringA strChromiumPath = GetCefHead(this->m_pEntity);
+		CSimpleString dstCmd = strChromiumPath + " --url=" + errPageUrl;
+
+#else
+        CSimpleString dstCmd = generateBrowserCMDForEverything(errPageUrl.GetData(), 2).c_str();
+#endif //RVC_OS_WIN
 
-		CSimpleString dstCmd = generateBrowserCMDForEverything(errPageUrl.GetData(), 2).c_str();
 		DbgEx("GenerateErrPage type=%s, dstPage=%s", errType._to_string(), dstCmd.GetData());
 		return std::make_pair(true, (const char*)dstCmd.GetData());
 	}
@@ -296,7 +322,9 @@ namespace Chromium {
 					/** 十分钟后重启 [Gifur@2022324]*/
 					CSmallDateTime dateNewTime((DWORD)dateTime + 10 * 60);
 					shellBootTime = dateNewTime.ToTimeString().GetData();
+#if defined(RVC_OS_LINUX)
 					SP::Utility::replaceInPlace(shellBootTime, " ", "-");
+#endif //RVC_OS_LINUX
 					break;
 				}
 			}
@@ -334,7 +362,7 @@ namespace Chromium {
         DbgEx("StopChromiumBrowser cmdline:%s, current guardian main browser : %d", strCmdLine.GetData(), m_isGuardMainBrowser);
 
         SYSTEM_ON(strCmdLine.GetData());
-        if (reason._to_integral() == ERR_PAGE_REASON::breakdown)
+        if (reason._to_integral() == ERR_PAGE_REASON::breakdown || reason._to_integral() == ERR_PAGE_REASON::warnPrompt)
             breakdownExist = false;
         if (reason._to_integral() == ERR_PAGE_REASON::ErrNotify)
             notifyExist = false;
@@ -403,19 +431,99 @@ namespace Chromium {
 
 	std::string CModTools::generateAdCmd(std::string AdUrl) {
 		
+#if defined(RVC_OS_LINUX)
 		return generateBrowserCMDForEverything(AdUrl, 1);
+#else
+        CSimpleStringA strChromiumPath = GetCefHead(this->m_pEntity), strCmdLine = "";
+        strCmdLine.Append(strChromiumPath).Append(" --url=").Append(AdUrl.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);
+        if (g_useMagic)
+            strCmdLine.Append(" --magic-str=").Append(m_magicStr.c_str());
+        strCmdLine.Append(" --no-sandbox");
+        strCmdLine.Append(" --hide-controls");
+        strCmdLine.Append(" --hide-tabs");
+        strCmdLine.Append(" --logextend=").Append((+PAGE_TYPE::Ad)._to_string());
+        strCmdLine.Append(" --top=-1");
+        strCmdLine.Append(" --run-extend");
+        DbgEx("cmdline : %s", strCmdLine.GetData());
+        return strCmdLine.GetData();
+#endif //RVC_OS_LINUX
 	}
 
+#if defined(RVC_OS_WIN)
+    std::string CModTools::generateCefclientCmd(bool isExtend, std::string mainUrl)
+    {
+        CSimpleStringA strChromiumPath = GetCefHead(this->m_pEntity), strCmdLine = "";
+        strCmdLine.Append(strChromiumPath).Append(CEFCLIENT_NAME).Append(" --url=").Append(mainUrl.c_str());
+
+        if (isExtend) {
+            //not support
+        }
+        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(isExtend ? (+ERR_PAGE_REASON::extend)._to_string() : (+ERR_PAGE_REASON::main)._to_string());
+        //strCmdLine.Append(" --hide-controls=true")
+        strCmdLine.Append(" --cache-path=").Append(cachePath);
+        strCmdLine.Append(" --no-sandbox");
+        strCmdLine.Append(" --hide-controls");
+        if (g_useMagic)
+            strCmdLine.Append(" --magic-str=").Append(m_magicStr.c_str());
+        strCmdLine.Append(" --hide-tabs");
+        if (m_withDebugMode)
+            strCmdLine.Append(" --remote-debugging-port=9222");
+        if (isExtend) {
+            strCmdLine.Append(" --with-tab");
+            strCmdLine.Append(" --logextend=").Append((+PAGE_TYPE::extend)._to_string());
+        } else
+            strCmdLine.Append(" --logextend=").Append((+PAGE_TYPE::slv)._to_string());
+        strCmdLine.Append(" --errurl=file:\/\/\/").Append(getErrUrl(ERR_PAGE_REASON::main).second.c_str());
+        DbgEx("cmdline : %s", strCmdLine.GetData());
+        return strCmdLine.GetData();
+    }
+#endif //RVC_OS_WIN
+
 	std::string CModTools::generateMainCmd(std::string mainUrl)
 	{
-		return generateBrowserCMDForEverything(mainUrl, 0);
+#if defined(_MSC_VER)
+		return generateCefclientCmd(false, mainUrl);
+#else
+        return generateBrowserCMDForEverything(mainUrl, 0);
+#endif //_MSC_VER
 	}
 
 	std::string CModTools::generateSpecialPageFromOtherEntityCmd(std::string mainUrl)
 	{
-		return generateBrowserCMDForEverything(mainUrl, 3);
+#if defined(RVC_OS_WIN)
+        CSimpleStringA cachePath;
+        CSimpleStringA strChromiumPath = GetCefHead(this->m_pEntity), strCmdLine = "";
+        strCmdLine.Append(strChromiumPath).Append(CEFCLIENT_NAME).Append(" --url=").Append(mainUrl.c_str());
+        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(m_specialPage_temp_name.c_str());
+        //strCmdLine.Append(" --hide-controls=true")
+        strCmdLine.Append(" --cache-path=").Append(cachePath);
+        strCmdLine.Append(" --no-sandbox");
+        strCmdLine.Append(" --hide-controls");
+        if (g_useMagic)
+            strCmdLine.Append(" --magic-str=").Append(m_magicStr.c_str());
+        strCmdLine.Append(" --hide-tabs");
+        strCmdLine.Append(" --logextend=").Append(m_specialPage_temp_name.c_str());
+        if (m_specialPage_temp_size.length() > 0)
+            strCmdLine.Append(" --center-size=").Append(m_specialPage_temp_size.c_str());
+        if (m_specialPage_temp_point.length() > 0)
+            strCmdLine.Append(" --src-pos=").Append(m_specialPage_temp_point.c_str());
+        strCmdLine.Append(" --top=").Append(std::to_string((_LONGLONG)m_specialPage_temp_top).c_str());
+        strCmdLine.Append(" --errurl=file:\/\/\/").Append(getErrUrl(ERR_PAGE_REASON::main).second.c_str());
+        DbgEx("cmdline : %s", strCmdLine.GetData());
+        return strCmdLine.GetData();
+#else
+        return generateBrowserCMDForEverything(mainUrl, 3);
+#endif //RVC_OS_WIN
 	}
-
+#if defined(RVC_OS_LINUX)
     std::string CModTools::generateBrowserCMDForEverything(const std::string& url, int pageType)
     {
         CSimpleStringA strBasePath(true);
@@ -524,6 +632,7 @@ namespace Chromium {
 
 		return std::string("");
     }
+#endif //RVC_OS_LINUX
 
     std::pair<bool, std::string> CModTools::openAdPage()
     {
@@ -534,7 +643,11 @@ namespace Chromium {
 		if (AdUrlRet.first)
 		{
 			auto strAdCmd = generateAdCmd(AdUrlRet.second);
+#if defined(RVC_OS_WIN)
+			auto openAdRet = openCef(strAdCmd, true);
+#else
 			auto openAdRet = openCef(strAdCmd, false);
+#endif //RVC_OS_WIN
 			if (Error_Succeed != openAdRet.first)
 				return std::make_pair(false, "open Ad err!");
 			else
@@ -593,7 +706,11 @@ namespace Chromium {
 		}
 		 else if (reason._to_integral() == ERR_PAGE_REASON::OutsideRequest) {
 
-	        auto strCmdLine = generateBrowserCMDForEverything(std::get<0>(normalParam), 3);
+#if defined(RVC_OS_WIN)
+			auto strCmdLine = generateCefclientCmd(false, std::get<0>(normalParam));
+#else
+			auto strCmdLine = generateBrowserCMDForEverything(std::get<0>(normalParam), 3);
+#endif //RVC_OS_WIN
 	        auto openCefRet = openCef(strCmdLine, false);
 	        if (Error_Succeed == openCefRet.first)
 	            return std::make_pair(Error_Succeed, openCefRet.second);
@@ -616,7 +733,7 @@ namespace Chromium {
 			if (notifyExist)
 				return std::make_pair(Error_Duplication, 0);
 
-			if (ERR_PAGE_REASON::breakdown == reason._to_integral() && breakdownExist)
+			if ((ERR_PAGE_REASON::breakdown == reason._to_integral() || reason._to_integral() == ERR_PAGE_REASON::warnPrompt) && breakdownExist)
 				return std::make_pair(Error_Duplication, 0);//只打开一个breakdown页面,后续通过cefclient改动,避免打开同种页面
 
 			auto errPageUrl = GenerateErrPage(reason, normalParam, exParam);
@@ -625,12 +742,16 @@ namespace Chromium {
 				DbgEx("errPage get url failed!");
 				return std::make_pair(Error_Unexpect, 0);
 			}
+#if defined(RVC_OS_WIN)
 			auto errPageRet = openCef(errPageUrl.second);
+#else
+			auto errPageRet = openCef(errPageUrl.second, false);
+#endif //RVC_OS_WIN
 			if (Error_Succeed == errPageRet.first)
 			{
 				if (ERR_PAGE_REASON::ErrNotify == reason._to_integral())
 					notifyExist = true;
-				else if (ERR_PAGE_REASON::breakdown == reason._to_integral())
+				else if (ERR_PAGE_REASON::breakdown == reason._to_integral() || reason._to_integral() == ERR_PAGE_REASON::warnPrompt)
 					breakdownExist = true;
 			}
 			return std::make_pair(errPageRet.first, 0);
@@ -652,6 +773,7 @@ namespace Chromium {
 				else
 					DbgEx("cefClientGuardian open cefclient pid:%d, cmd:%s", std::get<1>(startRet), cmdline.c_str());
 				WaitForSingleObject(std::get<3>(startRet), INFINITE);
+				boost::mutex::scoped_lock(m_guardInterruptLock);//必须保证unlock被执行,不然就会有问题
 #else
 				boost::process::child child_process(cmdline);
 				DbgEx("open cefclient pid:%d, cmd:%s", child_process.id(), cmdline.c_str());

+ 12 - 6
Module/mod_chromium/CModTools.h

@@ -19,7 +19,7 @@
 namespace Chromium {
 
 	BETTER_ENUM(ERR_PAGE_REASON, int, CameraConfig, CardStoreIsBusy, MachineTypeError, TerminalManagerKickOut,
-		TerminalManagerOff, breakdown, disabled, jobuncomplete, ErrNotify, main, Ad, extend, OutsideRequest, SpecialPageFromOtherEntity)
+		TerminalManagerOff, breakdown, warnPrompt, disabled, jobuncomplete, ErrNotify, main, Ad, extend, OutsideRequest, SpecialPageFromOtherEntity)
 
 		BETTER_ENUM(PAGE_TYPE, int, Deploy, CameraConfig, TerminalManager, errPage, Ad, slv, init, TradeManager, breakdown, extend, CardStoreIsBusy)
 
@@ -46,6 +46,7 @@ namespace Chromium {
 		TradeManageCodeEnum CheckJobLimited();
 		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; };
 		std::string getMagicStr() { return m_magicStr; };
 		bool IsConfigWork()
 		{
@@ -70,13 +71,18 @@ namespace Chromium {
 
 		std::pair<bool, std::string> getMainUrl();
 		std::pair<bool, std::string> getAdUrl();
-		std::pair<bool, std::string> getErrUrl();
+		std::pair<bool, std::string> getErrUrl(ERR_PAGE_REASON errType = ERR_PAGE_REASON::breakdown);
 		std::pair<bool, std::string> getExtendUrl();
+#if defined(RVC_OS_WIN)
+		std::string generateCefclientCmd(bool isExtend, std::string mainUrl);
+#endif //RVC_OS_WIN
 		std::string generateMainCmd(std::string mainUrl);
 		std::string generateAdCmd(std::string AdUrl);
 		std::string generateSpecialPageFromOtherEntityCmd(std::string mainUrl);
-		//pagetype: 0: 首页全屏, 1:副屏全屏,2:错误页;3:外部调用
-		std::string generateBrowserCMDForEverything(const std::string& url, int pageType);
+#if defined(RVC_OS_LINUX)
+        //pagetype: 0: 首页全屏, 1:副屏全屏,2:错误页;3:外部调用
+        std::string generateBrowserCMDForEverything(const std::string& url, int pageType);
+#endif //RVC_OS_LINUX
 
 		/**  [Gifur@2022125]*/
 		/**n  [Gifur@2022228]*/
@@ -91,7 +97,7 @@ namespace Chromium {
 		std::string getAdditionalUOSBrowserSettings(int nBrowswerType, int nMonitorType = 0);
 		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);
-		std::pair<ErrorCodeEnum, int> openCef(std::string cmdline, bool isGuard = false, bool usingSystemCmd = false);
+		std::pair<ErrorCodeEnum, int> openCef(std::string cmdline, bool isGuard = false, bool usingSystemCmd = true);
 		void cefClientGuardian(std::string cmdline);
 		std::pair<bool, std::string> openAdPage();
 
@@ -112,7 +118,7 @@ namespace Chromium {
 	private:
 		CSimpleString m_strSite, m_strMachineType;
 		CSimpleString m_UserMgrUrlStr, m_UserMgrUrlNoSidebarStr, m_UserMgrUrlNoSidebarMutiStr, m_UserMgrUrlFultureStr, m_UserMgrAdStr;
-		bool m_withMin, m_withClose;
+		bool m_withMin, m_withClose, m_withDebugMode;
 		std::string m_magicStr;
 		/** 0:使用CefClient,1:使用旧版UOS浏览器uos-browser-stable ;2:使用新版UOS浏览器org.deepin.browser  [Gifur@2022228]*/
 		int m_UseUOSBrowser;

+ 2 - 1
Module/mod_chromium/CSocketClient.cpp

@@ -8,7 +8,8 @@
 #include "CModTools.h"
 #include <vector>
 #include <string>
-#include "portCheck/portCheck.h"
+#include "publicFunExport.h"
+#pragma comment(lib, "libpublicFun.lib")
 
 using boost::asio::ip::tcp;
 

+ 280 - 169
Module/mod_chromium/CWSCodec.cpp

@@ -9,6 +9,7 @@
 #include "uuid4.h"
 #include "BufferOperation.h"
 #include "modp_b64.h"
+#include "SpBase.h"
 #include "SpHelper.h"
 #include "CWSCodec.h"
 #include "MessageType.h"
@@ -40,9 +41,6 @@ namespace Chromium {
 
 	CWSCodec::CWSCodec() :m_DeserializeCache(MAX_TRANSFER_LEN), m_SerializeCache(MAX_TRANSFER_LEN)
 	{
-		DbgEx("CWSCodec Constuctor");
-		m_AckCallbackList = new std::map<int, entity_def_struct>();
-		m_EventCallbackList = new std::map<int, std::vector<CMedthodInterface>*>();
 	}
 
 	CWSCodec::~CWSCodec() {
@@ -71,7 +69,18 @@ namespace Chromium {
 
 	void CWSCodec::init(const char* xmlPath) {
 		DbgEx("CWSCodec method -> init from %s", xmlPath);
-		mInterpreter = new CStructureInterpreter(xmlPath);
+		try {
+			mInterpreter = new CStructureInterpreter(xmlPath);
+		}
+		catch (const std::bad_alloc& e)
+		{
+			DbgEx("CWSCodec::init Memory allocation failed: %s", e.what());
+		}
+		catch (const std::exception& e)
+		{
+			DbgEx("CWSCodec::init Error: %s", e.what());
+		}
+		
 	}
 
 	void CWSCodec::DeserializeBase(CMessage& msg, CTransStruct& ts, int& rpos, cJSON* ret) {
@@ -445,13 +454,12 @@ namespace Chromium {
 
 	std::string CWSCodec::BufferToJson(CMessage & msg, boost::function<void(int, int)> dealErrcodeFun, int replaceTransId) {
 		//replaceTransId==0,MessageType为8(Event),其他都应该有值
-		//LOG_FUNCTION();
 		int rpos = 16;
 		cJSON* ret = cJSON_CreateObject();
 		int errorCode = Error_Succeed;
 		int userCode = 0;
 		CSimpleStringA errorMsg = "";
-		receivehexdump(msg.getPayload(), msg.getLength());
+		//receivehexdump(msg.getPayload(), msg.getLength());
 
 		if (msg.getLength() < 12)	//End session len = 12
 			return std::string(); // 丢弃消息
@@ -528,9 +536,9 @@ namespace Chromium {
 			cJSON_AddStringToObject(ret, "errorMsg", "未知消息类型");
 			break;
 		}
-		DbgEx("BufferToJson -> messageType=%d(%s), sessionID=%d(%02X), transID=%d(%02X), replaceTransID=%d(%02X), errorCode=%d", msg.getMessageType(), 
+		DbgEx("BufferToJson -> messageType=%d(%s), sessionID=%d(%02X), transID=%d(%02X), replaceTransID=%d(%02X), errorCode=%d(%s)", msg.getMessageType(), 
 			GetMessageTypeString(msg.getMessageType()).c_str(),	msg.getSessionID(), msg.getSessionID(), srcTransId, srcTransId, replaceTransId
-			, replaceTransId, errorCode);
+			, replaceTransId, errorCode, SpStrError((ErrorCodeEnum)errorCode).c_str());
 
 		if (Error_Succeed != errorCode)
 			dealErrcodeFun(errorCode, srcTransId);
@@ -539,9 +547,13 @@ namespace Chromium {
 		// RequestAck 返回的有问题 要删除对应的回调list项
 		if (Error_Succeed != errorCode && RequestAck == msg.getMessageType())
 		{
-			std::map<int, entity_def_struct>::iterator it = m_AckCallbackList->find(msg.getTransID());
-			if (m_AckCallbackList->end() != it)
-				m_AckCallbackList->erase(it);
+			std::map<int, entity_def_struct>::iterator it = m_AckCallbackList.find(msg.getTransID());
+			if (m_AckCallbackList.end() != it)
+			{
+				m_ackMutex.lock();
+				m_AckCallbackList.erase(it);
+				m_ackMutex.unlock();
+			}
 		}
 		// 有错误时直接返回 或者 不是RequestAck和Event时也可以返回
 		if (Error_Succeed != errorCode || (RequestAck != msg.getMessageType() && Event != msg.getMessageType()))
@@ -557,7 +569,11 @@ namespace Chromium {
 		if (RequestAck == msg.getMessageType())
 		{   // Request用户自定义部分反序列化
 			// 回调反序列化列表
-			std::map<int, entity_def_struct>::iterator it = m_AckCallbackList->find(msg.getTransID());
+			m_ackMutex.lock();
+			std::shared_ptr<void> delHandleFun((void*)0, [&](void*) {
+				m_ackMutex.unlock();
+				});
+			std::map<int, entity_def_struct>::iterator it = m_AckCallbackList.find(msg.getTransID());
 
 			if (m_AckCallbackList->end() == it)
 			{
@@ -576,8 +592,8 @@ namespace Chromium {
 		else if (Event == msg.getMessageType())
 		{
 			// Event用户自定义部分反序列化
-			std::map<int, std::vector<CMedthodInterface>*>::iterator iter = m_EventCallbackList->find(msg.getTransID());
-			if (m_EventCallbackList->end() == iter)
+			std::map<int, std::vector<CMedthodInterface>*>::iterator iter = m_EventCallbackList.find(msg.getTransID());
+			if (m_EventCallbackList.end() == iter)
 			{
 				// 没有对应的register, 无法反序列化
 				cJSON_AddNumberToObject(ret, "errorCode", Error_Unexpect);
@@ -624,18 +640,30 @@ namespace Chromium {
 					st.entity_name, st.class_name, st.methodID, mi->mMethodName.c_str(), mi->mRequestInterpreter.mParamList.size());	//如出错,可对比方法名和变量数量
 			if (Request == messageType) {
 				// 维护回调列表 Request
-				int transid = cJSON_GetObjectItem(pJson, "transId")->valueint;
-				m_AckCallbackList->insert(std::pair<int, entity_def_struct>(transid, st));
+				auto transid = json_deal::getIntergerFromCjsonObj(pJson, "transId");
+				if (transid.first == false)
+				{
+					DbgEx("CWSCodec::JsonToBuffer get transId failed");
+					return std::make_pair(messageType, nullptr);
+				}
+				m_ackMutex.lock();
+				m_AckCallbackList.insert(std::pair<int, entity_def_struct>(transid.second, st));
+				m_ackMutex.unlock();
 			}
 		}
 		else if (Register == messageType)
 		{
 			std::vector<CMedthodInterface>* milist = NULL;
 			entity_def_struct st = { 0 };
-			unsigned int transid = cJSON_GetObjectItem(pJson, "transId")->valueint;
+			auto transid = json_deal::getIntergerFromCjsonObj(pJson, "transId");
+			if (transid.first == false)
+			{
+				DbgEx("CWSCodec::JsonToBuffer get transId failed");
+				return std::make_pair(messageType, nullptr);
+			}
 			GetCJsonObjectValue(pJson, "entity", st.entity_name, errmsg);
 			milist = mInterpreter->getAllMessageInterface(st.entity_name);
-			m_EventCallbackList->insert(std::pair<int, std::vector<CMedthodInterface>*>(transid, milist));
+			m_EventCallbackList.insert(std::pair<int, std::vector<CMedthodInterface>*>(transid.second, milist));
 		}
 		else if (Broadcast == messageType)
 		{
@@ -685,39 +713,9 @@ namespace Chromium {
 		WriteT(data, len, &wpos, &capacity);
 
 		//写入messageType,附带链路信息
-#ifdef OPEN_LINKINFO
 		int messageTypeWithControl = messageType | PKT_TYPE_CONTROL_LINKCONTEXT;
-#else
-		int messageTypeWithControl = messageType;
-#endif
 		WriteT(data, messageTypeWithControl, &wpos, &capacity);
 
-		auto linkContexFun = [&]() {
-#ifdef OPEN_LINKINFO
-			//添加链路信息,放到原数据最后
-			auto linkContextRet = GetLinkContex(pJson, data, errmsg);
-			if (linkContextRet.first)
-			{
-				WriteT(data, std::get<0>(linkContextRet.second), &wpos, &capacity);
-				WriteT(data, std::get<1>(linkContextRet.second), &wpos, &capacity);
-				WriteT(data, std::get<2>(linkContextRet.second), &wpos, &capacity);
-				WriteT(data, std::get<3>(linkContextRet.second), &wpos, &capacity);
-			}
-			else// 生成链路信息
-			{
-				CSimpleStringA bussinessId = "ChromiumAutoGen";
-				CSimpleStringA traceId = uuid4_generate(32).c_str();
-				CSimpleStringA spanId = uuid4_generate(16).c_str();
-				CSimpleStringA parentSpanId = "0";
-				WriteT(data, bussinessId, &wpos, &capacity);//为适配silverlight,默认写入就是unicode
-				WriteT(data, traceId, &wpos, &capacity);
-				WriteT(data, spanId, &wpos, &capacity);
-				WriteT(data, parentSpanId, &wpos, &capacity);
-			}
-#else
-#endif
-
-		};
 
 		// 根据不同的request进行序列化
 		switch (messageType) {
@@ -730,35 +728,35 @@ namespace Chromium {
 			break;
 		case BeginSession:
 			SerializeBeginSession(pJson, data, &wpos, &capacity, mi, errmsg);
-			linkContexFun();
+			SerializeLinkInfo(pJson, data, &wpos, &capacity, errmsg);
 			break;
 		case EndSession:
 			SerializeEndSession(pJson, data, &wpos, &capacity, mi, errmsg);
-			linkContexFun();
+			SerializeLinkInfo(pJson, data, &wpos, &capacity, errmsg);
 			break;
 		case Register:
 			SerializeRegister(pJson, data, &wpos, &capacity, mi, errmsg);
-			linkContexFun();
+			SerializeLinkInfo(pJson, data, &wpos, &capacity, errmsg);
 			break;
 		case Unregister:
 			SerializeUnregister(pJson, data, &wpos, &capacity, mi, errmsg);
-			linkContexFun();
+			SerializeLinkInfo(pJson, data, &wpos, &capacity, errmsg);
 			break;
 		case LogEventMsgType:
 			SerializeLogEvent(pJson, data, &wpos, &capacity, mi, errmsg);
-			linkContexFun();
+			SerializeLinkInfo(pJson, data, &wpos, &capacity, errmsg);
 			break;
 		case LogWarnMsgType:
 			SerializeLogWarn(pJson, data, &wpos, &capacity, mi, errmsg);
-			linkContexFun();
+			SerializeLinkInfo(pJson, data, &wpos, &capacity, errmsg);
 			break;
 		case SetVarReq:
 			SerializeSetVarReq(pJson, data, &wpos, &capacity, mi, errmsg);
-			linkContexFun();
+			SerializeLinkInfo(pJson, data, &wpos, &capacity, errmsg);
 			break;
 		case GetVarReq:
 			SerializeGetVarReq(pJson, data, &wpos, &capacity, mi, errmsg);
-			linkContexFun();
+			SerializeLinkInfo(pJson, data, &wpos, &capacity, errmsg);
 			break;
 		default:
 			// warn
@@ -804,46 +802,79 @@ namespace Chromium {
 		return pStr;
 	}
 
+	void CWSCodec::SerializeLinkInfo(cJSON* js, char* data, int* wpos, int* capacity, char* errmsg)
+	{
+		auto linkContextRet = GetLinkContex(js, data, errmsg);
+		if (linkContextRet.first)
+		{
+			linkContext curLink;
+			curLink.bussinessId = std::get<0>(linkContextRet.second);
+			curLink.traceId = std::get<1>(linkContextRet.second);
+			curLink.spanId = std::get<2>(linkContextRet.second);
+			curLink.parentSpanId = std::get<3>(linkContextRet.second);
+			DbgToBeidou(curLink, __FUNCTION__)(); //chromium节点
+			auto newLink = curLink.upgradeLink();
+			WriteT(data, newLink.bussinessId, wpos, capacity);
+			WriteT(data, newLink.traceId, wpos, capacity);
+			WriteT(data, newLink.spanId, wpos, capacity);
+			WriteT(data, newLink.parentSpanId, wpos, capacity);
+			//DbgToBeidou(newLink, __FUNCTION__)();
+		}
+		else// 生成链路信息
+		{
+			linkContext curLink;
+			curLink.bussinessId = "ChromiumAutoGen";
+			curLink.traceId = uuid4_generate(32).c_str();
+			curLink.spanId = uuid4_generate(16).c_str();
+			curLink.parentSpanId = "0";
+			DbgToBeidou(curLink, __FUNCTION__)();
+			auto newLink = curLink.upgradeLink();
+			WriteT(data, newLink.bussinessId, wpos, capacity);//为适配silverlight,默认写入就是unicode
+			WriteT(data, newLink.traceId, wpos, capacity);
+			WriteT(data, newLink.spanId, wpos, capacity);
+			WriteT(data, newLink.parentSpanId, wpos, capacity);
+			//DbgToBeidou(curLink, __FUNCTION__)();
+			
+		}
+	}
 
 
 	void CWSCodec::SerializeInfo(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg) {
 
-		int i4 = 0;
-		i4 = cJSON_GetObjectItem(js, "sessionID")->valueint;
-		WriteT(data, i4, wpos, capacity);
-		i4 = cJSON_GetObjectItem(js, "methodID")->valueint;
-		WriteT(data, i4, wpos, capacity);
-		i4 = cJSON_GetObjectItem(js, "signature")->valueint;
-		WriteT(data, i4, wpos, capacity);
-#ifdef OPEN_LINKINFO
-		auto linkContextRet = GetLinkContex(js, data, errmsg);
-		if (linkContextRet.first)
+		auto sessionID = json_deal::getIntergerFromCjsonObj(js, "sessionID");
+		if (sessionID.first == false)
 		{
-			WriteT(data, std::get<0>(linkContextRet.second), wpos, capacity);
-			WriteT(data, std::get<1>(linkContextRet.second), wpos, capacity);
-			WriteT(data, std::get<2>(linkContextRet.second), wpos, capacity);
-			WriteT(data, std::get<3>(linkContextRet.second), wpos, capacity);
+			DbgEx("CWSCodec::SerializeInfo get sessionId failed");
+			return;
 		}
-		else// 生成链路信息
+
+		auto methodID = json_deal::getIntergerFromCjsonObj(js, "methodID");
+		if (methodID.first == false)
+		{
+			DbgEx("CWSCodec::SerializeInfo get methodID failed");
+			return;
+		}
+
+		auto signature = json_deal::getIntergerFromCjsonObj(js, "signature");
+		if (signature.first == false)
 		{
-			CSimpleStringA bussinessId = "ChromiumAutoGen";
-			CSimpleStringA traceId = uuid4_generate(32).c_str();
-			CSimpleStringA spanId = uuid4_generate(16).c_str();
-			CSimpleStringA parentSpanId = "0";
-			WriteT(data, bussinessId, wpos, capacity);//为适配silverlight,默认写入就是unicode
-			WriteT(data, traceId, wpos, capacity);
-			WriteT(data, spanId, wpos, capacity);
-			WriteT(data, parentSpanId, wpos, capacity);
+			DbgEx("CWSCodec::SerializeInfo get signature failed");
+			return;
 		}
-#endif
+
+		WriteT(data, sessionID.second, wpos, capacity);
+		WriteT(data, methodID.second, wpos, capacity);
+		WriteT(data, signature.second, wpos, capacity);
+
+		SerializeLinkInfo(js, data, wpos, capacity, errmsg);
 
 		if (NULL == pI)
 		{
-			// 没有对应定义
-			return;
+			DbgEx("PI = NULL, 无法找到接口定义");
+			return;// 没有对应定义
 		}
 
-		auto paramJs = cJSON_GetObjectItem(js, PARAMLIST_HEAD);
+		auto paramJs = cJSON_GetObjectItem(js, PARAMLIST_HEAD);//不更换,因为不为获取值
 		if (paramJs == NULL)
 		{
 			//detect the same name 
@@ -860,7 +891,6 @@ namespace Chromium {
 				for (auto repeatName : c_repeatParamList)
 				{
 #endif
-
 					if (paramInfo.mName == repeatName)
 						DbgEx("request参数名字重复, error, %s", paramInfo.mName.c_str());
 				}
@@ -868,12 +898,11 @@ namespace Chromium {
 			//如果存在重复,可能数据已经脏了,所以也不需要作删除参数处理
 
 			paramJs = js;
-				}
+		}
 		GeneralSerialize(paramJs, data, wpos, capacity, pI, errmsg);
 
 		return;
-			}
-#ifdef OPEN_LINKINFO
+	}
 	std::pair<bool, std::tuple<CSimpleStringA, CSimpleStringA, CSimpleStringA, CSimpleStringA, CSimpleStringA, int>> CWSCodec::GetLinkContex(cJSON * js, char* data, char* errmsg)
 	{
 		/*
@@ -889,20 +918,19 @@ namespace Chromium {
 
 		CSimpleStringA BussinessId, TraceId, SpanId, ParentSpanId, Timestamp;
 		int ReservedControl;
-		GetCJsonObjectValue(js, "BussinessId", BussinessId, errmsg);
+		GetCJsonObjectValue(js, "BusinessId", BussinessId, errmsg);
 		GetCJsonObjectValue(js, "TraceId", TraceId, errmsg);
 		GetCJsonObjectValue(js, "SpanId", SpanId, errmsg);
 		GetCJsonObjectValue(js, "ParentSpanId", ParentSpanId, errmsg);
 		GetCJsonObjectValue(js, "Timestamp", Timestamp, errmsg);
 		GetCJsonIntergerValue(js, "ReservedControl", ReservedControl, errmsg);
 
-		if (BussinessId.GetLength() > 0 && BussinessId.GetLength() < 32 && TraceId.GetLength() == 32 && SpanId.GetLength() == 16 && ParentSpanId.GetLength() == 16)
+		if (BussinessId.GetLength() > 0 && BussinessId.GetLength() < 32 && TraceId.GetLength() == 32 && SpanId.GetLength() == 16)
 			return std::make_pair(true, std::make_tuple(BussinessId, TraceId, SpanId, ParentSpanId, Timestamp, ReservedControl));
 		else
 			return std::make_pair(false, std::make_tuple("", "", "", "", "", 0));
 
 	}
-#endif
 
 	void CWSCodec::SerializeBeginSession(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg) {
 		int i4 = 0;
@@ -918,45 +946,57 @@ namespace Chromium {
 
 	}
 
-	void CWSCodec::SerializeEndSession(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg) {
-		int i4 = 0;
-		i4 = cJSON_GetObjectItem(js, "sessionID")->valueint;
-		WriteT(data, i4, wpos, capacity);
+	void CWSCodec::SerializeEndSession(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg) 
+	{
+		auto sessionID = json_deal::getIntergerFromCjsonObj(js, "sessionID");
+		if (sessionID.first == false)
+		{
+			DbgEx("CWSCodec::SerializeEndSession get sessionId failed");
+			return;
+		}
+		WriteT(data, sessionID.second, wpos, capacity);
 	}
 
-	void CWSCodec::SerializeRequest(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg) {
-		unsigned int i4 = 0;
-		GetCJsonIntergerValue(js, "transID", i4, errmsg);
-		WriteT(data, i4, wpos, capacity);
-		GetCJsonIntergerValue(js, "sessionID", i4, errmsg);
-		WriteT(data, i4, wpos, capacity);
-		GetCJsonIntergerValue(js, "methodID", i4, errmsg);
-		WriteT(data, i4, wpos, capacity);
-		GetCJsonIntergerValue(js, "signature", i4, errmsg);
-		WriteT(data, i4, wpos, capacity);
-		GetCJsonIntergerValue(js, "timeout", i4, errmsg);
-		WriteT(data, i4, wpos, capacity);
-#ifdef OPEN_LINKINFO
-		auto linkContextRet = GetLinkContex(js, data, errmsg);
-		if (linkContextRet.first)
+	void CWSCodec::SerializeRequest(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg) 
+	{
+
+		auto transID = json_deal::getIntergerFromCjsonObj(js, "transID");
+		if (transID.first == false)
 		{
-			WriteT(data, std::get<0>(linkContextRet.second), wpos, capacity);
-			WriteT(data, std::get<1>(linkContextRet.second), wpos, capacity);
-			WriteT(data, std::get<2>(linkContextRet.second), wpos, capacity);
-			WriteT(data, std::get<3>(linkContextRet.second), wpos, capacity);
+			DbgEx("CWSCodec::SerializeRequest get transID failed");
+			return;
 		}
-		else// 生成链路信息
+		auto sessionID = json_deal::getIntergerFromCjsonObj(js, "sessionID");
+		if (sessionID.first == false)
 		{
-			CSimpleStringA bussinessId = "ChromiumAutoGen";
-			CSimpleStringA traceId = uuid4_generate(32).c_str();
-			CSimpleStringA spanId = uuid4_generate(16).c_str();
-			CSimpleStringA parentSpanId = "0";
-			WriteT(data, bussinessId, wpos, capacity);//为适配silverlight,默认写入就是unicode
-			WriteT(data, traceId, wpos, capacity);
-			WriteT(data, spanId, wpos, capacity);
-			WriteT(data, parentSpanId, wpos, capacity);
+			DbgEx("CWSCodec::SerializeRequest get sessionID failed");
+			return;
+		}
+		auto methodID = json_deal::getIntergerFromCjsonObj(js, "methodID");
+		if (methodID.first == false)
+		{
+			DbgEx("CWSCodec::SerializeRequest get methodID failed");
+			return;
+		}
+		auto signature = json_deal::getIntergerFromCjsonObj(js, "signature");
+		if (signature.first == false)
+		{
+			DbgEx("CWSCodec::SerializeRequest get signature failed");
+			return;
+		}
+		auto timeout = json_deal::getIntergerFromCjsonObj(js, "timeout");
+		if (timeout.first == false)
+		{
+			DbgEx("CWSCodec::SerializeRequest get timeout failed");
+			return;
 		}
-#endif
+
+		WriteT(data, transID.second, wpos, capacity);
+		WriteT(data, sessionID.second, wpos, capacity);
+		WriteT(data, methodID.second, wpos, capacity);
+		WriteT(data, signature.second, wpos, capacity);
+		WriteT(data, timeout.second, wpos, capacity);
+		SerializeLinkInfo(js, data, wpos, capacity, errmsg);
 
 		if (NULL == pI)
 		{
@@ -965,7 +1005,7 @@ namespace Chromium {
 			return;
 		}
 
-		auto paramJs = cJSON_GetObjectItem(js, PARAMLIST_HEAD);
+		auto paramJs = cJSON_GetObjectItem(js, PARAMLIST_HEAD);//不改动,因为不是为了获取值
 		if (paramJs == NULL)
 		{
 			//detect the same name 
@@ -993,31 +1033,61 @@ namespace Chromium {
 			}
 
 	void CWSCodec::SerializeRegister(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg) {
-		unsigned int i4 = 0;
-		GetCJsonIntergerValue(js, "transID", i4, errmsg);
-		WriteT(data, i4, wpos, capacity);
-		CSimpleStringA s = "";
-		GetCJsonObjectValue(js, "entity", s, errmsg);
-		WriteT(data, s, wpos, capacity);
-		s = "";
-		WriteT(data, s, wpos, capacity);
+
+		auto transID = json_deal::getIntergerFromCjsonObj(js, "transID");
+		if (transID.first == false)
+		{
+			DbgEx("CWSCodec::SerializeRegister get transID failed");
+			return;
+		}
+		auto entity = json_deal::getStringFromCjsonObj(js, "entity");
+		if (entity.first == false)
+		{
+			DbgEx("CWSCodec::SerializeRegister get entity failed");
+			return;
+		}
+
+		WriteT(data, transID.second, wpos, capacity);
+		WriteT(data, entity.second, wpos, capacity);
+		CSimpleStringA tmp = "";
+		WriteT(data, tmp, wpos, capacity);//订阅实体全局,不限定方法
 	}
 
 	void CWSCodec::SerializeUnregister(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg) {
-		int i4 = 0;
-		i4 = cJSON_GetObjectItem(js, "transID")->valueint;
-		WriteT(data, i4, wpos, capacity);
+		auto transID = json_deal::getIntergerFromCjsonObj(js, "transID");
+		if (transID.first == false)
+		{
+			DbgEx("CWSCodec::SerializeUnregister get transID failed");
+			return;
+		}
+
+		WriteT(data, transID.second, wpos, capacity);
 	}
 
 	void CWSCodec::SerializeLogEvent(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg) {
-		int i4 = 0;
-		i4 = cJSON_GetObjectItem(js, "securityLevel")->valueint;
-		WriteT(data, i4, wpos, capacity);
-		i4 = cJSON_GetObjectItem(js, "eventCode")->valueint;
-		WriteT(data, i4, wpos, capacity);
-		CSimpleStringA s = "";
-		s = cJSON_GetObjectItem(js, "message")->valuestring;
-		WriteT(data, s, wpos, capacity);
+
+		auto securityLevel = json_deal::getIntergerFromCjsonObj(js, "securityLevel");
+		if (securityLevel.first == false)
+		{
+			DbgEx("CWSCodec::SerializeUnregister get securityLevel failed");
+			return;
+		}
+		auto eventCode = json_deal::getIntergerFromCjsonObj(js, "eventCode");
+		if (eventCode.first == false)
+		{
+			DbgEx("CWSCodec::SerializeUnregister get eventCode failed");
+			return;
+		}
+		auto message = json_deal::getStringFromCjsonObj(js, "message");
+		if (message.first == false)
+		{
+			DbgEx("CWSCodec::SerializeUnregister get message failed");
+			return;
+		}
+
+		WriteT(data, securityLevel.second, wpos, capacity);
+		WriteT(data, eventCode.second, wpos, capacity);
+		WriteT(data, message.second, wpos, capacity);
 	}
 
 	inline CSimpleStringA DWORD2Hex(DWORD cur)
@@ -1026,27 +1096,58 @@ namespace Chromium {
 	}
 
 	void CWSCodec::SerializeLogWarn(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg) {
-		int securityLevel = 0, eventCode = 0;
-		securityLevel = cJSON_GetObjectItem(js, "securityLevel")->valueint;
-		WriteT(data, securityLevel, wpos, capacity);
-		eventCode = cJSON_GetObjectItem(js, "eventCode")->valueint;
-		WriteT(data, eventCode, wpos, capacity);
-		CSimpleStringA s = "";
-		s = cJSON_GetObjectItem(js, "message")->valuestring;
-		WriteT(data, s, wpos, capacity);
-		DbgWithLink(securityLevel == SeverityLevelEnum::Severity_Low ? LOG_LEVEL_INFO : LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode(DWORD2Hex(eventCode).GetData())
-			("receive warn from web, Warn: {%s}(sc=0x%X, uc=0x%X)", s.GetData(), 0, eventCode);
+		auto securityLevel = json_deal::getIntergerFromCjsonObj(js, "securityLevel");
+		if (securityLevel.first == false)
+		{
+			DbgEx("CWSCodec::SerializeLogWarn get securityLevel failed");
+			return;
+		}
+		auto eventCode = json_deal::getIntergerFromCjsonObj(js, "eventCode");
+		if (eventCode.first == false)
+		{
+			DbgEx("CWSCodec::SerializeLogWarn get eventCode failed");
+			return;
+		}
+		auto message = json_deal::getStringFromCjsonObj(js, "message");
+		if (message.first == false)
+		{
+			DbgEx("CWSCodec::SerializeLogWarn get message failed");
+			return;
+		}
+
+		WriteT(data, securityLevel.second, wpos, capacity);
+		WriteT(data, eventCode.second, wpos, capacity);
+		WriteT(data, message.second, wpos, capacity);
+
+		DbgWithLink(securityLevel.second == SeverityLevelEnum::Severity_Low ? LOG_LEVEL_INFO : LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)
+			.setResultCode(DWORD2Hex(eventCode.second).GetData())
+			("receive warn from web, Warn: {%s}(sc=0x%X, uc=0x%X)", message.second.GetData(), 0, eventCode.second);
 	}
 
-	void CWSCodec::SerializeSetVarReq(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg) {
-		int i4 = 0;
-		i4 = cJSON_GetObjectItem(js, "transID")->valueint;
-		WriteT(data, i4, wpos, capacity);
-		CSimpleStringA s = "";
-		s = cJSON_GetObjectItem(js, "name")->valuestring;
-		WriteT(data, s, wpos, capacity);
-		s = cJSON_GetObjectItem(js, "value")->valuestring;
-		WriteT(data, s, wpos, capacity);
+	void CWSCodec::SerializeSetVarReq(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg)
+	{
+		auto transID = json_deal::getIntergerFromCjsonObj(js, "transID");
+		if (transID.first == false)
+		{
+			DbgEx("CWSCodec::SerializeSetVarReq get transID failed");
+			return;
+		}
+		auto name = json_deal::getStringFromCjsonObj(js, "name");
+		if (name.first == false)
+		{
+			DbgEx("CWSCodec::SerializeSetVarReq get name failed");
+			return;
+		}
+		auto value = json_deal::getStringFromCjsonObj(js, "value");
+		if (value.first == false)
+		{
+			DbgEx("CWSCodec::SerializeSetVarReq get value failed");
+			return;
+		}
+
+		WriteT(data, transID.second, wpos, capacity);
+		WriteT(data, name.second, wpos, capacity);
+		WriteT(data, value.second, wpos, capacity);
 	}
 
 	using namespace std;
@@ -1089,12 +1190,21 @@ namespace Chromium {
 	}
 
 	void CWSCodec::SerializeGetVarReq(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg) {
-		int i4 = 0;
-		i4 = cJSON_GetObjectItem(js, "transID")->valueint;
-		WriteT(data, i4, wpos, capacity);
-		CSimpleStringA s = "";
-		s = cJSON_GetObjectItem(js, "name")->valuestring;
-		WriteT(data, s, wpos, capacity);
+		auto  transID = json_deal::getIntergerFromCjsonObj(js, "transID");
+		if (transID.first == false)
+		{
+			DbgEx("CWSCodec::SerializeGetVarReq get transID failed");
+			return;
+		}
+		auto name = json_deal::getStringFromCjsonObj(js, "name");
+		if (name.first == false)
+		{
+			DbgEx("CWSCodec::SerializeGetVarReq get name failed");
+			return;
+		}
+
+		WriteT(data, transID.second, wpos, capacity);
+		WriteT(data, name.second, wpos, capacity);
 	}
 
 
@@ -1122,7 +1232,8 @@ namespace Chromium {
 				return std::make_pair(-1, "error binlen");
 		};
 
-		while (it != pI->mRequestInterpreter.mParamList.end()) {
+		while (it != pI->mRequestInterpreter.mParamList.end()) 
+		{
 			if (it->mType == "int")
 			{
 				unsigned int d = 0;

+ 8 - 2
Module/mod_chromium/CWSCodec.h

@@ -10,6 +10,7 @@
 #include "baseEx.h"
 #include <tuple>
 #include <string>
+#include <boost/thread/mutex.hpp>
 
 
 
@@ -59,6 +60,7 @@ namespace Chromium {
 		void SerializeSetVarReq(cJSON* js, char* data, int* wpos, int* capacity, CMedthodInterface* pI, char* errmsg);
 		void SerializeGetVarReq(cJSON* js, char* data, int* wpos, int* capacity, CMedthodInterface* pI, char* errmsg);
 		void GeneralSerialize(cJSON* js, char* data, int* wpos, int* capacity, CMedthodInterface* pI, char* errmsg);
+		void SerializeLinkInfo(cJSON* js, char* data, int* wpos, int* capacity, char* errmsg);
 
 		bool GetCJsonObjectValue(cJSON* root, const char* strKey, char* dstValue, char* errmsg);
 		template<typename T>
@@ -87,11 +89,15 @@ namespace Chromium {
 		void hexdump(const char* buf, const int num);
 	private:
 		CStructureInterpreter* mInterpreter;
-		std::map<int, entity_def_struct>* m_AckCallbackList;
-		std::map<int, std::vector<CMedthodInterface>*>* m_EventCallbackList;
+		std::map<int, entity_def_struct> m_AckCallbackList;
+		//std::map不是线程安全的,需要做一个保护,避免不确定行为
+		//由堆数据转换为栈数据,从实际生产上看。该值可能为NULL,估计是由于内存分配异常导致
+		std::map<int, std::vector<CMedthodInterface>*> m_EventCallbackList;
+		//由堆数据转换为栈数据, 基于和ackList相同的逻辑
 		CMessage m_DeserializeCache;
 		CMessage m_SerializeCache;	//存在脏数据可能
 		CSmartPointer<IEntityFunction> m_pFunc;
+		boost::mutex m_ackMutex;
 	};
 }
 

+ 164 - 42
Module/mod_chromium/CWebsocketServer.cpp

@@ -1,6 +1,5 @@
 #include "stdafx.h"
 #if (defined _WIN32 || defined _WIN64)
-#include "../mod_browser/IEBrowser_client_g.h"
 #else
 #include <future>
 #include <thread>
@@ -24,12 +23,8 @@ namespace Chromium {
 
 	CWebsocketServer::CWebsocketServer(const char* strPath, CEntityBase* pEntity) : m_ios(), m_serializer(NULL), m_socket(NULL), m_pEntity(pEntity), m_initSuccess(false)
 	{
-		DbgEx("CWebsocketServer constructor");
-		// Initialize socket client
-		DbgEx("Initialize socket client");
 		this->m_pEntity = pEntity;
 		m_socket = new CSocketClient(m_ios, "127.0.0.1", "4504", pEntity, 0);
-		DbgEx("Set socket client MessageHandler -- message_handler");
 		m_socket->SetMessageHandler(this);
 
 		// Initialize serializer
@@ -44,10 +39,21 @@ namespace Chromium {
 		DbgEx("init Entity Session Manager");
 
 		myTest();
-		m_esm = new EntitySessionManager();
 
-		init_websocket();
+		try {
+			m_esm = new EntitySessionManager();
+		}
+		catch (const std::bad_alloc& e)
+		{
+			DbgEx("CWebsocketServer::CWebsocketServer Memory allocation failed: %s", e.what());
+		}
+		catch (const std::exception& e)
+		{
+			DbgEx("CWebsocketServer::CWebsocketServer Error: %s", e.what());
+		}
+		
 
+		init_websocket();
 		init_entity_sessions();
 	}
 
@@ -149,14 +155,15 @@ namespace Chromium {
 				if (nullptr != p)
 					cJSON_Delete(p);
 				});
-			auto transIdJson = cJSON_GetObjectItem(pJson.get(), "transId");
-			if (transIdJson == nullptr)
+			const char* transId_nodeName = "transId";
+			auto transid = json_deal::getIntergerFromCjsonObj(pJson.get(), transId_nodeName);
+			if (transid.first == false)
 			{
 				DbgEx("deal_webchromium_msg err, transIdJson == null");
 				return;
 			}
-			int transid = transIdJson->valueint;
-			updateNotifyPool((long)hdl.lock().get(), transid);
+			
+			updateNotifyPool((long)hdl.lock().get(), transid.second);
 		}
 		break;
 		case UnRegisterNotify:
@@ -178,7 +185,6 @@ namespace Chromium {
 			return;
 		}
 
-		std::string msg = cJSON_GetObjectItem(pJson.get(), "msg")->valuestring;
 		auto changeMessageTypeToLogLevel = [](int messageType) ->LOG_LEVEL_E {
 			switch (messageType)
 			{
@@ -194,8 +200,98 @@ namespace Chromium {
 				return LOG_LEVEL_DEBUG;
 			}
 		};
+		switch (messageType)
+		{
+		case METHOD_SYSTEM_LOG_DEBUG:
+		case METHOD_SYSTEM_LOG_INFO:
+		case METHOD_SYSTEM_LOG_WARN:
+		case METHOD_SYSTEM_LOG_ERROR:
+		{
+			const char* msg_nodeName = "msg";
+			auto msg = json_deal::getStringFromCjsonObj(pJson.get(), msg_nodeName);
+			if (!msg.first)
+			{
+				DbgEx("do not has node %s", msg_nodeName);
+				break;
+			}
+			DbgWithLink(changeMessageTypeToLogLevel(messageType), LOG_TYPE_BUSINESS_SYSTEM)
+				.withLogProducer(logProducer).setAPI("logMsg").withExtendLog(false).setResultMsg(msg.second.GetData())();
+			break;
+		}
 
-		DbgWithLink(changeMessageTypeToLogLevel(messageType), LOG_TYPE_BUSINESS_SYSTEM).withLogProducer(logProducer).setAPI("logMsg").withExtendLog(false).setResultMsg(msg.c_str())();
+		case METHOD_BEIDOU_LOG:
+		{
+			//DbgEx("receive beidou msg:%s", payload.c_str());
+			const char* BusinessId_nodeName = "BusinessId";
+			const char* TraceId_nodeName = "TraceId";
+			const char* SpanId_nodeName = "SpanId";
+			const char* ParentSpanId_nodeName = "ParentSpanId";
+			const char* Timestamp_nodeName = "Timestamp";
+			const char* Host_nodeName = "Host";
+			const char* CallStack_nodeName = "CallStack";
+			const char* DbStack_nodeName = "DbStack";
+			const char* ReturnCode_nodeName = "ReturnCode";
+			const char* Tags_nodeName = "Tags";
+			const char* API_nodeName = "API";
+			auto  BusinessId = json_deal::getStringFromCjsonObj(pJson.get(), BusinessId_nodeName);
+			if (!BusinessId.first)
+			{
+				DbgEx("do not has node %s", BusinessId_nodeName);
+				break;
+			}
+			auto TraceId = json_deal::getStringFromCjsonObj(pJson.get(), TraceId_nodeName);
+			if (!TraceId.first)
+			{
+				DbgEx("do not has node %s", TraceId_nodeName);
+				break;
+			}
+			auto SpanId = json_deal::getStringFromCjsonObj(pJson.get(), SpanId_nodeName);
+			if (!SpanId.first)
+			{
+				DbgEx("do not has node %s", SpanId_nodeName);
+				break;
+			}
+			auto ParentSpanId = json_deal::getStringFromCjsonObj(pJson.get(), ParentSpanId_nodeName);
+			if (!ParentSpanId.first)
+			{
+				DbgEx("do not has node %s", ParentSpanId_nodeName);
+				break;
+			}
+			auto Timestamp = json_deal::getStringFromCjsonObj(pJson.get(), Timestamp_nodeName);
+			if (!Timestamp.first)
+				Timestamp.second = "";
+			auto Host = json_deal::getStringFromCjsonObj(pJson.get(), Host_nodeName);
+			if (!Host.first)
+				Host.second = "";
+			auto CallStack = json_deal::getStringFromCjsonObj(pJson.get(), CallStack_nodeName);
+			if (!CallStack.first)
+				CallStack.second = "";
+			auto DbStack = json_deal::getStringFromCjsonObj(pJson.get(), DbStack_nodeName);
+			if (!DbStack.first)
+				DbStack.second = "";
+			auto ReturnCode = json_deal::getStringFromCjsonObj(pJson.get(), ReturnCode_nodeName);
+			if (!ReturnCode.first)
+				ReturnCode.second = "";
+			auto Tags = json_deal::getStringFromCjsonObj(pJson.get(), Tags_nodeName);
+			if (!Tags.first)
+				Tags.second = "";
+			auto API = json_deal::getStringFromCjsonObj(pJson.get(), API_nodeName);
+			if (!API.first)
+				API.second = "";
+			linkContext cur(BusinessId.second.GetData(), TraceId.second.GetData(), SpanId.second.GetData(), ParentSpanId.second.GetData());
+
+			DbgToBeidou(cur, API.second.GetData())();
+			break;
+		}
+			
+		default:
+			break;
+		}
+
+		
+		
+
+		
 	}
 
 	void CWebsocketServer::deal_sessionBreakMsg(std::string& payload, websocketpp::connection_hdl hdl)
@@ -208,21 +304,31 @@ namespace Chromium {
 			DbgEx("CWebsocketServer -> deal_sessionBreakMsg, jsonErr:%s", payload.c_str());
 			return;
 		}
-		int transidNum = cJSON_GetObjectItem(pJson.get(), "transId")->valueint;
-		int messageTypeNum = cJSON_GetObjectItem(pJson.get(), "messageType")->valueint;
+		auto transidNum = json_deal::getIntergerFromCjsonObj(pJson.get(), "transId");
+		if (transidNum.first == false)
+		{
+			DbgEx("CWebsocketServer::deal_sessionBreakMs get transId failed");
+			return;
+		}
+
 
 		std::string sessionId = std::to_string((LONGLONG)-1);
-		std::string transid = std::to_string((LONGLONG)transidNum);
+		std::string transid = std::to_string((LONGLONG)transidNum.second);
+		/*
 		std::string js = "{\"messageType\":5,\"errorCode\":\"1537\",\"errorMsg\":\"session break\",\"sessionID\":";
 		js.append(sessionId.c_str());
 		js.append(",\"transID\":");
 		js.append(transid.c_str());
 		js.append("}");
+		*/
+
+		std::string js = CSimpleString::Format("{\"messageType\":5,\"errorCode\":\"%d\",\"errorMsg\":\"1537 session break\",\"sessionID\":-1,\"transID\":125}", Error_DevNotAvailable).GetData();
 
 		js = restroreTransId(js);
 		DbgEx("deal_sessionBreakMsg, len:%d, srcPayLoad:%s, ret:%s", payload.length()
 			, payload.length() > 800 ? payload.substr(0, 800).append("...").c_str() : payload.c_str(), js.c_str());
-		m_wsserver.send(hdl, js, websocketpp::frame::opcode::TEXT);
+		websocketpp::lib::error_code dstExption;
+		m_wsserver.send(hdl, js, websocketpp::frame::opcode::TEXT, dstExption);
 
 	}
 
@@ -247,14 +353,18 @@ namespace Chromium {
 					if (nullptr != p)
 						cJSON_Delete(p);
 					});
-				auto transIdJson = cJSON_GetObjectItem(pJson.get(), "transId");
-				if(transIdJson != nullptr)
+				auto transIdJson = json_deal::getIntergerFromCjsonObj(pJson.get(), "transId");
+				if (transIdJson.first)
 				{
-					std::string errRetJs = "{\"messageType\":4,\"transID\":" + std::to_string((LONGLONG)transIdJson->valueint) + ",\"errorCode\":103,\"errorMsg\":\"can not find entity or class!\"}";
+					std::string errRetJs = "{\"messageType\":4,\"transID\":" + std::to_string((LONGLONG)transIdJson.second) + ",\"errorCode\":103,\"errorMsg\":\"can not find entity or class!\"}";
 					auto js = restroreTransId(errRetJs);
 					DbgEx("deal_msg %s get null msg, ret:%s", ret.first == Request ? "Request" : "Info", errRetJs.c_str());
-					m_wsserver.send(hdl, js, websocketpp::frame::opcode::TEXT);
+					websocketpp::lib::error_code dstExption;
+					m_wsserver.send(hdl, js, websocketpp::frame::opcode::TEXT, dstExption);
 				}
+				else
+					DbgEx("CWebsocketServer::deal_msg get transIdJson failed");
+
 				return;
 			}
 		}
@@ -264,18 +374,22 @@ namespace Chromium {
 				if (nullptr != p)
 					cJSON_Delete(p);
 				});
-			auto transIdJson = cJSON_GetObjectItem(pJson.get(), "transId");
-			if (transIdJson != nullptr)
+
+			auto transIdJson = json_deal::getIntergerFromCjsonObj(pJson.get(), "transId");
+			if (transIdJson.first)
 			{
-				int transid = transIdJson->valueint;
+				int transid = transIdJson.second;
 				auto sessionRet = m_esm->GetAllSessionRequest(transid);
 				DbgEx("sessionJson:%s", sessionRet.second.c_str());
 				if (sessionRet.first)
 				{
 					auto js = restroreTransId(sessionRet.second);
-					m_wsserver.send(hdl, js, websocketpp::frame::opcode::TEXT);
+					websocketpp::lib::error_code dstExption;
+					m_wsserver.send(hdl, js, websocketpp::frame::opcode::TEXT, dstExption);
 				}
 			}
+			else
+				DbgEx("CWebsocketServer::deal_msg get transIdJson failed");
 			return;
 		}
 		else if (ret.first == BeginSession)
@@ -312,7 +426,8 @@ namespace Chromium {
 			DbgEx("do PROCESS_FINDSESSION");
 			std::string js = m_esm->GetStartSessionAck(p, m_serializer->GetEntityName(payload));
 			js = restroreTransId(js);
-			m_wsserver.send(hdl, js, websocketpp::frame::opcode::TEXT);
+			websocketpp::lib::error_code dstExption;
+			m_wsserver.send(hdl, js, websocketpp::frame::opcode::TEXT, dstExption);
 		}
 		break;
 		case Chromium::PROCESS_RECORDMSG:
@@ -363,7 +478,8 @@ namespace Chromium {
 				DbgEx("CWebsocketServer -> message_handler, jsonErr:%s", payload.c_str());
 				return;
 			}
-			auto transIdJson = cJSON_GetObjectItem(pJson.get(), "transId");
+
+			auto transIdJson = cJSON_GetObjectItem(pJson.get(), "transId");//不做相关改造,因为这里还使用了set
 			if (transIdJson != nullptr)
 			{
 				int transid = transIdJson->valueint;
@@ -371,8 +487,10 @@ namespace Chromium {
 				int dstTransId = transid ^ modifyT;
 				cJSON_SetIntValue(transIdJson, dstTransId);
 			}
-			auto messageTypeJson = cJSON_GetObjectItem(pJson.get(), "messageType");
-			if (messageTypeJson == nullptr) {
+
+			auto messageTypeJson = json_deal::getIntergerFromCjsonObj(pJson.get(), "messageType");
+			if (messageTypeJson.first == false)
+			{
 				DbgEx("CWebsocketServer -> messageTypeJson == null");
 				return;
 			}
@@ -381,7 +499,7 @@ namespace Chromium {
 			std::string dstPayLoad = unformateStr;
 			delete[]unformateStr;
 
-			auto messageType = messageTypeJson->valueint;
+			auto messageType = messageTypeJson.second;
 			if (messageType < WEB_CHROMIUM_MSG_BEGIN)
 			{
 				DbgEx("deal_msg, messageType:%d(%s), len:%d, payload:%s", messageType, GetMessageTypeString(messageType).c_str(),
@@ -396,8 +514,8 @@ namespace Chromium {
 			}				
 			else if (messageType > METHOD_SYSTEM_START && messageType < METHOD_SYSTEM_END)
 				deal_logMsg(dstPayLoad, hdl, messageType);
-
-			//DbgEx("Leave CWebsocketServer -> message_handler");
+			else if (messageType == METHOD_BEIDOU_LOG)
+				deal_logMsg(dstPayLoad, hdl, messageType);
 		};
 		boost::thread dealMsgThread(msgHandleFun);
 		dealMsgThread.join();
@@ -409,7 +527,7 @@ namespace Chromium {
 			if (nullptr != p)
 				cJSON_Delete(p);
 			});
-		auto transIdJson = cJSON_GetObjectItem(pJson.get(), "transId");
+		auto transIdJson = cJSON_GetObjectItem(pJson.get(), "transId");//不改动,因为需要set
 		if (transIdJson != nullptr)
 		{
 			int transid = transIdJson->valueint;
@@ -584,7 +702,8 @@ namespace Chromium {
 				try
 				{
 					websocketpp::connection_hdl hdl = it->second;
-					m_wsserver.send(hdl, js, websocketpp::frame::opcode::TEXT);
+					websocketpp::lib::error_code dstExption;
+					m_wsserver.send(hdl, js, websocketpp::frame::opcode::TEXT, dstExption);
 				}
 				catch (const websocketpp::lib::error_code& e)
 				{
@@ -615,7 +734,8 @@ namespace Chromium {
 			{
 				//DbgEx("Send....");
 				websocketpp::connection_hdl hdl = it->second;
-				m_wsserver.send(hdl, notifyMsg.GetData(), websocketpp::frame::opcode::TEXT);
+				websocketpp::lib::error_code dstExption;
+				m_wsserver.send(hdl, notifyMsg.GetData(), websocketpp::frame::opcode::TEXT, dstExption);
 			}
 			//DbgEx("do_send_notifyMsg End...");
 		}
@@ -633,10 +753,11 @@ namespace Chromium {
 
 
 
-	void CWebsocketServer::do_sendJson(std::string js, int hdlID, unsigned int id)
+	void CWebsocketServer::do_sendJson(std::string js, int messageType, int hdlID, unsigned int id)
 	{
 		js = restroreTransId(js);
-		DbgEx("WebSocket Search message_from_socket : json = %s", js.c_str());
+		if(messageType != MessageType::RequestAck)
+			DbgEx("WebSocket Search message_from_socket : json = %s", js.c_str());
 		if (js.empty())
 		{
 			DbgEx("string empty");
@@ -660,7 +781,8 @@ namespace Chromium {
 				{
 					//DbgEx("Send....");
 					websocketpp::connection_hdl hdl = it->second;
-					m_wsserver.send(hdl, js, websocketpp::frame::opcode::TEXT);
+					websocketpp::lib::error_code dstExption;
+					m_wsserver.send(hdl, js, websocketpp::frame::opcode::TEXT, dstExption);
 				}
 				else 
 					DbgEx("ws connection handler not found! id = %u", id);
@@ -712,7 +834,7 @@ namespace Chromium {
 			{
 				msg.setTransID(i->first);
 				std::string js = this->m_serializer->BufferToJson(msg, boost::bind(&EntitySessionManager::doWithErrorCode, m_esm, _1, _2), 0);
-				do_sendJson(js, i->second, id);
+				do_sendJson(js, msg.getMessageType(), i->second, id);
 			}
 		}
 		else if (2 == msg.getMessageType())	//session end
@@ -738,7 +860,7 @@ namespace Chromium {
 			if (0 != hdlID)
 			{//hdlId为0时,说明本地发起的session
 				std::string js = this->m_serializer->BufferToJson(msg, boost::bind(&EntitySessionManager::doWithErrorCode, m_esm, _1, _2), replaceTransId);
-				do_sendJson(js, hdlID, id);	//发给首记录的CMessage
+				do_sendJson(js, msg.getMessageType(), hdlID, id);	//发给首记录的CMessage
 			}
 
 			for (auto cur = m_msg_pool.begin(); cur != m_msg_pool.end(); cur++)
@@ -772,9 +894,9 @@ namespace Chromium {
 		}
 		else
 		{
-			m_esm->AckProcess(&msg, hdlID);
+			m_esm->AckProcess(&msg, hdlID); //替换真实的transId,update session map
 			std::string js = this->m_serializer->BufferToJson(msg, boost::bind(&EntitySessionManager::doWithErrorCode, m_esm, _1, _2), replaceTransId);
-			do_sendJson(js, hdlID, id);
+			do_sendJson(js, msg.getMessageType(), hdlID, id);
 		}
 
 	}

+ 1 - 1
Module/mod_chromium/CWebsocketServer.h

@@ -52,7 +52,7 @@ namespace Chromium {
 		void do_run();
 		void init_websocket();
 		void init_entity_sessions();
-		void do_sendJson(std::string js, int hdlID, unsigned int id);
+		void do_sendJson(std::string js, int messageType, int hdlID, unsigned int id);
 		void do_sendJsonBroadcast(std::string js);
 		void WriteToFramework(CMessage* msg);
 #if(defined _WIN32 || defined _WIN64)

+ 3 - 0
Module/mod_chromium/Chromium_def_g.h

@@ -18,6 +18,9 @@ namespace Chromium {
 #define ChromiumSrv_MethodSignature_OpenBrowser 1632538869
 #define ChromiumSrv_MethodSignature_CloseBrowser -1561571899
 
+#define ChromiumSrv_LogCode_OpenBrowser "QLR040240200"
+#define ChromiumSrv_LogCode_CloseBrowser "QLR040240201"
+
 struct ChromiumSrv_OpenBrowser_Req
 {
 	CSimpleStringA mainUrl;

+ 28 - 19
Module/mod_chromium/EntitySessionManager.cpp

@@ -151,11 +151,14 @@ namespace Chromium {
 	}
 
 	RequestProcessType EntitySessionManager::ProcessWithInfo(CMessage* msg, std::string entityName, unsigned int hdlID) {
-		DbgEx("EntitySessionManager::ProcessWithInfo");
-		auto s = GetSessionIDByEntityName(entityName);
-		if (false == s.first || -1 == s.second)
-			return PROCESS_NOTHING;
-		msg->setSessionID(s.second, false);
+		auto it = m_session_map.find(entityName);
+		if (it == m_session_map.end() || -1 == it->second)
+		{
+			DbgEx("no session found for entity : %s", UtfToGbk(entityName.c_str()).c_str());
+			return PROCESS_STARTSESSION;
+		}
+		msg->setSessionID(it->second, false);
+		DbgEx("EntitySessionManager::ProcessWithInfo, replace sessionID:%d", it->second);
 		return PROCESS_SEND;
 	}
 
@@ -209,7 +212,7 @@ namespace Chromium {
 
 	RequestProcessType EntitySessionManager::ProcessWithRequest(CMessage* msg, std::string entityName,
 		unsigned int hdlID) {
-		DbgEx("EntitySessionManager::ProcessWithRequest");
+		
 		auto it = m_session_map.find(entityName);
 		if (it == m_session_map.end() || -1 == it->second)
 		{
@@ -217,8 +220,9 @@ namespace Chromium {
 			return PROCESS_STARTSESSION;
 		}
 		msg->setSessionID(it->second, true);
-		msg->setTransID(MakeNewTransID(msg, hdlID));
-
+		auto transId = MakeNewTransID(msg, hdlID);
+		msg->setTransID(transId);
+		DbgEx("EntitySessionManager::ProcessWithRequest, replace sessionID:%d, replace transId:%d", it->second, transId);
 		return PROCESS_SEND;
 	}
 
@@ -398,17 +402,22 @@ namespace Chromium {
 	EntitySessionManager& EntitySessionManager::DoSessionUpdate(std::string entityname, int session)
 	{
 		auto sessionIt = m_session_map.find(entityname);
-		bool needChange = true;
-		if (m_session_map.end() != sessionIt)
-		{
 
+		if(m_session_map.end() != sessionIt)
+		{
 			if (sessionIt->second == session)
-				needChange = false;
-			m_session_map.erase(sessionIt);
+				return *this;//相等不处理
+			else if(sessionIt->second == -1 || session == -1)
+			{
+				DbgEx("update sessionId(regenerate):<%s><%d>", entityname.c_str(), session);
+				m_session_map.erase(sessionIt);
+				m_session_map.insert(std::make_pair(entityname, session));
+			}
+			else
+				DbgEx("session Error(src:%d), do not update sessionId:<%s><%d>", sessionIt->second, entityname.c_str(), session);
 		}
-		if (needChange)
-			DbgEx("update sessionId :<%s><%d>", entityname.c_str(), session);
-		m_session_map.insert(std::make_pair(entityname, session));
+		else
+			m_session_map.insert(std::make_pair(entityname, session));//not exist
 		return *this;
 	}
 
@@ -418,11 +427,9 @@ namespace Chromium {
 		if (NULL == p)
 			return ACKPROCESS_NOTHING;// 异常 应该不会有这种情况出现
 
-		//msg->setTransID(p->transID);//可以不需要替换
 		hdlID = p->hdlID;
 		UpdateSessionMap(globalID, msg->getSessionID());
 
-		//RemoveAckListNode(globalID);
 		if (hdlID == 0) {
 			return ACKPROCESS_NOTHING;
 		}
@@ -477,6 +484,8 @@ namespace Chromium {
 		switch (errorCode)
 		{
 		case Error_Break:
+		case Error_MethodNotFound:
+		case Error_MethodSignatureFailed:
 			UpdateSessionMap(transId, -1);
 			break;
 		default:
@@ -525,7 +534,7 @@ namespace Chromium {
 		case RequestAck:
 		case GetVarAck:
 		case SetVarAck:
-			ret = ProcessWithAck(msg, hdlID);
+			ProcessWithAck(msg, hdlID);
 			break;
 		default:
 			DbgEx("AckProcess default!");

+ 3 - 0
Module/mod_chromium/MessageType.cpp

@@ -34,6 +34,7 @@ std::string GetMessageTypeString(int messageType) {
 		CASE(METHOD_SYSTEM_LOG_INFO);
 		CASE(METHOD_SYSTEM_LOG_WARN);
 		CASE(METHOD_SYSTEM_LOG_ERROR);
+		CASE(METHOD_BEIDOU_LOG);
 		CASE(METHOD_SYSTEM_END);
 	default:
 		return "UNKNOWN";
@@ -95,6 +96,8 @@ std::string GetMessageTypeString(int messageType) {
 		return "METHOD_SYSTEM_LOG_WARN";
 	case METHOD_SYSTEM_LOG_ERROR:
 		return "METHOD_SYSTEM_LOG_ERROR";
+	case METHOD_BEIDOU_LOG:
+		return "METHOD_BEIDOU_LOG";
 	case METHOD_SYSTEM_END:
 		return "METHOD_SYSTEM_END";
 	default:

+ 1 - 0
Module/mod_chromium/MessageType.h

@@ -38,6 +38,7 @@ enum MessageType : int
 	METHOD_SYSTEM_LOG_WARN,
 	METHOD_SYSTEM_LOG_ERROR,
 	METHOD_SYSTEM_END = 0x2FFFFF,
+	METHOD_BEIDOU_LOG = 0x3F0001,
 };
 
 #define PARAMLIST_HEAD	"{e12a3dc0-3a0b-47c4-a8c3-75190a42ae68}"

+ 215 - 13
Module/mod_chromium/baseEx.cpp

@@ -4,13 +4,19 @@
 #include <iostream>
 #include <vector>
 #include <set>
+#include <map>
 #include <boost/xpressive/xpressive_dynamic.hpp>
 #include <boost/algorithm/string.hpp>
 #include <boost/filesystem.hpp>
 #include <boost/chrono.hpp>
 #include <boost/interprocess/ipc/message_queue.hpp>
 #include <boost/interprocess/permissions.hpp>
+#include <boost/thread/mutex.hpp>
+#include <boost/thread/lock_guard.hpp>
+
+#include "EventCode.h"
 #include "exLog/log.h"
+#include "cJSON.h"
 using namespace boost::interprocess;
 
 //read ini
@@ -24,7 +30,11 @@ using namespace boost::interprocess;
 void* logProducer = nullptr;
 bool g_useMagic = false;
 bool g_loggerInitSuccess = false;
+bool g_logToFile = true;
 std::string g_usercodeTranslateFile = "";
+std::map<std::string, std::vector<std::string>> g_networkParse;
+std::map<std::string, clock_t> g_networkExpiredData;
+boost::mutex g_networkMutex;
 
 const std::wstring WCHAR_NULL = L"";
 const std::wstring specialStr = L"乗俓僜刓匼哱圽塡奬媆峔嶾廫慭怽揬昞朶梊榎橽歕沑漒瀄焅燶猏玕琝甛璡痋盶癨瞈砛碶穃竆筡篭糪絓綷縗繺羂耚肻腬臶臷芢蒤薥蚛蝄蟎衆蟎裓覾譢豛赲踈躙輁郳醆鈂鉢鎈鏫閈闬隲頫颸餦馶骪鯸鮘鳿鵟鸤黒齖";
@@ -36,6 +46,8 @@ const std::wstring specialStr = L"乗俓僜刓匼哱圽塡奬媆峔嶾廫慭怽
 
 
 #if (defined _WIN32 || defined _WIN64)
+#include <ShellAPI.h>
+
 std::string UtfToGbk(const char* utf8)
 {
 	int len = MultiByteToWideChar(CP_UTF8, 0, utf8, -1, NULL, 0);
@@ -122,14 +134,13 @@ void DbgEx(const char* str, ...)
 
 #if (defined _WIN32 || defined _WIN64)
 	int n = _vscprintf(str, arg);
-	char* buf = (char*)_malloca(n + 1);
+	char* buf = (char*)malloc(n + 1);
 	vsprintf(buf, str, arg);
-	auto modifyStr = CSimpleString::Format("<%d>--%s", GetCurrentThreadId(), buf);
-	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("%s", modifyStr.GetData());
-	_freea(buf);
+	auto modifyStr = CSimpleString::Format("%s", buf);
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).withExtendLog(g_logToFile).setResultMsg(modifyStr.GetData())();
+	free(buf);
 #else
 	auto modifyStr = CSimpleString::Format("%s", str);
-	//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("%s", modifyStr.GetData());
 	vDbg(modifyStr.GetData(), arg);
 #endif
 
@@ -154,11 +165,40 @@ bool SYSTEM_ON(std::string cmdLine, bool isWait)
 		ShExecInfo.lpDirectory = NULL;
 		ShExecInfo.nShow = nShow ? SW_SHOW : SW_HIDE;		//窗口状态为隐藏
 		ShExecInfo.hInstApp = NULL;
-		ShellExecuteEx(&ShExecInfo);
-		WaitForSingleObject(ShExecInfo.hProcess, INFINITE);		//等到该进程结束
-		DWORD exitCode = 0;
-		GetExitCodeProcess(ShExecInfo.hProcess, &exitCode);
-		return exitCode;
+		if (ShellExecuteEx(&ShExecInfo) && ShExecInfo.hProcess)//如果设置了 SEE_MASK_NOCLOSEPROCESS ,并且调用成功则该值大于32,调用失败者被设置错误值
+		{
+			//创建进程成功
+			WaitForSingleObject(ShExecInfo.hProcess, INFINITE);		//等到该进程结束
+			DWORD exitCode = 0;
+			GetExitCodeProcess(ShExecInfo.hProcess, &exitCode);
+			return exitCode;
+		}
+		else {
+			std::string errMsg;
+			auto errorCode = GetLastError();
+			switch (errorCode)
+			{
+#define CASE(code) \
+  case code:       \
+    errMsg = #code; \
+	break
+				CASE(ERROR_FILE_NOT_FOUND);
+				CASE(ERROR_PATH_NOT_FOUND);
+				CASE(ERROR_DDE_FAIL);
+				CASE(ERROR_NO_ASSOCIATION);
+				CASE(ERROR_ACCESS_DENIED);
+				CASE(ERROR_DLL_NOT_FOUND);
+				CASE(ERROR_CANCELLED);
+				CASE(ERROR_NOT_ENOUGH_MEMORY);
+				CASE(ERROR_SHARING_VIOLATION);
+			default:
+				errMsg = "UNKNOWN";
+			}
+			DbgEx("SYSTEM_ON wait with %s failed, reason:%d-%s", par.c_str(), errorCode, errMsg.c_str());
+			return false;
+		}
+		
+		
 	};
 
 	std::string strCmd, strPar;
@@ -172,7 +212,13 @@ bool SYSTEM_ON(std::string cmdLine, bool isWait)
 	else {
 		strCmd = cmdLine;
 		unsigned int result = WinExec(strCmd.c_str(), SW_HIDE);
-		return result > 31 ? true : false;
+		if (result > 31)
+			return true;
+		else
+		{
+			DbgEx("SYSTEM_ON nowait with %s failed, reason:%d", result);
+			return false;
+		}
 	}
 #else
 	system(cmdLine.c_str());
@@ -300,8 +346,8 @@ std::pair<unsigned long, std::string> splitStrToUserCodeAndErrMsg(std::string sr
 		std::string tipMsg = tag.get<std::string>(userCodeStr);
 		return std::make_pair(userCode, UtfToGbk(tipMsg.c_str()));
 	}
-	catch (...) {
-		DbgEx("ini_parse failed");
+	catch (std::exception &e) {
+		DbgEx("ini_parse failed, reason:%s", e.what());
 	}
 	
 	return std::make_pair(userCode, srcMsg);
@@ -484,4 +530,160 @@ void receivehexdump(const char* buf, const int num) {
 	}
 	DbgEx("receivehexdump hex buf len = %d : %s", num, str);
 	return;
+}
+
+void doWithDebugModeData(const char* strMethod, const char* buf)
+{
+	boost::lock_guard<boost::mutex> lock(g_networkMutex);
+	if(std::string(strMethod).find("Network.") == 0)
+	{
+		/*for example
+		{
+		    "method": "Network.requestWillBeSent", 
+		    "params": {
+		        "documentURL": "https://www.btbtt12.com/", 
+		        "frameId": "8F58093A23334B311DB645BA3652E63C", 
+		        "hasUserGesture": false, 
+		        "initiator": {
+		            "type": "other"
+		        }, 
+		        "loaderId": "9F7B28B896C791554C69C5985CA92E79", 
+		        "request": {
+		            "headers": {
+		                "Referer": "https://www.btbtt12.com/", 
+		                "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.113 Safari/537.36"
+		            }, 
+		            "initialPriority": "Low", 
+		            "method": "GET", 
+		            "mixedContentType": "none", 
+		            "referrerPolicy": "no-referrer-when-downgrade", 
+		            "url": "https://pic.picnewsss.com/tu-2022290039/960-60.gif"
+		        }, 
+		        "requestId": "18476.34", 
+		        "timestamp": 19338.811603, 
+		        "type": "Image", 
+		        "wallTime": 1666099893.800733
+		    }
+		}
+		 */
+		std::shared_ptr<cJSON> pJson(cJSON_Parse(buf), [](cJSON* p) {
+			if (nullptr != p)
+				cJSON_Delete(p);
+			});
+		auto paramsItem = cJSON_GetObjectItem(pJson.get(), "params");
+		if (paramsItem == nullptr)
+			return;
+		auto requestIdItem = cJSON_GetObjectItem(paramsItem, "requestId");
+		if (requestIdItem == nullptr)
+			return;
+		std::string requestId_str = requestIdItem->valuestring;
+
+		/*
+		 ['Network.loadingFailed', 'Network.loadingFinished', 'Network.resourceChangedPriority',
+		 'Network.requestServedFromCache', 'Network.requestWillBeSent', 'Network.requestWillBeSentExtraInfo',
+		 'Network.responseReceived', 'Network.responseReceivedExtraInfo', 'Network.dataReceived',
+		 'Page.frameAttached', 'Page.frameRequestedNavigation', 'Page.frameStoppedLoading',
+		 'Page.frameClearedScheduledNavigation', 'Page.loadEventFired', 'Page.frameStartedLoading',
+		 'Page.frameDetached', 'Page.frameScheduledNavigation', 'Page.frameNavigated', 'Page.frameResized',
+		 'Page.domContentEventFired']
+		 
+		 */
+		if(std::string(strMethod) == "Network.loadingFinished")
+		{
+			if (g_networkParse.find(requestId_str) != g_networkParse.end())
+				g_networkParse.erase(requestId_str);
+			if (g_networkExpiredData.find(requestId_str) != g_networkExpiredData.end())
+				g_networkExpiredData.erase(requestId_str);
+			if (g_networkExpiredData.size() < 30)
+				return;
+			for(auto it = g_networkExpiredData.begin(); it != g_networkExpiredData.end();)
+			{
+				if((clock() - it -> second) < 100000)
+				{
+					it++;
+					continue;
+				}
+				if (g_networkParse.find(it->first) != g_networkParse.end())
+					g_networkParse.erase(it->first);
+				g_networkExpiredData.erase(it++);
+
+			}
+		}
+		else if(std::string(strMethod) == "Network.loadingFailed" 
+			|| std::string(strMethod) == "Network.webSocketFrameError" 
+			|| std::string(strMethod) == "Network.requestServedFromCache")
+		{
+			if (g_networkParse.find(requestId_str) != g_networkParse.end())
+			{
+				for(auto it = g_networkParse[requestId_str].begin(); it != g_networkParse[requestId_str].end(); it++)
+					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR0402402Z00001").setResultMsg(it->c_str())();
+				g_networkParse.erase(requestId_str);
+			}
+			else//此时,上一轮记录已结束
+				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402402Z00001").setResultMsg(buf)();
+
+			if (g_networkExpiredData.find(requestId_str) != g_networkExpiredData.end())
+				g_networkExpiredData.erase(requestId_str);
+		}
+		else
+		{
+			if (g_networkParse.find(requestId_str) != g_networkParse.end())
+				g_networkParse[requestId_str].push_back(buf);
+			else
+			{
+				std::vector<std::string> tmp;
+				tmp.push_back(buf);
+				g_networkParse[requestId_str] = tmp;
+				g_networkExpiredData[requestId_str] = clock();
+			}
+		}
+
+	}
+
+
+	if (std::string(strMethod) == "Network.webSocketFrameError" ||
+		std::string(strMethod) == "Network.loadingFailed" ||
+		std::string(strMethod) == "Runtime.exceptionThrown")
+	{
+		LogWarn(Severity_Middle, Error_Debug, LOG_WARN_CHROMIUM_OPENWEBWARN, buf);
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402402Z00002").setResultMsg(buf)();
+	}
+		
+}
+
+
+std::pair<bool, CSimpleStringA> json_deal::getStringFromCjsonObj(void* object, const char* name) 
+{
+	if (object == NULL)
+		return std::make_pair(false, "");
+	auto curNode = cJSON_GetObjectItem((cJSON*)object, name);
+	if (curNode && curNode->type == cJSON_String) {
+		return std::make_pair(true, curNode->valuestring);
+	}
+	else
+		return std::make_pair(false, "");
+}
+
+std::pair<bool, int> json_deal::getIntergerFromCjsonObj(void* object, const char* name)
+{
+	if (object == NULL)
+		return std::make_pair(false, 0);
+	auto curNode = cJSON_GetObjectItem((cJSON*)object, name);
+	if (curNode && curNode->type == cJSON_Number) {
+		return std::make_pair(true, curNode->valueint);
+	}
+	else
+		return std::make_pair(false, 0);
+}
+
+std::pair<bool, double> json_deal::getDoubleFromCjsonObj(void* object, const char* name)
+{
+	if (object == NULL)
+		return std::make_pair(false, 0);
+	auto curNode = cJSON_GetObjectItem((cJSON*)object, name);
+	if (curNode && curNode->type == cJSON_Number) {
+		return std::make_pair(true, curNode->valuedouble);
+	}
+	else
+		return std::make_pair(false, 0);
 }

+ 12 - 0
Module/mod_chromium/baseEx.h

@@ -5,6 +5,9 @@
 
 extern void* logProducer;
 extern bool g_useMagic;
+#if defined(RVC_OS_WIN)
+extern bool g_useMagic;
+#endif //RVC_OS_WIN
 
 
 void DbgEx(const char* str, ...);
@@ -29,6 +32,15 @@ bool modifyBySpecialStr(std::wstring& src);
 
 void receivehexdump(const char* buf, const int num);
 
+void doWithDebugModeData(const char* strMethod, const char* buf);
+
+class json_deal {
+public:
+	static std::pair<bool, CSimpleStringA> getStringFromCjsonObj(void* object, const char* name);
+	static std::pair<bool, int> getIntergerFromCjsonObj(void* object, const char* name);
+	static std::pair<bool, double> getDoubleFromCjsonObj(void* object, const char* name);
+};
+
 
 #if (defined _WIN32 || defined _WIN64)
 long WINAPI  printSEG(struct _EXCEPTION_POINTERS* ExceptionInfo);

+ 130 - 76
Module/mod_chromium/mod_chromium.cpp

@@ -47,15 +47,19 @@ void DbgByCefControl(const char * strMethod, const char* buf)
 #endif //_MSC_VER
 }
 
+
+
 namespace Chromium {
 
 	void ChromiumSession::Handle_OpenBrowser(SpReqAnsContext<ChromiumSrv_OpenBrowser_Req, ChromiumSrv_OpenBrowser_Ans>::Pointer ctx)
 	{
+		DbgToBeidou(ctx->link, __FUNCTION__)();
 		m_pEntity->OpenBrowser(ctx);
 	}
 
 	void ChromiumSession::Handle_CloseBrowser(SpReqAnsContext<ChromiumSrv_CloseBrowser_Req, ChromiumSrv_CloseBrowser_Ans>::Pointer ctx)
 	{
+		DbgToBeidou(ctx->link, __FUNCTION__)();
 		m_pEntity->CloseBrowser(ctx);
 	}
 
@@ -325,6 +329,8 @@ namespace Chromium {
 							CModTools::get_mutable_instance().setWithMin(m_withMin);
 						if (m_withClose)
 							CModTools::get_mutable_instance().setWithClose(m_withClose);
+						
+						g_logToFile = !m_withNoFileLog;
 
 
 						int forceCacheClean = false;
@@ -364,8 +370,13 @@ namespace Chromium {
 
 				InitTranslateFile(translatePath.GetData());
 
-				std::string magicStr = CModTools::get_mutable_instance().getMagicStr();
-				boost::thread(boost::bind(SaveCefclientLog, magicStr)).detach();
+				if (m_withMagic)
+				{
+					std::string magicStr = CModTools::get_mutable_instance().getMagicStr();
+					boost::thread(boost::bind(SaveCefclientLog, magicStr)).detach();
+				}				
+
+				boost::thread(boost::bind(&CChromiumEntity::DoWithSysVarEvent, this)).detach();//用于处理sysvar,避免由于阻塞动作,导致实体卡住,lost
 		}
 	}
 
@@ -441,22 +452,13 @@ namespace Chromium {
 
 	bool CChromiumEntity::OnPreStart_openWeb()
 	{
-		//generateBussinessLimitTimer();
-#if (defined _WIN32 || defined _WIN64)
-		if (strArgs.GetCount())
-		{
-			if (!m_strCustomMainUrl.IsNullOrEmpty())
-				openMainPage();
-			if (!m_strCustomAdUrl.IsNullOrEmpty())
-				openAdPage();
-			return true;
-		}
-#endif
-
+		if (m_runExtend)
+			openExtendPage();
 
-		if (m_runExtend) openExtendPage();
+		if (!m_runMain)//不启动页面
+			return true;
 
-		if (m_runMain)
+		do
 		{
 			CSimpleStringA t_EntryPermit, t_terminalState;
 			GetFunction()->GetSysVar("EntryPermit", t_EntryPermit);
@@ -467,8 +469,15 @@ namespace Chromium {
 				if ('X' == t_terminalState[0])
 				{
 					DbgEx("do not begin accessAuth, terminalStage X, do nothing.");
+					break;
 				}
-				else if (!m_withBrowser)
+				else if ('S' == t_terminalState[0])
+				{
+					auto openRet = CModTools::get_mutable_instance().StartChromiumBrowser(ERR_PAGE_REASON::warnPrompt,
+						std::tuple <std::string, std::string>(m_sysInfo.strTerminalID.GetData(), generateTimeStr()));
+					DbgEx("access failed, open page warnPrompt %s, %d", Error_Succeed == openRet.first ? "success" : "fail", openRet.second);
+				}
+				else
 				{
 					auto openRet = CModTools::get_mutable_instance().StartChromiumBrowser(ERR_PAGE_REASON::breakdown,
 						std::tuple <std::string, std::string>(m_sysInfo.strTerminalID.GetData(), generateTimeStr()));
@@ -479,8 +488,14 @@ namespace Chromium {
 			{
 				if (m_runAd) openAdPage();
 				openMainPage();
-			}		
-		}
+#if (defined _WIN32 || defined _WIN64)
+				if (m_withDebugMode)
+					getNetworkInfo(L"127.0.0.1:9222", L"", &DbgByCefControl);
+#endif
+			}
+		} while (false);
+		
+
 
 		return true;
 	}
@@ -518,6 +533,17 @@ namespace Chromium {
 			if (!OnPreStart_register(strArgs, pTransactionContext)) {
 				return;
 			}
+			//if contain default setting, then oepn web by setting
+#if (defined _WIN32 || defined _WIN64)
+			if (strArgs.GetCount())
+			{
+				if (!m_strCustomMainUrl.IsNullOrEmpty())
+					openMainPage();
+				if (!m_strCustomAdUrl.IsNullOrEmpty())
+					openAdPage();
+				return;
+			}
+#endif
 			if (!OnPreStart_openWeb()) {
 				return;
 			}
@@ -530,64 +556,90 @@ namespace Chromium {
 		return m_sysInfo.strMachineType.IsEndWith("CardStore", true) || m_sysInfo.strMachineType.IsEndWith("CardPrinter", true);
 	}
 
-	void CChromiumEntity::OnSysVarEvent(const char* pszKey, const char* pszValue, const char* pszOldValue, const char* pszEntityName)
+	void CChromiumEntity::DoWithSysVarEvent()
 	{
-		DbgEx("OnSysVarEvent %s, old->new:%s->%s", pszKey, pszOldValue, pszValue);
-		if ((strnicmp(pszKey, "UIState", strlen("UIState")) == 0))
+		while (true)
 		{
-			if (strnicmp(pszValue, "M", strlen("M")) == 0)
+			if (m_eventArr.empty())
 			{
-				static bool firstEnter = true;
-				if (firstEnter)
+				boost::this_thread::sleep_for(boost::chrono::microseconds(100));
+				continue;
+			}
+
+			m_eventContorl.lock();
+			SYS_EVENT_PARAM curEvent = m_eventArr.front();
+			m_eventArr.pop_front();
+			m_eventContorl.unlock();
+			if ((strnicmp(curEvent.key.c_str(), "UIState", strlen("UIState")) == 0))
+			{
+				if (strnicmp(curEvent.value.c_str(), "M", strlen("M")) == 0)
 				{
-					firstEnter = false;
-					DbgEx("first Enter main page");
-					m_firstStartMain.unlock();
-					LogWarn(Severity_Low, Error_Debug, LOG_SLV_CHROMIUM_OPENSUCCESS,
-						CSimpleStringA::Format("Chromium Enter main page success, %s", CModTools::get_mutable_instance().getFultureUrl().GetData()));
+					static bool firstEnter = true;
+					if (firstEnter)
+					{
+						firstEnter = false;
+						DbgEx("first Enter main page");
+						m_firstStartMain.unlock();
+						LogWarn(Severity_Low, Error_Debug, LOG_SLV_CHROMIUM_OPENSUCCESS,
+							CSimpleStringA::Format("Chromium Enter main page success, %s", CModTools::get_mutable_instance().getFultureUrl().GetData()));
+					}
+					GetFunction()->UnregistSysVarEvent("UIState");
 				}
-				GetFunction()->UnregistSysVarEvent("UIState");
 			}
-		}
-		/** 该事件有变化才会触发错误页 [Gifur@2022324]*/
-		else if (0 == CSimpleStringA("TerminalStage").Compare(pszKey, true))
-		{
-			if (0 == CSimpleStringA("A").Compare(pszValue, true))
+			/** 该事件有变化才会触发错误页 [Gifur@2022324]*/
+			else if (0 == CSimpleStringA("TerminalStage").Compare(curEvent.key.c_str(), true))
 			{
-				if(CModTools::get_mutable_instance().IsConfigWork())//url正常时才关闭
+				if (0 == CSimpleStringA("A").Compare(curEvent.value.c_str(), true))
 				{
-					CModTools::get_mutable_instance().StopChromiumBrowser(ERR_PAGE_REASON::breakdown);
-					if (m_runAd) openAdPage();
-					openMainPage();
-					//DbgEx("UnregistSysVarEvent TerminalStage %s", Error_Succeed == GetFunction()->UnregistSysVarEvent("TerminalStage") ? "success" : "fail");
-				}				
+					if (CModTools::get_mutable_instance().IsConfigWork())//url正常时才关闭
+					{
+						if (m_runAd) openAdPage();
+						openMainPage();
+						CModTools::get_mutable_instance().StopChromiumBrowser(ERR_PAGE_REASON::breakdown);
+						
+						//DbgEx("UnregistSysVarEvent TerminalStage %s", Error_Succeed == GetFunction()->UnregistSysVarEvent("TerminalStage") ? "success" : "fail");
+					}
+				}
+				else if (0 == CSimpleStringA("X").Compare(curEvent.value.c_str(), true))
+					DbgEx("TerminalStage X, do nothing.");
+				else
+				{
+					if (!m_withBrowser)
+					{
+						auto openRet = CModTools::get_mutable_instance().StartChromiumBrowser(
+							0 == CSimpleStringA("S").Compare(curEvent.value.c_str(), true) ? ERR_PAGE_REASON::warnPrompt : ERR_PAGE_REASON::breakdown,
+							std::tuple < std::string, std::string>(m_sysInfo.strTerminalID.GetData(), generateTimeStr()));
+						DbgEx("access failed, open err page %s, %d", Error_Succeed == openRet.first ? "success" : "fail", openRet.second);
+						CModTools::get_mutable_instance().StopChromiumBrowser(ERR_PAGE_REASON::main);						
+					}
+				}
+
 			}
-			else if (0 == CSimpleStringA("X").Compare(pszValue, true))
-				DbgEx("TerminalStage X, do nothing.");
-			else
+			else if (0 == CSimpleStringA("CardStoreInUse").Compare(curEvent.key.c_str(), true) && CheckIsCardStore())
 			{
-				if (!m_withBrowser)
+				if (0 == CSimpleStringA("Y").Compare(curEvent.value.c_str(), true))
 				{
-					CModTools::get_mutable_instance().StopChromiumBrowser(ERR_PAGE_REASON::main);
-					auto openRet = CModTools::get_mutable_instance().StartChromiumBrowser(ERR_PAGE_REASON::breakdown,
-						std::tuple < std::string, std::string>(m_sysInfo.strTerminalID.GetData(), generateTimeStr()));
-					DbgEx("access failed, open page breakdown %s, %d", Error_Succeed == openRet.first ? "success" : "fail", openRet.second);
+					auto openRet = CModTools::get_mutable_instance().StartChromiumBrowser(ERR_PAGE_REASON::CardStoreIsBusy,
+						std::tuple <std::string, std::string>(m_sysInfo.strTerminalID.GetData(), generateTimeStr()));
+					DbgEx("CardStoreIsBusy, open page CardStoreIsBusy %s, %d", Error_Succeed == openRet.first ? "success" : "fail", openRet.second);
 				}
+				else
+					CModTools::get_mutable_instance().StopChromiumBrowser(ERR_PAGE_REASON::CardStoreIsBusy);
 			}
-
 		}
-		else if (0 == CSimpleStringA("CardStoreInUse").Compare(pszKey, true) && CheckIsCardStore())
-		{
-			if (0 == CSimpleStringA("Y").Compare(pszValue, true))
-			{
-				auto openRet = CModTools::get_mutable_instance().StartChromiumBrowser(ERR_PAGE_REASON::CardStoreIsBusy,
-					std::tuple <std::string, std::string>(m_sysInfo.strTerminalID.GetData(), generateTimeStr()));
-				DbgEx("CardStoreIsBusy, open page CardStoreIsBusy %s, %d", Error_Succeed == openRet.first ? "success" : "fail", openRet.second);
-			}
-			else
-				CModTools::get_mutable_instance().StopChromiumBrowser(ERR_PAGE_REASON::CardStoreIsBusy);
+		
+	}
 
-		}
+	void CChromiumEntity::OnSysVarEvent(const char* pszKey, const char* pszValue, const char* pszOldValue, const char* pszEntityName)
+	{
+		DbgEx("OnSysVarEvent %s, old->new:%s->%s", pszKey, pszOldValue, pszValue);
+		SYS_EVENT_PARAM curEvent;
+		curEvent.key = pszKey;
+		curEvent.value = pszValue;
+		curEvent.oldValue = pszOldValue;
+		curEvent.entityName = pszEntityName;
+		boost::unique_lock<boost::mutex> eventArrLock(m_eventContorl);
+		m_eventArr.push_back(curEvent);
 
 	}
 
@@ -766,12 +818,6 @@ namespace Chromium {
 		GetFunction()->ResetTimer(BROWSER_TIMER_ID, BROWSER_TIMER_INTERVAL);
 	}
 
-#if (defined _WIN32 || defined _WIN64)
-	void CChromiumEntity::OnCustomerCmd(const char* pszEntityName, DWORD dwMessageId, DWORD dwMessageSignature, IEBrowser::CustomerCmd& evt)
-	{
-		DbgEx("OnCustomerCmd %s", evt.cmdStr);
-	}
-#endif
 	void CChromiumEntity::OnBrowserCacheClean(const char* pszEntityName, DWORD dwMessageId, DWORD dwMessageSignature, ResourceWatcher::BrowserCacheClean& evt)
 	{
 		DbgEx("OnOnBrowserCacheClean, needClean:%d", evt.needClean);
@@ -780,21 +826,29 @@ namespace Chromium {
 			return;
 
 		CSimpleString tmpCacheDir;
-		if (Error_Succeed != (error = GetFunction()->GetPath("Temp", tmpCacheDir)))
+		if (Error_Succeed != (error = GetFunction()->GetPath("Temp", tmpCacheDir)) || tmpCacheDir.GetLength() == 0)
 		{
 			DbgEx("OnBrowserCacheClean get cache path err, %d", error);
 			return;
 		}
 #if (defined _WIN32 || defined _WIN64)
 		CModTools::get_mutable_instance().lockGuard();
-		CModTools::get_mutable_instance().StopChromiumBrowser(ERR_PAGE_REASON::breakdown, true);//close all tab
-		auto tmpDirArr = find_files(tmpCacheDir.GetData(), "cefCache*", true);
+		auto tmpArr = find_files(tmpCacheDir.GetData(), "cefCache*", true);
+		std::shared_ptr<std::vector<std::string>> tmpDirArr(new std::vector<std::string>());
+		for each (auto it in tmpArr)
+			tmpDirArr.get()->push_back(it);
+
+		auto runCacheClean = [](std::shared_ptr<std::vector<std::string>> p) ->void {
+			CModTools::get_mutable_instance().StopChromiumBrowser(ERR_PAGE_REASON::breakdown, true);//close all tab
+			for each (auto it in *p.get())
+			{
+				LogWarn(Severity_Low, Error_Debug, LOG_EVT_CHROMIUM_BROWSER_CACHE_CLEAER, CSimpleStringA::Format("clear chromium browser cache %s %s", it.c_str(),
+					RemoveDirRecursive(it.c_str()) ? "success" : "fail"));
+			}
+		};
 
-		for each (auto it in tmpDirArr)
-		{
-			LogWarn(Severity_Low, Error_Debug, LOG_EVT_CHROMIUM_BROWSER_CACHE_CLEAER, CSimpleStringA::Format("clear chromium browser cache %s %s", it.c_str(),
-				RemoveDirRecursive(it.c_str()) ? "success" : "fail"));
-		}
+		boost::thread CacheCleanThread(runCacheClean, tmpDirArr);
+		CacheCleanThread.timed_join(boost::posix_time::microseconds(10000));
 
 		CModTools::get_mutable_instance().unlockGuard();
 #else

+ 3 - 3
Module/mod_chromium/processControl.cpp

@@ -108,19 +108,19 @@ std::tuple<bool, DWORD, HANDLE, HANDLE> startProcessInJob(std::string program, s
 	STARTUPINFO startupInfo;
 	::ZeroMemory(&startupInfo, sizeof(startupInfo));
 	startupInfo.cb = sizeof(startupInfo);
-	startupInfo.dwFlags = STARTF_USESHOWWINDOW;
+	startupInfo.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
 	startupInfo.wShowWindow = SW_HIDE;
 
 	BOOL retVal = false;
 	if (args.length() == 0)
 	{
 		retVal = ::CreateProcessA(NULL, const_cast<char*>(program.c_str()), NULL, NULL, FALSE,
-			CREATE_BREAKAWAY_FROM_JOB, NULL, NULL, &startupInfo, &processInfo);
+			CREATE_BREAKAWAY_FROM_JOB | DETACHED_PROCESS | HIGH_PRIORITY_CLASS, NULL, NULL, &startupInfo, &processInfo);
 	}
 	else
 	{
 		retVal = ::CreateProcessA(const_cast<char*>(program.c_str()), const_cast<char*>(args.c_str()), NULL, NULL, FALSE,
-			CREATE_BREAKAWAY_FROM_JOB, NULL, NULL, &startupInfo, &processInfo);
+			CREATE_BREAKAWAY_FROM_JOB | DETACHED_PROCESS | HIGH_PRIORITY_CLASS, NULL, NULL, &startupInfo, &processInfo);
 	}
 	if (!processInfo.hProcess)
 	{

+ 17 - 103
Module/mod_chromium/uuid4.cpp

@@ -1,104 +1,18 @@
-/**
- * Copyright (c) 2018 rxi
- *
- * This library is free software; you can redistribute it and/or modify it
- * under the terms of the MIT license. See LICENSE for details.
- */
-
-#include <stdio.h>
-#include <stdint.h>
-
-#if defined(_WIN32)
-#include <windows.h>
-#include <wincrypt.h>
-#pragma comment(lib, "Advapi32.lib")
-#endif
-
-#include "uuid4.h"
-
-
-static uint64_t seed[2];
-
-
-static uint64_t xorshift128plus(uint64_t* s) {
-	/* http://xorshift.di.unimi.it/xorshift128plus.c */
-	uint64_t s1 = s[0];
-	const uint64_t s0 = s[1];
-	s[0] = s0;
-	s1 ^= s1 << 23;
-	s[1] = s1 ^ s0 ^ (s1 >> 18) ^ (s0 >> 5);
-	return s[1] + s0;
-}
-
-
-int uuid4_init(void) {
-#if defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__)
-	int res;
-	FILE* fp = fopen("/dev/urandom", "rb");
-	if (!fp) {
-		return UUID4_EFAILURE;
-	}
-	res = fread(seed, 1, sizeof(seed), fp);
-	fclose(fp);
-	if (res != sizeof(seed)) {
-		return UUID4_EFAILURE;
-	}
-
-#elif defined(_WIN32)
-	int res;
-	HCRYPTPROV hCryptProv;
-	res = CryptAcquireContext(
-		&hCryptProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
-	if (!res) {
-		return UUID4_EFAILURE;
-	}
-	res = CryptGenRandom(hCryptProv, (DWORD)sizeof(seed), (PBYTE)seed);
-	CryptReleaseContext(hCryptProv, 0);
-	if (!res) {
-		return UUID4_EFAILURE;
-	}
-
-#else
-#error "unsupported platform"
-#endif
-	return UUID4_ESUCCESS;
-}
-
-
-void uuid4_generate(char* dst) {
-	static const char* template1 = "xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx";
-	static const char* chars = "0123456789abcdef";
-	union { unsigned char b[16]; uint64_t word[2]; } s;
-	const char* p;
-	int i, n;
-	/* get random */
-	s.word[0] = xorshift128plus(seed);
-	s.word[1] = xorshift128plus(seed);
-	/* build string */
-	p = template1;
-	i = 0;
-	while (*p) {
-		n = s.b[i >> 1];
-		n = (i & 1) ? (n >> 4) : (n & 0xf);
-		switch (*p) {
-		case 'x': *dst = chars[n];              i++;  break;
-		case 'y': *dst = chars[(n & 0x3) + 8];  i++;  break;
-		default: *dst = *p;
-		}
-		dst++, p++;
-	}
-	*dst = '\0';
-}
-
-std::string uuid4_generate(int len)
-{
-	char buf[UUID4_LEN];
-
-	uuid4_init();
-	uuid4_generate(buf);
-	std::string result = buf;
-	if (len > 0 && len <= 32)
-		return result.substr(0, len);
-	else
-		return "";
+#include <iostream>
+#include <iomanip>
+#include <random>
+#include <sstream>
+
+std::string uuid4_generate(int len) {
+    std::random_device rd;
+    std::mt19937 gen(rd());
+    std::uniform_int_distribution<> distrib(0, 15);
+
+    std::stringstream ss;
+    for (int i = 0; i < len; i++) {
+        const int rand_num = distrib(gen);
+        ss << std::hex << rand_num;
+    }
+
+    return ss.str();
 }

+ 0 - 17
Module/mod_chromium/uuid4.h

@@ -1,25 +1,8 @@
-/**
- * Copyright (c) 2018 rxi
- *
- * This library is free software; you can redistribute it and/or modify it
- * under the terms of the MIT license. See LICENSE for details.
- */
-
 #ifndef UUID4_H
 #define UUID4_H
 
-#define UUID4_VERSION "1.0.0"
-#define UUID4_LEN 33
-
 #include <string>
 
-enum {
-	UUID4_ESUCCESS = 0,
-	UUID4_EFAILURE = -1
-};
-
-int  uuid4_init(void);
-void uuid4_generate(char* dst);
 
 std::string uuid4_generate(int len);
 

+ 3 - 1
Other/libpublicFun/exLog/log.cpp

@@ -12,6 +12,7 @@
 #include <boost/log/sources/severity_channel_logger.hpp>
 
 #include <boost/date_time/posix_time/posix_time.hpp>
+#include <boost/date_time/gregorian/gregorian.hpp>
 
 namespace dt = boost::posix_time;
 namespace logging = boost::log;
@@ -48,9 +49,10 @@ bool logger::init(std::string strLogPath, std::string strLogName) {
 	boost::shared_ptr<logging::sinks::text_multifile_backend> backend =
 		boost::make_shared<logging::sinks::text_multifile_backend>();
 	// Set up the file naming pattern
+	boost::gregorian::date d(boost::gregorian::day_clock::local_day());
 	backend->set_file_name_composer(logging::sinks::file::as_file_name_composer(
 		logexpr::stream << strLogPath
-		<< "/" << logexpr::format_date_time<boost::posix_time::ptime>("TimeStamp", "%Y%m%d") << "_"
+		<< "/" << boost::gregorian::to_iso_string(d) << "_"
 		// 文件名还是带上Level,否者copy到一起的时候分不清
 		<< logexpr::attr<logging::trivial::severity_level>("Severity") << "_"
 		<< strLogName << ".log"));

+ 90 - 0
Other/libpublicFun/portCheck.cpp

@@ -0,0 +1,90 @@
+#include "publicFunExport.h"
+#include <stdio.h>
+#include <string>
+
+#if (defined _WIN32 || defined _WIN64)
+#include <winsock.h>
+#pragma comment(lib,"Ws2_32.lib")
+#include "Wininet.h"  
+#pragma comment(lib,"Wininet.lib") 
+#else
+#include <requests/Exception.hpp>
+#include <requests/Request.hpp>
+#include <requests/Url.hpp>
+#endif
+
+
+#if (defined _WIN32 || defined _WIN64)
+bool checkHttpActive(const char* httpUrl)
+{
+	TCHAR szHostName[128];
+	TCHAR szUrlPath[256];
+	URL_COMPONENTS crackedURL = { 0 };
+	crackedURL.dwStructSize = sizeof(URL_COMPONENTS);
+	crackedURL.lpszHostName = szHostName;
+	crackedURL.dwHostNameLength = ARRAYSIZE(szHostName);
+	crackedURL.lpszUrlPath = szUrlPath;
+	crackedURL.dwUrlPathLength = ARRAYSIZE(szUrlPath);
+	InternetCrackUrl(httpUrl, (DWORD)strlen(httpUrl), 0, &crackedURL);
+
+	HINTERNET hInternet = InternetOpen("Microsoft InternetExplorer", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
+	if (hInternet == NULL)
+		return false;
+
+	HINTERNET hHttpSession = InternetConnect(hInternet, crackedURL.lpszHostName, crackedURL.nPort, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0);
+	if (hHttpSession == NULL)
+	{
+		InternetCloseHandle(hInternet);
+		return false;
+	}
+
+	HINTERNET hHttpRequest = HttpOpenRequest(hHttpSession, "GET", crackedURL.lpszUrlPath, NULL, "", NULL, 0, 0);
+	if (hHttpRequest == NULL)
+	{
+		InternetCloseHandle(hHttpSession);
+		InternetCloseHandle(hInternet);
+		return false;
+	}
+
+	/**
+	 * 查询http状态码(这一步不是必须的),但是HttpSendRequest()必须要调用
+	 */
+
+	DWORD dwRetCode = 0;
+	DWORD dwSizeOfRq = sizeof(DWORD);
+	if (!HttpSendRequest(hHttpRequest, NULL, 0, NULL, 0) ||
+		!HttpQueryInfo(hHttpRequest, HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER, &dwRetCode, &dwSizeOfRq, NULL)
+		|| dwRetCode >= 400)
+	{
+		InternetCloseHandle(hHttpRequest);
+		InternetCloseHandle(hHttpSession);
+		InternetCloseHandle(hInternet);
+
+		return false;
+	}
+	InternetCloseHandle(hHttpRequest);
+	InternetCloseHandle(hHttpSession);
+
+	return true;
+}
+#else
+bool checkHttpActive(const char* httpUrl)
+{
+	requests::Request request;
+	requests::Url url(httpUrl);
+
+	try
+	{
+		// 发起 HTTP 请求,阻塞
+		auto resp = request.get(url);
+		return true;
+	}
+	catch (requests::Exception& e)
+	{
+		std::cout << e.what() << std::endl;
+	}
+	return false;
+}
+
+#endif
+

+ 5 - 17
Other/libpublicFun/publicFunExport.cpp

@@ -3,6 +3,7 @@
 #include <memory>
 #include <math.h>
 #include <cstring>
+#include "cJSON.h"
 int str2int(const string str, int& ret) {
 	if (str.size() == 0) return 1;
 	ret = 0;
@@ -43,11 +44,8 @@ std::pair<bool, std::string> generateJsonStr(std::map<std::string, std::string>&
 {
 
 	auto dstJson = std::shared_ptr<cJSON>(cJSON_CreateObject(), [](cJSON* p) {
-		if (p) {
+		if(p)
 			cJSON_Delete(p);
-			//cJSON_free(p);
-		}
-			
 	});
 
 	for(auto it = objectArr.begin(); it != objectArr.end(); it++)
@@ -67,10 +65,7 @@ std::vector<std::string> parseJsonStr(const std::string jsonStr,const std::vecto
 	std::vector<std::string> values;	
 	std::vector<std::string>::const_iterator it = keys.begin();
 	auto cJsonPtr = std::shared_ptr<cJSON>(cJSON_Parse(jsonStr.c_str()), [](cJSON* json) {
-		if (json) {
-            cJSON_Delete(json);
-			//cJSON_free(json);
-        }
+		if (json) cJSON_Delete(json);
 	});
 	while (it != keys.end()) {
 		auto ret = cJSON_GetObjectItem(cJsonPtr.get(),(*it).c_str());
@@ -116,18 +111,12 @@ RVCJson::~RVCJson() {
 }
 
 void RVCJson::SetJson(const char* jsonStr) {
-	if (pJson) {
+	if (pJson)
 		cJSON_Delete(pJson);
-		//cJSON_free(pJson);
-	}
-        
 	pJson = cJSON_Parse(jsonStr);
 }
 void RVCJson::SetJson(RVCJson* rvcJson) {
-	if (pJson) {
-		cJSON_Delete(pJson);
-		//cJSON_free(pJson);
-	}
+	if (pJson) cJSON_Delete(pJson);
 	if (!rvcJson) return;
 	pJson = cJSON_Parse(cJSON_PrintUnformatted(rvcJson->pJson));
 }
@@ -235,7 +224,6 @@ RVCJson* RVCJson::GetArrayValue(int index) {
 void RVCJson::Destory() {
 	if (pJson) {
 		cJSON_Delete(pJson);
-		//cJSON_free(pJson);
 		pJson = NULL;
 	}
 }

+ 4 - 0
Other/libpublicFun/publicFunExport.h

@@ -1,5 +1,8 @@
 #ifndef _OTHER_PUBLICFUNCEXPORT_HEADER_
 #define _OTHER_PUBLICFUNCEXPORT_HEADER_
+
+#pragma once
+
 #include "cJSON.h"
 #include <map>
 #include <string>
@@ -13,6 +16,7 @@ using namespace std;
 
 PUBLIC_API std::pair<bool, std::string> generateJsonStr(std::map<std::string, std::string> &objectArr);
 PUBLIC_API std::vector<std::string> parseJsonStr(const std::string jsonStr, const std::vector<std::string>& keys);
+PUBLIC_API bool checkHttpActive(const char* httpUrl);
 
 PUBLIC_API int str2int(const string str);