• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "js_uri.h"
17 #include "securec.h"
18 #include "utils/log.h"
19 #include "napi/native_api.h"
20 #include "napi/native_node_api.h"
21 
22 extern const char _binary_js_uri_js_start[];
23 extern const char _binary_js_uri_js_end[];
24 extern const char _binary_uri_abc_start[];
25 extern const char _binary_uri_abc_end[];
26 
27 namespace OHOS::Uri {
UriConstructor(napi_env env,napi_callback_info info)28     static napi_value UriConstructor(napi_env env, napi_callback_info info)
29     {
30         napi_value thisVar = nullptr;
31         void *data = nullptr;
32         size_t argc = 1;
33         napi_value argv[1] = { 0 };
34         Uri *object = nullptr;
35         NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, &data));
36         napi_valuetype valuetype;
37         NAPI_CALL(env, napi_typeof(env, argv[0], &valuetype));
38         if (valuetype == napi_string) {
39             std::string type = "";
40             size_t typelen = 0;
41             NAPI_CALL(env, napi_get_value_string_utf8(env, argv[0], nullptr, 0, &typelen));
42             type.resize(typelen);
43             NAPI_CALL(env, napi_get_value_string_utf8(env, argv[0], type.data(), typelen + 1, &typelen));
44             object = new Uri(type);
45         }
46         NAPI_CALL(env, napi_wrap(env, thisVar, object,
47             [](napi_env environment, void *data, void *hint) {
48             auto obj = reinterpret_cast<Uri*>(data);
49             if (obj != nullptr) {
50                 delete obj;
51             }
52         }, nullptr, nullptr));
53         return thisVar;
54     }
55 
Normalize(napi_env env,napi_callback_info info)56     static napi_value Normalize(napi_env env, napi_callback_info info)
57     {
58         napi_value thisVar = nullptr;
59         NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr));
60         Uri *muri = nullptr;
61         NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&muri)));
62         std::string normalizeUri = muri->Normalize();
63         napi_value result = nullptr;
64         size_t tempLen = normalizeUri.size();
65         NAPI_CALL(env, napi_create_string_utf8(env, normalizeUri.c_str(), tempLen, &result));
66         return result;
67     }
68 
Equals(napi_env env,napi_callback_info info)69     static napi_value Equals(napi_env env, napi_callback_info info)
70     {
71         napi_value thisVar = nullptr;
72         napi_value result = nullptr;
73         size_t argc = 1;
74         napi_value argv[1] = { 0 };
75         NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr));
76 
77         Uri *muri = nullptr;
78         NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&muri)));
79         Uri *other = nullptr;
80         NAPI_CALL(env, napi_unwrap(env, argv[0], reinterpret_cast<void**>(&other)));
81 
82         bool flag = muri->Equals(*other);
83         NAPI_CALL(env, napi_get_boolean(env, flag, &result));
84         return result;
85     }
86 
IsAbsolute(napi_env env,napi_callback_info info)87     static napi_value IsAbsolute(napi_env env, napi_callback_info info)
88     {
89         napi_value thisVar = nullptr;
90         napi_value result = nullptr;
91         NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr));
92         Uri *muri = nullptr;
93         NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&muri)));
94         bool flag = muri->IsAbsolute();
95         NAPI_CALL(env, napi_get_boolean(env, flag, &result));
96         return result;
97     }
98 
IsFailed(napi_env env,napi_callback_info info)99     static napi_value IsFailed(napi_env env, napi_callback_info info)
100     {
101         napi_value thisVar = nullptr;
102         napi_value result = nullptr;
103         NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr));
104         Uri *muri = nullptr;
105         NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&muri)));
106         std::string temp = muri->IsFailed();
107         size_t templen = temp.size();
108         NAPI_CALL(env, napi_create_string_utf8(env, temp.c_str(), templen, &result));
109         return result;
110     }
111 
UriToString(napi_env env,napi_callback_info info)112     static napi_value UriToString(napi_env env, napi_callback_info info)
113     {
114         napi_value thisVar = nullptr;
115         napi_value result = nullptr;
116         NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr));
117         Uri *muri = nullptr;
118         NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&muri)));
119         std::string temp = muri->ToString();
120         size_t templen = temp.size();
121         NAPI_CALL(env, napi_create_string_utf8(env, temp.c_str(), templen, &result));
122         return result;
123     }
124 
GetScheme(napi_env env,napi_callback_info info)125     static napi_value GetScheme(napi_env env, napi_callback_info info)
126     {
127         napi_value thisVar = nullptr;
128         napi_value result = nullptr;
129         NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr));
130         Uri *muri = nullptr;
131         NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&muri)));
132         std::string temp = muri->GetScheme();
133         size_t templen = temp.size();
134         NAPI_CALL(env, napi_create_string_utf8(env, temp.c_str(), templen, &result));
135         return result;
136     }
137 
GetAuthority(napi_env env,napi_callback_info info)138     static napi_value GetAuthority(napi_env env, napi_callback_info info)
139     {
140         napi_value thisVar = nullptr;
141         napi_value result = nullptr;
142         NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr));
143         Uri *muri = nullptr;
144         NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&muri)));
145         std::string temp = muri->GetAuthority();
146         size_t templen = temp.size();
147         NAPI_CALL(env, napi_create_string_utf8(env, temp.c_str(), templen, &result));
148         return result;
149     }
150 
GetSsp(napi_env env,napi_callback_info info)151     static napi_value GetSsp(napi_env env, napi_callback_info info)
152     {
153         napi_value thisVar = nullptr;
154         napi_value result = nullptr;
155         NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr));
156         Uri *muri = nullptr;
157         NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&muri)));
158         std::string temp = muri->GetSsp();
159         size_t templen = temp.size();
160         NAPI_CALL(env, napi_create_string_utf8(env, temp.c_str(), templen, &result));
161         return result;
162     }
163 
GetUserinfo(napi_env env,napi_callback_info info)164     static napi_value GetUserinfo(napi_env env, napi_callback_info info)
165     {
166         napi_value thisVar = nullptr;
167         napi_value result = nullptr;
168         NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr));
169         Uri *muri = nullptr;
170         NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&muri)));
171         std::string temp = muri->GetUserinfo();
172         size_t templen = temp.size();
173         NAPI_CALL(env, napi_create_string_utf8(env, temp.c_str(), templen, &result));
174         return result;
175     }
176 
GetHost(napi_env env,napi_callback_info info)177     static napi_value GetHost(napi_env env, napi_callback_info info)
178     {
179         napi_value thisVar = nullptr;
180         napi_value result = nullptr;
181         NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr));
182         Uri *muri = nullptr;
183         NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&muri)));
184         std::string temp = muri->GetHost();
185         size_t templen = temp.size();
186         NAPI_CALL(env, napi_create_string_utf8(env, temp.c_str(), templen, &result));
187         return result;
188     }
189 
GetPort(napi_env env,napi_callback_info info)190     static napi_value GetPort(napi_env env, napi_callback_info info)
191     {
192         napi_value thisVar = nullptr;
193         napi_value result = nullptr;
194         NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr));
195         Uri *muri = nullptr;
196         NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&muri)));
197         std::string temp = muri->GetPort();
198         size_t templen = temp.size();
199         NAPI_CALL(env, napi_create_string_utf8(env, temp.c_str(), templen, &result));
200         return result;
201     }
202 
GetPath(napi_env env,napi_callback_info info)203     static napi_value GetPath(napi_env env, napi_callback_info info)
204     {
205         napi_value thisVar = nullptr;
206         napi_value result = nullptr;
207         NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr));
208         Uri *muri = nullptr;
209         NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&muri)));
210         std::string temp = muri->GetPath();
211         size_t templen = temp.size();
212         NAPI_CALL(env, napi_create_string_utf8(env, temp.c_str(), templen, &result));
213         return result;
214     }
215 
GetQuery(napi_env env,napi_callback_info info)216     static napi_value GetQuery(napi_env env, napi_callback_info info)
217     {
218         napi_value thisVar = nullptr;
219         napi_value result = nullptr;
220         NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr));
221         Uri *muri = nullptr;
222         NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&muri)));
223         std::string temp = muri->GetQuery();
224         size_t templen = temp.size();
225         NAPI_CALL(env, napi_create_string_utf8(env, temp.c_str(), templen, &result));
226         return result;
227     }
228 
GetFragment(napi_env env,napi_callback_info info)229     static napi_value GetFragment(napi_env env, napi_callback_info info)
230     {
231         napi_value thisVar = nullptr;
232         napi_value result = nullptr;
233         NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr));
234         Uri *muri = nullptr;
235         NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&muri)));
236         std::string temp = muri->GetFragment();
237         size_t templen = temp.size();
238         NAPI_CALL(env, napi_create_string_utf8(env, temp.c_str(), templen, &result));
239         return result;
240     }
241 
UriInit(napi_env env,napi_value exports)242     static napi_value UriInit(napi_env env, napi_value exports)
243     {
244         const char *uriClassName = "uri";
245         napi_value uriClass = nullptr;
246         napi_property_descriptor uriDesc[] = {
247             DECLARE_NAPI_FUNCTION("normalize", Normalize),
248             DECLARE_NAPI_FUNCTION("equals", Equals),
249             DECLARE_NAPI_FUNCTION("checkIsAbsolute", IsAbsolute),
250             DECLARE_NAPI_FUNCTION("toString", UriToString),
251             DECLARE_NAPI_GETTER("scheme", GetScheme),
252             DECLARE_NAPI_GETTER("authority", GetAuthority),
253             DECLARE_NAPI_GETTER("ssp", GetSsp),
254             DECLARE_NAPI_GETTER("userInfo", GetUserinfo),
255             DECLARE_NAPI_GETTER("host", GetHost),
256             DECLARE_NAPI_GETTER("port", GetPort),
257             DECLARE_NAPI_GETTER("path", GetPath),
258             DECLARE_NAPI_GETTER("query", GetQuery),
259             DECLARE_NAPI_GETTER("fragment", GetFragment),
260             DECLARE_NAPI_GETTER("isFailed", IsFailed),
261         };
262         NAPI_CALL(env, napi_define_class(env, uriClassName, strlen(uriClassName), UriConstructor,
263                                          nullptr, sizeof(uriDesc) / sizeof(uriDesc[0]), uriDesc, &uriClass));
264         napi_property_descriptor desc[] = {
265             DECLARE_NAPI_PROPERTY("Uri", uriClass)
266         };
267         napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
268         return exports;
269     }
270 
271 
272     static napi_module UriModule = {
273         .nm_version = 1,
274         .nm_flags = 0,
275         .nm_filename = nullptr,
276         .nm_register_func = UriInit,
277         .nm_modname = "uri",
278         .nm_priv = reinterpret_cast<void*>(0),
279         .reserved = {0},
280     };
RegisterModule()281     extern "C" __attribute__((constructor)) void RegisterModule()
282     {
283         napi_module_register(&UriModule);
284     }
285     extern "C"
NAPI_uri_GetJSCode(const char ** buf,int * bufLen)286     __attribute__((visibility("default"))) void NAPI_uri_GetJSCode(const char **buf, int *bufLen)
287     {
288         if (buf != nullptr) {
289             *buf = _binary_js_uri_js_start;
290         }
291         if (bufLen != nullptr) {
292             *bufLen = _binary_js_uri_js_end - _binary_js_uri_js_start;
293         }
294     }
295     extern "C"
NAPI_uri_GetABCCode(const char ** buf,int * buflen)296     __attribute__((visibility("default"))) void NAPI_uri_GetABCCode(const char** buf, int* buflen)
297     {
298         if (buf != nullptr) {
299             *buf = _binary_uri_abc_start;
300         }
301         if (buflen != nullptr) {
302             *buflen = _binary_uri_abc_end - _binary_uri_abc_start;
303         }
304     }
305 } // namespace OHOS::Uri
306