1 /*
2 * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "client_msg_handler.h"
17
18 #include <cinttypes>
19 #include <iostream>
20 #include <sstream>
21
22 #include "bytrace_adapter.h"
23 #include "event_log_helper.h"
24 #include "input_device.h"
25 #include "input_device_impl.h"
26 #include "input_event_data_transformation.h"
27 #include "input_handler_manager.h"
28 #include "input_manager_impl.h"
29 #include "anr_handler.h"
30 #ifdef OHOS_BUILD_ENABLE_MONITOR
31 #include "input_monitor_manager.h"
32 #endif // OHOS_BUILD_ENABLE_MONITOR
33 #include "mmi_client.h"
34 #include "mmi_func_callback.h"
35 #include "multimodal_event_handler.h"
36 #include "multimodal_input_connect_manager.h"
37 #include "napi_constants.h"
38 #include "proto.h"
39 #include "time_cost_chk.h"
40 #include "util.h"
41
42 namespace OHOS {
43 namespace MMI {
44 namespace {
45 constexpr OHOS::HiviewDFX::HiLogLabel LABEL = { LOG_CORE, MMI_LOG_DOMAIN, "ClientMsgHandler" };
46 } // namespace
47
Init()48 void ClientMsgHandler::Init()
49 {
50 MsgCallback funs[] = {
51 #ifdef OHOS_BUILD_ENABLE_KEYBOARD
52 { MmiMessageId::ON_KEY_EVENT, MsgCallbackBind2(&ClientMsgHandler::OnKeyEvent, this) },
53 { MmiMessageId::ON_SUBSCRIBE_KEY, std::bind(&ClientMsgHandler::OnSubscribeKeyEventCallback,
54 this, std::placeholders::_1, std::placeholders::_2) },
55 #endif // OHOS_BUILD_ENABLE_KEYBOARD
56 #ifdef OHOS_BUILD_ENABLE_SWITCH
57 { MmiMessageId::ON_SUBSCRIBE_SWITCH, std::bind(&ClientMsgHandler::OnSubscribeSwitchEventCallback,
58 this, std::placeholders::_1, std::placeholders::_2) },
59 #endif // OHOS_BUILD_ENABLE_SWITCH
60 #if defined(OHOS_BUILD_ENABLE_POINTER) || defined(OHOS_BUILD_ENABLE_TOUCH)
61 { MmiMessageId::ON_POINTER_EVENT, MsgCallbackBind2(&ClientMsgHandler::OnPointerEvent, this) },
62 #endif // OHOS_BUILD_ENABLE_POINTER || OHOS_BUILD_ENABLE_TOUCH
63 { MmiMessageId::ADD_INPUT_DEVICE_LISTENER, MsgCallbackBind2(&ClientMsgHandler::OnDevListener, this) },
64 { MmiMessageId::NOTICE_ANR, MsgCallbackBind2(&ClientMsgHandler::OnAnr, this) },
65 #if defined(OHOS_BUILD_ENABLE_KEYBOARD) && (defined(OHOS_BUILD_ENABLE_INTERCEPTOR) || \
66 defined(OHOS_BUILD_ENABLE_MONITOR))
67 { MmiMessageId::REPORT_KEY_EVENT, MsgCallbackBind2(&ClientMsgHandler::ReportKeyEvent, this) },
68 #endif // OHOS_BUILD_ENABLE_KEYBOARD
69 #if (defined(OHOS_BUILD_ENABLE_POINTER) || defined(OHOS_BUILD_ENABLE_TOUCH)) && \
70 (defined(OHOS_BUILD_ENABLE_INTERCEPTOR) || defined(OHOS_BUILD_ENABLE_MONITOR))
71 { MmiMessageId::REPORT_POINTER_EVENT, MsgCallbackBind2(&ClientMsgHandler::ReportPointerEvent, this) },
72 #endif // OHOS_BUILD_ENABLE_POINTER || OHOS_BUILD_ENABLE_TOUCH
73 };
74 for (auto &it : funs) {
75 if (!RegistrationEvent(it)) {
76 MMI_HILOGW("Failed to register event errCode:%{public}d", EVENT_REG_FAIL);
77 continue;
78 }
79 }
80 }
81
InitProcessedCallback()82 void ClientMsgHandler::InitProcessedCallback()
83 {
84 CALL_DEBUG_ENTER;
85 int32_t tokenType = MultimodalInputConnMgr->GetTokenType();
86 if (tokenType == TokenType::TOKEN_HAP) {
87 MMI_HILOGD("Current session is hap");
88 dispatchCallback_ = std::bind(&ClientMsgHandler::OnDispatchEventProcessed, std::placeholders::_1,
89 std::placeholders::_2);
90 } else if (tokenType == static_cast<int32_t>(TokenType::TOKEN_NATIVE)) {
91 MMI_HILOGD("Current session is native");
92 } else {
93 MMI_HILOGE("Current session is unknown tokenType:%{public}d", tokenType);
94 }
95 }
96
OnMsgHandler(const UDSClient & client,NetPacket & pkt)97 void ClientMsgHandler::OnMsgHandler(const UDSClient& client, NetPacket& pkt)
98 {
99 auto id = pkt.GetMsgId();
100 TimeCostChk chk("ClientMsgHandler::OnMsgHandler", "overtime 300(us)", MAX_OVER_TIME, id);
101 auto callback = GetMsgCallback(id);
102 if (callback == nullptr) {
103 MMI_HILOGE("Unknown msg id:%{public}d", id);
104 return;
105 }
106 auto ret = (*callback)(client, pkt);
107 if (ret < 0) {
108 MMI_HILOGE("Msg handling failed. id:%{public}d,ret:%{public}d", id, ret);
109 return;
110 }
111 }
112
113 #ifdef OHOS_BUILD_ENABLE_KEYBOARD
OnKeyEvent(const UDSClient & client,NetPacket & pkt)114 int32_t ClientMsgHandler::OnKeyEvent(const UDSClient& client, NetPacket& pkt)
115 {
116 auto key = KeyEvent::Create();
117 CHKPR(key, ERROR_NULL_POINTER);
118 int32_t ret = InputEventDataTransformation::NetPacketToKeyEvent(pkt, key);
119 if (ret != RET_OK) {
120 MMI_HILOGE("Read netPacket failed");
121 return RET_ERR;
122 }
123 int32_t fd = 0;
124 pkt >> fd;
125 if (pkt.ChkRWError()) {
126 MMI_HILOGE("Packet read fd failed");
127 return PACKET_READ_FAIL;
128 }
129 MMI_HILOGD("Key event dispatcher of client, Fd:%{public}d", fd);
130 EventLogHelper::PrintEventData(key);
131 BytraceAdapter::StartBytrace(key, BytraceAdapter::TRACE_START, BytraceAdapter::KEY_DISPATCH_EVENT);
132 key->SetProcessedCallback(dispatchCallback_);
133 InputMgrImpl.OnKeyEvent(key);
134 key->MarkProcessed();
135 return RET_OK;
136 }
137 #endif // OHOS_BUILD_ENABLE_KEYBOARD
138
139 #if defined(OHOS_BUILD_ENABLE_POINTER) || defined(OHOS_BUILD_ENABLE_TOUCH)
OnPointerEvent(const UDSClient & client,NetPacket & pkt)140 int32_t ClientMsgHandler::OnPointerEvent(const UDSClient& client, NetPacket& pkt)
141 {
142 CALL_DEBUG_ENTER;
143 auto pointerEvent = PointerEvent::Create();
144 CHKPR(pointerEvent, ERROR_NULL_POINTER);
145 if (InputEventDataTransformation::Unmarshalling(pkt, pointerEvent) != ERR_OK) {
146 MMI_HILOGE("Failed to deserialize pointer event.");
147 return RET_ERR;
148 }
149 #ifdef OHOS_BUILD_ENABLE_SECURITY_COMPONENT
150 if (InputEventDataTransformation::UnmarshallingEnhanceData(pkt, pointerEvent) != ERR_OK) {
151 MMI_HILOGE("Failed to deserialize enhance data pointer event.");
152 return RET_ERR;
153 }
154 #endif // OHOS_BUILD_ENABLE_SECURITY_COMPONENT
155 MMI_HILOGI("Pointer event dispatcher of client:");
156 EventLogHelper::PrintEventData(pointerEvent);
157 if (PointerEvent::POINTER_ACTION_CANCEL == pointerEvent->GetPointerAction()) {
158 MMI_HILOGI("Operation canceled.");
159 }
160 pointerEvent->SetProcessedCallback(dispatchCallback_);
161 BytraceAdapter::StartBytrace(pointerEvent, BytraceAdapter::TRACE_START, BytraceAdapter::POINT_DISPATCH_EVENT);
162 InputMgrImpl.OnPointerEvent(pointerEvent);
163 if (pointerEvent->GetSourceType() == PointerEvent::SOURCE_TYPE_JOYSTICK) {
164 pointerEvent->MarkProcessed();
165 }
166 return RET_OK;
167 }
168 #endif // OHOS_BUILD_ENABLE_POINTER || OHOS_BUILD_ENABLE_TOUCH
169
170 #ifdef OHOS_BUILD_ENABLE_KEYBOARD
OnSubscribeKeyEventCallback(const UDSClient & client,NetPacket & pkt)171 int32_t ClientMsgHandler::OnSubscribeKeyEventCallback(const UDSClient &client, NetPacket &pkt)
172 {
173 std::shared_ptr<KeyEvent> keyEvent = KeyEvent::Create();
174 CHKPR(keyEvent, ERROR_NULL_POINTER);
175 int32_t ret = InputEventDataTransformation::NetPacketToKeyEvent(pkt, keyEvent);
176 if (ret != RET_OK) {
177 MMI_HILOGE("Read net packet failed");
178 return RET_ERR;
179 }
180 int32_t fd = -1;
181 int32_t subscribeId = -1;
182 pkt >> fd >> subscribeId;
183 if (pkt.ChkRWError()) {
184 MMI_HILOGE("Packet read fd failed");
185 return PACKET_READ_FAIL;
186 }
187 if (keyEvent->GetKeyCode() == KeyEvent::KEYCODE_POWER) {
188 MMI_HILOGI("Subscribe:%{public}d,Fd:%{public}d,KeyEvent:%{public}d,"
189 "KeyCode:%{public}d,ActionTime:%{public}" PRId64 ",ActionStartTime:%{public}" PRId64 ","
190 "Action:%{public}d,KeyAction:%{public}d,EventType:%{public}d,Flag:%{public}u",
191 subscribeId, fd, keyEvent->GetId(), keyEvent->GetKeyCode(), keyEvent->GetActionTime(),
192 keyEvent->GetActionStartTime(), keyEvent->GetAction(), keyEvent->GetKeyAction(),
193 keyEvent->GetEventType(), keyEvent->GetFlag());
194 } else {
195 MMI_HILOGD("Subscribe:%{public}d,Fd:%{public}d,KeyEvent:%{public}d,"
196 "KeyCode:%{public}d,ActionTime:%{public}" PRId64 ",ActionStartTime:%{public}" PRId64 ","
197 "Action:%{public}d,KeyAction:%{public}d,EventType:%{public}d,Flag:%{public}u",
198 subscribeId, fd, keyEvent->GetId(), keyEvent->GetKeyCode(), keyEvent->GetActionTime(),
199 keyEvent->GetActionStartTime(), keyEvent->GetAction(), keyEvent->GetKeyAction(),
200 keyEvent->GetEventType(), keyEvent->GetFlag());
201 }
202
203 BytraceAdapter::StartBytrace(keyEvent, BytraceAdapter::TRACE_START, BytraceAdapter::KEY_SUBSCRIBE_EVENT);
204 return KeyEventInputSubscribeMgr.OnSubscribeKeyEventCallback(keyEvent, subscribeId);
205 }
206 #endif // OHOS_BUILD_ENABLE_KEYBOARD
207
208 #ifdef OHOS_BUILD_ENABLE_SWITCH
OnSubscribeSwitchEventCallback(const UDSClient & client,NetPacket & pkt)209 int32_t ClientMsgHandler::OnSubscribeSwitchEventCallback(const UDSClient &client, NetPacket &pkt)
210 {
211 std::shared_ptr<SwitchEvent> switchEvent = std::make_shared<SwitchEvent>(0);
212 int32_t ret = InputEventDataTransformation::NetPacketToSwitchEvent(pkt, switchEvent);
213 if (ret != RET_OK) {
214 MMI_HILOGE("Read net packet failed");
215 return RET_ERR;
216 }
217 int32_t fd = -1;
218 int32_t subscribeId = -1;
219 pkt >> fd >> subscribeId;
220 if (pkt.ChkRWError()) {
221 MMI_HILOGE("Packet read fd failed");
222 return PACKET_READ_FAIL;
223 }
224 return SWITCH_EVENT_INPUT_SUBSCRIBE_MGR.OnSubscribeSwitchEventCallback(switchEvent, subscribeId);
225 }
226 #endif
227
OnDevListener(const UDSClient & client,NetPacket & pkt)228 int32_t ClientMsgHandler::OnDevListener(const UDSClient& client, NetPacket& pkt)
229 {
230 CALL_DEBUG_ENTER;
231 std::string type;
232 int32_t deviceId;
233 pkt >> type >> deviceId;
234 if (pkt.ChkRWError()) {
235 MMI_HILOGE("Packet read type failed");
236 return RET_ERR;
237 }
238 InputDevImpl.OnDevListener(deviceId, type);
239 return RET_OK;
240 }
241
242 #if defined(OHOS_BUILD_ENABLE_KEYBOARD) && (defined(OHOS_BUILD_ENABLE_INTERCEPTOR) || \
243 defined(OHOS_BUILD_ENABLE_MONITOR))
ReportKeyEvent(const UDSClient & client,NetPacket & pkt)244 int32_t ClientMsgHandler::ReportKeyEvent(const UDSClient& client, NetPacket& pkt)
245 {
246 CALL_DEBUG_ENTER;
247 InputHandlerType handlerType;
248 uint32_t deviceTags;
249 pkt >> handlerType >> deviceTags;
250 if (pkt.ChkRWError()) {
251 MMI_HILOGE("Packet read handler failed");
252 return RET_ERR;
253 }
254 auto keyEvent = KeyEvent::Create();
255 CHKPR(keyEvent, ERROR_NULL_POINTER);
256 if (InputEventDataTransformation::NetPacketToKeyEvent(pkt, keyEvent) != ERR_OK) {
257 MMI_HILOGE("Failed to deserialize key event.");
258 return RET_ERR;
259 }
260 BytraceAdapter::StartBytrace(keyEvent, BytraceAdapter::TRACE_START, BytraceAdapter::KEY_INTERCEPT_EVENT);
261 switch (handlerType) {
262 case INTERCEPTOR: {
263 #ifdef OHOS_BUILD_ENABLE_INTERCEPTOR
264 InputInterMgr->OnInputEvent(keyEvent, deviceTags);
265 #endif // OHOS_BUILD_ENABLE_INTERCEPTOR
266 break;
267 }
268 case MONITOR: {
269 #ifdef OHOS_BUILD_ENABLE_MONITOR
270 IMonitorMgr->OnInputEvent(keyEvent, deviceTags);
271 #endif // OHOS_BUILD_ENABLE_MONITOR
272 break;
273 }
274 default: {
275 MMI_HILOGW("Failed to intercept or monitor on the event");
276 break;
277 }
278 }
279 return RET_OK;
280 }
281 #endif // OHOS_BUILD_ENABLE_KEYBOARD && OHOS_BUILD_ENABLE_INTERCEPTOR || OHOS_BUILD_ENABLE_MONITOR
282
283 #if (defined(OHOS_BUILD_ENABLE_POINTER) || defined(OHOS_BUILD_ENABLE_TOUCH)) && \
284 (defined(OHOS_BUILD_ENABLE_INTERCEPTOR) || defined(OHOS_BUILD_ENABLE_MONITOR))
ReportPointerEvent(const UDSClient & client,NetPacket & pkt)285 int32_t ClientMsgHandler::ReportPointerEvent(const UDSClient& client, NetPacket& pkt)
286 {
287 CALL_DEBUG_ENTER;
288 InputHandlerType handlerType;
289 uint32_t deviceTags;
290 pkt >> handlerType >> deviceTags;
291 if (pkt.ChkRWError()) {
292 MMI_HILOGE("Packet read Pointer data failed");
293 return RET_ERR;
294 }
295 MMI_HILOGD("Client handlerType:%{public}d", handlerType);
296 auto pointerEvent = PointerEvent::Create();
297 CHKPR(pointerEvent, ERROR_NULL_POINTER);
298 if (InputEventDataTransformation::Unmarshalling(pkt, pointerEvent) != ERR_OK) {
299 MMI_HILOGE("Failed to deserialize pointer event");
300 return RET_ERR;
301 }
302 #ifdef OHOS_BUILD_ENABLE_SECURITY_COMPONENT
303 if (InputEventDataTransformation::UnmarshallingEnhanceData(pkt, pointerEvent) != ERR_OK) {
304 MMI_HILOGE("Failed to deserialize enhance data pointer event.");
305 return RET_ERR;
306 }
307 #endif // OHOS_BUILD_ENABLE_SECURITY_COMPONENT
308 BytraceAdapter::StartBytrace(pointerEvent, BytraceAdapter::TRACE_START, BytraceAdapter::POINT_INTERCEPT_EVENT);
309 switch (handlerType) {
310 case INTERCEPTOR: {
311 #ifdef OHOS_BUILD_ENABLE_INTERCEPTOR
312 InputInterMgr->OnInputEvent(pointerEvent, deviceTags);
313 #endif // OHOS_BUILD_ENABLE_INTERCEPTOR
314 break;
315 }
316 case MONITOR: {
317 #ifdef OHOS_BUILD_ENABLE_MONITOR
318 IMonitorMgr->OnInputEvent(pointerEvent, deviceTags);
319 #endif // OHOS_BUILD_ENABLE_MONITOR
320 break;
321 }
322 default: {
323 MMI_HILOGW("Failed to intercept or monitor on the event");
324 break;
325 }
326 }
327 return RET_OK;
328 }
329 #endif // OHOS_BUILD_ENABLE_POINTER || OHOS_BUILD_ENABLE_TOUCH
330
OnDispatchEventProcessed(int32_t eventId,int64_t actionTime)331 void ClientMsgHandler::OnDispatchEventProcessed(int32_t eventId, int64_t actionTime)
332 {
333 CALL_DEBUG_ENTER;
334 ANRHDL->SetLastProcessedEventId(ANR_DISPATCH, eventId, actionTime);
335 }
336
OnAnr(const UDSClient & client,NetPacket & pkt)337 int32_t ClientMsgHandler::OnAnr(const UDSClient& client, NetPacket& pkt)
338 {
339 CALL_DEBUG_ENTER;
340 int32_t pid;
341 pkt >> pid;
342 if (pkt.ChkRWError()) {
343 MMI_HILOGE("Packet read data failed");
344 return RET_ERR;
345 }
346 MMI_HILOGI("Client pid:%{public}d", pid);
347 InputMgrImpl.OnAnr(pid);
348 return RET_OK;
349 }
350 } // namespace MMI
351 } // namespace OHOS
352