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