1 /* 2 * Copyright (c) 2022 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 32 /* check condition related to argc/argv, return and logging. */ 33 #define CHECK_ARGS_RETURN_VOID(context, condition, message, code) \ 34 do { \ 35 if (!(condition)) { \ 36 (context)->status = napi_invalid_arg; \ 37 (context)->errMessage = std::string(message); \ 38 (context)->errCode = code; \ 39 SLOGE("test (" #condition ") failed: " message); \ 40 return; \ 41 } \ 42 } while (0) 43 44 #define CHECK_STATUS_RETURN_VOID(context, message, code) \ 45 do { \ 46 if ((context)->status != napi_ok) { \ 47 (context)->errMessage = std::string(message); \ 48 (context)->errCode = code; \ 49 SLOGE("test (context->status == napi_ok) failed: " message); \ 50 return; \ 51 } \ 52 } while (0) 53 54 /* check condition, return and logging if condition not true. */ 55 #define CHECK_RETURN(condition, message, retVal) \ 56 do { \ 57 if (!(condition)) { \ 58 SLOGE("test (" #condition ") failed: " message); \ 59 return retVal; \ 60 } \ 61 } while (0) 62 63 #define CHECK_RETURN_VOID(condition, message) \ 64 do { \ 65 if (!(condition)) { \ 66 SLOGE("test (" #condition ") failed: " message); \ 67 return; \ 68 } \ 69 } while (0) 70 71 namespace OHOS::AVSession { 72 class NapiUtils { 73 public: 74 static int32_t ConvertSessionType(const std::string& typeString); 75 static std::string ConvertSessionType(int32_t type); 76 77 /* napi_value <-> bool */ 78 static napi_status GetValue(napi_env env, napi_value in, bool& out); 79 static napi_status SetValue(napi_env env, const bool& in, napi_value& out); 80 81 /* napi_value <-> int32_t */ 82 static napi_status GetValue(napi_env env, napi_value in, int32_t& out); 83 static napi_status SetValue(napi_env env, const int32_t& in, napi_value& out); 84 85 /* napi_value <-> uint32_t */ 86 static napi_status GetValue(napi_env env, napi_value in, uint32_t& out); 87 static napi_status SetValue(napi_env env, const uint32_t& in, napi_value& out); 88 89 /* napi_value <-> int64_t */ 90 static napi_status GetValue(napi_env env, napi_value in, int64_t& out); 91 static napi_status SetValue(napi_env env, const int64_t& in, napi_value& out); 92 93 /* napi_value <-> double */ 94 static napi_status GetValue(napi_env env, napi_value in, double& out); 95 static napi_status SetValue(napi_env env, const double& in, napi_value& out); 96 97 /* napi_value <-> std::string */ 98 static napi_status GetValue(napi_env env, napi_value in, std::string& out); 99 static napi_status SetValue(napi_env env, const std::string& in, napi_value& out); 100 101 /* napi_value <-> AppExecFwk::ElementName */ 102 static napi_status SetValue(napi_env env, const AppExecFwk::ElementName& in, napi_value& out); 103 104 /* napi_value <-> OutputDeviceInfo */ 105 static napi_status SetValue(napi_env env, const OutputDeviceInfo& in, napi_value& out); 106 107 /* napi_value <-> AVSessionDescriptor */ 108 static napi_status SetValue(napi_env env, const AVSessionDescriptor& in, napi_value& out); 109 110 /* napi_value <-> MMI::KeyEvent::KeyItem */ 111 static napi_status GetValue(napi_env env, napi_value in, MMI::KeyEvent::KeyItem& out); 112 static napi_status SetValue(napi_env env, const MMI::KeyEvent::KeyItem& in, napi_value& out); 113 114 /* napi_value <-> MMI::KeyEvent */ 115 static napi_status GetValue(napi_env env, napi_value in, std::shared_ptr<MMI::KeyEvent>& out); 116 static napi_status SetValue(napi_env env, const std::shared_ptr<MMI::KeyEvent>& in, napi_value& out); 117 118 /* napi_value <-> AbilityRuntime::WantAgent::WantAgent */ 119 static napi_status GetValue(napi_env env, napi_value in, AbilityRuntime::WantAgent::WantAgent*& out); 120 static napi_status SetValue(napi_env env, AbilityRuntime::WantAgent::WantAgent& in, napi_value& out); 121 122 /* napi_value <-> AVMetaData */ 123 static napi_status GetValue(napi_env env, napi_value in, AVMetaData& out); 124 static napi_status SetValue(napi_env env, const AVMetaData& in, napi_value& out); 125 126 /* napi_value <-> AVPlaybackState */ 127 static napi_status GetValue(napi_env env, napi_value in, AVPlaybackState& out); 128 static napi_status SetValue(napi_env env, const AVPlaybackState& in, napi_value& out); 129 130 /* napi_value <-> std::vector<std::string> */ 131 static napi_status GetValue(napi_env env, napi_value in, std::vector<std::string>& out); 132 static napi_status SetValue(napi_env env, const std::vector<std::string>& in, napi_value& out); 133 134 /* napi_value <-> std::vector<uint8_t> */ 135 static napi_status GetValue(napi_env env, napi_value in, std::vector<uint8_t>& out); 136 static napi_status SetValue(napi_env env, const std::vector<uint8_t>& in, napi_value& out); 137 138 /* napi_value <-> std::vector<int32_t> */ 139 static napi_status GetValue(napi_env env, napi_value in, std::vector<int32_t>& out); 140 static napi_status SetValue(napi_env env, const std::vector<int32_t>& in, napi_value& out); 141 142 /* napi_value <-> std::vector<uint32_t> */ 143 static napi_status GetValue(napi_env env, napi_value in, std::vector<uint32_t>& out); 144 static napi_status SetValue(napi_env env, const std::vector<uint32_t>& in, napi_value& out); 145 146 /* napi_value <-> std::vector<int64_t> */ 147 static napi_status GetValue(napi_env env, napi_value in, std::vector<int64_t>& out); 148 static napi_status SetValue(napi_env env, const std::vector<int64_t>& in, napi_value& out); 149 150 /* napi_value <-> std::vector<double> */ 151 static napi_status GetValue(napi_env env, napi_value in, std::vector<double>& out); 152 static napi_status SetValue(napi_env env, const std::vector<double>& in, napi_value& out); 153 154 /* std::vector<AVSessionDescriptor> <-> napi_value */ 155 static napi_status SetValue(napi_env env, const std::vector<AVSessionDescriptor>& in, napi_value& out); 156 157 /* napi_get_named_property wrapper */ 158 template <typename T> GetNamedProperty(napi_env env,napi_value in,const std::string & prop,T & value)159 static inline napi_status GetNamedProperty(napi_env env, napi_value in, const std::string& prop, T& value) 160 { 161 bool hasProp = false; 162 napi_status status = napi_has_named_property(env, in, prop.c_str(), &hasProp); 163 if ((status == napi_ok) && hasProp) { 164 napi_value inner = nullptr; 165 status = napi_get_named_property(env, in, prop.c_str(), &inner); 166 if ((status == napi_ok) && (inner != nullptr)) { 167 return GetValue(env, inner, value); 168 } 169 } 170 return napi_invalid_arg; 171 }; 172 173 /* napi_unwrap with napi_instanceof */ 174 static napi_status Unwrap(napi_env env, napi_value in, void** out, napi_value constructor); 175 176 static bool Equals(napi_env env, napi_value value, napi_ref copy); 177 178 static napi_value GetUndefinedValue(napi_env env); 179 180 static napi_status GetPropertyNames(napi_env env, napi_value in, std::vector<std::string>& out); 181 182 static napi_status GetDateValue(napi_env env, napi_value value, double& result); 183 static napi_status SetDateValue(napi_env env, double time, napi_value& result); 184 static napi_status GetRefByCallback(napi_env env, std::list<napi_ref> callbackList, napi_value callback, 185 napi_ref& callbackRef); 186 187 static napi_status GetStageElementName(napi_env env, napi_value in, AppExecFwk::ElementName& out); 188 static napi_status GetFaElementName(napi_env env, AppExecFwk::ElementName& out); 189 static napi_status GetValue(napi_env env, napi_value in, AppExecFwk::ElementName& out); 190 static napi_status GetValue(napi_env env, napi_value in, SessionToken& out); 191 static napi_status GetValue(napi_env env, napi_value in, AudioStandard::DeviceRole& out); 192 static napi_status GetValue(napi_env env, napi_value in, AudioStandard::DeviceType& out); 193 static napi_status GetValue(napi_env env, napi_value in, AudioStandard::AudioDeviceDescriptor& out); 194 static napi_status GetValue(napi_env env, napi_value in, std::vector<AudioStandard::AudioDeviceDescriptor>& out); 195 static napi_status GetSampleRate(napi_env env, napi_value in, AudioStandard::AudioSamplingRate& out); 196 static napi_status GetChannels(napi_env env, napi_value in, AudioStandard::AudioChannel& out); 197 static napi_status GetChannelMasks(napi_env env, napi_value in, int32_t& out); 198 static napi_status SetOutPutDeviceIdValue(napi_env env, const std::vector<std::string>& in, napi_value& out); 199 200 static constexpr int KEYEVENT_ACTION_JS_NATIVE_DELTA = 1; 201 202 static napi_status ThrowError(napi_env env, const char* napiMessage, int32_t napiCode); 203 204 static constexpr size_t ARGC_ONE = 1; 205 static constexpr size_t ARGC_TWO = 2; 206 static constexpr size_t ARGC_THERE = 3; 207 208 static constexpr size_t ARGV_FIRST = 0; 209 static constexpr size_t ARGV_SECOND = 1; 210 static constexpr size_t ARGV_THIRD = 2; 211 }; 212 } 213 #endif // NAPI_UTILS_H