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 #include "napi_parse_utils.h"
17
18 namespace {
19 constexpr int MAX_STRING_LENGTH = 40960;
20 }
21
22 namespace OHOS {
23 namespace NWeb {
CreateEnumConstructor(napi_env env,napi_callback_info info)24 napi_value NapiParseUtils::CreateEnumConstructor(napi_env env, napi_callback_info info)
25 {
26 napi_value arg = nullptr;
27 napi_get_cb_info(env, info, nullptr, nullptr, &arg, nullptr);
28 return arg;
29 }
30
ToInt32Value(napi_env env,int32_t number)31 napi_value NapiParseUtils::ToInt32Value(napi_env env, int32_t number)
32 {
33 napi_value result = nullptr;
34 napi_create_int32(env, number, &result);
35 return result;
36 }
37
ParseInt32(napi_env env,napi_value argv,int32_t & outValue)38 bool NapiParseUtils::ParseInt32(napi_env env, napi_value argv, int32_t& outValue)
39 {
40 napi_valuetype valueType = napi_undefined;
41
42 napi_typeof(env, argv, &valueType);
43 if (valueType != napi_number) {
44 return false;
45 }
46
47 int32_t number = 0;
48 napi_get_value_int32(env, argv, &number);
49 outValue = number;
50
51 return true;
52 }
53
ParseString(napi_env env,napi_value argv,std::string & outValue)54 bool NapiParseUtils::ParseString(napi_env env, napi_value argv, std::string& outValue)
55 {
56 size_t bufferSize = 0;
57 napi_valuetype valueType = napi_undefined;
58
59 napi_typeof(env, argv, &valueType);
60 if (valueType != napi_string) {
61 return false;
62 }
63 napi_get_value_string_utf8(env, argv, nullptr, 0, &bufferSize);
64 if (bufferSize > MAX_STRING_LENGTH) {
65 return false;
66 }
67 char stringValue[bufferSize + 1];
68 size_t jsStringLength = 0;
69 napi_get_value_string_utf8(env, argv, stringValue, bufferSize + 1, &jsStringLength);
70 if (jsStringLength != bufferSize) {
71 return false;
72 }
73 outValue = stringValue;
74 return true;
75 }
76
ParseBoolean(napi_env env,napi_value argv,bool & outValue)77 bool NapiParseUtils::ParseBoolean(napi_env env, napi_value argv, bool& outValue)
78 {
79 napi_valuetype valueType = napi_null;
80
81 napi_typeof(env, argv, &valueType);
82 if (valueType != napi_boolean) {
83 return false;
84 }
85
86 bool boolValue;
87 napi_get_value_bool(env, argv, &boolValue);
88 outValue = boolValue;
89 return true;
90 }
91
ParseStringArray(napi_env env,napi_value argv,std::vector<std::string> & outValue)92 bool NapiParseUtils::ParseStringArray(napi_env env, napi_value argv, std::vector<std::string>& outValue)
93 {
94 bool isArray = false;
95 napi_is_array(env, argv, &isArray);
96 if (!isArray) {
97 return false;
98 }
99
100 uint32_t arrLen = 0;
101 napi_get_array_length(env, argv, &arrLen);
102 for (uint32_t i = 0; i < arrLen; ++i) {
103 napi_value item = nullptr;
104 napi_get_element(env, argv, i, &item);
105
106 std::string str;
107 if (ParseString(env, item, str)) {
108 outValue.push_back(str);
109 }
110 }
111
112 return true;
113 }
114
ParseFloat(napi_env env,napi_value argv,float & outValue)115 bool NapiParseUtils::ParseFloat(napi_env env, napi_value argv, float& outValue)
116 {
117 napi_valuetype valueType = napi_undefined;
118 napi_typeof(env, argv, &valueType);
119 if (valueType != napi_number) {
120 return false;
121 }
122
123 double value;
124 napi_get_value_double(env, argv, &value);
125 outValue = static_cast<float>(value);
126 return true;
127 }
128 } // namespace NWeb
129 } // namespace OHOS