1c29fa5a6Sopenharmony_ci/*
2c29fa5a6Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd.
3c29fa5a6Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4c29fa5a6Sopenharmony_ci * you may not use this file except in compliance with the License.
5c29fa5a6Sopenharmony_ci * You may obtain a copy of the License at
6c29fa5a6Sopenharmony_ci *
7c29fa5a6Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8c29fa5a6Sopenharmony_ci *
9c29fa5a6Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10c29fa5a6Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11c29fa5a6Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12c29fa5a6Sopenharmony_ci * See the License for the specific language governing permissions and
13c29fa5a6Sopenharmony_ci * limitations under the License.
14c29fa5a6Sopenharmony_ci */
15c29fa5a6Sopenharmony_ci
16c29fa5a6Sopenharmony_ci#include "dsoftbus_handler.h"
17c29fa5a6Sopenharmony_ci
18c29fa5a6Sopenharmony_ci#include "ipc_skeleton.h"
19c29fa5a6Sopenharmony_ci#include "token_setproc.h"
20c29fa5a6Sopenharmony_ci
21c29fa5a6Sopenharmony_ci#include "device.h"
22c29fa5a6Sopenharmony_ci#include "devicestatus_define.h"
23c29fa5a6Sopenharmony_ci#include "utility.h"
24c29fa5a6Sopenharmony_ci
25c29fa5a6Sopenharmony_ci#undef LOG_TAG
26c29fa5a6Sopenharmony_ci#define LOG_TAG "DSoftbusHandler"
27c29fa5a6Sopenharmony_ci
28c29fa5a6Sopenharmony_cinamespace OHOS {
29c29fa5a6Sopenharmony_cinamespace Msdp {
30c29fa5a6Sopenharmony_cinamespace DeviceStatus {
31c29fa5a6Sopenharmony_cinamespace Cooperate {
32c29fa5a6Sopenharmony_ciconstexpr int32_t MAX_INPUT_DEV_NUM { 100 };
33c29fa5a6Sopenharmony_ciconstexpr int32_t INVALID_DEVICE_ID { -1 };
34c29fa5a6Sopenharmony_ci
35c29fa5a6Sopenharmony_ciDSoftbusHandler::DSoftbusHandler(IContext *env)
36c29fa5a6Sopenharmony_ci    : env_(env)
37c29fa5a6Sopenharmony_ci{
38c29fa5a6Sopenharmony_ci    handles_ = {
39c29fa5a6Sopenharmony_ci        { static_cast<int32_t>(MessageId::DSOFTBUS_START_COOPERATE),
40c29fa5a6Sopenharmony_ci        [this] (const std::string &networkId, NetPacket &packet) {
41c29fa5a6Sopenharmony_ci            this->OnStartCooperate(networkId, packet);}},
42c29fa5a6Sopenharmony_ci        { static_cast<int32_t>(MessageId::DSOFTBUS_STOP_COOPERATE),
43c29fa5a6Sopenharmony_ci        [this] (const std::string &networkId, NetPacket &packet) {
44c29fa5a6Sopenharmony_ci            this->OnStopCooperate(networkId, packet);}},
45c29fa5a6Sopenharmony_ci        { static_cast<int32_t>(MessageId::DSOFTBUS_COME_BACK),
46c29fa5a6Sopenharmony_ci        [this] (const std::string &networkId, NetPacket &packet) {
47c29fa5a6Sopenharmony_ci            this->OnComeBack(networkId, packet);}},
48c29fa5a6Sopenharmony_ci        { static_cast<int32_t>(MessageId::DSOFTBUS_RELAY_COOPERATE),
49c29fa5a6Sopenharmony_ci        [this] (const std::string &networkId, NetPacket &packet) {
50c29fa5a6Sopenharmony_ci            this->OnRelayCooperate(networkId, packet);}},
51c29fa5a6Sopenharmony_ci        { static_cast<int32_t>(MessageId::DSOFTBUS_RELAY_COOPERATE_FINISHED),
52c29fa5a6Sopenharmony_ci        [this] (const std::string &networkId, NetPacket &packet) {
53c29fa5a6Sopenharmony_ci            this->OnRelayCooperateFinish(networkId, packet);}},
54c29fa5a6Sopenharmony_ci        { static_cast<int32_t>(MessageId::DSOFTBUS_SUBSCRIBE_MOUSE_LOCATION),
55c29fa5a6Sopenharmony_ci        [this] (const std::string &networkId, NetPacket &packet) {
56c29fa5a6Sopenharmony_ci            this->OnSubscribeMouseLocation(networkId, packet);}},
57c29fa5a6Sopenharmony_ci        { static_cast<int32_t>(MessageId::DSOFTBUS_UNSUBSCRIBE_MOUSE_LOCATION),
58c29fa5a6Sopenharmony_ci        [this] (const std::string &networkId, NetPacket &packet) {
59c29fa5a6Sopenharmony_ci            this->OnUnSubscribeMouseLocation(networkId, packet);}},
60c29fa5a6Sopenharmony_ci        { static_cast<int32_t>(MessageId::DSOFTBUS_REPLY_SUBSCRIBE_MOUSE_LOCATION),
61c29fa5a6Sopenharmony_ci        [this] (const std::string &networkId, NetPacket &packet) {
62c29fa5a6Sopenharmony_ci            this->OnReplySubscribeLocation(networkId, packet);}},
63c29fa5a6Sopenharmony_ci        { static_cast<int32_t>(MessageId::DSOFTBUS_REPLY_UNSUBSCRIBE_MOUSE_LOCATION),
64c29fa5a6Sopenharmony_ci        [this] (const std::string &networkId, NetPacket &packet) {
65c29fa5a6Sopenharmony_ci            this->OnReplyUnSubscribeLocation(networkId, packet);}},
66c29fa5a6Sopenharmony_ci        { static_cast<int32_t>(MessageId::DSOFTBUS_MOUSE_LOCATION),
67c29fa5a6Sopenharmony_ci        [this] (const std::string &networkId, NetPacket &packet) {
68c29fa5a6Sopenharmony_ci            this->OnRemoteMouseLocation(networkId, packet);}},
69c29fa5a6Sopenharmony_ci        { static_cast<int32_t>(MessageId::DSOFTBUS_INPUT_DEV_SYNC),
70c29fa5a6Sopenharmony_ci        [this] (const std::string &networkId, NetPacket &packet) {
71c29fa5a6Sopenharmony_ci            this->OnRemoteInputDevice(networkId, packet);}},
72c29fa5a6Sopenharmony_ci        { static_cast<int32_t>(MessageId::DSOFTBUS_INPUT_DEV_HOT_PLUG),
73c29fa5a6Sopenharmony_ci        [this] (const std::string &networkId, NetPacket &packet) {
74c29fa5a6Sopenharmony_ci            this->OnRemoteHotPlug(networkId, packet);}}
75c29fa5a6Sopenharmony_ci    };
76c29fa5a6Sopenharmony_ci    observer_ = std::make_shared<DSoftbusObserver>(*this);
77c29fa5a6Sopenharmony_ci    CHKPV(env_);
78c29fa5a6Sopenharmony_ci    env_->GetDSoftbus().AddObserver(observer_);
79c29fa5a6Sopenharmony_ci}
80c29fa5a6Sopenharmony_ci
81c29fa5a6Sopenharmony_ciDSoftbusHandler::~DSoftbusHandler()
82c29fa5a6Sopenharmony_ci{
83c29fa5a6Sopenharmony_ci    CHKPV(env_);
84c29fa5a6Sopenharmony_ci    env_->GetDSoftbus().RemoveObserver(observer_);
85c29fa5a6Sopenharmony_ci}
86c29fa5a6Sopenharmony_ci
87c29fa5a6Sopenharmony_civoid DSoftbusHandler::AttachSender(Channel<CooperateEvent>::Sender sender)
88c29fa5a6Sopenharmony_ci{
89c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
90c29fa5a6Sopenharmony_ci    std::lock_guard guard(lock_);
91c29fa5a6Sopenharmony_ci    sender_ = sender;
92c29fa5a6Sopenharmony_ci}
93c29fa5a6Sopenharmony_ci
94c29fa5a6Sopenharmony_ciint32_t DSoftbusHandler::OpenSession(const std::string &networkId)
95c29fa5a6Sopenharmony_ci{
96c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
97c29fa5a6Sopenharmony_ci    auto tokenId = OHOS::IPCSkeleton::GetCallingTokenID();
98c29fa5a6Sopenharmony_ci    int ret = SetFirstCallerTokenID(tokenId);
99c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
100c29fa5a6Sopenharmony_ci        FI_HILOGW("Failed to SetFirstCallerTokenID, ret:%{public}d", ret);
101c29fa5a6Sopenharmony_ci    }
102c29fa5a6Sopenharmony_ci    return env_->GetDSoftbus().OpenSession(networkId);
103c29fa5a6Sopenharmony_ci}
104c29fa5a6Sopenharmony_ci
105c29fa5a6Sopenharmony_civoid DSoftbusHandler::CloseSession(const std::string &networkId)
106c29fa5a6Sopenharmony_ci{
107c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
108c29fa5a6Sopenharmony_ci    env_->GetDSoftbus().CloseSession(networkId);
109c29fa5a6Sopenharmony_ci}
110c29fa5a6Sopenharmony_ci
111c29fa5a6Sopenharmony_civoid DSoftbusHandler::CloseAllSessions()
112c29fa5a6Sopenharmony_ci{
113c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
114c29fa5a6Sopenharmony_ci    env_->GetDSoftbus().CloseAllSessions();
115c29fa5a6Sopenharmony_ci}
116c29fa5a6Sopenharmony_ci
117c29fa5a6Sopenharmony_ciint32_t DSoftbusHandler::StartCooperate(const std::string &networkId, const DSoftbusStartCooperate &event)
118c29fa5a6Sopenharmony_ci{
119c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
120c29fa5a6Sopenharmony_ci    NetPacket packet(MessageId::DSOFTBUS_START_COOPERATE);
121c29fa5a6Sopenharmony_ci    packet << event.originNetworkId << event.cursorPos.x
122c29fa5a6Sopenharmony_ci        << event.cursorPos.y << event.success << event.extra.priv;
123c29fa5a6Sopenharmony_ci    if (packet.ChkRWError()) {
124c29fa5a6Sopenharmony_ci        FI_HILOGE("Failed to write data packet");
125c29fa5a6Sopenharmony_ci        return RET_ERR;
126c29fa5a6Sopenharmony_ci    }
127c29fa5a6Sopenharmony_ci    int32_t ret = env_->GetDSoftbus().SendPacket(networkId, packet);
128c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
129c29fa5a6Sopenharmony_ci        OnCommunicationFailure(networkId);
130c29fa5a6Sopenharmony_ci    }
131c29fa5a6Sopenharmony_ci    return ret;
132c29fa5a6Sopenharmony_ci}
133c29fa5a6Sopenharmony_ci
134c29fa5a6Sopenharmony_ciint32_t DSoftbusHandler::StopCooperate(const std::string &networkId, const DSoftbusStopCooperate &event)
135c29fa5a6Sopenharmony_ci{
136c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
137c29fa5a6Sopenharmony_ci    NetPacket packet(MessageId::DSOFTBUS_STOP_COOPERATE);
138c29fa5a6Sopenharmony_ci    int32_t ret = env_->GetDSoftbus().SendPacket(networkId, packet);
139c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
140c29fa5a6Sopenharmony_ci        OnCommunicationFailure(networkId);
141c29fa5a6Sopenharmony_ci    }
142c29fa5a6Sopenharmony_ci    return ret;
143c29fa5a6Sopenharmony_ci}
144c29fa5a6Sopenharmony_ci
145c29fa5a6Sopenharmony_ciint32_t DSoftbusHandler::ComeBack(const std::string &networkId, const DSoftbusComeBack &event)
146c29fa5a6Sopenharmony_ci{
147c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
148c29fa5a6Sopenharmony_ci    NetPacket packet(MessageId::DSOFTBUS_COME_BACK);
149c29fa5a6Sopenharmony_ci    packet << event.originNetworkId << event.cursorPos.x << event.cursorPos.y << event.extra.priv;
150c29fa5a6Sopenharmony_ci    if (packet.ChkRWError()) {
151c29fa5a6Sopenharmony_ci        FI_HILOGE("Failed to write data packet");
152c29fa5a6Sopenharmony_ci        return RET_ERR;
153c29fa5a6Sopenharmony_ci    }
154c29fa5a6Sopenharmony_ci    int32_t ret = env_->GetDSoftbus().SendPacket(networkId, packet);
155c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
156c29fa5a6Sopenharmony_ci        OnCommunicationFailure(networkId);
157c29fa5a6Sopenharmony_ci    }
158c29fa5a6Sopenharmony_ci    return ret;
159c29fa5a6Sopenharmony_ci}
160c29fa5a6Sopenharmony_ci
161c29fa5a6Sopenharmony_ciint32_t DSoftbusHandler::RelayCooperate(const std::string &networkId, const DSoftbusRelayCooperate &event)
162c29fa5a6Sopenharmony_ci{
163c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
164c29fa5a6Sopenharmony_ci    NetPacket packet(MessageId::DSOFTBUS_RELAY_COOPERATE);
165c29fa5a6Sopenharmony_ci    packet << event.targetNetworkId;
166c29fa5a6Sopenharmony_ci    if (packet.ChkRWError()) {
167c29fa5a6Sopenharmony_ci        FI_HILOGE("Failed to write data packet");
168c29fa5a6Sopenharmony_ci        return RET_ERR;
169c29fa5a6Sopenharmony_ci    }
170c29fa5a6Sopenharmony_ci    int32_t ret = env_->GetDSoftbus().SendPacket(networkId, packet);
171c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
172c29fa5a6Sopenharmony_ci        OnCommunicationFailure(networkId);
173c29fa5a6Sopenharmony_ci    }
174c29fa5a6Sopenharmony_ci    return ret;
175c29fa5a6Sopenharmony_ci}
176c29fa5a6Sopenharmony_ci
177c29fa5a6Sopenharmony_ciint32_t DSoftbusHandler::RelayCooperateFinish(const std::string &networkId, const DSoftbusRelayCooperateFinished &event)
178c29fa5a6Sopenharmony_ci{
179c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
180c29fa5a6Sopenharmony_ci    NetPacket packet(MessageId::DSOFTBUS_RELAY_COOPERATE_FINISHED);
181c29fa5a6Sopenharmony_ci    packet << event.targetNetworkId << event.normal;
182c29fa5a6Sopenharmony_ci    if (packet.ChkRWError()) {
183c29fa5a6Sopenharmony_ci        FI_HILOGE("Failed to write data packet");
184c29fa5a6Sopenharmony_ci        return RET_ERR;
185c29fa5a6Sopenharmony_ci    }
186c29fa5a6Sopenharmony_ci    int32_t ret = env_->GetDSoftbus().SendPacket(networkId, packet);
187c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
188c29fa5a6Sopenharmony_ci        OnCommunicationFailure(networkId);
189c29fa5a6Sopenharmony_ci    }
190c29fa5a6Sopenharmony_ci    return ret;
191c29fa5a6Sopenharmony_ci}
192c29fa5a6Sopenharmony_ci
193c29fa5a6Sopenharmony_cistd::string DSoftbusHandler::GetLocalNetworkId()
194c29fa5a6Sopenharmony_ci{
195c29fa5a6Sopenharmony_ci    return IDSoftbusAdapter::GetLocalNetworkId();
196c29fa5a6Sopenharmony_ci}
197c29fa5a6Sopenharmony_ci
198c29fa5a6Sopenharmony_civoid DSoftbusHandler::OnBind(const std::string &networkId)
199c29fa5a6Sopenharmony_ci{
200c29fa5a6Sopenharmony_ci    FI_HILOGI("Bind to \'%{public}s\'", Utility::Anonymize(networkId).c_str());
201c29fa5a6Sopenharmony_ci    SendEvent(CooperateEvent(
202c29fa5a6Sopenharmony_ci        CooperateEventType::DSOFTBUS_SESSION_OPENED,
203c29fa5a6Sopenharmony_ci        DSoftbusSessionOpened {
204c29fa5a6Sopenharmony_ci            .networkId = networkId
205c29fa5a6Sopenharmony_ci        }));
206c29fa5a6Sopenharmony_ci}
207c29fa5a6Sopenharmony_ci
208c29fa5a6Sopenharmony_civoid DSoftbusHandler::OnShutdown(const std::string &networkId)
209c29fa5a6Sopenharmony_ci{
210c29fa5a6Sopenharmony_ci    FI_HILOGI("Connection with \'%{public}s\' shutdown", Utility::Anonymize(networkId).c_str());
211c29fa5a6Sopenharmony_ci    SendEvent(CooperateEvent(
212c29fa5a6Sopenharmony_ci        CooperateEventType::DSOFTBUS_SESSION_CLOSED,
213c29fa5a6Sopenharmony_ci        DSoftbusSessionClosed {
214c29fa5a6Sopenharmony_ci            .networkId = networkId
215c29fa5a6Sopenharmony_ci        }));
216c29fa5a6Sopenharmony_ci}
217c29fa5a6Sopenharmony_ci
218c29fa5a6Sopenharmony_civoid DSoftbusHandler::OnConnected(const std::string &networkId)
219c29fa5a6Sopenharmony_ci{
220c29fa5a6Sopenharmony_ci    FI_HILOGI("Connection to \'%{public}s\' successfully", Utility::Anonymize(networkId).c_str());
221c29fa5a6Sopenharmony_ci    SendEvent(CooperateEvent(
222c29fa5a6Sopenharmony_ci        CooperateEventType::DSOFTBUS_SESSION_OPENED,
223c29fa5a6Sopenharmony_ci        DSoftbusSessionOpened {
224c29fa5a6Sopenharmony_ci            .networkId = networkId
225c29fa5a6Sopenharmony_ci        }));
226c29fa5a6Sopenharmony_ci}
227c29fa5a6Sopenharmony_ci
228c29fa5a6Sopenharmony_cibool DSoftbusHandler::OnPacket(const std::string &networkId, NetPacket &packet)
229c29fa5a6Sopenharmony_ci{
230c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
231c29fa5a6Sopenharmony_ci    int32_t messageId = static_cast<int32_t>(packet.GetMsgId());
232c29fa5a6Sopenharmony_ci    auto it = handles_.find(messageId);
233c29fa5a6Sopenharmony_ci    if (it != handles_.end()) {
234c29fa5a6Sopenharmony_ci        (it->second)(networkId, packet);
235c29fa5a6Sopenharmony_ci        return true;
236c29fa5a6Sopenharmony_ci    }
237c29fa5a6Sopenharmony_ci    FI_HILOGD("Unsupported messageId: %{public}d from %{public}s", messageId,
238c29fa5a6Sopenharmony_ci        Utility::Anonymize(networkId).c_str());
239c29fa5a6Sopenharmony_ci    return false;
240c29fa5a6Sopenharmony_ci}
241c29fa5a6Sopenharmony_ci
242c29fa5a6Sopenharmony_civoid DSoftbusHandler::SendEvent(const CooperateEvent &event)
243c29fa5a6Sopenharmony_ci{
244c29fa5a6Sopenharmony_ci    std::lock_guard guard(lock_);
245c29fa5a6Sopenharmony_ci    auto ret = sender_.Send(event);
246c29fa5a6Sopenharmony_ci    if (ret != Channel<CooperateEvent>::NO_ERROR) {
247c29fa5a6Sopenharmony_ci        FI_HILOGE("Failed to send event via channel, error:%{public}d", ret);
248c29fa5a6Sopenharmony_ci    }
249c29fa5a6Sopenharmony_ci}
250c29fa5a6Sopenharmony_ci
251c29fa5a6Sopenharmony_civoid DSoftbusHandler::OnCommunicationFailure(const std::string &networkId)
252c29fa5a6Sopenharmony_ci{
253c29fa5a6Sopenharmony_ci    env_->GetDSoftbus().CloseSession(networkId);
254c29fa5a6Sopenharmony_ci    FI_HILOGI("Notify communication failure with peer(%{public}s)", Utility::Anonymize(networkId).c_str());
255c29fa5a6Sopenharmony_ci    SendEvent(CooperateEvent(
256c29fa5a6Sopenharmony_ci        CooperateEventType::DSOFTBUS_SESSION_CLOSED,
257c29fa5a6Sopenharmony_ci        DSoftbusSessionClosed {
258c29fa5a6Sopenharmony_ci            .networkId = networkId
259c29fa5a6Sopenharmony_ci        }));
260c29fa5a6Sopenharmony_ci}
261c29fa5a6Sopenharmony_ci
262c29fa5a6Sopenharmony_civoid DSoftbusHandler::OnStartCooperate(const std::string &networkId, NetPacket &packet)
263c29fa5a6Sopenharmony_ci{
264c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
265c29fa5a6Sopenharmony_ci    DSoftbusStartCooperate event {
266c29fa5a6Sopenharmony_ci        .networkId = networkId,
267c29fa5a6Sopenharmony_ci    };
268c29fa5a6Sopenharmony_ci    packet >> event.originNetworkId >> event.cursorPos.x
269c29fa5a6Sopenharmony_ci        >> event.cursorPos.y >> event.success;
270c29fa5a6Sopenharmony_ci    if (packet.ChkRWError()) {
271c29fa5a6Sopenharmony_ci        FI_HILOGE("Failed to read data packet");
272c29fa5a6Sopenharmony_ci        return;
273c29fa5a6Sopenharmony_ci    }
274c29fa5a6Sopenharmony_ci    packet >> event.extra.priv;
275c29fa5a6Sopenharmony_ci    if (packet.ChkRWError()) {
276c29fa5a6Sopenharmony_ci        event.extra.priv = 0;
277c29fa5a6Sopenharmony_ci    }
278c29fa5a6Sopenharmony_ci    SendEvent(CooperateEvent(
279c29fa5a6Sopenharmony_ci        CooperateEventType::DSOFTBUS_START_COOPERATE,
280c29fa5a6Sopenharmony_ci        event));
281c29fa5a6Sopenharmony_ci}
282c29fa5a6Sopenharmony_ci
283c29fa5a6Sopenharmony_civoid DSoftbusHandler::OnStopCooperate(const std::string &networkId, NetPacket &packet)
284c29fa5a6Sopenharmony_ci{
285c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
286c29fa5a6Sopenharmony_ci    DSoftbusStopCooperate event {
287c29fa5a6Sopenharmony_ci        .networkId = networkId,
288c29fa5a6Sopenharmony_ci        .normal = true,
289c29fa5a6Sopenharmony_ci    };
290c29fa5a6Sopenharmony_ci    SendEvent(CooperateEvent(
291c29fa5a6Sopenharmony_ci        CooperateEventType::DSOFTBUS_STOP_COOPERATE,
292c29fa5a6Sopenharmony_ci        event));
293c29fa5a6Sopenharmony_ci}
294c29fa5a6Sopenharmony_ci
295c29fa5a6Sopenharmony_civoid DSoftbusHandler::OnComeBack(const std::string &networkId, NetPacket &packet)
296c29fa5a6Sopenharmony_ci{
297c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
298c29fa5a6Sopenharmony_ci    DSoftbusComeBack event {
299c29fa5a6Sopenharmony_ci        .networkId = networkId,
300c29fa5a6Sopenharmony_ci        .success = true,
301c29fa5a6Sopenharmony_ci    };
302c29fa5a6Sopenharmony_ci    packet >> event.originNetworkId >> event.cursorPos.x >> event.cursorPos.y;
303c29fa5a6Sopenharmony_ci    if (packet.ChkRWError()) {
304c29fa5a6Sopenharmony_ci        FI_HILOGE("Failed to read data packet");
305c29fa5a6Sopenharmony_ci        return;
306c29fa5a6Sopenharmony_ci    }
307c29fa5a6Sopenharmony_ci    packet >> event.extra.priv;
308c29fa5a6Sopenharmony_ci    if (packet.ChkRWError()) {
309c29fa5a6Sopenharmony_ci        event.extra.priv = 0;
310c29fa5a6Sopenharmony_ci    }
311c29fa5a6Sopenharmony_ci    SendEvent(CooperateEvent(
312c29fa5a6Sopenharmony_ci        CooperateEventType::DSOFTBUS_COME_BACK,
313c29fa5a6Sopenharmony_ci        event));
314c29fa5a6Sopenharmony_ci}
315c29fa5a6Sopenharmony_ci
316c29fa5a6Sopenharmony_civoid DSoftbusHandler::OnRelayCooperate(const std::string &networkId, NetPacket &packet)
317c29fa5a6Sopenharmony_ci{
318c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
319c29fa5a6Sopenharmony_ci    DSoftbusRelayCooperate event {
320c29fa5a6Sopenharmony_ci        .networkId = networkId,
321c29fa5a6Sopenharmony_ci        .normal = true,
322c29fa5a6Sopenharmony_ci    };
323c29fa5a6Sopenharmony_ci    packet >> event.targetNetworkId;
324c29fa5a6Sopenharmony_ci    if (packet.ChkRWError()) {
325c29fa5a6Sopenharmony_ci        FI_HILOGE("Failed to read data packet");
326c29fa5a6Sopenharmony_ci        return;
327c29fa5a6Sopenharmony_ci    }
328c29fa5a6Sopenharmony_ci    SendEvent(CooperateEvent(
329c29fa5a6Sopenharmony_ci        CooperateEventType::DSOFTBUS_RELAY_COOPERATE,
330c29fa5a6Sopenharmony_ci        event));
331c29fa5a6Sopenharmony_ci}
332c29fa5a6Sopenharmony_ci
333c29fa5a6Sopenharmony_civoid DSoftbusHandler::OnRelayCooperateFinish(const std::string &networkId, NetPacket &packet)
334c29fa5a6Sopenharmony_ci{
335c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
336c29fa5a6Sopenharmony_ci    DSoftbusRelayCooperate event {
337c29fa5a6Sopenharmony_ci        .networkId = networkId,
338c29fa5a6Sopenharmony_ci    };
339c29fa5a6Sopenharmony_ci    packet >> event.targetNetworkId >> event.normal;
340c29fa5a6Sopenharmony_ci    if (packet.ChkRWError()) {
341c29fa5a6Sopenharmony_ci        FI_HILOGE("Failed to read data packet");
342c29fa5a6Sopenharmony_ci        return;
343c29fa5a6Sopenharmony_ci    }
344c29fa5a6Sopenharmony_ci    SendEvent(CooperateEvent(
345c29fa5a6Sopenharmony_ci        CooperateEventType::DSOFTBUS_RELAY_COOPERATE_FINISHED,
346c29fa5a6Sopenharmony_ci        event));
347c29fa5a6Sopenharmony_ci}
348c29fa5a6Sopenharmony_ci
349c29fa5a6Sopenharmony_civoid DSoftbusHandler::OnSubscribeMouseLocation(const std::string &networKId, NetPacket &packet)
350c29fa5a6Sopenharmony_ci{
351c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
352c29fa5a6Sopenharmony_ci    DSoftbusSubscribeMouseLocation event;
353c29fa5a6Sopenharmony_ci    packet >> event.networkId >> event.remoteNetworkId;
354c29fa5a6Sopenharmony_ci    if (packet.ChkRWError()) {
355c29fa5a6Sopenharmony_ci        FI_HILOGE("Failed to read data packet");
356c29fa5a6Sopenharmony_ci        return;
357c29fa5a6Sopenharmony_ci    }
358c29fa5a6Sopenharmony_ci    SendEvent(CooperateEvent(
359c29fa5a6Sopenharmony_ci        CooperateEventType::DSOFTBUS_SUBSCRIBE_MOUSE_LOCATION,
360c29fa5a6Sopenharmony_ci        event));
361c29fa5a6Sopenharmony_ci}
362c29fa5a6Sopenharmony_ci
363c29fa5a6Sopenharmony_civoid DSoftbusHandler::OnUnSubscribeMouseLocation(const std::string& networKId, NetPacket &packet)
364c29fa5a6Sopenharmony_ci{
365c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
366c29fa5a6Sopenharmony_ci    DSoftbusUnSubscribeMouseLocation event;
367c29fa5a6Sopenharmony_ci    packet >> event.networkId >> event.remoteNetworkId;
368c29fa5a6Sopenharmony_ci    if (packet.ChkRWError()) {
369c29fa5a6Sopenharmony_ci        FI_HILOGE("Failed to read data packet");
370c29fa5a6Sopenharmony_ci        return;
371c29fa5a6Sopenharmony_ci    }
372c29fa5a6Sopenharmony_ci    SendEvent(CooperateEvent(
373c29fa5a6Sopenharmony_ci        CooperateEventType::DSOFTBUS_UNSUBSCRIBE_MOUSE_LOCATION,
374c29fa5a6Sopenharmony_ci        event));
375c29fa5a6Sopenharmony_ci}
376c29fa5a6Sopenharmony_ci
377c29fa5a6Sopenharmony_civoid DSoftbusHandler::OnReplySubscribeLocation(const std::string& networKId, NetPacket &packet)
378c29fa5a6Sopenharmony_ci{
379c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
380c29fa5a6Sopenharmony_ci    DSoftbusReplySubscribeMouseLocation event;
381c29fa5a6Sopenharmony_ci    packet >> event.networkId >> event.remoteNetworkId >> event.result;
382c29fa5a6Sopenharmony_ci    if (packet.ChkRWError()) {
383c29fa5a6Sopenharmony_ci        FI_HILOGE("Failed to read data packet");
384c29fa5a6Sopenharmony_ci        return;
385c29fa5a6Sopenharmony_ci    }
386c29fa5a6Sopenharmony_ci    SendEvent(CooperateEvent(
387c29fa5a6Sopenharmony_ci        CooperateEventType::DSOFTBUS_REPLY_SUBSCRIBE_MOUSE_LOCATION,
388c29fa5a6Sopenharmony_ci        event));
389c29fa5a6Sopenharmony_ci}
390c29fa5a6Sopenharmony_ci
391c29fa5a6Sopenharmony_civoid DSoftbusHandler::OnReplyUnSubscribeLocation(const std::string& networKId, NetPacket &packet)
392c29fa5a6Sopenharmony_ci{
393c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
394c29fa5a6Sopenharmony_ci    DSoftbusReplyUnSubscribeMouseLocation event;
395c29fa5a6Sopenharmony_ci    packet >> event.networkId >> event.remoteNetworkId >> event.result;
396c29fa5a6Sopenharmony_ci    if (packet.ChkRWError()) {
397c29fa5a6Sopenharmony_ci        FI_HILOGE("Failed to read data packet");
398c29fa5a6Sopenharmony_ci        return;
399c29fa5a6Sopenharmony_ci    }
400c29fa5a6Sopenharmony_ci    SendEvent(CooperateEvent(
401c29fa5a6Sopenharmony_ci        CooperateEventType::DSOFTBUS_REPLY_UNSUBSCRIBE_MOUSE_LOCATION,
402c29fa5a6Sopenharmony_ci        event));
403c29fa5a6Sopenharmony_ci}
404c29fa5a6Sopenharmony_ci
405c29fa5a6Sopenharmony_civoid DSoftbusHandler::OnRemoteMouseLocation(const std::string& networKId, NetPacket &packet)
406c29fa5a6Sopenharmony_ci{
407c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
408c29fa5a6Sopenharmony_ci    DSoftbusSyncMouseLocation event;
409c29fa5a6Sopenharmony_ci    packet >> event.networkId >> event.remoteNetworkId >> event.mouseLocation.displayX >>
410c29fa5a6Sopenharmony_ci        event.mouseLocation.displayY >> event.mouseLocation.displayWidth >> event.mouseLocation.displayHeight;
411c29fa5a6Sopenharmony_ci    if (packet.ChkRWError()) {
412c29fa5a6Sopenharmony_ci        FI_HILOGE("Failed to read data packet");
413c29fa5a6Sopenharmony_ci        return;
414c29fa5a6Sopenharmony_ci    }
415c29fa5a6Sopenharmony_ci    SendEvent(CooperateEvent(
416c29fa5a6Sopenharmony_ci        CooperateEventType::DSOFTBUS_MOUSE_LOCATION,
417c29fa5a6Sopenharmony_ci        event));
418c29fa5a6Sopenharmony_ci}
419c29fa5a6Sopenharmony_ci
420c29fa5a6Sopenharmony_civoid DSoftbusHandler::OnRemoteInputDevice(const std::string& networkId, NetPacket &packet)
421c29fa5a6Sopenharmony_ci{
422c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
423c29fa5a6Sopenharmony_ci    DSoftbusSyncInputDevice event;
424c29fa5a6Sopenharmony_ci    int32_t devNum { -1 };
425c29fa5a6Sopenharmony_ci    packet >> devNum;
426c29fa5a6Sopenharmony_ci    event.networkId = networkId;
427c29fa5a6Sopenharmony_ci    FI_HILOGI("devNum:%{public}d", devNum);
428c29fa5a6Sopenharmony_ci    if (devNum <= 0 || devNum >= MAX_INPUT_DEV_NUM) {
429c29fa5a6Sopenharmony_ci        FI_HILOGE("Invalid devNum:%{public}d", devNum);
430c29fa5a6Sopenharmony_ci        return;
431c29fa5a6Sopenharmony_ci    }
432c29fa5a6Sopenharmony_ci    for (int32_t i = 0; i < devNum; i++) {
433c29fa5a6Sopenharmony_ci        auto device = std::make_shared<Device>(INVALID_DEVICE_ID);
434c29fa5a6Sopenharmony_ci        if (DeserializeDevice(device, packet) != RET_OK) {
435c29fa5a6Sopenharmony_ci            FI_HILOGE("DeserializeDevice failed");
436c29fa5a6Sopenharmony_ci            return;
437c29fa5a6Sopenharmony_ci        }
438c29fa5a6Sopenharmony_ci        event.devices.push_back(device);
439c29fa5a6Sopenharmony_ci    }
440c29fa5a6Sopenharmony_ci    SendEvent(CooperateEvent(
441c29fa5a6Sopenharmony_ci        CooperateEventType::DSOFTBUS_INPUT_DEV_SYNC,
442c29fa5a6Sopenharmony_ci        event));
443c29fa5a6Sopenharmony_ci}
444c29fa5a6Sopenharmony_ci
445c29fa5a6Sopenharmony_civoid DSoftbusHandler::OnRemoteHotPlug(const std::string &networkId, NetPacket &packet)
446c29fa5a6Sopenharmony_ci{
447c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
448c29fa5a6Sopenharmony_ci    DSoftbusHotPlugEvent event;
449c29fa5a6Sopenharmony_ci    packet >> event.type;
450c29fa5a6Sopenharmony_ci    FI_HILOGI("Hot plug type:%{public}d", event.type);
451c29fa5a6Sopenharmony_ci    auto device = std::make_shared<Device>(INVALID_DEVICE_ID);
452c29fa5a6Sopenharmony_ci    if (DeserializeDevice(device, packet) != RET_OK) {
453c29fa5a6Sopenharmony_ci        FI_HILOGE("DeserializeDevice failed");
454c29fa5a6Sopenharmony_ci        return;
455c29fa5a6Sopenharmony_ci    }
456c29fa5a6Sopenharmony_ci    event.device = device;
457c29fa5a6Sopenharmony_ci    SendEvent(CooperateEvent(
458c29fa5a6Sopenharmony_ci        CooperateEventType::DSOFTBUS_INPUT_DEV_HOT_PLUG,
459c29fa5a6Sopenharmony_ci        event));
460c29fa5a6Sopenharmony_ci}
461c29fa5a6Sopenharmony_ci
462c29fa5a6Sopenharmony_ciint32_t DSoftbusHandler::DeserializeDevice(std::shared_ptr<IDevice> device, NetPacket &packet)
463c29fa5a6Sopenharmony_ci{
464c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
465c29fa5a6Sopenharmony_ci    CHKPR(device, RET_ERR);
466c29fa5a6Sopenharmony_ci    int32_t data;
467c29fa5a6Sopenharmony_ci    std::string str;
468c29fa5a6Sopenharmony_ci    packet >> data;
469c29fa5a6Sopenharmony_ci    device->SetId(data);
470c29fa5a6Sopenharmony_ci    packet >> str;
471c29fa5a6Sopenharmony_ci    device->SetDevPath(str);
472c29fa5a6Sopenharmony_ci    packet >> str;
473c29fa5a6Sopenharmony_ci    device->SetSysPath(str);
474c29fa5a6Sopenharmony_ci    packet >> data;
475c29fa5a6Sopenharmony_ci    device->SetBus(data);
476c29fa5a6Sopenharmony_ci    packet >> data;
477c29fa5a6Sopenharmony_ci    device->SetVendor(data);
478c29fa5a6Sopenharmony_ci    packet >> data;
479c29fa5a6Sopenharmony_ci    device->SetProduct(data);
480c29fa5a6Sopenharmony_ci    packet >> data;
481c29fa5a6Sopenharmony_ci    device->SetVersion(data);
482c29fa5a6Sopenharmony_ci    packet >> str;
483c29fa5a6Sopenharmony_ci    device->SetName(str);
484c29fa5a6Sopenharmony_ci    packet >> str;
485c29fa5a6Sopenharmony_ci    device->SetPhys(str);
486c29fa5a6Sopenharmony_ci    packet >> str;
487c29fa5a6Sopenharmony_ci    device->SetUniq(str);
488c29fa5a6Sopenharmony_ci    bool isPointerDevice { false };
489c29fa5a6Sopenharmony_ci    packet >> isPointerDevice;
490c29fa5a6Sopenharmony_ci    if (isPointerDevice) {
491c29fa5a6Sopenharmony_ci        device->AddCapability(IDevice::Capability::DEVICE_CAP_POINTER);
492c29fa5a6Sopenharmony_ci    }
493c29fa5a6Sopenharmony_ci    bool isKeyboard { false };
494c29fa5a6Sopenharmony_ci    packet >> isKeyboard;
495c29fa5a6Sopenharmony_ci    if (isKeyboard) {
496c29fa5a6Sopenharmony_ci        device->AddCapability(IDevice::Capability::DEVICE_CAP_KEYBOARD);
497c29fa5a6Sopenharmony_ci    }
498c29fa5a6Sopenharmony_ci    int32_t keyboardType { static_cast<int32_t> (IDevice::KeyboardType::KEYBOARD_TYPE_NONE) };
499c29fa5a6Sopenharmony_ci    packet >> keyboardType;
500c29fa5a6Sopenharmony_ci    device->SetKeyboardType(static_cast<IDevice::KeyboardType>(keyboardType));
501c29fa5a6Sopenharmony_ci    if (packet.ChkRWError()) {
502c29fa5a6Sopenharmony_ci        FI_HILOGE("Packet read type failed");
503c29fa5a6Sopenharmony_ci        return RET_ERR;
504c29fa5a6Sopenharmony_ci    }
505c29fa5a6Sopenharmony_ci    return RET_OK;
506c29fa5a6Sopenharmony_ci}
507c29fa5a6Sopenharmony_ci} // namespace Cooperate
508c29fa5a6Sopenharmony_ci} // namespace DeviceStatus
509c29fa5a6Sopenharmony_ci} // namespace Msdp
510c29fa5a6Sopenharmony_ci} // namespace OHOS
511