• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2021-2022 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 <uv.h>
17 
18 #include "input/camera_info_napi.h"
19 #include "input/camera_manager_callback_napi.h"
20 
21 namespace OHOS {
22 namespace CameraStandard {
23 using namespace std;
24 using OHOS::HiviewDFX::HiLog;
25 using OHOS::HiviewDFX::HiLogLabel;
26 namespace {
27     constexpr HiLogLabel LABEL = {LOG_CORE, LOG_DOMAIN, "CameraManagerCallbackNapi"};
28 }
29 
CameraManagerCallbackNapi(napi_env env,napi_ref ref)30 CameraManagerCallbackNapi::CameraManagerCallbackNapi(napi_env env, napi_ref ref): env_(env), callbackRef_(ref)
31 {}
32 
~CameraManagerCallbackNapi()33 CameraManagerCallbackNapi::~CameraManagerCallbackNapi()
34 {
35 }
36 
OnCameraStatusCallbackAsync(const CameraStatusInfo & cameraStatusInfo) const37 void CameraManagerCallbackNapi::OnCameraStatusCallbackAsync(const CameraStatusInfo &cameraStatusInfo) const
38 {
39     MEDIA_DEBUG_LOG("OnCameraStatusCallbackAsync is called");
40     uv_loop_s* loop = nullptr;
41     napi_get_uv_event_loop(env_, &loop);
42     if (!loop) {
43         MEDIA_ERR_LOG("failed to get event loop");
44         return;
45     }
46     uv_work_t* work = new(std::nothrow) uv_work_t;
47     if (!work) {
48         MEDIA_ERR_LOG("failed to allocate work");
49         return;
50     }
51     std::unique_ptr<CameraStatusCallbackInfo> callbackInfo =
52         std::make_unique<CameraStatusCallbackInfo>(cameraStatusInfo, this);
53     work->data = callbackInfo.get();
54     int ret = uv_queue_work(loop, work, [] (uv_work_t* work) {}, [] (uv_work_t* work, int status) {
55         CameraStatusCallbackInfo* callbackInfo = reinterpret_cast<CameraStatusCallbackInfo *>(work->data);
56         if (callbackInfo) {
57             callbackInfo->listener_->OnCameraStatusCallback(callbackInfo->info_);
58             delete callbackInfo;
59         }
60         delete work;
61     });
62     if (ret) {
63         MEDIA_ERR_LOG("failed to execute work");
64         delete work;
65     } else {
66         callbackInfo.release();
67     }
68 }
69 
OnCameraStatusCallback(const CameraStatusInfo & cameraStatusInfo) const70 void CameraManagerCallbackNapi::OnCameraStatusCallback(const CameraStatusInfo &cameraStatusInfo) const
71 {
72     MEDIA_DEBUG_LOG("OnCameraStatusCallback is called");
73     napi_value result[ARGS_TWO];
74     napi_value callback = nullptr;
75     napi_value retVal;
76     napi_value propValue;
77     napi_value undefinedResult;
78 
79     napi_get_undefined(env_, &result[PARAM0]);
80     napi_get_undefined(env_, &result[PARAM1]);
81     napi_get_undefined(env_, &undefinedResult);
82 
83     CAMERA_NAPI_CHECK_NULL_PTR_RETURN_VOID(cameraStatusInfo.cameraDevice, "callback cameraDevice is null");
84 
85     napi_create_object(env_, &result[PARAM1]);
86 
87     if (cameraStatusInfo.cameraDevice != nullptr) {
88         napi_value cameraDeviceNapi = CameraDeviceNapi::CreateCameraObj(env_, cameraStatusInfo.cameraDevice);
89         napi_set_named_property(env_, result[PARAM1], "camera", cameraDeviceNapi);
90     } else {
91         MEDIA_ERR_LOG("Camera info is null");
92         napi_set_named_property(env_, result[PARAM1], "camera", undefinedResult);
93     }
94 
95     int32_t jsCameraStatus = -1;
96     jsCameraStatus = cameraStatusInfo.cameraStatus;
97     napi_create_int64(env_, jsCameraStatus, &propValue);
98     napi_set_named_property(env_, result[PARAM1], "status", propValue);
99 
100     napi_get_reference_value(env_, callbackRef_, &callback);
101     MEDIA_INFO_LOG("CameraId: %{public}s, CameraStatus: %{public}d",
102                    cameraStatusInfo.cameraDevice->GetID().c_str(), cameraStatusInfo.cameraStatus);
103     napi_call_function(env_, nullptr, callback, ARGS_TWO, result, &retVal);
104 }
105 
OnCameraStatusChanged(const CameraStatusInfo & cameraStatusInfo) const106 void CameraManagerCallbackNapi::OnCameraStatusChanged(const CameraStatusInfo &cameraStatusInfo) const
107 {
108     MEDIA_DEBUG_LOG("OnCameraStatusChanged is called, CameraStatus: %{public}d", cameraStatusInfo.cameraStatus);
109     OnCameraStatusCallbackAsync(cameraStatusInfo);
110 }
111 
OnFlashlightStatusChanged(const std::string & cameraID,const FlashStatus flashStatus) const112 void CameraManagerCallbackNapi::OnFlashlightStatusChanged(const std::string &cameraID,
113     const FlashStatus flashStatus) const
114 {
115     (void)cameraID;
116     (void)flashStatus;
117 }
118 } // namespace CameraStandard
119 } // namespace OHOS
120