1c8a96e64Sopenharmony_ci/*
2c8a96e64Sopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd.
3c8a96e64Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4c8a96e64Sopenharmony_ci * you may not use this file except in compliance with the License.
5c8a96e64Sopenharmony_ci * You may obtain a copy of the License at
6c8a96e64Sopenharmony_ci *
7c8a96e64Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8c8a96e64Sopenharmony_ci *
9c8a96e64Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10c8a96e64Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11c8a96e64Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12c8a96e64Sopenharmony_ci * See the License for the specific language governing permissions and
13c8a96e64Sopenharmony_ci * limitations under the License.
14c8a96e64Sopenharmony_ci */
15c8a96e64Sopenharmony_ci
16c8a96e64Sopenharmony_ci#include <memory>
17c8a96e64Sopenharmony_ci
18c8a96e64Sopenharmony_ci#include "napi/native_node_api.h"
19c8a96e64Sopenharmony_ci#include "api_policy_adapter.h"
20c8a96e64Sopenharmony_ci
21c8a96e64Sopenharmony_ciusing namespace std;
22c8a96e64Sopenharmony_ci
23c8a96e64Sopenharmony_ciextern const char _binary_atomicserviceweb_abc_start[];
24c8a96e64Sopenharmony_ciextern const char _binary_atomicserviceweb_abc_end[];
25c8a96e64Sopenharmony_ci
26c8a96e64Sopenharmony_cinamespace HMS::AtomicServiceWeb {
27c8a96e64Sopenharmony_ci    static napi_value CheckUrl(napi_env env, napi_callback_info info)
28c8a96e64Sopenharmony_ci    {
29c8a96e64Sopenharmony_ci        const int indexTwo = 2;
30c8a96e64Sopenharmony_ci        size_t requireArgc = 3;
31c8a96e64Sopenharmony_ci        size_t argc = 3;
32c8a96e64Sopenharmony_ci        napi_value args[3] = { nullptr };
33c8a96e64Sopenharmony_ci        NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, nullptr, nullptr));
34c8a96e64Sopenharmony_ci
35c8a96e64Sopenharmony_ci        NAPI_ASSERT(env, argc >= requireArgc, "Wrong number of arguments");
36c8a96e64Sopenharmony_ci
37c8a96e64Sopenharmony_ci        napi_valuetype bundleNameType;
38c8a96e64Sopenharmony_ci        NAPI_CALL(env, napi_typeof(env, args[0], &bundleNameType));
39c8a96e64Sopenharmony_ci
40c8a96e64Sopenharmony_ci        napi_valuetype domainTypeType;
41c8a96e64Sopenharmony_ci        NAPI_CALL(env, napi_typeof(env, args[1], &domainTypeType));
42c8a96e64Sopenharmony_ci
43c8a96e64Sopenharmony_ci        napi_valuetype urlType;
44c8a96e64Sopenharmony_ci        NAPI_CALL(env, napi_typeof(env, args[indexTwo], &urlType));
45c8a96e64Sopenharmony_ci
46c8a96e64Sopenharmony_ci        NAPI_ASSERT(env, bundleNameType == napi_string && domainTypeType == napi_string && urlType == napi_string,
47c8a96e64Sopenharmony_ci            "Wrong argument type. String expected.");
48c8a96e64Sopenharmony_ci
49c8a96e64Sopenharmony_ci        size_t maxValueLen = 1024;
50c8a96e64Sopenharmony_ci        char bundleNameValue[maxValueLen];
51c8a96e64Sopenharmony_ci        size_t bundleNameLength = 0;
52c8a96e64Sopenharmony_ci        napi_get_value_string_utf8(env, args[0], bundleNameValue, maxValueLen, &bundleNameLength);
53c8a96e64Sopenharmony_ci        std::string bundleName = bundleNameValue;
54c8a96e64Sopenharmony_ci
55c8a96e64Sopenharmony_ci        char domainTypeValue[maxValueLen];
56c8a96e64Sopenharmony_ci        size_t domainTypeLength = 0;
57c8a96e64Sopenharmony_ci        napi_get_value_string_utf8(env, args[1], domainTypeValue, maxValueLen, &domainTypeLength);
58c8a96e64Sopenharmony_ci        std::string domainType = domainTypeValue;
59c8a96e64Sopenharmony_ci
60c8a96e64Sopenharmony_ci        char urlValue[maxValueLen];
61c8a96e64Sopenharmony_ci        size_t urlLength = 0;
62c8a96e64Sopenharmony_ci        napi_get_value_string_utf8(env, args[indexTwo], urlValue, maxValueLen, &urlLength);
63c8a96e64Sopenharmony_ci        std::string url = urlValue;
64c8a96e64Sopenharmony_ci
65c8a96e64Sopenharmony_ci        std::shared_ptr<ApiPolicyAdapter> apiPolicyAdapter = std::make_shared<ApiPolicyAdapter>();
66c8a96e64Sopenharmony_ci        int32_t res = apiPolicyAdapter->CheckUrl(bundleName, domainType, url);
67c8a96e64Sopenharmony_ci
68c8a96e64Sopenharmony_ci        napi_value result;
69c8a96e64Sopenharmony_ci        NAPI_CALL(env, napi_create_double(env, res, &result));
70c8a96e64Sopenharmony_ci        return result;
71c8a96e64Sopenharmony_ci    }
72c8a96e64Sopenharmony_ci
73c8a96e64Sopenharmony_ci    static napi_value Init(napi_env env, napi_value exports)
74c8a96e64Sopenharmony_ci    {
75c8a96e64Sopenharmony_ci        napi_property_descriptor desc[] = {
76c8a96e64Sopenharmony_ci            DECLARE_NAPI_FUNCTION("checkUrl", CheckUrl),
77c8a96e64Sopenharmony_ci        };
78c8a96e64Sopenharmony_ci        NAPI_CALL(env, napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc));
79c8a96e64Sopenharmony_ci        return exports;
80c8a96e64Sopenharmony_ci    }
81c8a96e64Sopenharmony_ci
82c8a96e64Sopenharmony_ci    // Napi get abc code function
83c8a96e64Sopenharmony_ci    extern "C" __attribute__((visibility("default")))
84c8a96e64Sopenharmony_ci    void NAPI_atomicservice_AtomicServiceWeb_GetABCCode(const char **buf, int *buflen)
85c8a96e64Sopenharmony_ci    {
86c8a96e64Sopenharmony_ci        if (buf != nullptr) {
87c8a96e64Sopenharmony_ci            *buf = _binary_atomicserviceweb_abc_start;
88c8a96e64Sopenharmony_ci        }
89c8a96e64Sopenharmony_ci        if (buflen != nullptr) {
90c8a96e64Sopenharmony_ci            *buflen = _binary_atomicserviceweb_abc_end - _binary_atomicserviceweb_abc_start;
91c8a96e64Sopenharmony_ci        }
92c8a96e64Sopenharmony_ci    }
93c8a96e64Sopenharmony_ci
94c8a96e64Sopenharmony_ci    /*
95c8a96e64Sopenharmony_ci     * Module define
96c8a96e64Sopenharmony_ci     */
97c8a96e64Sopenharmony_ci    static napi_module AtomicServiceWebModule = {
98c8a96e64Sopenharmony_ci        .nm_version = 1,
99c8a96e64Sopenharmony_ci        .nm_flags = 0,
100c8a96e64Sopenharmony_ci        .nm_filename = nullptr,
101c8a96e64Sopenharmony_ci        .nm_register_func = Init,
102c8a96e64Sopenharmony_ci        .nm_modname = "atomicservice.AtomicServiceWeb",
103c8a96e64Sopenharmony_ci        .nm_priv = ((void*)0),
104c8a96e64Sopenharmony_ci        .reserved = { 0 },
105c8a96e64Sopenharmony_ci    };
106c8a96e64Sopenharmony_ci
107c8a96e64Sopenharmony_ci    /*
108c8a96e64Sopenharmony_ci     * Module registerfunction
109c8a96e64Sopenharmony_ci     */
110c8a96e64Sopenharmony_ci    extern "C" __attribute__((constructor)) void AtomicServiceWebRegisterModule(void)
111c8a96e64Sopenharmony_ci    {
112c8a96e64Sopenharmony_ci        napi_module_register(&AtomicServiceWebModule);
113c8a96e64Sopenharmony_ci    }
114c8a96e64Sopenharmony_ci}
115