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 #ifndef PROFESSION_SESSION_NAPI_H
17 #define PROFESSION_SESSION_NAPI_H
18 
19 #include "napi/native_api.h"
20 #include "napi/native_node_api.h"
21 #include "session/camera_session_napi.h"
22 #include "session/profession_session.h"
23 
24 namespace OHOS {
25 namespace CameraStandard {
26 class ExposureInfoCallbackListener : public ExposureInfoCallback, public ListenerBase {
27 public:
ExposureInfoCallbackListener(napi_env env)28     ExposureInfoCallbackListener(napi_env env) : ListenerBase(env) {}
29     ~ExposureInfoCallbackListener() = default;
30     void OnExposureInfoChanged(ExposureInfo info) override;
31 
32 private:
33     void OnExposureInfoChangedCallback(ExposureInfo info) const;
34     void OnExposureInfoChangedCallbackAsync(ExposureInfo info) const;
35 };
36 
37 struct ExposureInfoChangedCallback {
38     ExposureInfo info_;
39     const ExposureInfoCallbackListener* listener_;
ExposureInfoChangedCallbackExposureInfoChangedCallback40     ExposureInfoChangedCallback(ExposureInfo info, const ExposureInfoCallbackListener* listener)
41         : info_(info), listener_(listener) {}
42 };
43 
44 class IsoInfoCallbackListener : public IsoInfoCallback, public ListenerBase {
45 public:
IsoInfoCallbackListener(napi_env env)46     IsoInfoCallbackListener(napi_env env) : ListenerBase(env) {}
47     ~IsoInfoCallbackListener() = default;
48     void OnIsoInfoChanged(IsoInfo info) override;
49 
50 private:
51     void OnIsoInfoChangedCallback(IsoInfo info) const;
52     void OnIsoInfoChangedCallbackAsync(IsoInfo info) const;
53 };
54 
55 struct IsoInfoChangedCallback {
56     IsoInfo info_;
57     const IsoInfoCallbackListener* listener_;
IsoInfoChangedCallbackIsoInfoChangedCallback58     IsoInfoChangedCallback(IsoInfo info, const IsoInfoCallbackListener* listener)
59         : info_(info), listener_(listener) {}
60 };
61 
62 class ApertureInfoCallbackListener : public ApertureInfoCallback, public ListenerBase {
63 public:
ApertureInfoCallbackListener(napi_env env)64     ApertureInfoCallbackListener(napi_env env) : ListenerBase(env) {}
65     ~ApertureInfoCallbackListener() = default;
66     void OnApertureInfoChanged(ApertureInfo info) override;
67 
68 private:
69     void OnApertureInfoChangedCallback(ApertureInfo info) const;
70     void OnApertureInfoChangedCallbackAsync(ApertureInfo info) const;
71 };
72 
73 struct ApertureInfoChangedCallback {
74     ApertureInfo info_;
75     const ApertureInfoCallbackListener* listener_;
ApertureInfoChangedCallbackApertureInfoChangedCallback76     ApertureInfoChangedCallback(ApertureInfo info, const ApertureInfoCallbackListener* listener)
77         : info_(info), listener_(listener) {}
78 };
79 
80 class LuminationInfoCallbackListener : public LuminationInfoCallback, public ListenerBase {
81 public:
LuminationInfoCallbackListener(napi_env env)82     LuminationInfoCallbackListener(napi_env env) : ListenerBase(env) {}
83     ~LuminationInfoCallbackListener() = default;
84     void OnLuminationInfoChanged(LuminationInfo info) override;
85 
86 private:
87     void OnLuminationInfoChangedCallback(LuminationInfo info) const;
88     void OnLuminationInfoChangedCallbackAsync(LuminationInfo info) const;
89 };
90 
91 struct LuminationInfoChangedCallback {
92     LuminationInfo info_;
93     const LuminationInfoCallbackListener* listener_;
LuminationInfoChangedCallbackLuminationInfoChangedCallback94     LuminationInfoChangedCallback(LuminationInfo info, const LuminationInfoCallbackListener* listener)
95         : info_(info), listener_(listener) {}
96 };
97 
98 static const char PROFESSIONAL_SESSION_NAPI_CLASS_NAME[] = "ProfessionSession";
99 class ProfessionSessionNapi : public CameraSessionNapi {
100 public:
101     static napi_value Init(napi_env env, napi_value exports);
102     static napi_value CreateCameraSession(napi_env env, SceneMode mode);
103     ProfessionSessionNapi();
104     ~ProfessionSessionNapi();
105 
106     static void ProfessionSessionNapiDestructor(napi_env env, void* nativeObject, void* finalize_hint);
107     static napi_value ProfessionSessionNapiConstructor(napi_env env, napi_callback_info info);
108 
109     static napi_value GetSupportedMeteringModes(napi_env env, napi_callback_info info);
110     static napi_value IsMeteringModeSupported(napi_env env, napi_callback_info info);
111     static napi_value GetMeteringMode(napi_env env, napi_callback_info info);
112     static napi_value SetMeteringMode(napi_env env, napi_callback_info info);
113 
114     static napi_value IsManualIsoSupported(napi_env env, napi_callback_info info);
115     static napi_value GetIsoRange(napi_env env, napi_callback_info info);
116     static napi_value GetISO(napi_env env, napi_callback_info info);
117     static napi_value SetISO(napi_env env, napi_callback_info info);
118 
119     static napi_value GetSupportedVirtualApertures(napi_env env, napi_callback_info info);
120     static napi_value GetVirtualAperture(napi_env env, napi_callback_info info);
121     static napi_value SetVirtualAperture(napi_env env, napi_callback_info info);
122 
123     static napi_value GetExposureDurationRange(napi_env env, napi_callback_info info);
124     static napi_value GetExposureDuration(napi_env env, napi_callback_info info);
125     static napi_value SetExposureDuration(napi_env env, napi_callback_info info);
126 
127     static napi_value GetSupportedExposureHintModes(napi_env env, napi_callback_info info);
128     static napi_value GetExposureHintMode(napi_env env, napi_callback_info info);
129     static napi_value SetExposureHintMode(napi_env env, napi_callback_info info);
130 
131     static napi_value GetSupportedFocusAssistFlashModes(napi_env env, napi_callback_info info);
132     static napi_value IsFocusAssistFlashModeSupported(napi_env env, napi_callback_info info);
133     static napi_value GetFocusAssistFlashMode(napi_env env, napi_callback_info info);
134     static napi_value SetFocusAssistFlashMode(napi_env env, napi_callback_info info);
135 
136     static napi_value On(napi_env env, napi_callback_info info);
137     static napi_value Once(napi_env env, napi_callback_info info);
138     static napi_value Off(napi_env env, napi_callback_info info);
139 
140     static const std::vector<napi_property_descriptor> manual_exposure_funcs;
141     static const std::vector<napi_property_descriptor> manual_focus_funcs;
142     static const std::vector<napi_property_descriptor> manual_iso_props;
143     static const std::vector<napi_property_descriptor> pro_session_props;
144 
145     std::shared_ptr<ExposureInfoCallbackListener> exposureInfoCallback_ = nullptr;
146     std::shared_ptr<IsoInfoCallbackListener> isoInfoCallback_ = nullptr;
147     std::shared_ptr<ApertureInfoCallbackListener> apertureInfoCallback_ = nullptr;
148     std::shared_ptr<LuminationInfoCallbackListener> luminationInfoCallback_ = nullptr;
149     std::shared_ptr<AbilityCallbackListener> abilityCallback_ = nullptr;
150 
151     napi_env env_;
152     sptr<ProfessionSession> professionSession_;
153 
154     static thread_local napi_ref sConstructor_;
155 
156 protected:
157     void RegisterExposureInfoCallbackListener(const std::string& eventName, napi_env env, napi_value callback,
158         const std::vector<napi_value>& args, bool isOnce) override;
159     void UnregisterExposureInfoCallbackListener(
160         const std::string& eventName, napi_env env, napi_value callback, const std::vector<napi_value>& args) override;
161     void RegisterAbilityChangeCallbackListener(const std::string& eventName, napi_env env, napi_value callback,
162         const std::vector<napi_value>& args, bool isOnce) override;
163     void UnregisterAbilityChangeCallbackListener(
164         const std::string& eventName, napi_env env, napi_value callback, const std::vector<napi_value>& args) override;
165     void RegisterIsoInfoCallbackListener(const std::string& eventName, napi_env env, napi_value callback,
166         const std::vector<napi_value>& args, bool isOnce) override;
167     void UnregisterIsoInfoCallbackListener(
168         const std::string& eventName, napi_env env, napi_value callback, const std::vector<napi_value>& args) override;
169     void RegisterApertureInfoCallbackListener(const std::string& eventName, napi_env env, napi_value callback,
170         const std::vector<napi_value>& args, bool isOnce) override;
171     void UnregisterApertureInfoCallbackListener(
172         const std::string& eventName, napi_env env, napi_value callback, const std::vector<napi_value>& args) override;
173     void RegisterLuminationInfoCallbackListener(const std::string& eventName, napi_env env, napi_value callback,
174         const std::vector<napi_value>& args, bool isOnce) override;
175     void UnregisterLuminationInfoCallbackListener(
176         const std::string& eventName, napi_env env, napi_value callback, const std::vector<napi_value>& args) override;
177 };
178 }
179 }
180 #endif /* PROFESSION_SESSION_NAPI_H */
181