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 };
78 NAPI_CALL(env, napi_define_properties(env, exports, sizeof(property) / sizeof(property[0]), property));
79 return exports;
80 }
81
SetPowerPolicy(napi_env env,napi_callback_info info)82 napi_value DeviceSettingsAddon::SetPowerPolicy(napi_env env, napi_callback_info info)
83 {
84 EDMLOGI("NAPI_SetPowerPolicy called");
85 auto convertPowerScene2Data = [](napi_env env, napi_value argv, MessageParcel &data,
86 const AddonMethodSign &methodSign) {
87 PowerScene powerScene;
88 bool isUint = JsObjToPowerScene(env, argv, powerScene);
89 if (!isUint) {
90 return false;
91 }
92 data.WriteUint32(static_cast<uint32_t>(powerScene));
93 return true;
94 };
95 auto convertPowerPolicy2Data = [](napi_env env, napi_value argv, MessageParcel &data,
96 const AddonMethodSign &methodSign) {
97 PowerPolicy powerPolicy;
98 bool isUint = JsObjToPowerPolicy(env, argv, powerPolicy);
99 if (!isUint) {
100 return false;
101 }
102 if (!powerPolicy.Marshalling(data)) {
103 EDMLOGE("DeviceSettingsProxy::SetPowerPolicy Marshalling proxy fail.");
104 return false;
105 }
106 return true;
107 };
108 AddonMethodSign addonMethodSign;
109 addonMethodSign.name = "SetPowerPolicy";
110 addonMethodSign.argsType = {EdmAddonCommonType::ELEMENT, EdmAddonCommonType::CUSTOM, EdmAddonCommonType::CUSTOM};
111 addonMethodSign.argsConvert = {nullptr, convertPowerScene2Data, convertPowerPolicy2Data};
112 addonMethodSign.methodAttribute = MethodAttribute::HANDLE;
113 AdapterAddonData adapterAddonData{};
114 napi_value result = JsObjectToData(env, info, addonMethodSign, &adapterAddonData);
115 if (result == nullptr) {
116 return nullptr;
117 }
118 int32_t ret = DeviceSettingsProxy::GetDeviceSettingsProxy()->SetPowerPolicy(adapterAddonData.data);
119 if (FAILED(ret)) {
120 napi_throw(env, CreateError(env, ret));
121 EDMLOGE("SetPowerPolicy failed!");
122 }
123 return nullptr;
124 }
125
GetPowerPolicy(napi_env env,napi_callback_info info)126 napi_value DeviceSettingsAddon::GetPowerPolicy(napi_env env, napi_callback_info info)
127 {
128 EDMLOGI("NAPI_GetPowerPolicy called");
129 auto convertPowerScene2Data = [](napi_env env, napi_value argv, MessageParcel &data,
130 const AddonMethodSign &methodSign) {
131 PowerScene powerScene;
132 bool isUint = JsObjToPowerScene(env, argv, powerScene);
133 if (!isUint) {
134 return false;
135 }
136 data.WriteUint32(static_cast<uint32_t>(powerScene));
137 return true;
138 };
139 AddonMethodSign addonMethodSign;
140 addonMethodSign.name = "GetPowerPolicy";
141 addonMethodSign.argsType = {EdmAddonCommonType::ELEMENT, EdmAddonCommonType::CUSTOM};
142 addonMethodSign.argsConvert = {nullptr, convertPowerScene2Data};
143 addonMethodSign.methodAttribute = MethodAttribute::GET;
144 AdapterAddonData adapterAddonData{};
145 if (JsObjectToData(env, info, addonMethodSign, &adapterAddonData) == nullptr) {
146 return nullptr;
147 }
148 PowerPolicy powerPolicy;
149 int32_t ret = DeviceSettingsProxy::GetDeviceSettingsProxy()->GetPowerPolicy(adapterAddonData.data, powerPolicy);
150 if (FAILED(ret)) {
151 napi_throw(env, CreateError(env, ret));
152 EDMLOGE("SetPowerPolicy failed!");
153 return nullptr;
154 }
155 napi_value result = ConvertPolicyPolicyToJs(env, powerPolicy);
156 return result;
157 }
158
JsObjToPowerScene(napi_env env,napi_value object,PowerScene & powerScene)159 bool DeviceSettingsAddon::JsObjToPowerScene(napi_env env, napi_value object, PowerScene &powerScene)
160 {
161 uint32_t powerInt = 0;
162 if (ParseUint(env, powerInt, object) && powerInt == static_cast<uint32_t>(PowerScene::TIME_OUT)) {
163 powerScene = PowerScene(powerInt);
164 return true;
165 }
166 return false;
167 }
168
JsObjToPowerPolicy(napi_env env,napi_value object,PowerPolicy & powerPolicy)169 bool DeviceSettingsAddon::JsObjToPowerPolicy(napi_env env, napi_value object, PowerPolicy &powerPolicy)
170 {
171 uint32_t action = 0;
172 if (!JsObjectToUint(env, object, "powerPolicyAction", true, action)) {
173 EDMLOGE("SetPowerPolicy powerPolicyAction parse error!");
174 return false;
175 }
176 uint32_t delayTime = 0;
177 if (!JsObjectToUint(env, object, "delayTime", true, delayTime)) {
178 EDMLOGE("SetPowerPolicy delayTime parse error!");
179 return false;
180 }
181 powerPolicy.SetDelayTime(delayTime);
182 if (!powerPolicy.SetPowerPolicyAction(action)) {
183 return false;
184 }
185 return true;
186 }
187
ConvertPolicyPolicyToJs(napi_env env,PowerPolicy & powerPolicy)188 napi_value DeviceSettingsAddon::ConvertPolicyPolicyToJs(napi_env env, PowerPolicy &powerPolicy)
189 {
190 napi_value result = nullptr;
191 NAPI_CALL(env, napi_create_object(env, &result));
192 napi_value action = nullptr;
193 NAPI_CALL(env, napi_create_uint32(env, static_cast<uint32_t>(powerPolicy.GetPowerPolicyAction()), &action));
194 napi_value delayTime = nullptr;
195 NAPI_CALL(env, napi_create_uint32(env, powerPolicy.GetDelayTime(), &delayTime));
196 NAPI_CALL(env, napi_set_named_property(env, result, "powerPolicyAction", action));
197 NAPI_CALL(env, napi_set_named_property(env, result, "delayTime", delayTime));
198 return result;
199 }
200
SetScreenOffTime(napi_env env,napi_callback_info info)201 napi_value DeviceSettingsAddon::SetScreenOffTime(napi_env env, napi_callback_info info)
202 {
203 EDMLOGI("NAPI_SetScreenOffTime called");
204 AddonMethodSign addonMethodSign;
205 addonMethodSign.name = "SetScreenOffTime";
206 addonMethodSign.argsType = {EdmAddonCommonType::ELEMENT, EdmAddonCommonType::INT32};
207 addonMethodSign.methodAttribute = MethodAttribute::HANDLE;
208 addonMethodSign.apiVersionTag = EdmConstants::PERMISSION_TAG_VERSION_11;
209 AdapterAddonData adapterAddonData{};
210 napi_value result = JsObjectToData(env, info, addonMethodSign, &adapterAddonData);
211 if (result == nullptr) {
212 return nullptr;
213 }
214 int32_t ret = DeviceSettingsProxy::GetDeviceSettingsProxy()->SetScreenOffTime(adapterAddonData.data);
215 if (FAILED(ret)) {
216 napi_throw(env, CreateError(env, ret));
217 EDMLOGE("SetScreenOffTime failed!");
218 }
219 return nullptr;
220 }
221
GetScreenOffTime(napi_env env,napi_callback_info info)222 napi_value DeviceSettingsAddon::GetScreenOffTime(napi_env env, napi_callback_info info)
223 {
224 EDMLOGI("NAPI_GetScreenOffTime called");
225 AddonMethodSign addonMethodSign;
226 addonMethodSign.name = "GetScreenOffTime";
227 addonMethodSign.argsType = {EdmAddonCommonType::ELEMENT};
228 addonMethodSign.methodAttribute = MethodAttribute::GET;
229 addonMethodSign.apiVersionTag = EdmConstants::PERMISSION_TAG_VERSION_11;
230 return AddonMethodAdapter(env, info, addonMethodSign, NativeGetScreenOffTime, NativeNumberCallbackComplete);
231 }
232
NativeGetScreenOffTime(napi_env env,void * data)233 void DeviceSettingsAddon::NativeGetScreenOffTime(napi_env env, void *data)
234 {
235 EDMLOGI("NAPI_NativeGetScreenOffTime called");
236 if (data == nullptr) {
237 EDMLOGE("data is nullptr");
238 return;
239 }
240 AdapterAddonData *asyncCallbackInfo = static_cast<AdapterAddonData *>(data);
241 asyncCallbackInfo->ret = DeviceSettingsProxy::GetDeviceSettingsProxy()->GetScreenOffTime(
242 asyncCallbackInfo->data, asyncCallbackInfo->intRet);
243 }
244
InstallUserCertificate(napi_env env,napi_callback_info info)245 napi_value DeviceSettingsAddon::InstallUserCertificate(napi_env env, napi_callback_info info)
246 {
247 EDMLOGI("NAPI_InstallUserCertificate called");
248 auto convertCertBlob2Data = [](napi_env env, napi_value argv, MessageParcel &data,
249 const AddonMethodSign &methodSign) {
250 CertBlob certBlob;
251 bool retCertBlob = ParseCertBlob(env, argv, certBlob);
252 if (!retCertBlob) {
253 return false;
254 }
255 data.WriteUInt8Vector(certBlob.certArray);
256 data.WriteString(certBlob.alias);
257 return true;
258 };
259 AddonMethodSign addonMethodSign;
260 addonMethodSign.name = "InstallUserCertificate";
261 addonMethodSign.argsType = {EdmAddonCommonType::ELEMENT, EdmAddonCommonType::CUSTOM};
262 addonMethodSign.methodAttribute = MethodAttribute::HANDLE;
263 addonMethodSign.argsConvert = {nullptr, convertCertBlob2Data};
264 return AddonMethodAdapter(env, info, addonMethodSign, NativeInstallUserCertificate, NativeStringCallbackComplete);
265 }
266
NativeInstallUserCertificate(napi_env env,void * data)267 void DeviceSettingsAddon::NativeInstallUserCertificate(napi_env env, void *data)
268 {
269 EDMLOGI("NAPI_NativeInstallUserCertificate called");
270 if (data == nullptr) {
271 EDMLOGE("data is nullptr");
272 return;
273 }
274 AdapterAddonData *asyncCallbackInfo = static_cast<AdapterAddonData *>(data);
275 asyncCallbackInfo->ret = DeviceSettingsProxy::GetDeviceSettingsProxy()->InstallUserCertificate(
276 asyncCallbackInfo->data, asyncCallbackInfo->stringRet, asyncCallbackInfo->innerCodeMsg);
277 }
278
UninstallUserCertificate(napi_env env,napi_callback_info info)279 napi_value DeviceSettingsAddon::UninstallUserCertificate(napi_env env, napi_callback_info info)
280 {
281 EDMLOGI("NAPI_UninstallUserCertificate called");
282 AddonMethodSign addonMethodSign;
283 addonMethodSign.name = "InstallUserCertificate";
284 addonMethodSign.argsType = {EdmAddonCommonType::ELEMENT, EdmAddonCommonType::STRING};
285 addonMethodSign.methodAttribute = MethodAttribute::HANDLE;
286 return AddonMethodAdapter(env, info, addonMethodSign, NativeUninstallUserCertificate, NativeVoidCallbackComplete);
287 }
288
NativeUninstallUserCertificate(napi_env env,void * data)289 void DeviceSettingsAddon::NativeUninstallUserCertificate(napi_env env, void *data)
290 {
291 EDMLOGI("NAPI_NativeUninstallUserCertificate called");
292 if (data == nullptr) {
293 EDMLOGE("data is nullptr");
294 return;
295 }
296 AdapterAddonData *asyncCallbackInfo = static_cast<AdapterAddonData *>(data);
297 asyncCallbackInfo->ret = DeviceSettingsProxy::GetDeviceSettingsProxy()->UninstallUserCertificate(
298 asyncCallbackInfo->data, asyncCallbackInfo->innerCodeMsg);
299 }
300
ParseCertBlob(napi_env env,napi_value object,CertBlob & certBlob)301 bool DeviceSettingsAddon::ParseCertBlob(napi_env env, napi_value object, CertBlob &certBlob)
302 {
303 napi_valuetype type = napi_undefined;
304 NAPI_CALL_BASE(env, napi_typeof(env, object, &type), false);
305 if (type != napi_object) {
306 EDMLOGE("type of param certblob is not object");
307 return false;
308 }
309 if (!JsObjectToU8Vector(env, object, "inData", certBlob.certArray)) {
310 EDMLOGE("uint8Array to vector failed");
311 return false;
312 }
313 return JsObjectToString(env, object, "alias", true, certBlob.alias);
314 }
315
SetValue(napi_env env,napi_callback_info info)316 napi_value DeviceSettingsAddon::SetValue(napi_env env, napi_callback_info info)
317 {
318 EDMLOGI("NAPI_SetValue called");
319 size_t argc = ARGS_SIZE_THREE;
320 napi_value argv[ARGS_SIZE_THREE] = { nullptr };
321 napi_value thisArg = nullptr;
322 void *data = nullptr;
323 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisArg, &data));
324 ASSERT_AND_THROW_PARAM_ERROR(env, argc >= ARGS_SIZE_THREE, "parameter count error");
325 ASSERT_AND_THROW_PARAM_ERROR(env, MatchValueType(env, argv[ARR_INDEX_ZERO], napi_object), "parameter admin error");
326 ASSERT_AND_THROW_PARAM_ERROR(env, MatchValueType(env, argv[ARR_INDEX_ONE], napi_string), "parameter item error");
327 ASSERT_AND_THROW_PARAM_ERROR(env, MatchValueType(env, argv[ARR_INDEX_TWO], napi_string), "parameter value error");
328
329 OHOS::AppExecFwk::ElementName elementName;
330 ASSERT_AND_THROW_PARAM_ERROR(env, ParseElementName(env, elementName, argv[ARR_INDEX_ZERO]),
331 "element name param error");
332 std::string item;
333 ASSERT_AND_THROW_PARAM_ERROR(env, ParseString(env, item, argv[ARR_INDEX_ONE]), "param 'item' error");
334 std::string value;
335 ASSERT_AND_THROW_PARAM_ERROR(env, ParseString(env, value, argv[ARR_INDEX_TWO]), "param 'value' error");
336 int32_t ret = ERR_OK;
337 auto proxy = DeviceSettingsProxy::GetDeviceSettingsProxy();
338 if (item == EdmConstants::DeviceSettings::SCREEN_OFF) {
339 int32_t screenOffTime = 0;
340 ASSERT_AND_THROW_PARAM_ERROR(env, ParseStringToInt(value, screenOffTime), "param 'screenOffTime' error");
341 ret = proxy->SetScreenOffTime(elementName, screenOffTime, EdmConstants::PERMISSION_TAG_VERSION_12);
342 } else if (item == EdmConstants::DeviceSettings::POWER_POLICY) {
343 PowerScene powerScene;
344 ASSERT_AND_THROW_PARAM_ERROR(env, JsStrToPowerScene(env, value, powerScene), "param 'powerScene' error");
345 PowerPolicy powerPolicy;
346 ASSERT_AND_THROW_PARAM_ERROR(env, JsStrToPowerPolicy(env, value, powerPolicy), "param 'powerPolicy' error");
347 ret = proxy->SetPowerPolicy(elementName, powerScene, powerPolicy);
348 } else if (item == EdmConstants::DeviceSettings::DATE_TIME) {
349 int64_t dateTime = 0;
350 ASSERT_AND_THROW_PARAM_ERROR(env, ParseStringToLong(value, dateTime), "param 'dateTime' error");
351 ret = DatetimeManagerProxy::GetDatetimeManagerProxy()->SetDateTime(elementName, dateTime,
352 EdmConstants::PERMISSION_TAG_VERSION_12);
353 } else {
354 ret = EdmReturnErrCode::INTERFACE_UNSUPPORTED;
355 }
356 if (FAILED(ret)) {
357 napi_throw(env, CreateError(env, ret));
358 EDMLOGE("SetValue failed! item is %{public}s", item.c_str());
359 }
360 return nullptr;
361 }
362
GetValue(napi_env env,napi_callback_info info)363 napi_value DeviceSettingsAddon::GetValue(napi_env env, napi_callback_info info)
364 {
365 EDMLOGI("NAPI_GetValue called");
366 size_t argc = ARGS_SIZE_TWO;
367 napi_value argv[ARGS_SIZE_TWO] = {nullptr};
368 napi_value thisArg = nullptr;
369 void *data = nullptr;
370 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisArg, &data));
371 ASSERT_AND_THROW_PARAM_ERROR(env, argc >= ARGS_SIZE_TWO, "parameter count error");
372 ASSERT_AND_THROW_PARAM_ERROR(env, MatchValueType(env, argv[ARR_INDEX_ZERO], napi_object), "parameter admin error");
373 ASSERT_AND_THROW_PARAM_ERROR(env, MatchValueType(env, argv[ARR_INDEX_ONE], napi_string), "parameter item error");
374 OHOS::AppExecFwk::ElementName elementName;
375 ASSERT_AND_THROW_PARAM_ERROR(env, ParseElementName(env, elementName, argv[ARR_INDEX_ZERO]),
376 "element name param error");
377 std::string item;
378 ASSERT_AND_THROW_PARAM_ERROR(env, ParseString(env, item, argv[ARR_INDEX_ONE]), "param 'item' error");
379 int32_t ret = ERR_OK;
380 std::string stringRet;
381 auto proxy = DeviceSettingsProxy::GetDeviceSettingsProxy();
382 if (item == EdmConstants::DeviceSettings::SCREEN_OFF) {
383 int32_t screenOffTime;
384 ret = proxy->GetScreenOffTime(elementName, screenOffTime, EdmConstants::PERMISSION_TAG_VERSION_12);
385 stringRet = std::to_string(screenOffTime);
386 } else if (item == EdmConstants::DeviceSettings::POWER_POLICY) {
387 PowerScene powerScene = PowerScene::TIME_OUT;
388 PowerPolicy powerPolicy;
389 ret = proxy->GetPowerPolicy(elementName, powerScene, powerPolicy);
390 if (SUCCEEDED(ret)) {
391 ret = ConvertPowerPolicyToJsStr(env, powerScene, powerPolicy, stringRet);
392 }
393 } else {
394 ret = EdmReturnErrCode::INTERFACE_UNSUPPORTED;
395 }
396 if (FAILED(ret)) {
397 napi_throw(env, CreateError(env, ret));
398 EDMLOGE("GetValue failed! item is %{public}s", item.c_str());
399 return nullptr;
400 }
401 napi_value result;
402 NAPI_CALL(env, napi_create_string_utf8(env, stringRet.c_str(), stringRet.size(), &result));
403 return result;
404 }
405
JsStrToPowerScene(napi_env env,std::string jsStr,PowerScene & powerScene)406 bool DeviceSettingsAddon::JsStrToPowerScene(napi_env env, std::string jsStr, PowerScene &powerScene)
407 {
408 cJSON *json = cJSON_Parse(jsStr.c_str());
409 if (json == nullptr) {
410 return false;
411 }
412 cJSON *itemPowerScene = cJSON_GetObjectItem(json, "powerScene");
413 if (!cJSON_IsNumber(itemPowerScene)) {
414 cJSON_Delete(json);
415 return false;
416 }
417 powerScene = PowerScene(itemPowerScene->valueint);
418 cJSON_Delete(json);
419 return true;
420 }
421
JsStrToPowerPolicy(napi_env env,std::string jsStr,PowerPolicy & powerPolicy)422 bool DeviceSettingsAddon::JsStrToPowerPolicy(napi_env env, std::string jsStr, PowerPolicy &powerPolicy)
423 {
424 cJSON *json = cJSON_Parse(jsStr.c_str());
425 if (json == nullptr) {
426 return false;
427 }
428 cJSON *itemPowerPolicy = cJSON_GetObjectItem(json, "powerPolicy");
429 if (!cJSON_IsObject(itemPowerPolicy)) {
430 cJSON_Delete(json);
431 return false;
432 }
433 cJSON *delayTime = cJSON_GetObjectItem(itemPowerPolicy, "delayTime");
434 if (!cJSON_IsNumber(delayTime)) {
435 cJSON_Delete(json);
436 return false;
437 }
438 powerPolicy.SetDelayTime(delayTime->valueint);
439 cJSON *powerPolicyAction = cJSON_GetObjectItem(itemPowerPolicy, "powerPolicyAction");
440 if (!cJSON_IsNumber(powerPolicyAction)) {
441 cJSON_Delete(json);
442 return false;
443 }
444 bool setActionRet = powerPolicy.SetPowerPolicyAction(powerPolicyAction->valueint);
445 cJSON_Delete(json);
446 return setActionRet;
447 }
448
ConvertPowerPolicyToJsStr(napi_env env,PowerScene & powerScene,PowerPolicy & powerPolicy,std::string & info)449 int32_t DeviceSettingsAddon::ConvertPowerPolicyToJsStr(napi_env env, PowerScene &powerScene, PowerPolicy &powerPolicy,
450 std::string &info)
451 {
452 cJSON *json = nullptr;
453 CJSON_CREATE_OBJECT_AND_CHECK(json, EdmReturnErrCode::SYSTEM_ABNORMALLY);
454 cJSON *powerPoilcyJs = nullptr;
455 CJSON_CREATE_OBJECT_AND_CHECK_AND_CLEAR(powerPoilcyJs, EdmReturnErrCode::SYSTEM_ABNORMALLY, json);
456 cJSON_AddNumberToObject(powerPoilcyJs, "powerPolicyAction",
457 static_cast<uint32_t>(powerPolicy.GetPowerPolicyAction()));
458 cJSON_AddNumberToObject(powerPoilcyJs, "delayTime", powerPolicy.GetDelayTime());
459 cJSON_AddNumberToObject(json, "powerScene", static_cast<uint32_t>(powerScene));
460 bool ret = cJSON_AddItemToObject(json, "powerPolicy", powerPoilcyJs);
461 if (!ret) {
462 cJSON_Delete(json);
463 cJSON_Delete(powerPoilcyJs);
464 return EdmReturnErrCode::SYSTEM_ABNORMALLY;
465 }
466 char *jsonStr = cJSON_PrintUnformatted(json);
467 if (jsonStr == nullptr) {
468 cJSON_Delete(json);
469 return EdmReturnErrCode::SYSTEM_ABNORMALLY;
470 }
471 info = std::string(jsonStr);
472 cJSON_Delete(json);
473 cJSON_free(jsonStr);
474 return ERR_OK;
475 }
476
477 static napi_module g_deviceSettingsModule = {
478 .nm_version = 1,
479 .nm_flags = 0,
480 .nm_filename = nullptr,
481 .nm_register_func = DeviceSettingsAddon::Init,
482 .nm_modname = "enterprise.deviceSettings",
483 .nm_priv = ((void *)0),
484 .reserved = {0},
485 };
486
DeviceSettingsRegister()487 extern "C" __attribute__((constructor)) void DeviceSettingsRegister()
488 {
489 napi_module_register(&g_deviceSettingsModule);
490 }