• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2025 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 "dcamera_host.h"
17 
18 #include <cstdlib>
19 #include "iservice_registry.h"
20 #include "iproxy_broker.h"
21 #include "iservmgr_hdi.h"
22 
23 #include "anonymous_string.h"
24 #include "distributed_hardware_log.h"
25 #include "metadata_utils.h"
26 #include "dcamera.h"
27 
28 namespace OHOS {
29 namespace DistributedHardware {
30 OHOS::sptr<DCameraHost> DCameraHost::instance_ = nullptr;
31 DCameraHost::AutoRelease DCameraHost::autoRelease_;
32 
CameraHostImplGetInstance(void)33 extern "C" ICameraHost *CameraHostImplGetInstance(void)
34 {
35     return static_cast<ICameraHost *>(DCameraHost::GetInstance().GetRefPtr());
36 }
37 
GetInstance()38 OHOS::sptr<DCameraHost> DCameraHost::GetInstance()
39 {
40     if (instance_ == nullptr) {
41         instance_ = sptr<DCameraHost>(new DCameraHost());
42         if (instance_ == nullptr) {
43             DHLOGE("Get distributed camera host instance failed.");
44             return nullptr;
45         }
46     }
47     return instance_;
48 }
49 
SetCallback(const sptr<HDI::Camera::V1_0::ICameraHostCallback> & callbackObj)50 int32_t DCameraHost::SetCallback(const sptr<HDI::Camera::V1_0::ICameraHostCallback> &callbackObj)
51 {
52     if (callbackObj == nullptr) {
53         DHLOGE("DCameraHost::SetCallback, input camera host callback is null.");
54         return CamRetCode::INVALID_ARGUMENT;
55     }
56     dCameraHostCallback_ = callbackObj;
57     return CamRetCode::NO_ERROR;
58 }
59 
SetCallback_V1_2(const sptr<HDI::Camera::V1_2::ICameraHostCallback> & callbackObj)60 int32_t DCameraHost::SetCallback_V1_2(const sptr<HDI::Camera::V1_2::ICameraHostCallback> &callbackObj)
61 {
62     if (callbackObj == nullptr) {
63         DHLOGE("DCameraHost::SetCallback_V1_2, input camera host callback is null.");
64         return CamRetCode::INVALID_ARGUMENT;
65     }
66     dCameraHostCallback_V1_2_ = callbackObj;
67     return CamRetCode::NO_ERROR;
68 }
69 
GetCameraIds(std::vector<std::string> & cameraIds)70 int32_t DCameraHost::GetCameraIds(std::vector<std::string> &cameraIds)
71 {
72     std::lock_guard<std::mutex> autoLock(deviceMapLock_);
73     auto iter = dCameraDeviceMap_.begin();
74     while (iter != dCameraDeviceMap_.end()) {
75         if (!(iter->first).empty()) {
76             cameraIds.push_back(iter->first);
77         }
78         iter++;
79     }
80     return CamRetCode::NO_ERROR;
81 }
82 
GetCameraAbilityFromDev(const std::string & cameraId,std::shared_ptr<CameraAbility> & cameraAbility)83 int32_t DCameraHost::GetCameraAbilityFromDev(const std::string &cameraId, std::shared_ptr<CameraAbility> &cameraAbility)
84 {
85     OHOS::sptr<DCameraDevice> device = nullptr;
86     {
87         std::lock_guard<std::mutex> autoLock(deviceMapLock_);
88         auto iter = dCameraDeviceMap_.find(cameraId);
89         if (iter == dCameraDeviceMap_.end() || iter->second == nullptr) {
90             DHLOGE("DCameraHost::Get Cameradevice failed");
91             return CamRetCode::INVALID_ARGUMENT;
92         } else {
93             device = iter->second;
94         }
95     }
96     if (device->GetDCameraAbility(cameraAbility) != CamRetCode::NO_ERROR) {
97         DHLOGE("DCameraHost::GetCameraAbilityFromDev, GetDCameraAbility failed.");
98         return CamRetCode::INVALID_ARGUMENT;
99     }
100     return CamRetCode::NO_ERROR;
101 }
102 
GetCameraAbility(const std::string & cameraId,std::vector<uint8_t> & cameraAbility)103 int32_t DCameraHost::GetCameraAbility(const std::string &cameraId, std::vector<uint8_t> &cameraAbility)
104 {
105     if (IsCameraIdInvalid(cameraId)) {
106         DHLOGE("DCameraHost::GetCameraAbility, input cameraId is invalid.");
107         return CamRetCode::INVALID_ARGUMENT;
108     }
109     DHLOGI("DCameraHost::GetCameraAbility for cameraId: %{public}s", GetAnonyString(cameraId).c_str());
110     std::shared_ptr<CameraAbility> ability;
111     int32_t ret = GetCameraAbilityFromDev(cameraId, ability);
112     if (ret != CamRetCode::NO_ERROR) {
113         DHLOGE("DCameraHost::GetCameraAbility, GetCameraAbilityFromDev failed.");
114         return CamRetCode::INVALID_ARGUMENT;
115     }
116     bool retBool = OHOS::Camera::MetadataUtils::ConvertMetadataToVec(ability, cameraAbility);
117     if (!retBool) {
118         DHLOGE("DCameraHost::GetCameraAbility, ConvertMetadataToVec failed.");
119         return CamRetCode::INVALID_ARGUMENT;
120     }
121     do {
122         camera_metadata_item_t item;
123         constexpr uint32_t WIDTH_OFFSET = 1;
124         constexpr uint32_t HEIGHT_OFFSET = 2;
125         constexpr uint32_t UNIT_LENGTH = 3;
126         ret = OHOS::Camera::FindCameraMetadataItem(ability->get(),
127             OHOS_ABILITY_STREAM_AVAILABLE_BASIC_CONFIGURATIONS, &item);
128         DHLOGI("FindCameraMetadataItem item=%{public}u, count=%{public}u, dataType=%{public}u", item.item,
129             item.count, item.data_type);
130         if (ret != CAM_META_SUCCESS) {
131             DHLOGE("Failed to find stream configuration in camera ability with return code %{public}d", ret);
132             break;
133         }
134         if (item.count % UNIT_LENGTH != 0) {
135             DHLOGE("Invalid stream configuration count: %{public}u", item.count);
136             break;
137         }
138         for (uint32_t index = 0; index < item.count; index += UNIT_LENGTH) {
139             int32_t format = item.data.i32[index];
140             int32_t width = item.data.i32[index + WIDTH_OFFSET];
141             int32_t height = item.data.i32[index + HEIGHT_OFFSET];
142             DHLOGD("format: %{public}d, width: %{public}d, height: %{public}d", format, width, height);
143         }
144     } while (0);
145     return CamRetCode::NO_ERROR;
146 }
147 
148 template<typename Callback, typename Device>
OpenCameraImpl(const std::string & cameraId,const Callback & callbackObj,Device & device)149 int32_t DCameraHost::OpenCameraImpl(const std::string &cameraId, const Callback &callbackObj, Device &device)
150 {
151     if (IsCameraIdInvalid(cameraId) || callbackObj == nullptr) {
152         DHLOGE("OpenCameraImpl, open camera id is invalid or camera device callback is null.");
153         return CamRetCode::INVALID_ARGUMENT;
154     }
155 
156     DHLOGI("OpenCameraImpl for cameraId: %{public}s", GetAnonyString(cameraId).c_str());
157 
158     OHOS::sptr<DCameraDevice> dcameraDevice = nullptr;
159     {
160         std::lock_guard<std::mutex> autoLock(deviceMapLock_);
161         auto iter = dCameraDeviceMap_.find(cameraId);
162         if (iter == dCameraDeviceMap_.end()) {
163             DHLOGE("OpenCameraImpl, dcamera device not found.");
164             return CamRetCode::INSUFFICIENT_RESOURCES;
165         }
166 
167         dcameraDevice = iter->second;
168         if (dcameraDevice == nullptr) {
169             DHLOGE("OpenCameraImpl, dcamera device is null.");
170             return INSUFFICIENT_RESOURCES;
171         }
172     }
173 
174     if (dcameraDevice->IsOpened()) {
175         DHLOGE("OpenCameraImpl, dcamera device %{public}s already opened.", GetAnonyString(cameraId).c_str());
176         return CamRetCode::CAMERA_BUSY;
177     }
178 
179     CamRetCode ret = dcameraDevice->OpenDCamera(callbackObj);
180     if (ret != CamRetCode::NO_ERROR) {
181         DHLOGE("OpenCameraImpl, open camera failed.");
182         return ret;
183     }
184     device = dcameraDevice;
185 
186     DHLOGI("OpenCameraImpl, open camera %{public}s success.", GetAnonyString(cameraId).c_str());
187     return CamRetCode::NO_ERROR;
188 }
189 
OpenCamera(const std::string & cameraId,const sptr<ICameraDeviceCallback> & callbackObj,sptr<HDI::Camera::V1_0::ICameraDevice> & device)190 int32_t DCameraHost::OpenCamera(const std::string &cameraId, const sptr<ICameraDeviceCallback> &callbackObj,
191     sptr<HDI::Camera::V1_0::ICameraDevice> &device)
192 {
193     return OpenCameraImpl(cameraId, callbackObj, device);
194 }
195 
OpenCamera_V1_1(const std::string & cameraId,const sptr<ICameraDeviceCallback> & callbackObj,sptr<HDI::Camera::V1_1::ICameraDevice> & device)196 int32_t DCameraHost::OpenCamera_V1_1(const std::string &cameraId, const sptr<ICameraDeviceCallback> &callbackObj,
197     sptr<HDI::Camera::V1_1::ICameraDevice> &device)
198 {
199     return OpenCameraImpl(cameraId, callbackObj, device);
200 }
201 
OpenCamera_V1_2(const std::string & cameraId,const sptr<ICameraDeviceCallback> & callbackObj,sptr<HDI::Camera::V1_2::ICameraDevice> & device)202 int32_t DCameraHost::OpenCamera_V1_2(const std::string &cameraId, const sptr<ICameraDeviceCallback> &callbackObj,
203     sptr<HDI::Camera::V1_2::ICameraDevice> &device)
204 {
205     return OpenCameraImpl(cameraId, callbackObj, device);
206 }
207 
OpenCamera_V1_3(const std::string & cameraId,const sptr<ICameraDeviceCallback> & callbackObj,sptr<ICameraDevice> & device)208 int32_t DCameraHost::OpenCamera_V1_3(const std::string &cameraId, const sptr<ICameraDeviceCallback> &callbackObj,
209     sptr<ICameraDevice> &device)
210 {
211     return OpenCameraImpl(cameraId, callbackObj, device);
212 }
213 
OpenSecureCamera(const std::string & cameraId,const sptr<ICameraDeviceCallback> & callbackObj,sptr<ICameraDevice> & device)214 int32_t DCameraHost::OpenSecureCamera(const std::string &cameraId, const sptr<ICameraDeviceCallback> &callbackObj,
215     sptr<ICameraDevice> &device)
216 {
217     return OpenCameraImpl(cameraId, callbackObj, device);
218 }
219 
GetResourceCost(const std::string & cameraId,OHOS::HDI::Camera::V1_3::CameraDeviceResourceCost & resourceCost)220 int32_t DCameraHost::GetResourceCost(const std::string &cameraId,
221     OHOS::HDI::Camera::V1_3::CameraDeviceResourceCost &resourceCost)
222 {
223     (void)cameraId;
224     (void)resourceCost;
225     return CamRetCode::METHOD_NOT_SUPPORTED;
226 }
227 
NotifyDeviceStateChangeInfo(int notifyType,int deviceState)228 int32_t DCameraHost::NotifyDeviceStateChangeInfo(int notifyType, int deviceState)
229 {
230     (void)notifyType;
231     (void)deviceState;
232     DHLOGI("DCameraHost::NotifyDeviceStateChangeInfo, distributed camera not support.");
233 
234     return CamRetCode::METHOD_NOT_SUPPORTED;
235 }
236 
SetFlashlight(const std::string & cameraId,bool isEnable)237 int32_t DCameraHost::SetFlashlight(const std::string &cameraId, bool isEnable)
238 {
239     (void)cameraId;
240     (void)isEnable;
241     DHLOGI("DCameraHost::SetFlashlight, distributed camera not support.");
242 
243     return CamRetCode::METHOD_NOT_SUPPORTED;
244 }
245 
SetFlashlight_V1_2(float level)246 int32_t DCameraHost::SetFlashlight_V1_2(float level)
247 {
248     (void)level;
249     DHLOGI("DCameraHost::SetFlashlight_V1_2, distributed camera not support.");
250 
251     return CamRetCode::METHOD_NOT_SUPPORTED;
252 }
253 
PreCameraSwitch(const std::string & cameraId)254 int32_t DCameraHost::PreCameraSwitch(const std::string &cameraId)
255 {
256     (void)cameraId;
257     DHLOGI("DCameraHost::PreCameraSwitch, distributed camera not support.");
258 
259     return CamRetCode::METHOD_NOT_SUPPORTED;
260 }
261 
PrelaunchWithOpMode(const PrelaunchConfig & config,int32_t operationMode)262 int32_t DCameraHost::PrelaunchWithOpMode(const PrelaunchConfig &config, int32_t operationMode)
263 {
264     (void)config;
265     (void)operationMode;
266     DHLOGI("DCameraHost::PrelaunchWithOpMode, distributed camera not support.");
267 
268     return CamRetCode::METHOD_NOT_SUPPORTED;
269 }
270 
Prelaunch(const PrelaunchConfig & config)271 int32_t DCameraHost::Prelaunch(const PrelaunchConfig &config)
272 {
273     (void)config;
274     DHLOGI("DCameraHost::Prelaunch, distributed camera not support.");
275 
276     return CamRetCode::METHOD_NOT_SUPPORTED;
277 }
278 
AddDeviceParamCheck(const DHBase & dhBase,const std::string & sinkAbilityInfo,const std::string & sourceCodecInfo,const sptr<IDCameraProviderCallback> & callback)279 DCamRetCode DCameraHost::AddDeviceParamCheck(const DHBase &dhBase, const std::string& sinkAbilityInfo,
280     const std::string &sourceCodecInfo, const sptr<IDCameraProviderCallback> &callback)
281 {
282     if (IsDhBaseInfoInvalid(dhBase)) {
283         DHLOGE("DCameraHost::AddDCameraDevice, devId or dhId is invalid.");
284         return DCamRetCode::INVALID_ARGUMENT;
285     }
286     DHLOGI("DCameraHost::AddDCameraDevice for {devId: %{public}s, dhId: %{public}s}",
287         GetAnonyString(dhBase.deviceId_).c_str(), GetAnonyString(dhBase.dhId_).c_str());
288 
289     if (sinkAbilityInfo.empty() || sinkAbilityInfo.length() > ABILITYINFO_MAX_LENGTH) {
290         DHLOGE("DCameraHost::AddDCameraDevice, input sinkAbilityInfo is invalid.");
291         return DCamRetCode::INVALID_ARGUMENT;
292     }
293 
294     if (sourceCodecInfo.empty() || sourceCodecInfo.length() > ABILITYINFO_MAX_LENGTH) {
295         DHLOGE("DCameraHost::AddDCameraDevice, input sourceCodecInfo is invalid.");
296         return DCamRetCode::INVALID_ARGUMENT;
297     }
298     if (GetCamDevNum() > MAX_DCAMERAS_NUMBER) {
299         DHLOGE("DCameraHost::AddDCameraDevice, cameras exceed the upper limit.");
300         return DCamRetCode::INVALID_ARGUMENT;
301     }
302     return DCamRetCode::SUCCESS;
303 }
304 
AddDCameraDevice(const DHBase & dhBase,const std::string & sinkAbilityInfo,const std::string & sourceCodecInfo,const sptr<IDCameraProviderCallback> & callback)305 DCamRetCode DCameraHost::AddDCameraDevice(const DHBase &dhBase, const std::string& sinkAbilityInfo,
306     const std::string &sourceCodecInfo, const sptr<IDCameraProviderCallback> &callback)
307 {
308     if (AddDeviceParamCheck(dhBase, sinkAbilityInfo, sourceCodecInfo, callback) != DCamRetCode::SUCCESS) {
309         DHLOGE("DCameraHost::AddDCameraDevice, input param is invalid.");
310         return DCamRetCode::INVALID_ARGUMENT;
311     }
312     std::string dCameraId = dhBase.deviceId_ + "__" + dhBase.dhId_;
313     {
314         std::lock_guard<std::mutex> autoLock(deviceMapLock_);
315         if (dCameraDeviceMap_.find(dCameraId) != dCameraDeviceMap_.end()) {
316             if (dCameraDeviceMap_[dCameraId] == nullptr) {
317                 DHLOGI("AddDCameraDevice device is null");
318                 return DCamRetCode::INVALID_ARGUMENT;
319             }
320             dCameraDeviceMap_[dCameraId]->SetDcameraAbility(sinkAbilityInfo);
321             DHLOGI("AddDCameraDevice refresh data success");
322             return DCamRetCode::SUCCESS;
323         }
324     }
325     OHOS::sptr<DCameraDevice> dcameraDevice(new (std::nothrow) DCameraDevice(dhBase, sinkAbilityInfo,
326         sourceCodecInfo));
327     if (dcameraDevice == nullptr) {
328         DHLOGE("DCameraHost::AddDCameraDevice, create dcamera device failed.");
329         return DCamRetCode::INVALID_ARGUMENT;
330     }
331     {
332         std::lock_guard<std::mutex> autoLock(deviceMapLock_);
333         dCameraDeviceMap_[dCameraId] = dcameraDevice;
334     }
335     if (callback == nullptr) {
336         DHLOGE("DCameraHost::SetProviderCallback failed, callback is null");
337         return DCamRetCode::INVALID_ARGUMENT;
338     }
339     dcameraDevice->SetProviderCallback(callback);
340     if (dCameraHostCallback_ != nullptr) {
341         dCameraHostCallback_->OnCameraEvent(dCameraId, CameraEvent::CAMERA_EVENT_DEVICE_ADD);
342     }
343     if (dCameraHostCallback_V1_2_ != nullptr) {
344         dCameraHostCallback_V1_2_->OnCameraEvent(dCameraId, CameraEvent::CAMERA_EVENT_DEVICE_ADD);
345     }
346     sptr<IRemoteObject> remote = OHOS::HDI::hdi_objcast<IDCameraProviderCallback>(callback);
347     if (remote != nullptr) {
348         AddClearRegisterRecipient(remote, dhBase);
349     }
350     DHLOGI("AddDCameraDevice create dcamera device success, dCameraId: %{public}s", GetAnonyString(dCameraId).c_str());
351     return DCamRetCode::SUCCESS;
352 }
353 
GetCamDevNum()354 size_t DCameraHost::GetCamDevNum()
355 {
356     std::lock_guard<std::mutex> autoLock(deviceMapLock_);
357     return dCameraDeviceMap_.size();
358 }
359 
RemoveDCameraDevice(const DHBase & dhBase)360 DCamRetCode DCameraHost::RemoveDCameraDevice(const DHBase &dhBase)
361 {
362     DHLOGI("DCameraHost::RemoveDCameraDevice for {devId: %{public}s, dhId: %{public}s}",
363         GetAnonyString(dhBase.deviceId_).c_str(), GetAnonyString(dhBase.dhId_).c_str());
364 
365     std::string dCameraId = GetCameraIdByDHBase(dhBase);
366     if (dCameraId.empty()) {
367         DHLOGE("DCameraHost::RemoveDCameraDevice, dhBase not exist.");
368         return DCamRetCode::INVALID_ARGUMENT;
369     }
370 
371     OHOS::sptr<DCameraDevice> dcameraDevice = GetDCameraDeviceByDHBase(dhBase);
372     if (dcameraDevice != nullptr) {
373         if (dcameraDevice->IsOpened()) {
374             dcameraDevice->Close();
375         }
376         dcameraDevice->SetProviderCallback(nullptr);
377         sptr<IDCameraProviderCallback> callback = dcameraDevice->GetProviderCallback();
378         if (callback != nullptr) {
379             sptr<IRemoteObject> remoteObj = OHOS::HDI::hdi_objcast<IDCameraProviderCallback>(callback);
380             if (remoteObj != nullptr) {
381                 RemoveClearRegisterRecipient(remoteObj, dhBase);
382             }
383         }
384     }
385     {
386         std::lock_guard<std::mutex> autoLock(deviceMapLock_);
387         dCameraDeviceMap_.erase(dCameraId);
388     }
389 
390     if (dCameraHostCallback_ != nullptr) {
391         dCameraHostCallback_->OnCameraEvent(dCameraId, CameraEvent::CAMERA_EVENT_DEVICE_RMV);
392     }
393 
394     if (dCameraHostCallback_V1_2_ != nullptr) {
395         dCameraHostCallback_V1_2_->OnCameraEvent(dCameraId, CameraEvent::CAMERA_EVENT_DEVICE_RMV);
396     }
397 
398     DHLOGI("DCameraHost::RemoveDCameraDevice, remove dcamera device success, dCameraId: %{public}s",
399         GetAnonyString(dCameraId).c_str());
400     return DCamRetCode::SUCCESS;
401 }
402 
IsCameraIdInvalid(const std::string & cameraId)403 bool DCameraHost::IsCameraIdInvalid(const std::string &cameraId)
404 {
405     if (cameraId.empty() || cameraId.length() > ID_MAX_SIZE) {
406         return true;
407     }
408 
409     std::lock_guard<std::mutex> autoLock(deviceMapLock_);
410     auto iter = dCameraDeviceMap_.begin();
411     while (iter != dCameraDeviceMap_.end()) {
412         if (cameraId == iter->first) {
413             return false;
414         }
415         iter++;
416     }
417     return true;
418 }
419 
GetCameraIdByDHBase(const DHBase & dhBase)420 std::string DCameraHost::GetCameraIdByDHBase(const DHBase &dhBase)
421 {
422     std::string dcameraId = dhBase.deviceId_ + "__" + dhBase.dhId_;
423     return dcameraId;
424 }
425 
GetDCameraDeviceByDHBase(const DHBase & dhBase)426 OHOS::sptr<DCameraDevice> DCameraHost::GetDCameraDeviceByDHBase(const DHBase &dhBase)
427 {
428     std::string dCameraId = GetCameraIdByDHBase(dhBase);
429     if (dCameraId.empty()) {
430         DHLOGE("DCameraHost::GetDCameraDeviceByDHBase, dhBase not exist.");
431         return nullptr;
432     }
433 
434     std::lock_guard<std::mutex> autoLock(deviceMapLock_);
435     auto iter = dCameraDeviceMap_.find(dCameraId);
436     if (iter == dCameraDeviceMap_.end()) {
437         DHLOGE("DCameraHost::GetDCameraDeviceByDHBase, dcamera device not found.");
438         return nullptr;
439     }
440     return iter->second;
441 }
442 
NotifyDCameraStatus(const DHBase & dhBase,int32_t result)443 void DCameraHost::NotifyDCameraStatus(const DHBase &dhBase, int32_t result)
444 {
445     std::string dCameraId = GetCameraIdByDHBase(dhBase);
446     if (dCameraId.empty()) {
447         DHLOGE("DCameraHost::NotifyDCameraStatus, dhBase not exist.");
448         return;
449     }
450     if (dCameraHostCallback_ != nullptr) {
451         dCameraHostCallback_->OnCameraStatus(dCameraId, CameraStatus::UN_AVAILABLE);
452     }
453     if (dCameraHostCallback_V1_2_ != nullptr) {
454         dCameraHostCallback_V1_2_->OnCameraStatus(dCameraId, CameraStatus::UN_AVAILABLE);
455     }
456 }
457 
458 //LCOV_EXCL_START
RegisterCameraHdfListener(const std::string & serviceName,const sptr<IDCameraHdfCallback> & callbackObj)459 DCamRetCode DCameraHost::RegisterCameraHdfListener(const std::string &serviceName,
460     const sptr<IDCameraHdfCallback> &callbackObj)
461 {
462     DHLOGI("Register camera HDF listener, serviceName: %{public}s.", GetAnonyString(serviceName).c_str());
463     if (callbackObj == nullptr) {
464         DHLOGE("dcamera hdf callback is null.");
465         return DCamRetCode::INVALID_ARGUMENT;
466     }
467     sptr<IRemoteObject> remote = OHOS::HDI::hdi_objcast<IDCameraHdfCallback>(callbackObj);
468     if (remote == nullptr) {
469         DHLOGE("Remote callback is nullptr.");
470         return DCamRetCode::FAILED;
471     }
472     if (dCameraHostRecipient_ == nullptr) {
473         DHLOGE("dcamera host recipient is null.");
474         return DCamRetCode::FAILED;
475     }
476     if (!remote->AddDeathRecipient(dCameraHostRecipient_)) {
477         DHLOGE("AddDeathRecipient failed, serviceName: %{public}s.", GetAnonyString(serviceName).c_str());
478         return DCamRetCode::FAILED;
479     }
480     std::lock_guard<std::mutex> lock(hdfCallbackMapMtx_);
481     if (mapCameraHdfCallback_.find(serviceName) != mapCameraHdfCallback_.end()) {
482         DHLOGI("The callback has been registered and will be replaced, serviceName: %{public}s.",
483             GetAnonyString(serviceName).c_str());
484     }
485     mapCameraHdfCallback_[serviceName] = callbackObj;
486     DHLOGI("Register camera HDF listener suncess, serviceName: %{public}s.", GetAnonyString(serviceName).c_str());
487     return DCamRetCode::SUCCESS;
488 }
489 //LCOV_EXCL_STOP
490 
UnRegisterCameraHdfListener(const std::string & serviceName)491 DCamRetCode DCameraHost::UnRegisterCameraHdfListener(const std::string &serviceName)
492 {
493     DHLOGI("Unregister camera HDF listener, serviceName: %{public}s.", GetAnonyString(serviceName).c_str());
494     std::lock_guard<std::mutex> lock(hdfCallbackMapMtx_);
495     auto itCallback = mapCameraHdfCallback_.find(serviceName);
496     if (itCallback == mapCameraHdfCallback_.end() || itCallback->second == nullptr) {
497         DHLOGE("Camera HDF callback has not been created or is null ptr.");
498         return DCamRetCode::FAILED;
499     }
500     sptr<IRemoteObject> remote = OHOS::HDI::hdi_objcast<IDCameraHdfCallback>(itCallback->second);
501     if (remote == nullptr) {
502         DHLOGE("Remote callback is nullptr.");
503         return DCamRetCode::FAILED;
504     }
505     if (!remote->RemoveDeathRecipient(dCameraHostRecipient_)) {
506         DHLOGE("RemoveDeathRecipient failed, serviceName: %{public}s.", GetAnonyString(serviceName).c_str());
507         return DCamRetCode::FAILED;
508     }
509     mapCameraHdfCallback_.erase(itCallback);
510     DHLOGI("Unregister camera HDF listener suncess, serviceName: %{public}s.", GetAnonyString(serviceName).c_str());
511     return DCamRetCode::SUCCESS;
512 }
513 
514 //LCOV_EXCL_START
OnRemoteDied(const wptr<IRemoteObject> & remote)515 void DCameraHost::ClearRegisterRecipient::OnRemoteDied(const wptr<IRemoteObject> &remote)
516 {
517     DHLOGI("Remote died, remote dcamera device begin.");
518     auto dCameraHost = DCameraHost::GetInstance();
519     if (dCameraHost != nullptr) {
520         dCameraHost->RemoveDCameraDevice(dhBase_);
521     }
522     needErase_ = true;
523     DHLOGI("Remote died, remote dcamera device end.");
524 }
525 
OnRemoteDied(const wptr<IRemoteObject> & remote)526 void DCameraHost::DCameraHostRecipient::OnRemoteDied(const wptr<IRemoteObject> &remote)
527 {
528     DHLOGE("Exit the current process.");
529     _Exit(0);
530 }
531 //LCOV_EXCL_STOP
532 
AddClearRegisterRecipient(sptr<IRemoteObject> & remote,const DHBase & dhBase)533 int32_t DCameraHost::AddClearRegisterRecipient(sptr<IRemoteObject> &remote, const DHBase &dhBase)
534 {
535     DHLOGI("add clear register recipient begin.");
536     auto clearRegisterRecipient = sptr<ClearRegisterRecipient>(new ClearRegisterRecipient(dhBase));
537     if (clearRegisterRecipient == nullptr) {
538         DHLOGE("Create clear register recipient object failed.");
539         return DCamRetCode::FAILED;
540     }
541     if (remote != nullptr && remote->AddDeathRecipient(clearRegisterRecipient) == false) {
542         DHLOGE("call AddDeathRecipient failed.");
543         return DCamRetCode::FAILED;
544     }
545     std::lock_guard<std::mutex> lock(clearRegisterRecipientsMtx_);
546     clearRegisterRecipients_.erase(std::remove_if(clearRegisterRecipients_.begin(), clearRegisterRecipients_.end(),
547         [](sptr<ClearRegisterRecipient> &clearRegisterRecipient) {
548             return clearRegisterRecipient->IsNeedErase();
549         }), clearRegisterRecipients_.end());
550     clearRegisterRecipients_.push_back(clearRegisterRecipient);
551     DHLOGI("add clear register recipient end.");
552     return DCamRetCode::SUCCESS;
553 }
554 
RemoveClearRegisterRecipient(sptr<IRemoteObject> & remote,const DHBase & dhBase)555 int32_t DCameraHost::RemoveClearRegisterRecipient(sptr<IRemoteObject> &remote, const DHBase &dhBase)
556 {
557     DHLOGI("remove clear register recipient begin.");
558     std::lock_guard<std::mutex> lock(clearRegisterRecipientsMtx_);
559     for (auto itRecipient = clearRegisterRecipients_.begin();
560         itRecipient != clearRegisterRecipients_.end(); ++itRecipient) {
561         auto &clearRegisterRecipient = *itRecipient;
562         if (clearRegisterRecipient->IsMatch(dhBase)) {
563             if (remote != nullptr && remote->RemoveDeathRecipient(clearRegisterRecipient) == false) {
564                 DHLOGE("call RemoveDeathRecipient failed.");
565             }
566             clearRegisterRecipients_.erase(itRecipient);
567             DHLOGI("remove one clear register recipient.");
568             break;
569         }
570     }
571     DHLOGI("remove clear register recipient end.");
572     return DCamRetCode::SUCCESS;
573 }
574 } // namespace DistributedHardware
575 } // namespace OHOS
576