• 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 #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 }