1 /*
2 * Copyright (c) 2022-2024 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 "daudio_sink_manager.h"
17
18 #include <dlfcn.h>
19 #include "if_system_ability_manager.h"
20 #include "iservice_registry.h"
21
22 #include "daudio_constants.h"
23 #include "daudio_errorcode.h"
24 #include "daudio_log.h"
25 #include "daudio_util.h"
26
27 #undef DH_LOG_TAG
28 #define DH_LOG_TAG "DAudioSinkManager"
29
30 namespace OHOS {
31 namespace DistributedHardware {
32 static const std::string PARAM_CLOSE_SPEAKER = "{\"audioParam\":null,\"dhId\":\"" +
33 std::to_string(PIN_OUT_SPEAKER) + "\",\"eventType\":12}";
34 static const std::string PARAM_CLOSE_MIC = "{\"audioParam\":null,\"dhId\":\"" +
35 std::to_string(PIN_IN_MIC) + "\",\"eventType\":22}";
36 const int DEFAULT_DEVICE_SECURITY_LEVEL = -1;
37
38 IMPLEMENT_SINGLE_INSTANCE(DAudioSinkManager);
39 using AVTransProviderClass = IAVEngineProvider *(*)(const std::string &);
40
41 const std::string SENDER_SO_NAME = "libdistributed_av_sender.z.so";
42 const std::string GET_SENDER_PROVIDER_FUNC = "GetAVSenderEngineProvider";
43 const std::string RECEIVER_SO_NAME = "libdistributed_av_receiver.z.so";
44 const std::string GET_RECEIVER_PROVIDER_FUNC = "GetAVReceiverEngineProvider";
DAudioSinkManager()45 DAudioSinkManager::DAudioSinkManager()
46 {
47 DHLOGD("Distributed audio sink manager constructed.");
48 }
49
~DAudioSinkManager()50 DAudioSinkManager::~DAudioSinkManager()
51 {
52 if (devClearThread_.joinable()) {
53 devClearThread_.join();
54 }
55 DHLOGD("Distributed audio sink manager deconstructed.");
56 }
57
Init(const sptr<IDAudioSinkIpcCallback> & sinkCallback)58 int32_t DAudioSinkManager::Init(const sptr<IDAudioSinkIpcCallback> &sinkCallback)
59 {
60 DHLOGI("Init audio sink manager.");
61 {
62 std::lock_guard<std::mutex> lock(ipcCallbackMutex_);
63 initCallback_ = std::make_shared<DeviceInitCallback>();
64 ipcSinkCallback_ = sinkCallback;
65 }
66 CHECK_AND_RETURN_RET_LOG(GetLocalDeviceNetworkId(localNetworkId_) != DH_SUCCESS,
67 ERR_DH_AUDIO_FAILED, "%{public}s", "Get local network id failed.");
68 CHECK_AND_RETURN_RET_LOG(LoadAVReceiverEngineProvider() != DH_SUCCESS,
69 ERR_DH_AUDIO_FAILED, "%{public}s", "Load av receiver engine failed.");
70 CHECK_NULL_RETURN(rcvProviderPtr_, ERR_DH_AUDIO_FAILED);
71 providerListener_ = std::make_shared<EngineProviderListener>();
72 if (rcvProviderPtr_->RegisterProviderCallback(providerListener_) != DH_SUCCESS) {
73 DHLOGE("Register av receiver engine callback failed.");
74 return ERR_DH_AUDIO_FAILED;
75 }
76 DHLOGI("Load av receiver engine success.");
77
78 if (LoadAVSenderEngineProvider() != DH_SUCCESS) {
79 DHLOGI("Load av sender engine provider failed.");
80 return ERR_DH_AUDIO_FAILED;
81 }
82 CHECK_NULL_RETURN(sendProviderPtr_, ERR_DH_AUDIO_FAILED);
83 if (sendProviderPtr_->RegisterProviderCallback(providerListener_) != DH_SUCCESS) {
84 DHLOGE("Register av sender engine callback failed.");
85 return ERR_DH_AUDIO_FAILED;
86 }
87 CHECK_AND_RETURN_RET_LOG(sendProviderPtr_->RegisterProviderCallback(providerListener_) != DH_SUCCESS,
88 ERR_DH_AUDIO_FAILED, "%{public}s", "Register av sender engine callback failed.");
89 DHLOGI("Load av sender engine success.");
90 return DH_SUCCESS;
91 }
92
UnInit()93 int32_t DAudioSinkManager::UnInit()
94 {
95 DHLOGI("UnInit audio sink manager.");
96 UnloadAVSenderEngineProvider();
97 UnloadAVReceiverEngineProvider();
98 {
99 std::lock_guard<std::mutex> remoteSvrLock(remoteSvrMutex_);
100 sourceServiceMap_.clear();
101 }
102 {
103 std::lock_guard<std::mutex> devMapLock(devMapMutex_);
104 for (auto iter = audioDevMap_.begin(); iter != audioDevMap_.end(); iter++) {
105 if (iter->second != nullptr) {
106 iter->second->SleepAudioDev();
107 }
108 }
109 audioDevMap_.clear();
110 }
111 if (devClearThread_.joinable()) {
112 devClearThread_.join();
113 }
114 ipcSinkCallback_ = nullptr;
115 return DH_SUCCESS;
116 }
117
OnSinkDevReleased(const std::string & devId)118 void DAudioSinkManager::OnSinkDevReleased(const std::string &devId)
119 {
120 DHLOGI("Release audio device devId: %{public}s.", GetAnonyString(devId).c_str());
121 if (devClearThread_.joinable()) {
122 devClearThread_.join();
123 }
124 devClearThread_ = std::thread([this, devId]() { this->ClearAudioDev(devId); });
125 if (pthread_setname_np(devClearThread_.native_handle(), DEVCLEAR_THREAD) != DH_SUCCESS) {
126 DHLOGE("Dev clear thread setname failed.");
127 }
128 }
129
HandleDAudioNotify(const std::string & devId,const std::string & dhId,const int32_t eventType,const std::string & eventContent)130 int32_t DAudioSinkManager::HandleDAudioNotify(const std::string &devId, const std::string &dhId,
131 const int32_t eventType, const std::string &eventContent)
132 {
133 DHLOGD("Receive audio event from devId: %{public}s, event type: %{public}d. event content: %{public}s.",
134 GetAnonyString(devId).c_str(), eventType, eventContent.c_str());
135
136 if (eventContent.length() > DAUDIO_MAX_JSON_LEN || eventContent.empty()
137 || !CheckDevIdIsLegal(devId) || eventType < 0 || eventType > MAX_EVENT_TYPE_NUM) {
138 return ERR_DH_AUDIO_FAILED;
139 }
140
141 // now ctrl channel is also goto here, please sure here not crash.
142 cJSON *jParam = cJSON_Parse(eventContent.c_str());
143 if (CJsonParamCheck(jParam, { KEY_RANDOM_TASK_CODE })) {
144 DHLOGD("Receive audio notify from source, random task code: %{public}s",
145 cJSON_GetObjectItemCaseSensitive(jParam, KEY_RANDOM_TASK_CODE)->valuestring);
146 }
147 bool isDevExisted = false;
148 {
149 std::lock_guard<std::mutex> lock(devMapMutex_);
150 isDevExisted = audioDevMap_.find(devId) != audioDevMap_.end();
151 }
152 if (!isDevExisted) {
153 DHLOGE("Device is not exist, devId: %{public}s, dhId: %{public}s.", GetAnonyString(devId).c_str(),
154 GetAnonyString(dhId).c_str());
155 cJSON_Delete(jParam);
156 return ERR_DH_AUDIO_FAILED;
157 }
158 NotifyEvent(devId, eventType, eventContent);
159 cJSON_Delete(jParam);
160 return DH_SUCCESS;
161 }
162
CreateAudioDevice(const std::string & devId)163 int32_t DAudioSinkManager::CreateAudioDevice(const std::string &devId)
164 {
165 DHLOGI("Create audio sink dev.");
166 std::shared_ptr<DAudioSinkDev> dev = nullptr;
167 {
168 std::lock_guard<std::mutex> lock(devMapMutex_);
169 if (audioDevMap_.find(devId) != audioDevMap_.end()) {
170 DHLOGD("Audio sink dev in map. devId: %{public}s.", GetAnonyString(devId).c_str());
171 dev = audioDevMap_[devId];
172 } else {
173 dev = std::make_shared<DAudioSinkDev>(devId, ipcSinkCallback_);
174 audioDevMap_.emplace(devId, dev);
175 }
176 }
177 int32_t dhId;
178 bool isSpkOrMic = false;
179 if (channelState_ == ChannelState::MIC_CONTROL_OPENED) {
180 dhId = PIN_IN_MIC;
181 isSpkOrMic = false;
182 } else if (channelState_ == ChannelState::SPK_CONTROL_OPENED) {
183 dhId = PIN_OUT_SPEAKER;
184 isSpkOrMic = true;
185 } else {
186 DHLOGE("Channel state error.");
187 return ERR_DH_AUDIO_NOT_SUPPORT;
188 }
189 int32_t ret = InitAudioDevice(dev, devId, isSpkOrMic);
190 cJSON *jParam = cJSON_CreateObject();
191 CHECK_NULL_RETURN(jParam, ERR_DH_AUDIO_NULLPTR);
192 cJSON_AddStringToObject(jParam, KEY_DH_ID, std::to_string(dhId).c_str());
193 cJSON_AddNumberToObject(jParam, KEY_RESULT, ret);
194 char *jsonData = cJSON_PrintUnformatted(jParam);
195 if (jsonData == nullptr) {
196 DHLOGE("Failed to create JSON data.");
197 cJSON_Delete(jParam);
198 return ERR_DH_AUDIO_NULLPTR;
199 }
200 std::string eventContent = std::string(jsonData);
201 cJSON_free(jsonData);
202 cJSON_Delete(jParam);
203 int32_t SLEEP_TIME = 300;
204 std::this_thread::sleep_for(std::chrono::milliseconds(SLEEP_TIME));
205 NotifyEvent(devId, CTRL_OPENED, eventContent);
206 return DH_SUCCESS;
207 }
208
InitAudioDevice(std::shared_ptr<DAudioSinkDev> dev,const std::string & devId,bool isSpkOrMic)209 int32_t DAudioSinkManager::InitAudioDevice(std::shared_ptr<DAudioSinkDev> dev, const std::string &devId,
210 bool isSpkOrMic)
211 {
212 DHLOGI("Init audio device.");
213 if (dev == nullptr) {
214 DHLOGE("dev is nullptr.");
215 return ERR_DH_AUDIO_NULLPTR;
216 }
217 int32_t ret;
218 if (isSpkOrMic) {
219 ret = dev->InitAVTransEngines(ChannelState::SPK_CONTROL_OPENED, rcvProviderPtr_);
220 } else {
221 ret = VerifySecurityLevel(devId);
222 if (ret != DH_SUCCESS) {
223 DHLOGE("Verify security level failed.");
224 return ERR_DH_AUDIO_FAILED;
225 }
226 dev->SetDevLevelStatus(true);
227 ret = dev->InitAVTransEngines(ChannelState::MIC_CONTROL_OPENED, sendProviderPtr_);
228 }
229 if (ret != DH_SUCCESS) {
230 DHLOGE("Init av transport engine failed.");
231 dev->JudgeDeviceStatus();
232 return ERR_DH_AUDIO_FAILED;
233 }
234 ret = dev->AwakeAudioDev();
235 if (ret != DH_SUCCESS) {
236 DHLOGE("Awake audio dev failed.");
237 return ERR_DH_AUDIO_FAILED;
238 }
239 return ret;
240 }
241
DAudioNotify(const std::string & devId,const std::string & dhId,const int32_t eventType,const std::string & eventContent)242 int32_t DAudioSinkManager::DAudioNotify(const std::string &devId, const std::string &dhId, const int32_t eventType,
243 const std::string &eventContent)
244 {
245 DHLOGD("Distributed audio notify, devId: %{public}s, dhId: %{public}s, eventType: %{public}d.",
246 GetAnonyString(devId).c_str(), dhId.c_str(), eventType);
247
248 {
249 std::lock_guard<std::mutex> lck(remoteSvrMutex_);
250 auto sinkProxy = sourceServiceMap_.find(devId);
251 if (sinkProxy != sourceServiceMap_.end()) {
252 if (sinkProxy->second != nullptr) {
253 sinkProxy->second->DAudioNotify(localNetworkId_, dhId, eventType, eventContent);
254 return DH_SUCCESS;
255 }
256 }
257 }
258
259 auto samgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
260 CHECK_NULL_RETURN(samgr, ERR_DH_AUDIO_NULLPTR);
261
262 auto remoteObject = samgr->GetSystemAbility(DISTRIBUTED_HARDWARE_AUDIO_SOURCE_SA_ID, devId);
263 CHECK_NULL_RETURN(remoteObject, ERR_DH_AUDIO_NULLPTR);
264
265 sptr<IDAudioSource> remoteSvrProxy = iface_cast<IDAudioSource>(remoteObject);
266 CHECK_NULL_RETURN(remoteSvrProxy, ERR_DH_AUDIO_NULLPTR);
267 {
268 std::lock_guard<std::mutex> lck(remoteSvrMutex_);
269 sourceServiceMap_[devId] = remoteSvrProxy;
270 remoteSvrProxy->DAudioNotify(localNetworkId_, dhId, eventType, eventContent);
271 }
272 return DH_SUCCESS;
273 }
274
NotifyEvent(const std::string & devId,const int32_t eventType,const std::string & eventContent)275 void DAudioSinkManager::NotifyEvent(const std::string &devId, const int32_t eventType, const std::string &eventContent)
276 {
277 AudioEvent audioEvent(eventType, eventContent);
278 std::lock_guard<std::mutex> lock(devMapMutex_);
279 DHLOGD("Notify event, devId: %{public}s.", GetAnonyString(devId).c_str());
280 CHECK_AND_RETURN_LOG(audioDevMap_.find(devId) == audioDevMap_.end(),
281 "%{public}s", "Notify event error, dev not exist.");
282 CHECK_NULL_VOID(audioDevMap_[devId]);
283 audioDevMap_[devId]->NotifyEvent(audioEvent);
284 }
285
ClearAudioDev(const std::string & devId)286 void DAudioSinkManager::ClearAudioDev(const std::string &devId)
287 {
288 std::lock_guard<std::mutex> lock(devMapMutex_);
289 auto dev = audioDevMap_.find(devId);
290 if (dev == audioDevMap_.end()) {
291 DHLOGD("Device not register.");
292 return;
293 }
294 CHECK_NULL_VOID(dev->second);
295 dev->second->SleepAudioDev();
296 audioDevMap_.erase(devId);
297 }
298
LoadAVReceiverEngineProvider()299 int32_t DAudioSinkManager::LoadAVReceiverEngineProvider()
300 {
301 DHLOGI("LoadAVReceiverEngineProvider enter");
302 if (RECEIVER_SO_NAME.length() > PATH_MAX) {
303 DHLOGE("File open failed");
304 return ERR_DH_AUDIO_NULLPTR;
305 }
306 pRHandler_ = dlopen(RECEIVER_SO_NAME.c_str(), RTLD_LAZY | RTLD_NODELETE);
307 CHECK_NULL_RETURN(pRHandler_, ERR_DH_AUDIO_NULLPTR);
308
309 AVTransProviderClass getEngineFactoryFunc = (AVTransProviderClass)dlsym(pRHandler_,
310 GET_RECEIVER_PROVIDER_FUNC.c_str());
311 if (getEngineFactoryFunc == nullptr) {
312 DHLOGE("av transport engine factory function handler is null, failed reason : %{public}s", dlerror());
313 dlclose(pRHandler_);
314 pRHandler_ = nullptr;
315 return ERR_DH_AUDIO_NULLPTR;
316 }
317 rcvProviderPtr_ = getEngineFactoryFunc(OWNER_NAME_D_SPEAKER);
318 DHLOGI("LoadAVReceiverEngineProvider success.");
319 return DH_SUCCESS;
320 }
321
UnloadAVReceiverEngineProvider()322 int32_t DAudioSinkManager::UnloadAVReceiverEngineProvider()
323 {
324 DHLOGI("UnloadAVReceiverEngineProvider");
325 if (pRHandler_ != nullptr) {
326 dlclose(pRHandler_);
327 pRHandler_ = nullptr;
328 }
329 return DH_SUCCESS;
330 }
331
LoadAVSenderEngineProvider()332 int32_t DAudioSinkManager::LoadAVSenderEngineProvider()
333 {
334 DHLOGI("LoadAVSenderEngineProvider enter");
335 if (SENDER_SO_NAME.length() > PATH_MAX) {
336 DHLOGE("File open failed");
337 return ERR_DH_AUDIO_NULLPTR;
338 }
339 pSHandler_ = dlopen(SENDER_SO_NAME.c_str(), RTLD_LAZY | RTLD_NODELETE);
340 CHECK_NULL_RETURN(pSHandler_, ERR_DH_AUDIO_NULLPTR);
341
342 AVTransProviderClass getEngineFactoryFunc = (AVTransProviderClass)dlsym(pSHandler_,
343 GET_SENDER_PROVIDER_FUNC.c_str());
344 if (getEngineFactoryFunc == nullptr) {
345 DHLOGE("av transport engine factory function handler is null, failed reason : %{public}s", dlerror());
346 dlclose(pSHandler_);
347 pSHandler_ = nullptr;
348 return ERR_DH_AUDIO_NULLPTR;
349 }
350 sendProviderPtr_ = getEngineFactoryFunc(OWNER_NAME_D_MIC);
351 return DH_SUCCESS;
352 }
353
UnloadAVSenderEngineProvider()354 int32_t DAudioSinkManager::UnloadAVSenderEngineProvider()
355 {
356 DHLOGI("UnloadAVSenderEngineProvider enter");
357 if (pSHandler_ != nullptr) {
358 dlclose(pSHandler_);
359 pSHandler_ = nullptr;
360 }
361 return DH_SUCCESS;
362 }
363
SetChannelState(const std::string & content)364 void DAudioSinkManager::SetChannelState(const std::string &content)
365 {
366 DHLOGI("The channel state belong to %{public}s.", content.c_str());
367 if (content.find(OWNER_NAME_D_SPEAKER) != content.npos) {
368 channelState_ = ChannelState::SPK_CONTROL_OPENED;
369 } else if (content.find(OWNER_NAME_D_MIC) != content.npos) {
370 channelState_ = ChannelState::MIC_CONTROL_OPENED;
371 }
372 }
373
OnProviderEvent(const AVTransEvent & event)374 int32_t EngineProviderListener::OnProviderEvent(const AVTransEvent &event)
375 {
376 DHLOGI("On event :%{public}d, eventContent: %{public}s.", event.type, event.content.c_str());
377 if (event.type == EventType::EVENT_CHANNEL_OPENED) {
378 DHLOGI("Received control channel opened event, create audio device for peerDevId=%{public}s, "
379 "content=%{public}s.", GetAnonyString(event.peerDevId).c_str(), event.content.c_str());
380 DAudioSinkManager::GetInstance().SetChannelState(event.content);
381 DAudioSinkManager::GetInstance().CreateAudioDevice(event.peerDevId);
382 } else if (event.type == EventType::EVENT_CHANNEL_CLOSED) {
383 DHLOGI("Received control channel closed event, clear audio device for peerDevId=%{public}s",
384 GetAnonyString(event.peerDevId).c_str());
385 std::string eventStr = event.content;
386 DAudioSinkManager::GetInstance().NotifyEvent(event.peerDevId, DISABLE_DEVICE, eventStr);
387 } else {
388 DHLOGE("Invaild event type.");
389 }
390 return DH_SUCCESS;
391 }
392
PauseDistributedHardware(const std::string & networkId)393 int32_t DAudioSinkManager::PauseDistributedHardware(const std::string &networkId)
394 {
395 std::lock_guard<std::mutex> lock(devMapMutex_);
396 if (audioDevMap_.find(networkId) != audioDevMap_.end()) {
397 DHLOGI("Audio sink dev in map. devId: %{public}s.", GetAnonyString(networkId).c_str());
398 CHECK_NULL_RETURN(audioDevMap_[networkId], ERR_DH_AUDIO_NULLPTR);
399 audioDevMap_[networkId]->PauseDistributedHardware(networkId);
400 }
401 return DH_SUCCESS;
402 }
403
ResumeDistributedHardware(const std::string & networkId)404 int32_t DAudioSinkManager::ResumeDistributedHardware(const std::string &networkId)
405 {
406 std::lock_guard<std::mutex> lock(devMapMutex_);
407 if (audioDevMap_.find(networkId) != audioDevMap_.end()) {
408 DHLOGI("Audio sink dev in map. devId: %{public}s.", GetAnonyString(networkId).c_str());
409 CHECK_NULL_RETURN(audioDevMap_[networkId], ERR_DH_AUDIO_NULLPTR);
410 audioDevMap_[networkId]->ResumeDistributedHardware(networkId);
411 }
412 return DH_SUCCESS;
413 }
414
StopDistributedHardware(const std::string & networkId)415 int32_t DAudioSinkManager::StopDistributedHardware(const std::string &networkId)
416 {
417 std::lock_guard<std::mutex> lock(devMapMutex_);
418 if (audioDevMap_.find(networkId) != audioDevMap_.end()) {
419 DHLOGI("Audio sink dev in map. devId: %{public}s.", GetAnonyString(networkId).c_str());
420 CHECK_NULL_RETURN(audioDevMap_[networkId], ERR_DH_AUDIO_NULLPTR);
421 audioDevMap_[networkId]->StopDistributedHardware(networkId);
422 }
423 return DH_SUCCESS;
424 }
425
CheckDeviceSecurityLevel(const std::string & srcDeviceId,const std::string & dstDeviceId)426 bool DAudioSinkManager::CheckDeviceSecurityLevel(const std::string &srcDeviceId, const std::string &dstDeviceId)
427 {
428 DHLOGD("CheckDeviceSecurityLevel srcDeviceId %{public}s, dstDeviceId %{public}s.",
429 GetAnonyString(srcDeviceId).c_str(), GetAnonyString(dstDeviceId).c_str());
430 std::string srcUdid = GetUdidByNetworkId(srcDeviceId);
431 if (srcUdid.empty()) {
432 DHLOGE("src udid is empty");
433 return false;
434 }
435 std::string dstUdid = GetUdidByNetworkId(dstDeviceId);
436 if (dstUdid.empty()) {
437 DHLOGE("dst udid is empty");
438 return false;
439 }
440 DHLOGD("CheckDeviceSecurityLevel srcUdid %{public}s, dstUdid %{public}s.",
441 GetAnonyString(srcUdid).c_str(), GetAnonyString(dstUdid).c_str());
442 int32_t srcDeviceSecurityLevel = GetDeviceSecurityLevel(srcUdid);
443 int32_t dstDeviceSecurityLevel = GetDeviceSecurityLevel(dstUdid);
444 DHLOGD("SrcDeviceSecurityLevel, level is %{public}d", srcDeviceSecurityLevel);
445 DHLOGD("dstDeviceSecurityLevel, level is %{public}d", dstDeviceSecurityLevel);
446 if (srcDeviceSecurityLevel == DEFAULT_DEVICE_SECURITY_LEVEL ||
447 srcDeviceSecurityLevel < dstDeviceSecurityLevel) {
448 DHLOGE("The device security of source device is lower.");
449 return false;
450 }
451 return true;
452 }
453
GetDeviceSecurityLevel(const std::string & udid)454 int32_t DAudioSinkManager::GetDeviceSecurityLevel(const std::string &udid)
455 {
456 DeviceIdentify devIdentify;
457 devIdentify.length = DEVICE_ID_MAX_LEN;
458 int32_t ret = memcpy_s(devIdentify.identity, DEVICE_ID_MAX_LEN, udid.c_str(), DEVICE_ID_MAX_LEN);
459 if (ret != DH_SUCCESS) {
460 DHLOGE("Str copy failed %{public}d", ret);
461 return DEFAULT_DEVICE_SECURITY_LEVEL;
462 }
463 DeviceSecurityInfo *info = nullptr;
464 ret = RequestDeviceSecurityInfo(&devIdentify, nullptr, &info);
465 if (ret != DH_SUCCESS) {
466 DHLOGE("Request device security info failed %{public}d", ret);
467 FreeDeviceSecurityInfo(info);
468 info = nullptr;
469 return DEFAULT_DEVICE_SECURITY_LEVEL;
470 }
471 int32_t level = 0;
472 ret = GetDeviceSecurityLevelValue(info, &level);
473 DHLOGE("Get device security level, level is %{public}d", level);
474 FreeDeviceSecurityInfo(info);
475 info = nullptr;
476 if (ret != DH_SUCCESS) {
477 DHLOGE("Get device security level failed %{public}d", ret);
478 return DEFAULT_DEVICE_SECURITY_LEVEL;
479 }
480 return level;
481 }
482
GetUdidByNetworkId(const std::string & networkId)483 std::string DAudioSinkManager::GetUdidByNetworkId(const std::string &networkId)
484 {
485 if (networkId.empty()) {
486 DHLOGE("networkId is empty!");
487 return "";
488 }
489 int32_t ret = DeviceManager::GetInstance().InitDeviceManager(PKG_NAME, initCallback_);
490 if (ret != ERR_OK) {
491 DHLOGE("InitDeviceManager failed ret = %{public}d", ret);
492 }
493 std::string udid = "";
494 ret = DeviceManager::GetInstance().GetUdidByNetworkId(PKG_NAME, networkId, udid);
495 if (ret != ERR_OK) {
496 DHLOGE("GetUdidByNetworkId failed ret = %{public}d", ret);
497 return "";
498 }
499 return udid;
500 }
501
VerifySecurityLevel(const std::string & devId)502 int32_t DAudioSinkManager::VerifySecurityLevel(const std::string &devId)
503 {
504 std::string subType = "mic";
505 CHECK_NULL_RETURN(ipcSinkCallback_, ERR_DH_AUDIO_FAILED);
506 int32_t ret = ipcSinkCallback_->OnNotifyResourceInfo(ResourceEventType::EVENT_TYPE_QUERY_RESOURCE, subType, devId,
507 isSensitive_, isSameAccount_);
508 if (ret != DH_SUCCESS) {
509 DHLOGE("Query resource failed, ret: %{public}d", ret);
510 return ret;
511 }
512 DHLOGD("VerifySecurityLevel isSensitive: %{public}d, isSameAccount: %{public}d", isSensitive_, isSameAccount_);
513 if (isSensitive_ && !isSameAccount_) {
514 DHLOGE("Privacy resource must be logged in with same account.");
515 return ERR_DH_AUDIO_FAILED;
516 }
517
518 if (isCheckSecLevel_) {
519 std::string sinkDevId = "";
520 ret = GetLocalDeviceNetworkId(sinkDevId);
521 if (ret != DH_SUCCESS) {
522 DHLOGE("GetLocalDeviceNetworkId failed, ret: %{public}d", ret);
523 return ret;
524 }
525 if (isSensitive_ && !CheckDeviceSecurityLevel(devId, sinkDevId)) {
526 DHLOGE("Check device security level failed!");
527 return ERR_DH_AUDIO_FAILED;
528 }
529 }
530 return DH_SUCCESS;
531 }
532
OnRemoteDied()533 void DeviceInitCallback::OnRemoteDied()
534 {
535 DHLOGI("DeviceInitCallback OnRemoteDied");
536 }
537 } // namespace DistributedHardware
538 } // namespace OHOS
539