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