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