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 &param, 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