1/*
2 * Copyright (c) 2024 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 "systemcapability.h"
16#include "syscap_ts.h"
17#include "beget_ext.h"
18
19#ifdef NAPI_ENABLE
20
21static constexpr int SYSCAP_MAX_SIZE = 100;
22
23void BindNativeFunction(napi_env env, napi_value object, const char *name,
24                        const char *moduleName, napi_callback func)
25{
26    std::string fullName(moduleName);
27    fullName += ".";
28    fullName += name;
29    napi_value result = nullptr;
30    napi_create_function(env, fullName.c_str(), fullName.length(), func, nullptr, &result);
31    napi_set_named_property(env, object, name, result);
32}
33
34inline napi_value CreateJsUndefined(napi_env env)
35{
36    napi_value result = nullptr;
37    napi_get_undefined(env, &result);
38    return result;
39}
40
41inline napi_value CreateJsValue(napi_env env, const bool &value)
42{
43    napi_value result;
44    napi_get_boolean(env, value, &result);
45    return result;
46}
47
48
49napi_value CanIUse(napi_env env, napi_callback_info info)
50{
51    if (env == nullptr || info == nullptr) {
52        BEGET_LOGE("get syscap failed since env or callback info is nullptr.");
53        return nullptr;
54    }
55    napi_value undefined = CreateJsUndefined(env);
56
57    size_t argc = 1;
58    napi_value argv[1] = {nullptr};
59    napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
60    if (argc != 1) {
61        BEGET_LOGE("get syscap failed with invalid parameter");
62        return undefined;
63    }
64
65    napi_valuetype valueType = napi_undefined;
66    napi_typeof(env, argv[0], &valueType);
67    if (valueType != napi_string) {
68        BEGET_LOGE("%{public}s called, Params is invalid.", __func__);
69        return undefined;
70    }
71
72    char syscap[SYSCAP_MAX_SIZE] = {0};
73
74    size_t strLen = 0;
75    napi_get_value_string_utf8(env, argv[0], syscap, sizeof(syscap), &strLen);
76
77    bool ret = HasSystemCapability(syscap);
78    return CreateJsValue(env, ret);
79}
80
81#endif
82
83void InitSyscapModule(napi_env env)
84{
85    #ifdef NAPI_ENABLE
86    napi_value globalObject = nullptr;
87    napi_get_global(env, &globalObject);
88    const char *moduleName = "JsRuntime";
89    BindNativeFunction(env, globalObject, "canIUse", moduleName, CanIUse);
90    #endif
91}