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 }