Browse Source

#IQRV #comment [Chromium] 添加 OpenBrowser 外部接口

gifur 4 years ago
parent
commit
b68f645084

+ 22 - 16
Module/mod_chromium/CModTools.cpp

@@ -138,7 +138,8 @@ std::pair<bool, std::string> CModTools::getErrUrl()
 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();
-	CSimpleStringA errPagePath = errUrlRet.second.c_str(), strChromiumPath = GetCefHead(this->m_pEntity).Append(CEFCLIENT_NAME);
+	CSimpleStringA errPagePath = errUrlRet.second.c_str();
+	CSimpleStringA strChromiumPath = GetCefHead(this->m_pEntity).Append(CEFCLIENT_NAME);
 	
 	switch (errType)
 	{
@@ -151,7 +152,7 @@ std::pair<bool, std::string> CModTools::GenerateErrPage(ERR_PAGE_REASON errType,
 		errPagePath.Append(CSimpleStringA("?reason=") + errType._to_string() + "&errmsg=双屏版只检测到单屏");
 		setLimitReason("breakdown");
 		break;*/
-	case ERR_PAGE_REASON::breakdown:
+	case ERR_PAGE_REASON::Breakdown:
 	{
 		CSimpleStringA m_sAuthErrMsg, ts;
 		this->m_pEntity->GetFunction()->GetSysVar("TerminalStage", ts);
@@ -167,10 +168,10 @@ std::pair<bool, std::string> CModTools::GenerateErrPage(ERR_PAGE_REASON errType,
 	}
 		break;
 	case ERR_PAGE_REASON::CameraConfig:
-	case ERR_PAGE_REASON::disabled:
+	case ERR_PAGE_REASON::Disabled:
 	case ERR_PAGE_REASON::TerminalManagerKickOut:
 	case ERR_PAGE_REASON::TerminalManagerOff:
-	case ERR_PAGE_REASON::jobuncomplete:
+	case ERR_PAGE_REASON::JobUncomplete:
 		errPagePath.Append(CSimpleStringA("?reason=") + errType._to_string());
 
 		errPagePath.Append(CSimpleStringA("&showlimit=")).Append(std::to_string(1).c_str());
@@ -220,11 +221,11 @@ std::pair<bool, std::string> CModTools::GenerateErrPage(ERR_PAGE_REASON errType,
 	case ERR_PAGE_REASON::CameraConfig:
 		errPagePath.Append(" --logextend=").Append((+PAGE_TYPE::CameraConfig)._to_string());
 		break;
-	case ERR_PAGE_REASON::disabled:
-	case ERR_PAGE_REASON::jobuncomplete:
+	case ERR_PAGE_REASON::Disabled:
+	case ERR_PAGE_REASON::JobUncomplete:
 		errPagePath.Append(" --logextend=").Append((+PAGE_TYPE::TradeManager)._to_string());
 		break;
-	case ERR_PAGE_REASON::breakdown:
+	case ERR_PAGE_REASON::Breakdown:
 		errPagePath.Append(" --logextend=").Append((+PAGE_TYPE::breakdown)._to_string());
 		break;
 	default:
@@ -398,39 +399,43 @@ void CModTools::openAdPage() {
 				Dbg("open Ad err!");
 		}
 		else
-			Dbg("StartChromiumBrowser Ad url err!");
+			Dbg("Start Chromium Browser Ad url err!");
 	}
 	//open ad do not affect the result of cef open
 }
 
 
-std::pair<ErrorCodeEnum, int> CModTools::StartChromiumBrowser(ERR_PAGE_REASON reason, std::tuple < std::string, std::string> normalParam, std::tuple<std::string, std::string, std::string, DWORD, DWORD> exParam){
+std::pair<ErrorCodeEnum, int> CModTools::StartChromiumBrowser(
+	ERR_PAGE_REASON reason, std::tuple < std::string, std::string> normalParam
+	, std::tuple<std::string, std::string, std::string, DWORD, DWORD> exParam) {
 
 	g_mutexFreerdp.lock();
 	std::shared_ptr<void> delHandleFun((void*)0, [&](void*) {
 		g_mutexFreerdp.unlock();
 	});
+
 	static bool adOpen = false;
 	if (!adOpen) {//only open ad in first time
 		openAdPage();
 		adOpen = true;
 	}
 	
-	if (reason._to_integral() == ERR_PAGE_REASON::normal)
+	if (reason._to_integral() == ERR_PAGE_REASON::Normal)
 	{
 		auto mainUrlRet = getMainUrl();
 
 		if (0 == mainUrlRet.second.length())
 		{
-			Dbg("StartChromiumBrowser get url failed!");
+			Dbg("Start Chromium Browser get url failed!");
 			return std::make_pair(Error_Unexpect, 0);
 		}
 
 		auto strCmdLine = generateCefclientCmd(mainUrlRet.first, mainUrlRet.second);
 
 		auto openCefRet = openCef(strCmdLine, true);
-		if (Error_Succeed == openCefRet.first)
+		if (Error_Succeed == openCefRet.first) {
 			return std::make_pair(Error_Succeed, openCefRet.second);
+		}
 	}
 	else
 	{
@@ -439,7 +444,7 @@ std::pair<ErrorCodeEnum, int> CModTools::StartChromiumBrowser(ERR_PAGE_REASON re
 		if (notifyExist)
 			return std::make_pair(Error_Unexpect, 0);
 
-		if(ERR_PAGE_REASON::breakdown == reason._to_integral() && breakdownExist)
+		if(ERR_PAGE_REASON::Breakdown == reason._to_integral() && breakdownExist)
 			return std::make_pair(Error_Unexpect, 0);//只打开一个breakdown页面,后续通过cefclient改动,避免打开同种页面
 
 		auto errPageUrl = GenerateErrPage(reason, normalParam, exParam);
@@ -454,10 +459,9 @@ std::pair<ErrorCodeEnum, int> CModTools::StartChromiumBrowser(ERR_PAGE_REASON re
 		{
 			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())
 				breakdownExist = true;
 		}
-			
 
 		return std::make_pair(errPageRet.first, 0);
 
@@ -736,7 +740,9 @@ void CModTools::RestartProxyServer(){
 	return;
 }
 
-std::tuple<CSimpleStringA, CSimpleStringA, CSimpleStringA, CSimpleStringA, CSimpleStringA> CModTools::ReadCenterConfigStr(CSimpleStringA entityName){
+std::tuple<CSimpleStringA, CSimpleStringA, CSimpleStringA, CSimpleStringA, CSimpleStringA> 
+CModTools::ReadCenterConfigStr(CSimpleStringA entityName)
+{
 	CSimpleStringA str = "", strNew = "", strEx = "", strFulture = "", strAd = "";
 	CSmartPointer<IConfigInfo> spCerConfig;
 	ErrorCodeEnum err = this->m_pEntity->GetFunction()->OpenConfig(Config_CenterSetting, spCerConfig);

+ 14 - 4
Module/mod_chromium/CModTools.h

@@ -18,8 +18,8 @@ using boost::serialization::singleton;
 
 namespace Chromium{
 
-	BETTER_ENUM(ERR_PAGE_REASON, int, CameraConfig,	CardStoreIsBusy, MachineTypeError, TerminalManagerKickOut,
-		TerminalManagerOff,	breakdown, disabled, jobuncomplete, ErrNotify, normal)
+BETTER_ENUM(ERR_PAGE_REASON, int, CameraConfig, CardStoreIsBusy, MachineTypeError, TerminalManagerKickOut,
+            TerminalManagerOff, Breakdown, Disabled, JobUncomplete, ErrNotify, Normal, OutsideRequest)
 
 	BETTER_ENUM(PAGE_TYPE, int,	CameraConfig, TerminalManager, errPage,	Ad,	slv, init, TradeManager, breakdown)
 
@@ -33,13 +33,20 @@ private:
 	CEntityBase* m_pEntity;
 public:
 	void InitCModTools(CEntityBase* pEntity);
-	std::pair<ErrorCodeEnum, int> StartChromiumBrowser(ERR_PAGE_REASON reason = ERR_PAGE_REASON::normal, std::tuple < std::string, std::string> normalParam = {"", ""}, std::tuple<std::string, std::string, std::string, DWORD, DWORD> exParam = { "", "", "", 0, 0 });
+	std::pair<ErrorCodeEnum, int> StartChromiumBrowser(ERR_PAGE_REASON reason = ERR_PAGE_REASON::Normal
+													   , std::tuple < std::string, std::string> normalParam = {"", ""}
+														, std::tuple<std::string, std::string, std::string, DWORD, DWORD> exParam = { "", "", "", 0, 0 });
+
 	bool killAllChromium();	//通过taskkill 关闭掉所有的cefclient
 	void killAllChromiumByThread(int seconds);
 	bool killChromiumByName(std::string name);
+
 	void RestartProxyServer();
+
 	TradeManageCodeEnum CheckJobLimited();
+
 private:
+
 	std::pair<CSimpleStringA, int>  ReadConfig();	//读本地配置,已废弃
 	std::tuple<CSimpleStringA, CSimpleStringA, CSimpleStringA, CSimpleStringA, CSimpleStringA> ReadCenterConfigStr(CSimpleStringA entityName = "");
 
@@ -51,13 +58,16 @@ private:
 	std::pair<ErrorCodeEnum, int> openCef(std::string cmdline, bool isGuard = false);
 	void cefClientGuardian(std::string cmdline);
 	void openAdPage();
-	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<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::string GetSpShellBootTime();
 	bool isOutsidePad();
 	void setLimitReason(const char* reason);
 	int StandardToStamp(const char* str_time, bool dateOnly);
 	bool CheckTradeRecord();
+
 private:
+
 	CSimpleString m_strSite, m_strMachineType;
 
 };

+ 17 - 0
Module/mod_chromium/Chromium.xml

@@ -1,6 +1,23 @@
 <?xml version="1.0" encoding="gb2312" ?>
 <entity name="Chromium">
 	<class name="ChromiumSrv" overlap="true" exclusive="false">
+    <twoway name="OpenBrowser" overlap="true">
+      <req>
+        <param name="mainUrl" type="string"/>
+        <param name="viceUrl" type="string"/>
+        <param name="type" type="int"/>
+        <param name="param1" type="string"/>
+        <param name="param2" type="string"/>
+        <param name="exclusiveMode" type="bool"/>
+        <param name="reserved1" type="int"/>
+        <param name="reserved2" type="int"/>
+      </req>
+      <res>
+        <param name="result" type="int"/>
+        <param name="reserved1" type="int"/>
+        <param name="reserved2" type="string"/>
+      </res>
+    </twoway>
 	</class>
 	<message name="ChromiumBroadcast">
 			<param name="broadcastJson" type="string"/>

+ 29 - 0
Module/mod_chromium/Chromium_client_g.h

@@ -39,6 +39,35 @@ public:
 		return Error;
 	}
 
+	ErrorCodeEnum OpenBrowser(ChromiumSrv_OpenBrowser_Req &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)
+	{
+		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
+		CAutoBuffer Buf = SpObject2Buffer(Req);
+		return pFunc->AsyncRequest(ChromiumSrv_Method_OpenBrowser, ChromiumSrv_MethodSignature_OpenBrowser, Buf, spAsyncWait, dwTimeout);
+	}
+	ErrorCodeEnum OpenBrowser(ChromiumSrv_OpenBrowser_Req &Req, ChromiumSrv_OpenBrowser_Ans &Ans, DWORD dwTimeout)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = OpenBrowser(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+	ErrorCodeEnum OpenBrowser(ChromiumSrv_OpenBrowser_Req &Req, ChromiumSrv_OpenBrowser_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = OpenBrowser(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+
 
 	bool SafeDelete()
 	{

+ 34 - 1
Module/mod_chromium/Chromium_def_g.h

@@ -12,7 +12,40 @@ namespace Chromium {
 // const goes here
 //
 
-
+#define ChromiumSrv_Method_OpenBrowser 0
+
+#define ChromiumSrv_MethodSignature_OpenBrowser 1632538869
+
+struct ChromiumSrv_OpenBrowser_Req
+{
+	CSimpleStringA mainUrl;
+	CSimpleStringA viceUrl;
+	int type;
+	CSimpleStringA param1;
+	CSimpleStringA param2;
+	bool exclusiveMode;
+	int reserved1;
+	int reserved2;
+
+	void Serialize(SpBuffer &Buf)
+	{
+		auto & buf = Buf & mainUrl & viceUrl & type & param1 & param2 & exclusiveMode & reserved1 & reserved2;
+	}
+
+};
+
+struct ChromiumSrv_OpenBrowser_Ans
+{
+	int result;
+	int reserved1;
+	CSimpleStringA reserved2;
+
+	void Serialize(SpBuffer &Buf)
+	{
+		auto & buf = Buf & result & reserved1 & reserved2;
+	}
+
+};
 
 
 ///////////////////////////

+ 25 - 0
Module/mod_chromium/Chromium_server_g.h

@@ -30,6 +30,13 @@ public:
 	{
 		ErrorCodeEnum Error = Error_Succeed;
 		switch (dwMessageID) {
+		case ChromiumSrv_Method_OpenBrowser:
+			if (dwSignature == ChromiumSrv_MethodSignature_OpenBrowser) {
+				bOverlap = true;
+			} else {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
 		default:
 			Error = Error_MethodNotFound;
 			break;
@@ -41,6 +48,11 @@ public:
 	{
 		ErrorCodeEnum Error = Error_Succeed;
 		switch (dwMessageID) {
+		case ChromiumSrv_Method_OpenBrowser:
+			if (dwSignature != ChromiumSrv_MethodSignature_OpenBrowser) {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
 		default:
 			Error = Error_MethodNotFound;
 			break;
@@ -48,6 +60,11 @@ public:
 		return Error;
 	}
 
+	virtual void Handle_OpenBrowser(SpReqAnsContext<ChromiumSrv_OpenBrowser_Req, ChromiumSrv_OpenBrowser_Ans>::Pointer ctx)
+	{
+	/// override by user
+	}
+
 	virtual void OnRequest(CSmartPointer<ITransactionContext> pTransactionContext)
 	{
 		CAutoBuffer Buf;
@@ -64,6 +81,14 @@ public:
 			}
 #endif
 			switch (dwMessageID) {
+				case ChromiumSrv_Method_OpenBrowser:
+					{
+						SpReqAnsContext<ChromiumSrv_OpenBrowser_Req,ChromiumSrv_OpenBrowser_Ans>::Pointer ctx;
+						ctx.Attach(new SpReqAnsContext<ChromiumSrv_OpenBrowser_Req,ChromiumSrv_OpenBrowser_Ans>(pTransactionContext));
+						SpBuffer2Object(Buf, ctx->Req);
+						Handle_OpenBrowser(ctx);
+					}
+					break;
 				default:
 					assert(0);
 					break;

+ 23 - 8
Module/mod_chromium/mod_chromium.cpp

@@ -41,6 +41,14 @@
 
 namespace Chromium {
 
+	void ChromiumSession::Handle_OpenBrowser(
+		SpReqAnsContext<ChromiumSrv_OpenBrowser_Req, ChromiumSrv_OpenBrowser_Ans>::Pointer ctx)
+	{
+		LOG_FUNCTION();
+		m_pEntity->OpenBrowser(ctx);
+	}
+
+
 	CChromiumEntity::CChromiumEntity() :m_pWsServer(NULL), m_iTcpBridgePort(4504), m_pTimerListener(NULL), m_strCustomMainUrl(true)
 	{
 		Dbg("CChromiumEntity constructor");
@@ -121,7 +129,14 @@ namespace Chromium {
 	}
 #endif
 
-	void CChromiumEntity::OnPaused() {
+    void CChromiumEntity::OpenBrowser(
+		SpReqAnsContext<ChromiumSrv_OpenBrowser_Req, ChromiumSrv_OpenBrowser_Ans>::Pointer ctx)
+    {
+
+	}
+
+    void CChromiumEntity::OnPaused()
+    {
 #ifdef OPEN_PERF
 		ProfilerStop();//停止性能分析
 #endif // OPEN_PERF
@@ -231,7 +246,7 @@ namespace Chromium {
 		GetFunction()->GetSysVar("TerminalStage", t_terminalState);
 		if ('A' != t_terminalState[0])
 		{
-			auto openRet = CModTools::get_mutable_instance().StartChromiumBrowser(ERR_PAGE_REASON::breakdown,
+			auto openRet = CModTools::get_mutable_instance().StartChromiumBrowser(ERR_PAGE_REASON::Breakdown,
 																				  {m_sysInfo.strTerminalID.GetData(), generateTimeStr()});
 			Dbg("access failed, open page breakdown, %d", openRet.first);
 		}
@@ -266,8 +281,8 @@ namespace Chromium {
 		{
 			if (pszValue != NULL && (0 == CSimpleStringA("A").Compare(pszValue, true) || 0 == CSimpleStringA("F").Compare(pszValue, true)))
 			{
-				auto openRet = CModTools::get_mutable_instance().StartChromiumBrowser(ERR_PAGE_REASON::breakdown, {
-					m_sysInfo.strTerminalID.GetData(), generateTimeStr() });
+				auto openRet = CModTools::get_mutable_instance().StartChromiumBrowser(ERR_PAGE_REASON::Breakdown
+																					  , {m_sysInfo.strTerminalID.GetData(), generateTimeStr() });
 				Dbg("access failed, open page breakdown, %d", openRet.first);
 			}
 			else if (pszValue != NULL && 0 == CSimpleStringA("L").Compare(pszValue, true)) {
@@ -365,7 +380,8 @@ namespace Chromium {
 		case EVENT_ACCESSAUTH_FAILED:
 		case EVENT_ACCESSAUTH_TIMEOUT:
 		{
-			auto openRet = CModTools::get_mutable_instance().StartChromiumBrowser(ERR_PAGE_REASON::breakdown, {m_sysInfo.strTerminalID.GetData(), generateTimeStr(true)});
+			auto openRet = CModTools::get_mutable_instance().StartChromiumBrowser(ERR_PAGE_REASON::Breakdown
+																							, {m_sysInfo.strTerminalID.GetData(), generateTimeStr(true)});
 			Dbg("access failed, open page breakdown, %d", openRet.first);
 		}
 			break;
@@ -428,14 +444,14 @@ namespace Chromium {
 			break;
 		case TradeManageCodeEnum::Disabled:
 		{
-			auto openRet = CModTools::get_mutable_instance().StartChromiumBrowser(ERR_PAGE_REASON::disabled
+			auto openRet = CModTools::get_mutable_instance().StartChromiumBrowser(ERR_PAGE_REASON::Disabled
 																				  , { m_sysInfo.strTerminalID.GetData(), generateTimeStr() });
 			Dbg("TradeManageCodeEnum Disabled, open page %d", openRet.first);
 		}
 			break;
 		case TradeManageCodeEnum::JobUncomplete:
 		{
-			auto openRet = CModTools::get_mutable_instance().StartChromiumBrowser(ERR_PAGE_REASON::jobuncomplete
+			auto openRet = CModTools::get_mutable_instance().StartChromiumBrowser(ERR_PAGE_REASON::JobUncomplete
 																				  , { m_sysInfo.strTerminalID.GetData(), generateTimeStr() });
 			Dbg("TradeManageCodeEnum JobUncomplete, open page %d", openRet.first);
 		}
@@ -700,5 +716,4 @@ namespace Chromium {
 	SP_BEGIN_ENTITY_MAP()
 		SP_ENTITY(CChromiumEntity)
 	SP_END_ENTITY_MAP()
-
 }

+ 23 - 0
Module/mod_chromium/mod_chromium.h

@@ -14,6 +14,7 @@
 #include "modVer.h"
 #include "guitask/enum.h"
 #include "HealthManager_msg_g.h"
+#include "Chromium_server_g.h"
 #include <boost/thread/mutex.hpp>
 
 #define SP_MSG_HANDLE_NS_EX(ns, msg, ns_msg, OnMsg) \
@@ -38,6 +39,19 @@ namespace Chromium {
 #define BROWSER_TIMER_INTERVAL 3600000
 
 
+	class CChromiumEntity;
+
+	class ChromiumSession : public ChromiumSrv_ServerSessionBase
+	{
+	public:
+		ChromiumSession(CChromiumEntity* pEntity) :m_pEntity(pEntity) {}
+		virtual ~ChromiumSession() {}
+		virtual void Handle_OpenBrowser(SpReqAnsContext<ChromiumSrv_OpenBrowser_Req, ChromiumSrv_OpenBrowser_Ans>::Pointer ctx);
+
+	private:
+		CChromiumEntity* m_pEntity;
+	};
+
 	class CChromiumEntity : public CEntityBase, public ILogListener, public IBroadcastListener, public ISysVarListener
 	{
 	public:
@@ -46,6 +60,15 @@ namespace Chromium {
 		virtual const char* GetEntityName() const { return "Chromium"; }
 		const char* GetEntityVersion() const { return MODULE_VERSION_FULL; }
 		virtual bool IsService()const { return true; }
+
+        virtual CServerSessionBase* OnNewSession(const char* /*pszRemoteEntityName*/, const char* /*pszParam*/)
+        {
+            return new ChromiumSession(this);
+        }
+
+        void OpenBrowser(SpReqAnsContext<ChromiumSrv_OpenBrowser_Req, ChromiumSrv_OpenBrowser_Ans>::Pointer ctx);
+
+
 		virtual void OnPaused();
 		virtual void OnPreStart(CAutoArray<CSimpleStringA> strArgs, CSmartPointer<ITransactionContext> pTransactionContext);
 		virtual void OnPreClose(EntityCloseCauseEnum eCloseCause, CSmartPointer<ITransactionContext> pTransactionContext);