1 /*
2 * Copyright (c) 2021-2022 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 "cancel.h"
18
19 namespace OHOS {
20 namespace NotificationNapi {
21 const int IS_TEMPLATE_MAX_PARA = 2;
22
23 struct TemplateName {
24 std::string templateName = "";
25 bool support = false;
26 napi_ref callback = nullptr;
27 };
28
29 struct AsyncCallbackInfoTemplate {
30 napi_env env = nullptr;
31 napi_async_work asyncWork = nullptr;
32 TemplateName params;
33 CallbackPromiseInfo info;
34 };
35
ParseParameters(const napi_env & env,const napi_callback_info & info,TemplateName & params)36 napi_value ParseParameters(const napi_env &env, const napi_callback_info &info, TemplateName& params)
37 {
38 ANS_LOGI("enter");
39
40 size_t argc = IS_TEMPLATE_MAX_PARA;
41 napi_value argv[IS_TEMPLATE_MAX_PARA] = {nullptr};
42 napi_value thisVar = nullptr;
43 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
44 NAPI_ASSERT(env, argc <= IS_TEMPLATE_MAX_PARA, "Wrong number of arguments");
45
46 napi_valuetype valuetype = napi_undefined;
47 // argv[0]: name: string
48 NAPI_CALL(env, napi_typeof(env, argv[0], &valuetype));
49 NAPI_ASSERT(env, valuetype == napi_string, "Wrong argument type. String expected.");
50 char str[STR_MAX_SIZE] = {0};
51 size_t strLen = 0;
52 NAPI_CALL(env, napi_get_value_string_utf8(env, argv[0], str, STR_MAX_SIZE - 1, &strLen));
53 params.templateName = str;
54
55 // argv[1]: callback
56 if (argc >= IS_TEMPLATE_MAX_PARA) {
57 NAPI_CALL(env, napi_typeof(env, argv[1], &valuetype));
58 NAPI_ASSERT(env, valuetype == napi_function, "Wrong argument type. Function expected.");
59 napi_create_reference(env, argv[1], 1, ¶ms.callback);
60 }
61
62 return Common::NapiGetNull(env);
63 }
64
IsSupportTemplate(napi_env env,napi_callback_info info)65 napi_value IsSupportTemplate(napi_env env, napi_callback_info info)
66 {
67 ANS_LOGI("enter");
68
69 TemplateName params;
70 if (ParseParameters(env, info, params) == nullptr) {
71 return Common::NapiGetUndefined(env);
72 }
73
74 AsyncCallbackInfoTemplate *asyncCallbackinfo = new (std::nothrow)
75 AsyncCallbackInfoTemplate {.env = env, .asyncWork = nullptr, .params = params};
76 if (!asyncCallbackinfo) {
77 return Common::JSParaError(env, params.callback);
78 }
79 napi_value promise = nullptr;
80 Common::PaddingCallbackPromiseInfo(env, params.callback, asyncCallbackinfo->info, promise);
81
82 napi_value resourceName = nullptr;
83 napi_create_string_latin1(env, "IsSupportTemplate", NAPI_AUTO_LENGTH, &resourceName);
84 // Asynchronous function call
85 napi_create_async_work(env,
86 nullptr,
87 resourceName,
88 [](napi_env env, void *data) {
89 ANS_LOGI("IsSupportTemplate napi_create_async_work start");
90 AsyncCallbackInfoTemplate *asyncCallbackinfo = (AsyncCallbackInfoTemplate *)data;
91
92 if (asyncCallbackinfo) {
93 asyncCallbackinfo->info.errorCode = NotificationHelper::IsSupportTemplate(
94 asyncCallbackinfo->params.templateName, asyncCallbackinfo->params.support);
95 }
96 },
97 [](napi_env env, napi_status status, void *data) {
98 ANS_LOGI("IsSupportTemplate napi_create_async_work end");
99 AsyncCallbackInfoTemplate *asyncCallbackinfo = (AsyncCallbackInfoTemplate *)data;
100 if (asyncCallbackinfo) {
101 napi_value result = nullptr;
102 napi_get_boolean(env, asyncCallbackinfo->params.support, &result);
103 Common::ReturnCallbackPromise(env, asyncCallbackinfo->info, result);
104 if (asyncCallbackinfo->info.callback != nullptr) {
105 napi_delete_reference(env, asyncCallbackinfo->info.callback);
106 }
107 napi_delete_async_work(env, asyncCallbackinfo->asyncWork);
108 delete asyncCallbackinfo;
109 asyncCallbackinfo = nullptr;
110 }
111 },
112 (void *)asyncCallbackinfo,
113 &asyncCallbackinfo->asyncWork);
114
115 NAPI_CALL(env, napi_queue_async_work(env, asyncCallbackinfo->asyncWork));
116
117 if (asyncCallbackinfo->info.isCallback) {
118 return Common::NapiGetNull(env);
119 } else {
120 return promise;
121 }
122 }
123 } // namespace NotificationNapi
124 } // namespace OHOS