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