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