• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2024 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 "tablet_subscriber_handler.h"
17 #include <parameters.h>
18 #include "bytrace_adapter.h"
19 #include "define_multimodal.h"
20 #include "dfx_hisysevent.h"
21 #include "error_multimodal.h"
22 #include "input_event_data_transformation.h"
23 #include "input_event_handler.h"
24 #include "net_packet.h"
25 #include "proto.h"
26 #include "util_ex.h"
27 
28 #undef MMI_LOG_DOMAIN
29 #define MMI_LOG_DOMAIN MMI_LOG_HANDLER
30 #undef MMI_LOG_TAG
31 #define MMI_LOG_TAG "TabletSubscriberHandler"
32 
33 namespace OHOS {
34 namespace MMI {
TabletSubscriberHandler()35 TabletSubscriberHandler::TabletSubscriberHandler() {}
~TabletSubscriberHandler()36 TabletSubscriberHandler::~TabletSubscriberHandler() {}
37 
HandleTabletEvent(const std::shared_ptr<PointerEvent> pointerEvent)38 void TabletSubscriberHandler::HandleTabletEvent(const std::shared_ptr<PointerEvent> pointerEvent)
39 {
40     CHKPV(pointerEvent);
41     if (OnSubscribeTabletProximity(pointerEvent)) {
42         return;
43     }
44 }
45 
SubscribeTabletProximity(SessionPtr sess,int32_t subscribeId)46 int32_t TabletSubscriberHandler::SubscribeTabletProximity(SessionPtr sess, int32_t subscribeId)
47 {
48     CALL_INFO_TRACE;
49     if (subscribeId < 0) {
50         MMI_HILOGE("Invalid subscribeId");
51         return RET_ERR;
52     }
53     CHKPR(sess, ERROR_NULL_POINTER);
54     MMI_HILOGD("subscribeId:%{public}d", subscribeId);
55     auto subscriber = std::make_shared<Subscriber>(subscribeId, sess);
56     InsertSubScriber(std::move(subscriber));
57     InitSessionDeleteCallback();
58     return RET_OK;
59 }
60 
UnsubscribetabletProximity(SessionPtr sess,int32_t subscribeId)61 int32_t TabletSubscriberHandler::UnsubscribetabletProximity(SessionPtr sess, int32_t subscribeId)
62 {
63     CALL_INFO_TRACE;
64     MMI_HILOGD("subscribeId:%{public}d", subscribeId);
65     for (auto it = subscribers_.begin(); it != subscribers_.end(); ++it) {
66         if ((*it)->id_ == subscribeId && (*it)->sess_ == sess) {
67             subscribers_.erase(it);
68             return RET_OK;
69         }
70     }
71     MMI_HILOGE("UnsubscribeTabletEvent failed with %{public}d", subscribeId);
72     return RET_ERR;
73 }
74 
OnSubscribeTabletProximity(std::shared_ptr<PointerEvent> pointerevent)75 bool TabletSubscriberHandler::OnSubscribeTabletProximity(std::shared_ptr<PointerEvent> pointerevent)
76 {
77     CHKPF(pointerevent);
78     bool handled = false;
79     for (const auto &subscriber : subscribers_) {
80         if (pointerevent->GetPointerAction() == PointerEvent::POINTER_ACTION_PROXIMITY_IN ||
81             pointerevent->GetPointerAction() == PointerEvent::POINTER_ACTION_PROXIMITY_OUT) {
82             MMI_HILOGI("The subscriber:%{public}d", subscriber->sess_->GetPid());
83             NotifySubscriber(pointerevent, subscriber);
84             handled = true;
85         }
86     }
87     MMI_HILOGD("%{public}s", handled ? "true" : "false");
88     return handled;
89 }
90 
InsertSubScriber(std::shared_ptr<Subscriber> subs)91 void TabletSubscriberHandler::InsertSubScriber(std::shared_ptr<Subscriber> subs)
92 {
93     CALL_DEBUG_ENTER;
94     CHKPV(subs);
95     for (auto it = subscribers_.begin(); it != subscribers_.end(); ++it) {
96         if (subs->sess_ != nullptr && (*it)->id_ == subs->id_ && (*it)->sess_ == subs->sess_) {
97             MMI_HILOGW("Repeat registration id:%{public}d, desc:%{public}s",
98                 subs->id_, subs->sess_->GetDescript().c_str());
99             return;
100         }
101     }
102     subscribers_.push_back(subs);
103 }
104 
OnSessionDelete(SessionPtr sess)105 void TabletSubscriberHandler::OnSessionDelete(SessionPtr sess)
106 {
107     CALL_DEBUG_ENTER;
108     CHKPV(sess);
109     for (auto it = subscribers_.begin(); it != subscribers_.end();) {
110         if ((*it)->sess_ == sess) {
111             subscribers_.erase(it++);
112             continue;
113         }
114         ++it;
115     }
116 }
117 
NotifySubscriber(std::shared_ptr<PointerEvent> pointerEvent,const std::shared_ptr<Subscriber> & subscriber)118 void TabletSubscriberHandler::NotifySubscriber(std::shared_ptr<PointerEvent> pointerEvent,
119                                                const std::shared_ptr<Subscriber> &subscriber)
120 {
121     CALL_DEBUG_ENTER;
122     CHKPV(pointerEvent);
123     CHKPV(subscriber);
124     auto udsServerPtr = InputHandler->GetUDSServer();
125     CHKPV(udsServerPtr);
126     NetPacket pkt(MmiMessageId::ON_SUBSCRIBE_TABLET);
127     if (InputEventDataTransformation::Marshalling(pointerEvent, pkt) != RET_OK) {
128         MMI_HILOGE("Marshalling pointer event failed, errCode:%{public}d", STREAM_BUF_WRITE_FAIL);
129         return;
130     }
131     if (subscriber->sess_ == nullptr) {
132         MMI_HILOGE("Subscriber's sess is null");
133         return;
134     }
135     int32_t fd = subscriber->sess_->GetFd();
136     pkt << fd << subscriber->id_;
137     MMI_HILOGI("Notify subscriber id:%{public}d, pid:%{public}d",
138         subscriber->id_, subscriber->sess_->GetPid());
139     if (pkt.ChkRWError()) {
140         MMI_HILOGE("Packet write dispatch subscriber failed");
141         return;
142     }
143     if (!udsServerPtr->SendMsg(fd, pkt)) {
144         MMI_HILOGE("Leave, server dispatch subscriber failed");
145     }
146 }
147 
InitSessionDeleteCallback()148 bool TabletSubscriberHandler::InitSessionDeleteCallback()
149 {
150     CALL_DEBUG_ENTER;
151     if (callbackInitialized_) {
152         MMI_HILOGD("Session delete callback has already been initialized");
153         return true;
154     }
155     auto udsServerPtr = InputHandler->GetUDSServer();
156     CHKPF(udsServerPtr);
157     std::function<void(SessionPtr)> callback =
158         [this] (SessionPtr sess) { return this->OnSessionDelete(sess); };
159     udsServerPtr->AddSessionDeletedCallback(callback);
160     callbackInitialized_ = true;
161     return true;
162 }
163 
Dump(int32_t fd,const std::vector<std::string> & args)164 void TabletSubscriberHandler::Dump(int32_t fd, const std::vector<std::string> &args)
165 {
166     CALL_DEBUG_ENTER;
167     mprintf(fd, "Subscriber information:\t");
168     mprintf(fd, "subscribers: count=%zu", subscribers_.size());
169     for (const auto &item : subscribers_) {
170         std::shared_ptr<Subscriber> subscriber = item;
171         CHKPV(subscriber);
172         SessionPtr session = item->sess_;
173         CHKPV(session);
174         mprintf(fd, "subscriber id:%d | Pid:%d | Uid:%d | Fd:%d\t",
175                 subscriber->id_, session->GetPid(), session->GetUid(), session->GetFd());
176     }
177 }
178 } // namespace MMI
179 } // namespace OHOS
180