1 /* 2 * Copyright (c) 2024-2024 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 CAMERA_NAPI_CALLBACK_PARAM_PARSER_H 17 #define CAMERA_NAPI_CALLBACK_PARAM_PARSER_H 18 19 #include <cstddef> 20 #include <cstdint> 21 22 #include "camera_error_code.h" 23 #include "camera_napi_const.h" 24 #include "js_native_api.h" 25 #include "napi/native_api.h" 26 27 namespace OHOS { 28 namespace CameraStandard { 29 30 class CameraNapiCallbackParamParser { 31 public: 32 template<typename T> CameraNapiCallbackParamParser(napi_env env,napi_callback_info info,T * & nativeObjPointer)33 explicit CameraNapiCallbackParamParser(napi_env env, napi_callback_info info, T*& nativeObjPointer) : env_(env) 34 { 35 static const size_t CALLBACK_ARGS_MIN = 1; 36 napi_value thisVar; 37 size_t paramSize = ARGS_MAX_SIZE; 38 std::vector<napi_value> paramValue(paramSize, nullptr); 39 napiError = napi_get_cb_info(env_, info, ¶mSize, paramValue.data(), &thisVar, nullptr); 40 if (napiError != napi_ok) { 41 return; 42 } 43 UnwrapThisVarToAddr(thisVar, nativeObjPointer); 44 if (napiError != napi_ok) { 45 return; 46 } 47 if (paramSize > ARGS_MAX_SIZE || paramSize < CALLBACK_ARGS_MIN) { 48 napiError = napi_status::napi_invalid_arg; 49 return; 50 } 51 52 napi_valuetype valueNapiType = napi_undefined; 53 napi_typeof(env_, paramValue[ARGS_ZERO], &valueNapiType); 54 if (valueNapiType != napi_string) { 55 napiError = napi_status::napi_invalid_arg; 56 return; 57 } 58 if (paramSize > 1) { 59 napi_typeof(env_, paramValue[paramSize - 1], &valueNapiType); 60 if (valueNapiType == napi_function) { 61 callbackFunction_ = paramValue[paramSize - 1]; 62 if (paramSize > CALLBACK_ARGS_MIN + 1) { 63 callbackFunctionParameters_ = 64 std::vector<napi_value>(paramValue.begin() + 1, paramValue.begin() + paramSize - 1); 65 } 66 } else { 67 callbackFunctionParameters_ = 68 std::vector<napi_value>(paramValue.begin() + 1, paramValue.begin() + paramSize); 69 } 70 } 71 size_t stringSize = 0; 72 napiError = napi_get_value_string_utf8(env_, paramValue[ARGS_ZERO], nullptr, 0, &stringSize); 73 if (napiError != napi_ok) { 74 return; 75 } 76 callbackName_.resize(stringSize); 77 napiError = 78 napi_get_value_string_utf8(env_, paramValue[ARGS_ZERO], callbackName_.data(), stringSize + 1, &stringSize); 79 } 80 AssertStatus(CameraErrorCode errorCode,const char * message)81 inline bool AssertStatus(CameraErrorCode errorCode, const char* message) 82 { 83 if (napiError != napi_ok) { 84 napi_throw_error(env_, std::to_string(errorCode).c_str(), message); 85 } 86 return napiError == napi_ok; 87 } 88 GetCallbackName()89 inline const std::string& GetCallbackName() 90 { 91 return callbackName_; 92 } 93 GetCallbackArgs()94 inline const std::vector<napi_value>& GetCallbackArgs() 95 { 96 return callbackFunctionParameters_; 97 } 98 GetCallbackFunction()99 inline napi_value GetCallbackFunction() 100 { 101 return callbackFunction_; 102 } 103 104 private: 105 template<typename T> UnwrapThisVarToAddr(napi_value thisVar,T * & dataPointAddr)106 void UnwrapThisVarToAddr(napi_value thisVar, T*& dataPointAddr) 107 { 108 if (napiError != napi_ok) { 109 return; 110 } 111 if (thisVar == nullptr) { 112 napiError = napi_invalid_arg; 113 return; 114 } 115 napiError = napi_unwrap(env_, thisVar, reinterpret_cast<void**>(&dataPointAddr)); 116 if (napiError == napi_ok && dataPointAddr == nullptr) { 117 napiError = napi_invalid_arg; 118 } 119 } 120 121 napi_env env_ = nullptr; 122 123 napi_status napiError = napi_status::napi_invalid_arg; 124 125 std::string callbackName_ = ""; 126 napi_value callbackFunction_ = nullptr; 127 std::vector<napi_value> callbackFunctionParameters_ {}; 128 }; 129 } // namespace CameraStandard 130 } // namespace OHOS 131 #endif