Explorar el Código

Z991239-5462 #comment fea: log sender

chenliangyu hace 1 año
padre
commit
d2720f8234

+ 1 - 1
Module/CMakeLists.txt

@@ -64,7 +64,7 @@ macro(add_module_libraries _module_prefix _module_name _module_version)
         message(STATUS "add test files: ${${_module_name}_TEST_SRCS}")
     endif(BUILD_MOUDLE_TEST)
 
-    add_library(${_module_name} SHARED ${${_module_prefix}_SRCS} ${${_module_name}_TEST_SRCS})
+    add_library(${_module_name} SHARED ${${_module_prefix}_SRCS} ${${_module_name}_TEST_SRCS} "mod_guiconsole/guiconsole_define.h")
 
     target_compile_definitions(${_module_name} PUBLIC "${_module_prefix}_EXPORTS")
     target_include_directories(${_module_name} PRIVATE 

+ 67 - 0
Module/ReadMe

@@ -0,0 +1,67 @@
+#ÒµÎñ¹ÊÕÏÐòºÅ
+
+SnapShot RTA95
+AgentInterpreter RTA96
+CenterSetting RTA11
+CustMngrAuth RTA12
+EventConverter RTA13
+Upload RTA14
+Download RTA15
+InteractiveLog RTA16
+TokenKeeper RTA1A
+Alarm RTA17
+SystemCustomization RTA1B
+UpLog RTA1D
+MediaController RTA28
+IDCertificate RTA21
+CardSwiper RTA22
+CardIssuer RTA23
+FingerPrint RTA24
+PinPad RTA26
+Gpio RTA29
+WatchDog RTA2D
+Ups RTA2E
+MaintainWatcher RTA2G
+ContactlessCard RTA2J
+MobileDial RTA2I
+DeviceControl RTA2K
+PrintSeal RTA2L
+Print RTA2M
+HSPScanner RTA2N
+ScannerSet RTA2O
+ThermalPrint RTA2P
+SurveillanceRecorder RTA2Q
+CardReadAdapter RTA2R
+PortableScanner RTA2S
+CameraConfigManage RTA2T
+Sensors RTA2U
+HandWritingInput RTA3F
+DeviceSwitch RTA3H
+SIPPhone RTA31
+AssistantChannel RTA3C
+FaceTracking RTA32
+ScreenShot RTA33
+CounterConnector RTA34
+InitiativeTransfer RTA35
+CustomerAware RTA38
+InteractionContext RTA39
+CounterContext RTA3A
+InteractiveControl RTA3B
+Recorder RTA3I
+LocalMediaPlay RTA3J
+LivenessDetection RTA3K
+SalesRecorder RTA3L
+SalesAudioTrans RTA3M
+IEBrowser RTA41
+Chromium RTA42
+HealthManager RTA51
+AccessAuthorization RTA52
+HeartBeat RTA53
+RemoteController RTA54
+SelfChecker RTA55
+UpgradeManager RTA56
+UpgradeRun RTA57
+GUIConsole RTA58
+Initializer RTA59
+ResourceWatcher RTA5A
+BranchDevice RTA61

+ 5 - 0
Module/include/EventCode.h

@@ -680,6 +680,11 @@ ERROR_ACCESSAUTH_CONNECT_ACS_x}
 //gui告警上送
 #define WARN_GUICONSOLE_LOG_INFO 0x50810005
 
+//LogSender已订阅
+#define WARN_GUICONSOLE_LOG_ALREADY_REGISTER	0x50820001
+//LogSender已反订阅
+#define WARN_GUICONSOLE_LOG_ALREADY_UNREGISTER	0x50820002
+
 
 
 #define LOG_EVT_MOD_ASSISCHAN_STARTED_SUCCESS				0x30C08010	//协助通道实体启动成功	

+ 1 - 0
Module/mod_guiconsole/CMakeLists.txt

@@ -2,6 +2,7 @@ define_module("GUIConsole")
 
 set(${MODULE_PREFIX}_SRCS
 	mod_guiconsole.cpp
+	guiconsole_define.cpp
 	)
 
 set(MOD_VERSION_STRING "0.0.1-dev1")

+ 19 - 0
Module/mod_guiconsole/GUIConsole_msg_g.h

