• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023-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 #include "mode/time_lapse_photo_session_napi.h"
16 #include "camera_napi_param_parser.h"
17 #include <uv.h>
18 #include "napi/native_node_api.h"
19 
20 using namespace std;
21 
22 namespace {
23 template<typename T>
Unwrap(napi_env env,napi_value jsObject)24 T* Unwrap(napi_env env, napi_value jsObject)
25 {
26     void *result;
27     napi_unwrap(env, jsObject, &result);
28     return reinterpret_cast<T*>(result);
29 }
30 }
31 
32 namespace OHOS {
33 namespace CameraStandard {
34 thread_local napi_ref TimeLapsePhotoSessionNapi::sConstructor_{nullptr};
35 thread_local napi_ref TryAEInfoNapi::sConstructor_{nullptr};
36 
37 const unordered_map<string, TimeLapseRecordState> TimeLapseRecordStateMap = {
38     {"IDLE", TimeLapseRecordState::IDLE },
39     {"RECORDING", TimeLapseRecordState::RECORDING },
40 };
41 
42 const unordered_map<string, TimeLapsePreviewType> TimeLapsePreviewTypeMap = {
43     {"DARK", TimeLapsePreviewType::DARK},
44     {"LIGHT", TimeLapsePreviewType::LIGHT},
45 };
46 
TryAEInfoNapi()47 TryAEInfoNapi::TryAEInfoNapi() {}
48 
~TryAEInfoNapi()49 TryAEInfoNapi::~TryAEInfoNapi()
50 {
51     MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
52     if (tryAEInfo_) {
53         tryAEInfo_ = nullptr;
54     }
55 }
56 
Init(napi_env env,napi_value exports)57 napi_value TryAEInfoNapi::Init(napi_env env, napi_value exports)
58 {
59     MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
60     napi_status status;
61     napi_value ctorObj;
62     int32_t refCount = 1;
63 
64     napi_property_descriptor try_ae_info_properties[] = {
65         DECLARE_NAPI_GETTER("isTryAEDone", IsTryAEDone),
66         DECLARE_NAPI_GETTER("isTryAEHintNeeded", IsTryAEHintNeeded),
67         DECLARE_NAPI_GETTER("previewType", GetPreviewType),
68         DECLARE_NAPI_GETTER("captureInterval", GetCaptureInterval),
69     };
70 
71     status = napi_define_class(env, TRY_AE_INFO_NAPI_CLASS_NAME, NAPI_AUTO_LENGTH,
72                                Constructor, nullptr,
73                                sizeof(try_ae_info_properties) / sizeof(try_ae_info_properties[PARAM0]),
74                                try_ae_info_properties, &ctorObj);
75     if (status == napi_ok) {
76         if (napi_create_reference(env, ctorObj, refCount, &sConstructor_) == napi_ok) {
77             CHECK_ERROR_RETURN_RET(napi_set_named_property(env, exports, TRY_AE_INFO_NAPI_CLASS_NAME, ctorObj) ==
78                 napi_ok, exports);
79         }
80     }
81     MEDIA_ERR_LOG("%{public}s: Failed", __FUNCTION__);
82     return nullptr;
83 }
84 
NewInstance(napi_env env)85 napi_value TryAEInfoNapi::NewInstance(napi_env env)
86 {
87     CAMERA_NAPI_VALUE result = nullptr;
88     CAMERA_NAPI_VALUE constructor;
89     CHECK_EXECUTE(napi_get_reference_value(env, sConstructor_, &constructor) == napi_ok,
90         napi_new_instance(env, constructor, 0, nullptr, &result));
91     return result;
92 }
93 
IsTryAEDone(napi_env env,napi_callback_info info)94 napi_value TryAEInfoNapi::IsTryAEDone(napi_env env, napi_callback_info info)
95 {
96     MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
97     napi_status status;
98     napi_value thisVar;
99     CAMERA_NAPI_GET_JS_OBJ_WITH_ZERO_ARGS(env, info, status, thisVar);
100     TryAEInfoNapi* obj = Unwrap<TryAEInfoNapi>(env, thisVar);
101     CHECK_ERROR_RETURN_RET_LOG(obj == nullptr || obj->tryAEInfo_ == nullptr, nullptr,
102         "%{public}s: Unwrap Napi Object Failed", __FUNCTION__);
103     auto value = obj->tryAEInfo_->isTryAEDone;
104     napi_value result;
105     napi_get_boolean(env, value, &result);
106     return result;
107 }
108 
IsTryAEHintNeeded(napi_env env,napi_callback_info info)109 napi_value TryAEInfoNapi::IsTryAEHintNeeded(napi_env env, napi_callback_info info)
110 {
111     MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
112     napi_status status;
113     napi_value thisVar;
114     CAMERA_NAPI_GET_JS_OBJ_WITH_ZERO_ARGS(env, info, status, thisVar);
115     TryAEInfoNapi* obj = Unwrap<TryAEInfoNapi>(env, thisVar);
116     CHECK_ERROR_RETURN_RET_LOG(obj == nullptr || obj->tryAEInfo_ == nullptr, nullptr,
117         "%{public}s: Unwrap Napi Object Failed", __FUNCTION__);
118     auto value = obj->tryAEInfo_->isTryAEHintNeeded;
119     napi_value result;
120     napi_get_boolean(env, value, &result);
121     return result;
122 }
123 
GetPreviewType(napi_env env,napi_callback_info info)124 napi_value TryAEInfoNapi::GetPreviewType(napi_env env, napi_callback_info info)
125 {
126     MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
127     napi_status status;
128     napi_value thisVar;
129     CAMERA_NAPI_GET_JS_OBJ_WITH_ZERO_ARGS(env, info, status, thisVar);
130     TryAEInfoNapi* obj = Unwrap<TryAEInfoNapi>(env, thisVar);
131     CHECK_ERROR_RETURN_RET_LOG(obj == nullptr || obj->tryAEInfo_ == nullptr, nullptr,
132         "%{public}s: Unwrap Napi Object Failed", __FUNCTION__);
133     auto value = obj->tryAEInfo_->previewType;
134     napi_value result;
135     napi_create_int32(env, static_cast<int32_t>(value), &result);
136     return result;
137 }
138 
GetCaptureInterval(napi_env env,napi_callback_info info)139 napi_value TryAEInfoNapi::GetCaptureInterval(napi_env env, napi_callback_info info)
140 {
141     MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
142     napi_status status;
143     napi_value thisVar;
144     CAMERA_NAPI_GET_JS_OBJ_WITH_ZERO_ARGS(env, info, status, thisVar);
145     TryAEInfoNapi* obj = Unwrap<TryAEInfoNapi>(env, thisVar);
146     CHECK_ERROR_RETURN_RET_LOG(obj == nullptr || obj->tryAEInfo_ == nullptr, nullptr,
147         "%{public}s: Unwrap Napi Object Failed", __FUNCTION__);
148     auto value = obj->tryAEInfo_->captureInterval;
149     napi_value result;
150     napi_create_int32(env, value, &result);
151     return result;
152 }
153 
Constructor(napi_env env,napi_callback_info info)154 napi_value TryAEInfoNapi::Constructor(napi_env env, napi_callback_info info)
155 {
156     MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
157     napi_status status;
158     napi_value thisVar;
159     CAMERA_NAPI_GET_JS_OBJ_WITH_ZERO_ARGS(env, info, status, thisVar);
160 
161     if (status == napi_ok && thisVar != nullptr) {
162         auto obj = std::make_unique<TryAEInfoNapi>();
163         status = napi_wrap(env, thisVar, reinterpret_cast<void*>(obj.get()),
164                            Destructor, nullptr, nullptr);
165         if (status == napi_ok) {
166             (void)obj.release();
167             return thisVar;
168         } else {
169             MEDIA_ERR_LOG("Failure wrapping js to native napi");
170         }
171     }
172     MEDIA_ERR_LOG("%{public}s: Failed", __FUNCTION__);
173     return nullptr;
174 }
175 
Destructor(napi_env env,void * nativeObject,void * finalize)176 void TryAEInfoNapi::Destructor(napi_env env, void* nativeObject, void* finalize)
177 {
178     MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
179     TryAEInfoNapi* obj = reinterpret_cast<TryAEInfoNapi*>(nativeObject);
180     if (obj != nullptr) {
181         delete obj;
182     }
183 }
184 
TimeLapsePhotoSessionNapi()185 TimeLapsePhotoSessionNapi::TimeLapsePhotoSessionNapi() {}
186 
~TimeLapsePhotoSessionNapi()187 TimeLapsePhotoSessionNapi::~TimeLapsePhotoSessionNapi()
188 {
189     MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
190     if (timeLapsePhotoSession_) {
191         timeLapsePhotoSession_ = nullptr;
192     }
193 }
194 
195 const vector<napi_property_descriptor> TimeLapsePhotoSessionNapi::time_lapse_photo_props = {
196     // TimeLapsePhotoSession properties
197     DECLARE_NAPI_FUNCTION("on", On),
198     DECLARE_NAPI_FUNCTION("off", Off),
199     DECLARE_NAPI_FUNCTION("isTryAENeeded", IsTryAENeeded),
200     DECLARE_NAPI_FUNCTION("startTryAE", StartTryAE),
201     DECLARE_NAPI_FUNCTION("stopTryAE", StopTryAE),
202     DECLARE_NAPI_FUNCTION("getSupportedTimeLapseIntervalRange", GetSupportedTimeLapseIntervalRange),
203     DECLARE_NAPI_FUNCTION("getTimeLapseInterval", GetTimeLapseInterval),
204     DECLARE_NAPI_FUNCTION("setTimeLapseInterval", SetTimeLapseInterval),
205     DECLARE_NAPI_FUNCTION("setTimeLapseRecordState", SetTimeLapseRecordState),
206     DECLARE_NAPI_FUNCTION("setTimeLapsePreviewType", SetTimeLapsePreviewType),
207 };
208 
209 const vector<napi_property_descriptor> TimeLapsePhotoSessionNapi::manual_exposure_props = {
210     // ManualExposure properties
211     DECLARE_NAPI_FUNCTION("getExposure", GetExposure),
212     DECLARE_NAPI_FUNCTION("setExposure", SetExposure),
213     DECLARE_NAPI_FUNCTION("getSupportedExposureRange", GetSupportedExposureRange),
214     DECLARE_NAPI_FUNCTION("getSupportedMeteringModes", GetSupportedMeteringModes),
215     DECLARE_NAPI_FUNCTION("isExposureMeteringModeSupported", IsExposureMeteringModeSupported),
216     DECLARE_NAPI_FUNCTION("getExposureMeteringMode", GetExposureMeteringMode),
217     DECLARE_NAPI_FUNCTION("setExposureMeteringMode", SetExposureMeteringMode),
218 };
219 
220 const vector<napi_property_descriptor> TimeLapsePhotoSessionNapi::manual_iso_props = {
221     // ManualIso properties
222     DECLARE_NAPI_FUNCTION("getIso", GetIso),
223     DECLARE_NAPI_FUNCTION("setIso", SetIso),
224     DECLARE_NAPI_FUNCTION("isManualIsoSupported", IsManualIsoSupported),
225     DECLARE_NAPI_FUNCTION("getIsoRange", GetIsoRange),
226 };
227 
228 const vector<napi_property_descriptor> TimeLapsePhotoSessionNapi::white_balance_props = {
229     // WhiteBalance properties.
230     DECLARE_NAPI_FUNCTION("isWhiteBalanceModeSupported", IsWhiteBalanceModeSupported),
231     DECLARE_NAPI_FUNCTION("getWhiteBalanceRange", GetWhiteBalanceRange),
232     DECLARE_NAPI_FUNCTION("getWhiteBalanceMode", GetWhiteBalanceMode),
233     DECLARE_NAPI_FUNCTION("setWhiteBalanceMode", SetWhiteBalanceMode),
234     DECLARE_NAPI_FUNCTION("getWhiteBalance", GetWhiteBalance),
235     DECLARE_NAPI_FUNCTION("setWhiteBalance", SetWhiteBalance),
236 };
237 
Init(napi_env env,napi_value exports)238 napi_value TimeLapsePhotoSessionNapi::Init(napi_env env, napi_value exports)
239 {
240     MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
241     napi_status status;
242     napi_value ctorObj;
243     int32_t refCount = 1;
244     vector<vector<napi_property_descriptor>> descriptors = {
245         camera_process_props,
246         flash_props,
247         auto_exposure_props,
248         focus_props,
249         zoom_props,
250         color_effect_props,
251         manual_focus_props,
252         time_lapse_photo_props,
253         manual_exposure_props,
254         manual_iso_props,
255         white_balance_props,
256     };
257     vector<napi_property_descriptor> properties = CameraNapiUtils::GetPropertyDescriptor(descriptors);
258     status = napi_define_class(env, TIME_LAPSE_PHOTO_SESSION_NAPI_CLASS_NAME, NAPI_AUTO_LENGTH,
259                                Constructor, nullptr,
260                                properties.size(),
261                                properties.data(), &ctorObj);
262     if (status == napi_ok) {
263         if (napi_create_reference(env, ctorObj, refCount, &sConstructor_) == napi_ok) {
264             CHECK_ERROR_RETURN_RET(napi_set_named_property(env, exports, TIME_LAPSE_PHOTO_SESSION_NAPI_CLASS_NAME,
265                 ctorObj) == napi_ok, exports);
266         }
267     }
268     MEDIA_ERR_LOG("%{public}s: Failed", __FUNCTION__);
269     return nullptr;
270 }
271 
CreateCameraSession(napi_env env)272 napi_value TimeLapsePhotoSessionNapi::CreateCameraSession(napi_env env)
273 {
274     MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
275     CAMERA_SYNC_TRACE;
276     napi_status status;
277     napi_value result = nullptr;
278     napi_value constructor;
279     status = napi_get_reference_value(env, sConstructor_, &constructor);
280     if (status == napi_ok) {
281         sCameraSession_ = CameraManager::GetInstance()->CreateCaptureSession(SceneMode::TIMELAPSE_PHOTO);
282         if (sCameraSession_ == nullptr) {
283             MEDIA_ERR_LOG("Failed to create Profession session instance");
284             napi_get_undefined(env, &result);
285             return result;
286         }
287         status = napi_new_instance(env, constructor, 0, nullptr, &result);
288         sCameraSession_ = nullptr;
289         if (status == napi_ok && result != nullptr) {
290             MEDIA_DEBUG_LOG("success to create Profession session napi instance");
291             return result;
292         } else {
293             MEDIA_ERR_LOG("Failed to create Profession session napi instance");
294         }
295     }
296     MEDIA_ERR_LOG("Failed to create Profession session napi instance last");
297     napi_get_undefined(env, &result);
298     return result;
299 }
300 
On(napi_env env,napi_callback_info info)301 napi_value TimeLapsePhotoSessionNapi::On(napi_env env, napi_callback_info info)
302 {
303     return ListenerTemplate<CameraSessionNapi>::On(env, info);
304 }
305 
Off(napi_env env,napi_callback_info info)306 napi_value TimeLapsePhotoSessionNapi::Off(napi_env env, napi_callback_info info)
307 {
308     return ListenerTemplate<CameraSessionNapi>::Off(env, info);
309 }
310 
IsTryAENeeded(napi_env env,napi_callback_info info)311 napi_value TimeLapsePhotoSessionNapi::IsTryAENeeded(napi_env env, napi_callback_info info)
312 {
313     MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
314     napi_status status;
315     napi_value thisVar;
316     CAMERA_NAPI_GET_JS_OBJ_WITH_ZERO_ARGS(env, info, status, thisVar);
317     TimeLapsePhotoSessionNapi* obj = Unwrap<TimeLapsePhotoSessionNapi>(env, thisVar);
318     CHECK_ERROR_RETURN_RET_LOG(obj == nullptr, nullptr, "%{public}s: Unwrap Napi Object Failed", __FUNCTION__);
319     bool needed;
320     int32_t ret = obj->timeLapsePhotoSession_->IsTryAENeeded(needed);
321     CHECK_ERROR_RETURN_RET_LOG(ret != CameraErrorCode::SUCCESS, nullptr,
322         "%{public}s: IsTryAENeeded() Failed", __FUNCTION__);
323     napi_value result;
324     CHECK_ERROR_PRINT_LOG(napi_get_boolean(env, ret, &result) != napi_ok,
325         "%{public}s: Napi Get Boolean Failed", __FUNCTION__);
326     return result;
327 }
328 
StartTryAE(napi_env env,napi_callback_info info)329 napi_value TimeLapsePhotoSessionNapi::StartTryAE(napi_env env, napi_callback_info info)
330 {
331     MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
332     napi_status status;
333     napi_value thisVar;
334     CAMERA_NAPI_GET_JS_OBJ_WITH_ZERO_ARGS(env, info, status, thisVar);
335     TimeLapsePhotoSessionNapi* obj = Unwrap<TimeLapsePhotoSessionNapi>(env, thisVar);
336     CHECK_ERROR_RETURN_RET_LOG(obj == nullptr, nullptr, "%{public}s: Unwrap Napi Object Failed", __FUNCTION__);
337     obj->timeLapsePhotoSession_->LockForControl();
338     int32_t ret = obj->timeLapsePhotoSession_->StartTryAE();
339     obj->timeLapsePhotoSession_->UnlockForControl();
340     CHECK_ERROR_RETURN_RET_LOG(ret != CameraErrorCode::SUCCESS, nullptr,
341         "%{public}s: StartTryAE() Failed", __FUNCTION__);
342     napi_value result;
343     napi_get_undefined(env, &result);
344     return result;
345 }
346 
StopTryAE(napi_env env,napi_callback_info info)347 napi_value TimeLapsePhotoSessionNapi::StopTryAE(napi_env env, napi_callback_info info)
348 {
349     MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
350     napi_status status;
351     napi_value thisVar;
352     CAMERA_NAPI_GET_JS_OBJ_WITH_ZERO_ARGS(env, info, status, thisVar);
353     TimeLapsePhotoSessionNapi* obj = Unwrap<TimeLapsePhotoSessionNapi>(env, thisVar);
354     CHECK_ERROR_RETURN_RET_LOG(obj == nullptr, nullptr, "%{public}s: Unwrap Napi Object Failed", __FUNCTION__);
355     obj->timeLapsePhotoSession_->LockForControl();
356     int32_t ret = obj->timeLapsePhotoSession_->StopTryAE();
357     obj->timeLapsePhotoSession_->UnlockForControl();
358     CHECK_ERROR_RETURN_RET_LOG(ret != CameraErrorCode::SUCCESS, nullptr,
359         "%{public}s: StopTryAE() Failed", __FUNCTION__);
360     napi_value result;
361     napi_get_undefined(env, &result);
362     return result;
363 }
364 
GetSupportedTimeLapseIntervalRange(napi_env env,napi_callback_info info)365 napi_value TimeLapsePhotoSessionNapi::GetSupportedTimeLapseIntervalRange(napi_env env, napi_callback_info info)
366 {
367     MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
368     napi_status status;
369     napi_value thisVar;
370     CAMERA_NAPI_GET_JS_OBJ_WITH_ZERO_ARGS(env, info, status, thisVar);
371     TimeLapsePhotoSessionNapi* obj = Unwrap<TimeLapsePhotoSessionNapi>(env, thisVar);
372     CHECK_ERROR_RETURN_RET_LOG(obj == nullptr, nullptr, "%{public}s: Unwrap Napi Object Failed", __FUNCTION__);
373     vector<int32_t> range;
374     int32_t ret = obj->timeLapsePhotoSession_->GetSupportedTimeLapseIntervalRange(range);
375     CHECK_ERROR_RETURN_RET_LOG(ret != CameraErrorCode::SUCCESS, nullptr,
376         "%{public}s: GetSupportedTimeLapseIntervalRange() Failed", __FUNCTION__);
377     napi_value result;
378     if (napi_create_array_with_length(env, range.size(), &result) == napi_ok) {
379         napi_value value;
380         for (uint32_t i = 0; i < range.size(); i++) {
381             napi_create_int32(env, range[i], &value);
382             napi_set_element(env, result, i, value);
383         }
384     } else {
385         MEDIA_ERR_LOG("%{public}s: Napi Create Array With Length Failed", __FUNCTION__);
386     }
387     return result;
388 }
389 
GetTimeLapseInterval(napi_env env,napi_callback_info info)390 napi_value TimeLapsePhotoSessionNapi::GetTimeLapseInterval(napi_env env, napi_callback_info info)
391 {
392     MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
393     napi_status status;
394     napi_value thisVar;
395     CAMERA_NAPI_GET_JS_OBJ_WITH_ZERO_ARGS(env, info, status, thisVar);
396     TimeLapsePhotoSessionNapi* obj = Unwrap<TimeLapsePhotoSessionNapi>(env, thisVar);
397     CHECK_ERROR_RETURN_RET_LOG(obj == nullptr, nullptr, "%{public}s: Unwrap Napi Object Failed", __FUNCTION__);
398     int32_t interval;
399     int32_t ret = obj->timeLapsePhotoSession_->GetTimeLapseInterval(interval);
400     CHECK_ERROR_RETURN_RET_LOG(ret != CameraErrorCode::SUCCESS, nullptr,
401         "%{public}s: GetTimeLapseInterval() Failed", __FUNCTION__);
402     napi_value result;
403     CHECK_ERROR_PRINT_LOG(napi_create_int32(env, interval, &result) != napi_ok,
404         "%{public}s: Napi Create Int32 Failed", __FUNCTION__);
405     return result;
406 }
407 
SetTimeLapseInterval(napi_env env,napi_callback_info info)408 napi_value TimeLapsePhotoSessionNapi::SetTimeLapseInterval(napi_env env, napi_callback_info info)
409 {
410     MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
411     TimeLapsePhotoSessionNapi* obj;
412     int32_t interval;
413     CameraNapiParamParser parser(env, info, obj, interval);
414     CHECK_ERROR_RETURN_RET_LOG(!parser.AssertStatus(INVALID_ARGUMENT, "Invalid argument!"), nullptr,
415         "%{public}s: Read Params Error", __FUNCTION__);
416     MEDIA_DEBUG_LOG("interval = %{public}d", interval);
417     obj->timeLapsePhotoSession_->LockForControl();
418     int32_t ret = obj->timeLapsePhotoSession_->SetTimeLapseInterval(interval);
419     obj->timeLapsePhotoSession_->UnlockForControl();
420     CHECK_ERROR_RETURN_RET_LOG(ret != CameraErrorCode::SUCCESS, nullptr,
421         "%{public}s: SetTimeLapseInterval() Failed", __FUNCTION__);
422     napi_value result;
423     napi_get_undefined(env, &result);
424     return result;
425 }
426 
SetTimeLapseRecordState(napi_env env,napi_callback_info info)427 napi_value TimeLapsePhotoSessionNapi::SetTimeLapseRecordState(napi_env env, napi_callback_info info)
428 {
429     MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
430     TimeLapsePhotoSessionNapi* obj;
431     int32_t state;
432     CameraNapiParamParser parser(env, info, obj, state);
433     CHECK_ERROR_RETURN_RET_LOG(!parser.AssertStatus(INVALID_ARGUMENT, "Invalid argument!"), nullptr,
434         "%{public}s: Read Params Error", __FUNCTION__);
435     MEDIA_DEBUG_LOG("state = %{public}d", state);
436     obj->timeLapsePhotoSession_->LockForControl();
437     int32_t ret = obj->timeLapsePhotoSession_->SetTimeLapseRecordState(static_cast<TimeLapseRecordState>(state));
438     obj->timeLapsePhotoSession_->UnlockForControl();
439     CHECK_ERROR_RETURN_RET_LOG(ret != CameraErrorCode::SUCCESS, nullptr,
440         "%{public}s: SetTimeLapseRecordState() Failed", __FUNCTION__);
441     napi_value result;
442     napi_get_undefined(env, &result);
443     return result;
444 }
445 
SetTimeLapsePreviewType(napi_env env,napi_callback_info info)446 napi_value TimeLapsePhotoSessionNapi::SetTimeLapsePreviewType(napi_env env, napi_callback_info info)
447 {
448     MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
449     TimeLapsePhotoSessionNapi* obj;
450     int32_t type;
451     CameraNapiParamParser parser(env, info, obj, type);
452     CHECK_ERROR_RETURN_RET_LOG(!parser.AssertStatus(INVALID_ARGUMENT, "Invalid argument!"), nullptr,
453         "%{public}s: Read Params Error", __FUNCTION__);
454     MEDIA_DEBUG_LOG("type = %{public}d", type);
455     obj->timeLapsePhotoSession_->LockForControl();
456     int32_t ret = obj->timeLapsePhotoSession_->SetTimeLapsePreviewType(static_cast<TimeLapsePreviewType>(type));
457     obj->timeLapsePhotoSession_->UnlockForControl();
458     CHECK_ERROR_RETURN_RET_LOG(ret != CameraErrorCode::SUCCESS, nullptr,
459         "%{public}s: SetTimeLapsePreviewType() Failed", __FUNCTION__);
460     napi_value result;
461     napi_get_undefined(env, &result);
462     return result;
463 }
464 
465 // ManualExposure
GetExposure(napi_env env,napi_callback_info info)466 napi_value TimeLapsePhotoSessionNapi::GetExposure(napi_env env, napi_callback_info info)
467 {
468     MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
469     napi_status status;
470     napi_value thisVar;
471     CAMERA_NAPI_GET_JS_OBJ_WITH_ZERO_ARGS(env, info, status, thisVar);
472     TimeLapsePhotoSessionNapi* obj = Unwrap<TimeLapsePhotoSessionNapi>(env, thisVar);
473     CHECK_ERROR_RETURN_RET_LOG(obj == nullptr, nullptr,
474         "%{public}s: Unwrap Napi Object Failed", __FUNCTION__);
475     uint32_t exposure;
476     int32_t ret = obj->timeLapsePhotoSession_->GetExposure(exposure);
477     CHECK_ERROR_RETURN_RET_LOG(ret != CameraErrorCode::SUCCESS, nullptr,
478         "%{public}s: getExposure() Failed", __FUNCTION__);
479     napi_value result;
480     CHECK_ERROR_PRINT_LOG(napi_create_uint32(env, exposure, &result) != napi_ok,
481         "%{public}s: Napi Create Double Failed", __FUNCTION__);
482     return result;
483 }
484 
SetExposure(napi_env env,napi_callback_info info)485 napi_value TimeLapsePhotoSessionNapi::SetExposure(napi_env env, napi_callback_info info)
486 {
487     MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
488     TimeLapsePhotoSessionNapi* obj;
489     uint32_t exposure;
490     CameraNapiParamParser parser(env, info, obj, exposure);
491     CHECK_ERROR_RETURN_RET_LOG(!parser.AssertStatus(INVALID_ARGUMENT, "Invalid argument!"),
492         nullptr, "%{public}s: Read Params Error", __FUNCTION__);
493     MEDIA_DEBUG_LOG("exposure = %{public}d", exposure);
494     obj->timeLapsePhotoSession_->LockForControl();
495     int32_t ret = obj->timeLapsePhotoSession_->SetExposure(exposure);
496     obj->timeLapsePhotoSession_->UnlockForControl();
497     CHECK_ERROR_RETURN_RET_LOG(ret != CameraErrorCode::SUCCESS, nullptr,
498         "%{public}s: setExposure() Failed", __FUNCTION__);
499     napi_value result;
500     napi_get_undefined(env, &result);
501     return result;
502 }
503 
GetSupportedExposureRange(napi_env env,napi_callback_info info)504 napi_value TimeLapsePhotoSessionNapi::GetSupportedExposureRange(napi_env env, napi_callback_info info)
505 {
506     MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
507     napi_status status;
508     napi_value thisVar;
509     CAMERA_NAPI_GET_JS_OBJ_WITH_ZERO_ARGS(env, info, status, thisVar);
510     TimeLapsePhotoSessionNapi* obj = Unwrap<TimeLapsePhotoSessionNapi>(env, thisVar);
511     CHECK_ERROR_RETURN_RET_LOG(obj == nullptr, nullptr, "%{public}s: Unwrap Napi Object Failed", __FUNCTION__);
512     vector<uint32_t> range;
513     int32_t ret = obj->timeLapsePhotoSession_->GetSupportedExposureRange(range);
514     CHECK_ERROR_RETURN_RET_LOG(ret != CameraErrorCode::SUCCESS, nullptr,
515         "%{public}s: getSupportedExposureRange() Failed", __FUNCTION__);
516     napi_value result;
517     if (napi_create_array_with_length(env, range.size(), &result) == napi_ok) {
518         napi_value value;
519         for (uint32_t i = 0; i < range.size(); i++) {
520             napi_create_uint32(env, range[i], &value);
521             napi_set_element(env, result, i, value);
522         }
523     } else {
524         MEDIA_ERR_LOG("%{public}s: Napi Create Array With Length Failed", __FUNCTION__);
525     }
526     return result;
527 }
528 
GetSupportedMeteringModes(napi_env env,napi_callback_info info)529 napi_value TimeLapsePhotoSessionNapi::GetSupportedMeteringModes(napi_env env, napi_callback_info info)
530 {
531     MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
532     napi_status status;
533     napi_value thisVar;
534     CAMERA_NAPI_GET_JS_OBJ_WITH_ZERO_ARGS(env, info, status, thisVar);
535     TimeLapsePhotoSessionNapi* obj = Unwrap<TimeLapsePhotoSessionNapi>(env, thisVar);
536     CHECK_ERROR_RETURN_RET_LOG(obj == nullptr, nullptr,
537         "%{public}s: Unwrap Napi Object Failed", __FUNCTION__);
538     vector<MeteringMode> modes;
539     int32_t ret = obj->timeLapsePhotoSession_->GetSupportedMeteringModes(modes);
540     CHECK_ERROR_RETURN_RET_LOG(ret != CameraErrorCode::SUCCESS, nullptr,
541         "%{public}s: GetSupportedMeteringModes() Failed", __FUNCTION__);
542     napi_value result;
543     if (napi_create_array_with_length(env, modes.size(), &result) == napi_ok) {
544         napi_value value;
545         for (uint32_t i = 0; i < modes.size(); i++) {
546             napi_create_int32(env, modes[i], &value);
547             napi_set_element(env, result, i, value);
548         }
549     } else {
550         MEDIA_ERR_LOG("%{public}s: Napi Create Array With Length Failed", __FUNCTION__);
551     }
552     return result;
553 }
554 
IsExposureMeteringModeSupported(napi_env env,napi_callback_info info)555 napi_value TimeLapsePhotoSessionNapi::IsExposureMeteringModeSupported(napi_env env, napi_callback_info info)
556 {
557     MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
558     TimeLapsePhotoSessionNapi* obj;
559     int32_t mode;
560     CameraNapiParamParser parser(env, info, obj, mode);
561     CHECK_ERROR_RETURN_RET_LOG(!parser.AssertStatus(INVALID_ARGUMENT, "Invalid argument!"),
562         nullptr, "%{public}s: Read Params Error", __FUNCTION__);
563     bool supported;
564     int32_t ret = obj->timeLapsePhotoSession_->IsExposureMeteringModeSupported(
565         static_cast<MeteringMode>(mode), supported);
566     CHECK_ERROR_RETURN_RET_LOG(ret != CameraErrorCode::SUCCESS, nullptr,
567         "%{public}s: IsExposureMeteringModeSupported() Failed", __FUNCTION__);
568     napi_value result;
569     CHECK_ERROR_PRINT_LOG(napi_get_boolean(env, supported, &result) != napi_ok,
570         "%{public}s: Napi Get Boolean Failed", __FUNCTION__);
571     return result;
572 }
573 
GetExposureMeteringMode(napi_env env,napi_callback_info info)574 napi_value TimeLapsePhotoSessionNapi::GetExposureMeteringMode(napi_env env, napi_callback_info info)
575 {
576     MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
577     TimeLapsePhotoSessionNapi* obj;
578     CameraNapiParamParser parser(env, info, obj);
579     CHECK_ERROR_RETURN_RET_LOG(!parser.AssertStatus(INVALID_ARGUMENT, "Invalid argument!"), nullptr,
580         "%{public}s: Read Params Error", __FUNCTION__);
581     MeteringMode mode;
582     int32_t ret = obj->timeLapsePhotoSession_->GetExposureMeteringMode(mode);
583     CHECK_ERROR_RETURN_RET_LOG(ret != CameraErrorCode::SUCCESS, nullptr,
584         "%{public}s: GetExposureMeteringMode() Failed", __FUNCTION__);
585     napi_value result;
586     CHECK_ERROR_PRINT_LOG(napi_create_int32(env, static_cast<int32_t>(mode), &result) != napi_ok,
587         "%{public}s: Napi Create Int32 Failed", __FUNCTION__);
588     return result;
589 }
590 
SetExposureMeteringMode(napi_env env,napi_callback_info info)591 napi_value TimeLapsePhotoSessionNapi::SetExposureMeteringMode(napi_env env, napi_callback_info info)
592 {
593     MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
594     TimeLapsePhotoSessionNapi* obj;
595     int32_t mode;
596     CameraNapiParamParser parser(env, info, obj, mode);
597     CHECK_ERROR_RETURN_RET_LOG(!parser.AssertStatus(INVALID_ARGUMENT, "Invalid argument!"),
598         nullptr, "%{public}s: Read Params Error", __FUNCTION__);
599     MEDIA_DEBUG_LOG("mode = %{public}d", mode);
600     obj->timeLapsePhotoSession_->LockForControl();
601     int32_t ret = obj->timeLapsePhotoSession_->SetExposureMeteringMode(static_cast<MeteringMode>(mode));
602     obj->timeLapsePhotoSession_->UnlockForControl();
603     CHECK_ERROR_RETURN_RET_LOG(ret != CameraErrorCode::SUCCESS, nullptr,
604         "%{public}s: SetExposureMeteringMode() Failed", __FUNCTION__);
605     napi_value result;
606     napi_get_undefined(env, &result);
607     return result;
608 }
609 
610 // ManualIso
GetIso(napi_env env,napi_callback_info info)611 napi_value TimeLapsePhotoSessionNapi::GetIso(napi_env env, napi_callback_info info)
612 {
613     MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
614     napi_status status;
615     napi_value thisVar;
616     CAMERA_NAPI_GET_JS_OBJ_WITH_ZERO_ARGS(env, info, status, thisVar);
617     TimeLapsePhotoSessionNapi* obj = Unwrap<TimeLapsePhotoSessionNapi>(env, thisVar);
618     CHECK_ERROR_RETURN_RET_LOG(obj == nullptr,
619         nullptr, "%{public}s: Unwrap Napi Object Failed", __FUNCTION__);
620     int32_t iso;
621     int32_t ret = obj->timeLapsePhotoSession_->GetIso(iso);
622     CHECK_ERROR_RETURN_RET_LOG(ret != CameraErrorCode::SUCCESS, nullptr,
623         "%{public}s: getIso() Failed", __FUNCTION__);
624     napi_value result;
625     CHECK_ERROR_PRINT_LOG(napi_create_int32(env, iso, &result) != napi_ok,
626         "%{public}s: Napi Create Int32 Failed", __FUNCTION__);
627     return result;
628 }
629 
SetIso(napi_env env,napi_callback_info info)630 napi_value TimeLapsePhotoSessionNapi::SetIso(napi_env env, napi_callback_info info)
631 {
632     MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
633     TimeLapsePhotoSessionNapi* obj;
634     int32_t iso;
635     CameraNapiParamParser parser(env, info, obj, iso);
636     CHECK_ERROR_RETURN_RET_LOG(!parser.AssertStatus(INVALID_ARGUMENT, "Invalid argument!"),
637         nullptr, "%{public}s: Read Params Error", __FUNCTION__);
638     MEDIA_DEBUG_LOG("iso = %{public}d", iso);
639     obj->timeLapsePhotoSession_->LockForControl();
640     int32_t ret = obj->timeLapsePhotoSession_->SetIso(iso);
641     obj->timeLapsePhotoSession_->UnlockForControl();
642     CHECK_ERROR_RETURN_RET_LOG(ret != CameraErrorCode::SUCCESS, nullptr, "%{public}s: setIso() Failed", __FUNCTION__);
643     napi_value result;
644     napi_get_undefined(env, &result);
645     return result;
646 }
647 
IsManualIsoSupported(napi_env env,napi_callback_info info)648 napi_value TimeLapsePhotoSessionNapi::IsManualIsoSupported(napi_env env, napi_callback_info info)
649 {
650     MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
651     napi_status status;
652     napi_value thisVar;
653     CAMERA_NAPI_GET_JS_OBJ_WITH_ZERO_ARGS(env, info, status, thisVar);
654     TimeLapsePhotoSessionNapi* obj = Unwrap<TimeLapsePhotoSessionNapi>(env, thisVar);
655     CHECK_ERROR_RETURN_RET_LOG(obj == nullptr, nullptr, "%{public}s: Unwrap Napi Object Failed", __FUNCTION__);
656     bool supported;
657     int32_t ret = obj->timeLapsePhotoSession_->IsManualIsoSupported(supported);
658     CHECK_ERROR_RETURN_RET_LOG(ret != CameraErrorCode::SUCCESS, nullptr,
659         "%{public}s: isManualIsoSupported() Failed", __FUNCTION__);
660     napi_value result;
661     CHECK_ERROR_PRINT_LOG(napi_get_boolean(env, supported, &result) != napi_ok,
662         "%{public}s: Napi Get Boolean Failed", __FUNCTION__);
663     return result;
664 }
665 
GetIsoRange(napi_env env,napi_callback_info info)666 napi_value TimeLapsePhotoSessionNapi::GetIsoRange(napi_env env, napi_callback_info info)
667 {
668     MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
669     napi_status status;
670     napi_value thisVar;
671     CAMERA_NAPI_GET_JS_OBJ_WITH_ZERO_ARGS(env, info, status, thisVar);
672     TimeLapsePhotoSessionNapi* obj = Unwrap<TimeLapsePhotoSessionNapi>(env, thisVar);
673     CHECK_ERROR_RETURN_RET_LOG(obj == nullptr, nullptr, "%{public}s: Unwrap Napi Object Failed", __FUNCTION__);
674     vector<int32_t> range;
675     int32_t ret = obj->timeLapsePhotoSession_->GetIsoRange(range);
676     CHECK_ERROR_RETURN_RET_LOG(ret != CameraErrorCode::SUCCESS, nullptr,
677         "%{public}s: getIsoRange() Failed", __FUNCTION__);
678     napi_value result;
679     if (napi_create_array_with_length(env, range.size(), &result) == napi_ok) {
680         napi_value value;
681         for (uint32_t i = 0; i < range.size(); i++) {
682             napi_create_int32(env, range[i], &value);
683             napi_set_element(env, result, i, value);
684         }
685     } else {
686         MEDIA_ERR_LOG("%{public}s: Napi Create Array With Length Failed", __FUNCTION__);
687     }
688     return result;
689 }
690 
691 // WhiteBalance
IsWhiteBalanceModeSupported(napi_env env,napi_callback_info info)692 napi_value TimeLapsePhotoSessionNapi::IsWhiteBalanceModeSupported(napi_env env, napi_callback_info info)
693 {
694     MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
695     size_t argc;
696     napi_value argv[1];
697     napi_value thisVar;
698     CAMERA_NAPI_GET_JS_ARGS(env, info, argc, argv, thisVar);
699     TimeLapsePhotoSessionNapi* obj = Unwrap<TimeLapsePhotoSessionNapi>(env, thisVar);
700     CHECK_ERROR_RETURN_RET_LOG(obj == nullptr, nullptr, "%{public}s: Unwrap Napi Object Failed", __FUNCTION__);
701     int32_t mode;
702     napi_get_value_int32(env, argv[0], &mode);
703     bool supported;
704     int32_t ret = obj->timeLapsePhotoSession_->IsWhiteBalanceModeSupported(
705         static_cast<WhiteBalanceMode>(mode), supported);
706     CHECK_ERROR_RETURN_RET_LOG(ret != CameraErrorCode::SUCCESS, nullptr,
707         "%{public}s: isWhiteBalanceModeSupported() Failed", __FUNCTION__);
708     napi_value result;
709     CHECK_ERROR_PRINT_LOG(napi_get_boolean(env, supported, &result) != napi_ok,
710         "%{public}s: Napi Get Boolean Failed", __FUNCTION__);
711     return result;
712 }
713 
GetWhiteBalanceRange(napi_env env,napi_callback_info info)714 napi_value TimeLapsePhotoSessionNapi::GetWhiteBalanceRange(napi_env env, napi_callback_info info)
715 {
716     MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
717     napi_status status;
718     napi_value thisVar;
719     CAMERA_NAPI_GET_JS_OBJ_WITH_ZERO_ARGS(env, info, status, thisVar);
720     TimeLapsePhotoSessionNapi* obj = Unwrap<TimeLapsePhotoSessionNapi>(env, thisVar);
721     CHECK_ERROR_RETURN_RET_LOG(obj == nullptr, nullptr, "%{public}s: Unwrap Napi Object Failed", __FUNCTION__);
722     vector<int32_t> range;
723     int32_t ret = obj->timeLapsePhotoSession_->GetWhiteBalanceRange(range);
724     CHECK_ERROR_RETURN_RET_LOG(ret != CameraErrorCode::SUCCESS, nullptr,
725         "%{public}s: getWhiteBalanceRange() Failed", __FUNCTION__);
726     napi_value result;
727     if (napi_create_array_with_length(env, range.size(), &result) == napi_ok) {
728         napi_value value;
729         for (uint32_t i = 0; i < range.size(); i++) {
730             napi_create_int32(env, range[i], &value);
731             napi_set_element(env, result, i, value);
732         }
733     } else {
734         MEDIA_ERR_LOG("%{public}s: Napi Create Array With Length Failed", __FUNCTION__);
735     }
736     return result;
737 }
738 
GetWhiteBalanceMode(napi_env env,napi_callback_info info)739 napi_value TimeLapsePhotoSessionNapi::GetWhiteBalanceMode(napi_env env, napi_callback_info info)
740 {
741     MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
742     napi_status status;
743     napi_value thisVar;
744     CAMERA_NAPI_GET_JS_OBJ_WITH_ZERO_ARGS(env, info, status, thisVar);
745     TimeLapsePhotoSessionNapi* obj = Unwrap<TimeLapsePhotoSessionNapi>(env, thisVar);
746     CHECK_ERROR_RETURN_RET_LOG(obj == nullptr, nullptr, "%{public}s: Unwrap Napi Object Failed", __FUNCTION__);
747     WhiteBalanceMode mode;
748     int32_t ret = obj->timeLapsePhotoSession_->GetWhiteBalanceMode(mode);
749     CHECK_ERROR_RETURN_RET_LOG(ret != CameraErrorCode::SUCCESS, nullptr,
750         "%{public}s: getWhiteBalanceMode() Failed", __FUNCTION__);
751     napi_value result;
752     CHECK_ERROR_PRINT_LOG(napi_create_int32(env, static_cast<int32_t>(mode), &result) != napi_ok,
753         "%{public}s: Napi Create Int32 Failed", __FUNCTION__);
754     return result;
755 }
756 
SetWhiteBalanceMode(napi_env env,napi_callback_info info)757 napi_value TimeLapsePhotoSessionNapi::SetWhiteBalanceMode(napi_env env, napi_callback_info info)
758 {
759     MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
760     TimeLapsePhotoSessionNapi* obj;
761     int32_t mode;
762     CameraNapiParamParser parser(env, info, obj, mode);
763     CHECK_ERROR_RETURN_RET_LOG(!parser.AssertStatus(INVALID_ARGUMENT, "Invalid argument!"), nullptr,
764         "%{public}s: Read Params Error", __FUNCTION__);
765     MEDIA_DEBUG_LOG("mode = %{public}d", mode);
766     obj->timeLapsePhotoSession_->LockForControl();
767     int32_t ret = obj->timeLapsePhotoSession_->SetWhiteBalanceMode(static_cast<WhiteBalanceMode>(mode));
768     obj->timeLapsePhotoSession_->UnlockForControl();
769     CHECK_ERROR_RETURN_RET_LOG(ret != CameraErrorCode::SUCCESS, nullptr,
770         "%{public}s: setWhiteBalanceMode() Failed", __FUNCTION__);
771     napi_value result;
772     napi_get_undefined(env, &result);
773     return result;
774 }
775 
GetWhiteBalance(napi_env env,napi_callback_info info)776 napi_value TimeLapsePhotoSessionNapi::GetWhiteBalance(napi_env env, napi_callback_info info)
777 {
778     MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
779     napi_status status;
780     napi_value thisVar;
781     CAMERA_NAPI_GET_JS_OBJ_WITH_ZERO_ARGS(env, info, status, thisVar);
782     TimeLapsePhotoSessionNapi* obj = Unwrap<TimeLapsePhotoSessionNapi>(env, thisVar);
783     CHECK_ERROR_RETURN_RET_LOG(obj == nullptr, nullptr, "%{public}s: Unwrap Napi Object Failed", __FUNCTION__);
784     int32_t balance;
785     int32_t ret = obj->timeLapsePhotoSession_->GetWhiteBalance(balance);
786     CHECK_ERROR_RETURN_RET_LOG(ret != CameraErrorCode::SUCCESS, nullptr,
787         "%{public}s: getWhiteBalance() Failed", __FUNCTION__);
788     napi_value result;
789     CHECK_ERROR_PRINT_LOG(napi_create_int32(env, balance, &result) != napi_ok,
790         "%{public}s: Napi Create Int32 Failed", __FUNCTION__);
791     return result;
792 }
793 
SetWhiteBalance(napi_env env,napi_callback_info info)794 napi_value TimeLapsePhotoSessionNapi::SetWhiteBalance(napi_env env, napi_callback_info info)
795 {
796     MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
797     TimeLapsePhotoSessionNapi* obj;
798     int32_t balance;
799     CameraNapiParamParser parser(env, info, obj, balance);
800     CHECK_ERROR_RETURN_RET_LOG(!parser.AssertStatus(INVALID_ARGUMENT, "Invalid argument!"), nullptr,
801         "%{public}s: Read Params Error", __FUNCTION__);
802     MEDIA_DEBUG_LOG("balance = %{public}d", balance);
803     obj->timeLapsePhotoSession_->LockForControl();
804     int32_t ret = obj->timeLapsePhotoSession_->SetWhiteBalance(balance);
805     obj->timeLapsePhotoSession_->UnlockForControl();
806     CHECK_ERROR_RETURN_RET_LOG(ret != CameraErrorCode::SUCCESS, nullptr,
807         "%{public}s: setWhiteBalance() Failed", __FUNCTION__);
808     napi_value result;
809     napi_get_undefined(env, &result);
810     return result;
811 }
812 
Constructor(napi_env env,napi_callback_info info)813 napi_value TimeLapsePhotoSessionNapi::Constructor(napi_env env, napi_callback_info info)
814 {
815     MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
816     napi_status status;
817     napi_value thisVar;
818     CAMERA_NAPI_GET_JS_OBJ_WITH_ZERO_ARGS(env, info, status, thisVar);
819 
820     if (status == napi_ok && thisVar != nullptr) {
821         auto obj = std::make_unique<TimeLapsePhotoSessionNapi>();
822         obj->timeLapsePhotoSession_ = static_cast<TimeLapsePhotoSession*>(sCameraSession_.GetRefPtr());
823         obj->cameraSession_ = obj->timeLapsePhotoSession_;
824         CHECK_ERROR_RETURN_RET_LOG(obj->timeLapsePhotoSession_ == nullptr, nullptr,
825             "%{public}s: timeLapsePhotoSession_ is nullptr", __FUNCTION__);
826         status = napi_wrap(env, thisVar, reinterpret_cast<void*>(obj.get()),
827                            Destructor, nullptr, nullptr);
828         if (status == napi_ok) {
829             (void)obj.release();
830             return thisVar;
831         } else {
832             MEDIA_ERR_LOG("Failure wrapping js to native napi");
833         }
834     }
835     MEDIA_ERR_LOG("%{public}s: Failed", __FUNCTION__);
836     return nullptr;
837 }
838 
Destructor(napi_env env,void * nativeObject,void * finalize)839 void TimeLapsePhotoSessionNapi::Destructor(napi_env env, void* nativeObject, void* finalize)
840 {
841     MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
842     TimeLapsePhotoSessionNapi* obj = reinterpret_cast<TimeLapsePhotoSessionNapi*>(nativeObject);
843     if (obj != nullptr) {
844         delete obj;
845     }
846 }
847 
RegisterIsoInfoCallbackListener(const std::string & eventName,napi_env env,napi_value callback,const vector<napi_value> & args,bool isOnce)848 void TimeLapsePhotoSessionNapi::RegisterIsoInfoCallbackListener(const std::string& eventName, napi_env env,
849     napi_value callback, const vector<napi_value>& args, bool isOnce)
850 {
851     MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
852     if (isoInfoCallback_ == nullptr) {
853         isoInfoCallback_ = make_shared<IsoInfoCallbackListener>(env);
854         timeLapsePhotoSession_->SetIsoInfoCallback(isoInfoCallback_);
855     }
856     isoInfoCallback_->SaveCallbackReference(eventName, callback, isOnce);
857 }
858 
UnregisterIsoInfoCallbackListener(const std::string & eventName,napi_env env,napi_value callback,const vector<napi_value> & args)859 void TimeLapsePhotoSessionNapi::UnregisterIsoInfoCallbackListener(const std::string& eventName, napi_env env,
860     napi_value callback, const vector<napi_value>& args)
861 {
862     MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
863     if (isoInfoCallback_ == nullptr) {
864         MEDIA_ERR_LOG("isoInfoCallback is null");
865     } else {
866         isoInfoCallback_->RemoveCallbackRef(eventName, callback);
867     }
868 }
869 
RegisterExposureInfoCallbackListener(const std::string & eventName,napi_env env,napi_value callback,const vector<napi_value> & args,bool isOnce)870 void TimeLapsePhotoSessionNapi::RegisterExposureInfoCallbackListener(const std::string& eventName, napi_env env,
871     napi_value callback, const vector<napi_value>& args, bool isOnce)
872 {
873     MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
874     if (exposureInfoCallback_ == nullptr) {
875         exposureInfoCallback_ = make_shared<ExposureInfoCallbackListener>(env);
876         timeLapsePhotoSession_->SetExposureInfoCallback(exposureInfoCallback_);
877     }
878     exposureInfoCallback_->SaveCallbackReference(eventName, callback, isOnce);
879 }
880 
UnregisterExposureInfoCallbackListener(const std::string & eventName,napi_env env,napi_value callback,const vector<napi_value> & args)881 void TimeLapsePhotoSessionNapi::UnregisterExposureInfoCallbackListener(const std::string& eventName, napi_env env,
882     napi_value callback, const vector<napi_value>& args)
883 {
884     MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
885     if (exposureInfoCallback_ == nullptr) {
886         MEDIA_ERR_LOG("exposureInfoCallback is null");
887     } else {
888         exposureInfoCallback_->RemoveCallbackRef(eventName, callback);
889     }
890 }
891 
RegisterLuminationInfoCallbackListener(const std::string & eventName,napi_env env,napi_value callback,const vector<napi_value> & args,bool isOnce)892 void TimeLapsePhotoSessionNapi::RegisterLuminationInfoCallbackListener(const std::string& eventName, napi_env env,
893     napi_value callback, const vector<napi_value>& args, bool isOnce)
894 {
895     MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
896     if (luminationInfoCallback_ == nullptr) {
897         ExposureHintMode mode = EXPOSURE_HINT_MODE_ON;
898         timeLapsePhotoSession_->LockForControl();
899         timeLapsePhotoSession_->SetExposureHintMode(mode);
900         timeLapsePhotoSession_->UnlockForControl();
901         MEDIA_INFO_LOG("TimeLapsePhotoSessionNapi SetExposureHintMode exposureHint = %{public}d", mode);
902         luminationInfoCallback_ = make_shared<LuminationInfoCallbackListener>(env);
903         timeLapsePhotoSession_->SetLuminationInfoCallback(luminationInfoCallback_);
904     }
905     luminationInfoCallback_->SaveCallbackReference(eventName, callback, isOnce);
906 }
907 
UnregisterLuminationInfoCallbackListener(const std::string & eventName,napi_env env,napi_value callback,const vector<napi_value> & args)908 void TimeLapsePhotoSessionNapi::UnregisterLuminationInfoCallbackListener(const std::string& eventName, napi_env env,
909     napi_value callback, const vector<napi_value>& args)
910 {
911     MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
912     if (luminationInfoCallback_ == nullptr) {
913         MEDIA_ERR_LOG("luminationInfoCallback is null");
914     } else {
915         ExposureHintMode mode = EXPOSURE_HINT_MODE_OFF;
916         timeLapsePhotoSession_->LockForControl();
917         timeLapsePhotoSession_->SetExposureHintMode(mode);
918         timeLapsePhotoSession_->UnlockForControl();
919         MEDIA_INFO_LOG("TimeLapsePhotoSessionNapi SetExposureHintMode exposureHint = %{public}d!", mode);
920         luminationInfoCallback_->RemoveCallbackRef(eventName, callback);
921     }
922 }
923 
RegisterTryAEInfoCallbackListener(const std::string & eventName,napi_env env,napi_value callback,const vector<napi_value> & args,bool isOnce)924 void TimeLapsePhotoSessionNapi::RegisterTryAEInfoCallbackListener(const std::string& eventName, napi_env env,
925     napi_value callback, const vector<napi_value>& args, bool isOnce)
926 {
927     MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
928     if (tryAEInfoCallback_ == nullptr) {
929         tryAEInfoCallback_ = make_shared<TryAEInfoCallbackListener>(env);
930         timeLapsePhotoSession_->SetTryAEInfoCallback(tryAEInfoCallback_);
931     }
932     tryAEInfoCallback_->SaveCallbackReference(eventName, callback, isOnce);
933 }
934 
UnregisterTryAEInfoCallbackListener(const std::string & eventName,napi_env env,napi_value callback,const vector<napi_value> & args)935 void TimeLapsePhotoSessionNapi::UnregisterTryAEInfoCallbackListener(const std::string& eventName, napi_env env,
936     napi_value callback, const vector<napi_value>& args)
937 {
938     MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
939     if (tryAEInfoCallback_ == nullptr) {
940         MEDIA_ERR_LOG("tryAEInfoCallback is null");
941     } else {
942         tryAEInfoCallback_->RemoveCallbackRef(eventName, callback);
943     }
944 }
945 
OnTryAEInfoChanged(TryAEInfo info)946 void TryAEInfoCallbackListener::OnTryAEInfoChanged(TryAEInfo info)
947 {
948     MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
949     OnTryAEInfoChangedCallbackAsync(info);
950 }
951 
OnTryAEInfoChangedCallback(TryAEInfo info) const952 void TryAEInfoCallbackListener::OnTryAEInfoChangedCallback(TryAEInfo info) const
953 {
954     MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
955     napi_value result[ARGS_TWO] = { nullptr, nullptr };
956     napi_value retVal;
957 
958     napi_get_undefined(env_, &result[PARAM0]);
959     result[PARAM1] = TryAEInfoNapi::NewInstance(env_);
960     TryAEInfoNapi *obj = Unwrap<TryAEInfoNapi>(env_, result[PARAM1]);
961     if (obj) {
962         obj->tryAEInfo_ = make_unique<TryAEInfo>(info);
963     } else {
964         MEDIA_ERR_LOG("%{public}s: Enter, TryAEInfoNapi* is nullptr", __FUNCTION__);
965     }
966     ExecuteCallbackNapiPara callbackPara { .recv = nullptr, .argc = ARGS_TWO, .argv = result, .result = &retVal };
967     ExecuteCallback("tryAEInfoChange", callbackPara);
968 }
969 
OnTryAEInfoChangedCallbackAsync(TryAEInfo info) const970 void TryAEInfoCallbackListener::OnTryAEInfoChangedCallbackAsync(TryAEInfo info) const
971 {
972     MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
973     auto callback = make_unique<TryAEInfoChangedCallback>(info, shared_from_this());
974     TryAEInfoChangedCallback *event = callback.get();
975     auto task = [event]() {
976         TryAEInfoChangedCallback* callback = reinterpret_cast<TryAEInfoChangedCallback *>(event);
977         if (callback) {
978             auto listener = callback->listener_.lock();
979             CHECK_EXECUTE(listener != nullptr, listener->OnTryAEInfoChangedCallback(callback->info_));
980             delete callback;
981         }
982     };
983     if (napi_ok != napi_send_event(env_, task, napi_eprio_immediate)) {
984         MEDIA_ERR_LOG("failed to execute work");
985     } else {
986         (void)callback.release();
987     }
988 }
989 
990 }
991 }