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