• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 &params)
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