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