@@ -10,8 +10,10 @@
 
 namespace GUIConsole {
 #define eMsg_EntityStatusList 0
+#define eMsg_LogInfo 1
 
 #define eMsgSig_EntityStatusList 1504672107
+#define eMsgSig_LogInfo 310107996
 
 struct EntityStatusList
 {
@@ -30,5 +32,22 @@ struct EntityStatusList
 
 ///////////////////////////
 
+struct LogInfo
+{
+	int sysError;
+	int userCode;
+	CSimpleStringA timeStr;
+	CSimpleStringA entityName;
+	CSimpleStringA message;
+
+	void Serialize(SpBuffer &Buf)
+	{
+		auto & buf = Buf & sysError & userCode & timeStr & entityName & message;
+	}
+
+};
+
+///////////////////////////
+
 } // namespace GUIConsole
 #endif // __GUICONSOLE_MSG_G_H

+ 69 - 46
Module/mod_guiconsole/GuiConsole.xml

@@ -3,100 +3,123 @@
 	<class name="GUIConsoleService" overlap="true" exclusive="false">
 		<twoway name="OpenLogSender" overlap="true">
 			<req>
-				<param name="reserved1" type="int" />
-				<param name="reserved2" type="int" />
-				<param name="reserved3" type="string" />
+				<param name="reserved1" type="int"/>
+				<param name="reserved2" type="int"/>
+				<param name="reserved3" type="string"/>
 			</req>
 			<res>
-				<param name="result" type="bool" />
-				<param name="additionalMsg" type="string" />
+				<param name="result" type="bool"/>
+				<param name="additionalMsg" type="string"/>
 			</res>
 		</twoway>
 		<twoway name="CloseLogSender" overlap="true">
 			<req>
-				<param name="reserved1" type="int" />
-				<param name="reserved2" type="int" />
-				<param name="reserved3" type="string" />
+				<param name="reserved1" type="int"/>
+				<param name="reserved2" type="int"/>
+				<param name="reserved3" type="string"/>
 			</req>
 			<res>
-				<param name="result" type="bool" />
-				<param name="additionalMsg" type="string" />
+				<param name="result" type="bool"/>
+				<param name="additionalMsg" type="string"/>
 			</res>
 		</twoway>
 		<twoway name="OpenEntityMonitor" overlap="true">
 			<req>
-				<param name="reserved1" type="int" />
-				<param name="reserved2" type="int" />
-				<param name="reserved3" type="string" />
+				<param name="reserved1" type="int"/>
+				<param name="reserved2" type="int"/>
+				<param name="reserved3" type="string"/>
 			</req>
 			<res>
-				<param name="result" type="bool" />
-				<param name="additionalMsg" type="string" />
+				<param name="result" type="bool"/>
+				<param name="additionalMsg" type="string"/>
 			</res>
 		</twoway>
 		<twoway name="CloseEntityMonitor" overlap="true">
 			<req>
-				<param name="reserved1" type="int" />
-				<param name="reserved2" type="int" />
-				<param name="reserved3" type="string" />
+				<param name="reserved1" type="int"/>
+				<param name="reserved2" type="int"/>
+				<param name="reserved3" type="string"/>
 			</req>
 			<res>
-				<param name="result" type="bool" />
-				<param name="additionalMsg" type="string" />
+				<param name="result" type="bool"/>
+				<param name="additionalMsg" type="string"/>
 			</res>
 		</twoway>
 		<twoway name="OpenPerformanceSender" overlap="true">
 			<req>
-				<param name="sendFrequence" type="int" />
-				<param name="reserved2" type="int" />
-				<param name="reserved3" type="string" />
+				<param name="sendFrequence" type="int"/>
+				<param name="reserved2" type="int"/>
+				<param name="reserved3" type="string"/>
 			</req>
 			<res>
-				<param name="result" type="bool" />
-				<param name="additionalMsg" type="string" />
+				<param name="result" type="bool"/>
+				<param name="additionalMsg" type="string"/>
 			</res>
 		</twoway>
 		<twoway name="ClosePerformanceSender" overlap="true">
 			<req>
-				<param name="reserved1" type="int" />
-				<param name="reserved2" type="int" />
-				<param name="reserved3" type="string" />
+				<param name="reserved1" type="int"/>
+				<param name="reserved2" type="int"/>
+				<param name="reserved3" type="string"/>
 			</req>
 			<res>
-				<param name="result" type="bool" />
-				<param name="additionalMsg" type="string" />
+				<param name="result" type="bool"/>
+				<param name="additionalMsg" type="string"/>
 			</res>
 		</twoway>
 		<twoway name="VTMSystemControl" overlap="true">
 			<req>
-				<param name="rebootFunction" type="int" />
-				<param name="reserved2" type="int" />
-				<param name="reserved3" type="string" />
+				<param name="rebootFunction" type="int"/>
+				<param name="reserved2" type="int"/>
+				<param name="reserved3" type="string"/>
 			</req>
 			<res>
-				<param name="result" type="bool" />
-				<param name="additionalMsg" type="string" />
+				<param name="result" type="bool"/>
+				<param name="additionalMsg" type="string"/>
 			</res>
 		</twoway>
 		<twoway name="VTM_controlEntity" overlap="true">
 			<req>
-				<param name="entityName" type="string" />
-				<param name="operation" type="string" />
-				<param name="isWait" type="bool" />
-				<param name="reserved1" type="int" />
-				<param name="reserved2" type="string" />
+				<param name="entityName" type="string"/>
+				<param name="operation" type="string"/>
+				<param name="isWait" type="bool"/>
+				<param name="reserved1" type="int"/>
+				<param name="reserved2" type="string"/>
 			</req>
 			<res>
-				<param name="result" type="bool" />
-				<param name="additionalMsg" type="string" />
+				<param name="result" type="bool"/>
+				<param name="additionalMsg" type="string"/>
+			</res>
+		</twoway>
+		<twoway name="GetAllEntityList" overlap="true">
+			<req>
+				<param name="reserved1" type="int"/>
+				<param name="reserved2" type="int"/>
+				<param name="reserved3" type="string"/>
+			</req>
+			<res>
+				<param name="result" type="bool"/>
+				<param name="additionalMsg" type="string"/>
+				<param name="entityName" type="array_string"/>
+				<param name="status" type="array_string"/>
+				<param name="processId" type="array_string"/>
+				<param name="versionNo" type="array_string"/>
+				<param name="lastStartTime" type="array_string"/>
 			</res>
 		</twoway>
 	</class>
 	<message name="EntityStatusList">
 		<param name="entityName" type="array_string"/>
-		<param name="status" type="array_string" />
-		<param name="processId" type="array_string" />
-		<param name="versionNo" type="array_string" />
-		<param name="lastStartTime" type="array_string" />
+		<param name="status" type="array_string"/>
+		<param name="processId" type="array_string"/>
+		<param name="versionNo" type="array_string"/>
+		<param name="lastStartTime" type="array_string"/>
+	</message>
+	<message name="LogInfo">
+		<param name="sysError" type="int"/>
+		<param name="userCode" type="int"/>
+		<param name="timeStr" type="string"/>
+		<param name="entityName" type="string"/>
+		<param name="message" type="string"/>
 	</message>
 </entity>

+ 11 - 0
Module/mod_guiconsole/guiconsole_define.cpp

@@ -0,0 +1,11 @@
+#include "guiconsole_define.h"
+#include <winpr/sysinfo.h>
+
+std::string GenerateTimeStr()
+{
+	SYSTEMTIME st;
+	GetLocalTime(&st);
+	CSimpleString timeStr = CSimpleString::Format("[%04d-%02d-%02d %02d:%02d:%02d]", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
+	return timeStr.GetData();
+}
+

+ 83 - 0
Module/mod_guiconsole/guiconsole_define.h

@@ -0,0 +1,83 @@
+#include <string>
+
+struct EntityEntry
+{
+	CSimpleStringA Name;
+	CSimpleStringA ModuleName;
+	int Type;
+	int State;
+	int Id;
+	int Pid;
+	int DevelopID;
+	int DebugLevel;
+
+	static const char* GetTypeName(int type)
+	{
+		static const char* _names[] = {
+			"auto",
+			"manual"
+		};
+		return _names[type % ARRAYSIZE(_names)];
+	}
+
+	static const char* GetStateName(int state)
+	{
+		static const char* _names[] = {
+			"NoStart",
+			"Starting",
+			"Idle",
+			"Busy",
+			"Pause",
+			"UnLoading",
+			"Lost",
+			"Close",
+			"Killed",
+		};
+		return _names[state % ARRAYSIZE(_names)];
+	}
+
+	static const char* GetErrorName(ErrorCodeEnum Error)
+	{
+		return "Unknown Error";
+	}
+};
+
+#define OP_START_ENTITY		1
+#define OP_STOP_ENTITY		0
+#define OP_PAUSE_ENTITY		2
+#define OP_TERMINATE_ENTITY 3
+#define OP_CONTINUE_ENTITY	4
+#define OP_FIRE_ENTITY_STATE		5
+
+struct callback_entry : public IReleasable
+{
+	virtual ~callback_entry() {}
+
+	CSimpleStringA EntityName;
+	union {
+		void* pRawData;
+		int state;
+	};
+	int op;
+	ErrorCodeEnum ErrorResult;
+};
+
+
+struct TerminalBaseInfo
+{
+	CSimpleStringA strTerminalNo;
+	CSimpleStringA strMachineType;
+	CSimpleStringA strSoftwareVersion;
+
+	TerminalBaseInfo()
+		:strTerminalNo(true), strMachineType(true), strSoftwareVersion(true) {}
+	TerminalBaseInfo(TerminalBaseInfo& rhs)
+		:strTerminalNo(rhs.strTerminalNo), strMachineType(rhs.strMachineType), strSoftwareVersion(rhs.strSoftwareVersion) {}
+	TerminalBaseInfo(const TerminalBaseInfo& rhs)
+		:strTerminalNo(rhs.strTerminalNo), strMachineType(rhs.strMachineType), strSoftwareVersion(rhs.strSoftwareVersion)
+	{
+	}
+};
+
+
+std::string GenerateTimeStr();

+ 78 - 12
Module/mod_guiconsole/mod_GuiConsole.h

@@ -1,34 +1,100 @@
 #pragma once
-
+#include "GUIConsole_def_g.h"
+#include "GUIConsole_server_g.h"
+using namespace GUIConsole;
 #include "SpBase.h"
+#include "guiconsole_define.h"
 
 // 本地控制台 GUIConsole	0x508
-class CGUIConsoleEntity : public CEntityBase, public ILogListener, public ITimerListener
+
+class CGUIConsoleSession : public GUIConsoleService_ServerSessionBase
 {
 public:
-	CGUIConsoleEntity()
-	{
-	}
+	CGUIConsoleSession(CGUIConsoleEntity* pEntity) :m_pEntity(pEntity) {}
+	virtual ~CGUIConsoleSession() {}
+
+	virtual void Handle_OpenLogSender(SpReqAnsContext<GUIConsoleService_OpenLogSender_Req, GUIConsoleService_OpenLogSender_Ans>::Pointer ctx);
+
+	virtual void Handle_CloseLogSender(SpReqAnsContext<GUIConsoleService_CloseLogSender_Req, GUIConsoleService_CloseLogSender_Ans>::Pointer ctx);
+
+	virtual void Handle_OpenEntityMonitor(SpReqAnsContext<GUIConsoleService_OpenEntityMonitor_Req, GUIConsoleService_OpenEntityMonitor_Ans>::Pointer ctx);
+
+	virtual void Handle_CloseEntityMonitor(SpReqAnsContext<GUIConsoleService_CloseEntityMonitor_Req, GUIConsoleService_CloseEntityMonitor_Ans>::Pointer ctx);
+
+	virtual void Handle_OpenPerformanceSender(SpReqAnsContext<GUIConsoleService_OpenPerformanceSender_Req, GUIConsoleService_OpenPerformanceSender_Ans>::Pointer ctx);
+
+	virtual void Handle_ClosePerformanceSender(SpReqAnsContext<GUIConsoleService_ClosePerformanceSender_Req, GUIConsoleService_ClosePerformanceSender_Ans>::Pointer ctx);
+
+	virtual void Handle_VTMSystemControl(SpReqAnsContext<GUIConsoleService_VTMSystemControl_Req, GUIConsoleService_VTMSystemControl_Ans>::Pointer ctx);
+
+	virtual void Handle_VTM_controlEntity(SpReqAnsContext<GUIConsoleService_VTM_controlEntity_Req, GUIConsoleService_VTM_controlEntity_Ans>::Pointer ctx);
+private:
+	CGUIConsoleEntity* m_pEntity;
+};
+
+class CGUIConsoleEntity : public CEntityBase, public ILogListener, public ITimerListener, IEntityStateListener, ICallbackListener
+{
+public:
+	CGUIConsoleEntity();
 
-	virtual ~CGUIConsoleEntity() {}
+	virtual ~CGUIConsoleEntity();
 	virtual const char *GetEntityName() const { return "GUIConsole"; }
 	const char* GetEntityVersion() const { return MODULE_VERSION_FULL; }
 	virtual bool IsService()const{return true;}
 
 	virtual void OnPreStart(CAutoArray<CSimpleStringA> strArgs,CSmartPointer<ITransactionContext> pTransactionContext);
 
-    void OnStarted()
-    {
-    }
+	void OnStarted() {}
+
+	virtual CServerSessionBase* OnNewSession(const char* /*pszRemoteEntityName*/, const char* /*pszParam*/)
+	{
+		return new CGUIConsoleSession(this);
+	}
 
 	virtual void OnPreClose(EntityCloseCauseEnum eCloseCause,CSmartPointer<ITransactionContext> pTransactionContext) ;
-	virtual void OnLog(const CAutoArray<CUUID> &SubIDs, const CUUID nLogID,const LogTypeEnum eLogType, const SeverityLevelEnum eLevel,
-		const DWORD dwSysError,const DWORD dwUserCode,const DWORD dwEntityInstanceID, const WORD wEntityDevelID, 
-		const CAutoArray<DWORD> &Param, const char *pszEntityName, const char *pszModuleName,const char *pszMessage, const linkContext &pLinkInfo);
+	
+
+	
+
+	std::pair<DWORD, std::string> openLogSender();
+	std::pair<DWORD, std::string> closeLogSender();
+	std::pair<DWORD, std::string> openEntityMonitor();
+	std::pair<DWORD, std::string> closeEntityMonitor();
+	std::pair<DWORD, std::string> openPerformanceSender();
+	std::pair<DWORD, std::string> closePerformanceSender();
+	std::pair<DWORD, std::string> VTMSystemControl();
+	std::pair<DWORD, std::string> VTM_controlEntity();
 
+private:
+	// ILogListener
+	virtual void OnLog(const CAutoArray<CUUID>& SubIDs, const CUUID nLogID, const LogTypeEnum eLogType, const SeverityLevelEnum eLevel,
+		const DWORD dwSysError, const DWORD dwUserCode, const DWORD dwEntityInstanceID, const WORD wEntityDevelID,
+		const CAutoArray<DWORD>& Param, const char* pszEntityName, const char* pszModuleName, const char* pszMessage, const linkContext& pLinkInfo);
+
+	//ITimerListener
 	void OnTimeout(DWORD dwTimerID);
 
+	//IEntityStateListener
+	virtual void OnEntityStateHook(const char* pszEntityName, const char* pszTriggerEntity, EntityStateEnum eState, EntityStateEnum eLastState);
+	virtual void OnCeateConnection(const char* pszCallerEntity, const char* pszServiceEntity) {}
+	virtual void OnCloseConnection(const char* pszCallerEntity, const char* pszServiceEntity) {}
+	virtual void OnUserStateHook(const char* pszEntityName, DWORD dwState, DWORD dwLastState) {}
+
+
+private:
+	ErrorCodeEnum AsyncStartEntity(const char* entity_name, const char* cmdline, void* pData);
+	ErrorCodeEnum AsyncStopEntity(const char* entity_name, void* pData);
+	ErrorCodeEnum AsyncPauseEntity(const char* entity_name, void* pData);
+	ErrorCodeEnum AsyncContinueEntity(const char* entity_name, void* pData);
+	ErrorCodeEnum AsyncTerminateEntity(const char* entity_name, void* pData);
+	ErrorCodeEnum GetEntity(const char* entity_name, EntityEntry& e);
+	ErrorCodeEnum GetAllEntity(CAutoArray<EntityEntry>& Entities);
+	//ICallbackListener
+	virtual void OnAnswer(CSmartPointer<IAsynWaitSp> pAsynWaitSp);
 
 
+private:
+	bool m_isOpenLogSender, m_isOpenEntityMonitor, m_isOpenPerformanceSender;
+	CUUID m_logSubID;
 };
 

+ 344 - 2
Module/mod_guiconsole/mod_guiconsole.cpp

@@ -1,6 +1,7 @@
-
 #include "mod_GuiConsole.h"
 #include "publicFunExport.h"
+#include <EventCode.h>
+#include <mod_guiconsole/GUIConsole_msg_g.h>
 
 
 bool isPad = false;
@@ -22,15 +23,356 @@ void CGUIConsoleEntity::OnLog(const CAutoArray<CUUID>& SubIDs, const CUUID nLogI
 	const DWORD dwSysError, const DWORD dwUserCode, const DWORD dwEntityInstanceID, const WORD wEntityDevelID,
 	const CAutoArray<DWORD>& Param, const char* pszEntityName, const char* pszModuleName, const char* pszMessage, const linkContext& pLinkInfo)
 {
-	
+	// 忽略GPIO事件
+	if (dwUserCode == 0x2090000A || dwUserCode == 0x20900009)
+		return;
+
+	//did not open log sender
+	if (!m_isOpenLogSender)
+		return;
+	if (pszMessage != NULL && strlen(pszMessage) > 2)
+	{
+		CSimpleStringA str = pszMessage;
+
+		LogInfo msg;
+		msg.sysError = dwSysError;
+		msg.userCode = dwUserCode;
+		msg.timeStr = GenerateTimeStr().c_str();
+		msg.entityName = pszEntityName;
+		msg.message = str;
+		SpSendBroadcast(GetFunction(), eMsg_LogInfo, eMsgSig_LogInfo, msg);
+	}
+}
+
+void CGUIConsoleEntity::OnEntityStateHook(const char* pszEntityName, const char* pszTriggerEntity, EntityStateEnum eState, EntityStateEnum eLastState)
+{
+	//did not open log sender
+	if (!m_isOpenLogSender)
+		return;
+
+	LogInfo msg;
+	if (eLastState == EntityState_Idle && eState != EntityState_Idle)
+	{
+		msg.sysError = ErrorCodeEnum::Error_Closed;
+		msg.userCode = ErrorCodeEnum::Error_Closed;
+		msg.message = CSimpleString::Format("%s实体异常,重新启动...", pszEntityName);
+	}
+	else
+	{
+		msg.sysError = ErrorCodeEnum::Error_Succeed;
+		msg.userCode = ErrorCodeEnum::Error_Succeed;
+		if (eState == EntityState_Starting)
+			msg.message = CSimpleString::Format("正在启动实体%s...", pszEntityName);
+		else if(eState == EntityState_Idle)
+			msg.message = CSimpleString::Format("%s 实体启动成功", pszEntityName);
+	}
+
+	msg.timeStr = GenerateTimeStr().c_str();
+	msg.entityName = pszEntityName;
+	SpSendBroadcast(GetFunction(), eMsg_LogInfo, eMsgSig_LogInfo, msg);
 }
 
 
 void CGUIConsoleEntity::OnTimeout(DWORD dwTimerID)
+{
+}
+
+std::pair<DWORD, std::string> CGUIConsoleEntity::openLogSender()
+{
+	if ((__int64)m_logSubID != 0)
+	{
+		LogWarn(SeverityLevelEnum::Severity_Middle, ErrorCodeEnum::Error_AlreadyExist, WARN_GUICONSOLE_LOG_ALREADY_REGISTER, "openLogSender: already register");
+		m_isOpenLogSender = true;
+		return std::pair<DWORD, std::string>(WARN_GUICONSOLE_LOG_ALREADY_REGISTER, "openLogSender: already register");
+	}
+	else
+	{
+		auto rc = GetFunction()->SubscribeLog(m_logSubID, this, Log_Ignore, Severity_None, Error_IgnoreAll, -1, NULL, false);
+		m_isOpenLogSender = (rc == ErrorCodeEnum::Error_Succeed);
+		return std::pair<DWORD, std::string>(rc, "");
+	}
+	
+	
+}
+
+std::pair<DWORD, std::string> CGUIConsoleEntity::closeLogSender()
+{
+	if ((__int64)m_logSubID == 0)
+	{
+		LogWarn(SeverityLevelEnum::Severity_Middle, ErrorCodeEnum::Error_AlreadyExist, WARN_GUICONSOLE_LOG_ALREADY_UNREGISTER, "openLogSender: already unregister");
+		m_isOpenLogSender = false;
+		return std::pair<DWORD, std::string>(WARN_GUICONSOLE_LOG_ALREADY_UNREGISTER, "openLogSender: already register");
+	}
+	else
+	{
+		auto rc = GetFunction()->UnsubscribeLog(m_logSubID);
+		if(rc == ErrorCodeEnum::Error_Succeed)
+			m_logSubID = 0;
+		m_isOpenLogSender = !(rc == ErrorCodeEnum::Error_Succeed);
+		return std::pair<DWORD, std::string>(rc, "");
+	}
+}
+
+std::pair<DWORD, std::string> CGUIConsoleEntity::openEntityMonitor()
+{
+	m_isOpenEntityMonitor = true;
+	return std::pair<DWORD, std::string>(Error_Succeed, "");
+}
+
+std::pair<DWORD, std::string> CGUIConsoleEntity::closeEntityMonitor()
+{
+	m_isOpenEntityMonitor = false;
+	return std::pair<DWORD, std::string>(Error_Succeed, "");
+}
+
+std::pair<DWORD, std::string> CGUIConsoleEntity::openPerformanceSender()
+{
+	m_isOpenPerformanceSender = true;
+	return std::pair<DWORD, std::string>(Error_Succeed, "");
+}
+
+std::pair<DWORD, std::string> CGUIConsoleEntity::closePerformanceSender()
+{
+	m_isOpenPerformanceSender = false;
+	return std::pair<DWORD, std::string>(Error_Succeed, "");
+}
+
+std::pair<DWORD, std::string> CGUIConsoleEntity::VTMSystemControl()
+{
+	return std::pair<DWORD, std::string>(Error_Succeed, "");
+}
+
+std::pair<DWORD, std::string> CGUIConsoleEntity::VTM_controlEntity()
 {
 	
+	return std::pair<DWORD, std::string>(Error_Succeed, "");
+}
+
+CGUIConsoleEntity::CGUIConsoleEntity()
+	:m_isOpenLogSender(false), m_isOpenEntityMonitor(false), m_isOpenPerformanceSender(false)
+{
+}
+
+CGUIConsoleEntity::~CGUIConsoleEntity()
+{}
+
+
+void CGUIConsoleSession::Handle_OpenLogSender(SpReqAnsContext<GUIConsoleService_OpenLogSender_Req, GUIConsoleService_OpenLogSender_Ans>::Pointer ctx)
+{
+	auto ret = m_pEntity->openLogSender();
+	ctx->Answer((ErrorCodeEnum)ret.first, (ErrorCodeEnum)ret.first);
+}
+
+void CGUIConsoleSession::Handle_CloseLogSender(SpReqAnsContext<GUIConsoleService_CloseLogSender_Req, GUIConsoleService_CloseLogSender_Ans>::Pointer ctx)
+{
+	auto ret = m_pEntity->closeLogSender();
+	ctx->Answer((ErrorCodeEnum)ret.first, (ErrorCodeEnum)ret.first);
+}
+
+void CGUIConsoleSession::Handle_OpenEntityMonitor(SpReqAnsContext<GUIConsoleService_OpenEntityMonitor_Req, GUIConsoleService_OpenEntityMonitor_Ans>::Pointer ctx)
+{
+	auto ret = m_pEntity->openEntityMonitor();
+	ctx->Answer((ErrorCodeEnum)ret.first, (ErrorCodeEnum)ret.first);
+}
+
+void CGUIConsoleSession::Handle_CloseEntityMonitor(SpReqAnsContext<GUIConsoleService_CloseEntityMonitor_Req, GUIConsoleService_CloseEntityMonitor_Ans>::Pointer ctx)
+{
+	auto ret = m_pEntity->closeEntityMonitor();
+	ctx->Answer((ErrorCodeEnum)ret.first, (ErrorCodeEnum)ret.first);
+}
+
+void CGUIConsoleSession::Handle_OpenPerformanceSender(SpReqAnsContext<GUIConsoleService_OpenPerformanceSender_Req, GUIConsoleService_OpenPerformanceSender_Ans>::Pointer ctx)
+{
+	auto ret = m_pEntity->openPerformanceSender();
+	ctx->Answer((ErrorCodeEnum)ret.first, (ErrorCodeEnum)ret.first);
+}
+
+void CGUIConsoleSession::Handle_ClosePerformanceSender(SpReqAnsContext<GUIConsoleService_ClosePerformanceSender_Req, GUIConsoleService_ClosePerformanceSender_Ans>::Pointer ctx)
+{
+	auto ret = m_pEntity->closePerformanceSender();
+	ctx->Answer((ErrorCodeEnum)ret.first, (ErrorCodeEnum)ret.first);
+}
+
+void CGUIConsoleSession::Handle_VTMSystemControl(SpReqAnsContext<GUIConsoleService_VTMSystemControl_Req, GUIConsoleService_VTMSystemControl_Ans>::Pointer ctx)
+{
+	auto ret = m_pEntity->VTMSystemControl();
+	ctx->Answer((ErrorCodeEnum)ret.first, (ErrorCodeEnum)ret.first);
+}
+
+void CGUIConsoleSession::Handle_VTM_controlEntity(SpReqAnsContext<GUIConsoleService_VTM_controlEntity_Req, GUIConsoleService_VTM_controlEntity_Ans>::Pointer ctx)
+{
+	auto ret = m_pEntity->VTM_controlEntity();
+	ctx->Answer((ErrorCodeEnum)ret.first, (ErrorCodeEnum)ret.first);
+}
+
+ErrorCodeEnum CGUIConsoleEntity::AsyncStartEntity(const char* entity_name, const char* cmdline, void* pData)
+{
+	CSmartPointer<IEntityFunction> pFunc = GetFunction();
+	CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
+	if (pFuncPrivilege != NULL) {
+		CSmartPointer<IAsynWaitSp> spWait;
+		ErrorCodeEnum Error = pFuncPrivilege->StartEntity(entity_name, cmdline, spWait);
+		if (Error == Error_Succeed) {
+			callback_entry* entry = new callback_entry();
+			entry->pRawData = pData;
+			entry->EntityName = entity_name;
+			entry->ErrorResult = Error_Unexpect;
+			entry->op = OP_START_ENTITY;
+			spWait->SetCallback(this, entry);
+		}
+		return Error;
+	}
+	else {
+		return Error_NoPrivilege;
+	}
+}
+
+ErrorCodeEnum CGUIConsoleEntity::AsyncStopEntity(const char* entity_name, void* pData)
+{
+	CSmartPointer<IEntityFunction> pFunc = GetFunction();
+	CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
+	if (pFuncPrivilege != NULL) {
+		CSmartPointer<IAsynWaitSp> spWait;
+		ErrorCodeEnum Error = pFuncPrivilege->StopEntity(entity_name, spWait);
+		if (Error == Error_Succeed) {
+			callback_entry* entry = new callback_entry();
+			entry->pRawData = pData;
+			entry->EntityName = entity_name;
+			entry->ErrorResult = Error_Unexpect;
+			entry->op = OP_STOP_ENTITY;
+			spWait->SetCallback(this, entry);
+		}
+		return Error;
+	}
+	else {
+		return Error_NoPrivilege;
+	}
+}
+ErrorCodeEnum CGUIConsoleEntity::AsyncPauseEntity(const char* entity_name, void* pData)
+{
+	CSmartPointer<IEntityFunction> pFunc = GetFunction();
+	CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
+	if (pFuncPrivilege != NULL) {
+		CSmartPointer<IAsynWaitSp> spWait;
+		ErrorCodeEnum Error = pFuncPrivilege->PauseEntity(entity_name, spWait);
+		if (Error == Error_Succeed) {
+			callback_entry* entry = new callback_entry();
+			entry->pRawData = pData;
+			entry->EntityName = entity_name;
+			entry->ErrorResult = Error_Unexpect;
+			entry->op = OP_PAUSE_ENTITY;
+			spWait->SetCallback(this, entry);
+		}
+		return Error;
+	}
+	else {
+		return Error_NoPrivilege;
+	}
+}
+ErrorCodeEnum CGUIConsoleEntity::AsyncContinueEntity(const char* entity_name, void* pData)
+{
+	CSmartPointer<IEntityFunction> pFunc = GetFunction();
+	CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
+	if (pFuncPrivilege != NULL) {
+		CSmartPointer<IAsynWaitSp> spWait;
+		ErrorCodeEnum Error = pFuncPrivilege->ContinueEntity(entity_name, spWait);
+		if (Error == Error_Succeed) {
+			callback_entry* entry = new callback_entry();
+			entry->pRawData = pData;
+			entry->EntityName = entity_name;
+			entry->ErrorResult = Error_Unexpect;
+			entry->op = OP_CONTINUE_ENTITY;
+			spWait->SetCallback(this, entry);
+		}
+		return Error;
+	}
+	else {
+		return Error_NoPrivilege;
+	}
+}
+ErrorCodeEnum CGUIConsoleEntity::AsyncTerminateEntity(const char* entity_name, void* pData)
+{
+	CSmartPointer<IEntityFunction> pFunc = GetFunction();
+	CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
+	if (pFuncPrivilege != NULL) {
+		CSmartPointer<IAsynWaitSp> spWait;
+		ErrorCodeEnum Error = pFuncPrivilege->TerminateEntity(entity_name, spWait);
+		if (Error == Error_Succeed) {
+			callback_entry* entry = new callback_entry();
+			entry->pRawData = pData;
+			entry->EntityName = entity_name;
+			entry->ErrorResult = Error_Unexpect;
+			entry->op = OP_TERMINATE_ENTITY;
+			spWait->SetCallback(this, entry);
+		}
+		return Error;
+	}
+	else {
+		return Error_NoPrivilege;
+	}
+}
+
+ErrorCodeEnum CGUIConsoleEntity::GetEntity(const char* entity_name, EntityEntry& e)
+{
+	CSmartPointer<IEntityFunction> spFunc = GetFunction();
+	LOG_ASSERT(spFunc != NULL);
+	CEntityStaticInfo StaticInfo;
+	CEntityRunInfo RunInfo;
+	ErrorCodeEnum Error = spFunc->GetEntityStaticInfo(entity_name, StaticInfo);
+	if (Error == Error_Succeed) {
+		Error = spFunc->GetEntityRunInfo(entity_name, RunInfo);
+		if (Error == Error_Succeed) {
+			e.Name = entity_name;
+			e.Id = RunInfo.dwEntityInstanceID;
+			e.ModuleName = _GetFileName(StaticInfo.strSpFileName);
+			e.State = RunInfo.eState;
+			e.Type = StaticInfo.bStartedByShell ? 0 : 1;
+			e.Pid = (int)RunInfo.dwProcessID;
+			e.DevelopID = (int)StaticInfo.wEntityDevelopID;
+			e.DebugLevel = RunInfo.eDebugLevel;
+		}
+	}
+	return Error;
+}
+
+
+ErrorCodeEnum CGUIConsoleEntity::GetAllEntity(CAutoArray<EntityEntry>& Entities)
+{
+	CSmartPointer<IEntityFunction> spFunc = GetFunction();
+	CAutoArray<CSimpleStringA> strEntityNames;
+	CAutoArray<WORD> wDevelopIDs;
+	ErrorCodeEnum Error = spFunc->GetAllRegistedEntity(strEntityNames, wDevelopIDs);
+	if (Error == Error_Succeed) {
+		Entities.Init(strEntityNames.GetCount());
+		for (int i = 0; i < strEntityNames.GetCount(); ++i) {
+			Error = GetEntity(strEntityNames[i], Entities[i]);
+		}
+	}
+	return Error;
 }
 
+void CGUIConsoleEntity::OnAnswer(CSmartPointer<IAsynWaitSp> pAsynWaitSp)
+{
+	/*
+	if (m_hWndMainFrame) {
+		CSmartPointer<ICallbackListener> spCallback;
+		CSmartPointer<IReleasable> pData;
+		pAsynWaitSp->GetCallback(spCallback, pData);
+		LOG_ASSERT(pData.GetRawPointer() != NULL);
+		callback_entry* entry = static_cast<callback_entry*>((IReleasable*)pData.GetRawPointer());
+		entry->ErrorResult = pAsynWaitSp->AsyncGetAnswer();
+		callback_entry* new_entry = new callback_entry();
+		new_entry->EntityName = entry->EntityName;
+		new_entry->ErrorResult = entry->ErrorResult;
+		new_entry->op = entry->op;
+		new_entry->state = entry->state;
+		PostMessage(m_hWndMainFrame, WM_GUICONSOLE, 0, (LPARAM)new_entry);
+	}
+	*/
+}
+
+
+
 
 SP_BEGIN_ENTITY_MAP()
 SP_ENTITY(CGUIConsoleEntity)