• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023 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 "browser_addon.h"
17 
18 #include "browser_proxy.h"
19 #include "edm_constants.h"
20 #include "edm_log.h"
21 
22 using namespace OHOS::EDM;
23 
Init(napi_env env,napi_value exports)24 napi_value BrowserAddon::Init(napi_env env, napi_value exports)
25 {
26     napi_property_descriptor property[] = {
27         DECLARE_NAPI_FUNCTION("setPolicies", SetPolicies),
28         DECLARE_NAPI_FUNCTION("getPolicies", GetPolicies),
29     };
30     NAPI_CALL(env, napi_define_properties(env, exports, sizeof(property) / sizeof(property[0]), property));
31     return exports;
32 }
33 
SetPolicies(napi_env env,napi_callback_info info)34 napi_value BrowserAddon::SetPolicies(napi_env env, napi_callback_info info)
35 {
36     EDMLOGI("NAPI_SetPolicies called");
37     size_t argc = ARGS_SIZE_FOUR;
38     napi_value argv[ARGS_SIZE_FOUR] = {nullptr};
39     napi_value thisArg = nullptr;
40     void *data = nullptr;
41     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisArg, &data));
42     ASSERT_AND_THROW_PARAM_ERROR(env, argc >= ARGS_SIZE_THREE, "Parameter count error");
43     bool matchFlag = MatchValueType(env, argv[ARR_INDEX_ZERO], napi_object) &&
44         MatchValueType(env, argv[ARR_INDEX_ONE], napi_string) && MatchValueType(env, argv[ARR_INDEX_TWO], napi_string);
45     if (argc > ARGS_SIZE_THREE) {
46         matchFlag = matchFlag && MatchValueType(env, argv[ARGS_SIZE_THREE], napi_function);
47     }
48     ASSERT_AND_THROW_PARAM_ERROR(env, matchFlag, "parameter type error");
49     auto asyncCallbackInfo = new (std::nothrow) AsyncBrowserCallbackInfo();
50     if (asyncCallbackInfo == nullptr) {
51         return nullptr;
52     }
53     std::unique_ptr<AsyncBrowserCallbackInfo> callbackPtr{asyncCallbackInfo};
54     ASSERT_AND_THROW_PARAM_ERROR(env, ParseElementName(env, asyncCallbackInfo->elementName, argv[ARR_INDEX_ZERO]),
55         "Parameter want error");
56     ASSERT_AND_THROW_PARAM_ERROR(env, ParseString(env, asyncCallbackInfo->appId, argv[ARR_INDEX_ONE]),
57         "Parameter policies error");
58     ASSERT_AND_THROW_PARAM_ERROR(env, ParseString(env, asyncCallbackInfo->policies, argv[ARR_INDEX_TWO]),
59         "Parameter policies error");
60     EDMLOGD(
61         "EnableAdmin::asyncCallbackInfo->elementName.bundlename %{public}s, "
62         "asyncCallbackInfo->abilityname:%{public}s",
63         asyncCallbackInfo->elementName.GetBundleName().c_str(),
64         asyncCallbackInfo->elementName.GetAbilityName().c_str());
65     if (argc > ARGS_SIZE_THREE) {
66         napi_create_reference(env, argv[ARGS_SIZE_THREE], NAPI_RETURN_ONE, &asyncCallbackInfo->callback);
67     }
68     napi_value asyncWorkReturn =
69         HandleAsyncWork(env, asyncCallbackInfo, "setPolicies", NativeSetPolicies, NativeVoidCallbackComplete);
70     callbackPtr.release();
71     return asyncWorkReturn;
72 }
73 
NativeSetPolicies(napi_env env,void * data)74 void BrowserAddon::NativeSetPolicies(napi_env env, void *data)
75 {
76     EDMLOGI("NAPI_NativeSetPolicies called");
77     if (data == nullptr) {
78         EDMLOGE("data is nullptr");
79         return;
80     }
81     AsyncBrowserCallbackInfo *asyncCallbackInfo = static_cast<AsyncBrowserCallbackInfo *>(data);
82     asyncCallbackInfo->ret = BrowserProxy::GetBrowserProxy()->SetPolicies(asyncCallbackInfo->elementName,
83         asyncCallbackInfo->appId, asyncCallbackInfo->policies);
84 }
85 
GetPolicies(napi_env env,napi_callback_info info)86 napi_value BrowserAddon::GetPolicies(napi_env env, napi_callback_info info)
87 {
88     size_t argc = ARGS_SIZE_THREE;
89     napi_value argv[ARGS_SIZE_THREE] = {nullptr};
90     napi_value thisArg = nullptr;
91     void *data = nullptr;
92     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisArg, &data));
93     ASSERT_AND_THROW_PARAM_ERROR(env, argc >= ARGS_SIZE_TWO, "Parameter count error");
94     ASSERT_AND_THROW_PARAM_ERROR(env, MatchValueType(env, argv[ARR_INDEX_ZERO], napi_object), "admin type error");
95     ASSERT_AND_THROW_PARAM_ERROR(env, MatchValueType(env, argv[ARR_INDEX_ONE], napi_string), "appId type error");
96     if (argc > ARGS_SIZE_TWO) {
97         ASSERT_AND_THROW_PARAM_ERROR(env, MatchValueType(env, argv[ARR_INDEX_TWO], napi_function),
98             "callback type error");
99     }
100 
101     auto asyncCallbackInfo = new (std::nothrow) AsyncBrowserCallbackInfo();
102     if (asyncCallbackInfo == nullptr) {
103         return nullptr;
104     }
105     std::unique_ptr<AsyncBrowserCallbackInfo> callbackPtr{asyncCallbackInfo};
106     ASSERT_AND_THROW_PARAM_ERROR(env, ParseElementName(env, asyncCallbackInfo->elementName, argv[ARR_INDEX_ZERO]),
107         "Parameter want error");
108     ASSERT_AND_THROW_PARAM_ERROR(env, ParseString(env, asyncCallbackInfo->appId, argv[ARR_INDEX_ONE]),
109         "Parameter appId error");
110     EDMLOGD(
111         "EnableAdmin::asyncCallbackInfo->elementName.bundlename %{public}s, "
112         "asyncCallbackInfo->abilityname:%{public}s",
113         asyncCallbackInfo->elementName.GetBundleName().c_str(),
114         asyncCallbackInfo->elementName.GetAbilityName().c_str());
115     if (argc > ARGS_SIZE_TWO) {
116         napi_create_reference(env, argv[ARGS_SIZE_TWO], NAPI_RETURN_ONE, &asyncCallbackInfo->callback);
117     }
118     napi_value asyncWorkReturn =
119         HandleAsyncWork(env, asyncCallbackInfo, "getPolicies", NativeGetPolicies, NativeStringCallbackComplete);
120     callbackPtr.release();
121     return asyncWorkReturn;
122 }
123 
NativeGetPolicies(napi_env env,void * data)124 void BrowserAddon::NativeGetPolicies(napi_env env, void *data)
125 {
126     EDMLOGI("NativeGetPolicies called");
127     if (data == nullptr) {
128         EDMLOGE("data is nullptr");
129         return;
130     }
131     AsyncBrowserCallbackInfo *asyncCallbackInfo = static_cast<AsyncBrowserCallbackInfo *>(data);
132     asyncCallbackInfo->ret = BrowserProxy::GetBrowserProxy()->GetPolicies(asyncCallbackInfo->elementName,
133         asyncCallbackInfo->appId, asyncCallbackInfo->stringRet);
134 }
135 
136 static napi_module g_browserModule = {
137     .nm_version = 1,
138     .nm_flags = 0,
139     .nm_filename = nullptr,
140     .nm_register_func = BrowserAddon::Init,
141     .nm_modname = "enterprise.browser",
142     .nm_priv = ((void *)0),
143     .reserved = {0},
144 };
145 
BrowserRegister()146 extern "C" __attribute__((constructor)) void BrowserRegister()
147 {
148     napi_module_register(&g_browserModule);
149 }