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 "location_manager_addon.h"
17
18 #include "edm_constants.h"
19 #include "edm_log.h"
20
21 using namespace OHOS::EDM;
22
Init(napi_env env,napi_value exports)23 napi_value LocationManagerAddon::Init(napi_env env, napi_value exports)
24 {
25 napi_value nLocationPolicy = nullptr;
26 NAPI_CALL(env, napi_create_object(env, &nLocationPolicy));
27 CreateLocationPolicyObject(env, nLocationPolicy);
28
29 napi_property_descriptor property[] = {
30 DECLARE_NAPI_FUNCTION("setLocationPolicy", SetLocationPolicy),
31 DECLARE_NAPI_FUNCTION("getLocationPolicy", GetLocationPolicy),
32 DECLARE_NAPI_PROPERTY("LocationPolicy", nLocationPolicy),
33 };
34 NAPI_CALL(env, napi_define_properties(env, exports, sizeof(property) / sizeof(property[0]), property));
35 return exports;
36 }
37
SetLocationPolicy(napi_env env,napi_callback_info info)38 napi_value LocationManagerAddon::SetLocationPolicy(napi_env env, napi_callback_info info)
39 {
40 EDMLOGI("NAPI_SetLocationPolicy called");
41 size_t argc = ARGS_SIZE_TWO;
42 napi_value argv[ARGS_SIZE_TWO] = {nullptr};
43 napi_value thisArg = nullptr;
44 void *data = nullptr;
45 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisArg, &data));
46 ASSERT_AND_THROW_PARAM_ERROR(env, argc >= ARGS_SIZE_TWO, "parameter count error");
47 ASSERT_AND_THROW_PARAM_ERROR(env, MatchValueType(env, argv[ARR_INDEX_ZERO], napi_object), "parameter admin error");
48 ASSERT_AND_THROW_PARAM_ERROR(env, MatchValueType(env, argv[ARR_INDEX_ONE], napi_number), "parameter type error");
49 auto asyncCallbackInfo = new (std::nothrow) AsyncLocationPolicyInfo();
50 if (asyncCallbackInfo == nullptr) {
51 return nullptr;
52 }
53 std::unique_ptr<AsyncLocationPolicyInfo> callbackPtr{asyncCallbackInfo};
54 ASSERT_AND_THROW_PARAM_ERROR(env, ParseElementName(env, asyncCallbackInfo->elementName, argv[ARR_INDEX_ZERO]),
55 "element name param error");
56 EDMLOGD(
57 "SetLocationPolicy: asyncCallbackInfo->elementName.bundlename %{public}s, "
58 "asyncCallbackInfo->elementName.abilityname:%{public}s",
59 asyncCallbackInfo->elementName.GetBundleName().c_str(),
60 asyncCallbackInfo->elementName.GetAbilityName().c_str());
61 int32_t policyInt;
62 ASSERT_AND_THROW_PARAM_ERROR(env, ParseInt(env, policyInt, argv[ARR_INDEX_ONE]), "element name param error");
63 ASSERT_AND_THROW_PARAM_ERROR(env, IntToLocationPolicy(env, asyncCallbackInfo->locationPolicy, policyInt),
64 "element name param error");
65 EDMLOGD("SetLocationPolicy locationPolicy = %{public}d", asyncCallbackInfo->locationPolicy);
66 asyncCallbackInfo->ret = LocationManagerProxy::GetLocationManagerProxy()->SetLocationPolicy(
67 asyncCallbackInfo->elementName, asyncCallbackInfo->locationPolicy);
68 if (FAILED(asyncCallbackInfo->ret)) {
69 napi_throw(env, CreateError(env, asyncCallbackInfo->ret));
70 EDMLOGE("SetLocationPolicy failed!");
71 }
72 return nullptr;
73 }
74
GetLocationPolicy(napi_env env,napi_callback_info info)75 napi_value LocationManagerAddon::GetLocationPolicy(napi_env env, napi_callback_info info)
76 {
77 {
78 EDMLOGI("NAPI_GetLocationPolicy called");
79 size_t argc = ARGS_SIZE_ONE;
80 napi_value argv[ARGS_SIZE_ONE] = {nullptr};
81 napi_value thisArg = nullptr;
82 void *data = nullptr;
83
84 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisArg, &data));
85 ASSERT_AND_THROW_PARAM_ERROR(env, argc >= ARGS_SIZE_ONE, "parameter count error");
86 bool hasAdmin = false;
87 OHOS::AppExecFwk::ElementName elementName;
88 ASSERT_AND_THROW_PARAM_ERROR(env, CheckGetPolicyAdminParam(env, argv[ARR_INDEX_ZERO], hasAdmin, elementName),
89 "param admin need be null or want");
90 LocationPolicy res = LocationPolicy::DEFAULT_LOCATION_SERVICE;;
91 auto locationManagerProxy = LocationManagerProxy::GetLocationManagerProxy();
92 int32_t ret = ERR_OK;
93 if (hasAdmin) {
94 ret = locationManagerProxy->GetLocationPolicy(&elementName, res);
95 } else {
96 ret = locationManagerProxy->GetLocationPolicy(nullptr, res);
97 }
98 if (FAILED(ret)) {
99 napi_throw(env, CreateError(env, ret));
100 return nullptr;
101 }
102 napi_value locationPolicy;
103 napi_create_int32(env, static_cast<int32_t>(res), &locationPolicy);
104 return locationPolicy;
105 }
106 }
107
IntToLocationPolicy(napi_env env,LocationPolicy & param,int32_t policy)108 bool LocationManagerAddon::IntToLocationPolicy(napi_env env, LocationPolicy ¶m, int32_t policy)
109 {
110 if (policy >= static_cast<int32_t>(LocationPolicy::DEFAULT_LOCATION_SERVICE) &&
111 policy <= static_cast<int32_t>(LocationPolicy::FORCE_OPEN_LOCATION_SERVICE)) {
112 param = LocationPolicy(policy);
113 return true;
114 }
115 return false;
116 }
117
CreateLocationPolicyObject(napi_env env,napi_value value)118 void LocationManagerAddon::CreateLocationPolicyObject(napi_env env, napi_value value)
119 {
120 napi_value nDisallowedLocation;
121 NAPI_CALL_RETURN_VOID(env, napi_create_uint32(env,
122 static_cast<uint32_t>(LocationPolicy::DISALLOW_LOCATION_SERVICE), &nDisallowedLocation));
123 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "DISALLOW_LOCATION_SERVICE", nDisallowedLocation));
124 napi_value nForceOpenLocation;
125 NAPI_CALL_RETURN_VOID(env, napi_create_uint32(env,
126 static_cast<uint32_t>(LocationPolicy::FORCE_OPEN_LOCATION_SERVICE), &nForceOpenLocation));
127 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "FORCE_OPEN_LOCATION_SERVICE", nForceOpenLocation));
128 napi_value nDefaultLocation;
129 NAPI_CALL_RETURN_VOID(env,
130 napi_create_uint32(env, static_cast<uint32_t>(LocationPolicy::DEFAULT_LOCATION_SERVICE), &nDefaultLocation));
131 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "DEFAULT_LOCATION_SERVICE", nDefaultLocation));
132 }
133
134 static napi_module g_locationModule = {
135 .nm_version = 1,
136 .nm_flags = 0,
137 .nm_filename = nullptr,
138 .nm_register_func = LocationManagerAddon::Init,
139 .nm_modname = "enterprise.locationManager",
140 .nm_priv = ((void *)0),
141 .reserved = {0},
142 };
143
LocationManagerRegister()144 extern "C" __attribute__((constructor)) void LocationManagerRegister()
145 {
146 napi_module_register(&g_locationModule);
147 }
148