• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-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 #ifndef NAPI_UTILS_H
17 #define NAPI_UTILS_H
18 
19 #include <cstdint>
20 #include <map>
21 #include <list>
22 #include "napi/native_api.h"
23 #include "napi/native_common.h"
24 #include "napi/native_node_api.h"
25 #include "avsession_log.h"
26 #include "audio_system_manager.h"
27 #include "avsession_info.h"
28 #include "want_agent.h"
29 #include "napi_base_context.h"
30 #include "ability.h"
31 #include "media_info_holder.h"
32 #include "media_info.h"
33 #include "av_file_descriptor.h"
34 #include "avqueue_info.h"
35 
36 /* check condition related to argc/argv, return and logging. */
37 #define CHECK_ARGS_RETURN_VOID(context, condition, message, code)               \
38     do {                                                               \
39         if (!(condition)) {                                            \
40             (context)->status = napi_invalid_arg;                         \
41             (context)->errMessage = std::string(message);                      \
42             (context)->errCode = code;                      \
43             SLOGE("test (" #condition ") failed: " message);           \
44             return;                                                    \
45         }                                                              \
46     } while (0)
47 
48 #define CHECK_STATUS_RETURN_VOID(context, message, code)                        \
49     do {                                                               \
50         if ((context)->status != napi_ok) {                               \
51             (context)->errMessage = std::string(message);                      \
52             (context)->errCode = code;                      \
53             SLOGE("test (context->status == napi_ok) failed: " message);  \
54             return;                                                    \
55         }                                                              \
56     } while (0)
57 
58 /* check condition, return and logging if condition not true. */
59 #define CHECK_RETURN(condition, message, retVal)             \
60     do {                                                     \
61         if (!(condition)) {                                  \
62             SLOGE("test (" #condition ") failed: " message); \
63             return retVal;                                   \
64         }                                                    \
65     } while (0)
66 
67 #define CHECK_RETURN_VOID(condition, message)                \
68     do {                                                     \
69         if (!(condition)) {                                  \
70             SLOGE("test (" #condition ") failed: " message); \
71             return;                                          \
72         }                                                    \
73     } while (0)
74 
75 namespace OHOS::AVSession {
76 class NapiUtils {
77 public:
78     static int32_t ConvertSessionType(const std::string& typeString);
79     static std::string ConvertSessionType(int32_t type);
80 
81     /* napi_value <-> bool */
82     static napi_status GetValue(napi_env env, napi_value in, bool& out);
83     static napi_status SetValue(napi_env env, const bool& in, napi_value& out);
84 
85     /* napi_value <-> int32_t */
86     static napi_status GetValue(napi_env env, napi_value in, int32_t& out);
87     static napi_status SetValue(napi_env env, const int32_t& in, napi_value& out);
88 
89     /* napi_value <-> uint32_t */
90     static napi_status GetValue(napi_env env, napi_value in, uint32_t& out);
91     static napi_status SetValue(napi_env env, const uint32_t& in, napi_value& out);
92 
93     /* napi_value <-> int64_t */
94     static napi_status GetValue(napi_env env, napi_value in, int64_t& out);
95     static napi_status SetValue(napi_env env, const int64_t& in, napi_value& out);
96 
97     /* napi_value <-> double */
98     static napi_status GetValue(napi_env env, napi_value in, double& out);
99     static napi_status SetValue(napi_env env, const double& in, napi_value& out);
100 
101     /* napi_value <-> std::string */
102     static napi_status GetValue(napi_env env, napi_value in, std::string& out);
103     static napi_status SetValue(napi_env env, const std::string& in, napi_value& out);
104 
105     /* napi_value <-> AppExecFwk::ElementName */
106     static napi_status SetValue(napi_env env, const AppExecFwk::ElementName& in, napi_value& out);
107 
108     /* napi_value <-> AVSessionDescriptor */
109     static napi_status SetValue(napi_env env, const AVSessionDescriptor& in, napi_value& out);
110 
111     /* napi_value <-> MMI::KeyEvent::KeyItem */
112     static napi_status GetValue(napi_env env, napi_value in, MMI::KeyEvent::KeyItem& out);
113     static napi_status SetValue(napi_env env, const std::optional<MMI::KeyEvent::KeyItem> in, napi_value& out);
114 
115     /* napi_value <-> MMI::KeyEvent */
116     static napi_status GetValue(napi_env env, napi_value in, std::shared_ptr<MMI::KeyEvent>& out);
117     static napi_status SetValue(napi_env env, const std::shared_ptr<MMI::KeyEvent>& in, napi_value& out);
118 
119     /* napi_value <-> AbilityRuntime::WantAgent::WantAgent */
120     static napi_status GetValue(napi_env env, napi_value in, AbilityRuntime::WantAgent::WantAgent*& out);
121     static napi_status SetValue(napi_env env, AbilityRuntime::WantAgent::WantAgent& in, napi_value& out);
122 
123     /* napi_value <-> AAFwk::WantParams */
124     static napi_status GetValue(napi_env env, napi_value in, AAFwk::WantParams& out);
125     static napi_status SetValue(napi_env env, const AAFwk::WantParams& in, napi_value& out);
126 
127     /* napi_value <-> AVCallMetaData */
128     static napi_status GetValue(napi_env env, napi_value in, AVCallMetaData& out);
129     static napi_status SetValue(napi_env env, const AVCallMetaData& in, napi_value& out);
130 
131     /* napi_value <-> AVCallState */
132     static napi_status GetValue(napi_env env, napi_value in, AVCallState& out);
133     static napi_status SetValue(napi_env env, const AVCallState& in, napi_value& out);
134 
135     /* napi_value <-> AVMetaData */
136     static napi_status GetValue(napi_env env, napi_value in, AVMetaData& out);
137     static napi_status SetValue(napi_env env, const AVMetaData& in, napi_value& out);
138 
139     /* napi_value <-> AVMediaDescription */
140     static napi_status GetValue(napi_env env, napi_value in, AVMediaDescription& out);
141     static napi_status SetValue(napi_env env, const AVMediaDescription& in, napi_value& out);
142 
143     /* napi_value <-> AVQueueItem */
144     static napi_status GetValue(napi_env env, napi_value in, AVQueueItem& out);
145     static napi_status SetValue(napi_env env, const AVQueueItem& in, napi_value& out);
146 
147     /* napi_value <-> std::vector<AVQueueItem> */
148     static napi_status GetValue(napi_env env, napi_value in, std::vector<AVQueueItem>& out);
149     static napi_status SetValue(napi_env env, const std::vector<AVQueueItem>& in, napi_value& out);
150 
151     /* napi_value <-> AVPlaybackState */
152     static napi_status GetValue(napi_env env, napi_value in, AVPlaybackState& out);
153     static napi_status SetValue(napi_env env, const AVPlaybackState& in, napi_value& out);
154 
155     /* napi_value <-> AVCastPlayerState */
156     static napi_status GetValue(napi_env env, napi_value in, AVCastPlayerState& out);
157     static napi_status SetValue(napi_env env, const AVCastPlayerState& in, napi_value& out);
158 
159     /* napi_value <-> std::vector<std::string> */
160     static napi_status GetValue(napi_env env, napi_value in, std::vector<std::string>& out);
161     static napi_status SetValue(napi_env env, const std::vector<std::string>& in, napi_value& out);
162 
163     /* napi_value <-> std::vector<uint8_t> */
164     static napi_status GetValue(napi_env env, napi_value in, std::vector<uint8_t>& out);
165     static napi_status SetValue(napi_env env, const std::vector<uint8_t>& in, napi_value& out);
166 
167     /* napi_value <-> std::vector<int32_t> */
168     static napi_status GetValue(napi_env env, napi_value in, std::vector<int32_t>& out);
169     static napi_status SetValue(napi_env env, const std::vector<int32_t>& in, napi_value& out);
170 
171     /* napi_value <-> std::vector<uint32_t> */
172     static napi_status GetValue(napi_env env, napi_value in, std::vector<uint32_t>& out);
173     static napi_status SetValue(napi_env env, const std::vector<uint32_t>& in, napi_value& out);
174 
175     /* napi_value <-> std::vector<int64_t> */
176     static napi_status GetValue(napi_env env, napi_value in, std::vector<int64_t>& out);
177     static napi_status SetValue(napi_env env, const std::vector<int64_t>& in, napi_value& out);
178 
179     /* napi_value <-> std::vector<double> */
180     static napi_status GetValue(napi_env env, napi_value in, std::vector<double>& out);
181     static napi_status SetValue(napi_env env, const std::vector<double>& in, napi_value& out);
182 
183     /* std::vector<AVSessionDescriptor> <-> napi_value */
184     static napi_status SetValue(napi_env env, const std::vector<AVSessionDescriptor>& in, napi_value& out);
185 
186     /* napi_value <-> AVQueueInfo */
187     static napi_status SetValue(napi_env env, const AVQueueInfo& in, napi_value& out);
188 
189     /* napi_value <-> std::vector<AVQueueInfo> */
190     static napi_status SetValue(napi_env env, const std::vector<AVQueueInfo>& in, napi_value& out);
191 
192     /* OutputDeviceInfo <-> napi_value */
193     static napi_status GetValue(napi_env env, napi_value in, OutputDeviceInfo& out);
194     static napi_status SetValue(napi_env env, const OutputDeviceInfo& in, napi_value& out);
195 
196     static napi_status GetOptionalString(napi_env env, napi_value in, DeviceInfo& out);
197 
198     /* DeviceInfo <-> napi_value */
199     static napi_status GetValue(napi_env env, napi_value in, DeviceInfo& out);
200     static napi_status SetValue(napi_env env, const DeviceInfo& in, napi_value& out);
201 
202     /* MediaInfoHolder <-> napi_value */
203     static napi_status GetValue(napi_env env, napi_value in, MediaInfoHolder& out);
204     static napi_status SetValue(napi_env env, const MediaInfoHolder& in, napi_value& out);
205 
206     /* napi_value <-> MediaInfo */
207     static napi_status GetValue(napi_env env, napi_value in, MediaInfo& out);
208     static napi_status SetValue(napi_env env, const MediaInfo& in, napi_value& out);
209 
210     /* napi_value <-> AVFileDescriptor */
211     static napi_status GetValue(napi_env env, napi_value in, AVFileDescriptor& out);
212     static napi_status SetValue(napi_env env, const AVFileDescriptor& in, napi_value& out);
213 
214     /* napi_get_named_property wrapper */
215     template <typename T>
GetNamedProperty(napi_env env,napi_value in,const std::string & prop,T & value)216     static inline napi_status GetNamedProperty(napi_env env, napi_value in, const std::string& prop, T& value)
217     {
218         bool hasProp = false;
219         napi_status status = napi_has_named_property(env, in, prop.c_str(), &hasProp);
220         if ((status == napi_ok) && hasProp) {
221             napi_value inner = nullptr;
222             status = napi_get_named_property(env, in, prop.c_str(), &inner);
223             if ((status == napi_ok) && (inner != nullptr)) {
224                 return GetValue(env, inner, value);
225             }
226         }
227         return napi_invalid_arg;
228     };
229 
230     /* napi_unwrap with napi_instanceof */
231     static napi_status Unwrap(napi_env env, napi_value in, void** out, napi_value constructor);
232 
233     static bool Equals(napi_env env, napi_value value, napi_ref copy);
234     static bool TypeCheck(napi_env env, napi_value value, napi_valuetype expectType);
235 
236     static napi_value GetUndefinedValue(napi_env env);
237 
238     static napi_status GetPropertyNames(napi_env env, napi_value in, std::vector<std::string>& out);
239 
240     static napi_status GetDateValue(napi_env env, napi_value value, double& result);
241     static napi_status SetDateValue(napi_env env, double time, napi_value& result);
242     static napi_status GetRefByCallback(napi_env env, std::list<napi_ref> callbackList, napi_value callback,
243         napi_ref& callbackRef);
244 
245     static napi_status GetStageElementName(napi_env env, napi_value in, AppExecFwk::ElementName& out);
246     static napi_status GetFaElementName(napi_env env, AppExecFwk::ElementName& out);
247     static napi_status GetValue(napi_env env, napi_value in, AppExecFwk::ElementName& out);
248     static napi_status GetValue(napi_env env, napi_value in, SessionToken& out);
249     static napi_status GetValue(napi_env env, napi_value in, AudioStandard::DeviceRole& out);
250     static napi_status GetValue(napi_env env, napi_value in, AudioStandard::DeviceType& out);
251     static napi_status GetValue(napi_env env, napi_value in, AudioStandard::AudioDeviceDescriptor& out);
252     static napi_status GetValue(napi_env env, napi_value in, std::vector<AudioStandard::AudioDeviceDescriptor>& out);
253     static napi_status GetSampleRate(napi_env env, napi_value in, AudioStandard::AudioSamplingRate& out);
254     static napi_status GetChannels(napi_env env, napi_value in, AudioStandard::AudioChannel& out);
255     static napi_status GetChannelMasks(napi_env env, napi_value in, int32_t& out);
256     static napi_status SetOutPutDeviceIdValue(napi_env env, const std::vector<std::string>& in, napi_value& out);
257 
258     static constexpr int KEYEVENT_ACTION_JS_NATIVE_DELTA = 1;
259 
260     static napi_status ThrowError(napi_env env, const char* napiMessage, int32_t napiCode);
261 
262     static constexpr size_t ARGC_ONE = 1;
263     static constexpr size_t ARGC_TWO = 2;
264     static constexpr size_t ARGC_THREE = 3;
265 
266     static constexpr size_t ARGV_FIRST = 0;
267     static constexpr size_t ARGV_SECOND = 1;
268     static constexpr size_t ARGV_THIRD = 2;
269 };
270 }
271 #endif // NAPI_UTILS_H
272