• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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, &paramSize, 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