• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 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 "n_val.h"
17 
18 #include <sstream>
19 #include <string>
20 
21 namespace OHOS {
22 namespace Rosen {
23 using namespace std;
24 
NVal(napi_env nEnv,napi_value nVal=nullptr)25 NVal::NVal(napi_env nEnv, napi_value nVal = nullptr) : env_(nEnv), val_(nVal) {}
26 
operator bool() const27 NVal::operator bool() const
28 {
29     return env_ && val_;
30 }
31 
TypeIs(napi_valuetype expType) const32 bool NVal::TypeIs(napi_valuetype expType) const
33 {
34     if (!*this) {
35         return false;
36     }
37 
38     napi_valuetype valueType;
39     napi_typeof(env_, val_, &valueType);
40 
41     if (expType != valueType) {
42         return false;
43     }
44     return true;
45 }
46 
IsArray() const47 tuple<bool, bool> NVal::IsArray() const
48 {
49     bool res = false;
50     napi_status status = napi_is_array(env_, val_, &res);
51     return make_tuple(status == napi_ok, res);
52 }
53 
ToUTF8String() const54 tuple<bool, unique_ptr<char[]>, size_t> NVal::ToUTF8String() const
55 {
56     size_t strLen = 0;
57     napi_status status = napi_get_value_string_utf8(env_, val_, nullptr, -1, &strLen);
58     if (status != napi_ok) {
59         return {false, nullptr, 0};
60     }
61 
62     size_t bufLen = strLen + 1;
63     unique_ptr<char[]> str = make_unique<char[]>(bufLen);
64     status = napi_get_value_string_utf8(env_, val_, str.get(), bufLen, &strLen);
65     return make_tuple(status == napi_ok, move(str), strLen);
66 }
67 
ToUTF16String() const68 tuple<bool, unique_ptr<char[]>, size_t> NVal::ToUTF16String() const
69 {
70 #ifdef FILE_SUBSYSTEM_DEV_ON_PC
71     size_t strLen = 0;
72     napi_status status = napi_get_value_string_utf16(env_, val_, nullptr, -1, &strLen);
73     if (status != napi_ok) {
74         return { false, nullptr, 0 };
75     }
76 
77     auto str = make_unique<char16_t[]>(++strLen);
78     status = napi_get_value_string_utf16(env_, val_, str.get(), strLen, nullptr);
79     if (status != napi_ok) {
80         return { false, nullptr, 0 };
81     }
82 
83     strLen = reinterpret_cast<char *>(str.get() + strLen) - reinterpret_cast<char *>(str.get());
84     auto strRet = unique_ptr<char[]>(reinterpret_cast<char *>(str.release()));
85     return { true, move(strRet), strLen };
86 #else
87     // Note that quickjs doesn't support utf16
88     return ToUTF8String();
89 #endif
90 }
91 
ToPointer() const92 tuple<bool, void *> NVal::ToPointer() const
93 {
94     void *res = nullptr;
95     napi_status status = napi_get_value_external(env_, val_, &res);
96     return make_tuple(status == napi_ok, res);
97 }
98 
IsTypeArray() const99 tuple<bool, bool> NVal::IsTypeArray() const
100 {
101     bool res = false;
102     napi_status status = napi_is_typedarray(env_, val_, &res);
103     return make_tuple(status == napi_ok, res);
104 }
105 
ToBool() const106 tuple<bool, bool> NVal::ToBool() const
107 {
108     bool flag = false;
109     napi_status status = napi_get_value_bool(env_, val_, &flag);
110     return make_tuple(status == napi_ok, flag);
111 }
112 
ToDouble() const113 tuple<bool, double> NVal::ToDouble() const
114 {
115     double res = 0.0;
116     napi_status status = napi_get_value_double(env_, val_, &res);
117     return make_tuple(status == napi_ok, res);
118 }
119 
ToInt32() const120 tuple<bool, int32_t> NVal::ToInt32() const
121 {
122     int32_t res = 0;
123     napi_status status = napi_get_value_int32(env_, val_, &res);
124     return make_tuple(status == napi_ok, res);
125 }
126 
ToInt64() const127 tuple<bool, int64_t> NVal::ToInt64() const
128 {
129     int64_t res = 0;
130     napi_status status = napi_get_value_int64(env_, val_, &res);
131     return make_tuple(status == napi_ok, res);
132 }
133 
ToArraybuffer() const134 tuple<bool, void *, size_t> NVal::ToArraybuffer() const
135 {
136     void *buf = nullptr;
137     size_t bufLen = 0;
138     bool status = napi_get_arraybuffer_info(env_, val_, &buf, &bufLen);
139     return make_tuple(status == napi_ok, buf, bufLen);
140 }
141 
ToTypedArray() const142 tuple<bool, napi_typedarray_type, void *, size_t> NVal::ToTypedArray() const
143 {
144     napi_typedarray_type type;
145     napi_value in_array_buffer = nullptr;
146     size_t byte_offset;
147     size_t length;
148     void *data = nullptr;
149     napi_status status = napi_get_typedarray_info(env_, val_, &type, &length, (void **) &data, &in_array_buffer,
150         &byte_offset);
151     return make_tuple(status == napi_ok, type, data, length);
152 }
153 
ToDataview() const154 tuple<bool, void *, size_t> NVal::ToDataview() const
155 {
156     size_t bufLen = 0;
157     void *buf = nullptr;
158     napi_value arraybuffer = nullptr;
159     size_t byteoff = 0;
160     bool status = napi_get_dataview_info(env_, val_, &bufLen, &buf, &arraybuffer, &byteoff);
161     return make_tuple(status == napi_ok, buf, bufLen);
162 }
163 
ToTypedArrayInfo() const164 tuple<bool, void *, size_t, size_t, napi_typedarray_type> NVal::ToTypedArrayInfo() const
165 {
166     napi_typedarray_type type;
167     napi_value in_array_buffer = nullptr;
168     size_t byte_offset;
169     size_t length;
170     void *data = nullptr;
171     napi_status status =
172         napi_get_typedarray_info(env_, val_, &type, &length, (void **)&data, &in_array_buffer, &byte_offset);
173     return make_tuple(status == napi_ok, data, length, byte_offset, type);
174 }
175 
HasProp(string propName) const176 bool NVal::HasProp(string propName) const
177 {
178     bool res = false;
179 
180     if (!env_ || !val_ || !TypeIs(napi_object)) {
181         return false;
182     }
183 
184     napi_status status = napi_has_named_property(env_, val_, propName.c_str(), &res);
185     return (status == napi_ok) && res;
186 }
187 
GetProp(string propName) const188 NVal NVal::GetProp(string propName) const
189 {
190     if (!HasProp(propName)) {
191         return {env_, nullptr};
192     }
193     napi_value prop = nullptr;
194     napi_status status = napi_get_named_property(env_, val_, propName.c_str(), &prop);
195     if (status != napi_ok) {
196         return {env_, nullptr};
197     }
198     return NVal(env_, prop);
199 }
200 
AddProp(vector<napi_property_descriptor> && propVec) const201 bool NVal::AddProp(vector<napi_property_descriptor> &&propVec) const
202 {
203     if (!TypeIs(napi_valuetype::napi_object)) {
204         return false;
205     }
206     napi_status status = napi_define_properties(env_, val_, propVec.size(), propVec.data());
207     if (status != napi_ok) {
208         return false;
209     }
210     return true;
211 }
212 
AddProp(string propName,napi_value val) const213 bool NVal::AddProp(string propName, napi_value val) const
214 {
215     if (!TypeIs(napi_valuetype::napi_object) || HasProp(propName)) {
216         return false;
217     }
218 
219     napi_status status = napi_set_named_property(env_, val_, propName.c_str(), val);
220     if (status != napi_ok) {
221         return false;
222     }
223     return true;
224 }
225 
CreateUndefined(napi_env env)226 NVal NVal::CreateUndefined(napi_env env)
227 {
228     napi_value res = nullptr;
229     napi_get_undefined(env, &res);
230     return {env, res};
231 }
232 
CreateNull(napi_env env)233 NVal NVal::CreateNull(napi_env env)
234 {
235     napi_value res = nullptr;
236     napi_get_null(env, &res);
237     return {env, res};
238 }
239 
CreateInt64(napi_env env,int64_t val)240 NVal NVal::CreateInt64(napi_env env, int64_t val)
241 {
242     napi_value res = nullptr;
243     napi_create_int64(env, val, &res);
244     return {env, res};
245 }
246 
CreateObject(napi_env env)247 NVal NVal::CreateObject(napi_env env)
248 {
249     napi_value res = nullptr;
250     napi_create_object(env, &res);
251     return {env, res};
252 }
253 
CreateBool(napi_env env,bool val)254 NVal NVal::CreateBool(napi_env env, bool val)
255 {
256     napi_value res = nullptr;
257     napi_get_boolean(env, val, &res);
258     return {env, res};
259 }
260 
CreateUTF8String(napi_env env,std::string str)261 NVal NVal::CreateUTF8String(napi_env env, std::string str)
262 {
263     napi_value res = nullptr;
264     napi_create_string_utf8(env, str.c_str(), str.length(), &res);
265     return {env, res};
266 }
267 
CreateUint8Array(napi_env env,void * buf,size_t bufLen)268 NVal NVal::CreateUint8Array(napi_env env, void *buf, size_t bufLen)
269 {
270     napi_value output_buffer = nullptr;
271     napi_create_external_arraybuffer(env, buf, bufLen,
272         [](napi_env env, void *finalize_data, void *finalize_hint) { free(finalize_data); },
273         NULL, &output_buffer);
274     napi_value output_array = nullptr;
275     napi_create_typedarray(env, napi_uint8_array, bufLen, output_buffer, 0, &output_array);
276     return {env, output_array};
277 }
278 
CreateDouble(napi_env env,double val)279 NVal NVal::CreateDouble(napi_env env, double val)
280 {
281     napi_value res = nullptr;
282     napi_create_double(env, val, &res);
283     return {env, res};
284 }
285 
DeclareNapiProperty(const char * name,napi_value val)286 napi_property_descriptor NVal::DeclareNapiProperty(const char *name, napi_value val)
287 {
288     return {(name), nullptr, nullptr, nullptr, nullptr, val, napi_default, nullptr};
289 }
290 
DeclareNapiStaticProperty(const char * name,napi_value val)291 napi_property_descriptor NVal::DeclareNapiStaticProperty(const char *name, napi_value val)
292 {
293     return {(name), nullptr, nullptr, nullptr, nullptr, val, napi_static, nullptr};
294 }
295 
DeclareNapiFunction(const char * name,napi_callback func)296 napi_property_descriptor NVal::DeclareNapiFunction(const char *name, napi_callback func)
297 {
298     return {(name), nullptr, (func), nullptr, nullptr, nullptr, napi_default, nullptr};
299 }
300 
DeclareNapiStaticFunction(const char * name,napi_callback func)301 napi_property_descriptor NVal::DeclareNapiStaticFunction(const char *name, napi_callback func)
302 {
303     return {(name), nullptr, (func), nullptr, nullptr, nullptr, napi_static, nullptr};
304 }
305 
DeclareNapiGetter(const char * name,napi_callback getter)306 napi_property_descriptor NVal::DeclareNapiGetter(const char *name, napi_callback getter)
307 {
308     return {(name), nullptr, nullptr, (getter), nullptr, nullptr, napi_default, nullptr};
309 }
310 
DeclareNapiSetter(const char * name,napi_callback setter)311 napi_property_descriptor NVal::DeclareNapiSetter(const char *name, napi_callback setter)
312 {
313     return {(name), nullptr, nullptr, nullptr, (setter), nullptr, napi_default, nullptr};
314 }
315 
DeclareNapiGetterSetter(const char * name,napi_callback getter,napi_callback setter)316 napi_property_descriptor NVal::DeclareNapiGetterSetter(const char *name, napi_callback getter, napi_callback setter)
317 {
318     return {(name), nullptr, nullptr, (getter), (setter), nullptr, napi_default, nullptr};
319 }
320 } // namespace Rosen
321 } // namespace OHOS
322