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