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 #include "client_msg_handler.h"
16 #include <cinttypes>
17 #include <iostream>
18 #include "mmi_func_callback.h"
19 #include "bytrace.h"
20 #include "input_device_impl.h"
21 #include "input_event_data_transformation.h"
22 #include "input_event_monitor_manager.h"
23 #include "input_handler_manager.h"
24 #include "input_manager_impl.h"
25 #include "input_monitor_manager.h"
26 #include "interceptor_manager.h"
27 #include "mmi_client.h"
28 #include "multimodal_event_handler.h"
29 #include "proto.h"
30 #include "time_cost_chk.h"
31 #include "util.h"
32
33 namespace OHOS {
34 namespace MMI {
35 namespace {
36 constexpr OHOS::HiviewDFX::HiLogLabel LABEL = {LOG_CORE, MMI_LOG_DOMAIN, "ClientMsgHandler"};
37 }
38
ClientMsgHandler()39 ClientMsgHandler::ClientMsgHandler()
40 {
41 eventProcessedCallback_ = std::bind(&ClientMsgHandler::OnEventProcessed, std::placeholders::_1);
42 }
43
~ClientMsgHandler()44 ClientMsgHandler::~ClientMsgHandler()
45 {
46 eventProcessedCallback_ = std::function<void(int32_t)>();
47 }
48
Init()49 bool ClientMsgHandler::Init()
50 {
51 // LCOV_EXCL_START
52 MsgCallback funs[] = {
53 {MmiMessageId::ON_KEYEVENT, MsgCallbackBind2(&ClientMsgHandler::OnKeyEvent, this)},
54 {MmiMessageId::ON_SUBSCRIBE_KEY, std::bind(&ClientMsgHandler::OnSubscribeKeyEventCallback,
55 this, std::placeholders::_1, std::placeholders::_2)},
56 {MmiMessageId::ON_KEYMONITOR, MsgCallbackBind2(&ClientMsgHandler::OnKeyMonitor, this)},
57 {MmiMessageId::ON_POINTER_EVENT, MsgCallbackBind2(&ClientMsgHandler::OnPointerEvent, this)},
58 {MmiMessageId::ON_TOUCHPAD_MONITOR, MsgCallbackBind2(&ClientMsgHandler::OnTouchPadMonitor, this)},
59 {MmiMessageId::GET_MMI_INFO_ACK, MsgCallbackBind2(&ClientMsgHandler::GetMultimodeInputInfo, this)},
60 {MmiMessageId::INPUT_DEVICE, MsgCallbackBind2(&ClientMsgHandler::OnInputDevice, this)},
61 {MmiMessageId::INPUT_DEVICE_IDS, MsgCallbackBind2(&ClientMsgHandler::OnInputDeviceIds, this)},
62 {MmiMessageId::REPORT_KEY_EVENT, MsgCallbackBind2(&ClientMsgHandler::ReportKeyEvent, this)},
63 {MmiMessageId::REPORT_POINTER_EVENT, MsgCallbackBind2(&ClientMsgHandler::ReportPointerEvent, this)},
64 {MmiMessageId::TOUCHPAD_EVENT_INTERCEPTOR, MsgCallbackBind2(&ClientMsgHandler::TouchpadEventInterceptor, this)},
65 {MmiMessageId::KEYBOARD_EVENT_INTERCEPTOR, MsgCallbackBind2(&ClientMsgHandler::KeyEventInterceptor, this)},
66 };
67 // LCOV_EXCL_STOP
68 for (auto& it : funs) {
69 CHKC(RegistrationEvent(it), EVENT_REG_FAIL);
70 }
71 return true;
72 }
73
OnMsgHandler(const UDSClient & client,NetPacket & pkt)74 void ClientMsgHandler::OnMsgHandler(const UDSClient& client, NetPacket& pkt)
75 {
76 auto id = pkt.GetMsgId();
77 TimeCostChk chk("ClientMsgHandler::OnMsgHandler", "overtime 300(us)", MAX_OVER_TIME, id);
78 auto callback = GetMsgCallback(id);
79 if (callback == nullptr) {
80 MMI_LOGE("Unknown msg id:%{public}d", id);
81 return;
82 }
83 auto ret = (*callback)(client, pkt);
84 if (ret < 0) {
85 MMI_LOGE("Msg handling failed. id:%{public}d,ret:%{public}d", id, ret);
86 return;
87 }
88 }
89
OnKeyMonitor(const UDSClient & client,NetPacket & pkt)90 int32_t ClientMsgHandler::OnKeyMonitor(const UDSClient& client, NetPacket& pkt)
91 {
92 auto key = KeyEvent::Create();
93 CHKPR(key, ERROR_NULL_POINTER);
94 int32_t ret = InputEventDataTransformation::NetPacketToKeyEvent(pkt, key);
95 if (ret != RET_OK) {
96 MMI_LOGE("read netPacket failed");
97 return RET_ERR;
98 }
99 int32_t pid;
100 pkt >> pid;
101 CHKR(!pkt.ChkRWError(), PACKET_READ_FAIL, PACKET_READ_FAIL);
102 MMI_LOGD("Client receive the msg from server, keyCode:%{public}d,pid:%{public}d", key->GetKeyCode(), pid);
103 return InputMonitorMgr.OnMonitorInputEvent(key);
104 }
105
OnKeyEvent(const UDSClient & client,NetPacket & pkt)106 int32_t ClientMsgHandler::OnKeyEvent(const UDSClient& client, NetPacket& pkt)
107 {
108 int32_t fd = 0;
109 uint64_t serverStartTime = 0;
110 auto key = KeyEvent::Create();
111 int32_t ret = InputEventDataTransformation::NetPacketToKeyEvent(pkt, key);
112 if (ret != RET_OK) {
113 MMI_LOGE("read netPacket failed");
114 return RET_ERR;
115 }
116 pkt >> fd >> serverStartTime;
117 CHKR(!pkt.ChkRWError(), PACKET_READ_FAIL, PACKET_READ_FAIL);
118 MMI_LOGD("key event dispatcher of client, KeyCode:%{public}d,"
119 "ActionTime:%{public}" PRId64 ",Action:%{public}d,ActionStartTime:%{public}" PRId64 ","
120 "EventType:%{public}d,Flag:%{public}u,"
121 "KeyAction:%{public}d,eventNumber:%{public}d,Fd:%{public}d,"
122 "ServerStartTime:%{public}" PRId64"",
123 key->GetKeyCode(), key->GetActionTime(), key->GetAction(),
124 key->GetActionStartTime(), key->GetEventType(),
125 key->GetFlag(), key->GetKeyAction(), key->GetId(), fd, serverStartTime);
126 int32_t keyId = key->GetId();
127 std::string keyCodestring = "KeyEventDispatch";
128 StartAsyncTrace(BYTRACE_TAG_MULTIMODALINPUT, keyCodestring, keyId);
129 int32_t getKeyCode = key->GetKeyCode();
130 keyCodestring = "client dispatchKeyCode=" + std::to_string(getKeyCode);
131 BYTRACE_NAME(BYTRACE_TAG_MULTIMODALINPUT, keyCodestring);
132 key->SetProcessedCallback(eventProcessedCallback_);
133 InputManagerImpl::GetInstance()->OnKeyEvent(key);
134 key->MarkProcessed();
135 return RET_OK;
136 }
137
OnPointerEvent(const UDSClient & client,NetPacket & pkt)138 int32_t ClientMsgHandler::OnPointerEvent(const UDSClient& client, NetPacket& pkt)
139 {
140 auto pointerEvent { PointerEvent::Create() };
141 if (InputEventDataTransformation::Unmarshalling(pkt, pointerEvent) != ERR_OK) {
142 MMI_LOGE("Failed to deserialize pointer event.");
143 return RET_ERR;
144 }
145
146 std::vector<int32_t> pointerIds { pointerEvent->GetPointersIdList() };
147 MMI_LOGD("Pointer event dispatcher of client, eventType:%{public}s, actionTime:%{public}" PRId64 ", "
148 "action:%{public}d, actionStartTime:%{public}" PRId64 ", flag:%{public}u, pointerAction:%{public}s, "
149 "sourceType:%{public}s, VerticalAxisValue:%{public}.2f, HorizontalAxisValue:%{public}.2f, "
150 "PinchAxisValue:%{public}.2f, pointerCount:%{public}zu, eventNumber:%{public}d",
151 pointerEvent->DumpEventType(), pointerEvent->GetActionTime(), pointerEvent->GetAction(),
152 pointerEvent->GetActionStartTime(), pointerEvent->GetFlag(), pointerEvent->DumpPointerAction(),
153 pointerEvent->DumpSourceType(), pointerEvent->GetAxisValue(PointerEvent::AXIS_TYPE_SCROLL_VERTICAL),
154 pointerEvent->GetAxisValue(PointerEvent::AXIS_TYPE_SCROLL_HORIZONTAL),
155 pointerEvent->GetAxisValue(PointerEvent::AXIS_TYPE_PINCH),
156 pointerIds.size(), pointerEvent->GetId());
157 std::vector<int32_t> pressedKeys = pointerEvent->GetPressedKeys();
158 for (auto &item : pressedKeys) {
159 MMI_LOGI("Pressed keyCode:%{public}d", item);
160 }
161 for (auto &pointerId : pointerIds) {
162 PointerEvent::PointerItem item;
163 CHKR(pointerEvent->GetPointerItem(pointerId, item), PARAM_INPUT_FAIL, RET_ERR);
164
165 MMI_LOGD("DownTime:%{public}" PRId64 ",isPressed:%{public}s,"
166 "globalX:%{public}d,globalY:%{public}d,localX:%{public}d,localY:%{public}d,"
167 "width:%{public}d,height:%{public}d,pressure:%{public}d",
168 item.GetDownTime(), (item.IsPressed() ? "true" : "false"),
169 item.GetGlobalX(), item.GetGlobalY(), item.GetLocalX(), item.GetLocalY(),
170 item.GetWidth(), item.GetHeight(), item.GetPressure());
171 }
172 if (PointerEvent::POINTER_ACTION_CANCEL == pointerEvent->GetPointerAction()) {
173 MMI_LOGD("Operation canceled.");
174 }
175 pointerEvent->SetProcessedCallback(eventProcessedCallback_);
176 if (pointerEvent->GetSourceType() == PointerEvent::SOURCE_TYPE_MOUSE) {
177 int32_t pointerId = pointerEvent->GetId();
178 std::string pointerEventstring = "PointerEventDispatch";
179 StartAsyncTrace(BYTRACE_TAG_MULTIMODALINPUT, pointerEventstring, pointerId);
180 }
181 if (pointerEvent->GetSourceType() == PointerEvent::SOURCE_TYPE_TOUCHSCREEN) {
182 int32_t touchId = pointerEvent->GetId();
183 std::string touchEvent = "touchEventDispatch";
184 StartAsyncTrace(BYTRACE_TAG_MULTIMODALINPUT, touchEvent, touchId);
185 }
186 InputManagerImpl::GetInstance()->OnPointerEvent(pointerEvent);
187 return RET_OK;
188 }
189
OnSubscribeKeyEventCallback(const UDSClient & client,NetPacket & pkt)190 int32_t ClientMsgHandler::OnSubscribeKeyEventCallback(const UDSClient &client, NetPacket &pkt)
191 {
192 std::shared_ptr<KeyEvent> keyEvent = KeyEvent::Create();
193 int32_t ret = InputEventDataTransformation::NetPacketToKeyEvent(pkt, keyEvent);
194 if (ret != RET_OK) {
195 MMI_LOGE("read net packet failed");
196 return RET_ERR;
197 }
198 int32_t fd = -1;
199 int32_t subscribeId = -1;
200 pkt >> fd >> subscribeId;
201 CHKR(!pkt.ChkRWError(), PACKET_READ_FAIL, PACKET_READ_FAIL);
202 MMI_LOGD("Subscribe:%{public}d,Fd:%{public}d,KeyEvent:%{public}d,"
203 "KeyCode:%{public}d,ActionTime:%{public}" PRId64 ",ActionStartTime:%{public}" PRId64 ","
204 "Action:%{public}d,KeyAction:%{public}d,EventType:%{public}d,Flag:%{public}u",
205 subscribeId, fd, keyEvent->GetId(), keyEvent->GetKeyCode(), keyEvent->GetActionTime(),
206 keyEvent->GetActionStartTime(), keyEvent->GetAction(), keyEvent->GetKeyAction(),
207 keyEvent->GetEventType(), keyEvent->GetFlag());
208 int32_t keyId = keyEvent->GetId();
209 std::string keyEventString = "keyEventSubscribe";
210 StartAsyncTrace(BYTRACE_TAG_MULTIMODALINPUT, keyEventString, keyId);
211 int32_t keyCode = keyEvent->GetKeyCode();
212 keyEventString = "client subscribe keyCode=" + std::to_string(keyCode);
213 BYTRACE_NAME(BYTRACE_TAG_MULTIMODALINPUT, keyEventString);
214 return KeyEventInputSubscribeMgr.OnSubscribeKeyEventCallback(keyEvent, subscribeId);
215 }
216
OnTouchPadMonitor(const UDSClient & client,NetPacket & pkt)217 int32_t ClientMsgHandler::OnTouchPadMonitor(const UDSClient& client, NetPacket& pkt)
218 {
219 auto pointer = PointerEvent::Create();
220 int32_t ret = InputEventDataTransformation::Unmarshalling(pkt, pointer);
221 if (ret != RET_OK) {
222 MMI_LOGE("read netPacket failed");
223 return RET_ERR;
224 }
225 int32_t pid = 0;
226 pkt >> pid;
227 CHKR(!pkt.ChkRWError(), PACKET_READ_FAIL, PACKET_READ_FAIL);
228 MMI_LOGD("client receive the msg from server: EventType:%{public}d,pid:%{public}d",
229 pointer->GetEventType(), pid);
230 return InputMonitorMgr.OnTouchpadMonitorInputEvent(pointer);
231 }
232
GetMultimodeInputInfo(const UDSClient & client,NetPacket & pkt)233 int32_t ClientMsgHandler::GetMultimodeInputInfo(const UDSClient& client, NetPacket& pkt)
234 {
235 TagPackHead tagPackHeadAck;
236 pkt >> tagPackHeadAck;
237 CHKR(!pkt.ChkRWError(), PACKET_READ_FAIL, PACKET_READ_FAIL);
238 std::cout << "GetMultimodeInputInfo: The client fd is " << tagPackHeadAck.sizeEvent[0] << std::endl;
239 return RET_OK;
240 }
241
OnInputDeviceIds(const UDSClient & client,NetPacket & pkt)242 int32_t ClientMsgHandler::OnInputDeviceIds(const UDSClient& client, NetPacket& pkt)
243 {
244 MMI_LOGD("enter");
245 int32_t userData;
246 int32_t size;
247 std::vector<int32_t> inputDeviceIds;
248 CHKR(pkt.Read(userData), STREAM_BUF_READ_FAIL, RET_ERR);
249 CHKR(pkt.Read(size), STREAM_BUF_READ_FAIL, RET_ERR);
250 for (int32_t i = 0; i < size; i++) {
251 int32_t deviceId = 0;
252 CHKR(pkt.Read(deviceId), STREAM_BUF_READ_FAIL, RET_ERR);
253 inputDeviceIds.push_back(deviceId);
254 }
255 InputDeviceImpl::GetInstance().OnInputDeviceIds(userData, inputDeviceIds);
256 return RET_OK;
257 }
258
OnInputDevice(const UDSClient & client,NetPacket & pkt)259 int32_t ClientMsgHandler::OnInputDevice(const UDSClient& client, NetPacket& pkt)
260 {
261 MMI_LOGD("enter");
262 int32_t userData;
263 int32_t id;
264 std::string name;
265 int32_t deviceType;
266 CHKR(pkt.Read(userData), STREAM_BUF_READ_FAIL, RET_ERR);
267 CHKR(pkt.Read(id), STREAM_BUF_READ_FAIL, RET_ERR);
268 CHKR(pkt.Read(name), STREAM_BUF_READ_FAIL, RET_ERR);
269 CHKR(pkt.Read(deviceType), STREAM_BUF_READ_FAIL, RET_ERR);
270
271 InputDeviceImpl::GetInstance().OnInputDevice(userData, id, name, deviceType);
272 return RET_OK;
273 }
274
ReportKeyEvent(const UDSClient & client,NetPacket & pkt)275 int32_t ClientMsgHandler::ReportKeyEvent(const UDSClient& client, NetPacket& pkt)
276 {
277 int32_t handlerId;
278 CHKR(pkt.Read(handlerId), STREAM_BUF_READ_FAIL, RET_ERR);
279 auto keyEvent = KeyEvent::Create();
280 if (InputEventDataTransformation::NetPacketToKeyEvent(pkt, keyEvent) != ERR_OK) {
281 MMI_LOGE("Failed to deserialize key event.");
282 return RET_ERR;
283 }
284 InputHandlerManager::GetInstance().OnInputEvent(handlerId, keyEvent);
285 return RET_OK;
286 }
287
ReportPointerEvent(const UDSClient & client,NetPacket & pkt)288 int32_t ClientMsgHandler::ReportPointerEvent(const UDSClient& client, NetPacket& pkt)
289 {
290 MMI_LOGD("enter");
291 int32_t handlerId;
292 InputHandlerType handlerType;
293 CHKR(pkt.Read(handlerId), STREAM_BUF_READ_FAIL, RET_ERR);
294 CHKR(pkt.Read(handlerType), STREAM_BUF_READ_FAIL, RET_ERR);
295 MMI_LOGD("Client handlerId:%{public}d,handlerType:%{public}d", handlerId, handlerType);
296 auto pointerEvent { PointerEvent::Create() };
297 if (InputEventDataTransformation::Unmarshalling(pkt, pointerEvent) != ERR_OK) {
298 MMI_LOGE("Failed to deserialize pointer event");
299 return RET_ERR;
300 }
301 if (pointerEvent->GetSourceType() == PointerEvent::SOURCE_TYPE_MOUSE) {
302 int32_t pointerId = pointerEvent->GetId();
303 std::string pointerEventString = "pointerEventFilter";
304 StartAsyncTrace(BYTRACE_TAG_MULTIMODALINPUT, pointerEventString, pointerId);
305 }
306 if (pointerEvent->GetSourceType() == PointerEvent::SOURCE_TYPE_TOUCHSCREEN) {
307 int32_t touchId = pointerEvent->GetId();
308 std::string touchEventString = "touchEventFilter";
309 StartAsyncTrace(BYTRACE_TAG_MULTIMODALINPUT, touchEventString, touchId);
310 }
311 InputHandlerManager::GetInstance().OnInputEvent(handlerId, pointerEvent);
312 return RET_OK;
313 }
314
TouchpadEventInterceptor(const UDSClient & client,NetPacket & pkt)315 int32_t ClientMsgHandler::TouchpadEventInterceptor(const UDSClient& client, NetPacket& pkt)
316 {
317 auto pointerEvent = PointerEvent::Create();
318 int32_t ret = InputEventDataTransformation::Unmarshalling(pkt, pointerEvent);
319 if (ret != RET_OK) {
320 MMI_LOGE("read netPacket failed");
321 return RET_ERR;
322 }
323 int32_t pid = 0;
324 int32_t id = 0;
325 pkt >> pid >> id;
326 CHKR(!pkt.ChkRWError(), PACKET_READ_FAIL, PACKET_READ_FAIL);
327 MMI_LOGD("client receive the msg from server: pointId:%{public}d,pid:%{public}d",
328 pointerEvent->GetPointerId(), pid);
329 return InterceptorMgr.OnPointerEvent(pointerEvent, id);
330 }
331
KeyEventInterceptor(const UDSClient & client,NetPacket & pkt)332 int32_t ClientMsgHandler::KeyEventInterceptor(const UDSClient& client, NetPacket& pkt)
333 {
334 auto keyEvent = KeyEvent::Create();
335 int32_t ret = InputEventDataTransformation::NetPacketToKeyEvent(pkt, keyEvent);
336 if (ret != RET_OK) {
337 MMI_LOGE("read netPacket failed");
338 return RET_ERR;
339 }
340 int32_t pid = 0;
341 pkt >> pid;
342 CHKR(!pkt.ChkRWError(), PACKET_READ_FAIL, PACKET_READ_FAIL);
343
344 int32_t keyId = keyEvent->GetId();
345 std::string keyEventString = "keyEventFilter";
346 StartAsyncTrace(BYTRACE_TAG_MULTIMODALINPUT, keyEventString, keyId);
347 int32_t keyCode = keyEvent->GetKeyCode();
348 keyEventString = "client filter keyCode=" + std::to_string(keyCode);
349 BYTRACE_NAME(BYTRACE_TAG_MULTIMODALINPUT, keyEventString);
350 MMI_LOGD("client receive the msg from server: keyCode:%{public}d,pid:%{public}d",
351 keyEvent->GetKeyCode(), pid);
352 return InterceptorMgr.OnKeyEvent(keyEvent);
353 }
354
OnEventProcessed(int32_t eventId)355 void ClientMsgHandler::OnEventProcessed(int32_t eventId)
356 {
357 MMIClientPtr client = MMIEventHdl.GetMMIClient();
358 CHKPV(client);
359 NetPacket pkt(MmiMessageId::NEW_CHECK_REPLY_MESSAGE);
360 pkt << eventId;
361 CHK(client->SendMessage(pkt), MSG_SEND_FAIL);
362 }
363 } // namespace MMI
364 } // namespace OHOS