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 #include "device_settings_addon.h"
16
17 #include "cJSON.h"
18 #include "cjson_check.h"
19 #include "datetime_manager_proxy.h"
20 #include "edm_constants.h"
21 #include "edm_log.h"
22 #include "napi_edm_adapter.h"
23
24 using namespace OHOS::EDM;
25
CreatePowerSceneObject(napi_env env,napi_value value)26 void DeviceSettingsAddon::CreatePowerSceneObject(napi_env env, napi_value value)
27 {
28 napi_value nTimeOut;
29 NAPI_CALL_RETURN_VOID(env, napi_create_uint32(env, static_cast<uint32_t>(PowerScene::TIME_OUT), &nTimeOut));
30 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "TIME_OUT", nTimeOut));
31 }
32
CreatePowerPolicyActionObject(napi_env env,napi_value value)33 void DeviceSettingsAddon::CreatePowerPolicyActionObject(napi_env env, napi_value value)
34 {
35 napi_value nActionNone;
36 NAPI_CALL_RETURN_VOID(env,
37 napi_create_uint32(env, static_cast<uint32_t>(PowerPolicyAction::NONE), &nActionNone));
38 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "NONE", nActionNone));
39 napi_value nActionAutoSuspend;
40 NAPI_CALL_RETURN_VOID(env,
41 napi_create_uint32(env, static_cast<uint32_t>(PowerPolicyAction::AUTO_SUSPEND), &nActionAutoSuspend));
42 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "AUTO_SUSPEND", nActionAutoSuspend));
43 napi_value nActionForceSuspend;
44 NAPI_CALL_RETURN_VOID(env,
45 napi_create_uint32(env, static_cast<uint32_t>(PowerPolicyAction::FORCE_SUSPEND), &nActionForceSuspend));
46 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "FORCE_SUSPEND", nActionForceSuspend));
47 napi_value nActionHibernate;
48 NAPI_CALL_RETURN_VOID(env,
49 napi_create_uint32(env, static_cast<uint32_t>(PowerPolicyAction::HIBERNATE), &nActionHibernate));
50 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "HIBERNATE", nActionHibernate));
51 napi_value nActionShutDown;
52 NAPI_CALL_RETURN_VOID(env,
53 napi_create_uint32(env, static_cast<uint32_t>(PowerPolicyAction::SHUTDOWN), &nActionShutDown));
54 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SHUTDOWN", nActionShutDown));
55 }
56
Init(napi_env env,napi_value exports)57 napi_value DeviceSettingsAddon::Init(napi_env env, napi_value exports)
58 {
59 napi_value nTimeOut = nullptr;
60 NAPI_CALL(env, napi_create_object(env, &nTimeOut));
61 CreatePowerSceneObject(env, nTimeOut);
62 napi_value nPolicyAction = nullptr;
63 NAPI_CALL(env, napi_create_object(env, &nPolicyAction));
64 CreatePowerPolicyActionObject(env, nPolicyAction);
65
66 napi_property_descriptor property[] = {
67 DECLARE_NAPI_FUNCTION("setScreenOffTime", SetScreenOffTime),
68 DECLARE_NAPI_FUNCTION("getScreenOffTime", GetScreenOffTime),
69 DECLARE_NAPI_FUNCTION("setPowerPolicy", SetPowerPolicy),
70 DECLARE_NAPI_FUNCTION("getPowerPolicy", GetPowerPolicy),
71 DECLARE_NAPI_FUNCTION("installUserCertificate", InstallUserCertificate),
72 DECLARE_NAPI_FUNCTION("uninstallUserCertificate", UninstallUserCertificate),
73 DECLARE_NAPI_PROPERTY("PowerScene", nTimeOut),
74 DECLARE_NAPI_PROPERTY("PowerPolicyAction", nPolicyAction),
75 DECLARE_NAPI_FUNCTION("setValue", SetValue),
76 DECLARE_NAPI_FUNCTION("getValue", GetValue),
77 DECLARE_NAPI_FUNCTION("setHomeWallpaper", SetHomeWallPaper),
78 DECLARE_NAPI_FUNCTION("setUnlockWallpaper", SetUnlockWallPaper)
79 };
80 NAPI_CALL(env, napi_define_properties(env, exports, sizeof(property) / sizeof(property[0]), property));
81 return exports;
82 }
83
SetPowerPolicy(napi_env env,napi_callback_info info)84 napi_value DeviceSettingsAddon::SetPowerPolicy(napi_env env, napi_callback_info info)
85 {
86 EDMLOGI("NAPI_SetPowerPolicy called");
87 auto convertPowerScene2Data = [](napi_env env, napi_value argv, MessageParcel &data,
88 const AddonMethodSign &methodSign) {
89 PowerScene powerScene;
90 bool isUint = JsObjToPowerScene(env, argv, powerScene);
91 if (!isUint) {
92 return false;
93 }
94 data.WriteUint32(static_cast<uint32_t>(powerScene));
95 return true;
96 };
97 auto convertPowerPolicy2Data = [](napi_env env, napi_value argv, MessageParcel &data,
98 const AddonMethodSign &methodSign) {
99 PowerPolicy powerPolicy;
100 bool isUint = JsObjToPowerPolicy(env, argv, powerPolicy);
101 if (!isUint) {
102 return false;
103 }
104 if (!powerPolicy.Marshalling(data)) {
105 EDMLOGE("DeviceSettingsProxy::SetPowerPolicy Marshalling proxy fail.");
106 return false;
107 }
108 return true;
109 };
110 AddonMethodSign addonMethodSign;
111 addonMethodSign.name = "SetPowerPolicy";
112 addonMethodSign.argsType = {EdmAddonCommonType::ELEMENT, EdmAddonCommonType::CUSTOM, EdmAddonCommonType::CUSTOM};
113 addonMethodSign.argsConvert = {nullptr, convertPowerScene2Data, convertPowerPolicy2Data};
114 addonMethodSign.methodAttribute = MethodAttribute::HANDLE;
115 AdapterAddonData adapterAddonData{};
116 napi_value result = JsObjectToData(env, info, addonMethodSign, &adapterAddonData);
117 if (result == nullptr) {
118 return nullptr;
119 }
120 int32_t ret = DeviceSettingsProxy::GetDeviceSettingsProxy()->SetPowerPolicy(adapterAddonData.data);
121 if (FAILED(ret)) {
122 napi_throw(env, CreateError(env, ret));
123 EDMLOGE("SetPowerPolicy failed!");
124 }
125 return nullptr;
126 }
127
GetPowerPolicy(napi_env env,napi_callback_info info)128 napi_value DeviceSettingsAddon::GetPowerPolicy(napi_env env, napi_callback_info info)
129 {
130 EDMLOGI("NAPI_GetPowerPolicy called");
131 auto convertPowerScene2Data = [](napi_env env, napi_value argv, MessageParcel &data,
132 const AddonMethodSign &methodSign) {
133 PowerScene powerScene;
134 bool isUint = JsObjToPowerScene(env, argv, powerScene);
135 if (!isUint) {
136 return false;
137 }
138 data.WriteUint32(static_cast<uint32_t>(powerScene));
139 return true;
140 };
141 AddonMethodSign addonMethodSign;
142 addonMethodSign.name = "GetPowerPolicy";
143 addonMethodSign.argsType = {EdmAddonCommonType::ELEMENT, EdmAddonCommonType::CUSTOM};
144 addonMethodSign.argsConvert = {nullptr, convertPowerScene2Data};
145 addonMethodSign.methodAttribute = MethodAttribute::GET;
146 AdapterAddonData adapterAddonData{};
147 if (JsObjectToData(env, info, addonMethodSign, &adapterAddonData) == nullptr) {
148 return nullptr;
149 }
150 PowerPolicy powerPolicy;
151 int32_t ret = DeviceSettingsProxy::GetDeviceSettingsProxy()->GetPowerPolicy(adapterAddonData.data, powerPolicy);
152 if (FAILED(ret)) {
153 napi_throw(env, CreateError(env, ret));
154 EDMLOGE("SetPowerPolicy failed!");
155 return nullptr;
156 }
157 napi_value result = ConvertPolicyPolicyToJs(env, powerPolicy);
158 return result;
159 }
160
JsObjToPowerScene(napi_env env,napi_value object,PowerScene & powerScene)161 bool DeviceSettingsAddon::JsObjToPowerScene(napi_env env, napi_value object, PowerScene &powerScene)
162 {
163 uint32_t powerInt = 0;
164 if (ParseUint(env, powerInt, object) && powerInt == static_cast<uint32_t>(PowerScene::TIME_OUT)) {
165 powerScene = PowerScene(powerInt);
166 return true;
167 }
168 return false;
169 }
170
JsObjToPowerPolicy(napi_env env,napi_value object,PowerPolicy & powerPolicy)171 bool DeviceSettingsAddon::JsObjToPowerPolicy(napi_env env, napi_value object, PowerPolicy &powerPolicy)
172 {
173 uint32_t action = 0;
174 if (!JsObjectToUint(env, object, "powerPolicyAction", true, action)) {
175 EDMLOGE("SetPowerPolicy powerPolicyAction parse error!");
176 return false;
177 }
178 uint32_t delayTime = 0;
179 if (!JsObjectToUint(env, object, "delayTime", true, delayTime)) {
180 EDMLOGE("SetPowerPolicy delayTime parse error!");
181 return false;
182 }
183 powerPolicy.SetDelayTime(delayTime);
184 if (!powerPolicy.SetPowerPolicyAction(action)) {
185 return false;
186 }
187 return true;
188 }
189
ConvertPolicyPolicyToJs(napi_env env,PowerPolicy & powerPolicy)190 napi_value DeviceSettingsAddon::ConvertPolicyPolicyToJs(napi_env env, PowerPolicy &powerPolicy)
191 {
192 napi_value result = nullptr;
193 NAPI_CALL(env, napi_create_object(env, &result));
194 napi_value action = nullptr;
195 NAPI_CALL(env, napi_create_uint32(env, static_cast<uint32_t>(powerPolicy.GetPowerPolicyAction()), &action));
196 napi_value delayTime = nullptr;
197 NAPI_CALL(env, napi_create_uint32(env, powerPolicy.GetDelayTime(), &delayTime));
198 NAPI_CALL(env, napi_set_named_property(env, result, "powerPolicyAction", action));
199 NAPI_CALL(env, napi_set_named_property(env, result, "delayTime", delayTime));
200 return result;
201 }
202
SetScreenOffTime(napi_env env,napi_callback_info info)203 napi_value DeviceSettingsAddon::SetScreenOffTime(napi_env env, napi_callback_info info)
204 {
205 EDMLOGI("NAPI_SetScreenOffTime called");
206 AddonMethodSign addonMethodSign;
207 addonMethodSign.name = "SetScreenOffTime";
208 addonMethodSign.argsType = {EdmAddonCommonType::ELEMENT, EdmAddonCommonType::INT32};
209 addonMethodSign.methodAttribute = MethodAttribute::HANDLE;
210 addonMethodSign.apiVersionTag = EdmConstants::PERMISSION_TAG_VERSION_11;
211 AdapterAddonData adapterAddonData{};
212 napi_value result = JsObjectToData(env, info, addonMethodSign, &adapterAddonData);
213 if (result == nullptr) {
214 return nullptr;
215 }
216 int32_t ret = DeviceSettingsProxy::GetDeviceSettingsProxy()->SetScreenOffTime(adapterAddonData.data);
217 if (FAILED(ret)) {
218 napi_throw(env, CreateError(env, ret));
219 EDMLOGE("SetScreenOffTime failed!");
220 }
221 return nullptr;
222 }
223
GetScreenOffTime(napi_env env,napi_callback_info info)224 napi_value DeviceSettingsAddon::GetScreenOffTime(napi_env env, napi_callback_info info)
225 {
226 EDMLOGI("NAPI_GetScreenOffTime called");
227 AddonMethodSign addonMethodSign;
228 addonMethodSign.name = "GetScreenOffTime";
229 addonMethodSign.argsType = {EdmAddonCommonType::ELEMENT};
230 addonMethodSign.methodAttribute = MethodAttribute::GET;
231 addonMethodSign.apiVersionTag = EdmConstants::PERMISSION_TAG_VERSION_11;
232 return AddonMethodAdapter(env, info, addonMethodSign, NativeGetScreenOffTime, NativeNumberCallbackComplete);
233 }
234
NativeGetScreenOffTime(napi_env env,void * data)235 void DeviceSettingsAddon::NativeGetScreenOffTime(napi_env env, void *data)
236 {
237 EDMLOGI("NAPI_NativeGetScreenOffTime called");
238 if (data == nullptr) {
239 EDMLOGE("data is nullptr");
240 return;
241 }
242 AdapterAddonData *asyncCallbackInfo = static_cast<AdapterAddonData *>(data);
243 asyncCallbackInfo->ret = DeviceSettingsProxy::GetDeviceSettingsProxy()->GetScreenOffTime(
244 asyncCallbackInfo->data, asyncCallbackInfo->intRet);
245 }
246
InstallUserCertificate(napi_env env,napi_callback_info info)247 napi_value DeviceSettingsAddon::InstallUserCertificate(napi_env env, napi_callback_info info)
248 {
249 EDMLOGI("NAPI_InstallUserCertificate called");
250 auto convertCertBlob2Data = [](napi_env env, napi_value argv, MessageParcel &data,
251 const AddonMethodSign &methodSign) {
252 CertBlob certBlob;
253 bool retCertBlob = ParseCertBlob(env, argv, certBlob);
254 if (!retCertBlob) {
255 return false;
256 }
257 data.WriteUInt8Vector(certBlob.certArray);
258 data.WriteString(certBlob.alias);
259 return true;
260 };
261 AddonMethodSign addonMethodSign;
262 addonMethodSign.name = "InstallUserCertificate";
263 addonMethodSign.argsType = {EdmAddonCommonType::ELEMENT, EdmAddonCommonType::CUSTOM};
264 addonMethodSign.methodAttribute = MethodAttribute::HANDLE;
265 addonMethodSign.argsConvert = {nullptr, convertCertBlob2Data};
266 return AddonMethodAdapter(env, info, addonMethodSign, NativeInstallUserCertificate, NativeStringCallbackComplete);
267 }
268
NativeInstallUserCertificate(napi_env env,void * data)269 void DeviceSettingsAddon::NativeInstallUserCertificate(napi_env env, void *data)
270 {
271 EDMLOGI("NAPI_NativeInstallUserCertificate called");
272 if (data == nullptr) {
273 EDMLOGE("data is nullptr");
274 return;
275 }
276 AdapterAddonData *asyncCallbackInfo = static_cast<AdapterAddonData *>(data);
277 asyncCallbackInfo->ret = DeviceSettingsProxy::GetDeviceSettingsProxy()->InstallUserCertificate(
278 asyncCallbackInfo->data, asyncCallbackInfo->stringRet, asyncCallbackInfo->innerCodeMsg);
279 }
280
UninstallUserCertificate(napi_env env,napi_callback_info info)281 napi_value DeviceSettingsAddon::UninstallUserCertificate(napi_env env, napi_callback_info info)
282 {
283 EDMLOGI("NAPI_UninstallUserCertificate called");
284 AddonMethodSign addonMethodSign;
285 addonMethodSign.name = "InstallUserCertificate";
286 addonMethodSign.argsType = {EdmAddonCommonType::ELEMENT, EdmAddonCommonType::STRING};
287 addonMethodSign.methodAttribute = MethodAttribute::HANDLE;
288 return AddonMethodAdapter(env, info, addonMethodSign, NativeUninstallUserCertificate, NativeVoidCallbackComplete);
289 }
290
NativeUninstallUserCertificate(napi_env env,void * data)291 void DeviceSettingsAddon::NativeUninstallUserCertificate(napi_env env, void *data)
292 {
293 EDMLOGI("NAPI_NativeUninstallUserCertificate called");
294 if (data == nullptr) {
295 EDMLOGE("data is nullptr");
296 return;
297 }
298 AdapterAddonData *asyncCallbackInfo = static_cast<AdapterAddonData *>(data);
299 asyncCallbackInfo->ret = DeviceSettingsProxy::GetDeviceSettingsProxy()->UninstallUserCertificate(
300 asyncCallbackInfo->data, asyncCallbackInfo->innerCodeMsg);
301 }
302
ParseCertBlob(napi_env env,napi_value object,CertBlob & certBlob)303 bool DeviceSettingsAddon::ParseCertBlob(napi_env env, napi_value object, CertBlob &certBlob)
304 {
305 napi_valuetype type = napi_undefined;
306 NAPI_CALL_BASE(env, napi_typeof(env, object, &type), false);
307 if (type != napi_object) {
308 EDMLOGE("type of param certblob is not object");
309 return false;
310 }
311 if (!JsObjectToU8Vector(env, object, "inData", certBlob.certArray)) {
312 EDMLOGE("uint8Array to vector failed");
313 return false;
314 }
315 return JsObjectToString(env, object, "alias", true, certBlob.alias);
316 }
317
SetValue(napi_env env,napi_callback_info info)318 napi_value DeviceSettingsAddon::SetValue(napi_env env, napi_callback_info info)
319 {
320 EDMLOGI("NAPI_SetValue called");
321 size_t argc = ARGS_SIZE_THREE;
322 napi_value argv[ARGS_SIZE_THREE] = { nullptr };
323 napi_value thisArg = nullptr;
324 void *data = nullptr;
325 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisArg, &data));
326 ASSERT_AND_THROW_PARAM_ERROR(env, argc >= ARGS_SIZE_THREE, "parameter count error");
327 ASSERT_AND_THROW_PARAM_ERROR(env, MatchValueType(env, argv[ARR_INDEX_ZERO], napi_object), "parameter admin error");
328 ASSERT_AND_THROW_PARAM_ERROR(env, MatchValueType(env, argv[ARR_INDEX_ONE], napi_string), "parameter item error");
329 ASSERT_AND_THROW_PARAM_ERROR(env, MatchValueType(env, argv[ARR_INDEX_TWO], napi_string), "parameter value error");
330
331 OHOS::AppExecFwk::ElementName elementName;
332 ASSERT_AND_THROW_PARAM_ERROR(env, ParseElementName(env, elementName, argv[ARR_INDEX_ZERO]),
333 "element name param error");
334 std::string item;
335 ASSERT_AND_THROW_PARAM_ERROR(env, ParseString(env, item, argv[ARR_INDEX_ONE]), "param 'item' error");
336 std::string value;
337 ASSERT_AND_THROW_PARAM_ERROR(env, ParseString(env, value, argv[ARR_INDEX_TWO]), "param 'value' error");
338 int32_t ret = ERR_OK;
339 auto proxy = DeviceSettingsProxy::GetDeviceSettingsProxy();
340 if (item == EdmConstants::DeviceSettings::SCREEN_OFF) {
341 int32_t screenOffTime = 0;
342 ASSERT_AND_THROW_PARAM_ERROR(env, ParseStringToInt(value, screenOffTime), "param 'screenOffTime' error");
343 ret = proxy->SetScreenOffTime(elementName, screenOffTime, EdmConstants::PERMISSION_TAG_VERSION_12);
344 } else if (item == EdmConstants::DeviceSettings::POWER_POLICY) {
345 PowerScene powerScene;
346 ASSERT_AND_THROW_PARAM_ERROR(env, JsStrToPowerScene(env, value, powerScene), "param 'powerScene' error");
347 PowerPolicy powerPolicy;
348 ASSERT_AND_THROW_PARAM_ERROR(env, JsStrToPowerPolicy(env, value, powerPolicy), "param 'powerPolicy' error");
349 ret = proxy->SetPowerPolicy(elementName, powerScene, powerPolicy);
350 } else if (item == EdmConstants::DeviceSettings::DATE_TIME) {
351 int64_t dateTime = 0;
352 ASSERT_AND_THROW_PARAM_ERROR(env, ParseStringToLong(value, dateTime), "param 'dateTime' error");
353 ret = DatetimeManagerProxy::GetDatetimeManagerProxy()->SetDateTime(elementName, dateTime,
354 EdmConstants::PERMISSION_TAG_VERSION_12);
355 } else {
356 ret = EdmReturnErrCode::INTERFACE_UNSUPPORTED;
357 }
358 if (FAILED(ret)) {
359 napi_throw(env, CreateError(env, ret));
360 EDMLOGE("SetValue failed! item is %{public}s", item.c_str());
361 }
362 return nullptr;
363 }
364
GetValue(napi_env env,napi_callback_info info)365 napi_value DeviceSettingsAddon::GetValue(napi_env env, napi_callback_info info)
366 {
367 EDMLOGI("NAPI_GetValue called");
368 size_t argc = ARGS_SIZE_TWO;
369 napi_value argv[ARGS_SIZE_TWO] = {nullptr};
370 napi_value thisArg = nullptr;
371 void *data = nullptr;
372 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisArg, &data));
373 ASSERT_AND_THROW_PARAM_ERROR(env, argc >= ARGS_SIZE_TWO, "parameter count error");
374 ASSERT_AND_THROW_PARAM_ERROR(env, MatchValueType(env, argv[ARR_INDEX_ZERO], napi_object), "parameter admin error");
375 ASSERT_AND_THROW_PARAM_ERROR(env, MatchValueType(env, argv[ARR_INDEX_ONE], napi_string), "parameter item error");
376 OHOS::AppExecFwk::ElementName elementName;
377 ASSERT_AND_THROW_PARAM_ERROR(env, ParseElementName(env, elementName, argv[ARR_INDEX_ZERO]),
378 "element name param error");
379 std::string item;
380 ASSERT_AND_THROW_PARAM_ERROR(env, ParseString(env, item, argv[ARR_INDEX_ONE]), "param 'item' error");
381 int32_t ret = ERR_OK;
382 std::string stringRet;
383 auto proxy = DeviceSettingsProxy::GetDeviceSettingsProxy();
384 if (item == EdmConstants::DeviceSettings::SCREEN_OFF) {
385 int32_t screenOffTime;
386 ret = proxy->GetScreenOffTime(elementName, screenOffTime, EdmConstants::PERMISSION_TAG_VERSION_12);
387 stringRet = std::to_string(screenOffTime);
388 } else if (item == EdmConstants::DeviceSettings::POWER_POLICY) {
389 PowerScene powerScene = PowerScene::TIME_OUT;
390 PowerPolicy powerPolicy;
391 ret = proxy->GetPowerPolicy(elementName, powerScene, powerPolicy);
392 if (SUCCEEDED(ret)) {
393 ret = ConvertPowerPolicyToJsStr(env, powerScene, powerPolicy, stringRet);
394 }
395 } else {
396 ret = EdmReturnErrCode::INTERFACE_UNSUPPORTED;
397 }
398 if (FAILED(ret)) {
399 napi_throw(env, CreateError(env, ret));
400 EDMLOGE("GetValue failed! item is %{public}s", item.c_str());
401 return nullptr;
402 }
403 napi_value result;
404 NAPI_CALL(env, napi_create_string_utf8(env, stringRet.c_str(), stringRet.size(), &result));
405 return result;
406 }
407
JsStrToPowerScene(napi_env env,std::string jsStr,PowerScene & powerScene)408 bool DeviceSettingsAddon::JsStrToPowerScene(napi_env env, std::string jsStr, PowerScene &powerScene)
409 {
410 cJSON *json = cJSON_Parse(jsStr.c_str());
411 if (json == nullptr) {
412 return false;
413 }
414 cJSON *itemPowerScene = cJSON_GetObjectItem(json, "powerScene");
415 if (!cJSON_IsNumber(itemPowerScene)) {
416 cJSON_Delete(json);
417 return false;
418 }
419 powerScene = PowerScene(itemPowerScene->valueint);
420 cJSON_Delete(json);
421 return true;
422 }
423
JsStrToPowerPolicy(napi_env env,std::string jsStr,PowerPolicy & powerPolicy)424 bool DeviceSettingsAddon::JsStrToPowerPolicy(napi_env env, std::string jsStr, PowerPolicy &powerPolicy)
425 {
426 cJSON *json = cJSON_Parse(jsStr.c_str());
427 if (json == nullptr) {
428 return false;
429 }
430 cJSON *itemPowerPolicy = cJSON_GetObjectItem(json, "powerPolicy");
431 if (!cJSON_IsObject(itemPowerPolicy)) {
432 cJSON_Delete(json);
433 return false;
434 }
435 cJSON *delayTime = cJSON_GetObjectItem(itemPowerPolicy, "delayTime");
436 if (!cJSON_IsNumber(delayTime)) {
437 cJSON_Delete(json);
438 return false;
439 }
440 powerPolicy.SetDelayTime(delayTime->valueint);
441 cJSON *powerPolicyAction = cJSON_GetObjectItem(itemPowerPolicy, "powerPolicyAction");
442 if (!cJSON_IsNumber(powerPolicyAction)) {
443 cJSON_Delete(json);
444 return false;
445 }
446 bool setActionRet = powerPolicy.SetPowerPolicyAction(powerPolicyAction->valueint);
447 cJSON_Delete(json);
448 return setActionRet;
449 }
450
ConvertPowerPolicyToJsStr(napi_env env,PowerScene & powerScene,PowerPolicy & powerPolicy,std::string & info)451 int32_t DeviceSettingsAddon::ConvertPowerPolicyToJsStr(napi_env env, PowerScene &powerScene, PowerPolicy &powerPolicy,
452 std::string &info)
453 {
454 cJSON *json = nullptr;
455 CJSON_CREATE_OBJECT_AND_CHECK(json, EdmReturnErrCode::SYSTEM_ABNORMALLY);
456 cJSON *powerPoilcyJs = nullptr;
457 CJSON_CREATE_OBJECT_AND_CHECK_AND_CLEAR(powerPoilcyJs, EdmReturnErrCode::SYSTEM_ABNORMALLY, json);
458 cJSON_AddNumberToObject(powerPoilcyJs, "powerPolicyAction",
459 static_cast<uint32_t>(powerPolicy.GetPowerPolicyAction()));
460 cJSON_AddNumberToObject(powerPoilcyJs, "delayTime", powerPolicy.GetDelayTime());
461 cJSON_AddNumberToObject(json, "powerScene", static_cast<uint32_t>(powerScene));
462 bool ret = cJSON_AddItemToObject(json, "powerPolicy", powerPoilcyJs);
463 if (!ret) {
464 cJSON_Delete(json);
465 cJSON_Delete(powerPoilcyJs);
466 return EdmReturnErrCode::SYSTEM_ABNORMALLY;
467 }
468 char *jsonStr = cJSON_PrintUnformatted(json);
469 if (jsonStr == nullptr) {
470 cJSON_Delete(json);
471 return EdmReturnErrCode::SYSTEM_ABNORMALLY;
472 }
473 info = std::string(jsonStr);
474 cJSON_Delete(json);
475 cJSON_free(jsonStr);
476 return ERR_OK;
477 }
478
SetHomeWallPaper(napi_env env,napi_callback_info info)479 napi_value DeviceSettingsAddon::SetHomeWallPaper(napi_env env, napi_callback_info info)
480 {
481 EDMLOGI("NAPI_SetHomeWallPaper called");
482 return SetWallPaper(env, info, true);
483 }
484
SetUnlockWallPaper(napi_env env,napi_callback_info info)485 napi_value DeviceSettingsAddon::SetUnlockWallPaper(napi_env env, napi_callback_info info)
486 {
487 EDMLOGI("NAPI_SetUnlockWallPaper called");
488 return SetWallPaper(env, info, false);
489 }
490
SetWallPaper(napi_env env,napi_callback_info info,bool isHomeWallPaper)491 napi_value DeviceSettingsAddon::SetWallPaper(napi_env env, napi_callback_info info, bool isHomeWallPaper)
492 {
493 auto convertFd2Data = [](napi_env env, napi_value argv, MessageParcel &data,
494 const AddonMethodSign &methodSign) {
495 int32_t fd = -1;
496 if (!ParseInt(env, fd, argv)) {
497 return false;
498 }
499 data.WriteFileDescriptor(fd);
500 return true;
501 };
502
503 AddonMethodSign addonMethodSign;
504 addonMethodSign.name = "SetWallPaper";
505 addonMethodSign.argsType = {EdmAddonCommonType::ELEMENT, EdmAddonCommonType::CUSTOM};
506 addonMethodSign.argsConvert = {nullptr, convertFd2Data};
507 addonMethodSign.methodAttribute = MethodAttribute::HANDLE;
508 addonMethodSign.apiVersionTag = WITHOUT_PERMISSION_TAG;
509 if (isHomeWallPaper) {
510 return AddonMethodAdapter(env, info, addonMethodSign, NativeSetHomeWallPaper, NativeVoidCallbackComplete);
511 }
512 return AddonMethodAdapter(env, info, addonMethodSign, NativeSetUnlockWallPaper, NativeVoidCallbackComplete);
513 }
514
NativeSetHomeWallPaper(napi_env env,void * data)515 void DeviceSettingsAddon::NativeSetHomeWallPaper(napi_env env, void* data)
516 {
517 NativeSetWallPaper(env, data, true);
518 }
519
NativeSetUnlockWallPaper(napi_env env,void * data)520 void DeviceSettingsAddon::NativeSetUnlockWallPaper(napi_env env, void* data)
521 {
522 NativeSetWallPaper(env, data, false);
523 }
524
NativeSetWallPaper(napi_env env,void * data,bool isHomeWallPaper)525 void DeviceSettingsAddon::NativeSetWallPaper(napi_env env, void* data, bool isHomeWallPaper)
526 {
527 EDMLOGI("NativeSetWallPaper called");
528 if (data == nullptr) {
529 EDMLOGE("data is nullptr");
530 return;
531 }
532 AdapterAddonData *asyncCallbackInfo = static_cast<AdapterAddonData *>(data);
533 asyncCallbackInfo->data.WriteBool(isHomeWallPaper);
534 int32_t ret = DeviceSettingsProxy::GetDeviceSettingsProxy()->SetWallPaper(asyncCallbackInfo->data,
535 asyncCallbackInfo->innerCodeMsg);
536 if (FAILED(ret)) {
537 asyncCallbackInfo->ret = ret;
538 }
539 }
540
541 static napi_module g_deviceSettingsModule = {
542 .nm_version = 1,
543 .nm_flags = 0,
544 .nm_filename = nullptr,
545 .nm_register_func = DeviceSettingsAddon::Init,
546 .nm_modname = "enterprise.deviceSettings",
547 .nm_priv = ((void *)0),
548 .reserved = {0},
549 };
550
DeviceSettingsRegister()551 extern "C" __attribute__((constructor)) void DeviceSettingsRegister()
552 {
553 napi_module_register(&g_deviceSettingsModule);
554 }