123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366 |
- #include "precompile.h"
- #include "sp_mod.h"
- #include "svc.h"
- #include "app.h"
- #include "SpBase.h"
- #include "SpHelper.h"
- #include "sp_btr.h"
- #include "sp_gui.h"
- #include "sp_dbg_export.h"
- #include "sp_iom.h"
- #include "sp_svc.h"
- #include "sp_def.h"
- #include "sp_cfg.h"
- #include "sp_rpc.h"
- #include <memory>
- #include "osutil.h"
- #include "fileutil.h"
- #include <winpr/library.h>
- void on_bluesceen_display(sp_rpc_server_t *server, int epid, int svc_id, int call_type, iobuffer_t **info_pkt)
- {
- app_t *app = get_app_instance();
- char *msg = NULL;
- //int iBlueScreen=0;
- //iobuffer_format_read(*info_pkt, "s4", &msg, &iBlueScreen);
- iobuffer_format_read(*info_pkt, "s", &msg);
- sp_gui_show_running_info(app->bsc_gui, msg, 1);
- toolkit_free(msg);
- }
- void on_fatal_error_display(sp_rpc_server_t *server, int epid, int svc_id, int call_type, iobuffer_t **info_pkt)
- {
- app_t *app = get_app_instance();
- char *msg = NULL;
- //int iBlueScreen=0;
- //iobuffer_format_read(*info_pkt, "s4", &msg, &iBlueScreen);
- iobuffer_format_read(*info_pkt, "s", &msg);
- sp_gui_show_running_info(app->bsc_gui, msg, 2);
- toolkit_free(msg);
- }
- void on_startup_info_display(sp_rpc_server_t *server, int epid, int svc_id, int call_type, iobuffer_t **info_pkt)
- {
- app_t *app = get_app_instance();
- char *msg = NULL;
- iobuffer_format_read(*info_pkt, "s", &msg);
- sp_gui_show_running_info(app->bsc_gui, msg, 3);
- toolkit_free(msg);
- }
- void on_bluesceen_undisplay(sp_rpc_server_t *server, int epid, int svc_id, int call_type, iobuffer_t **info_pkt)
- {
- app_t *app = get_app_instance();
- sp_gui_undisplay(app->bsc_gui);
- }
- DWORD getExePath(char *exePath)
- {
- char pathbuf[MAX_PATH] = "";
- int pathlen = ::GetModuleFileName(NULL, pathbuf, MAX_PATH);
- // 替换掉单杠
- while (pathlen > 0)
- {
- if (pathbuf[pathlen--] == SPLIT_SLASH)
- break;
- }
- pathbuf[++pathlen] = '\0';
- sprintf(exePath, "%s", pathbuf);
- return strlen(exePath);
- }
- int KickoffSpRestart(bool bRestart)
- {
- #ifdef _WIN32
- STARTUPINFO si;
- PROCESS_INFORMATION pi;
- ZeroMemory(&si, sizeof(si));
- si.cb = sizeof(si);
- ZeroMemory(&pi, sizeof(pi));
- // LPTSTR szCmdline[] = _tcsdup(TEXT("\"C:\\Program Files\\MyApp\" -L -S"));
- //CreateProcess(NULL, szCmdline, /*...*/);
- // Start the child process.
- char exepath[MAX_PATH] = "";
- getExePath(exepath);
- CSimpleStringA csRestart, csVerPath, csAll, csSep("\""), csBlank(" "), csScript("wscript.exe"), csReFlag("r");
- csRestart = CSimpleStringA(exepath) + "\\sprestart.exe";
- sp_env_t* env = sp_get_env();
- csVerPath = env->dir->root_ver_path;
- csVerPath += "\\spexplorerfast.vbs";
- if (!bRestart)
- csReFlag = "n";
- csAll = csRestart + csBlank + csSep + csScript + csBlank + csVerPath + csSep
- + csBlank + csSep + csReFlag + csSep;
- Dbg("allpath[%s]", (LPCTSTR)csAll);
- LPTSTR szCmdline = _strdup(csAll);
- if (!CreateProcess(NULL, szCmdline, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) {
- Dbg("CreateProcess failed (%d).\n", GetLastError());
- return -1;
- }
- Dbg("CreateProcess Success PID:%d.\n", pi.dwProcessId);
- CloseHandle(pi.hProcess);
- CloseHandle(pi.hThread);
- return 0;
- #else
- return -1;
- #endif //_WIN32
- }
- void on_machine_reboot(sp_rpc_server_t *server, int epid, int svc_id, int call_type, iobuffer_t **info_pkt)
- {
- int reason(0), way(0);
- sp_env_t *env = sp_get_env();
- sp_cfg_t *cfg = env->cfg;
- iobuffer_read(*info_pkt, IOBUF_T_I4, &reason, 0);
- iobuffer_read(*info_pkt, IOBUF_T_I4, &way, 0);
- const RebootWayEnum eRebootWay = (RebootWayEnum)way;
- const RebootTriggerEnum eRebootTrigger = (RebootTriggerEnum)reason;
- Dbg("now reboot: reason = %s, way = %s", SpStrRebootTrigger(eRebootTrigger), SpStrRebootWay(eRebootWay));
- CSimpleStringA strPath = env->dir->root_runinfo_path;
- strPath += SPLIT_SLASH_STR "BootLog";
- sp_btr_write_on_shutdown(strPath, env->btr_ctx, reason, way);
- // 只处理框架重启及操作系统重启,电源重启由健康实体处理
- if (eRebootWay == RebootWay_Framework && eRebootTrigger != RebootTrigger_DeadForever)
- {
- Dbg("reboot framework now");
- KickoffSpRestart(true);
- }
- else if (eRebootWay == RebootWay_OS)
- {
- Dbg("reboot windows now");
- osutil_restart_system();
- }
- app_t *app = get_app_instance();
- sp_iom_post_quit(app->iom);
- }
- void on_entity_quit(sp_rpc_server_t *server, int epid, int svc_id, int call_type, iobuffer_t **info_pkt)
- {
- int entity_id;
- sp_env_t *env = sp_get_env();
- iobuffer_read(*info_pkt, IOBUF_T_I4, &entity_id, NULL);
- sp_mod_mgr_stop_entity(env->mod_mgr, entity_id, svc_id, CloseCause_Self);
- }
- void on_output_console_on(sp_rpc_server_t *server, int epid, int svc_id, int call_type, iobuffer_t **info_pkt)
- {
- Dbg("set output console on");
- #ifdef _WIN32
- auto app = get_app_instance();
- sp_gui_display(app->bsc_gui);
- #else
- //sp_dbg_start_console("可视柜台终端运行监控");
- #endif //_WIN32
- }
- void on_output_console_off(sp_rpc_server_t *server, int epid, int svc_id, int call_type, iobuffer_t **info_pkt)
- {
- Dbg("set output console off");
- #ifdef _WIN32
- auto app = get_app_instance();
- sp_gui_undisplay(app->bsc_gui);
- #else
- //sp_dbg_close_console();
- #endif //_WIN32
- }
- typedef struct
- {
- sp_rpc_server_t* server;
- int epid;
- int rpc_id;
- int svc_id;
- int Entity_id;
- char cmdline[1024];
- }EntityStartParam;
- static unsigned int __stdcall on_entity_startThread(void* param)
- {
- EntityStartParam *dst = (EntityStartParam*)param;
- auto ans_pkt = on_entity_start(dst->svc_id, dst->Entity_id, dst->cmdline);
- //自己发送
- if (ans_pkt) {
- int rc = sp_rpc_server_send_answer(dst->server, dst->epid, dst->svc_id, dst->rpc_id, &ans_pkt);
- if (rc != 0)
- sp_dbg_warn("send answer failed!");
- if (ans_pkt)
- iobuffer_dec_ref(ans_pkt);
- }
- //delete dst;
- return 0;
- }
- iobuffer_t* on_entity_startEx(sp_rpc_server_t* server, int epid, int svc_id, int rpc_id, int call_type, iobuffer_t** req_pkt)
- {
- int entity_id;
- char* cmdline = NULL;
- iobuffer_read(*req_pkt, IOBUF_T_I4, &entity_id, NULL);
- sp_dbg_debug("handle start entityEx req: %d", entity_id);
- iobuffer_format_read(*req_pkt, "s", &cmdline);
- EntityStartParam *param = new EntityStartParam();
- param->server = server;
- param->epid = epid;
- param->rpc_id = rpc_id;
- param->svc_id = svc_id;
- param->Entity_id = entity_id;
- sprintf(param->cmdline, "%s", cmdline);
- toolkit_free(cmdline);
- CloseHandle(CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&on_entity_startThread, param, 0, NULL));
- return NULL;
- }
- iobuffer_t *on_entity_start(sp_rpc_server_t *server, int epid, int svc_id, int rpc_id, int call_type, iobuffer_t **req_pkt)
- {
- sp_env_t *env = sp_get_env();
- int entity_id;
- int result;
- char *cmdline = NULL;
- iobuffer_t *ans_pkt = NULL;
- iobuffer_read(*req_pkt, IOBUF_T_I4, &entity_id, NULL);
- sp_dbg_debug("handle start entity req: %d", entity_id);
- iobuffer_format_read(*req_pkt, "s", &cmdline);
- result = sp_mod_mgr_start_entity(env->mod_mgr, entity_id, cmdline, svc_id);
- toolkit_free(cmdline);
- ans_pkt = iobuffer_create(-1, -1);
- iobuffer_write(ans_pkt, IOBUF_T_I4, &result, 0);
- return ans_pkt;
- }
- iobuffer_t* on_entity_start(int svc_id, int entity_id, const char* cmdline)
- {
- sp_env_t* env = sp_get_env();
- int result;
- iobuffer_t* ans_pkt = NULL;
- result = sp_mod_mgr_start_entity(env->mod_mgr, entity_id, cmdline, svc_id);
- ans_pkt = iobuffer_create(-1, -1);
- iobuffer_write(ans_pkt, IOBUF_T_I4, &result, 0);
- return ans_pkt;
- }
- iobuffer_t *on_entity_stop(sp_rpc_server_t *server, int epid, int svc_id, int rpc_id, int call_type, iobuffer_t **req_pkt)
- {
- sp_env_t *env = sp_get_env();
- int entity_id;
- int result;
- int cause_code;
- iobuffer_t *ans_pkt = NULL;
- iobuffer_read(*req_pkt, IOBUF_T_I4, &entity_id, NULL);
- if (svc_id == SP_SHELL_SVC_ID) {
- cause_code = CloseCause_ShellQuit;
- } else if (svc_id == SP_INVALID_SVC_ID) {
- cause_code = CloseCause_Lost;
- } else if (svc_id == entity_id) {
- cause_code = CloseCause_Self;
- } else {
- cause_code = CloseCause_Other;
- }
- sp_dbg_debug("handle stop entity req: %d", entity_id);
- result = sp_mod_mgr_stop_entity(env->mod_mgr, entity_id, svc_id, cause_code);
- ans_pkt = iobuffer_create(-1, -1);
- iobuffer_write(ans_pkt, IOBUF_T_I4, &result, 0);
- return ans_pkt;
- }
- iobuffer_t *on_entity_continue(sp_rpc_server_t *server, int epid, int svc_id, int rpc_id, int call_type, iobuffer_t **req_pkt)
- {
- sp_env_t *env = sp_get_env();
- int entity_id;
- int result;
- iobuffer_t *ans_pkt = NULL;
- iobuffer_read(*req_pkt, IOBUF_T_I4, &entity_id, NULL);
- sp_dbg_debug("handle continue entity req: %d", entity_id);
- result = sp_mod_mgr_continue_entity(env->mod_mgr, entity_id, svc_id);
- ans_pkt = iobuffer_create(-1, -1);
- iobuffer_write(ans_pkt, IOBUF_T_I4, &result, 0);
- return ans_pkt;
- }
- iobuffer_t *on_entity_pause(sp_rpc_server_t *server, int epid, int svc_id, int rpc_id, int call_type, iobuffer_t **req_pkt)
- {
- sp_env_t *env = sp_get_env();
- int entity_id;
- int result;
- iobuffer_t *ans_pkt = NULL;
- iobuffer_read(*req_pkt, IOBUF_T_I4, &entity_id, NULL);
- sp_dbg_debug("handle pause entity req: %d", entity_id);
- result = sp_mod_mgr_pause_entity(env->mod_mgr, entity_id, svc_id);
- ans_pkt = iobuffer_create(-1, -1);
- iobuffer_write(ans_pkt, IOBUF_T_I4, &result, 0);
- return ans_pkt;
- }
- iobuffer_t *on_entity_test(sp_rpc_server_t *server, int epid, int svc_id, int rpc_id, int call_type, iobuffer_t **req_pkt)
- {
- sp_env_t *env = sp_get_env();
- int entity_id;
- int test_type;
- int result;
- iobuffer_t *ans_pkt = NULL;
- iobuffer_read(*req_pkt, IOBUF_T_I4, &entity_id, NULL);
- iobuffer_read(*req_pkt, IOBUF_T_I4, &test_type, NULL);
- //sp_dbg_debug("handle test entity req: %d", entity_id);
- result = sp_mod_mgr_test_entity(env->mod_mgr, entity_id, svc_id, test_type);
- ans_pkt = iobuffer_create(-1, -1);
- iobuffer_write(ans_pkt, IOBUF_T_I4, &result, 0);
- return ans_pkt;
- }
- iobuffer_t *on_entity_termination(sp_rpc_server_t *server, int epid, int svc_id, int rpc_id, int call_type, iobuffer_t **req_pkt)
- {
- sp_env_t *env = sp_get_env();
- int entity_id;
- int result;
- iobuffer_t *ans_pkt = NULL;
- iobuffer_read(*req_pkt, IOBUF_T_I4, &entity_id, NULL);
- sp_dbg_debug("handle terminate entity req: %d", entity_id);
- result = sp_mod_mgr_terminate_entity(env->mod_mgr, entity_id, svc_id);
- ans_pkt = iobuffer_create(-1, -1);
- iobuffer_write(ans_pkt, IOBUF_T_I4, &result, 0);
- return ans_pkt;
- }
- iobuffer_t *on_get_bcast_receiver(sp_rpc_server_t *server, int epid, int svc_id, int rpc_id, int call_type, iobuffer_t **req_pkt)
- {
- sp_env_t *env = sp_get_env();
- iobuffer_t *ans_pkt = NULL;
- int result = 0;
- int i;
- array_header_t *arr = sp_bcm_daemon_get_receiver(get_app_instance()->bcm_daemon, svc_id);
- ans_pkt = iobuffer_create(-1, -1);
- iobuffer_write(ans_pkt, IOBUF_T_I4, &result, 0);
- iobuffer_write(ans_pkt, IOBUF_T_I4, &arr->nelts, 0);
- for (i = 0; i < arr->nelts; ++i) {
- sp_bcm_receiver_t *recver = ARRAY_IDX(arr, i, sp_bcm_receiver_t*);
- iobuffer_write(ans_pkt, IOBUF_T_I8, &recver->id, 0);
- iobuffer_write(ans_pkt, IOBUF_T_I4, &recver->receiver_id, 0);
- iobuffer_write(ans_pkt, IOBUF_T_STR, &recver->param, -1);
- }
- sp_bcm_daemon_free_receiver_array(arr);
- return ans_pkt;
- }
|