• 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 #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