123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591 |
- #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 <class T> std::vector<T> autoArryTovector(const CAutoArray<T>* p)
- {
- std::vector<T> 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<EntityEntry> 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<EntityEntryPlus> 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<class TFirst, class... TOther>
- 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<IEntityFunction> pFunc = m_pEntity->GetFunction();
- CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
- if (pFuncPrivilege != NULL) {
- return pFuncPrivilege->RegistEntityStateEvent(NULL, this); // NULL to register for all
- } else {
- return Error_NoPrivilege;
- }
- }
- ErrorCodeEnum GUITask::UnregistEntityStateEvent()
- {
- CSmartPointer<IEntityFunction> pFunc = m_pEntity->GetFunction();
- CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
- if (pFuncPrivilege != NULL)
- return pFuncPrivilege->UnregistEntityStateEvent(NULL);
- else
- return Error_NoPrivilege;
- }
- ErrorCodeEnum GUITask::ReqFrameworkQuit(bool bRebootOS)
- {
- CSmartPointer<IEntityFunction> pFunc = m_pEntity->GetFunction();
- CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
- 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<IEntityFunction> pFunc = m_pEntity->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 GUITask::AsyncStopEntity(const char *entity_name, void *pData)
- {
- CSmartPointer<IEntityFunction> pFunc = m_pEntity->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 GUITask::AsyncPauseEntity(const char *entity_name, void *pData)
- {
- CSmartPointer<IEntityFunction> pFunc = m_pEntity->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 GUITask::AsyncContinueEntity(const char *entity_name, void *pData)
- {
- CSmartPointer<IEntityFunction> pFunc = m_pEntity->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 GUITask::AsyncTerminateEntity(const char *entity_name, void *pData)
- {
- CSmartPointer<IEntityFunction> pFunc = m_pEntity->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 GUITask::GetAllEntity(CAutoArray<EntityEntry> &Entities)
- {
- CSmartPointer<IEntityFunction> spFunc = m_pEntity->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;
- }
- ErrorCodeEnum GUITask::GetEntity(const char *entity_name, EntityEntry &e)
- {
- CSmartPointer<IEntityFunction> 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<StartMenuEntry> &StartItems)
- {
- CSmartPointer<IEntityFunction> spFunc = m_pEntity->GetFunction();
- CSmartPointer<IConfigInfo> 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<IAsynWaitSp> 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<IEntityFunction> pFunc = m_pEntity->GetFunction();
- pFunc->GetEntityRunInfo(pszEntityName, Info);
- entityStateChange cur = { pszEntityName , eState , Info.dwProcessID };
- m_server->publish("EntityStateChange", cur);
- }
- void GUITask::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)
- {
-
- // 忽略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();
- }
|