1 /*
2  * Copyright (c) 2024-2024 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 CAMERA_NAPI_OBJECT_TYPES_H
17 #define CAMERA_NAPI_OBJECT_TYPES_H
18 
19 #include <any>
20 #include <cstdint>
21 #include <memory>
22 
23 #include "camera_napi_object.h"
24 #include "camera_output_capability.h"
25 #include "js_native_api_types.h"
26 
27 namespace OHOS {
28 namespace CameraStandard {
29 
30 class CameraNapiObjectTypes {
31 public:
~CameraNapiObjectTypes()32     virtual ~CameraNapiObjectTypes() {};
33     virtual CameraNapiObject& GetCameraNapiObject() = 0;
34     virtual napi_value GenerateNapiValue(napi_env env) final;
35 
36 protected:
37     template<typename T, typename... Args>
Hold(Args &&...args)38     T* Hold(Args&&... args)
39     {
40         std::shared_ptr<T> ptr = std::make_shared<T>(std::forward<Args>(args)...);
41         ptrHolder_.emplace_back(ptr);
42         return ptr.get();
43     }
44 
45 private:
46     std::list<std::shared_ptr<void>> ptrHolder_;
47 };
48 
49 class CameraNapiObjSize : public CameraNapiObjectTypes {
50 public:
CameraNapiObjSize(Size & size)51     explicit CameraNapiObjSize(Size& size) : size_(size) {}
52     CameraNapiObject& GetCameraNapiObject() override;
53 
54 private:
55     Size& size_;
56 };
57 
58 class CameraNapiObjFrameRateRange : public CameraNapiObjectTypes {
59 public:
CameraNapiObjFrameRateRange(std::vector<int32_t> & frameRateRange)60     explicit CameraNapiObjFrameRateRange(std::vector<int32_t>& frameRateRange) : frameRateRange_(frameRateRange) {}
61     CameraNapiObject& GetCameraNapiObject() override;
62 
63 private:
64     std::vector<int32_t>& frameRateRange_;
65 };
66 
67 class CameraNapiObjProfile : public CameraNapiObjectTypes {
68 public:
CameraNapiObjProfile(Profile & profile)69     explicit CameraNapiObjProfile(Profile& profile) : profile_(profile) {}
70     CameraNapiObject& GetCameraNapiObject() override;
71 
72 private:
73     Profile& profile_;
74 };
75 
76 class CameraNapiObjVideoProfile : public CameraNapiObjectTypes {
77 public:
CameraNapiObjVideoProfile(VideoProfile & videoProfile)78     explicit CameraNapiObjVideoProfile(VideoProfile& videoProfile) : videoProfile_(videoProfile) {}
79     CameraNapiObject& GetCameraNapiObject() override;
80 
81 private:
82     VideoProfile& videoProfile_;
83 };
84 
85 class CameraNapiObjDepthProfile : public CameraNapiObjectTypes {
86 public:
CameraNapiObjDepthProfile(DepthProfile & depthProfile)87     explicit CameraNapiObjDepthProfile(DepthProfile& depthProfile) : depthProfile_(depthProfile) {}
88     CameraNapiObject& GetCameraNapiObject() override;
89 
90 private:
91     DepthProfile& depthProfile_;
92 };
93 
94 class CameraDevice;
95 class CameraNapiObjCameraDevice : public CameraNapiObjectTypes {
96 public:
CameraNapiObjCameraDevice(CameraDevice & cameraDevice)97     explicit CameraNapiObjCameraDevice(CameraDevice& cameraDevice) : cameraDevice_(cameraDevice) {}
98     CameraNapiObject& GetCameraNapiObject() override;
99 
100 private:
101     CameraDevice& cameraDevice_;
102 };
103 
104 struct Rect;
105 class CameraNapiBoundingBox : public CameraNapiObjectTypes {
106 public:
CameraNapiBoundingBox(Rect & rect)107     explicit CameraNapiBoundingBox(Rect& rect) : rect_(rect) {}
108     CameraNapiObject& GetCameraNapiObject() override;
109 
110 private:
111     Rect& rect_;
112 };
113 
114 class MetadataObject;
115 class CameraNapiObjMetadataObject : public CameraNapiObjectTypes {
116 public:
CameraNapiObjMetadataObject(MetadataObject & metadataObject)117     explicit CameraNapiObjMetadataObject(MetadataObject& metadataObject) : metadataObject_(metadataObject) {}
118     CameraNapiObject& GetCameraNapiObject() override;
119 
120 private:
121     MetadataObject& metadataObject_;
122 };
123 
124 class CameraOutputCapability;
125 class CameraNapiObjCameraOutputCapability : public CameraNapiObjectTypes {
126 public:
CameraNapiObjCameraOutputCapability(CameraOutputCapability & cameraOutputCapability)127     explicit CameraNapiObjCameraOutputCapability(CameraOutputCapability& cameraOutputCapability)
128         : cameraOutputCapability_(cameraOutputCapability)
129     {}
130     CameraNapiObject& GetCameraNapiObject() override;
131 
132 private:
133     CameraOutputCapability& cameraOutputCapability_;
134 };
135 } // namespace CameraStandard
136 } // namespace OHOS
137 #endif /* CAMERA_NAPI_OBJECT_TYPES_H */
138