1c29fa5a6Sopenharmony_ci/* 2c29fa5a6Sopenharmony_ci * Copyright (c) 2021-2024 Huawei Device Co., Ltd. 3c29fa5a6Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4c29fa5a6Sopenharmony_ci * you may not use this file except in compliance with the License. 5c29fa5a6Sopenharmony_ci * You may obtain a copy of the License at 6c29fa5a6Sopenharmony_ci * 7c29fa5a6Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8c29fa5a6Sopenharmony_ci * 9c29fa5a6Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10c29fa5a6Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11c29fa5a6Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12c29fa5a6Sopenharmony_ci * See the License for the specific language governing permissions and 13c29fa5a6Sopenharmony_ci * limitations under the License. 14c29fa5a6Sopenharmony_ci */ 15c29fa5a6Sopenharmony_ci 16c29fa5a6Sopenharmony_ci#include "event_dump.h" 17c29fa5a6Sopenharmony_ci 18c29fa5a6Sopenharmony_ci#include <getopt.h> 19c29fa5a6Sopenharmony_ci 20c29fa5a6Sopenharmony_ci#include <climits> 21c29fa5a6Sopenharmony_ci#include <cstdarg> 22c29fa5a6Sopenharmony_ci#include <cstring> 23c29fa5a6Sopenharmony_ci 24c29fa5a6Sopenharmony_ci#include <fcntl.h> 25c29fa5a6Sopenharmony_ci#include <sys/types.h> 26c29fa5a6Sopenharmony_ci#include <sys/stat.h> 27c29fa5a6Sopenharmony_ci 28c29fa5a6Sopenharmony_ci#include "event_interceptor_handler.h" 29c29fa5a6Sopenharmony_ci#include "event_monitor_handler.h" 30c29fa5a6Sopenharmony_ci#include "event_statistic.h" 31c29fa5a6Sopenharmony_ci#include "i_pointer_drawing_manager.h" 32c29fa5a6Sopenharmony_ci#include "input_device_manager.h" 33c29fa5a6Sopenharmony_ci#include "input_event_handler.h" 34c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_KEYBOARD 35c29fa5a6Sopenharmony_ci#include "i_input_windows_manager.h" 36c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_COMBINATION_KEY 37c29fa5a6Sopenharmony_ci#include "key_command_handler.h" 38c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_COMBINATION_KEY 39c29fa5a6Sopenharmony_ci#include "key_subscriber_handler.h" 40c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_KEYBOARD 41c29fa5a6Sopenharmony_ci#include "mouse_event_normalize.h" 42c29fa5a6Sopenharmony_ci#include "switch_subscriber_handler.h" 43c29fa5a6Sopenharmony_ci#include "securec.h" 44c29fa5a6Sopenharmony_ci#include "touch_drawing_manager.h" 45c29fa5a6Sopenharmony_ci#include "util_ex.h" 46c29fa5a6Sopenharmony_ci#include "util.h" 47c29fa5a6Sopenharmony_ci 48c29fa5a6Sopenharmony_ci#undef MMI_LOG_DOMAIN 49c29fa5a6Sopenharmony_ci#define MMI_LOG_DOMAIN MMI_LOG_SERVER 50c29fa5a6Sopenharmony_ci#undef MMI_LOG_TAG 51c29fa5a6Sopenharmony_ci#define MMI_LOG_TAG "EventDump" 52c29fa5a6Sopenharmony_ci 53c29fa5a6Sopenharmony_cinamespace OHOS { 54c29fa5a6Sopenharmony_cinamespace MMI { 55c29fa5a6Sopenharmony_cinamespace { 56c29fa5a6Sopenharmony_ciconstexpr int32_t MAX_COMMAND_COUNT { 32 }; 57c29fa5a6Sopenharmony_ci} // namespace 58c29fa5a6Sopenharmony_ci 59c29fa5a6Sopenharmony_ciEventDump::EventDump() {} 60c29fa5a6Sopenharmony_ciEventDump::~EventDump() {} 61c29fa5a6Sopenharmony_ci 62c29fa5a6Sopenharmony_civoid ChkConfig(int32_t fd) 63c29fa5a6Sopenharmony_ci{ 64c29fa5a6Sopenharmony_ci mprintf(fd, "ChkMMIConfig: "); 65c29fa5a6Sopenharmony_ci mprintf(fd, "DEF_MMI_DATA_ROOT:%s\n", DEF_MMI_DATA_ROOT); 66c29fa5a6Sopenharmony_ci mprintf(fd, "EXP_CONFIG:%s\n", DEF_EXP_CONFIG); 67c29fa5a6Sopenharmony_ci mprintf(fd, "EXP_SOPATH:%s\n", DEF_EXP_SOPATH); 68c29fa5a6Sopenharmony_ci} 69c29fa5a6Sopenharmony_ci 70c29fa5a6Sopenharmony_civoid EventDump::CheckCount(int32_t fd, const std::vector<std::string> &args, int32_t &count) 71c29fa5a6Sopenharmony_ci{ 72c29fa5a6Sopenharmony_ci CALL_DEBUG_ENTER; 73c29fa5a6Sopenharmony_ci for (const auto &str : args) { 74c29fa5a6Sopenharmony_ci if (str.find("--") == 0) { 75c29fa5a6Sopenharmony_ci ++count; 76c29fa5a6Sopenharmony_ci continue; 77c29fa5a6Sopenharmony_ci } 78c29fa5a6Sopenharmony_ci if (str.find("-") == 0) { 79c29fa5a6Sopenharmony_ci count += static_cast<int32_t>(str.size()) - 1; 80c29fa5a6Sopenharmony_ci continue; 81c29fa5a6Sopenharmony_ci } 82c29fa5a6Sopenharmony_ci } 83c29fa5a6Sopenharmony_ci} 84c29fa5a6Sopenharmony_ci 85c29fa5a6Sopenharmony_civoid EventDump::ParseCommand(int32_t fd, const std::vector<std::string> &args) 86c29fa5a6Sopenharmony_ci{ 87c29fa5a6Sopenharmony_ci CALL_DEBUG_ENTER; 88c29fa5a6Sopenharmony_ci int32_t count = 0; 89c29fa5a6Sopenharmony_ci CheckCount(fd, args, count); 90c29fa5a6Sopenharmony_ci if (count > MAX_COMMAND_COUNT) { 91c29fa5a6Sopenharmony_ci MMI_HILOGE("cmd param number not more than 32"); 92c29fa5a6Sopenharmony_ci mprintf(fd, "cmd param number not more than 32\n"); 93c29fa5a6Sopenharmony_ci return; 94c29fa5a6Sopenharmony_ci } 95c29fa5a6Sopenharmony_ci int32_t optionIndex = 0; 96c29fa5a6Sopenharmony_ci struct option dumpOptions[] = { 97c29fa5a6Sopenharmony_ci { "help", no_argument, 0, 'h' }, 98c29fa5a6Sopenharmony_ci { "device", no_argument, 0, 'd' }, 99c29fa5a6Sopenharmony_ci { "devicelist", no_argument, 0, 'l' }, 100c29fa5a6Sopenharmony_ci { "windows", no_argument, 0, 'w' }, 101c29fa5a6Sopenharmony_ci { "udsserver", no_argument, 0, 'u' }, 102c29fa5a6Sopenharmony_ci { "subscriber", no_argument, 0, 's' }, 103c29fa5a6Sopenharmony_ci { "monitor", no_argument, 0, 'o' }, 104c29fa5a6Sopenharmony_ci { "interceptor", no_argument, 0, 'i' }, 105c29fa5a6Sopenharmony_ci { "filter", no_argument, 0, 'f' }, 106c29fa5a6Sopenharmony_ci { "mouse", no_argument, 0, 'm' }, 107c29fa5a6Sopenharmony_ci { "cursor", no_argument, 0, 'c' }, 108c29fa5a6Sopenharmony_ci { "keycommand", no_argument, 0, 'k' }, 109c29fa5a6Sopenharmony_ci { "event", no_argument, 0, 'e' }, 110c29fa5a6Sopenharmony_ci { nullptr, 0, 0, 0 } 111c29fa5a6Sopenharmony_ci }; 112c29fa5a6Sopenharmony_ci if (args.empty()) { 113c29fa5a6Sopenharmony_ci MMI_HILOGE("size of args can't be zero"); 114c29fa5a6Sopenharmony_ci return; 115c29fa5a6Sopenharmony_ci } 116c29fa5a6Sopenharmony_ci char **argv = new (std::nothrow) char *[args.size()]; 117c29fa5a6Sopenharmony_ci CHKPV(argv); 118c29fa5a6Sopenharmony_ci if (memset_s(argv, args.size() * sizeof(char*), 0, args.size() * sizeof(char*)) != EOK) { 119c29fa5a6Sopenharmony_ci MMI_HILOGE("Call memset_s failed"); 120c29fa5a6Sopenharmony_ci delete[] argv; 121c29fa5a6Sopenharmony_ci return; 122c29fa5a6Sopenharmony_ci } 123c29fa5a6Sopenharmony_ci for (size_t i = 0; i < args.size(); ++i) { 124c29fa5a6Sopenharmony_ci argv[i] = new (std::nothrow) char[args[i].size() + 1]; 125c29fa5a6Sopenharmony_ci if (argv[i] == nullptr) { 126c29fa5a6Sopenharmony_ci MMI_HILOGE("Failed to allocate memory"); 127c29fa5a6Sopenharmony_ci goto RELEASE_RES; 128c29fa5a6Sopenharmony_ci } 129c29fa5a6Sopenharmony_ci if (strcpy_s(argv[i], args[i].size() + 1, args[i].c_str()) != EOK) { 130c29fa5a6Sopenharmony_ci MMI_HILOGE("strcpy_s error"); 131c29fa5a6Sopenharmony_ci goto RELEASE_RES; 132c29fa5a6Sopenharmony_ci } 133c29fa5a6Sopenharmony_ci } 134c29fa5a6Sopenharmony_ci optind = 1; 135c29fa5a6Sopenharmony_ci int32_t c; 136c29fa5a6Sopenharmony_ci while ((c = getopt_long (args.size(), argv, "hdlwusoifmcke", dumpOptions, &optionIndex)) != -1) { 137c29fa5a6Sopenharmony_ci switch (c) { 138c29fa5a6Sopenharmony_ci case 'h': { 139c29fa5a6Sopenharmony_ci DumpEventHelp(fd, args); 140c29fa5a6Sopenharmony_ci break; 141c29fa5a6Sopenharmony_ci } 142c29fa5a6Sopenharmony_ci case 'd': { 143c29fa5a6Sopenharmony_ci INPUT_DEV_MGR->Dump(fd, args); 144c29fa5a6Sopenharmony_ci break; 145c29fa5a6Sopenharmony_ci } 146c29fa5a6Sopenharmony_ci case 'l': { 147c29fa5a6Sopenharmony_ci INPUT_DEV_MGR->DumpDeviceList(fd, args); 148c29fa5a6Sopenharmony_ci break; 149c29fa5a6Sopenharmony_ci } 150c29fa5a6Sopenharmony_ci case 'w': { 151c29fa5a6Sopenharmony_ci WIN_MGR->Dump(fd, args); 152c29fa5a6Sopenharmony_ci break; 153c29fa5a6Sopenharmony_ci } 154c29fa5a6Sopenharmony_ci case 'u': { 155c29fa5a6Sopenharmony_ci auto udsServer = InputHandler->GetUDSServer(); 156c29fa5a6Sopenharmony_ci CHKPV(udsServer); 157c29fa5a6Sopenharmony_ci udsServer->Dump(fd, args); 158c29fa5a6Sopenharmony_ci break; 159c29fa5a6Sopenharmony_ci } 160c29fa5a6Sopenharmony_ci case 's': { 161c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_KEYBOARD 162c29fa5a6Sopenharmony_ci auto subscriberHandler = InputHandler->GetSubscriberHandler(); 163c29fa5a6Sopenharmony_ci CHKPV(subscriberHandler); 164c29fa5a6Sopenharmony_ci subscriberHandler->Dump(fd, args); 165c29fa5a6Sopenharmony_ci#else 166c29fa5a6Sopenharmony_ci mprintf(fd, "Keyboard device does not support"); 167c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_KEYBOARD 168c29fa5a6Sopenharmony_ci break; 169c29fa5a6Sopenharmony_ci } 170c29fa5a6Sopenharmony_ci case 'o': { 171c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_MONITOR 172c29fa5a6Sopenharmony_ci auto monitorHandler = InputHandler->GetMonitorHandler(); 173c29fa5a6Sopenharmony_ci CHKPV(monitorHandler); 174c29fa5a6Sopenharmony_ci monitorHandler->Dump(fd, args); 175c29fa5a6Sopenharmony_ci#else 176c29fa5a6Sopenharmony_ci mprintf(fd, "Monitor function does not support"); 177c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_MONITOR 178c29fa5a6Sopenharmony_ci break; 179c29fa5a6Sopenharmony_ci } 180c29fa5a6Sopenharmony_ci case 'i': { 181c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_INTERCEPTOR 182c29fa5a6Sopenharmony_ci auto interceptorHandler = InputHandler->GetInterceptorHandler(); 183c29fa5a6Sopenharmony_ci CHKPV(interceptorHandler); 184c29fa5a6Sopenharmony_ci interceptorHandler->Dump(fd, args); 185c29fa5a6Sopenharmony_ci#else 186c29fa5a6Sopenharmony_ci mprintf(fd, "Interceptor function does not support"); 187c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_INTERCEPTOR 188c29fa5a6Sopenharmony_ci break; 189c29fa5a6Sopenharmony_ci } 190c29fa5a6Sopenharmony_ci case 'f': { 191c29fa5a6Sopenharmony_ci auto filterHandler = InputHandler->GetFilterHandler(); 192c29fa5a6Sopenharmony_ci CHKPV(filterHandler); 193c29fa5a6Sopenharmony_ci filterHandler->Dump(fd, args); 194c29fa5a6Sopenharmony_ci break; 195c29fa5a6Sopenharmony_ci } 196c29fa5a6Sopenharmony_ci case 'm': { 197c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_POINTER 198c29fa5a6Sopenharmony_ci MouseEventHdr->Dump(fd, args); 199c29fa5a6Sopenharmony_ci#else 200c29fa5a6Sopenharmony_ci mprintf(fd, "Pointer device does not support"); 201c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER 202c29fa5a6Sopenharmony_ci break; 203c29fa5a6Sopenharmony_ci } 204c29fa5a6Sopenharmony_ci case 'c': { 205c29fa5a6Sopenharmony_ci#if defined(OHOS_BUILD_ENABLE_POINTER) && defined(OHOS_BUILD_ENABLE_POINTER_DRAWING) 206c29fa5a6Sopenharmony_ci IPointerDrawingManager::GetInstance()->Dump(fd, args); 207c29fa5a6Sopenharmony_ci#else 208c29fa5a6Sopenharmony_ci mprintf(fd, "Pointer device does not support"); 209c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER && OHOS_BUILD_ENABLE_POINTER_DRAWING 210c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_TOUCH 211c29fa5a6Sopenharmony_ci TOUCH_DRAWING_MGR->Dump(fd, args); 212c29fa5a6Sopenharmony_ci#else 213c29fa5a6Sopenharmony_ci mprintf(fd, "Pointer device does not support"); 214c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_TOUCH 215c29fa5a6Sopenharmony_ci break; 216c29fa5a6Sopenharmony_ci } 217c29fa5a6Sopenharmony_ci case 'k': { 218c29fa5a6Sopenharmony_ci#if defined(OHOS_BUILD_ENABLE_KEYBOARD) && defined(OHOS_BUILD_ENABLE_COMBINATION_KEY) 219c29fa5a6Sopenharmony_ci auto keyHandler = InputHandler->GetKeyCommandHandler(); 220c29fa5a6Sopenharmony_ci CHKPV(keyHandler); 221c29fa5a6Sopenharmony_ci keyHandler->Dump(fd, args); 222c29fa5a6Sopenharmony_ci#else 223c29fa5a6Sopenharmony_ci mprintf(fd, "Combination key does not support"); 224c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_KEYBOARD && OHOS_BUILD_ENABLE_COMBINATION_KEY 225c29fa5a6Sopenharmony_ci break; 226c29fa5a6Sopenharmony_ci } 227c29fa5a6Sopenharmony_ci case 'e': { 228c29fa5a6Sopenharmony_ci EventStatistic::Dump(fd, args); 229c29fa5a6Sopenharmony_ci break; 230c29fa5a6Sopenharmony_ci } 231c29fa5a6Sopenharmony_ci default: { 232c29fa5a6Sopenharmony_ci mprintf(fd, "cmd param is error\n"); 233c29fa5a6Sopenharmony_ci DumpHelp(fd); 234c29fa5a6Sopenharmony_ci break; 235c29fa5a6Sopenharmony_ci } 236c29fa5a6Sopenharmony_ci } 237c29fa5a6Sopenharmony_ci } 238c29fa5a6Sopenharmony_ci RELEASE_RES: 239c29fa5a6Sopenharmony_ci for (size_t i = 0; i < args.size(); ++i) { 240c29fa5a6Sopenharmony_ci if (argv[i] != nullptr) { 241c29fa5a6Sopenharmony_ci delete[] argv[i]; 242c29fa5a6Sopenharmony_ci } 243c29fa5a6Sopenharmony_ci } 244c29fa5a6Sopenharmony_ci delete[] argv; 245c29fa5a6Sopenharmony_ci} 246c29fa5a6Sopenharmony_ci 247c29fa5a6Sopenharmony_civoid EventDump::DumpEventHelp(int32_t fd, const std::vector<std::string> &args) 248c29fa5a6Sopenharmony_ci{ 249c29fa5a6Sopenharmony_ci DumpHelp(fd); 250c29fa5a6Sopenharmony_ci} 251c29fa5a6Sopenharmony_ci 252c29fa5a6Sopenharmony_civoid EventDump::DumpHelp(int32_t fd) 253c29fa5a6Sopenharmony_ci{ 254c29fa5a6Sopenharmony_ci mprintf(fd, "Usage:\t"); 255c29fa5a6Sopenharmony_ci mprintf(fd, " -h, --help: dump help\t"); 256c29fa5a6Sopenharmony_ci mprintf(fd, " -d, --device: dump the device information\t"); 257c29fa5a6Sopenharmony_ci mprintf(fd, " -l, --devicelist: dump the device list information\t"); 258c29fa5a6Sopenharmony_ci mprintf(fd, " -w, --windows: dump the windows information\t"); 259c29fa5a6Sopenharmony_ci mprintf(fd, " -u, --udsserver: dump the uds_server information\t"); 260c29fa5a6Sopenharmony_ci mprintf(fd, " -o, --monitor: dump the monitor information\t"); 261c29fa5a6Sopenharmony_ci mprintf(fd, " -s, --subscriber: dump the subscriber information\t"); 262c29fa5a6Sopenharmony_ci mprintf(fd, " -i, --interceptor: dump the interceptor information\t"); 263c29fa5a6Sopenharmony_ci mprintf(fd, " -f, --filter: dump the filter information\t"); 264c29fa5a6Sopenharmony_ci mprintf(fd, " -m, --mouse: dump the mouse information\t"); 265c29fa5a6Sopenharmony_ci mprintf(fd, " -c, --cursor: dump the cursor draw information\t"); 266c29fa5a6Sopenharmony_ci mprintf(fd, " -k, --keycommand: dump the key command information\t"); 267c29fa5a6Sopenharmony_ci mprintf(fd, " -e, --event: dump the libinput event information\t"); 268c29fa5a6Sopenharmony_ci} 269c29fa5a6Sopenharmony_ci} // namespace MMI 270c29fa5a6Sopenharmony_ci} // namespace OHOS 271