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 "interceptor_manager_global.h"
16 #include <cinttypes>
17 #include "input_event_data_transformation.h"
18 #include "proto.h"
19 #include "souceType.h"
20
21 namespace OHOS {
22 namespace MMI {
23 namespace {
24 constexpr OHOS::HiviewDFX::HiLogLabel LABEL = { LOG_CORE, MMI_LOG_DOMAIN, "InterceptorManagerGlobal" };
25 }
26 } // namespace MMI
27 } // namespace OHOS
28
InterceptorManagerGlobal()29 OHOS::MMI::InterceptorManagerGlobal::InterceptorManagerGlobal() {}
30
~InterceptorManagerGlobal()31 OHOS::MMI::InterceptorManagerGlobal::~InterceptorManagerGlobal() {}
32
OnAddInterceptor(int32_t sourceType,int32_t id,SessionPtr session)33 void OHOS::MMI::InterceptorManagerGlobal::OnAddInterceptor(int32_t sourceType, int32_t id, SessionPtr session)
34 {
35 MMI_LOGD("enter");
36 std::lock_guard<std::mutex> lock(mu_);
37 InterceptorItem interceptorItem = {};
38 interceptorItem.sourceType = sourceType;
39 interceptorItem.id = id;
40 interceptorItem.session = session;
41 auto iter = std::find(interceptors_.begin(), interceptors_.end(), interceptorItem);
42 if (iter != interceptors_.end()) {
43 MMI_LOGE("touchpad event repeate register");
44 return;
45 } else {
46 iter = interceptors_.insert(iter, interceptorItem);
47 MMI_LOGD("sourceType:%{public}d,fd:%{public}d register in server", sourceType, session->GetFd());
48 }
49 MMI_LOGD("leave");
50 }
51
OnRemoveInterceptor(int32_t id)52 void OHOS::MMI::InterceptorManagerGlobal::OnRemoveInterceptor(int32_t id)
53 {
54 MMI_LOGD("enter");
55 std::lock_guard<std::mutex> lock(mu_);
56 InterceptorItem interceptorItem = {};
57 interceptorItem.id = id;
58 auto iter = std::find(interceptors_.begin(), interceptors_.end(), interceptorItem);
59 if (iter == interceptors_.end()) {
60 MMI_LOGE("OnRemoveInterceptor::interceptorItem does not exist");
61 } else {
62 MMI_LOGD("sourceType:%{public}d,fd:%{public}d remove from server", iter->sourceType,
63 iter->session->GetFd());
64 interceptors_.erase(iter);
65 }
66 MMI_LOGD("leave");
67 }
68
OnPointerEvent(std::shared_ptr<PointerEvent> pointerEvent)69 bool OHOS::MMI::InterceptorManagerGlobal::OnPointerEvent(std::shared_ptr<PointerEvent> pointerEvent)
70 {
71 MMI_LOGD("enter");
72 CHKPF(pointerEvent);
73 if (interceptors_.empty()) {
74 MMI_LOGE("InterceptorManagerGlobal::%{public}s no interceptor to send msg", __func__);
75 return false;
76 }
77 PointerEvent::PointerItem pointer;
78 CHKF(pointerEvent->GetPointerItem(pointerEvent->GetPointerId(), pointer), PARAM_INPUT_FAIL);
79 MMI_LOGD("Interceptor-servereventTouchpad:actionTime:%{public}" PRId64 ","
80 "sourceType:%{public}d,pointerAction:%{public}d,"
81 "pointer:%{public}d,point.x:%{public}d,point.y:%{public}d,press:%{public}d",
82 pointerEvent->GetActionTime(), pointerEvent->GetSourceType(), pointerEvent->GetPointerAction(),
83 pointerEvent->GetPointerId(), pointer.GetGlobalX(), pointer.GetGlobalY(), pointer.IsPressed());
84 for (const auto &item : interceptors_) {
85 NetPacket pkt(MmiMessageId::TOUCHPAD_EVENT_INTERCEPTOR);
86 InputEventDataTransformation::Marshalling(pointerEvent, pkt);
87 pkt << item.session->GetPid() << item.id;
88 MMI_LOGD("server send the interceptor msg to client, pid:%{public}d", item.session->GetPid());
89 item.session->SendMsg(pkt);
90 }
91 MMI_LOGD("leave");
92 return true;
93 }
94
OnKeyEvent(std::shared_ptr<KeyEvent> keyEvent)95 bool OHOS::MMI::InterceptorManagerGlobal::OnKeyEvent(std::shared_ptr<KeyEvent> keyEvent)
96 {
97 MMI_LOGD("enter");
98 CHKPF(keyEvent);
99 if (interceptors_.empty()) {
100 MMI_LOGE("InterceptorManagerGlobal::%{public}s no interceptor to send msg", __func__);
101 return false;
102 }
103 for (const auto &item : interceptors_) {
104 if (item.sourceType == SOURCETYPE_KEY) {
105 NetPacket pkt(MmiMessageId::KEYBOARD_EVENT_INTERCEPTOR);
106 InputEventDataTransformation::KeyEventToNetPacket(keyEvent, pkt);
107 pkt << item.session->GetPid();
108 MMI_LOGD("server send the interceptor msg to client, pid:%{public}d", item.session->GetPid());
109 item.session->SendMsg(pkt);
110 }
111 }
112 MMI_LOGD("leave");
113 return true;
114 }