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_log.h"
19 #include "napi_edm_adapter.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 auto convertLocationPolicy2Data = [](napi_env env, napi_value argv, MessageParcel &data,
42 const AddonMethodSign &methodSign) {
43 int32_t policyInt;
44 bool isUnit = ParseInt(env, policyInt, argv);
45 if (!isUnit) {
46 return false;
47 }
48 if (policyInt >= static_cast<int32_t>(LocationPolicy::DEFAULT_LOCATION_SERVICE) &&
49 policyInt <= static_cast<int32_t>(LocationPolicy::FORCE_OPEN_LOCATION_SERVICE)) {
50 data.WriteInt32(policyInt);
51 return true;
52 }
53 return false;
54 };
55 AddonMethodSign addonMethodSign;
56 addonMethodSign.name = "SetLocationPolicy";
57 addonMethodSign.argsType = {EdmAddonCommonType::ELEMENT, EdmAddonCommonType::INT32};
58 addonMethodSign.methodAttribute = MethodAttribute::HANDLE;
59 addonMethodSign.argsConvert = {nullptr, convertLocationPolicy2Data};
60 AdapterAddonData adapterAddonData{};
61 napi_value result = JsObjectToData(env, info, addonMethodSign, &adapterAddonData);
62 if (result == nullptr) {
63 return nullptr;
64 }
65
66 int32_t ret = LocationManagerProxy::GetLocationManagerProxy()->SetLocationPolicy(
67 adapterAddonData.data);
68 if (FAILED(ret)) {
69 napi_throw(env, CreateError(env, 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 EDMLOGI("NAPI_GetLocationPolicy called");
78 size_t argc = ARGS_SIZE_ONE;
79 napi_value argv[ARGS_SIZE_ONE] = {nullptr};
80 napi_value thisArg = nullptr;
81 void *data = nullptr;
82
83 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisArg, &data));
84 ASSERT_AND_THROW_PARAM_ERROR(env, argc >= ARGS_SIZE_ONE, "parameter count error");
85 bool hasAdmin = false;
86 OHOS::AppExecFwk::ElementName elementName;
87 ASSERT_AND_THROW_PARAM_ERROR(env, CheckGetPolicyAdminParam(env, argv[ARR_INDEX_ZERO], hasAdmin, elementName),
88 "param admin need be null or want");
89 LocationPolicy res = LocationPolicy::DEFAULT_LOCATION_SERVICE;
90 auto locationManagerProxy = LocationManagerProxy::GetLocationManagerProxy();
91 int32_t ret = ERR_OK;
92 if (hasAdmin) {
93 ret = locationManagerProxy->GetLocationPolicy(&elementName, res);
94 } else {
95 ret = locationManagerProxy->GetLocationPolicy(nullptr, res);
96 }
97 if (FAILED(ret)) {
98 napi_throw(env, CreateError(env, ret));
99 return nullptr;
100 }
101 napi_value locationPolicy;
102 NAPI_CALL(env, napi_create_int32(env, static_cast<int32_t>(res), &locationPolicy));
103 return locationPolicy;
104 }
105
CreateLocationPolicyObject(napi_env env,napi_value value)106 void LocationManagerAddon::CreateLocationPolicyObject(napi_env env, napi_value value)
107 {
108 napi_value nDisallowedLocation;
109 NAPI_CALL_RETURN_VOID(env, napi_create_uint32(env,
110 static_cast<uint32_t>(LocationPolicy::DISALLOW_LOCATION_SERVICE), &nDisallowedLocation));
111 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "DISALLOW_LOCATION_SERVICE", nDisallowedLocation));
112 napi_value nForceOpenLocation;
113 NAPI_CALL_RETURN_VOID(env, napi_create_uint32(env,
114 static_cast<uint32_t>(LocationPolicy::FORCE_OPEN_LOCATION_SERVICE), &nForceOpenLocation));
115 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "FORCE_OPEN_LOCATION_SERVICE", nForceOpenLocation));
116 napi_value nDefaultLocation;
117 NAPI_CALL_RETURN_VOID(env,
118 napi_create_uint32(env, static_cast<uint32_t>(LocationPolicy::DEFAULT_LOCATION_SERVICE), &nDefaultLocation));
119 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "DEFAULT_LOCATION_SERVICE", nDefaultLocation));
120 }
121
122 static napi_module g_locationModule = {
123 .nm_version = 1,
124 .nm_flags = 0,
125 .nm_filename = nullptr,
126 .nm_register_func = LocationManagerAddon::Init,
127 .nm_modname = "enterprise.locationManager",
128 .nm_priv = ((void *)0),
129 .reserved = {0},
130 };
131
LocationManagerRegister()132 extern "C" __attribute__((constructor)) void LocationManagerRegister()
133 {
134 napi_module_register(&g_locationModule);
135 }
136