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