• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2024 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 "anr_handler.h"
17 #include "bytrace_adapter.h"
18 #include "event_log_helper.h"
19 #include "input_active_subscribe_manager.h"
20 #include "input_event_data_transformation.h"
21 #include "input_manager_impl.h"
22 #ifdef OHOS_BUILD_ENABLE_MONITOR
23 #include "input_monitor_manager.h"
24 #endif // OHOS_BUILD_ENABLE_MONITOR
25 #include "long_press_event_subscribe_manager.h"
26 #include "mmi_client.h"
27 #include "multimodal_event_handler.h"
28 #include "multimodal_input_connect_manager.h"
29 #include "time_cost_chk.h"
30 #include "pre_monitor_manager.h"
31 
32 #undef MMI_LOG_TAG
33 #define MMI_LOG_TAG "ClientMsgHandler"
34 
35 namespace OHOS {
36 namespace MMI {
37 namespace {
38 constexpr int32_t PRINT_INTERVAL_COUNT { 50 };
39 } // namespace
40 
Init()41 void ClientMsgHandler::Init()
42 {
43     MsgCallback funs[] = {
44 #ifdef OHOS_BUILD_ENABLE_KEYBOARD
45         { MmiMessageId::ON_KEY_EVENT, [this] (const UDSClient& client, NetPacket& pkt) {
46             return this->OnKeyEvent(client, pkt); }},
47         { MmiMessageId::ON_SUBSCRIBE_KEY, [this] (const UDSClient &client, NetPacket &pkt) {
48             return this->OnSubscribeKeyEventCallback(client, pkt); }},
49         { MmiMessageId::ON_SUBSCRIBE_KEY_MONITOR, [this] (const UDSClient &client, NetPacket &pkt) {
50             return this->OnSubscribeKeyMonitor(client, pkt); }},
51         { MmiMessageId::ON_PRE_KEY_EVENT, [this] (const UDSClient &client, NetPacket &pkt) {
52             return this->OnPreKeyEvent(client, pkt); }},
53 #endif // OHOS_BUILD_ENABLE_KEYBOARD
54 #ifdef OHOS_BUILD_ENABLE_SWITCH
55         { MmiMessageId::ON_SUBSCRIBE_SWITCH, [this] (const UDSClient &client, NetPacket &pkt) {
56             return this->OnSubscribeSwitchEventCallback(client, pkt); }},
57 #endif // OHOS_BUILD_ENABLE_SWITCH
58         { MmiMessageId::ON_SUBSCRIBE_TABLET, [this] (const UDSClient &client, NetPacket &pkt) {
59             return this->OnSubscribeTabletProximityCallback(client, pkt); }},
60 #if defined(OHOS_BUILD_ENABLE_POINTER) || defined(OHOS_BUILD_ENABLE_TOUCH)
61         { MmiMessageId::ON_POINTER_EVENT, [this] (const UDSClient& client, NetPacket& pkt) {
62             return this->OnPointerEvent(client, pkt); }},
63         { MmiMessageId::ON_SUBSCRIBE_LONG_PRESS, [this] (const UDSClient& client, NetPacket& pkt) {
64             return this->OnSubscribeLongPressEventCallback(client, pkt); }},
65 #endif // OHOS_BUILD_ENABLE_POINTER || OHOS_BUILD_ENABLE_TOUCH
66         { MmiMessageId::ADD_INPUT_DEVICE_LISTENER, [this] (const UDSClient& client, NetPacket& pkt) {
67             return this->OnDevListener(client, pkt); }},
68         { MmiMessageId::NOTICE_ANR, [this] (const UDSClient& client, NetPacket& pkt) {
69             return this->OnAnr(client, pkt); }},
70 #if defined(OHOS_BUILD_ENABLE_KEYBOARD) && (defined(OHOS_BUILD_ENABLE_INTERCEPTOR) || \
71     defined(OHOS_BUILD_ENABLE_MONITOR))
72         { MmiMessageId::REPORT_KEY_EVENT, [this] (const UDSClient& client, NetPacket& pkt) {
73             return this->ReportKeyEvent(client, pkt); }},
74 #endif // OHOS_BUILD_ENABLE_KEYBOARD
75 #if (defined(OHOS_BUILD_ENABLE_POINTER) || defined(OHOS_BUILD_ENABLE_TOUCH)) && \
76     (defined(OHOS_BUILD_ENABLE_INTERCEPTOR) || defined(OHOS_BUILD_ENABLE_MONITOR))
77         { MmiMessageId::REPORT_POINTER_EVENT, [this] (const UDSClient& client, NetPacket& pkt) {
78             return this->ReportPointerEvent(client, pkt); }},
79 #endif // OHOS_BUILD_ENABLE_POINTER || OHOS_BUILD_ENABLE_TOUCH
80         { MmiMessageId::NOTIFY_BUNDLE_NAME, [this] (const UDSClient& client, NetPacket& pkt) {
81             return this->NotifyBundleName(client, pkt); }},
82         { MmiMessageId::WINDOW_STATE_ERROR_NOTIFY, [this] (const UDSClient& client, NetPacket& pkt) {
83             return this->NotifyWindowStateError(client, pkt); }},
84         { MmiMessageId::SET_INPUT_DEVICE_ENABLED, [this] (const UDSClient& client, NetPacket& pkt) {
85             return this->OnSetInputDeviceAck(client, pkt); }},
86         { MmiMessageId::DEVICE_CONSUMER_HANDLER_EVENT, [this] (const UDSClient& client, NetPacket& pkt) {
87             return this->ReportDeviceConsumer(client, pkt); }},
88         { MmiMessageId::ON_SUBSCRIBE_INPUT_ACTIVE, [this] (const UDSClient &client, NetPacket &pkt) {
89             return this->OnSubscribeInputActiveCallback(client, pkt); }},
90     };
91     for (auto &it : funs) {
92         if (!RegistrationEvent(it)) {
93             MMI_HILOGW("Failed to register event errCode:%{public}d", EVENT_REG_FAIL);
94         }
95     }
96 }
97 
InitProcessedCallback()98 void ClientMsgHandler::InitProcessedCallback()
99 {
100     CALL_DEBUG_ENTER;
101     int32_t tokenType = MULTIMODAL_INPUT_CONNECT_MGR->GetTokenType();
102     if (tokenType == TokenType::TOKEN_HAP || tokenType == TokenType::TOKEN_SYSTEM_HAP) {
103         MMI_HILOGD("Current session is hap");
104         dispatchCallback_ = [] (int32_t eventId, int64_t actionTime) {
105             return ClientMsgHandler::OnDispatchEventProcessed(eventId, actionTime);
106         };
107     } else if (tokenType == static_cast<int32_t>(TokenType::TOKEN_NATIVE)) {
108         MMI_HILOGD("Current session is native");
109     } else {
110         MMI_HILOGE("Current session is unknown tokenType:%{public}d", tokenType);
111     }
112 }
113 
OnMsgHandler(const UDSClient & client,NetPacket & pkt)114 void ClientMsgHandler::OnMsgHandler(const UDSClient& client, NetPacket& pkt)
115 {
116     auto id = pkt.GetMsgId();
117     TimeCostChk chk("ClientMsgHandler::OnMsgHandler", "overtime 300(us)", MAX_OVER_TIME, id);
118     auto callback = GetMsgCallback(id);
119     CHKPV(callback);
120     ResetLogTrace();
121     auto ret = (*callback)(client, pkt);
122     if (ret < 0) {
123         MMI_HILOGE("Msg handling failed. id:%{public}d, ret:%{public}d", id, ret);
124         return;
125     }
126 }
127 
128 #ifdef OHOS_BUILD_ENABLE_KEYBOARD
OnKeyEvent(const UDSClient & client,NetPacket & pkt)129 int32_t ClientMsgHandler::OnKeyEvent(const UDSClient& client, NetPacket& pkt)
130 {
131     auto key = KeyEvent::Create();
132     CHKPR(key, ERROR_NULL_POINTER);
133     int32_t ret = InputEventDataTransformation::NetPacketToKeyEvent(pkt, key);
134     if (ret != RET_OK) {
135         MMI_HILOG_DISPATCHE("Read netPacket failed");
136         return RET_ERR;
137     }
138     LogTracer lt(key->GetId(), key->GetEventType(), key->GetKeyAction());
139     int32_t fd = 0;
140     pkt >> fd;
141 #ifdef OHOS_BUILD_ENABLE_SECURITY_COMPONENT
142     if (InputEventDataTransformation::UnmarshallingEnhanceData(pkt, key) != ERR_OK) {
143         MMI_HILOG_DISPATCHE("Failed to deserialize enhance data key event");
144         return RET_ERR;
145     }
146 #endif // OHOS_BUILD_ENABLE_SECURITY_COMPONENT
147     if (pkt.ChkRWError()) {
148         MMI_HILOG_DISPATCHE("Packet read fd failed");
149         return PACKET_READ_FAIL;
150     }
151     MMI_HILOG_DISPATCHD("Key event dispatcher of client, Fd:%{public}d", fd);
152     MMI_HILOG_DISPATCHI("Received");
153     BytraceAdapter::StartBytrace(key, BytraceAdapter::TRACE_START, BytraceAdapter::KEY_DISPATCH_EVENT);
154     key->SetProcessedCallback(dispatchCallback_);
155     InputMgrImpl.OnKeyEvent(key);
156     key->MarkProcessed();
157     return RET_OK;
158 }
159 
OnPreKeyEvent(const UDSClient & client,NetPacket & pkt)160 int32_t ClientMsgHandler::OnPreKeyEvent(const UDSClient& client, NetPacket& pkt)
161 {
162     auto keyEvent = KeyEvent::Create();
163     CHKPR(keyEvent, ERROR_NULL_POINTER);
164     int32_t ret = InputEventDataTransformation::NetPacketToKeyEvent(pkt, keyEvent);
165     if (ret != RET_OK) {
166         MMI_HILOG_DISPATCHE("Read netPacket failed");
167         return RET_ERR;
168     }
169     int32_t fd = -1;
170     int32_t handlerId = -1;
171     pkt >> fd >> handlerId;
172     if (pkt.ChkRWError()) {
173         MMI_HILOG_ANRDETECTE("Packet read fd failed");
174         return PACKET_READ_FAIL;
175     }
176     MMI_HILOG_DISPATCHD("PRE key event dispathcer of clent, Fd:%{public}d", fd);
177     BytraceAdapter::StartBytrace(keyEvent, BytraceAdapter::TRACE_START, BytraceAdapter::KEY_DISPATCH_EVENT);
178     PRE_MONITOR_MGR.OnPreKeyEvent(keyEvent, handlerId);
179     return RET_OK;
180 }
181 #endif // OHOS_BUILD_ENABLE_KEYBOARD
182 
NotifyBundleName(const UDSClient & client,NetPacket & pkt)183 int32_t ClientMsgHandler::NotifyBundleName(const UDSClient& client, NetPacket& pkt)
184 {
185     CALL_DEBUG_ENTER;
186     int32_t pid = 0;
187     int32_t uid = 0;
188     int32_t syncStatus = 0;
189     std::string bundleName;
190     pkt >> pid >> uid >> bundleName >> syncStatus;
191     InputMgrImpl.NotifyBundleName(pid, uid, bundleName, syncStatus);
192     MMI_HILOGD("NotifyBundleName pid:%{public}d, uid:%{public}d, bundleName:%{public}s, syncStatus:%{public}d",
193         pid, uid, bundleName.c_str(), syncStatus);
194     return RET_OK;
195 }
196 
197 #if defined(OHOS_BUILD_ENABLE_POINTER) || defined(OHOS_BUILD_ENABLE_TOUCH)
OnPointerEvent(const UDSClient & client,NetPacket & pkt)198 int32_t ClientMsgHandler::OnPointerEvent(const UDSClient& client, NetPacket& pkt)
199 {
200     CALL_DEBUG_ENTER;
201     auto pointerEvent = PointerEvent::Create();
202     CHKPR(pointerEvent, ERROR_NULL_POINTER);
203     if (InputEventDataTransformation::Unmarshalling(pkt, pointerEvent) != ERR_OK) {
204         MMI_HILOG_DISPATCHE("Failed to deserialize pointer event");
205         return RET_ERR;
206     }
207 #ifdef OHOS_BUILD_ENABLE_SECURITY_COMPONENT
208     if (InputEventDataTransformation::UnmarshallingEnhanceData(pkt, pointerEvent) != ERR_OK) {
209         MMI_HILOG_DISPATCHE("Failed to deserialize enhance data pointer event");
210         return RET_ERR;
211     }
212 #endif // OHOS_BUILD_ENABLE_SECURITY_COMPONENT
213     LogTracer lt(pointerEvent->GetId(), pointerEvent->GetEventType(), pointerEvent->GetPointerAction());
214     if (pointerEvent->GetPointerAction() != PointerEvent::POINTER_ACTION_AXIS_UPDATE &&
215         pointerEvent->GetPointerAction() != PointerEvent::POINTER_ACTION_ROTATE_UPDATE) {
216         std::string logInfo = std::string("ac: ") + pointerEvent->DumpPointerAction();
217         aggregator_.Record({MMI_LOG_DISPATCH, INPUT_KEY_FLOW, __FUNCTION__, __LINE__}, logInfo.c_str(),
218             std::to_string(pointerEvent->GetId()));
219     }
220     if (PointerEvent::POINTER_ACTION_CANCEL == pointerEvent->GetPointerAction() ||
221         PointerEvent::POINTER_ACTION_HOVER_CANCEL == pointerEvent->GetPointerAction() ||
222         PointerEvent::POINTER_ACTION_FINGERPRINT_CANCEL == pointerEvent->GetPointerAction()) {
223         MMI_HILOG_DISPATCHI("Operation canceled");
224     }
225     pointerEvent->SetProcessedCallback(dispatchCallback_);
226     BytraceAdapter::StartBytrace(pointerEvent, BytraceAdapter::TRACE_START, BytraceAdapter::POINT_DISPATCH_EVENT);
227     processedCount_++;
228     if (processedCount_ == PRINT_INTERVAL_COUNT) {
229         MMI_HILOGD("Last eventId:%{public}d, current eventId:%{public}d", lastEventId_, pointerEvent->GetId());
230         processedCount_ = 0;
231         lastEventId_ = pointerEvent->GetId();
232     }
233     PointerEvent::PointerItem pointerItem {};
234     if (pointerEvent->GetPointerItem(pointerEvent->GetPointerId(), pointerItem)) {
235         MMI_HILOGD("Report pointer event, No:%{public}d,PA:%{public}s,DX:%{private}d,DY:%{private}d"
236             ",DXP:%{private}f,DYP:%{private}f,WXP:%{private}f,WYP:%{private}f,GX:%{private}f,GY:%{private}f",
237             pointerEvent->GetId(), pointerEvent->DumpPointerAction(),
238             pointerItem.GetDisplayX(), pointerItem.GetDisplayY(),
239             pointerItem.GetDisplayXPos(), pointerItem.GetDisplayYPos(),
240             pointerItem.GetWindowXPos(), pointerItem.GetWindowYPos(),
241             pointerItem.GetGlobalX(), pointerItem.GetGlobalY());
242     }
243     InputMgrImpl.OnPointerEvent(pointerEvent);
244     if (pointerEvent->GetSourceType() == PointerEvent::SOURCE_TYPE_JOYSTICK) {
245         pointerEvent->MarkProcessed();
246     }
247     return RET_OK;
248 }
249 
OnSubscribeLongPressEventCallback(const UDSClient & client,NetPacket & pkt)250 int32_t ClientMsgHandler::OnSubscribeLongPressEventCallback(const UDSClient& client, NetPacket& pkt)
251 {
252     LongPressEvent longPressEvent;
253     int32_t ret = InputEventDataTransformation::NetPacketToLongPressEvent(pkt, longPressEvent);
254     if (ret != RET_OK) {
255         MMI_HILOGE("Read net packet failed");
256         return RET_ERR;
257     }
258     int32_t fd = -1;
259     int32_t subscribeId = -1;
260     pkt >> fd >> subscribeId;
261     if (pkt.ChkRWError()) {
262         MMI_HILOGE("Packet read fd failed");
263         return PACKET_READ_FAIL;
264     }
265     return LONG_PRESS_EVENT_SUBSCRIBE_MGR.OnSubscribeLongPressEventCallback(longPressEvent, subscribeId);
266 }
267 
268 #endif // OHOS_BUILD_ENABLE_POINTER || OHOS_BUILD_ENABLE_TOUCH
269 
270 #ifdef OHOS_BUILD_ENABLE_KEYBOARD
OnSubscribeKeyEventCallback(const UDSClient & client,NetPacket & pkt)271 int32_t ClientMsgHandler::OnSubscribeKeyEventCallback(const UDSClient &client, NetPacket &pkt)
272 {
273     std::shared_ptr<KeyEvent> keyEvent = KeyEvent::Create();
274     CHKPR(keyEvent, ERROR_NULL_POINTER);
275     int32_t ret = InputEventDataTransformation::NetPacketToKeyEvent(pkt, keyEvent);
276     if (ret != RET_OK) {
277         MMI_HILOGE("Read net packet failed");
278         return RET_ERR;
279     }
280     LogTracer lt(keyEvent->GetId(), keyEvent->GetEventType(), keyEvent->GetKeyAction());
281     int32_t fd = -1;
282     int32_t subscribeId = -1;
283     pkt >> fd >> subscribeId;
284     if (pkt.ChkRWError()) {
285         MMI_HILOGE("Packet read fd failed");
286         return PACKET_READ_FAIL;
287     }
288     if (keyEvent->GetKeyCode() == KeyEvent::KEYCODE_POWER) {
289         if (!EventLogHelper::IsBetaVersion()) {
290             MMI_HILOGI("Subscribe:%{public}d,Fd:%{public}d,KeyEvent:%{public}d, "
291                 "Action:%{public}d, KeyAction:%{public}d, EventType:%{public}d,Flag:%{public}u",
292                 subscribeId, fd, keyEvent->GetId(), keyEvent->GetAction(), keyEvent->GetKeyAction(),
293                 keyEvent->GetEventType(), keyEvent->GetFlag());
294         } else {
295             MMI_HILOGI("Subscribe:%{public}d,Fd:%{public}d,KeyEvent:%{public}d, "
296                 "Action:%{public}d, KeyAction:%{public}d, EventType:%{public}d,Flag:%{public}u",
297                 subscribeId, fd, keyEvent->GetId(), keyEvent->GetAction(), keyEvent->GetKeyAction(),
298                 keyEvent->GetEventType(), keyEvent->GetFlag());
299         }
300     } else {
301         MMI_HILOGD("Subscribe:%{public}d,Fd:%{public}d,KeyEvent:%{public}d,"
302             "KeyCode:%{private}d,ActionTime:%{public}" PRId64 ",ActionStartTime:%{public}" PRId64 ","
303             "Action:%{public}d,KeyAction:%{public}d,EventType:%{public}d,Flag:%{public}u",
304         subscribeId, fd, keyEvent->GetId(), keyEvent->GetKeyCode(), keyEvent->GetActionTime(),
305         keyEvent->GetActionStartTime(), keyEvent->GetAction(), keyEvent->GetKeyAction(),
306         keyEvent->GetEventType(), keyEvent->GetFlag());
307     }
308 
309     BytraceAdapter::StartBytrace(keyEvent, BytraceAdapter::TRACE_START, BytraceAdapter::KEY_SUBSCRIBE_EVENT);
310     return KeyEventInputSubscribeMgr.OnSubscribeKeyEventCallback(keyEvent, subscribeId);
311 }
312 
OnSubscribeKeyMonitor(const UDSClient & client,NetPacket & pkt)313 int32_t ClientMsgHandler::OnSubscribeKeyMonitor(const UDSClient &client, NetPacket &pkt)
314 {
315     std::shared_ptr<KeyEvent> keyEvent = KeyEvent::Create();
316     CHKPR(keyEvent, ERROR_NULL_POINTER);
317     int32_t ret = InputEventDataTransformation::NetPacketToKeyEvent(pkt, keyEvent);
318     if (ret != RET_OK) {
319         MMI_HILOGE("Read net packet failed");
320         return RET_ERR;
321     }
322     MMI_HILOGD("Key monitor(No:%{public}d, KC:%{private}d, KA:%{public}d)",
323         keyEvent->GetId(), keyEvent->GetKeyCode(), keyEvent->GetKeyAction());
324     LogTracer lt(keyEvent->GetId(), keyEvent->GetEventType(), keyEvent->GetKeyAction());
325 #ifdef OHOS_BUILD_ENABLE_KEY_PRESSED_HANDLER
326     return KeyEventInputSubscribeMgr.OnSubscribeKeyMonitor(keyEvent);
327 #else
328     return RET_OK;
329 #endif // OHOS_BUILD_ENABLE_KEY_PRESSED_HANDLER
330 }
331 #endif // OHOS_BUILD_ENABLE_KEYBOARD
332 
333 #ifdef OHOS_BUILD_ENABLE_SWITCH
OnSubscribeSwitchEventCallback(const UDSClient & client,NetPacket & pkt)334 int32_t ClientMsgHandler::OnSubscribeSwitchEventCallback(const UDSClient &client, NetPacket &pkt)
335 {
336     std::shared_ptr<SwitchEvent> switchEvent = std::make_shared<SwitchEvent>(0);
337     int32_t ret = InputEventDataTransformation::NetPacketToSwitchEvent(pkt, switchEvent);
338     if (ret != RET_OK) {
339         MMI_HILOGE("Read net packet failed");
340         return RET_ERR;
341     }
342     LogTracer lt(switchEvent->GetId(), switchEvent->GetEventType(), switchEvent->GetAction());
343     int32_t fd = -1;
344     int32_t subscribeId = -1;
345     pkt >> fd >> subscribeId;
346     if (pkt.ChkRWError()) {
347         MMI_HILOGE("Packet read fd failed");
348         return PACKET_READ_FAIL;
349     }
350     return SWITCH_EVENT_INPUT_SUBSCRIBE_MGR.OnSubscribeSwitchEventCallback(switchEvent, subscribeId);
351 }
352 #endif
353 
OnSubscribeTabletProximityCallback(const UDSClient & client,NetPacket & pkt)354 int32_t ClientMsgHandler::OnSubscribeTabletProximityCallback(const UDSClient &client, NetPacket &pkt)
355 {
356     auto pointerEvent = PointerEvent::Create();
357     int32_t ret = InputEventDataTransformation::Unmarshalling(pkt, pointerEvent);
358     if (ret != RET_OK) {
359         MMI_HILOGE("Read net packet failed");
360         return RET_ERR;
361     }
362     LogTracer lt(pointerEvent->GetId(), pointerEvent->GetEventType(), pointerEvent->GetAction());
363     int32_t fd = -1;
364     int32_t subscribeId = -1;
365     pkt >> fd >> subscribeId;
366     if (pkt.ChkRWError()) {
367         MMI_HILOGE("Packet read fd failed");
368         return PACKET_READ_FAIL;
369     }
370     return TABLET_EVENT_INPUT_SUBSCRIBE_MGR.OnSubscribeTabletProximityCallback(pointerEvent, subscribeId);
371 }
372 
OnDevListener(const UDSClient & client,NetPacket & pkt)373 int32_t ClientMsgHandler::OnDevListener(const UDSClient& client, NetPacket& pkt)
374 {
375     CALL_DEBUG_ENTER;
376     std::string type;
377     int32_t deviceId = 0;
378     pkt >> type >> deviceId;
379     if (pkt.ChkRWError()) {
380         MMI_HILOGE("Packet read type failed");
381         return RET_ERR;
382     }
383     INPUT_DEVICE_IMPL.OnDevListener(deviceId, type);
384     return RET_OK;
385 }
386 
387 #if defined(OHOS_BUILD_ENABLE_KEYBOARD) && (defined(OHOS_BUILD_ENABLE_INTERCEPTOR) || \
388     defined(OHOS_BUILD_ENABLE_MONITOR))
ReportKeyEvent(const UDSClient & client,NetPacket & pkt)389 int32_t ClientMsgHandler::ReportKeyEvent(const UDSClient& client, NetPacket& pkt)
390 {
391     CALL_DEBUG_ENTER;
392     InputHandlerType handlerType;
393     uint32_t deviceTags = 0;
394     pkt >> handlerType >> deviceTags;
395     if (pkt.ChkRWError()) {
396         MMI_HILOG_DISPATCHE("Packet read handler failed");
397         return RET_ERR;
398     }
399     auto keyEvent = KeyEvent::Create();
400     CHKPR(keyEvent, ERROR_NULL_POINTER);
401     if (InputEventDataTransformation::NetPacketToKeyEvent(pkt, keyEvent) != ERR_OK) {
402         MMI_HILOG_DISPATCHE("Failed to deserialize key event");
403         return RET_ERR;
404     }
405     LogTracer lt(keyEvent->GetId(), keyEvent->GetEventType(), keyEvent->GetKeyAction());
406     BytraceAdapter::StartBytrace(keyEvent, BytraceAdapter::TRACE_START, BytraceAdapter::KEY_INTERCEPT_EVENT);
407     switch (handlerType) {
408         case INTERCEPTOR: {
409 #ifdef OHOS_BUILD_ENABLE_INTERCEPTOR
410             InputInterMgr->OnInputEvent(keyEvent, deviceTags);
411 #endif // OHOS_BUILD_ENABLE_INTERCEPTOR
412             break;
413         }
414         case MONITOR: {
415 #ifdef OHOS_BUILD_ENABLE_MONITOR
416             IMonitorMgr.OnInputEvent(keyEvent, deviceTags);
417 #endif // OHOS_BUILD_ENABLE_MONITOR
418             break;
419         }
420         default: {
421             MMI_HILOG_DISPATCHW("Failed to intercept or monitor on the event");
422             break;
423         }
424     }
425     return RET_OK;
426 }
427 #endif // OHOS_BUILD_ENABLE_KEYBOARD && OHOS_BUILD_ENABLE_INTERCEPTOR || OHOS_BUILD_ENABLE_MONITOR
428 
429 #if (defined(OHOS_BUILD_ENABLE_POINTER) || defined(OHOS_BUILD_ENABLE_TOUCH)) && \
430     (defined(OHOS_BUILD_ENABLE_INTERCEPTOR) || defined(OHOS_BUILD_ENABLE_MONITOR))
ReportPointerEvent(const UDSClient & client,NetPacket & pkt)431 int32_t ClientMsgHandler::ReportPointerEvent(const UDSClient& client, NetPacket& pkt)
432 {
433     InputHandlerType handlerType;
434     uint32_t deviceTags = 0;
435     pkt >> handlerType >> deviceTags;
436     if (pkt.ChkRWError()) {
437         MMI_HILOG_DISPATCHE("Packet read Pointer data failed");
438         return RET_ERR;
439     }
440     MMI_HILOG_DISPATCHD("Client handlerType:%{public}d", handlerType);
441     auto pointerEvent = PointerEvent::Create();
442     CHKPR(pointerEvent, ERROR_NULL_POINTER);
443     if (InputEventDataTransformation::Unmarshalling(pkt, pointerEvent) != ERR_OK) {
444         MMI_HILOG_DISPATCHW("Failed to deserialize pointer event");
445         return RET_ERR;
446     }
447     LogTracer lt(pointerEvent->GetId(), pointerEvent->GetEventType(), pointerEvent->GetPointerAction());
448     BytraceAdapter::StartBytrace(pointerEvent, BytraceAdapter::TRACE_START, BytraceAdapter::POINT_INTERCEPT_EVENT);
449     switch (handlerType) {
450         case INTERCEPTOR: {
451 #ifdef OHOS_BUILD_ENABLE_INTERCEPTOR
452             InputInterMgr->OnInputEvent(pointerEvent, deviceTags);
453 #endif // OHOS_BUILD_ENABLE_INTERCEPTOR
454             break;
455         }
456         case MONITOR: {
457 #ifdef OHOS_BUILD_ENABLE_MONITOR
458             IMonitorMgr.OnInputEvent(pointerEvent, deviceTags);
459 #endif // OHOS_BUILD_ENABLE_MONITOR
460             break;
461         }
462         default: {
463             MMI_HILOG_DISPATCHW("Failed to intercept or monitor on the event");
464             break;
465         }
466     }
467     return RET_OK;
468 }
469 #endif // OHOS_BUILD_ENABLE_POINTER || OHOS_BUILD_ENABLE_TOUCH
470 
OnDispatchEventProcessed(int32_t eventId,int64_t actionTime)471 void ClientMsgHandler::OnDispatchEventProcessed(int32_t eventId, int64_t actionTime)
472 {
473     CALL_DEBUG_ENTER;
474     ANRHDL->SetLastProcessedEventId(ANR_DISPATCH, eventId, actionTime);
475 }
476 
OnAnr(const UDSClient & client,NetPacket & pkt)477 int32_t ClientMsgHandler::OnAnr(const UDSClient& client, NetPacket& pkt)
478 {
479     CALL_DEBUG_ENTER;
480     int32_t pid = 0;
481     int32_t eventId = 0;
482     pkt >> pid;
483     pkt >> eventId;
484     if (pkt.ChkRWError()) {
485         MMI_HILOG_ANRDETECTE("Packet read data failed");
486         return RET_ERR;
487     }
488     MMI_HILOG_ANRDETECTI("Client pid:%{public}d eventId:%{public}d", pid, eventId);
489     InputMgrImpl.OnAnr(pid, eventId);
490     return RET_OK;
491 }
492 
NotifyWindowStateError(const UDSClient & client,NetPacket & pkt)493 int32_t ClientMsgHandler::NotifyWindowStateError(const UDSClient& client, NetPacket& pkt)
494 {
495     CALL_DEBUG_ENTER;
496     int32_t pid = 0;
497     int32_t windowId = 0;
498     pkt >> pid;
499     pkt >> windowId;
500     if (pkt.ChkRWError()) {
501         MMI_HILOG_ANRDETECTE("Packet read data failed");
502         return RET_ERR;
503     }
504     MMI_HILOG_ANRDETECTI("Client pid:%{public}d windowId:%{public}d", pid, windowId);
505     InputMgrImpl.OnWindowStateError(pid, windowId);
506     return RET_OK;
507 }
508 
OnSetInputDeviceAck(const UDSClient & client,NetPacket & pkt)509 int32_t ClientMsgHandler::OnSetInputDeviceAck(const UDSClient& client, NetPacket& pkt)
510 {
511     CALL_DEBUG_ENTER;
512     int32_t index = 0;
513     int32_t result = 0;
514     pkt >> index >> result;
515     if (pkt.ChkRWError()) {
516         MMI_HILOGE("Packet read type failed");
517         return RET_ERR;
518     }
519     INPUT_DEVICE_IMPL.OnSetInputDeviceAck(index, result);
520     return RET_OK;
521 }
522 
ReportDeviceConsumer(const UDSClient & client,NetPacket & pkt)523 int32_t ClientMsgHandler::ReportDeviceConsumer(const UDSClient& client, NetPacket& pkt)
524 {
525     if (pkt.ChkRWError()) {
526         MMI_HILOGE("Packet read Pointer data failed");
527         return RET_ERR;
528     }
529     auto pointerEvent = PointerEvent::Create();
530     CHKPR(pointerEvent, ERROR_NULL_POINTER);
531     if (InputEventDataTransformation::Unmarshalling(pkt, pointerEvent) != ERR_OK) {
532         MMI_HILOGE("Failed to deserialize pointer event");
533         return RET_ERR;
534     }
535     for (const auto &item : pointerEvent->GetPointerIds()) {
536         PointerEvent::PointerItem pointerItem;
537         if (!pointerEvent->GetPointerItem(item, pointerItem)) {
538             MMI_HILOGE("Get pointer item failed");
539             return RET_ERR;
540         }
541         MMI_HILOGD("orientation:%{public}d, blodid:%{public}d, toolType:%{public}d",
542             pointerItem.GetOrientation(), pointerItem.GetBlobId(), pointerItem.GetToolType());
543     }
544     InputMgrImpl.OnDeviceConsumerEvent(pointerEvent);
545     return RET_OK;
546 }
547 
OnSubscribeInputActiveCallback(const UDSClient & client,NetPacket & pkt)548 int32_t ClientMsgHandler::OnSubscribeInputActiveCallback(const UDSClient& client, NetPacket& pkt)
549 {
550     CALL_DEBUG_ENTER;
551     HandleEventType handleEventType = HANDLE_EVENT_TYPE_NONE;
552     auto keyEvent = KeyEvent::Create();
553     auto pointerEvent = PointerEvent::Create();
554     CHKPR(keyEvent, RET_ERR);
555     CHKPR(pointerEvent, RET_ERR);
556     pkt >> handleEventType;
557     int32_t ret = RET_ERR;
558     if (handleEventType == HANDLE_EVENT_TYPE_KEY) {
559         ret = InputEventDataTransformation::NetPacketToKeyEvent(pkt, keyEvent);
560     } else if (handleEventType == HANDLE_EVENT_TYPE_POINTER) {
561         ret = InputEventDataTransformation::Unmarshalling(pkt, pointerEvent);
562     } else {
563         MMI_HILOGE("handleEventType(%{public}d) error", handleEventType);
564         return RET_ERR;
565     }
566     if (ret != RET_OK) {
567         MMI_HILOGE("Read net packet failed, ret = %{public}d", ret);
568         return RET_ERR;
569     }
570     int32_t subscribeId = -1;
571     pkt >> subscribeId;
572     if (pkt.ChkRWError()) {
573         MMI_HILOGE("Packet read subscribeId failed");
574         return RET_ERR;
575     }
576     return handleEventType == HANDLE_EVENT_TYPE_KEY ?
577         INPUT_ACTIVE_SUBSCRIBE_MGR.OnSubscribeInputActiveCallback(keyEvent, subscribeId) :
578         INPUT_ACTIVE_SUBSCRIBE_MGR.OnSubscribeInputActiveCallback(pointerEvent, subscribeId);
579 }
580 } // namespace MMI
581 } // namespace OHOS
582