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