1f857971dSopenharmony_ci/* 2f857971dSopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd. 3f857971dSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4f857971dSopenharmony_ci * you may not use this file except in compliance with the License. 5f857971dSopenharmony_ci * You may obtain a copy of the License at 6f857971dSopenharmony_ci * 7f857971dSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8f857971dSopenharmony_ci * 9f857971dSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10f857971dSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11f857971dSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12f857971dSopenharmony_ci * See the License for the specific language governing permissions and 13f857971dSopenharmony_ci * limitations under the License. 14f857971dSopenharmony_ci */ 15f857971dSopenharmony_ci 16f857971dSopenharmony_ci#include "tunnel_client.h" 17f857971dSopenharmony_ci 18f857971dSopenharmony_ci#include "if_system_ability_manager.h" 19f857971dSopenharmony_ci#include "iservice_registry.h" 20f857971dSopenharmony_ci#include "system_ability_definition.h" 21f857971dSopenharmony_ci 22f857971dSopenharmony_ci#include "iremote_broker.h" 23f857971dSopenharmony_ci#include "iremote_object.h" 24f857971dSopenharmony_ci 25f857971dSopenharmony_ci#include "devicestatus_define.h" 26f857971dSopenharmony_ci 27f857971dSopenharmony_ci#undef LOG_TAG 28f857971dSopenharmony_ci#define LOG_TAG "TunnelClient" 29f857971dSopenharmony_ci 30f857971dSopenharmony_cinamespace OHOS { 31f857971dSopenharmony_cinamespace Msdp { 32f857971dSopenharmony_cinamespace DeviceStatus { 33f857971dSopenharmony_ci 34f857971dSopenharmony_ciTunnelClient::~TunnelClient() 35f857971dSopenharmony_ci{ 36f857971dSopenharmony_ci std::lock_guard lock(mutex_); 37f857971dSopenharmony_ci if (devicestatusProxy_ != nullptr) { 38f857971dSopenharmony_ci auto remoteObject = devicestatusProxy_->AsObject(); 39f857971dSopenharmony_ci if (remoteObject != nullptr) { 40f857971dSopenharmony_ci remoteObject->RemoveDeathRecipient(deathRecipient_); 41f857971dSopenharmony_ci } 42f857971dSopenharmony_ci } 43f857971dSopenharmony_ci} 44f857971dSopenharmony_ci 45f857971dSopenharmony_ciint32_t TunnelClient::Enable(Intention intention, ParamBase &data, ParamBase &reply) 46f857971dSopenharmony_ci{ 47f857971dSopenharmony_ci CALL_DEBUG_ENTER; 48f857971dSopenharmony_ci MessageParcel dataParcel; 49f857971dSopenharmony_ci if (!dataParcel.WriteInterfaceToken(IIntention::GetDescriptor())) { 50f857971dSopenharmony_ci FI_HILOGE("WriteInterfaceToken fail"); 51f857971dSopenharmony_ci return RET_ERR; 52f857971dSopenharmony_ci } 53f857971dSopenharmony_ci if (!data.Marshalling(dataParcel)) { 54f857971dSopenharmony_ci FI_HILOGE("ParamBase::Marshalling fail"); 55f857971dSopenharmony_ci return RET_ERR; 56f857971dSopenharmony_ci } 57f857971dSopenharmony_ci if (Connect() != RET_OK) { 58f857971dSopenharmony_ci FI_HILOGE("Can not connect to IntentionService"); 59f857971dSopenharmony_ci return RET_ERR; 60f857971dSopenharmony_ci } 61f857971dSopenharmony_ci MessageParcel replyParcel; 62f857971dSopenharmony_ci { 63f857971dSopenharmony_ci std::lock_guard lock(mutex_); 64f857971dSopenharmony_ci int32_t ret = devicestatusProxy_->Enable(intention, dataParcel, replyParcel); 65f857971dSopenharmony_ci if (ret != RET_OK) { 66f857971dSopenharmony_ci FI_HILOGE("proxy::Enable fail"); 67f857971dSopenharmony_ci return RET_ERR; 68f857971dSopenharmony_ci } 69f857971dSopenharmony_ci } 70f857971dSopenharmony_ci if (!reply.Unmarshalling(replyParcel)) { 71f857971dSopenharmony_ci FI_HILOGE("ParamBase::Unmarshalling fail"); 72f857971dSopenharmony_ci return RET_ERR; 73f857971dSopenharmony_ci } 74f857971dSopenharmony_ci return RET_OK; 75f857971dSopenharmony_ci} 76f857971dSopenharmony_ci 77f857971dSopenharmony_ciint32_t TunnelClient::Disable(Intention intention, ParamBase &data, ParamBase &reply) 78f857971dSopenharmony_ci{ 79f857971dSopenharmony_ci CALL_DEBUG_ENTER; 80f857971dSopenharmony_ci MessageParcel dataParcel; 81f857971dSopenharmony_ci if (!dataParcel.WriteInterfaceToken(IIntention::GetDescriptor())) { 82f857971dSopenharmony_ci FI_HILOGE("WriteInterfaceToken fail"); 83f857971dSopenharmony_ci return RET_ERR; 84f857971dSopenharmony_ci } 85f857971dSopenharmony_ci if (!data.Marshalling(dataParcel)) { 86f857971dSopenharmony_ci FI_HILOGE("ParamBase::Marshalling fail"); 87f857971dSopenharmony_ci return RET_ERR; 88f857971dSopenharmony_ci } 89f857971dSopenharmony_ci if (Connect() != RET_OK) { 90f857971dSopenharmony_ci FI_HILOGE("Can not connect to IntentionService"); 91f857971dSopenharmony_ci return RET_ERR; 92f857971dSopenharmony_ci } 93f857971dSopenharmony_ci MessageParcel replyParcel; 94f857971dSopenharmony_ci { 95f857971dSopenharmony_ci std::lock_guard lock(mutex_); 96f857971dSopenharmony_ci int32_t ret = devicestatusProxy_->Disable(intention, dataParcel, replyParcel); 97f857971dSopenharmony_ci if (ret != RET_OK) { 98f857971dSopenharmony_ci FI_HILOGE("proxy::Disable fail"); 99f857971dSopenharmony_ci return RET_ERR; 100f857971dSopenharmony_ci } 101f857971dSopenharmony_ci } 102f857971dSopenharmony_ci if (!reply.Unmarshalling(replyParcel)) { 103f857971dSopenharmony_ci FI_HILOGE("ParamBase::Unmarshalling fail"); 104f857971dSopenharmony_ci return RET_ERR; 105f857971dSopenharmony_ci } 106f857971dSopenharmony_ci return RET_OK; 107f857971dSopenharmony_ci} 108f857971dSopenharmony_ci 109f857971dSopenharmony_ciint32_t TunnelClient::Start(Intention intention, ParamBase &data, ParamBase &reply) 110f857971dSopenharmony_ci{ 111f857971dSopenharmony_ci CALL_DEBUG_ENTER; 112f857971dSopenharmony_ci MessageParcel dataParcel; 113f857971dSopenharmony_ci if (!dataParcel.WriteInterfaceToken(IIntention::GetDescriptor())) { 114f857971dSopenharmony_ci FI_HILOGE("WriteInterfaceToken fail"); 115f857971dSopenharmony_ci return RET_ERR; 116f857971dSopenharmony_ci } 117f857971dSopenharmony_ci if (!data.Marshalling(dataParcel)) { 118f857971dSopenharmony_ci FI_HILOGE("ParamBase::Marshalling fail"); 119f857971dSopenharmony_ci return RET_ERR; 120f857971dSopenharmony_ci } 121f857971dSopenharmony_ci if (Connect() != RET_OK) { 122f857971dSopenharmony_ci FI_HILOGE("Can not connect to IntentionService"); 123f857971dSopenharmony_ci return RET_ERR; 124f857971dSopenharmony_ci } 125f857971dSopenharmony_ci MessageParcel replyParcel; 126f857971dSopenharmony_ci { 127f857971dSopenharmony_ci std::lock_guard lock(mutex_); 128f857971dSopenharmony_ci int32_t ret = devicestatusProxy_->Start(intention, dataParcel, replyParcel); 129f857971dSopenharmony_ci if (ret != RET_OK) { 130f857971dSopenharmony_ci FI_HILOGE("proxy::Start fail"); 131f857971dSopenharmony_ci return ret; 132f857971dSopenharmony_ci } 133f857971dSopenharmony_ci } 134f857971dSopenharmony_ci if (!reply.Unmarshalling(replyParcel)) { 135f857971dSopenharmony_ci FI_HILOGE("ParamBase::Unmarshalling fail"); 136f857971dSopenharmony_ci return RET_ERR; 137f857971dSopenharmony_ci } 138f857971dSopenharmony_ci return RET_OK; 139f857971dSopenharmony_ci} 140f857971dSopenharmony_ci 141f857971dSopenharmony_ciint32_t TunnelClient::Stop(Intention intention, ParamBase &data, ParamBase &reply) 142f857971dSopenharmony_ci{ 143f857971dSopenharmony_ci CALL_DEBUG_ENTER; 144f857971dSopenharmony_ci MessageParcel dataParcel; 145f857971dSopenharmony_ci if (!dataParcel.WriteInterfaceToken(IIntention::GetDescriptor())) { 146f857971dSopenharmony_ci FI_HILOGE("WriteInterfaceToken fail"); 147f857971dSopenharmony_ci return RET_ERR; 148f857971dSopenharmony_ci } 149f857971dSopenharmony_ci if (!data.Marshalling(dataParcel)) { 150f857971dSopenharmony_ci FI_HILOGE("ParamBase::Marshalling fail"); 151f857971dSopenharmony_ci return RET_ERR; 152f857971dSopenharmony_ci } 153f857971dSopenharmony_ci if (Connect() != RET_OK) { 154f857971dSopenharmony_ci FI_HILOGE("Can not connect to IntentionService"); 155f857971dSopenharmony_ci return RET_ERR; 156f857971dSopenharmony_ci } 157f857971dSopenharmony_ci MessageParcel replyParcel; 158f857971dSopenharmony_ci { 159f857971dSopenharmony_ci std::lock_guard lock(mutex_); 160f857971dSopenharmony_ci int32_t ret = devicestatusProxy_->Stop(intention, dataParcel, replyParcel); 161f857971dSopenharmony_ci if (ret != RET_OK) { 162f857971dSopenharmony_ci FI_HILOGE("proxy::Stop fail"); 163f857971dSopenharmony_ci return RET_ERR; 164f857971dSopenharmony_ci } 165f857971dSopenharmony_ci } 166f857971dSopenharmony_ci if (!reply.Unmarshalling(replyParcel)) { 167f857971dSopenharmony_ci FI_HILOGE("ParamBase::Unmarshalling fail"); 168f857971dSopenharmony_ci return RET_ERR; 169f857971dSopenharmony_ci } 170f857971dSopenharmony_ci return RET_OK; 171f857971dSopenharmony_ci} 172f857971dSopenharmony_ci 173f857971dSopenharmony_ciint32_t TunnelClient::AddWatch(Intention intention, uint32_t id, ParamBase &data, ParamBase &reply) 174f857971dSopenharmony_ci{ 175f857971dSopenharmony_ci CALL_DEBUG_ENTER; 176f857971dSopenharmony_ci MessageParcel dataParcel; 177f857971dSopenharmony_ci if (!dataParcel.WriteInterfaceToken(IIntention::GetDescriptor())) { 178f857971dSopenharmony_ci FI_HILOGE("WriteInterfaceToken fail"); 179f857971dSopenharmony_ci return RET_ERR; 180f857971dSopenharmony_ci } 181f857971dSopenharmony_ci if (!data.Marshalling(dataParcel)) { 182f857971dSopenharmony_ci FI_HILOGE("ParamBase::Marshalling fail"); 183f857971dSopenharmony_ci return RET_ERR; 184f857971dSopenharmony_ci } 185f857971dSopenharmony_ci if (Connect() != RET_OK) { 186f857971dSopenharmony_ci FI_HILOGE("Can not connect to IntentionService"); 187f857971dSopenharmony_ci return RET_ERR; 188f857971dSopenharmony_ci } 189f857971dSopenharmony_ci MessageParcel replyParcel; 190f857971dSopenharmony_ci { 191f857971dSopenharmony_ci std::lock_guard lock(mutex_); 192f857971dSopenharmony_ci int32_t ret = devicestatusProxy_->AddWatch(intention, id, dataParcel, replyParcel); 193f857971dSopenharmony_ci if (ret != RET_OK) { 194f857971dSopenharmony_ci FI_HILOGE("proxy::AddWatch fail"); 195f857971dSopenharmony_ci return RET_ERR; 196f857971dSopenharmony_ci } 197f857971dSopenharmony_ci } 198f857971dSopenharmony_ci if (!reply.Unmarshalling(replyParcel)) { 199f857971dSopenharmony_ci FI_HILOGE("ParamBase::Unmarshalling fail"); 200f857971dSopenharmony_ci return RET_ERR; 201f857971dSopenharmony_ci } 202f857971dSopenharmony_ci return RET_OK; 203f857971dSopenharmony_ci} 204f857971dSopenharmony_ci 205f857971dSopenharmony_ciint32_t TunnelClient::RemoveWatch(Intention intention, uint32_t id, ParamBase &data, ParamBase &reply) 206f857971dSopenharmony_ci{ 207f857971dSopenharmony_ci CALL_DEBUG_ENTER; 208f857971dSopenharmony_ci MessageParcel dataParcel; 209f857971dSopenharmony_ci if (!dataParcel.WriteInterfaceToken(IIntention::GetDescriptor())) { 210f857971dSopenharmony_ci FI_HILOGE("WriteInterfaceToken fail"); 211f857971dSopenharmony_ci return RET_ERR; 212f857971dSopenharmony_ci } 213f857971dSopenharmony_ci if (!data.Marshalling(dataParcel)) { 214f857971dSopenharmony_ci FI_HILOGE("ParamBase::Marshalling fail"); 215f857971dSopenharmony_ci return RET_ERR; 216f857971dSopenharmony_ci } 217f857971dSopenharmony_ci if (Connect() != RET_OK) { 218f857971dSopenharmony_ci FI_HILOGE("Can not connect to IntentionService"); 219f857971dSopenharmony_ci return RET_ERR; 220f857971dSopenharmony_ci } 221f857971dSopenharmony_ci MessageParcel replyParcel; 222f857971dSopenharmony_ci { 223f857971dSopenharmony_ci std::lock_guard lock(mutex_); 224f857971dSopenharmony_ci int32_t ret = devicestatusProxy_->RemoveWatch(intention, id, dataParcel, replyParcel); 225f857971dSopenharmony_ci if (ret != RET_OK) { 226f857971dSopenharmony_ci FI_HILOGE("proxy::RemoveWatch fail"); 227f857971dSopenharmony_ci return RET_ERR; 228f857971dSopenharmony_ci } 229f857971dSopenharmony_ci } 230f857971dSopenharmony_ci if (!reply.Unmarshalling(replyParcel)) { 231f857971dSopenharmony_ci FI_HILOGE("ParamBase::Unmarshalling fail"); 232f857971dSopenharmony_ci return RET_ERR; 233f857971dSopenharmony_ci } 234f857971dSopenharmony_ci return RET_OK; 235f857971dSopenharmony_ci} 236f857971dSopenharmony_ci 237f857971dSopenharmony_ciint32_t TunnelClient::SetParam(Intention intention, uint32_t id, ParamBase &data, ParamBase &reply) 238f857971dSopenharmony_ci{ 239f857971dSopenharmony_ci CALL_DEBUG_ENTER; 240f857971dSopenharmony_ci MessageParcel dataParcel; 241f857971dSopenharmony_ci if (!dataParcel.WriteInterfaceToken(IIntention::GetDescriptor())) { 242f857971dSopenharmony_ci FI_HILOGE("WriteInterfaceToken fail"); 243f857971dSopenharmony_ci return RET_ERR; 244f857971dSopenharmony_ci } 245f857971dSopenharmony_ci if (!data.Marshalling(dataParcel)) { 246f857971dSopenharmony_ci FI_HILOGE("ParamBase::Marshalling fail"); 247f857971dSopenharmony_ci return RET_ERR; 248f857971dSopenharmony_ci } 249f857971dSopenharmony_ci if (Connect() != RET_OK) { 250f857971dSopenharmony_ci FI_HILOGE("Can not connect to IntentionService"); 251f857971dSopenharmony_ci return RET_ERR; 252f857971dSopenharmony_ci } 253f857971dSopenharmony_ci MessageParcel replyParcel; 254f857971dSopenharmony_ci { 255f857971dSopenharmony_ci std::lock_guard lock(mutex_); 256f857971dSopenharmony_ci int32_t ret = devicestatusProxy_->SetParam(intention, id, dataParcel, replyParcel); 257f857971dSopenharmony_ci if (ret != RET_OK) { 258f857971dSopenharmony_ci FI_HILOGE("proxy::SetParam fail"); 259f857971dSopenharmony_ci return RET_ERR; 260f857971dSopenharmony_ci } 261f857971dSopenharmony_ci } 262f857971dSopenharmony_ci if (!reply.Unmarshalling(replyParcel)) { 263f857971dSopenharmony_ci FI_HILOGE("ParamBase::Unmarshalling fail"); 264f857971dSopenharmony_ci return RET_ERR; 265f857971dSopenharmony_ci } 266f857971dSopenharmony_ci return RET_OK; 267f857971dSopenharmony_ci} 268f857971dSopenharmony_ci 269f857971dSopenharmony_ciint32_t TunnelClient::GetParam(Intention intention, uint32_t id, ParamBase &data, ParamBase &reply) 270f857971dSopenharmony_ci{ 271f857971dSopenharmony_ci CALL_DEBUG_ENTER; 272f857971dSopenharmony_ci MessageParcel dataParcel; 273f857971dSopenharmony_ci if (!dataParcel.WriteInterfaceToken(IIntention::GetDescriptor())) { 274f857971dSopenharmony_ci FI_HILOGE("WriteInterfaceToken fail"); 275f857971dSopenharmony_ci return RET_ERR; 276f857971dSopenharmony_ci } 277f857971dSopenharmony_ci if (!data.Marshalling(dataParcel)) { 278f857971dSopenharmony_ci FI_HILOGE("ParamBase::Marshalling fail"); 279f857971dSopenharmony_ci return RET_ERR; 280f857971dSopenharmony_ci } 281f857971dSopenharmony_ci if (Connect() != RET_OK) { 282f857971dSopenharmony_ci FI_HILOGE("Can not connect to IntentionService"); 283f857971dSopenharmony_ci return RET_ERR; 284f857971dSopenharmony_ci } 285f857971dSopenharmony_ci MessageParcel replyParcel; 286f857971dSopenharmony_ci { 287f857971dSopenharmony_ci std::lock_guard lock(mutex_); 288f857971dSopenharmony_ci int32_t ret = devicestatusProxy_->GetParam(intention, id, dataParcel, replyParcel); 289f857971dSopenharmony_ci if (ret != RET_OK) { 290f857971dSopenharmony_ci FI_HILOGE("proxy::GetParam fail"); 291f857971dSopenharmony_ci return RET_ERR; 292f857971dSopenharmony_ci } 293f857971dSopenharmony_ci } 294f857971dSopenharmony_ci if (!reply.Unmarshalling(replyParcel)) { 295f857971dSopenharmony_ci FI_HILOGE("ParamBase::Unmarshalling fail"); 296f857971dSopenharmony_ci return RET_ERR; 297f857971dSopenharmony_ci } 298f857971dSopenharmony_ci return RET_OK; 299f857971dSopenharmony_ci} 300f857971dSopenharmony_ci 301f857971dSopenharmony_ciint32_t TunnelClient::Control(Intention intention, uint32_t id, ParamBase &data, ParamBase &reply) 302f857971dSopenharmony_ci{ 303f857971dSopenharmony_ci CALL_DEBUG_ENTER; 304f857971dSopenharmony_ci MessageParcel dataParcel; 305f857971dSopenharmony_ci if (!dataParcel.WriteInterfaceToken(IIntention::GetDescriptor())) { 306f857971dSopenharmony_ci FI_HILOGE("WriteInterfaceToken fail"); 307f857971dSopenharmony_ci return RET_ERR; 308f857971dSopenharmony_ci } 309f857971dSopenharmony_ci if (!data.Marshalling(dataParcel)) { 310f857971dSopenharmony_ci FI_HILOGE("ParamBase::Marshalling fail"); 311f857971dSopenharmony_ci return RET_ERR; 312f857971dSopenharmony_ci } 313f857971dSopenharmony_ci if (Connect() != RET_OK) { 314f857971dSopenharmony_ci FI_HILOGE("Can not connect to IntentionService"); 315f857971dSopenharmony_ci return RET_ERR; 316f857971dSopenharmony_ci } 317f857971dSopenharmony_ci MessageParcel replyParcel; 318f857971dSopenharmony_ci { 319f857971dSopenharmony_ci std::lock_guard lock(mutex_); 320f857971dSopenharmony_ci int32_t ret = devicestatusProxy_->Control(intention, id, dataParcel, replyParcel); 321f857971dSopenharmony_ci if (ret != RET_OK) { 322f857971dSopenharmony_ci FI_HILOGE("proxy::Control fail"); 323f857971dSopenharmony_ci return RET_ERR; 324f857971dSopenharmony_ci } 325f857971dSopenharmony_ci } 326f857971dSopenharmony_ci if (!reply.Unmarshalling(replyParcel)) { 327f857971dSopenharmony_ci FI_HILOGE("ParamBase::Unmarshalling fail"); 328f857971dSopenharmony_ci return RET_ERR; 329f857971dSopenharmony_ci } 330f857971dSopenharmony_ci return RET_OK; 331f857971dSopenharmony_ci} 332f857971dSopenharmony_ci 333f857971dSopenharmony_ciErrCode TunnelClient::Connect() 334f857971dSopenharmony_ci{ 335f857971dSopenharmony_ci CALL_DEBUG_ENTER; 336f857971dSopenharmony_ci std::lock_guard lock(mutex_); 337f857971dSopenharmony_ci if (devicestatusProxy_ != nullptr) { 338f857971dSopenharmony_ci return RET_OK; 339f857971dSopenharmony_ci } 340f857971dSopenharmony_ci 341f857971dSopenharmony_ci sptr<ISystemAbilityManager> sa = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager(); 342f857971dSopenharmony_ci CHKPR(sa, E_DEVICESTATUS_GET_SYSTEM_ABILITY_MANAGER_FAILED); 343f857971dSopenharmony_ci 344f857971dSopenharmony_ci sptr<IRemoteObject> remoteObject = sa->CheckSystemAbility(MSDP_DEVICESTATUS_SERVICE_ID); 345f857971dSopenharmony_ci CHKPR(remoteObject, E_DEVICESTATUS_GET_SERVICE_FAILED); 346f857971dSopenharmony_ci 347f857971dSopenharmony_ci deathRecipient_ = sptr<DeathRecipient>::MakeSptr(shared_from_this()); 348f857971dSopenharmony_ci CHKPR(deathRecipient_, ERR_NO_MEMORY); 349f857971dSopenharmony_ci 350f857971dSopenharmony_ci if (remoteObject->IsProxyObject()) { 351f857971dSopenharmony_ci if (!remoteObject->AddDeathRecipient(deathRecipient_)) { 352f857971dSopenharmony_ci FI_HILOGE("Add death recipient to DeviceStatus service failed"); 353f857971dSopenharmony_ci return E_DEVICESTATUS_ADD_DEATH_RECIPIENT_FAILED; 354f857971dSopenharmony_ci } 355f857971dSopenharmony_ci } 356f857971dSopenharmony_ci 357f857971dSopenharmony_ci devicestatusProxy_ = iface_cast<IIntention>(remoteObject); 358f857971dSopenharmony_ci FI_HILOGD("Connecting IntentionService success"); 359f857971dSopenharmony_ci return RET_OK; 360f857971dSopenharmony_ci} 361f857971dSopenharmony_ci 362f857971dSopenharmony_civoid TunnelClient::ResetProxy(const wptr<IRemoteObject> &remote) 363f857971dSopenharmony_ci{ 364f857971dSopenharmony_ci CALL_DEBUG_ENTER; 365f857971dSopenharmony_ci std::lock_guard lock(mutex_); 366f857971dSopenharmony_ci CHKPV(devicestatusProxy_); 367f857971dSopenharmony_ci auto serviceRemote = devicestatusProxy_->AsObject(); 368f857971dSopenharmony_ci if ((serviceRemote != nullptr) && (serviceRemote == remote.promote())) { 369f857971dSopenharmony_ci serviceRemote->RemoveDeathRecipient(deathRecipient_); 370f857971dSopenharmony_ci devicestatusProxy_ = nullptr; 371f857971dSopenharmony_ci } 372f857971dSopenharmony_ci} 373f857971dSopenharmony_ci 374f857971dSopenharmony_ciTunnelClient::DeathRecipient::DeathRecipient(std::shared_ptr<TunnelClient> parent) 375f857971dSopenharmony_ci : parent_(parent) 376f857971dSopenharmony_ci{} 377f857971dSopenharmony_ci 378f857971dSopenharmony_civoid TunnelClient::DeathRecipient::OnRemoteDied(const wptr<IRemoteObject> &remote) 379f857971dSopenharmony_ci{ 380f857971dSopenharmony_ci CALL_DEBUG_ENTER; 381f857971dSopenharmony_ci std::shared_ptr<TunnelClient> parent = parent_.lock(); 382f857971dSopenharmony_ci CHKPV(parent); 383f857971dSopenharmony_ci CHKPV(remote); 384f857971dSopenharmony_ci parent->ResetProxy(remote); 385f857971dSopenharmony_ci FI_HILOGD("Recv death notice"); 386f857971dSopenharmony_ci} 387f857971dSopenharmony_ci} // namespace DeviceStatus 388f857971dSopenharmony_ci} // namespace Msdp 389f857971dSopenharmony_ci} // namespace OHOS 390