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