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