1 /*
2 * Copyright (c) 2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "camera_host_service_callback.h"
17 #include "iproxy_broker.h"
18
19 namespace OHOS::Camera {
CameraHostServiceCallback(OHOS::sptr<ICameraHostCallback> cameraHostCallback,OHOS::sptr<ICameraHostVdi> cameraHostVdi,std::vector<CameraIdInfo> & cameraIdInfoList)20 CameraHostServiceCallback::CameraHostServiceCallback(OHOS::sptr<ICameraHostCallback> cameraHostCallback,
21 OHOS::sptr<ICameraHostVdi> cameraHostVdi, std::vector<CameraIdInfo> &cameraIdInfoList)
22 : cameraHostCallback_(cameraHostCallback),
23 cameraHostVdi_(cameraHostVdi),
24 cameraIdInfoList_(cameraIdInfoList)
25 {
26 }
27
OnCameraStatus(const std::string & cameraId,VdiCameraStatus status)28 int32_t CameraHostServiceCallback::OnCameraStatus(const std::string &cameraId, VdiCameraStatus status)
29 {
30 CHECK_IF_PTR_NULL_RETURN_VALUE(cameraHostCallback_, OHOS::HDI::Camera::V1_0::INVALID_ARGUMENT);
31 auto itr = std::find_if(cameraIdInfoList_.begin(), cameraIdInfoList_.end(),
32 [cameraId, this](const struct CameraIdInfo &cameraIdInfo) {
33 return cameraId == cameraIdInfo.vendorCameraId && cameraHostVdi_.GetRefPtr() == cameraIdInfo.cameraHostVdi;
34 });
35 if (itr == cameraIdInfoList_.end()) {
36 CAMERA_LOGE("Vendor camera id %{public}s doesn't exist", cameraId.c_str());
37 return OHOS::HDI::Camera::V1_0::INVALID_ARGUMENT;
38 }
39 CAMERA_LOGD("Current cameraId %{public}s, vendor camera id %{public}s, status=%{public}d",
40 itr->currentCameraId.c_str(), cameraId.c_str(), status);
41
42 return cameraHostCallback_->OnCameraStatus(itr->currentCameraId, static_cast<CameraStatus>(status));
43 }
44
OnFlashlightStatus(const std::string & cameraId,VdiFlashlightStatus status)45 int32_t CameraHostServiceCallback::OnFlashlightStatus(const std::string &cameraId, VdiFlashlightStatus status)
46 {
47 CHECK_IF_PTR_NULL_RETURN_VALUE(cameraHostCallback_, OHOS::HDI::Camera::V1_0::INVALID_ARGUMENT);
48 auto itr = std::find_if(cameraIdInfoList_.begin(), cameraIdInfoList_.end(),
49 [cameraId, this](const struct CameraIdInfo &cameraIdInfo) {
50 return cameraId == cameraIdInfo.vendorCameraId && cameraHostVdi_.GetRefPtr() == cameraIdInfo.cameraHostVdi;
51 });
52 if (itr == cameraIdInfoList_.end()) {
53 CAMERA_LOGE(" Vendor camera id %{public}s doesn't exist", cameraId.c_str());
54 return OHOS::HDI::Camera::V1_0::INVALID_ARGUMENT;
55 }
56
57 return cameraHostCallback_->OnFlashlightStatus(itr->currentCameraId, static_cast<FlashlightStatus>(status));
58 }
59
OnCameraEvent(const std::string & cameraId,VdiCameraEvent event)60 int32_t CameraHostServiceCallback::OnCameraEvent(const std::string &cameraId, VdiCameraEvent event)
61 {
62 CHECK_IF_PTR_NULL_RETURN_VALUE(cameraHostCallback_, OHOS::HDI::Camera::V1_0::INVALID_ARGUMENT);
63 std::string currentCameraId;
64 if (event == OHOS::VDI::Camera::V1_0::CAMERA_EVENT_DEVICE_ADD) {
65 auto itr = std::find_if(cameraIdInfoList_.begin(), cameraIdInfoList_.end(),
66 [](const struct CameraIdInfo &cameraIdInfo) {
67 return cameraIdInfo.isDeleted;
68 });
69 if (itr == cameraIdInfoList_.end()) {
70 struct CameraIdInfo cameraIdInfo;
71 currentCameraId = "lcam00" + std::to_string(cameraIdInfoList_.size() + 1);
72 cameraIdInfo.currentCameraId = currentCameraId;
73 cameraIdInfo.cameraHostVdi = cameraHostVdi_;
74 cameraIdInfo.vendorCameraId = cameraId;
75 cameraIdInfo.isDeleted = false;
76 cameraIdInfoList_.push_back(cameraIdInfo);
77 } else {
78 itr->cameraHostVdi = cameraHostVdi_;
79 itr->vendorCameraId = cameraId;
80 itr->isDeleted = false;
81 currentCameraId = itr->currentCameraId;
82 }
83 } else {
84 auto itr = std::find_if(cameraIdInfoList_.begin(), cameraIdInfoList_.end(),
85 [cameraId, this](const struct CameraIdInfo &cameraIdInfo) {
86 return cameraId == cameraIdInfo.vendorCameraId &&
87 cameraHostVdi_.GetRefPtr() == cameraIdInfo.cameraHostVdi;
88 });
89 if (itr == cameraIdInfoList_.end()) {
90 CAMERA_LOGE("Remove camera id error, vendor camera id %{public}s doesn't exist", cameraId.c_str());
91 return OHOS::HDI::Camera::V1_0::INVALID_ARGUMENT;
92 }
93 itr->isDeleted = true;
94 currentCameraId = itr->currentCameraId;
95 }
96 CAMERA_LOGD("Current cameraId %{public}s, vendor camera id %{public}s, event=%{public}d",
97 currentCameraId.c_str(), cameraId.c_str(), event);
98
99 return cameraHostCallback_->OnCameraEvent(currentCameraId, static_cast<CameraEvent>(event));
100 }
101
Remote() const102 const sptr<IRemoteObject> CameraHostServiceCallback::Remote() const
103 {
104 return OHOS::HDI::hdi_objcast<ICameraHostCallback>(cameraHostCallback_);
105 }
106
107 } // end namespace OHOS::Camera
108