#include "SpBase.h" #include "guitask.h" struct callback_entry : public IReleasable { virtual ~callback_entry() {} CSimpleStringA EntityName; union { void* pRawData; int state; }; int op; ErrorCodeEnum ErrorResult; }; #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 GUITask::GUITask() : m_pEntity(NULL), m_hWndMainFrame(NULL), m_hThread(NULL) { m_hEventStartReady = ::CreateEventA(NULL, TRUE, FALSE, NULL); m_hEventStopReady = ::CreateEventA(NULL, TRUE, FALSE, NULL); } GUITask::~GUITask() { CloseHandle(m_hEventStopReady); CloseHandle(m_hEventStartReady); } GUITask g_task; namespace rpcFunc { bool StartEntity(rpc_conn conn, std::string entityName) { ErrorCodeEnum Error = g_task.AsyncStartEntity(entityName.c_str(), NULL, NULL); if (Error == Error_Succeed) { Dbg("startEntiy %s success!!", entityName.c_str()); return true; } Dbg("start %s failed, error = 0x%08X\r\n", entityName.c_str(), Error); return false; } bool StopEntity(rpc_conn conn, std::string entityName) { ErrorCodeEnum Error = g_task.AsyncStopEntity(entityName.c_str(), NULL); if (Error == Error_Succeed) { Dbg("StopEntity %s success!!", entityName.c_str()); return true; } Dbg("stop %s failed, error = 0x%08X\r\n", entityName.c_str(), Error); return false; } bool PauseEntity(rpc_conn conn, std::string entityName) { ErrorCodeEnum Error = g_task.AsyncPauseEntity(entityName.c_str(), NULL); if (Error == Error_Succeed) { Dbg("PauseEntity %s success!!", entityName.c_str()); return true; } Dbg("pause %s failed, error = 0x%08X\r\n", entityName.c_str(), Error); return false; } bool ContinueEntity(rpc_conn conn, std::string entityName) { ErrorCodeEnum Error = g_task.AsyncContinueEntity(entityName.c_str(), NULL); if (Error == Error_Succeed) { Dbg("ContinueEntity %s success!!", entityName.c_str()); return true; } Dbg("continue %s failed, error = 0x%08X\r\n", entityName.c_str(), Error); return false; } bool TerminateEntity(rpc_conn conn, std::string entityName) { ErrorCodeEnum Error = g_task.AsyncTerminateEntity(entityName.c_str(), NULL); if (Error == Error_Succeed) { Dbg("TerminateEntity %s success!!", entityName.c_str()); return true; } Dbg("Terminate %s failed, error = 0x%08X\r\n", entityName.c_str(), Error); return false; } template std::vector autoArryTovector(const CAutoArray* p) { std::vector dst; for (size_t i = 0; p != nullptr && i < p->GetCount(); i++) dst.push_back(*p[i]); return dst; } EntityEntryPlusVec GetAllEntity(rpc_conn conn) { CAutoArray Entities; ErrorCodeEnum Error = g_task.GetAllEntity(Entities); if (Error == Error_Succeed) Dbg("GetAllEntity success!!, entityNum:%d", Entities.GetCount()); else Dbg("GetAllEntity failed, error = 0x%08X\r\n", Error); std::vector dst; for (size_t i = 0; i < Entities.GetCount(); i++) dst.push_back({ Entities[i].Name.GetData(), Entities[i].ModuleName.GetData(), Entities[i].Type, Entities[i].State, Entities[i].Id, Entities[i].Pid, Entities[i].DevelopID, Entities[i].DebugLevel }); EntityEntryPlusVec ret; ret.entityArr = dst; return ret; } } using namespace rpcFunc; bool GUITask::openrpcServer(int port) { std::thread thd([&] { m_server.reset(new rpc_server(port, std::thread::hardware_concurrency())); m_server->register_handler("StartEntity", StartEntity); m_server->register_handler("StopEntity", StopEntity); m_server->register_handler("PauseEntity", PauseEntity); m_server->register_handler("ContinueEntity", ContinueEntity); m_server->register_handler("TerminateEntity", TerminateEntity); m_server->register_handler("GetAllEntity", rpcFunc::GetAllEntity); m_server->register_handler("publish", [&](rpc_conn conn, std::string key, std::string token, std::string val) { m_server->publish(std::move(key), std::move(val)); }); m_server->run(); }); thd.detach(); Dbg("rpc start, async run"); return true; } void GUITask::publishMsg(outputMsg out) { m_server->publish("outMsg", out); } template void outputMsgToGUI(const char* format, TFirst&& first, TOther&&... other) { auto msg = string_format(format, first, other); g_task.publishMsg({ "togui", 4 /*Debug*/, 1 /*Low*/, 0, 0, msg }); } ErrorCodeEnum GUITask::RegistEntityStateEvent() { CSmartPointer pFunc = m_pEntity->GetFunction(); CSmartPointer pFuncPrivilege = pFunc.ConvertCase(); if (pFuncPrivilege != NULL) { return pFuncPrivilege->RegistEntityStateEvent(NULL, this); // NULL to register for all } else { return Error_NoPrivilege; } } ErrorCodeEnum GUITask::UnregistEntityStateEvent() { CSmartPointer pFunc = m_pEntity->GetFunction(); CSmartPointer pFuncPrivilege = pFunc.ConvertCase(); if (pFuncPrivilege != NULL) return pFuncPrivilege->UnregistEntityStateEvent(NULL); else return Error_NoPrivilege; } ErrorCodeEnum GUITask::ReqFrameworkQuit(bool bRebootOS) { CSmartPointer pFunc = m_pEntity->GetFunction(); CSmartPointer pFuncPrivilege = pFunc.ConvertCase(); if (pFuncPrivilege != NULL) return pFuncPrivilege->Reboot(RebootTrigger_ManualLocal, bRebootOS ? RebootWay_OS : RebootWay_Framework ); return Error_Unexpect; } ErrorCodeEnum GUITask::SubscribeLog() { return m_pEntity->GetFunction()->SubscribeLog(m_logSubID, this, Log_Ignore, Severity_None, Error_IgnoreAll, -2, NULL, false); } ErrorCodeEnum GUITask::UnSubscribeLog() { if ((__int64)m_logSubID != 0) { m_pEntity->GetFunction()->UnsubscribeLog(m_logSubID); m_logSubID = 0; } return Error_Succeed; } ErrorCodeEnum GUITask::SetDebugLevel(const char *pszEntity, int nLevel) { return m_pEntity->GetFunction()->GetPrivilegeFunction()->SetSysDebugLevel(pszEntity, (DebugLevelEnum)nLevel, true); } ErrorCodeEnum GUITask::GetShellDebugLevel(int &nLevel) { CSystemRunInfo info ={}; auto rc = m_pEntity->GetFunction()->GetSystemRunInfo(info); if (rc == Error_Succeed) nLevel = info.eDebugLevel; return rc; } ErrorCodeEnum GUITask::BeginAccessAuth() { return Error_Succeed; } ErrorCodeEnum GUITask::BeginInitialize() { return Error_Succeed; } ErrorCodeEnum GUITask::DeleteKeySet() { return Error_Succeed; } ErrorCodeEnum GUITask::GetFrameworkInfo(CSimpleStringA &strInfo) { CSystemStaticInfo info; memset(&info, 0, sizeof(info)); auto rc = m_pEntity->GetFunction()->GetSystemStaticInfo(info); if (rc == Error_Succeed) strInfo = CSimpleStringA::Format("[%s] [%s]", (const char*) info.strTerminalID, (const char*)info.InstallVersion.ToString()); return rc; } void GUITask::Kickoff(CEntityBase* pEntity) { m_pEntity = pEntity; RegistEntityStateEvent(); } ErrorCodeEnum GUITask::AsyncStartEntity(const char *entity_name, const char *cmdline, void *pData) { CSmartPointer pFunc = m_pEntity->GetFunction(); CSmartPointer pFuncPrivilege = pFunc.ConvertCase(); if (pFuncPrivilege != NULL) { CSmartPointer 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 GUITask::AsyncStopEntity(const char *entity_name, void *pData) { CSmartPointer pFunc = m_pEntity->GetFunction(); CSmartPointer pFuncPrivilege = pFunc.ConvertCase(); if (pFuncPrivilege != NULL) { CSmartPointer 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 GUITask::AsyncPauseEntity(const char *entity_name, void *pData) { CSmartPointer pFunc = m_pEntity->GetFunction(); CSmartPointer pFuncPrivilege = pFunc.ConvertCase(); if (pFuncPrivilege != NULL) { CSmartPointer 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 GUITask::AsyncContinueEntity(const char *entity_name, void *pData) { CSmartPointer pFunc = m_pEntity->GetFunction(); CSmartPointer pFuncPrivilege = pFunc.ConvertCase(); if (pFuncPrivilege != NULL) { CSmartPointer 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 GUITask::AsyncTerminateEntity(const char *entity_name, void *pData) { CSmartPointer pFunc = m_pEntity->GetFunction(); CSmartPointer pFuncPrivilege = pFunc.ConvertCase(); if (pFuncPrivilege != NULL) { CSmartPointer 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 GUITask::GetAllEntity(CAutoArray &Entities) { CSmartPointer spFunc = m_pEntity->GetFunction(); CAutoArray strEntityNames; CAutoArray 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; } ErrorCodeEnum GUITask::GetEntity(const char *entity_name, EntityEntry &e) { CSmartPointer spFunc = m_pEntity->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 GUITask::GetCustomizeStartMenuList(CAutoArray &StartItems) { CSmartPointer spFunc = m_pEntity->GetFunction(); CSmartPointer spConfig; LOG_ASSERT(spFunc != NULL); int cnt = 0; ErrorCodeEnum Error = spFunc->OpenConfig(Config_Software, spConfig); if (Error != Error_Succeed) return Error; Error = spConfig->ReadConfigValueInt("StartMenu", "Number", cnt); if (Error != Error_Succeed) return Error; StartItems.Init(cnt); for (int i = 0; i < cnt; ++i) { char tmp[128]; CSimpleStringA strValue; _itoa(i+1, tmp, 10); Error = spConfig->ReadConfigValue("StartMenu", tmp, strValue); const char *p = strValue; if (Error != Error_Succeed || p == NULL || strValue.GetLength() == 0) break; int kk = 0; while (*p && *p != ' ') { tmp[kk++] = *p; p++; } tmp[kk] = 0; StartItems[i].strEntity = tmp; while (*p && *p == ' ') p++; if (*p) { StartItems[i].strCmdLine = p; } else { StartItems[i].strCmdLine = ""; } } return Error; } void GUITask::OnAnswer(CSmartPointer pAsynWaitSp) { } ErrorCodeEnum GUITask::OutputMsg(const char *pMsg) { return Error_Succeed; } void GUITask::OnEntityStateHook(const char *pszEntityName,const char *pszTriggerEntity,EntityStateEnum eState,EntityStateEnum eLastState) { CEntityRunInfo Info; CSmartPointer pFunc = m_pEntity->GetFunction(); pFunc->GetEntityRunInfo(pszEntityName, Info); entityStateChange cur = { pszEntityName , eState , Info.dwProcessID }; m_server->publish("EntityStateChange", cur); } void GUITask::OnLog(const CAutoArray &SubIDs, const CUUID nLogID,const LogTypeEnum eLogType, const SeverityLevelEnum eLevel, const DWORD dwSysError,const DWORD dwUserCode,const DWORD dwEntityInstanceID, const WORD wEntityDevelID, const CAutoArray &Param, const char *pszEntityName, const char *pszModuleName,const char *pszMessage) { // 忽略GPIO事件 if (dwUserCode == 0x2090000A || dwUserCode == 0x20900009) return; if (pszMessage!=NULL && strlen(pszMessage)>2) { CSimpleStringA str = pszMessage; if (str[str.GetLength()-2] == '\r' && str[str.GetLength()-1]=='\n') str[str.GetLength()-2] = 0; if (eLogType == Log_Error) m_lastErrorMsg = str = CSimpleStringA::Format("[%s] Error:{%s}(sc:0x%X, uc:0x%X)\r\n", pszEntityName, (const char*)str, dwSysError, dwUserCode); else if(eLogType == Log_Warning) str = CSimpleStringA::Format("[%s] Warn:{%s}(sc:0x%X, uc:0x%X)\r\n", pszEntityName, (const char*)str, dwSysError, dwUserCode); else if(eLogType == Log_Event) str = CSimpleStringA::Format("[%s] Event:{%s}(uc:0x%X)\r\n", pszEntityName, (const char*)str, dwUserCode); else if (eLogType == Log_Debug) str = CSimpleStringA::Format("[%s] Debug:{%s}\r\n", pszEntityName, (const char*)str); publishMsg({ "togui" , 4 /*Debug*/, 1 /*Low*/, 0, 0 , str.GetData() }); } } CEntityBase* GUITask::GetEntity() { return m_pEntity; } ErrorCodeEnum GUITask::ShowMaintainView(bool bShow, bool bHighLevel) { return Error_Succeed; } ErrorCodeEnum GUITask::SetWindowPosition(bool bTop) { CSystemStaticInfo info; memset(&info, 0, sizeof(info)); auto rc = m_pEntity->GetFunction()->GetSystemStaticInfo(info); if (stricmp(info.strMachineType, "RVC.IL") == 0) return Error_Succeed; if (m_hWndMainFrame) { if (bTop) { ShowWindow(m_hWndMainFrame, SW_NORMAL); SetWindowPos(m_hWndMainFrame, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); // 启动软键盘 // WinExec("osk.exe", SW_NORMAL); //ShellExecuteA(NULL, "open", "osk.exe", NULL, NULL, SW_SHOW); } else { SetWindowPos(m_hWndMainFrame, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); ShowWindow(m_hWndMainFrame, SW_MINIMIZE); // 关闭软键盘 //CloseSoftKeyboard(); } return Error_Succeed; } else return Error_NotExist; } ErrorCodeEnum GUITask::ShowBeginInit(bool bShow) { return Error_Succeed; } void GUITask::CloseSoftKeyboard() { HANDLE hProcessHandle; ULONG nProcessID; HWND kbWindow; kbWindow = ::FindWindow(NULL, _T("屏幕键盘")); if (NULL != kbWindow) { ::GetWindowThreadProcessId(kbWindow, &nProcessID); hProcessHandle = ::OpenProcess(PROCESS_TERMINATE, FALSE, nProcessID); ::TerminateProcess(hProcessHandle, 4); } } ErrorCodeEnum GUITask::ShowBlueScreen() { auto pEntityFunc = m_pEntity->GetFunction(); auto pPrevFunc = pEntityFunc->GetPrivilegeFunction(); const char *pMsg = "System Failure!System Failure!System Failure!System Failure!System Failure!System Failure!System Failure!System Failure!\r\n系统启动失败,请联系总行开发人员解决!"; pPrevFunc->DisplayBlueScreen(pMsg); return Error_Succeed; } ErrorCodeEnum GUITask::ShowFatalError() { auto pEntityFunc = m_pEntity->GetFunction(); const char *pMsg = "开放系统管理员初级培训及认证报名通知.开放系统管理员初级培训及认证报名通知.开放系统管理员初级培训及认证报名通知.开放系统管理员初级培训及认证报名通知.开放系统管理员初级培训及认证报名通知."; pEntityFunc->ShowFatalError(pMsg); return Error_Succeed; } ErrorCodeEnum GUITask::HideBlueScreen() { auto pEntityFunc = m_pEntity->GetFunction(); auto pPrevFunc = pEntityFunc->GetPrivilegeFunction(); return pPrevFunc->UndisplayBlueScreen(); } ErrorCodeEnum GUITask::ShowOutputConsole() { auto pFunc = m_pEntity->GetFunction()->GetPrivilegeFunction(); return pFunc->ShowOuputConsole(); } ErrorCodeEnum GUITask::CloseOutputConsole() { auto pFunc = m_pEntity->GetFunction()->GetPrivilegeFunction(); return pFunc->CloseOuputConsole(); }