14d6c458bSopenharmony_ci /*
24d6c458bSopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd.
34d6c458bSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
44d6c458bSopenharmony_ci * you may not use this file except in compliance with the License.
54d6c458bSopenharmony_ci * You may obtain a copy of the License at
64d6c458bSopenharmony_ci *
74d6c458bSopenharmony_ci *    http://www.apache.org/licenses/LICENSE-2.0
84d6c458bSopenharmony_ci *
94d6c458bSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
104d6c458bSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
114d6c458bSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
124d6c458bSopenharmony_ci * See the License for the specific language governing permissions and
134d6c458bSopenharmony_ci * limitations under the License.
144d6c458bSopenharmony_ci */
154d6c458bSopenharmony_ci#include "native_module_uri.h"
164d6c458bSopenharmony_ci
174d6c458bSopenharmony_ci#include "js_uri.h"
184d6c458bSopenharmony_ci#include "securec.h"
194d6c458bSopenharmony_ci#include "tools/log.h"
204d6c458bSopenharmony_ci#include "napi/native_api.h"
214d6c458bSopenharmony_ci#include "napi/native_node_api.h"
224d6c458bSopenharmony_ci
234d6c458bSopenharmony_ciextern const char _binary_js_uri_js_start[];
244d6c458bSopenharmony_ciextern const char _binary_js_uri_js_end[];
254d6c458bSopenharmony_ciextern const char _binary_uri_abc_start[];
264d6c458bSopenharmony_ciextern const char _binary_uri_abc_end[];
274d6c458bSopenharmony_ci
284d6c458bSopenharmony_cinamespace OHOS::Uri {
294d6c458bSopenharmony_ci    static napi_value UriConstructor(napi_env env, napi_callback_info info)
304d6c458bSopenharmony_ci    {
314d6c458bSopenharmony_ci        napi_value thisVar = nullptr;
324d6c458bSopenharmony_ci        void *data = nullptr;
334d6c458bSopenharmony_ci        size_t argc = 1;
344d6c458bSopenharmony_ci        napi_value argv[1] = { 0 };
354d6c458bSopenharmony_ci        Uri *object = nullptr;
364d6c458bSopenharmony_ci        NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, &data));
374d6c458bSopenharmony_ci        napi_valuetype valuetype;
384d6c458bSopenharmony_ci        NAPI_CALL(env, napi_typeof(env, argv[0], &valuetype));
394d6c458bSopenharmony_ci        if (valuetype == napi_string) {
404d6c458bSopenharmony_ci            std::string type = "";
414d6c458bSopenharmony_ci            size_t typelen = 0;
424d6c458bSopenharmony_ci            NAPI_CALL(env, napi_get_value_string_utf8(env, argv[0], nullptr, 0, &typelen));
434d6c458bSopenharmony_ci            type.resize(typelen);
444d6c458bSopenharmony_ci            NAPI_CALL(env, napi_get_value_string_utf8(env, argv[0], type.data(), typelen + 1, &typelen));
454d6c458bSopenharmony_ci            object = new (std::nothrow) Uri(type);
464d6c458bSopenharmony_ci            if (object == nullptr) {
474d6c458bSopenharmony_ci                HILOG_ERROR("UriConstructor:: object is nullptr");
484d6c458bSopenharmony_ci                return nullptr;
494d6c458bSopenharmony_ci            }
504d6c458bSopenharmony_ci        }
514d6c458bSopenharmony_ci        NAPI_CALL(env, napi_wrap(env, thisVar, object,
524d6c458bSopenharmony_ci            [](napi_env environment, void *data, void *hint) {
534d6c458bSopenharmony_ci            auto obj = reinterpret_cast<Uri*>(data);
544d6c458bSopenharmony_ci            if (obj != nullptr) {
554d6c458bSopenharmony_ci                delete obj;
564d6c458bSopenharmony_ci            }
574d6c458bSopenharmony_ci        }, nullptr, nullptr));
584d6c458bSopenharmony_ci        return thisVar;
594d6c458bSopenharmony_ci    }
604d6c458bSopenharmony_ci
614d6c458bSopenharmony_ci    static napi_value Normalize(napi_env env, napi_callback_info info)
624d6c458bSopenharmony_ci    {
634d6c458bSopenharmony_ci        napi_value thisVar = nullptr;
644d6c458bSopenharmony_ci        NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr));
654d6c458bSopenharmony_ci        Uri *muri = nullptr;
664d6c458bSopenharmony_ci        NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&muri)));
674d6c458bSopenharmony_ci        std::string normalizeUri = muri->Normalize();
684d6c458bSopenharmony_ci        napi_value result = nullptr;
694d6c458bSopenharmony_ci        size_t tempLen = normalizeUri.size();
704d6c458bSopenharmony_ci        NAPI_CALL(env, napi_create_string_utf8(env, normalizeUri.c_str(), tempLen, &result));
714d6c458bSopenharmony_ci        return result;
724d6c458bSopenharmony_ci    }
734d6c458bSopenharmony_ci
744d6c458bSopenharmony_ci    static napi_value Equals(napi_env env, napi_callback_info info)
754d6c458bSopenharmony_ci    {
764d6c458bSopenharmony_ci        napi_value thisVar = nullptr;
774d6c458bSopenharmony_ci        napi_value result = nullptr;
784d6c458bSopenharmony_ci        size_t argc = 1;
794d6c458bSopenharmony_ci        napi_value argv[1] = { 0 };
804d6c458bSopenharmony_ci        NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr));
814d6c458bSopenharmony_ci
824d6c458bSopenharmony_ci        Uri *muri = nullptr;
834d6c458bSopenharmony_ci        NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&muri)));
844d6c458bSopenharmony_ci        Uri *other = nullptr;
854d6c458bSopenharmony_ci        NAPI_CALL(env, napi_unwrap(env, argv[0], reinterpret_cast<void**>(&other)));
864d6c458bSopenharmony_ci
874d6c458bSopenharmony_ci        bool flag = muri->Equals(*other);
884d6c458bSopenharmony_ci        NAPI_CALL(env, napi_get_boolean(env, flag, &result));
894d6c458bSopenharmony_ci        return result;
904d6c458bSopenharmony_ci    }
914d6c458bSopenharmony_ci
924d6c458bSopenharmony_ci    static napi_value IsAbsolute(napi_env env, napi_callback_info info)
934d6c458bSopenharmony_ci    {
944d6c458bSopenharmony_ci        napi_value thisVar = nullptr;
954d6c458bSopenharmony_ci        napi_value result = nullptr;
964d6c458bSopenharmony_ci        NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr));
974d6c458bSopenharmony_ci        Uri *muri = nullptr;
984d6c458bSopenharmony_ci        NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&muri)));
994d6c458bSopenharmony_ci        bool flag = muri->IsAbsolute();
1004d6c458bSopenharmony_ci        NAPI_CALL(env, napi_get_boolean(env, flag, &result));
1014d6c458bSopenharmony_ci        return result;
1024d6c458bSopenharmony_ci    }
1034d6c458bSopenharmony_ci
1044d6c458bSopenharmony_ci    static napi_value IsFailed(napi_env env, napi_callback_info info)
1054d6c458bSopenharmony_ci    {
1064d6c458bSopenharmony_ci        napi_value thisVar = nullptr;
1074d6c458bSopenharmony_ci        napi_value result = nullptr;
1084d6c458bSopenharmony_ci        NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr));
1094d6c458bSopenharmony_ci        Uri *muri = nullptr;
1104d6c458bSopenharmony_ci        NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&muri)));
1114d6c458bSopenharmony_ci        std::string temp = muri->IsFailed();
1124d6c458bSopenharmony_ci        size_t templen = temp.size();
1134d6c458bSopenharmony_ci        NAPI_CALL(env, napi_create_string_utf8(env, temp.c_str(), templen, &result));
1144d6c458bSopenharmony_ci        return result;
1154d6c458bSopenharmony_ci    }
1164d6c458bSopenharmony_ci
1174d6c458bSopenharmony_ci    static napi_value UriToString(napi_env env, napi_callback_info info)
1184d6c458bSopenharmony_ci    {
1194d6c458bSopenharmony_ci        napi_value thisVar = nullptr;
1204d6c458bSopenharmony_ci        napi_value result = nullptr;
1214d6c458bSopenharmony_ci        NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr));
1224d6c458bSopenharmony_ci        Uri *muri = nullptr;
1234d6c458bSopenharmony_ci        NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&muri)));
1244d6c458bSopenharmony_ci        std::string temp = muri->ToString();
1254d6c458bSopenharmony_ci        size_t templen = temp.size();
1264d6c458bSopenharmony_ci        NAPI_CALL(env, napi_create_string_utf8(env, temp.c_str(), templen, &result));
1274d6c458bSopenharmony_ci        return result;
1284d6c458bSopenharmony_ci    }
1294d6c458bSopenharmony_ci
1304d6c458bSopenharmony_ci    static napi_value IsRelative(napi_env env, napi_callback_info info)
1314d6c458bSopenharmony_ci    {
1324d6c458bSopenharmony_ci        napi_value thisVar = nullptr;
1334d6c458bSopenharmony_ci        napi_value result = nullptr;
1344d6c458bSopenharmony_ci        NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr));
1354d6c458bSopenharmony_ci        Uri *muri = nullptr;
1364d6c458bSopenharmony_ci        NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&muri)));
1374d6c458bSopenharmony_ci        bool flag = muri->IsRelative();
1384d6c458bSopenharmony_ci        NAPI_CALL(env, napi_get_boolean(env, flag, &result));
1394d6c458bSopenharmony_ci        return result;
1404d6c458bSopenharmony_ci    }
1414d6c458bSopenharmony_ci
1424d6c458bSopenharmony_ci    static napi_value IsOpaque(napi_env env, napi_callback_info info)
1434d6c458bSopenharmony_ci    {
1444d6c458bSopenharmony_ci        napi_value thisVar = nullptr;
1454d6c458bSopenharmony_ci        napi_value result = nullptr;
1464d6c458bSopenharmony_ci        NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr));
1474d6c458bSopenharmony_ci        Uri *muri = nullptr;
1484d6c458bSopenharmony_ci        NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&muri)));
1494d6c458bSopenharmony_ci        bool flag = muri->IsOpaque();
1504d6c458bSopenharmony_ci        NAPI_CALL(env, napi_get_boolean(env, flag, &result));
1514d6c458bSopenharmony_ci        return result;
1524d6c458bSopenharmony_ci    }
1534d6c458bSopenharmony_ci
1544d6c458bSopenharmony_ci    static napi_value IsHierarchical(napi_env env, napi_callback_info info)
1554d6c458bSopenharmony_ci    {
1564d6c458bSopenharmony_ci        napi_value thisVar = nullptr;
1574d6c458bSopenharmony_ci        napi_value result = nullptr;
1584d6c458bSopenharmony_ci        NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr));
1594d6c458bSopenharmony_ci        Uri *muri = nullptr;
1604d6c458bSopenharmony_ci        NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&muri)));
1614d6c458bSopenharmony_ci        bool flag = muri->IsHierarchical();
1624d6c458bSopenharmony_ci        NAPI_CALL(env, napi_get_boolean(env, flag, &result));
1634d6c458bSopenharmony_ci        return result;
1644d6c458bSopenharmony_ci    }
1654d6c458bSopenharmony_ci
1664d6c458bSopenharmony_ci    static napi_value AddQueryValue(napi_env env, napi_callback_info info)
1674d6c458bSopenharmony_ci    {
1684d6c458bSopenharmony_ci        napi_value thisVar = nullptr;
1694d6c458bSopenharmony_ci        napi_value result = nullptr;
1704d6c458bSopenharmony_ci        size_t argc = 2;
1714d6c458bSopenharmony_ci        napi_value argv[2] = { nullptr };
1724d6c458bSopenharmony_ci        NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr));
1734d6c458bSopenharmony_ci        Uri *muri = nullptr;
1744d6c458bSopenharmony_ci        NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&muri)));
1754d6c458bSopenharmony_ci        std::string key = "";
1764d6c458bSopenharmony_ci        size_t keyLen = 0;
1774d6c458bSopenharmony_ci        NAPI_CALL(env, napi_get_value_string_utf8(env, argv[0], nullptr, 0, &keyLen));
1784d6c458bSopenharmony_ci        key.resize(keyLen);
1794d6c458bSopenharmony_ci        NAPI_CALL(env, napi_get_value_string_utf8(env, argv[0], key.data(), keyLen + 1, &keyLen));
1804d6c458bSopenharmony_ci        std::string value = "";
1814d6c458bSopenharmony_ci        size_t valueLen = 0;
1824d6c458bSopenharmony_ci        NAPI_CALL(env, napi_get_value_string_utf8(env, argv[1], nullptr, 0, &valueLen));
1834d6c458bSopenharmony_ci        value.resize(valueLen);
1844d6c458bSopenharmony_ci        NAPI_CALL(env, napi_get_value_string_utf8(env, argv[1], value.data(), valueLen + 1, &valueLen));
1854d6c458bSopenharmony_ci        std::string temp = muri->AddQueryValue(key, value);
1864d6c458bSopenharmony_ci        if (temp.empty()) {
1874d6c458bSopenharmony_ci            napi_get_null(env, &result);
1884d6c458bSopenharmony_ci            return result;
1894d6c458bSopenharmony_ci        }
1904d6c458bSopenharmony_ci        size_t templen = temp.size();
1914d6c458bSopenharmony_ci        NAPI_CALL(env, napi_create_string_utf8(env, temp.c_str(), templen, &result));
1924d6c458bSopenharmony_ci        return result;
1934d6c458bSopenharmony_ci    }
1944d6c458bSopenharmony_ci
1954d6c458bSopenharmony_ci    static napi_value AddSegment(napi_env env, napi_callback_info info)
1964d6c458bSopenharmony_ci    {
1974d6c458bSopenharmony_ci        napi_value thisVar = nullptr;
1984d6c458bSopenharmony_ci        napi_value result = nullptr;
1994d6c458bSopenharmony_ci        size_t argc = 1;
2004d6c458bSopenharmony_ci        napi_value argv[1] = { nullptr };
2014d6c458bSopenharmony_ci        NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr));
2024d6c458bSopenharmony_ci        Uri *muri = nullptr;
2034d6c458bSopenharmony_ci        NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&muri)));
2044d6c458bSopenharmony_ci        std::string segment = "";
2054d6c458bSopenharmony_ci        size_t segmentLen = 0;
2064d6c458bSopenharmony_ci        NAPI_CALL(env, napi_get_value_string_utf8(env, argv[0], nullptr, 0, &segmentLen));
2074d6c458bSopenharmony_ci        segment.resize(segmentLen);
2084d6c458bSopenharmony_ci        NAPI_CALL(env, napi_get_value_string_utf8(env, argv[0], segment.data(), segmentLen + 1, &segmentLen));
2094d6c458bSopenharmony_ci        std::string temp = muri->AddSegment(segment);
2104d6c458bSopenharmony_ci        if (temp.empty()) {
2114d6c458bSopenharmony_ci            napi_get_null(env, &result);
2124d6c458bSopenharmony_ci            return result;
2134d6c458bSopenharmony_ci        }
2144d6c458bSopenharmony_ci        size_t tempLen = temp.size();
2154d6c458bSopenharmony_ci        NAPI_CALL(env, napi_create_string_utf8(env, temp.c_str(), tempLen, &result));
2164d6c458bSopenharmony_ci        return result;
2174d6c458bSopenharmony_ci    }
2184d6c458bSopenharmony_ci
2194d6c458bSopenharmony_ci    static napi_value GetSegment(napi_env env, napi_callback_info info)
2204d6c458bSopenharmony_ci    {
2214d6c458bSopenharmony_ci        napi_value thisVar = nullptr;
2224d6c458bSopenharmony_ci        napi_value result = nullptr;
2234d6c458bSopenharmony_ci        NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr));
2244d6c458bSopenharmony_ci        Uri *muri = nullptr;
2254d6c458bSopenharmony_ci        NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&muri)));
2264d6c458bSopenharmony_ci        std::vector<std::string> temp = muri->GetSegment();
2274d6c458bSopenharmony_ci        if (temp.empty()) {
2284d6c458bSopenharmony_ci            napi_get_null(env, &result);
2294d6c458bSopenharmony_ci            return result;
2304d6c458bSopenharmony_ci        }
2314d6c458bSopenharmony_ci        napi_value segment = nullptr;
2324d6c458bSopenharmony_ci        napi_create_array(env, &result);
2334d6c458bSopenharmony_ci        size_t size = temp.size();
2344d6c458bSopenharmony_ci        for (size_t i = 0; i < size; i++) {
2354d6c458bSopenharmony_ci            napi_create_string_utf8(env, temp[i].c_str(), temp[i].length(), &segment);
2364d6c458bSopenharmony_ci            napi_set_element(env, result, i, segment);
2374d6c458bSopenharmony_ci        }
2384d6c458bSopenharmony_ci        return result;
2394d6c458bSopenharmony_ci    }
2404d6c458bSopenharmony_ci
2414d6c458bSopenharmony_ci    static napi_value GetScheme(napi_env env, napi_callback_info info)
2424d6c458bSopenharmony_ci    {
2434d6c458bSopenharmony_ci        napi_value thisVar = nullptr;
2444d6c458bSopenharmony_ci        napi_value result = nullptr;
2454d6c458bSopenharmony_ci        NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr));
2464d6c458bSopenharmony_ci        Uri *muri = nullptr;
2474d6c458bSopenharmony_ci        NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&muri)));
2484d6c458bSopenharmony_ci        std::string temp = muri->GetScheme();
2494d6c458bSopenharmony_ci        if (temp.empty()) {
2504d6c458bSopenharmony_ci            napi_get_null(env, &result);
2514d6c458bSopenharmony_ci            return result;
2524d6c458bSopenharmony_ci        }
2534d6c458bSopenharmony_ci        size_t templen = temp.size();
2544d6c458bSopenharmony_ci        NAPI_CALL(env, napi_create_string_utf8(env, temp.c_str(), templen, &result));
2554d6c458bSopenharmony_ci        return result;
2564d6c458bSopenharmony_ci    }
2574d6c458bSopenharmony_ci
2584d6c458bSopenharmony_ci    static napi_value GetAuthority(napi_env env, napi_callback_info info)
2594d6c458bSopenharmony_ci    {
2604d6c458bSopenharmony_ci        napi_value thisVar = nullptr;
2614d6c458bSopenharmony_ci        napi_value result = nullptr;
2624d6c458bSopenharmony_ci        NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr));
2634d6c458bSopenharmony_ci        Uri *muri = nullptr;
2644d6c458bSopenharmony_ci        NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&muri)));
2654d6c458bSopenharmony_ci        std::string temp = muri->GetAuthority();
2664d6c458bSopenharmony_ci        if (temp.empty()) {
2674d6c458bSopenharmony_ci            napi_get_null(env, &result);
2684d6c458bSopenharmony_ci            return result;
2694d6c458bSopenharmony_ci        }
2704d6c458bSopenharmony_ci        size_t templen = temp.size();
2714d6c458bSopenharmony_ci        NAPI_CALL(env, napi_create_string_utf8(env, temp.c_str(), templen, &result));
2724d6c458bSopenharmony_ci        return result;
2734d6c458bSopenharmony_ci    }
2744d6c458bSopenharmony_ci
2754d6c458bSopenharmony_ci    static napi_value GetSsp(napi_env env, napi_callback_info info)
2764d6c458bSopenharmony_ci    {
2774d6c458bSopenharmony_ci        napi_value thisVar = nullptr;
2784d6c458bSopenharmony_ci        napi_value result = nullptr;
2794d6c458bSopenharmony_ci        NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr));
2804d6c458bSopenharmony_ci        Uri *muri = nullptr;
2814d6c458bSopenharmony_ci        NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&muri)));
2824d6c458bSopenharmony_ci        std::string temp = muri->GetSsp();
2834d6c458bSopenharmony_ci        size_t templen = temp.size();
2844d6c458bSopenharmony_ci        NAPI_CALL(env, napi_create_string_utf8(env, temp.c_str(), templen, &result));
2854d6c458bSopenharmony_ci        return result;
2864d6c458bSopenharmony_ci    }
2874d6c458bSopenharmony_ci
2884d6c458bSopenharmony_ci    static napi_value GetUserinfo(napi_env env, napi_callback_info info)
2894d6c458bSopenharmony_ci    {
2904d6c458bSopenharmony_ci        napi_value thisVar = nullptr;
2914d6c458bSopenharmony_ci        napi_value result = nullptr;
2924d6c458bSopenharmony_ci        NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr));
2934d6c458bSopenharmony_ci        Uri *muri = nullptr;
2944d6c458bSopenharmony_ci        NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&muri)));
2954d6c458bSopenharmony_ci        std::string temp = muri->GetUserinfo();
2964d6c458bSopenharmony_ci        if (temp.empty()) {
2974d6c458bSopenharmony_ci            napi_get_null(env, &result);
2984d6c458bSopenharmony_ci            return result;
2994d6c458bSopenharmony_ci        }
3004d6c458bSopenharmony_ci        size_t templen = temp.size();
3014d6c458bSopenharmony_ci        NAPI_CALL(env, napi_create_string_utf8(env, temp.c_str(), templen, &result));
3024d6c458bSopenharmony_ci        return result;
3034d6c458bSopenharmony_ci    }
3044d6c458bSopenharmony_ci
3054d6c458bSopenharmony_ci    static napi_value GetHost(napi_env env, napi_callback_info info)
3064d6c458bSopenharmony_ci    {
3074d6c458bSopenharmony_ci        napi_value thisVar = nullptr;
3084d6c458bSopenharmony_ci        napi_value result = nullptr;
3094d6c458bSopenharmony_ci        NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr));
3104d6c458bSopenharmony_ci        Uri *muri = nullptr;
3114d6c458bSopenharmony_ci        NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&muri)));
3124d6c458bSopenharmony_ci        std::string temp = muri->GetHost();
3134d6c458bSopenharmony_ci        if (temp.empty()) {
3144d6c458bSopenharmony_ci            napi_get_null(env, &result);
3154d6c458bSopenharmony_ci            return result;
3164d6c458bSopenharmony_ci        }
3174d6c458bSopenharmony_ci        size_t templen = temp.size();
3184d6c458bSopenharmony_ci        NAPI_CALL(env, napi_create_string_utf8(env, temp.c_str(), templen, &result));
3194d6c458bSopenharmony_ci        return result;
3204d6c458bSopenharmony_ci    }
3214d6c458bSopenharmony_ci
3224d6c458bSopenharmony_ci    static napi_value GetPort(napi_env env, napi_callback_info info)
3234d6c458bSopenharmony_ci    {
3244d6c458bSopenharmony_ci        napi_value thisVar = nullptr;
3254d6c458bSopenharmony_ci        napi_value result = nullptr;
3264d6c458bSopenharmony_ci        NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr));
3274d6c458bSopenharmony_ci        Uri *muri = nullptr;
3284d6c458bSopenharmony_ci        NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&muri)));
3294d6c458bSopenharmony_ci        std::string temp = muri->GetPort();
3304d6c458bSopenharmony_ci        size_t templen = temp.size();
3314d6c458bSopenharmony_ci        NAPI_CALL(env, napi_create_string_utf8(env, temp.c_str(), templen, &result));
3324d6c458bSopenharmony_ci        return result;
3334d6c458bSopenharmony_ci    }
3344d6c458bSopenharmony_ci
3354d6c458bSopenharmony_ci    static napi_value GetPath(napi_env env, napi_callback_info info)
3364d6c458bSopenharmony_ci    {
3374d6c458bSopenharmony_ci        napi_value thisVar = nullptr;
3384d6c458bSopenharmony_ci        napi_value result = nullptr;
3394d6c458bSopenharmony_ci        NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr));
3404d6c458bSopenharmony_ci        Uri *muri = nullptr;
3414d6c458bSopenharmony_ci        NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&muri)));
3424d6c458bSopenharmony_ci        std::string temp = muri->GetPath();
3434d6c458bSopenharmony_ci        if (temp.empty()) {
3444d6c458bSopenharmony_ci            napi_get_null(env, &result);
3454d6c458bSopenharmony_ci            return result;
3464d6c458bSopenharmony_ci        }
3474d6c458bSopenharmony_ci        size_t templen = temp.size();
3484d6c458bSopenharmony_ci        NAPI_CALL(env, napi_create_string_utf8(env, temp.c_str(), templen, &result));
3494d6c458bSopenharmony_ci        return result;
3504d6c458bSopenharmony_ci    }
3514d6c458bSopenharmony_ci
3524d6c458bSopenharmony_ci    static napi_value GetQuery(napi_env env, napi_callback_info info)
3534d6c458bSopenharmony_ci    {
3544d6c458bSopenharmony_ci        napi_value thisVar = nullptr;
3554d6c458bSopenharmony_ci        napi_value result = nullptr;
3564d6c458bSopenharmony_ci        NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr));
3574d6c458bSopenharmony_ci        Uri *muri = nullptr;
3584d6c458bSopenharmony_ci        NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&muri)));
3594d6c458bSopenharmony_ci        std::string temp = muri->GetQuery();
3604d6c458bSopenharmony_ci        if (temp.empty()) {
3614d6c458bSopenharmony_ci            napi_get_null(env, &result);
3624d6c458bSopenharmony_ci            return result;
3634d6c458bSopenharmony_ci        }
3644d6c458bSopenharmony_ci        size_t templen = temp.size();
3654d6c458bSopenharmony_ci        NAPI_CALL(env, napi_create_string_utf8(env, temp.c_str(), templen, &result));
3664d6c458bSopenharmony_ci        return result;
3674d6c458bSopenharmony_ci    }
3684d6c458bSopenharmony_ci
3694d6c458bSopenharmony_ci    static napi_value GetFragment(napi_env env, napi_callback_info info)
3704d6c458bSopenharmony_ci    {
3714d6c458bSopenharmony_ci        napi_value thisVar = nullptr;
3724d6c458bSopenharmony_ci        napi_value result = nullptr;
3734d6c458bSopenharmony_ci        NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr));
3744d6c458bSopenharmony_ci        Uri *muri = nullptr;
3754d6c458bSopenharmony_ci        NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&muri)));
3764d6c458bSopenharmony_ci        std::string temp = muri->GetFragment();
3774d6c458bSopenharmony_ci        if (temp.empty()) {
3784d6c458bSopenharmony_ci            napi_get_null(env, &result);
3794d6c458bSopenharmony_ci            return result;
3804d6c458bSopenharmony_ci        }
3814d6c458bSopenharmony_ci        size_t templen = temp.size();
3824d6c458bSopenharmony_ci        NAPI_CALL(env, napi_create_string_utf8(env, temp.c_str(), templen, &result));
3834d6c458bSopenharmony_ci        return result;
3844d6c458bSopenharmony_ci    }
3854d6c458bSopenharmony_ci
3864d6c458bSopenharmony_ci    static napi_value ClearQuery(napi_env env, napi_callback_info info)
3874d6c458bSopenharmony_ci    {
3884d6c458bSopenharmony_ci        napi_value thisVar = nullptr;
3894d6c458bSopenharmony_ci        napi_value result = nullptr;
3904d6c458bSopenharmony_ci        NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr));
3914d6c458bSopenharmony_ci        Uri *muri = nullptr;
3924d6c458bSopenharmony_ci        NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&muri)));
3934d6c458bSopenharmony_ci        std::string temp = muri->ClearQuery();
3944d6c458bSopenharmony_ci        if (temp.empty()) {
3954d6c458bSopenharmony_ci            napi_get_null(env, &result);
3964d6c458bSopenharmony_ci            return result;
3974d6c458bSopenharmony_ci        }
3984d6c458bSopenharmony_ci        size_t tempLen = temp.size();
3994d6c458bSopenharmony_ci        NAPI_CALL(env, napi_create_string_utf8(env, temp.c_str(), tempLen, &result));
4004d6c458bSopenharmony_ci        return result;
4014d6c458bSopenharmony_ci    }
4024d6c458bSopenharmony_ci
4034d6c458bSopenharmony_ci    napi_value UriInit(napi_env env, napi_value exports)
4044d6c458bSopenharmony_ci    {
4054d6c458bSopenharmony_ci        const char *uriClassName = "uri";
4064d6c458bSopenharmony_ci        napi_value uriClass = nullptr;
4074d6c458bSopenharmony_ci        napi_property_descriptor uriDesc[] = {
4084d6c458bSopenharmony_ci            DECLARE_NAPI_FUNCTION("normalize", Normalize),
4094d6c458bSopenharmony_ci            DECLARE_NAPI_FUNCTION("equals", Equals),
4104d6c458bSopenharmony_ci            DECLARE_NAPI_FUNCTION("checkIsAbsolute", IsAbsolute),
4114d6c458bSopenharmony_ci            DECLARE_NAPI_FUNCTION("toString", UriToString),
4124d6c458bSopenharmony_ci            DECLARE_NAPI_FUNCTION("checkIsRelative", IsRelative),
4134d6c458bSopenharmony_ci            DECLARE_NAPI_FUNCTION("checkIsOpaque", IsOpaque),
4144d6c458bSopenharmony_ci            DECLARE_NAPI_FUNCTION("checkIsHierarchical", IsHierarchical),
4154d6c458bSopenharmony_ci            DECLARE_NAPI_FUNCTION("addQueryValue", AddQueryValue),
4164d6c458bSopenharmony_ci            DECLARE_NAPI_FUNCTION("getSegment", GetSegment),
4174d6c458bSopenharmony_ci            DECLARE_NAPI_FUNCTION("addSegment", AddSegment),
4184d6c458bSopenharmony_ci            DECLARE_NAPI_FUNCTION("clearQuery", ClearQuery),
4194d6c458bSopenharmony_ci            DECLARE_NAPI_GETTER("scheme", GetScheme),
4204d6c458bSopenharmony_ci            DECLARE_NAPI_GETTER("authority", GetAuthority),
4214d6c458bSopenharmony_ci            DECLARE_NAPI_GETTER("ssp", GetSsp),
4224d6c458bSopenharmony_ci            DECLARE_NAPI_GETTER("userInfo", GetUserinfo),
4234d6c458bSopenharmony_ci            DECLARE_NAPI_GETTER("host", GetHost),
4244d6c458bSopenharmony_ci            DECLARE_NAPI_GETTER("port", GetPort),
4254d6c458bSopenharmony_ci            DECLARE_NAPI_GETTER("path", GetPath),
4264d6c458bSopenharmony_ci            DECLARE_NAPI_GETTER("query", GetQuery),
4274d6c458bSopenharmony_ci            DECLARE_NAPI_GETTER("fragment", GetFragment),
4284d6c458bSopenharmony_ci            DECLARE_NAPI_GETTER("isFailed", IsFailed),
4294d6c458bSopenharmony_ci        };
4304d6c458bSopenharmony_ci        NAPI_CALL(env, napi_define_class(env, uriClassName, strlen(uriClassName), UriConstructor,
4314d6c458bSopenharmony_ci                                         nullptr, sizeof(uriDesc) / sizeof(uriDesc[0]), uriDesc, &uriClass));
4324d6c458bSopenharmony_ci        napi_property_descriptor desc[] = {
4334d6c458bSopenharmony_ci            DECLARE_NAPI_PROPERTY("Uri", uriClass)
4344d6c458bSopenharmony_ci        };
4354d6c458bSopenharmony_ci        napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
4364d6c458bSopenharmony_ci        return exports;
4374d6c458bSopenharmony_ci    }
4384d6c458bSopenharmony_ci
4394d6c458bSopenharmony_ci    extern "C"
4404d6c458bSopenharmony_ci    __attribute__((visibility("default"))) void NAPI_uri_GetJSCode(const char **buf, int *bufLen)
4414d6c458bSopenharmony_ci    {
4424d6c458bSopenharmony_ci        if (buf != nullptr) {
4434d6c458bSopenharmony_ci            *buf = _binary_js_uri_js_start;
4444d6c458bSopenharmony_ci        }
4454d6c458bSopenharmony_ci        if (bufLen != nullptr) {
4464d6c458bSopenharmony_ci            *bufLen = _binary_js_uri_js_end - _binary_js_uri_js_start;
4474d6c458bSopenharmony_ci        }
4484d6c458bSopenharmony_ci    }
4494d6c458bSopenharmony_ci    extern "C"
4504d6c458bSopenharmony_ci    __attribute__((visibility("default"))) void NAPI_uri_GetABCCode(const char** buf, int* buflen)
4514d6c458bSopenharmony_ci    {
4524d6c458bSopenharmony_ci        if (buf != nullptr) {
4534d6c458bSopenharmony_ci            *buf = _binary_uri_abc_start;
4544d6c458bSopenharmony_ci        }
4554d6c458bSopenharmony_ci        if (buflen != nullptr) {
4564d6c458bSopenharmony_ci            *buflen = _binary_uri_abc_end - _binary_uri_abc_start;
4574d6c458bSopenharmony_ci        }
4584d6c458bSopenharmony_ci    }
4594d6c458bSopenharmony_ci
4604d6c458bSopenharmony_ci    static napi_module_with_js UriModule = {
4614d6c458bSopenharmony_ci        .nm_version = 1,
4624d6c458bSopenharmony_ci        .nm_flags = 0,
4634d6c458bSopenharmony_ci        .nm_filename = nullptr,
4644d6c458bSopenharmony_ci        .nm_register_func = UriInit,
4654d6c458bSopenharmony_ci        .nm_modname = "uri",
4664d6c458bSopenharmony_ci        .nm_priv = reinterpret_cast<void*>(0),
4674d6c458bSopenharmony_ci        .nm_get_abc_code = NAPI_uri_GetABCCode,
4684d6c458bSopenharmony_ci        .nm_get_js_code = NAPI_uri_GetJSCode,
4694d6c458bSopenharmony_ci    };
4704d6c458bSopenharmony_ci    extern "C" __attribute__((constructor)) void UriRegisterModule()
4714d6c458bSopenharmony_ci    {
4724d6c458bSopenharmony_ci        napi_module_with_js_register(&UriModule);
4734d6c458bSopenharmony_ci    }
4744d6c458bSopenharmony_ci} // namespace OHOS::Uri
475