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