1 /*
2 * Copyright (c) 2022-2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "devicestatus_client.h"
17
18 #include <if_system_ability_manager.h>
19 #include <iservice_registry.h>
20 #include <system_ability_definition.h>
21
22 #include "iremote_broker.h"
23 #include "iremote_object.h"
24
25 #include "include/util.h"
26
27 #include "coordination_manager_impl.h"
28 #include "devicestatus_common.h"
29 #include "devicestatus_define.h"
30 #include "drag_manager_impl.h"
31 #ifdef OHOS_BUILD_ENABLE_RUST_IMPL
32 #include "fusion_data_binding_internal.h"
33 #include "fusion_frameworks_binding.h"
34 #endif // OHOS_BUILD_ENABLE_RUST_IMPL
35
36 #undef LOG_TAG
37 #define LOG_TAG "DeviceStatusClient"
38
39 namespace OHOS {
40 namespace Msdp {
41 namespace DeviceStatus {
42
DeviceStatusClient()43 DeviceStatusClient::DeviceStatusClient() {}
~DeviceStatusClient()44 DeviceStatusClient::~DeviceStatusClient()
45 {
46 if (devicestatusProxy_ != nullptr) {
47 auto remoteObject = devicestatusProxy_->AsObject();
48 if (remoteObject != nullptr) {
49 remoteObject->RemoveDeathRecipient(deathRecipient_);
50 }
51 }
52 }
53
Connect()54 ErrCode DeviceStatusClient::Connect()
55 {
56 std::lock_guard<std::mutex> lock(mutex_);
57 if (devicestatusProxy_ != nullptr) {
58 return RET_OK;
59 }
60
61 sptr<ISystemAbilityManager> sa = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
62 CHKPR(sa, E_DEVICESTATUS_GET_SYSTEM_ABILITY_MANAGER_FAILED);
63
64 sptr<IRemoteObject> remoteObject = sa->CheckSystemAbility(MSDP_DEVICESTATUS_SERVICE_ID);
65 CHKPR(remoteObject, E_DEVICESTATUS_GET_SERVICE_FAILED);
66
67 deathRecipient_ = sptr<IRemoteObject::DeathRecipient>(new (std::nothrow) DeviceStatusDeathRecipient());
68 CHKPR(deathRecipient_, ERR_NO_MEMORY);
69
70 if (remoteObject->IsProxyObject()) {
71 if (!remoteObject->AddDeathRecipient(deathRecipient_)) {
72 FI_HILOGE("Add death recipient to DeviceStatus service failed");
73 return E_DEVICESTATUS_ADD_DEATH_RECIPIENT_FAILED;
74 }
75 }
76
77 devicestatusProxy_ = iface_cast<Idevicestatus>(remoteObject);
78 FI_HILOGD("Connecting DeviceStatusService success");
79 return RET_OK;
80 }
81
ResetProxy(const wptr<IRemoteObject> & remote)82 void DeviceStatusClient::ResetProxy(const wptr<IRemoteObject> &remote)
83 {
84 std::lock_guard<std::mutex> lock(mutex_);
85 CHKPV(devicestatusProxy_);
86 auto serviceRemote = devicestatusProxy_->AsObject();
87 if ((serviceRemote != nullptr) && (serviceRemote == remote.promote())) {
88 serviceRemote->RemoveDeathRecipient(deathRecipient_);
89 devicestatusProxy_ = nullptr;
90 }
91 if (deathListener_ != nullptr) {
92 FI_HILOGI("Notify service death to listener");
93 deathListener_();
94 }
95 }
96
OnRemoteDied(const wptr<IRemoteObject> & remote)97 void DeviceStatusClient::DeviceStatusDeathRecipient::OnRemoteDied(const wptr<IRemoteObject> &remote)
98 {
99 CHKPV(remote);
100 DeviceStatusClient::GetInstance().ResetProxy(remote);
101 FI_HILOGD("Recv death notice");
102 }
103
SubscribeCallback(Type type,ActivityEvent event,ReportLatencyNs latency,sptr<IRemoteDevStaCallback> callback)104 int32_t DeviceStatusClient::SubscribeCallback(Type type, ActivityEvent event, ReportLatencyNs latency,
105 sptr<IRemoteDevStaCallback> callback)
106 {
107 FI_HILOGI("Enter event:%{public}d, latency:%{public}d", event, latency);
108 auto [_, ret] = typeMap_.insert(std::make_pair(type, 1));
109 if (!ret) {
110 FI_HILOGW("Insert pair to typeMap_ failed");
111 }
112 FI_HILOGD("typeMap_:%{public}d, type:%{public}d", typeMap_[type], type);
113 CHKPR(callback, RET_ERR);
114
115 if (Connect() != RET_OK) {
116 FI_HILOGE("Connect failed");
117 return RET_ERR;
118 }
119 CHKPR(devicestatusProxy_, RET_ERR);
120
121 if (type > Type::TYPE_INVALID && type <= Type::TYPE_LID_OPEN) {
122 devicestatusProxy_->Subscribe(type, event, latency, callback);
123 }
124 return RET_OK;
125 }
126
UnsubscribeCallback(Type type,ActivityEvent event,sptr<IRemoteDevStaCallback> callback)127 int32_t DeviceStatusClient::UnsubscribeCallback(Type type, ActivityEvent event, sptr<IRemoteDevStaCallback> callback)
128 {
129 CALL_DEBUG_ENTER;
130 FI_HILOGI("UNevent:%{public}d", event);
131 typeMap_.erase(type);
132 FI_HILOGD("typeMap_ %{public}d", typeMap_[type]);
133 CHKPR(callback, RET_ERR);
134
135 if (Connect() != RET_OK) {
136 FI_HILOGE("Connect failed");
137 return RET_ERR;
138 }
139 CHKPR(devicestatusProxy_, RET_ERR);
140
141 if ((type < TYPE_INVALID) || (type > TYPE_MAX)) {
142 FI_HILOGE("type out of range");
143 return RET_ERR;
144 }
145 if (event < ActivityEvent::EVENT_INVALID || event > ActivityEvent::ENTER_EXIT) {
146 FI_HILOGE("event out of range");
147 return RET_ERR;
148 }
149 devicestatusProxy_->Unsubscribe(type, event, callback);
150 return RET_OK;
151 }
152
GetDeviceStatusData(Type type)153 Data DeviceStatusClient::GetDeviceStatusData(Type type)
154 {
155 CALL_DEBUG_ENTER;
156 Data devicestatusData;
157 devicestatusData.type = type;
158 devicestatusData.value = OnChangedValue::VALUE_INVALID;
159 if (Connect() != RET_OK) {
160 FI_HILOGE("Connect failed");
161 return devicestatusData;
162 }
163 if (devicestatusProxy_ == nullptr) {
164 FI_HILOGE("devicestatusProxy_ is nullptr");
165 return devicestatusData;
166 }
167 if (type > Type::TYPE_INVALID
168 && type <= Type::TYPE_LID_OPEN) {
169 devicestatusData = devicestatusProxy_->GetCache(type);
170 }
171 return devicestatusData;
172 }
173
174 #ifdef OHOS_BUILD_ENABLE_RUST_IMPL
175
RegisterCoordinationListener()176 int32_t DeviceStatusClient::RegisterCoordinationListener()
177 {
178 CALL_DEBUG_ENTER;
179 return fusion_register_coordination_listener();
180 }
181
UnregisterCoordinationListener()182 int32_t DeviceStatusClient::UnregisterCoordinationListener()
183 {
184 CALL_DEBUG_ENTER;
185 return fusion_unregister_coordination_listener();
186 }
187
PrepareCoordination(int32_t userData)188 int32_t DeviceStatusClient::PrepareCoordination(int32_t userData)
189 {
190 CALL_DEBUG_ENTER;
191 return fusion_enable_coordination(userData);
192 }
193
UnprepareCoordination(int32_t userData)194 int32_t DeviceStatusClient::UnprepareCoordination(int32_t userData)
195 {
196 CALL_DEBUG_ENTER;
197 return fusion_disable_coordination(userData);
198 }
199
ActivateCoordination(int32_t userData,const std::string & remoteNetworkId,int32_t startDeviceId)200 int32_t DeviceStatusClient::ActivateCoordination(int32_t userData,
201 const std::string &remoteNetworkId, int32_t startDeviceId)
202 {
203 CALL_DEBUG_ENTER;
204 return fusion_start_coordination(userData, remoteNetworkId.c_str(), startDeviceId);
205 }
206
DeactivateCoordination(int32_t userData,bool isUnchained)207 int32_t DeviceStatusClient::DeactivateCoordination(int32_t userData, bool isUnchained)
208 {
209 CALL_DEBUG_ENTER;
210 return fusion_stop_coordination(userData, isUnchained);
211 }
212
GetCoordinationState(int32_t userData,const std::string & networkId)213 int32_t DeviceStatusClient::GetCoordinationState(int32_t userData, const std::string &networkId)
214 {
215 CALL_DEBUG_ENTER;
216 return fusion_get_coordination_state(userData, networkId.c_str());
217 }
218
219 #else // OHOS_BUILD_ENABLE_RUST_IMPL
220
RegisterCoordinationListener(bool isCompatible)221 int32_t DeviceStatusClient::RegisterCoordinationListener(bool isCompatible)
222 {
223 CALL_DEBUG_ENTER;
224 DEV_RET_IF_NULL_WITH_RET((Connect() != RET_OK), RET_ERR);
225 return devicestatusProxy_->RegisterCoordinationListener(isCompatible);
226 }
227
UnregisterCoordinationListener(bool isCompatible)228 int32_t DeviceStatusClient::UnregisterCoordinationListener(bool isCompatible)
229 {
230 CALL_DEBUG_ENTER;
231 DEV_RET_IF_NULL_WITH_RET((Connect() != RET_OK), RET_ERR);
232 return devicestatusProxy_->UnregisterCoordinationListener(isCompatible);
233 }
234
PrepareCoordination(int32_t userData,bool isCompatible)235 int32_t DeviceStatusClient::PrepareCoordination(int32_t userData, bool isCompatible)
236 {
237 CALL_DEBUG_ENTER;
238 DEV_RET_IF_NULL_WITH_RET((Connect() != RET_OK), RET_ERR);
239 return devicestatusProxy_->PrepareCoordination(userData, isCompatible);
240 }
241
UnprepareCoordination(int32_t userData,bool isCompatible)242 int32_t DeviceStatusClient::UnprepareCoordination(int32_t userData, bool isCompatible)
243 {
244 CALL_DEBUG_ENTER;
245 DEV_RET_IF_NULL_WITH_RET((Connect() != RET_OK), RET_ERR);
246 return devicestatusProxy_->UnprepareCoordination(userData, isCompatible);
247 }
248
ActivateCoordination(int32_t userData,const std::string & remoteNetworkId,int32_t startDeviceId,bool isCompatible)249 int32_t DeviceStatusClient::ActivateCoordination(int32_t userData,
250 const std::string &remoteNetworkId, int32_t startDeviceId, bool isCompatible)
251 {
252 CALL_DEBUG_ENTER;
253 DEV_RET_IF_NULL_WITH_RET((Connect() != RET_OK), RET_ERR);
254 return devicestatusProxy_->ActivateCoordination(userData, remoteNetworkId, startDeviceId, isCompatible);
255 }
256
DeactivateCoordination(int32_t userData,bool isUnchained,bool isCompatible)257 int32_t DeviceStatusClient::DeactivateCoordination(int32_t userData, bool isUnchained, bool isCompatible)
258 {
259 CALL_DEBUG_ENTER;
260 DEV_RET_IF_NULL_WITH_RET((Connect() != RET_OK), RET_ERR);
261 return devicestatusProxy_->DeactivateCoordination(userData, isUnchained, isCompatible);
262 }
263
GetCoordinationState(int32_t userData,const std::string & networkId,bool isCompatible)264 int32_t DeviceStatusClient::GetCoordinationState(int32_t userData, const std::string &networkId, bool isCompatible)
265 {
266 CALL_DEBUG_ENTER;
267 DEV_RET_IF_NULL_WITH_RET((Connect() != RET_OK), RET_ERR);
268 return devicestatusProxy_->GetCoordinationState(userData, networkId, isCompatible);
269 }
270
GetCoordinationState(const std::string & udId,bool & state)271 int32_t DeviceStatusClient::GetCoordinationState(const std::string &udId, bool &state)
272 {
273 CALL_DEBUG_ENTER;
274 DEV_RET_IF_NULL_WITH_RET((Connect() != RET_OK), RET_ERR);
275 return devicestatusProxy_->GetCoordinationState(udId, state);
276 }
277
278 #endif // OHOS_BUILD_ENABLE_RUST_IMPL
279
UpdateDragStyle(DragCursorStyle style)280 int32_t DeviceStatusClient::UpdateDragStyle(DragCursorStyle style)
281 {
282 CALL_DEBUG_ENTER;
283 DEV_RET_IF_NULL_WITH_RET((Connect() != RET_OK), RET_ERR);
284 return devicestatusProxy_->UpdateDragStyle(style);
285 }
286
GetDragTargetPid()287 int32_t DeviceStatusClient::GetDragTargetPid()
288 {
289 CALL_DEBUG_ENTER;
290 DEV_RET_IF_NULL_WITH_RET((Connect() != RET_OK), RET_ERR);
291 return devicestatusProxy_->GetDragTargetPid();
292 }
293
GetUdKey(std::string & udKey)294 int32_t DeviceStatusClient::GetUdKey(std::string &udKey)
295 {
296 CALL_DEBUG_ENTER;
297 DEV_RET_IF_NULL_WITH_RET((Connect() != RET_OK), RET_ERR);
298 return devicestatusProxy_->GetUdKey(udKey);
299 }
300
301 #ifdef OHOS_BUILD_ENABLE_RUST_IMPL
302
AllocSocketPair(int32_t moduleType)303 int32_t DeviceStatusClient::AllocSocketPair(int32_t moduleType)
304 {
305 const std::string programName(GetProgramName());
306 int32_t ret = fusion_alloc_socket_fd(programName.c_str(), moduleType, &socketFd_, &tokenType_);
307 if (ret != RET_OK) {
308 FI_HILOGE("Failed to connect to server via socket:%{public}d", ret);
309 return RET_ERR;
310 }
311 FI_HILOGI("Connected successfully to server via socket, "
312 "socketFd_:%{public}d tokenType_:%{public}d",
313 socketFd_, tokenType_);
314 return RET_OK;
315 }
316
317 #else // OHOS_BUILD_ENABLE_RUST_IMPL
318
AllocSocketPair(int32_t moduleType)319 int32_t DeviceStatusClient::AllocSocketPair(int32_t moduleType)
320 {
321 CALL_DEBUG_ENTER;
322 DEV_RET_IF_NULL_WITH_RET((Connect() != RET_OK), RET_ERR);
323 std::lock_guard<std::mutex> guard(mutex_);
324 CHKPR(devicestatusProxy_, RET_ERR);
325 const std::string programName(GetProgramName());
326 int32_t result = devicestatusProxy_->AllocSocketFd(programName, moduleType, socketFd_, tokenType_);
327 if (result != RET_OK) {
328 FI_HILOGE("AllocSocketFd has error:%{public}d", result);
329 return RET_ERR;
330 }
331
332 FI_HILOGI("AllocSocketPair success, socketFd_:%{public}d, tokenType_:%{public}d", socketFd_, tokenType_);
333 return RET_OK;
334 }
335
336 #endif // OHOS_BUILD_ENABLE_RUST_IMPL
337
GetClientSocketFdOfAllocedSocketPair() const338 int32_t DeviceStatusClient::GetClientSocketFdOfAllocedSocketPair() const
339 {
340 CALL_DEBUG_ENTER;
341 return socketFd_;
342 }
343
RegisterDeathListener(std::function<void ()> deathListener)344 void DeviceStatusClient::RegisterDeathListener(std::function<void()> deathListener)
345 {
346 deathListener_ = deathListener;
347 }
348
349 #ifdef OHOS_BUILD_ENABLE_RUST_IMPL
350
StartDrag(const DragData & dragData)351 int32_t DeviceStatusClient::StartDrag(const DragData &dragData)
352 {
353 CALL_DEBUG_ENTER;
354 CDragData cDragData;
355 if (CDragDataFrom(&dragData, &cDragData) != RET_OK) {
356 FI_HILOGE("Conversion of DragData to CDragData failed");
357 return RET_ERR;
358 }
359 int32_t ret = fusion_start_drag(&cDragData);
360 CDragDataFree(&cDragData);
361 return ret;
362 }
363
364 #else // OHOS_BUILD_ENABLE_RUST_IMPL
365
StartDrag(const DragData & dragData)366 int32_t DeviceStatusClient::StartDrag(const DragData &dragData)
367 {
368 CALL_DEBUG_ENTER;
369 DEV_RET_IF_NULL_WITH_RET((Connect() != RET_OK), RET_ERR);
370 CHKPR(devicestatusProxy_, RET_ERR);
371 return devicestatusProxy_->StartDrag(dragData);
372 }
373
374 #endif // OHOS_BUILD_ENABLE_RUST_IMPL
375
StopDrag(const DragDropResult & dropResult)376 int32_t DeviceStatusClient::StopDrag(const DragDropResult &dropResult)
377 {
378 CALL_DEBUG_ENTER;
379 DEV_RET_IF_NULL_WITH_RET((Connect() != RET_OK), RET_ERR);
380 CHKPR(devicestatusProxy_, RET_ERR);
381 return devicestatusProxy_->StopDrag(dropResult);
382 }
383
AddDraglistener()384 int32_t DeviceStatusClient::AddDraglistener()
385 {
386 CALL_DEBUG_ENTER;
387 DEV_RET_IF_NULL_WITH_RET((Connect() != RET_OK), RET_ERR);
388 return devicestatusProxy_->AddDraglistener();
389 }
390
RemoveDraglistener()391 int32_t DeviceStatusClient::RemoveDraglistener()
392 {
393 CALL_DEBUG_ENTER;
394 DEV_RET_IF_NULL_WITH_RET((Connect() != RET_OK), RET_ERR);
395 return devicestatusProxy_->RemoveDraglistener();
396 }
397
AddSubscriptListener()398 int32_t DeviceStatusClient::AddSubscriptListener()
399 {
400 CALL_DEBUG_ENTER;
401 DEV_RET_IF_NULL_WITH_RET((Connect() != RET_OK), RET_ERR);
402 return devicestatusProxy_->AddSubscriptListener();
403 }
404
RemoveSubscriptListener()405 int32_t DeviceStatusClient::RemoveSubscriptListener()
406 {
407 CALL_DEBUG_ENTER;
408 DEV_RET_IF_NULL_WITH_RET((Connect() != RET_OK), RET_ERR);
409 return devicestatusProxy_->RemoveSubscriptListener();
410 }
411
SetDragWindowVisible(bool visible,bool isForce)412 int32_t DeviceStatusClient::SetDragWindowVisible(bool visible, bool isForce)
413 {
414 CALL_DEBUG_ENTER;
415 DEV_RET_IF_NULL_WITH_RET((Connect() != RET_OK), RET_ERR);
416 return devicestatusProxy_->SetDragWindowVisible(visible, isForce);
417 }
418
GetShadowOffset(ShadowOffset & shadowOffset)419 int32_t DeviceStatusClient::GetShadowOffset(ShadowOffset &shadowOffset)
420 {
421 CALL_DEBUG_ENTER;
422 DEV_RET_IF_NULL_WITH_RET((Connect() != RET_OK), RET_ERR);
423 return devicestatusProxy_->GetShadowOffset(shadowOffset);
424 }
425
UpdateShadowPic(const ShadowInfo & shadowInfo)426 int32_t DeviceStatusClient::UpdateShadowPic(const ShadowInfo &shadowInfo)
427 {
428 CALL_DEBUG_ENTER;
429 DEV_RET_IF_NULL_WITH_RET((Connect() != RET_OK), RET_ERR);
430 return devicestatusProxy_->UpdateShadowPic(shadowInfo);
431 }
432
GetDragData(DragData & dragData)433 int32_t DeviceStatusClient::GetDragData(DragData &dragData)
434 {
435 CALL_DEBUG_ENTER;
436 DEV_RET_IF_NULL_WITH_RET((Connect() != RET_OK), RET_ERR);
437 return devicestatusProxy_->GetDragData(dragData);
438 }
439
GetDragState(DragState & dragState)440 int32_t DeviceStatusClient::GetDragState(DragState &dragState)
441 {
442 CALL_DEBUG_ENTER;
443 DEV_RET_IF_NULL_WITH_RET((Connect() != RET_OK), RET_ERR);
444 return devicestatusProxy_->GetDragState(dragState);
445 }
446
GetDragAction(DragAction & dragAction)447 int32_t DeviceStatusClient::GetDragAction(DragAction& dragAction)
448 {
449 CALL_DEBUG_ENTER;
450 DEV_RET_IF_NULL_WITH_RET((Connect() != RET_OK), RET_ERR);
451 return devicestatusProxy_->GetDragAction(dragAction);
452 }
453
GetExtraInfo(std::string & extraInfo)454 int32_t DeviceStatusClient::GetExtraInfo(std::string &extraInfo)
455 {
456 CALL_DEBUG_ENTER;
457 DEV_RET_IF_NULL_WITH_RET((Connect() != RET_OK), RET_ERR);
458 return devicestatusProxy_->GetExtraInfo(extraInfo);
459 }
460
AddHotAreaListener()461 int32_t DeviceStatusClient::AddHotAreaListener()
462 {
463 CALL_DEBUG_ENTER;
464 DEV_RET_IF_NULL_WITH_RET((Connect() != RET_OK), RET_ERR);
465 return devicestatusProxy_->AddHotAreaListener();
466 }
467
RemoveHotAreaListener()468 int32_t DeviceStatusClient::RemoveHotAreaListener()
469 {
470 CALL_DEBUG_ENTER;
471 DEV_RET_IF_NULL_WITH_RET((Connect() != RET_OK), RET_ERR);
472 return devicestatusProxy_->RemoveHotAreaListener();
473 }
474
UpdatePreviewStyle(const PreviewStyle & previewStyle)475 int32_t DeviceStatusClient::UpdatePreviewStyle(const PreviewStyle &previewStyle)
476 {
477 DEV_RET_IF_NULL_WITH_RET((Connect() != RET_OK), RET_ERR);
478 return devicestatusProxy_->UpdatePreviewStyle(previewStyle);
479 }
480
UpdatePreviewStyleWithAnimation(const PreviewStyle & previewStyle,const PreviewAnimation & animation)481 int32_t DeviceStatusClient::UpdatePreviewStyleWithAnimation(const PreviewStyle &previewStyle,
482 const PreviewAnimation &animation)
483 {
484 DEV_RET_IF_NULL_WITH_RET((Connect() != RET_OK), RET_ERR);
485 return devicestatusProxy_->UpdatePreviewStyleWithAnimation(previewStyle, animation);
486 }
487
GetDragSummary(std::map<std::string,int64_t> & summarys)488 int32_t DeviceStatusClient::GetDragSummary(std::map<std::string, int64_t> &summarys)
489 {
490 CALL_DEBUG_ENTER;
491 DEV_RET_IF_NULL_WITH_RET((Connect() != RET_OK), RET_ERR);
492 return devicestatusProxy_->GetDragSummary(summarys);
493 }
494
EnterTextEditorArea(bool enable)495 int32_t DeviceStatusClient::EnterTextEditorArea(bool enable)
496 {
497 CALL_DEBUG_ENTER;
498 DEV_RET_IF_NULL_WITH_RET((Connect() != RET_OK), RET_ERR);
499 return devicestatusProxy_->EnterTextEditorArea(enable);
500 }
501
AddPrivilege()502 int32_t DeviceStatusClient::AddPrivilege()
503 {
504 CALL_DEBUG_ENTER;
505 DEV_RET_IF_NULL_WITH_RET((Connect() != RET_OK), RET_ERR);
506 return devicestatusProxy_->AddPrivilege();
507 }
508
EraseMouseIcon()509 int32_t DeviceStatusClient::EraseMouseIcon()
510 {
511 CALL_DEBUG_ENTER;
512 DEV_RET_IF_NULL_WITH_RET((Connect() != RET_OK), RET_ERR);
513 return devicestatusProxy_->EraseMouseIcon();
514 }
515 } // namespace DeviceStatus
516 } // namespace Msdp
517 } // namespace OHOS
518