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 "input_event_monitor_manager.h"
17 #include <cinttypes>
18 #include "input_event_data_transformation.h"
19 #include "proto.h"
20
21 namespace OHOS {
22 namespace MMI {
23 namespace {
24 constexpr OHOS::HiviewDFX::HiLogLabel LABEL = { LOG_CORE, MMI_LOG_DOMAIN, "InputEventMonitorManager" };
25 }
26 } // namespace MMI
27 } // namespace OHOS
28
InputEventMonitorManager()29 OHOS::MMI::InputEventMonitorManager::InputEventMonitorManager() {}
30
~InputEventMonitorManager()31 OHOS::MMI::InputEventMonitorManager::~InputEventMonitorManager() {}
32
AddInputEventMontior(SessionPtr session,int32_t eventType)33 int32_t OHOS::MMI::InputEventMonitorManager::AddInputEventMontior(SessionPtr session, int32_t eventType)
34 {
35 MMI_LOGD("Enter");
36 CHKPR(session, ERROR_NULL_POINTER);
37 std::lock_guard<std::mutex> lock(mu_);
38 MonitorItem monitorItem;
39 monitorItem.eventType = eventType;
40 monitorItem.session = session;
41 auto iter = std::find(monitors_.begin(), monitors_.end(), monitorItem);
42 if (iter != monitors_.end()) {
43 MMI_LOGE("Key register repeat");
44 return RET_ERR;
45 }
46 iter = monitors_.insert(iter, monitorItem);
47 MMI_LOGD("eventType:%{public}d,fd:%{public}d register in server", eventType, session->GetFd());
48 return RET_OK;
49 }
50
RemoveInputEventMontior(SessionPtr session,int32_t eventType)51 void OHOS::MMI::InputEventMonitorManager::RemoveInputEventMontior(SessionPtr session, int32_t eventType)
52 {
53 MMI_LOGD("Enter");
54 CHKPV(session);
55 std::lock_guard<std::mutex> lock(mu_);
56 MonitorItem monitorItem;
57 monitorItem.eventType = eventType;
58 monitorItem.session = session;
59 auto it = std::find(monitors_.begin(), monitors_.end(), monitorItem);
60 if (it != monitors_.end()) {
61 monitors_.erase(it);
62 MMI_LOGW("EventType:%{public}d,fd:%{public}d remove from server", eventType, session->GetFd());
63 }
64 MMI_LOGD("Leave");
65 }
66
OnMonitorInputEvent(std::shared_ptr<OHOS::MMI::KeyEvent> keyEvent)67 void OHOS::MMI::InputEventMonitorManager::OnMonitorInputEvent(std::shared_ptr<OHOS::MMI::KeyEvent> keyEvent)
68 {
69 CHKPV(keyEvent);
70 MMI_LOGD("KeyEvent from libinput, keyCode:%{public}d, keyAction:%{public}d, action:%{public}d, "
71 "actionTime:%{public}" PRId64 "", keyEvent->GetKeyCode(), keyEvent->GetKeyAction(),
72 keyEvent->GetAction(), keyEvent->GetActionTime());
73 if (monitors_.empty()) {
74 MMI_LOGE("No monitor to send msg");
75 return;
76 }
77 NetPacket pkt(MmiMessageId::ON_KEYMONITOR);
78 InputEventDataTransformation::KeyEventToNetPacket(keyEvent, pkt);
79 std::list<MonitorItem>::iterator iter;
80 for (const auto &item : monitors_) {
81 CHKPV(item.session);
82 pkt << item.session->GetPid();
83 MMI_LOGD("server send the msg to client: keyCode:%{public}d,pid:%{public}d", keyEvent->GetKeyCode(),
84 item.session->GetPid());
85 item.session->SendMsg(pkt);
86 }
87 }
88
AddInputEventTouchpadMontior(int32_t eventType,SessionPtr session)89 int32_t OHOS::MMI::InputEventMonitorManager::AddInputEventTouchpadMontior(int32_t eventType, SessionPtr session)
90 {
91 MMI_LOGD("Enter");
92 std::lock_guard<std::mutex> lock(mu_);
93 MonitorItem monitorItemTouchpad;
94 monitorItemTouchpad.eventType = eventType;
95 monitorItemTouchpad.session = session;
96 auto iter = std::find(monitorsTouch_.begin(), monitorsTouch_.end(), monitorItemTouchpad);
97 if (iter != monitorsTouch_.end()) {
98 MMI_LOGE("Touchpad register repeat");
99 return RET_ERR;
100 }
101 iter = monitorsTouch_.insert(iter, monitorItemTouchpad);
102 MMI_LOGD("AddInputEventTouchpadMontior, Success, eventType:%{public}d,fd:%{public}d register in server",
103 eventType, session->GetFd());
104 return RET_OK;
105 }
106
RemoveInputEventTouchpadMontior(int32_t eventType,SessionPtr session)107 void OHOS::MMI::InputEventMonitorManager::RemoveInputEventTouchpadMontior(int32_t eventType, SessionPtr session)
108 {
109 MMI_LOGD("Enter");
110 std::lock_guard<std::mutex> lock(mu_);
111 MonitorItem monitorItemtouchpad;
112 monitorItemtouchpad.eventType = eventType;
113 monitorItemtouchpad.session = session;
114 auto iter = std::find(monitorsTouch_.begin(), monitorsTouch_.end(), monitorItemtouchpad);
115 if (iter == monitorsTouch_.end()) {
116 MMI_LOGE("monitorItemtouchpad does not exist");
117 } else {
118 MMI_LOGD("eventType:%{public}d,fd:%{public}d remove from server", eventType, session->GetFd());
119 iter = monitorsTouch_.erase(iter);
120 MMI_LOGD("Service RemoveInputEventTouchpadMontior Success");
121 }
122 MMI_LOGD("Leave");
123 }
124
OnTouchpadMonitorInputEvent(std::shared_ptr<OHOS::MMI::PointerEvent> pointerEvent)125 void OHOS::MMI::InputEventMonitorManager::OnTouchpadMonitorInputEvent(
126 std::shared_ptr<OHOS::MMI::PointerEvent> pointerEvent)
127 {
128 MMI_LOGD("Enter");
129 CHKPV(pointerEvent);
130 if (monitorsTouch_.empty()) {
131 MMI_LOGE("InputEventMonitorManager::%{public}s no monitor to send msg", __func__);
132 }
133 NetPacket pkt(MmiMessageId::ON_TOUCHPAD_MONITOR);
134 InputEventDataTransformation::Marshalling(pointerEvent, pkt);
135 std::list<MonitorItem>::iterator iter;
136 for (const auto &item : monitorsTouch_) {
137 pkt << item.session->GetPid();
138 MMI_LOGD("server send the msg to client: EventType:%{public}d,pid:%{public}d",
139 pointerEvent->GetEventType(), item.session->GetPid());
140 item.session->SendMsg(pkt);
141 MMI_LOGD("Service SendMsg Success");
142 }
143 MMI_LOGD("Leave");
144 }
145
ReportTouchpadEvent(std::shared_ptr<OHOS::MMI::PointerEvent> pointerEvent)146 bool OHOS::MMI::InputEventMonitorManager::ReportTouchpadEvent(std::shared_ptr<OHOS::MMI::PointerEvent> pointerEvent)
147 {
148 CHKPF(pointerEvent);
149 PointerEvent::PointerItem pointer;
150 CHKF(pointerEvent->GetPointerItem(pointerEvent->GetPointerId(), pointer), PARAM_INPUT_FAIL);
151 MMI_LOGD("Monitor-serviceeventTouchpad:time:%{public}" PRId64 ","
152 "sourceType:%{public}d,action:%{public}d,"
153 "pointer:%{public}d,point.x:%{public}d,point.y:%{public}d,press:%{public}d",
154 pointerEvent->GetActionTime(), pointerEvent->GetSourceType(), pointerEvent->GetPointerAction(),
155 pointerEvent->GetPointerId(), pointer.GetGlobalX(), pointer.GetGlobalY(), pointer.IsPressed());
156 OnTouchpadMonitorInputEvent(pointerEvent);
157 return true;
158 }
159