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