• 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 "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