1c29fa5a6Sopenharmony_ci/* 2c29fa5a6Sopenharmony_ci * Copyright (c) 2023-2024 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 "cooperate_client.h" 17c29fa5a6Sopenharmony_ci 18c29fa5a6Sopenharmony_ci#ifdef ENABLE_PERFORMANCE_CHECK 19c29fa5a6Sopenharmony_ci#include <algorithm> 20c29fa5a6Sopenharmony_ci#include <numeric> 21c29fa5a6Sopenharmony_ci#endif // ENABLE_PERFORMANCE_CHECK 22c29fa5a6Sopenharmony_ci 23c29fa5a6Sopenharmony_ci#include "cooperate_hisysevent.h" 24c29fa5a6Sopenharmony_ci#include "cooperate_params.h" 25c29fa5a6Sopenharmony_ci#include "default_params.h" 26c29fa5a6Sopenharmony_ci#include "devicestatus_define.h" 27c29fa5a6Sopenharmony_ci#include "utility.h" 28c29fa5a6Sopenharmony_ci 29c29fa5a6Sopenharmony_ci#undef LOG_TAG 30c29fa5a6Sopenharmony_ci#define LOG_TAG "CooperateClient" 31c29fa5a6Sopenharmony_ci 32c29fa5a6Sopenharmony_cinamespace OHOS { 33c29fa5a6Sopenharmony_cinamespace Msdp { 34c29fa5a6Sopenharmony_cinamespace DeviceStatus { 35c29fa5a6Sopenharmony_cinamespace { 36c29fa5a6Sopenharmony_ci#ifdef ENABLE_PERFORMANCE_CHECK 37c29fa5a6Sopenharmony_ciconstexpr int32_t PERCENTAGE { 100 }; 38c29fa5a6Sopenharmony_ciconstexpr int32_t FAILURE_DURATION { -100 }; 39c29fa5a6Sopenharmony_ciconstexpr int32_t INVALID_INDEX { -1 }; 40c29fa5a6Sopenharmony_ci#endif // ENABLE_PERFORMANCE_CHECK 41c29fa5a6Sopenharmony_ci} // namespace 42c29fa5a6Sopenharmony_ci 43c29fa5a6Sopenharmony_ciint32_t CooperateClient::RegisterListener(ITunnelClient &tunnel, 44c29fa5a6Sopenharmony_ci CooperateListenerPtr listener, bool isCheckPermission) 45c29fa5a6Sopenharmony_ci{ 46c29fa5a6Sopenharmony_ci CALL_DEBUG_ENTER; 47c29fa5a6Sopenharmony_ci CHKPR(listener, RET_ERR); 48c29fa5a6Sopenharmony_ci std::lock_guard<std::mutex> guard(mtx_); 49c29fa5a6Sopenharmony_ci for (const auto &item : devCooperateListener_) { 50c29fa5a6Sopenharmony_ci if (item == listener) { 51c29fa5a6Sopenharmony_ci FI_HILOGE("The listener already exists"); 52c29fa5a6Sopenharmony_ci return RET_ERR; 53c29fa5a6Sopenharmony_ci } 54c29fa5a6Sopenharmony_ci } 55c29fa5a6Sopenharmony_ci if (!isListeningProcess_) { 56c29fa5a6Sopenharmony_ci FI_HILOGI("Start monitoring"); 57c29fa5a6Sopenharmony_ci DefaultParam param; 58c29fa5a6Sopenharmony_ci DefaultReply reply; 59c29fa5a6Sopenharmony_ci 60c29fa5a6Sopenharmony_ci int32_t ret = tunnel.AddWatch(Intention::COOPERATE, CooperateRequestID::REGISTER_LISTENER, param, reply); 61c29fa5a6Sopenharmony_ci if (ret != RET_OK) { 62c29fa5a6Sopenharmony_ci FI_HILOGE("Failed to register, ret:%{public}d", ret); 63c29fa5a6Sopenharmony_ci return ret; 64c29fa5a6Sopenharmony_ci } 65c29fa5a6Sopenharmony_ci isListeningProcess_ = true; 66c29fa5a6Sopenharmony_ci } 67c29fa5a6Sopenharmony_ci devCooperateListener_.push_back(listener); 68c29fa5a6Sopenharmony_ci return RET_OK; 69c29fa5a6Sopenharmony_ci} 70c29fa5a6Sopenharmony_ci 71c29fa5a6Sopenharmony_ciint32_t CooperateClient::UnregisterListener(ITunnelClient &tunnel, 72c29fa5a6Sopenharmony_ci CooperateListenerPtr listener, bool isCheckPermission) 73c29fa5a6Sopenharmony_ci{ 74c29fa5a6Sopenharmony_ci CALL_DEBUG_ENTER; 75c29fa5a6Sopenharmony_ci std::lock_guard<std::mutex> guard(mtx_); 76c29fa5a6Sopenharmony_ci if (listener == nullptr) { 77c29fa5a6Sopenharmony_ci devCooperateListener_.clear(); 78c29fa5a6Sopenharmony_ci goto listenerLabel; 79c29fa5a6Sopenharmony_ci } 80c29fa5a6Sopenharmony_ci for (auto it = devCooperateListener_.begin(); it != devCooperateListener_.end(); ++it) { 81c29fa5a6Sopenharmony_ci if (*it == listener) { 82c29fa5a6Sopenharmony_ci devCooperateListener_.erase(it); 83c29fa5a6Sopenharmony_ci goto listenerLabel; 84c29fa5a6Sopenharmony_ci } 85c29fa5a6Sopenharmony_ci } 86c29fa5a6Sopenharmony_ci 87c29fa5a6Sopenharmony_cilistenerLabel: 88c29fa5a6Sopenharmony_ci if (isListeningProcess_ && devCooperateListener_.empty()) { 89c29fa5a6Sopenharmony_ci isListeningProcess_ = false; 90c29fa5a6Sopenharmony_ci DefaultParam param; 91c29fa5a6Sopenharmony_ci DefaultReply reply; 92c29fa5a6Sopenharmony_ci return tunnel.RemoveWatch(Intention::COOPERATE, CooperateRequestID::UNREGISTER_LISTENER, param, reply); 93c29fa5a6Sopenharmony_ci } 94c29fa5a6Sopenharmony_ci return RET_OK; 95c29fa5a6Sopenharmony_ci} 96c29fa5a6Sopenharmony_ci 97c29fa5a6Sopenharmony_ciint32_t CooperateClient::Enable(ITunnelClient &tunnel, 98c29fa5a6Sopenharmony_ci CooperateMessageCallback callback, bool isCheckPermission) 99c29fa5a6Sopenharmony_ci{ 100c29fa5a6Sopenharmony_ci CALL_DEBUG_ENTER; 101c29fa5a6Sopenharmony_ci std::lock_guard<std::mutex> guard(mtx_); 102c29fa5a6Sopenharmony_ci CooperateEvent event { callback }; 103c29fa5a6Sopenharmony_ci DefaultParam param { GenerateRequestID() }; 104c29fa5a6Sopenharmony_ci DefaultReply reply; 105c29fa5a6Sopenharmony_ci 106c29fa5a6Sopenharmony_ci int32_t ret = tunnel.Enable(Intention::COOPERATE, param, reply); 107c29fa5a6Sopenharmony_ci if (ret != RET_OK) { 108c29fa5a6Sopenharmony_ci FI_HILOGE("Prepare cooperate failed"); 109c29fa5a6Sopenharmony_ci return ret; 110c29fa5a6Sopenharmony_ci } 111c29fa5a6Sopenharmony_ci devCooperateEvent_.insert_or_assign(param.userData, event); 112c29fa5a6Sopenharmony_ci return RET_OK; 113c29fa5a6Sopenharmony_ci} 114c29fa5a6Sopenharmony_ci 115c29fa5a6Sopenharmony_ciint32_t CooperateClient::Disable(ITunnelClient &tunnel, 116c29fa5a6Sopenharmony_ci CooperateMessageCallback callback, bool isCheckPermission) 117c29fa5a6Sopenharmony_ci{ 118c29fa5a6Sopenharmony_ci CALL_DEBUG_ENTER; 119c29fa5a6Sopenharmony_ci std::lock_guard<std::mutex> guard(mtx_); 120c29fa5a6Sopenharmony_ci CooperateEvent event { callback }; 121c29fa5a6Sopenharmony_ci DefaultParam param { GenerateRequestID() }; 122c29fa5a6Sopenharmony_ci DefaultReply reply; 123c29fa5a6Sopenharmony_ci 124c29fa5a6Sopenharmony_ci int32_t ret = tunnel.Disable(Intention::COOPERATE, param, reply); 125c29fa5a6Sopenharmony_ci if (ret != RET_OK) { 126c29fa5a6Sopenharmony_ci FI_HILOGE("Unprepare cooperate failed"); 127c29fa5a6Sopenharmony_ci return ret; 128c29fa5a6Sopenharmony_ci } 129c29fa5a6Sopenharmony_ci devCooperateEvent_.insert_or_assign(param.userData, event); 130c29fa5a6Sopenharmony_ci#ifdef ENABLE_PERFORMANCE_CHECK 131c29fa5a6Sopenharmony_ci DumpPerformanceInfo(); 132c29fa5a6Sopenharmony_ci#endif // ENABLE_PERFORMANCE_CHECK 133c29fa5a6Sopenharmony_ci return RET_OK; 134c29fa5a6Sopenharmony_ci} 135c29fa5a6Sopenharmony_ci 136c29fa5a6Sopenharmony_ciint32_t CooperateClient::Start(ITunnelClient &tunnel, const std::string &remoteNetworkId, 137c29fa5a6Sopenharmony_ci int32_t startDeviceId, CooperateMessageCallback callback, bool isCheckPermission) 138c29fa5a6Sopenharmony_ci{ 139c29fa5a6Sopenharmony_ci CALL_DEBUG_ENTER; 140c29fa5a6Sopenharmony_ci std::lock_guard<std::mutex> guard(mtx_); 141c29fa5a6Sopenharmony_ci CooperateEvent event { callback }; 142c29fa5a6Sopenharmony_ci auto userData = GenerateRequestID(); 143c29fa5a6Sopenharmony_ci#ifdef ENABLE_PERFORMANCE_CHECK 144c29fa5a6Sopenharmony_ci StartTrace(userData); 145c29fa5a6Sopenharmony_ci#endif // ENABLE_PERFORMANCE_CHECK 146c29fa5a6Sopenharmony_ci StartCooperateParam param { userData, remoteNetworkId, startDeviceId, isCheckPermission }; 147c29fa5a6Sopenharmony_ci DefaultReply reply; 148c29fa5a6Sopenharmony_ci 149c29fa5a6Sopenharmony_ci int32_t ret = tunnel.Start(Intention::COOPERATE, param, reply); 150c29fa5a6Sopenharmony_ci if (ret != RET_OK) { 151c29fa5a6Sopenharmony_ci CooperateDFX::WriteStart(OHOS::HiviewDFX::HiSysEvent::EventType::FAULT); 152c29fa5a6Sopenharmony_ci FI_HILOGE("Activate cooperate failed"); 153c29fa5a6Sopenharmony_ci return ret; 154c29fa5a6Sopenharmony_ci } 155c29fa5a6Sopenharmony_ci devCooperateEvent_.insert_or_assign(param.userData, event); 156c29fa5a6Sopenharmony_ci CooperateDFX::WriteStart(OHOS::HiviewDFX::HiSysEvent::EventType::BEHAVIOR); 157c29fa5a6Sopenharmony_ci return RET_OK; 158c29fa5a6Sopenharmony_ci} 159c29fa5a6Sopenharmony_ci 160c29fa5a6Sopenharmony_ciint32_t CooperateClient::Stop(ITunnelClient &tunnel, 161c29fa5a6Sopenharmony_ci bool isUnchained, CooperateMessageCallback callback, bool isCheckPermission) 162c29fa5a6Sopenharmony_ci{ 163c29fa5a6Sopenharmony_ci CALL_DEBUG_ENTER; 164c29fa5a6Sopenharmony_ci std::lock_guard<std::mutex> guard(mtx_); 165c29fa5a6Sopenharmony_ci CooperateEvent event { callback }; 166c29fa5a6Sopenharmony_ci StopCooperateParam param { GenerateRequestID(), isUnchained, isCheckPermission }; 167c29fa5a6Sopenharmony_ci DefaultReply reply; 168c29fa5a6Sopenharmony_ci 169c29fa5a6Sopenharmony_ci int32_t ret = tunnel.Stop(Intention::COOPERATE, param, reply); 170c29fa5a6Sopenharmony_ci if (ret != RET_OK) { 171c29fa5a6Sopenharmony_ci CooperateDFX::WriteStop(OHOS::HiviewDFX::HiSysEvent::EventType::FAULT); 172c29fa5a6Sopenharmony_ci FI_HILOGE("Deactivate cooperate failed"); 173c29fa5a6Sopenharmony_ci return ret; 174c29fa5a6Sopenharmony_ci } 175c29fa5a6Sopenharmony_ci CooperateDFX::WriteStop(OHOS::HiviewDFX::HiSysEvent::EventType::BEHAVIOR); 176c29fa5a6Sopenharmony_ci devCooperateEvent_.insert_or_assign(param.userData, event); 177c29fa5a6Sopenharmony_ci return RET_OK; 178c29fa5a6Sopenharmony_ci} 179c29fa5a6Sopenharmony_ci 180c29fa5a6Sopenharmony_ciint32_t CooperateClient::GetCooperateState(ITunnelClient &tunnel, 181c29fa5a6Sopenharmony_ci const std::string &networkId, CooperateStateCallback callback, bool isCheckPermission) 182c29fa5a6Sopenharmony_ci{ 183c29fa5a6Sopenharmony_ci CALL_DEBUG_ENTER; 184c29fa5a6Sopenharmony_ci std::lock_guard<std::mutex> guard(mtx_); 185c29fa5a6Sopenharmony_ci CooperateEvent event { callback }; 186c29fa5a6Sopenharmony_ci GetCooperateStateParam param { GenerateRequestID(), networkId, isCheckPermission }; 187c29fa5a6Sopenharmony_ci DefaultReply reply; 188c29fa5a6Sopenharmony_ci 189c29fa5a6Sopenharmony_ci int32_t ret = tunnel.GetParam(Intention::COOPERATE, CooperateRequestID::GET_COOPERATE_STATE, param, reply); 190c29fa5a6Sopenharmony_ci if (ret != RET_OK) { 191c29fa5a6Sopenharmony_ci FI_HILOGE("Get cooperate state failed"); 192c29fa5a6Sopenharmony_ci return ret; 193c29fa5a6Sopenharmony_ci } 194c29fa5a6Sopenharmony_ci devCooperateEvent_.insert_or_assign(param.userData, event); 195c29fa5a6Sopenharmony_ci return RET_OK; 196c29fa5a6Sopenharmony_ci} 197c29fa5a6Sopenharmony_ci 198c29fa5a6Sopenharmony_ciint32_t CooperateClient::GetCooperateState(ITunnelClient &tunnel, const std::string &udId, bool &state) 199c29fa5a6Sopenharmony_ci{ 200c29fa5a6Sopenharmony_ci CALL_DEBUG_ENTER; 201c29fa5a6Sopenharmony_ci std::lock_guard<std::mutex> guard(mtx_); 202c29fa5a6Sopenharmony_ci GetCooperateStateSyncParam param { udId }; 203c29fa5a6Sopenharmony_ci BooleanReply reply; 204c29fa5a6Sopenharmony_ci if (tunnel.GetParam(Intention::COOPERATE, CooperateRequestID::GET_COOPERATE_STATE_SYNC, param, reply) != RET_OK) { 205c29fa5a6Sopenharmony_ci FI_HILOGE("Get cooperate state failed udId: %{public}s", Utility::Anonymize(udId).c_str()); 206c29fa5a6Sopenharmony_ci return RET_ERR; 207c29fa5a6Sopenharmony_ci } 208c29fa5a6Sopenharmony_ci FI_HILOGI("GetCooperateState for udId: %{public}s successfully,state: %{public}s", 209c29fa5a6Sopenharmony_ci Utility::Anonymize(udId).c_str(), reply.state ? "true" : "false"); 210c29fa5a6Sopenharmony_ci state = reply.state; 211c29fa5a6Sopenharmony_ci return RET_OK; 212c29fa5a6Sopenharmony_ci} 213c29fa5a6Sopenharmony_ci 214c29fa5a6Sopenharmony_ciint32_t CooperateClient::RegisterEventListener(ITunnelClient &tunnel, 215c29fa5a6Sopenharmony_ci const std::string &networkId, MouseLocationListenerPtr listener) 216c29fa5a6Sopenharmony_ci{ 217c29fa5a6Sopenharmony_ci CALL_DEBUG_ENTER; 218c29fa5a6Sopenharmony_ci CHKPR(listener, COMMON_PARAMETER_ERROR); 219c29fa5a6Sopenharmony_ci std::lock_guard<std::mutex> guard(mtx_); 220c29fa5a6Sopenharmony_ci if (eventListener_.find(networkId) != eventListener_.end() && 221c29fa5a6Sopenharmony_ci eventListener_[networkId].find(listener) != eventListener_[networkId].end()) { 222c29fa5a6Sopenharmony_ci FI_HILOGE("This listener for networkId:%{public}s already exists", Utility::Anonymize(networkId).c_str()); 223c29fa5a6Sopenharmony_ci return RET_ERR; 224c29fa5a6Sopenharmony_ci } 225c29fa5a6Sopenharmony_ci RegisterEventListenerParam param { networkId }; 226c29fa5a6Sopenharmony_ci DefaultReply reply; 227c29fa5a6Sopenharmony_ci if (int32_t ret = tunnel.AddWatch(Intention::COOPERATE, CooperateRequestID::REGISTER_EVENT_LISTENER, param, reply); 228c29fa5a6Sopenharmony_ci ret != RET_OK) { 229c29fa5a6Sopenharmony_ci FI_HILOGE("RegisterEventListener failed, ret:%{public}d", ret); 230c29fa5a6Sopenharmony_ci return ret; 231c29fa5a6Sopenharmony_ci } 232c29fa5a6Sopenharmony_ci eventListener_[networkId].insert(listener); 233c29fa5a6Sopenharmony_ci FI_HILOGI("Add listener for networkId:%{public}s successfully", Utility::Anonymize(networkId).c_str()); 234c29fa5a6Sopenharmony_ci return RET_OK; 235c29fa5a6Sopenharmony_ci} 236c29fa5a6Sopenharmony_ci 237c29fa5a6Sopenharmony_ciint32_t CooperateClient::UnregisterEventListener(ITunnelClient &tunnel, 238c29fa5a6Sopenharmony_ci const std::string &networkId, MouseLocationListenerPtr listener) 239c29fa5a6Sopenharmony_ci{ 240c29fa5a6Sopenharmony_ci CALL_DEBUG_ENTER; 241c29fa5a6Sopenharmony_ci std::lock_guard<std::mutex> guard(mtx_); 242c29fa5a6Sopenharmony_ci if (eventListener_.find(networkId) == eventListener_.end()) { 243c29fa5a6Sopenharmony_ci FI_HILOGE("No listener for networkId:%{public}s is registered", Utility::Anonymize(networkId).c_str()); 244c29fa5a6Sopenharmony_ci return RET_ERR; 245c29fa5a6Sopenharmony_ci } 246c29fa5a6Sopenharmony_ci if (eventListener_.find(networkId) != eventListener_.end() && listener != nullptr && 247c29fa5a6Sopenharmony_ci eventListener_[networkId].find(listener) == eventListener_[networkId].end()) { 248c29fa5a6Sopenharmony_ci FI_HILOGE("Current listener for networkId:%{public}s is not registered", Utility::Anonymize(networkId).c_str()); 249c29fa5a6Sopenharmony_ci return RET_ERR; 250c29fa5a6Sopenharmony_ci } 251c29fa5a6Sopenharmony_ci if (listener == nullptr) { 252c29fa5a6Sopenharmony_ci eventListener_.erase(networkId); 253c29fa5a6Sopenharmony_ci FI_HILOGI("Remove all listener for networkId:%{public}s", Utility::Anonymize(networkId).c_str()); 254c29fa5a6Sopenharmony_ci } else { 255c29fa5a6Sopenharmony_ci eventListener_[networkId].erase(listener); 256c29fa5a6Sopenharmony_ci FI_HILOGI("Remove listener for networkId:%{public}s", Utility::Anonymize(networkId).c_str()); 257c29fa5a6Sopenharmony_ci if (eventListener_[networkId].empty()) { 258c29fa5a6Sopenharmony_ci eventListener_.erase(networkId); 259c29fa5a6Sopenharmony_ci FI_HILOGD("No listener for networkId:%{public}s, clean current networkId", 260c29fa5a6Sopenharmony_ci Utility::Anonymize(networkId).c_str()); 261c29fa5a6Sopenharmony_ci } 262c29fa5a6Sopenharmony_ci } 263c29fa5a6Sopenharmony_ci if (eventListener_.find(networkId) != eventListener_.end()) { 264c29fa5a6Sopenharmony_ci FI_HILOGD("UnregisterEventListener for networkId:%{public}s successfully", 265c29fa5a6Sopenharmony_ci Utility::Anonymize(networkId).c_str()); 266c29fa5a6Sopenharmony_ci return RET_OK; 267c29fa5a6Sopenharmony_ci } 268c29fa5a6Sopenharmony_ci UnregisterEventListenerParam param { networkId }; 269c29fa5a6Sopenharmony_ci DefaultReply reply; 270c29fa5a6Sopenharmony_ci if (int32_t ret = tunnel.RemoveWatch(Intention::COOPERATE, 271c29fa5a6Sopenharmony_ci CooperateRequestID::UNREGISTER_EVENT_LISTENER, param, reply); ret != RET_OK) { 272c29fa5a6Sopenharmony_ci FI_HILOGE("UnregisterEventListener failed, ret:%{public}d", ret); 273c29fa5a6Sopenharmony_ci return ret; 274c29fa5a6Sopenharmony_ci } 275c29fa5a6Sopenharmony_ci FI_HILOGD("Unregister all Listener for networkId:%{public}s successfully", Utility::Anonymize(networkId).c_str()); 276c29fa5a6Sopenharmony_ci return RET_OK; 277c29fa5a6Sopenharmony_ci} 278c29fa5a6Sopenharmony_ci 279c29fa5a6Sopenharmony_ciint32_t CooperateClient::AddHotAreaListener(ITunnelClient &tunnel, HotAreaListenerPtr listener) 280c29fa5a6Sopenharmony_ci{ 281c29fa5a6Sopenharmony_ci CALL_DEBUG_ENTER; 282c29fa5a6Sopenharmony_ci CHKPR(listener, RET_ERR); 283c29fa5a6Sopenharmony_ci if (std::find(devHotAreaListener_.begin(), devHotAreaListener_.end(), listener) != devHotAreaListener_.end()) { 284c29fa5a6Sopenharmony_ci FI_HILOGD("Current listener is registered already"); 285c29fa5a6Sopenharmony_ci return RET_ERR; 286c29fa5a6Sopenharmony_ci } 287c29fa5a6Sopenharmony_ci RegisterHotAreaListenerParam param { GenerateRequestID(), false }; 288c29fa5a6Sopenharmony_ci DefaultReply reply; 289c29fa5a6Sopenharmony_ci if (int32_t ret = tunnel.AddWatch(Intention::COOPERATE, 290c29fa5a6Sopenharmony_ci CooperateRequestID::REGISTER_HOTAREA_LISTENER, param, reply); ret != RET_OK) { 291c29fa5a6Sopenharmony_ci FI_HILOGE("AddHotAreaListener failed, ret:%{public}d", ret); 292c29fa5a6Sopenharmony_ci return ret; 293c29fa5a6Sopenharmony_ci } 294c29fa5a6Sopenharmony_ci devHotAreaListener_.push_back(listener); 295c29fa5a6Sopenharmony_ci return RET_OK; 296c29fa5a6Sopenharmony_ci} 297c29fa5a6Sopenharmony_ci 298c29fa5a6Sopenharmony_ciint32_t CooperateClient::RemoveHotAreaListener(ITunnelClient &tunnel, HotAreaListenerPtr listener) 299c29fa5a6Sopenharmony_ci{ 300c29fa5a6Sopenharmony_ci CALL_DEBUG_ENTER; 301c29fa5a6Sopenharmony_ci if (listener != nullptr && 302c29fa5a6Sopenharmony_ci std::find(devHotAreaListener_.begin(), devHotAreaListener_.end(), listener) == devHotAreaListener_.end()) { 303c29fa5a6Sopenharmony_ci FI_HILOGD("Current listener is not registered"); 304c29fa5a6Sopenharmony_ci return RET_ERR; 305c29fa5a6Sopenharmony_ci } 306c29fa5a6Sopenharmony_ci if (listener == nullptr) { 307c29fa5a6Sopenharmony_ci devHotAreaListener_.clear(); 308c29fa5a6Sopenharmony_ci } else { 309c29fa5a6Sopenharmony_ci for (auto it = devHotAreaListener_.begin(); it != devHotAreaListener_.end(); ++it) { 310c29fa5a6Sopenharmony_ci if (*it == listener) { 311c29fa5a6Sopenharmony_ci devHotAreaListener_.erase(it); 312c29fa5a6Sopenharmony_ci } 313c29fa5a6Sopenharmony_ci } 314c29fa5a6Sopenharmony_ci } 315c29fa5a6Sopenharmony_ci if (!devHotAreaListener_.empty()) { 316c29fa5a6Sopenharmony_ci FI_HILOGI("RemoveHotAreaListener successfully"); 317c29fa5a6Sopenharmony_ci return RET_OK; 318c29fa5a6Sopenharmony_ci } 319c29fa5a6Sopenharmony_ci UnregisterHotAreaListenerParam param { GenerateRequestID(), false }; 320c29fa5a6Sopenharmony_ci DefaultReply reply; 321c29fa5a6Sopenharmony_ci if (int32_t ret = tunnel.RemoveWatch(Intention::COOPERATE, 322c29fa5a6Sopenharmony_ci CooperateRequestID::UNREGISTER_HOTAREA_LISTENER, param, reply); ret != RET_OK) { 323c29fa5a6Sopenharmony_ci FI_HILOGE("RemoveHotAreaListener failed, ret:%{public}d", ret); 324c29fa5a6Sopenharmony_ci return ret; 325c29fa5a6Sopenharmony_ci } 326c29fa5a6Sopenharmony_ci FI_HILOGI("Remove all hot area listener successfully"); 327c29fa5a6Sopenharmony_ci return RET_OK; 328c29fa5a6Sopenharmony_ci} 329c29fa5a6Sopenharmony_ci 330c29fa5a6Sopenharmony_ciint32_t CooperateClient::GenerateRequestID() 331c29fa5a6Sopenharmony_ci{ 332c29fa5a6Sopenharmony_ci static int32_t requestId { 0 }; 333c29fa5a6Sopenharmony_ci 334c29fa5a6Sopenharmony_ci if (requestId == std::numeric_limits<int32_t>::max()) { 335c29fa5a6Sopenharmony_ci FI_HILOGE("Request ID exceeds the maximum"); 336c29fa5a6Sopenharmony_ci requestId = 0; 337c29fa5a6Sopenharmony_ci } 338c29fa5a6Sopenharmony_ci return requestId++; 339c29fa5a6Sopenharmony_ci} 340c29fa5a6Sopenharmony_ci 341c29fa5a6Sopenharmony_ciint32_t CooperateClient::OnCoordinationListener(const StreamClient &client, NetPacket &pkt) 342c29fa5a6Sopenharmony_ci{ 343c29fa5a6Sopenharmony_ci CALL_INFO_TRACE; 344c29fa5a6Sopenharmony_ci int32_t userData = 0; 345c29fa5a6Sopenharmony_ci std::string networkId; 346c29fa5a6Sopenharmony_ci int32_t nType = 0; 347c29fa5a6Sopenharmony_ci pkt >> userData >> networkId >> nType; 348c29fa5a6Sopenharmony_ci if (pkt.ChkRWError()) { 349c29fa5a6Sopenharmony_ci FI_HILOGE("Packet read type failed"); 350c29fa5a6Sopenharmony_ci return RET_ERR; 351c29fa5a6Sopenharmony_ci } 352c29fa5a6Sopenharmony_ci FI_HILOGI("NetworkId:%{public}s, nType:%{public}d", Utility::Anonymize(networkId).c_str(), nType); 353c29fa5a6Sopenharmony_ci OnDevCooperateListener(networkId, CoordinationMessage(nType)); 354c29fa5a6Sopenharmony_ci return RET_OK; 355c29fa5a6Sopenharmony_ci} 356c29fa5a6Sopenharmony_ci 357c29fa5a6Sopenharmony_civoid CooperateClient::OnDevCooperateListener(const std::string &networkId, CoordinationMessage msg) 358c29fa5a6Sopenharmony_ci{ 359c29fa5a6Sopenharmony_ci CALL_INFO_TRACE; 360c29fa5a6Sopenharmony_ci std::lock_guard<std::mutex> guard(mtx_); 361c29fa5a6Sopenharmony_ci for (const auto &item : devCooperateListener_) { 362c29fa5a6Sopenharmony_ci item->OnCoordinationMessage(networkId, msg); 363c29fa5a6Sopenharmony_ci } 364c29fa5a6Sopenharmony_ci} 365c29fa5a6Sopenharmony_ci 366c29fa5a6Sopenharmony_ciint32_t CooperateClient::OnCoordinationMessage(const StreamClient &client, NetPacket &pkt) 367c29fa5a6Sopenharmony_ci{ 368c29fa5a6Sopenharmony_ci CALL_INFO_TRACE; 369c29fa5a6Sopenharmony_ci int32_t userData = 0; 370c29fa5a6Sopenharmony_ci std::string networkId; 371c29fa5a6Sopenharmony_ci int32_t nType = 0; 372c29fa5a6Sopenharmony_ci int32_t errCode = -1; 373c29fa5a6Sopenharmony_ci pkt >> userData >> networkId >> nType >> errCode; 374c29fa5a6Sopenharmony_ci if (pkt.ChkRWError()) { 375c29fa5a6Sopenharmony_ci FI_HILOGE("Packet read coordination msg failed"); 376c29fa5a6Sopenharmony_ci return RET_ERR; 377c29fa5a6Sopenharmony_ci } 378c29fa5a6Sopenharmony_ci#ifdef ENABLE_PERFORMANCE_CHECK 379c29fa5a6Sopenharmony_ci FinishTrace(userData, CoordinationMessage(nType)); 380c29fa5a6Sopenharmony_ci#endif // ENABLE_PERFORMANCE_CHECK 381c29fa5a6Sopenharmony_ci FI_HILOGI("NetworkId:%{public}s, nType:%{public}d", Utility::Anonymize(networkId).c_str(), nType); 382c29fa5a6Sopenharmony_ci CoordinationMsgInfo msgInfo { 383c29fa5a6Sopenharmony_ci .msg = static_cast<CoordinationMessage> (nType), 384c29fa5a6Sopenharmony_ci .errCode = errCode 385c29fa5a6Sopenharmony_ci }; 386c29fa5a6Sopenharmony_ci OnCooperateMessageEvent(userData, networkId, msgInfo); 387c29fa5a6Sopenharmony_ci return RET_OK; 388c29fa5a6Sopenharmony_ci} 389c29fa5a6Sopenharmony_ci 390c29fa5a6Sopenharmony_civoid CooperateClient::OnCooperateMessageEvent(int32_t userData, 391c29fa5a6Sopenharmony_ci const std::string &networkId, const CoordinationMsgInfo &msgInfo) 392c29fa5a6Sopenharmony_ci{ 393c29fa5a6Sopenharmony_ci CALL_INFO_TRACE; 394c29fa5a6Sopenharmony_ci CHK_PID_AND_TID(); 395c29fa5a6Sopenharmony_ci std::lock_guard<std::mutex> guard(mtx_); 396c29fa5a6Sopenharmony_ci auto iter = devCooperateEvent_.find(userData); 397c29fa5a6Sopenharmony_ci if (iter == devCooperateEvent_.end()) { 398c29fa5a6Sopenharmony_ci return; 399c29fa5a6Sopenharmony_ci } 400c29fa5a6Sopenharmony_ci CooperateMessageCallback callback = iter->second.msgCb; 401c29fa5a6Sopenharmony_ci CHKPV(callback); 402c29fa5a6Sopenharmony_ci callback(networkId, msgInfo); 403c29fa5a6Sopenharmony_ci devCooperateEvent_.erase(iter); 404c29fa5a6Sopenharmony_ci} 405c29fa5a6Sopenharmony_ci 406c29fa5a6Sopenharmony_ciint32_t CooperateClient::OnCoordinationState(const StreamClient &client, NetPacket &pkt) 407c29fa5a6Sopenharmony_ci{ 408c29fa5a6Sopenharmony_ci CALL_INFO_TRACE; 409c29fa5a6Sopenharmony_ci int32_t userData = 0; 410c29fa5a6Sopenharmony_ci bool state = false; 411c29fa5a6Sopenharmony_ci int32_t errCode = -1; 412c29fa5a6Sopenharmony_ci pkt >> userData >> state >> errCode; 413c29fa5a6Sopenharmony_ci if (pkt.ChkRWError()) { 414c29fa5a6Sopenharmony_ci FI_HILOGE("Packet read coordination msg failed"); 415c29fa5a6Sopenharmony_ci return RET_ERR; 416c29fa5a6Sopenharmony_ci } 417c29fa5a6Sopenharmony_ci FI_HILOGI("State%{public}s", state ? "true" : "false"); 418c29fa5a6Sopenharmony_ci OnCooperateStateEvent(userData, state); 419c29fa5a6Sopenharmony_ci return RET_OK; 420c29fa5a6Sopenharmony_ci} 421c29fa5a6Sopenharmony_ci 422c29fa5a6Sopenharmony_civoid CooperateClient::OnCooperateStateEvent(int32_t userData, bool state) 423c29fa5a6Sopenharmony_ci{ 424c29fa5a6Sopenharmony_ci CALL_INFO_TRACE; 425c29fa5a6Sopenharmony_ci CHK_PID_AND_TID(); 426c29fa5a6Sopenharmony_ci std::lock_guard<std::mutex> guard(mtx_); 427c29fa5a6Sopenharmony_ci auto iter = devCooperateEvent_.find(userData); 428c29fa5a6Sopenharmony_ci if (iter == devCooperateEvent_.end()) { 429c29fa5a6Sopenharmony_ci return; 430c29fa5a6Sopenharmony_ci } 431c29fa5a6Sopenharmony_ci CooperateStateCallback event = iter->second.stateCb; 432c29fa5a6Sopenharmony_ci CHKPV(event); 433c29fa5a6Sopenharmony_ci event(state); 434c29fa5a6Sopenharmony_ci devCooperateEvent_.erase(iter); 435c29fa5a6Sopenharmony_ci FI_HILOGD("Coordination state event callback, userData:%{public}d, state:(%{public}d)", userData, state); 436c29fa5a6Sopenharmony_ci} 437c29fa5a6Sopenharmony_ci 438c29fa5a6Sopenharmony_ciint32_t CooperateClient::OnHotAreaListener(const StreamClient &client, NetPacket &pkt) 439c29fa5a6Sopenharmony_ci{ 440c29fa5a6Sopenharmony_ci CALL_DEBUG_ENTER; 441c29fa5a6Sopenharmony_ci int32_t positionX = 0; 442c29fa5a6Sopenharmony_ci int32_t positionY = 0; 443c29fa5a6Sopenharmony_ci int32_t type = 0; 444c29fa5a6Sopenharmony_ci bool isEdge = false; 445c29fa5a6Sopenharmony_ci pkt >> positionX >> positionY >> type >> isEdge; 446c29fa5a6Sopenharmony_ci if (pkt.ChkRWError()) { 447c29fa5a6Sopenharmony_ci FI_HILOGE("Packet read type failed"); 448c29fa5a6Sopenharmony_ci return RET_ERR; 449c29fa5a6Sopenharmony_ci } 450c29fa5a6Sopenharmony_ci OnDevHotAreaListener(positionX, positionY, HotAreaType(type), isEdge); 451c29fa5a6Sopenharmony_ci return RET_OK; 452c29fa5a6Sopenharmony_ci} 453c29fa5a6Sopenharmony_ci 454c29fa5a6Sopenharmony_ciint32_t CooperateClient::OnMouseLocationListener(const StreamClient &client, NetPacket &pkt) 455c29fa5a6Sopenharmony_ci{ 456c29fa5a6Sopenharmony_ci CALL_DEBUG_ENTER; 457c29fa5a6Sopenharmony_ci std::string networkId; 458c29fa5a6Sopenharmony_ci Event event; 459c29fa5a6Sopenharmony_ci pkt >> networkId >> event.displayX >> event.displayY >> event.displayWidth >> event.displayHeight; 460c29fa5a6Sopenharmony_ci if (pkt.ChkRWError()) { 461c29fa5a6Sopenharmony_ci FI_HILOGE("Packet read type failed"); 462c29fa5a6Sopenharmony_ci return RET_ERR; 463c29fa5a6Sopenharmony_ci } 464c29fa5a6Sopenharmony_ci OnDevMouseLocationListener(networkId, event); 465c29fa5a6Sopenharmony_ci return RET_OK; 466c29fa5a6Sopenharmony_ci} 467c29fa5a6Sopenharmony_ci 468c29fa5a6Sopenharmony_civoid CooperateClient::OnDevHotAreaListener(int32_t displayX, 469c29fa5a6Sopenharmony_ci int32_t displayY, HotAreaType type, bool isEdge) 470c29fa5a6Sopenharmony_ci{ 471c29fa5a6Sopenharmony_ci CALL_DEBUG_ENTER; 472c29fa5a6Sopenharmony_ci std::lock_guard<std::mutex> guard(mtx_); 473c29fa5a6Sopenharmony_ci for (const auto &item : devHotAreaListener_) { 474c29fa5a6Sopenharmony_ci item->OnHotAreaMessage(displayX, displayY, type, isEdge); 475c29fa5a6Sopenharmony_ci } 476c29fa5a6Sopenharmony_ci} 477c29fa5a6Sopenharmony_ci 478c29fa5a6Sopenharmony_civoid CooperateClient::OnDevMouseLocationListener(const std::string &networkId, const Event &event) 479c29fa5a6Sopenharmony_ci{ 480c29fa5a6Sopenharmony_ci CALL_DEBUG_ENTER; 481c29fa5a6Sopenharmony_ci std::lock_guard<std::mutex> guard(mtx_); 482c29fa5a6Sopenharmony_ci if (eventListener_.find(networkId) == eventListener_.end()) { 483c29fa5a6Sopenharmony_ci FI_HILOGI("No listener for networkId:%{public}s is registered", Utility::Anonymize(networkId).c_str()); 484c29fa5a6Sopenharmony_ci return; 485c29fa5a6Sopenharmony_ci } 486c29fa5a6Sopenharmony_ci for (const auto &listener : eventListener_[networkId]) { 487c29fa5a6Sopenharmony_ci CHKPC(listener); 488c29fa5a6Sopenharmony_ci listener->OnMouseLocationEvent(networkId, event); 489c29fa5a6Sopenharmony_ci FI_HILOGD("Trigger listener for networkId:%{public}s," 490c29fa5a6Sopenharmony_ci "displayX:%{public}d, displayY:%{public}d, displayWidth:%{public}d, displayHeight:%{public}d", 491c29fa5a6Sopenharmony_ci Utility::Anonymize(networkId).c_str(), event.displayX, event.displayY, 492c29fa5a6Sopenharmony_ci event.displayWidth, event.displayHeight); 493c29fa5a6Sopenharmony_ci } 494c29fa5a6Sopenharmony_ci} 495c29fa5a6Sopenharmony_ci 496c29fa5a6Sopenharmony_ci#ifdef ENABLE_PERFORMANCE_CHECK 497c29fa5a6Sopenharmony_ciint32_t CooperateClient::GetFirstSuccessIndex() 498c29fa5a6Sopenharmony_ci{ 499c29fa5a6Sopenharmony_ci CALL_DEBUG_ENTER; 500c29fa5a6Sopenharmony_ci size_t durationLen = performanceInfo_.durationList.size(); 501c29fa5a6Sopenharmony_ci for (size_t i = 0; i < durationLen; ++i) { 502c29fa5a6Sopenharmony_ci if (performanceInfo_.durationList[i] != FAILURE_DURATION) { 503c29fa5a6Sopenharmony_ci performanceInfo_.successNum = 1; 504c29fa5a6Sopenharmony_ci FI_HILOGI("[PERF] First success index:%{public}zu", i); 505c29fa5a6Sopenharmony_ci return static_cast<int32_t>(i); 506c29fa5a6Sopenharmony_ci } 507c29fa5a6Sopenharmony_ci } 508c29fa5a6Sopenharmony_ci return INVALID_INDEX; 509c29fa5a6Sopenharmony_ci} 510c29fa5a6Sopenharmony_civoid CooperateClient::StartTrace(int32_t userData) 511c29fa5a6Sopenharmony_ci{ 512c29fa5a6Sopenharmony_ci CALL_DEBUG_ENTER; 513c29fa5a6Sopenharmony_ci std::lock_guard guard { performanceLock_ }; 514c29fa5a6Sopenharmony_ci performanceInfo_.traces_.emplace(userData, std::chrono::steady_clock::now()); 515c29fa5a6Sopenharmony_ci performanceInfo_.activateNum += 1; 516c29fa5a6Sopenharmony_ci FI_HILOGI("[PERF] Start tracing \'%{public}d\'", userData); 517c29fa5a6Sopenharmony_ci} 518c29fa5a6Sopenharmony_ci 519c29fa5a6Sopenharmony_civoid CooperateClient::FinishTrace(int32_t userData, CoordinationMessage msg) 520c29fa5a6Sopenharmony_ci{ 521c29fa5a6Sopenharmony_ci CALL_DEBUG_ENTER; 522c29fa5a6Sopenharmony_ci std::lock_guard guard { performanceLock_ }; 523c29fa5a6Sopenharmony_ci if (msg == CoordinationMessage::ACTIVATE_SUCCESS) { 524c29fa5a6Sopenharmony_ci if (auto iter = performanceInfo_.traces_.find(userData); iter != performanceInfo_.traces_.end()) { 525c29fa5a6Sopenharmony_ci auto curDuration = std::chrono::duration_cast<std::chrono::milliseconds>( 526c29fa5a6Sopenharmony_ci std::chrono::steady_clock::now() - iter->second).count(); 527c29fa5a6Sopenharmony_ci FI_HILOGI("[PERF] Finish tracing \'%{public}d\', elapsed: %{public}lld ms", userData, curDuration); 528c29fa5a6Sopenharmony_ci performanceInfo_.traces_.erase(iter); 529c29fa5a6Sopenharmony_ci performanceInfo_.durationList.push_back(curDuration); 530c29fa5a6Sopenharmony_ci } else { 531c29fa5a6Sopenharmony_ci FI_HILOGW("[PERF] FinishTrace with something wrong"); 532c29fa5a6Sopenharmony_ci } 533c29fa5a6Sopenharmony_ci } else if (msg == CoordinationMessage::ACTIVATE_FAIL) { 534c29fa5a6Sopenharmony_ci FI_HILOGW("[PERF] Activate coordination failed"); 535c29fa5a6Sopenharmony_ci performanceInfo_.traces_.erase(userData); 536c29fa5a6Sopenharmony_ci performanceInfo_.durationList.push_back(FAILURE_DURATION); 537c29fa5a6Sopenharmony_ci } 538c29fa5a6Sopenharmony_ci} 539c29fa5a6Sopenharmony_ci 540c29fa5a6Sopenharmony_civoid CooperateClient::DumpPerformanceInfo() 541c29fa5a6Sopenharmony_ci{ 542c29fa5a6Sopenharmony_ci CALL_DEBUG_ENTER; 543c29fa5a6Sopenharmony_ci std::lock_guard guard { performanceLock_ }; 544c29fa5a6Sopenharmony_ci int32_t firstSuccessIndex = GetFirstSuccessIndex(); 545c29fa5a6Sopenharmony_ci int32_t durationLen = static_cast<int32_t>(performanceInfo_.durationList.size()); 546c29fa5a6Sopenharmony_ci if (firstSuccessIndex < 0 || firstSuccessIndex >= durationLen) { 547c29fa5a6Sopenharmony_ci FI_HILOGE("[PERF] DumpPerformanceInfo failed, invalid first success index"); 548c29fa5a6Sopenharmony_ci return; 549c29fa5a6Sopenharmony_ci } 550c29fa5a6Sopenharmony_ci performanceInfo_.failNum = firstSuccessIndex; 551c29fa5a6Sopenharmony_ci performanceInfo_.failBeforeSuccess = firstSuccessIndex; 552c29fa5a6Sopenharmony_ci performanceInfo_.firstSuccessDuration = performanceInfo_.durationList[firstSuccessIndex]; 553c29fa5a6Sopenharmony_ci int32_t successDurationSumWithoutFirst { 0 }; 554c29fa5a6Sopenharmony_ci for (int32_t i = firstSuccessIndex + 1; i < durationLen; i++) { 555c29fa5a6Sopenharmony_ci if (performanceInfo_.durationList[i] != FAILURE_DURATION) { 556c29fa5a6Sopenharmony_ci successDurationSumWithoutFirst += performanceInfo_.durationList[i]; 557c29fa5a6Sopenharmony_ci performanceInfo_.minDuration = std::min(performanceInfo_.durationList[i], performanceInfo_.minDuration); 558c29fa5a6Sopenharmony_ci performanceInfo_.maxDuration = std::max(performanceInfo_.durationList[i], performanceInfo_.maxDuration); 559c29fa5a6Sopenharmony_ci performanceInfo_.successNum += 1; 560c29fa5a6Sopenharmony_ci } else { 561c29fa5a6Sopenharmony_ci performanceInfo_.failNum += 1; 562c29fa5a6Sopenharmony_ci } 563c29fa5a6Sopenharmony_ci } 564c29fa5a6Sopenharmony_ci int32_t validActivateNum = performanceInfo_.activateNum - performanceInfo_.failBeforeSuccess; 565c29fa5a6Sopenharmony_ci if (validActivateNum > 0) { 566c29fa5a6Sopenharmony_ci performanceInfo_.successRate = (static_cast<float>(performanceInfo_.successNum) * PERCENTAGE) / 567c29fa5a6Sopenharmony_ci validActivateNum; 568c29fa5a6Sopenharmony_ci } 569c29fa5a6Sopenharmony_ci if (int32_t successNumWithoutFirst = performanceInfo_.successNum - 1; successNumWithoutFirst > 0) { 570c29fa5a6Sopenharmony_ci performanceInfo_.averageDuration = successDurationSumWithoutFirst / successNumWithoutFirst; 571c29fa5a6Sopenharmony_ci } 572c29fa5a6Sopenharmony_ci FI_HILOGI("[PERF] performanceInfo:" 573c29fa5a6Sopenharmony_ci "activateNum:%{public}d successNum:%{public}d failNum:%{public}d successRate:%{public}.2f " 574c29fa5a6Sopenharmony_ci "averageDuration:%{public}d ms maxDuration:%{public}d ms minDuration:%{public}d ms failBeforeSucc:%{public}d " 575c29fa5a6Sopenharmony_ci "firstSuccessDuration:%{public}d ms", 576c29fa5a6Sopenharmony_ci performanceInfo_.activateNum, performanceInfo_.successNum, performanceInfo_.failNum, 577c29fa5a6Sopenharmony_ci performanceInfo_.successRate, performanceInfo_.averageDuration, performanceInfo_.maxDuration, 578c29fa5a6Sopenharmony_ci performanceInfo_.minDuration, performanceInfo_.failBeforeSuccess, performanceInfo_.firstSuccessDuration); 579c29fa5a6Sopenharmony_ci std::string durationStr; 580c29fa5a6Sopenharmony_ci for (auto duration : performanceInfo_.durationList) { 581c29fa5a6Sopenharmony_ci durationStr += std::to_string(duration) + ", "; 582c29fa5a6Sopenharmony_ci } 583c29fa5a6Sopenharmony_ci FI_HILOGI("[PERF] Duration: %{public}s", durationStr.c_str()); 584c29fa5a6Sopenharmony_ci performanceInfo_ = PerformanceInfo(); 585c29fa5a6Sopenharmony_ci} 586c29fa5a6Sopenharmony_ci#endif // ENABLE_PERFORMANCE_CHECK 587c29fa5a6Sopenharmony_ci} // namespace DeviceStatus 588c29fa5a6Sopenharmony_ci} // namespace Msdp 589c29fa5a6Sopenharmony_ci} // namespace OHOS 590