1 /*
2 * Copyright (c) 2021-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
16 #include "ans_template.h"
17 #include "ans_inner_errors.h"
18
19 namespace OHOS {
20 namespace NotificationNapi {
21 const int IS_TEMPLATE_MAX_PARA = 2;
22
ParseParameters(const napi_env & env,const napi_callback_info & info,TemplateName & params)23 napi_value ParseParameters(const napi_env &env, const napi_callback_info &info, TemplateName& params)
24 {
25 ANS_LOGD("enter");
26
27 size_t argc = IS_TEMPLATE_MAX_PARA;
28 napi_value argv[IS_TEMPLATE_MAX_PARA] = {nullptr};
29 napi_value thisVar = nullptr;
30 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
31 if (argc < IS_TEMPLATE_MAX_PARA - 1) {
32 ANS_LOGE("Wrong number of arguments");
33 Common::NapiThrow(env, ERROR_PARAM_INVALID, MANDATORY_PARAMETER_ARE_LEFT_UNSPECIFIED);
34 return nullptr;
35 }
36
37 napi_valuetype valuetype = napi_undefined;
38 // argv[0]: name: string
39 NAPI_CALL(env, napi_typeof(env, argv[0], &valuetype));
40 if (valuetype != napi_string && valuetype != napi_number && valuetype != napi_boolean) {
41 ANS_LOGE("Wrong argument type. String number boolean expected.");
42 std::string msg = "Incorrect parameter types.The type of param must be string or number or boolean.";
43 Common::NapiThrow(env, ERROR_PARAM_INVALID, msg);
44 return nullptr;
45 }
46 if (valuetype == napi_string) {
47 char str[STR_MAX_SIZE] = {0};
48 size_t strLen = 0;
49 NAPI_CALL(env, napi_get_value_string_utf8(env, argv[0], str, STR_MAX_SIZE - 1, &strLen));
50 params.templateName = str;
51 } else if (valuetype == napi_number) {
52 int64_t number = 0;
53 NAPI_CALL(env, napi_get_value_int64(env, argv[0], &number));
54 params.templateName = std::to_string(number);
55 } else {
56 bool result = false;
57 NAPI_CALL(env, napi_get_value_bool(env, argv[0], &result));
58 params.templateName = std::to_string(result);
59 }
60
61 // argv[1]: callback
62 if (argc >= IS_TEMPLATE_MAX_PARA) {
63 NAPI_CALL(env, napi_typeof(env, argv[1], &valuetype));
64 if (valuetype != napi_function) {
65 ANS_LOGE("Callback is not function excute promise.");
66 return Common::NapiGetNull(env);
67 }
68 napi_create_reference(env, argv[1], 1, ¶ms.callback);
69 }
70
71 return Common::NapiGetNull(env);
72 }
73
IsSupportTemplate(napi_env env,napi_callback_info info)74 napi_value IsSupportTemplate(napi_env env, napi_callback_info info)
75 {
76 ANS_LOGD("enter");
77
78 TemplateName params;
79 if (ParseParameters(env, info, params) == nullptr) {
80 return Common::NapiGetUndefined(env);
81 }
82
83 AsyncCallbackInfoTemplate *asyncCallbackinfo = new (std::nothrow)
84 AsyncCallbackInfoTemplate {.env = env, .asyncWork = nullptr, .params = params};
85 if (!asyncCallbackinfo) {
86 ANS_LOGD("AsyncCallbackinfo is nullptr.");
87 return Common::JSParaError(env, params.callback);
88 }
89 napi_value promise = nullptr;
90 Common::PaddingCallbackPromiseInfo(env, params.callback, asyncCallbackinfo->info, promise);
91
92 ANS_LOGD("Create isSupportTemplate string.");
93 napi_value resourceName = nullptr;
94 napi_create_string_latin1(env, "IsSupportTemplate", NAPI_AUTO_LENGTH, &resourceName);
95 // Async function call
96 napi_create_async_work(env,
97 nullptr,
98 resourceName,
99 [](napi_env env, void *data) {
100 ANS_LOGI("Excute create async IsSupportTemplate");
101 AsyncCallbackInfoTemplate *asyncCallbackinfo = static_cast<AsyncCallbackInfoTemplate *>(data);
102
103 if (asyncCallbackinfo) {
104 asyncCallbackinfo->info.errorCode = NotificationHelper::IsSupportTemplate(
105 asyncCallbackinfo->params.templateName, asyncCallbackinfo->params.support);
106 }
107 },
108 [](napi_env env, napi_status status, void *data) {
109 ANS_LOGI("Complete create async IsSupportTemplate");
110 AsyncCallbackInfoTemplate *asyncCallbackinfo = static_cast<AsyncCallbackInfoTemplate *>(data);
111 if (asyncCallbackinfo) {
112 napi_value result = nullptr;
113 napi_get_boolean(env, asyncCallbackinfo->params.support, &result);
114 Common::ReturnCallbackPromise(env, asyncCallbackinfo->info, result);
115 if (asyncCallbackinfo->info.callback != nullptr) {
116 ANS_LOGD("Delete isSupportTemplate callback reference.");
117 napi_delete_reference(env, asyncCallbackinfo->info.callback);
118 }
119 napi_delete_async_work(env, asyncCallbackinfo->asyncWork);
120 delete asyncCallbackinfo;
121 asyncCallbackinfo = nullptr;
122 }
123 },
124 (void *)asyncCallbackinfo,
125 &asyncCallbackinfo->asyncWork);
126
127 napi_queue_async_work_with_qos(env, asyncCallbackinfo->asyncWork, napi_qos_user_initiated);
128
129 if (asyncCallbackinfo->info.isCallback) {
130 return Common::NapiGetNull(env);
131 } else {
132 return promise;
133 }
134 }
135 } // namespace NotificationNapi
136 } // namespace OHOS