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