• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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