1 /*
2 * Copyright (c) 2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "napi_sync_config.h"
17 #include "common.h"
18 #include "napi_common_util.h"
19 #include "ans_inner_errors.h"
20 #include "ans_log_wrapper.h"
21
22 namespace OHOS {
23 namespace NotificationNapi {
24 namespace {
25 constexpr int8_t SETADDITION_CONFIG_NUM = 2;
26 constexpr char KEY_NAME[] = "AGGREGATE_CONFIG";
27 constexpr char RING_LIST_KEY_NAME[] = "RING_TRUSTLIST_PKG";
28 constexpr char CTRL_LIST_KEY_NAME[] = "NOTIFICATION_CTL_LIST_PKG";
29 }
30
31 struct ConfigParams {
32 std::string key = "";
33 std::string value = "";
34 napi_ref callback = nullptr;
35 };
36
37 struct AsyncCallbackInfoConfig {
38 napi_env env = nullptr;
39 napi_async_work asyncWork = nullptr;
40 ConfigParams params;
41 CallbackPromiseInfo info;
42 };
43
ParseParameters(const napi_env & env,const napi_callback_info & info,ConfigParams & params)44 napi_value ParseParameters(const napi_env &env, const napi_callback_info &info, ConfigParams ¶ms)
45 {
46 ANS_LOGD("enter");
47
48 size_t argc = SETADDITION_CONFIG_NUM;
49 napi_value argv[SETADDITION_CONFIG_NUM] = {nullptr};
50 napi_value thisVar = nullptr;
51 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
52 if (argc < SETADDITION_CONFIG_NUM) {
53 ANS_LOGW("Wrong number of arguments.");
54 Common::NapiThrow(env, ERROR_PARAM_INVALID, MANDATORY_PARAMETER_ARE_LEFT_UNSPECIFIED);
55 return nullptr;
56 }
57
58 napi_valuetype valuetype = napi_undefined;
59 // argv[0]: key: string
60 NAPI_CALL(env, napi_typeof(env, argv[PARAM0], &valuetype));
61 if (valuetype != napi_string) {
62 ANS_LOGW("Argument type error. String expected.");
63 std::string msg = "Incorrect parameter types.The type of param must be string.";
64 Common::NapiThrow(env, ERROR_PARAM_INVALID, msg);
65 return nullptr;
66 }
67 char keyStr[STR_MAX_SIZE] = {0};
68 size_t keyStrLen = 0;
69 NAPI_CALL(env, napi_get_value_string_utf8(env, argv[PARAM0], keyStr, STR_MAX_SIZE - 1, &keyStrLen));
70 params.key = keyStr;
71 if (std::strlen(keyStr) == 0 ||
72 (strcmp(keyStr, KEY_NAME) != 0 && strcmp(keyStr, RING_LIST_KEY_NAME) != 0
73 && strcmp(keyStr, CTRL_LIST_KEY_NAME) != 0)) {
74 ANS_LOGW("Argument type error. String expected.");
75 std::string msg = "Incorrect parameter types.The type of param must be string.";
76 Common::NapiThrow(env, ERROR_PARAM_INVALID, msg);
77 return nullptr;
78 }
79
80 // argv[1]: value: string
81 NAPI_CALL(env, napi_typeof(env, argv[PARAM1], &valuetype));
82 if (valuetype != napi_string) {
83 ANS_LOGW("Argument type error. String expected.");
84 std::string msg = "Incorrect parameter types.The type of param must be string.";
85 Common::NapiThrow(env, ERROR_PARAM_INVALID, msg);
86 return nullptr;
87 }
88
89 char valueStr[LONG_LONG_STR_MAX_SIZE] = {0};
90 size_t valStrLen = 0;
91 NAPI_CALL(env, napi_get_value_string_utf8(env, argv[PARAM1], valueStr, LONG_LONG_STR_MAX_SIZE - 1, &valStrLen));
92 params.value = valueStr;
93
94 return Common::NapiGetNull(env);
95 }
96
AsyncSetConfigComplete(napi_env env,napi_status status,void * data)97 void AsyncSetConfigComplete(napi_env env, napi_status status, void *data)
98 {
99 ANS_LOGI("NapiSetAdditionConfig work complete.");
100 AsyncCallbackInfoConfig *asynccallbackinfo = static_cast<AsyncCallbackInfoConfig *>(data);
101 if (asynccallbackinfo) {
102 napi_value result = nullptr;
103 napi_create_int32(env, asynccallbackinfo->info.errorCode, &result);
104 Common::CreateReturnValue(env, asynccallbackinfo->info, result);
105 if (asynccallbackinfo->info.callback != nullptr) {
106 ANS_LOGD("Delete NapiSetAdditionConfig callback reference.");
107 napi_delete_reference(env, asynccallbackinfo->info.callback);
108 }
109 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
110 delete asynccallbackinfo;
111 asynccallbackinfo = nullptr;
112 }
113 ANS_LOGD("NapiSetAdditionConfig work complete end.");
114 }
NapiSetAdditionConfig(napi_env env,napi_callback_info info)115 napi_value NapiSetAdditionConfig(napi_env env, napi_callback_info info)
116 {
117 ANS_LOGD("enter");
118 ConfigParams paras {};
119 if (ParseParameters(env, info, paras) == nullptr) {
120 Common::NapiThrow(env, ERROR_PARAM_INVALID);
121 return Common::NapiGetUndefined(env);
122 }
123
124 AsyncCallbackInfoConfig *asynccallbackinfo = new (std::nothrow) AsyncCallbackInfoConfig {
125 .env = env,
126 .asyncWork = nullptr,
127 .params = paras
128 };
129 if (!asynccallbackinfo) {
130 Common::NapiThrow(env, ERROR_INTERNAL_ERROR);
131 return Common::JSParaError(env, paras.callback);
132 }
133 napi_value promise = nullptr;
134 Common::PaddingCallbackPromiseInfo(env, paras.callback, asynccallbackinfo->info, promise);
135
136 napi_value resourceName = nullptr;
137 napi_create_string_latin1(env, "setAdditionConfig", NAPI_AUTO_LENGTH, &resourceName);
138 napi_create_async_work(env,
139 nullptr,
140 resourceName,
141 [](napi_env env, void *data) {
142 ANS_LOGI("NapiSetAdditionConfig work excute.");
143 AsyncCallbackInfoConfig *asynccallbackinfo = static_cast<AsyncCallbackInfoConfig *>(data);
144 if (asynccallbackinfo) {
145 asynccallbackinfo->info.errorCode = NotificationHelper::SetAdditionConfig(
146 asynccallbackinfo->params.key, asynccallbackinfo->params.value);
147 }
148 }, AsyncSetConfigComplete, (void *)asynccallbackinfo, &asynccallbackinfo->asyncWork);
149
150 napi_queue_async_work_with_qos(env, asynccallbackinfo->asyncWork, napi_qos_user_initiated);
151
152 if (asynccallbackinfo->info.isCallback) {
153 ANS_LOGD("NapiSetAdditionConfig callback is nullptr.");
154 return Common::NapiGetNull(env);
155 } else {
156 return promise;
157 }
158 }
159 } // namespace NotificationNapi
160 } // namespace OHOS
161