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