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 "js_app_overlay.h"
16
17 #include <string>
18
19 #include "app_log_wrapper.h"
20 #include "app_control_interface.h"
21 #include "bundle_mgr_interface.h"
22 #include "bundle_mgr_proxy.h"
23 #include "bundle_errors.h"
24 #include "business_error.h"
25 #include "common_func.h"
26 #include "ipc_skeleton.h"
27 #include "napi_arg.h"
28 #include "napi_constants.h"
29
30 namespace OHOS {
31 namespace AppExecFwk {
32 using namespace OHOS::AAFwk;
InnerSetOverlayEnabledExec(napi_env,OverlayCallbackInfo * callback)33 static ErrCode InnerSetOverlayEnabledExec(napi_env, OverlayCallbackInfo *callback)
34 {
35 auto overlayMgrProxy = CommonFunc::GetOverlayMgrProxy();
36 if (overlayMgrProxy == nullptr) {
37 APP_LOGE("overlayMgrProxy is null");
38 return ERROR_SYSTEM_ABILITY_NOT_FOUND;
39 }
40 ErrCode ret = ERR_OK;
41 if (callback->option == OverlayOption::OPTION_SET_OVERLAY_ENABLED_BY_BUNDLE) {
42 ret = overlayMgrProxy->SetOverlayEnabled(callback->bundleName, callback->moduleName, callback->isEnabled);
43 } else {
44 ret = overlayMgrProxy->SetOverlayEnabledForSelf(callback->moduleName, callback->isEnabled);
45 }
46 return CommonFunc::ConvertErrCode(ret);
47 }
48
SetOverlayEnabledExec(napi_env env,void * data)49 void SetOverlayEnabledExec(napi_env env, void *data)
50 {
51 OverlayCallbackInfo *overlayCallbackInfo = reinterpret_cast<OverlayCallbackInfo *>(data);
52 if (overlayCallbackInfo == nullptr) {
53 APP_LOGE("overlayCallbackInfo is null");
54 return;
55 }
56 if (overlayCallbackInfo->err == NO_ERROR) {
57 overlayCallbackInfo->err = InnerSetOverlayEnabledExec(env, overlayCallbackInfo);
58 }
59 }
60
SetOverlayEnabledComplete(napi_env env,napi_status status,void * data)61 void SetOverlayEnabledComplete(napi_env env, napi_status status, void *data)
62 {
63 OverlayCallbackInfo *overlayCallbackInfo = reinterpret_cast<OverlayCallbackInfo *>(data);
64 if (overlayCallbackInfo == nullptr) {
65 APP_LOGE("overlayCallbackInfo is null");
66 return;
67 }
68 std::unique_ptr<OverlayCallbackInfo> callbackPtr {overlayCallbackInfo};
69 napi_value result[CALLBACK_PARAM_SIZE] = {0};
70 if (overlayCallbackInfo->err == NO_ERROR) {
71 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
72 } else {
73 APP_LOGE("SetOverlayEnabledComplete err = %{public}d", overlayCallbackInfo->err);
74 result[0] = BusinessError::CreateCommonError(env, overlayCallbackInfo->err,
75 SET_OVERLAY_ENABLED_BY_BUNDLE_NAME, Constants::PERMISSION_CHANGE_OVERLAY_ENABLED_STATE);
76 }
77 CommonFunc::NapiReturnDeferred<OverlayCallbackInfo>(env, overlayCallbackInfo, result, ARGS_SIZE_ONE);
78 }
79
SetOverlayEnabled(napi_env env,napi_callback_info info)80 napi_value SetOverlayEnabled(napi_env env, napi_callback_info info)
81 {
82 APP_LOGD("NAPI SetOverlayEnabled called");
83 NapiArg args(env, info);
84 OverlayCallbackInfo *overlayCallbackInfo = new (std::nothrow) OverlayCallbackInfo(env);
85 if (overlayCallbackInfo == nullptr) {
86 APP_LOGE("overlayCallbackInfo is null");
87 return nullptr;
88 }
89 std::unique_ptr<OverlayCallbackInfo> callbackPtr {overlayCallbackInfo};
90 if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_THREE)) {
91 APP_LOGE("param count invalid");
92 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
93 return nullptr;
94 }
95 for (size_t i = 0; i < args.GetMaxArgc(); i++) {
96 napi_valuetype valueType = napi_undefined;
97 napi_typeof(env, args[i], &valueType);
98 if (i == ARGS_POS_ZERO) {
99 if (!CommonFunc::ParseString(env, args[i], overlayCallbackInfo->moduleName) ||
100 overlayCallbackInfo->moduleName.empty()) {
101 APP_LOGE("moduleName %{public}s invalid", overlayCallbackInfo->moduleName.c_str());
102 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, MODULE_NAME, TYPE_STRING);
103 return nullptr;
104 }
105 } else if (i == ARGS_POS_ONE) {
106 if (!CommonFunc::ParseBool(env, args[ARGS_POS_ONE], overlayCallbackInfo->isEnabled)) {
107 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, IS_ENABLED, TYPE_BOOLEAN);
108 return nullptr;
109 }
110 } else if (i == ARGS_POS_TWO) {
111 if (valueType == napi_function) {
112 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &overlayCallbackInfo->callback));
113 } else {
114 APP_LOGD("SetOverlayEnabled extra arg ignored");
115 }
116 } else {
117 APP_LOGE("SetOverlayEnabled arg err");
118 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
119 return nullptr;
120 }
121 }
122
123 overlayCallbackInfo->option = OverlayOption::OPTION_SET_OVERLAY_ENABLED;
124 auto promise = CommonFunc::AsyncCallNativeMethod<OverlayCallbackInfo>(
125 env, overlayCallbackInfo, SET_OVERLAY_ENABLED, SetOverlayEnabledExec, SetOverlayEnabledComplete);
126 callbackPtr.release();
127 APP_LOGD("call SetOverlayEnabled done");
128 return promise;
129 }
130
SetOverlayEnabledByBundleName(napi_env env,napi_callback_info info)131 napi_value SetOverlayEnabledByBundleName(napi_env env, napi_callback_info info)
132 {
133 APP_LOGD("NAPI SetOverlayEnabledByBundleName called");
134 NapiArg args(env, info);
135 OverlayCallbackInfo *overlayCallbackInfo = new (std::nothrow) OverlayCallbackInfo(env);
136 if (overlayCallbackInfo == nullptr) {
137 APP_LOGE("overlayCallbackInfo is null");
138 return nullptr;
139 }
140 std::unique_ptr<OverlayCallbackInfo> callbackPtr {overlayCallbackInfo};
141 if (!args.Init(ARGS_SIZE_THREE, ARGS_SIZE_FOUR)) {
142 APP_LOGE("param count invalid");
143 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
144 return nullptr;
145 }
146 for (size_t i = 0; i < args.GetMaxArgc(); i++) {
147 napi_valuetype valueType = napi_undefined;
148 napi_typeof(env, args[i], &valueType);
149 if (i == ARGS_POS_ZERO) {
150 if (!CommonFunc::ParseString(env, args[i], overlayCallbackInfo->bundleName) ||
151 overlayCallbackInfo->bundleName.empty()) {
152 APP_LOGE("bundleName %{public}s invalid", overlayCallbackInfo->bundleName.c_str());
153 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
154 return nullptr;
155 }
156 } else if (i == ARGS_POS_ONE) {
157 if (!CommonFunc::ParseString(env, args[i], overlayCallbackInfo->moduleName) ||
158 overlayCallbackInfo->moduleName.empty()) {
159 APP_LOGE("moduleName %{public}s invalid", overlayCallbackInfo->moduleName.c_str());
160 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, MODULE_NAME, TYPE_STRING);
161 return nullptr;
162 }
163 } else if (i == ARGS_POS_TWO) {
164 if (!CommonFunc::ParseBool(env, args[i], overlayCallbackInfo->isEnabled)) {
165 APP_LOGE("isEnabled is %{public}d invalid", overlayCallbackInfo->isEnabled);
166 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, IS_ENABLED, TYPE_BOOLEAN);
167 return nullptr;
168 }
169 } else if (i == ARGS_POS_THREE) {
170 if (valueType == napi_function) {
171 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &overlayCallbackInfo->callback));
172 } else {
173 APP_LOGD("SetOverlayEnabledByBundleName extra arg ignored");
174 }
175 } else {
176 APP_LOGE("SetOverlayEnabledByBundleName arg err");
177 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
178 return nullptr;
179 }
180 }
181
182 overlayCallbackInfo->option = OverlayOption::OPTION_SET_OVERLAY_ENABLED_BY_BUNDLE;
183 auto promise = CommonFunc::AsyncCallNativeMethod<OverlayCallbackInfo>(
184 env, overlayCallbackInfo, SET_OVERLAY_ENABLED_BY_BUNDLE_NAME, SetOverlayEnabledExec,
185 SetOverlayEnabledComplete);
186 callbackPtr.release();
187 APP_LOGD("call SetOverlayEnabledByBundleName done");
188 return promise;
189 }
190
InnerGetOverlayModuleInfoExec(napi_env,OverlayCallbackInfo * overlayCbInfo)191 static ErrCode InnerGetOverlayModuleInfoExec(napi_env, OverlayCallbackInfo *overlayCbInfo)
192 {
193 std::string bundleName = CommonFunc::ObtainCallingBundleName();
194 if (bundleName.empty()) {
195 APP_LOGE("obtain calling bundleName failed");
196 return ERROR_BUNDLE_SERVICE_EXCEPTION;
197 }
198
199 auto overlayMgrProxy = CommonFunc::GetOverlayMgrProxy();
200 if (overlayMgrProxy == nullptr) {
201 APP_LOGE("overlayMgrProxy is null");
202 return ERROR_SYSTEM_ABILITY_NOT_FOUND;
203 }
204
205 ErrCode ret = ERR_OK;
206 if (overlayCbInfo->option == OverlayOption::OPTION_GET_OVERLAY_MODULE_INFO) {
207 ret = overlayMgrProxy->GetOverlayModuleInfo(overlayCbInfo->moduleName,
208 overlayCbInfo->overlayModuleInfo);
209 } else if (overlayCbInfo->option == OverlayOption::OPTION_GET_OVERLAY_TARGET_MODULE_INFO) {
210 ret = overlayMgrProxy->GetTargetOverlayModuleInfo(overlayCbInfo->targetModuleName,
211 overlayCbInfo->infoVec);
212 } else if (overlayCbInfo->option == OverlayOption::OPTION_GET_OVERLAY_MODULE_INFO_BY_BUNDLE_NAME) {
213 ret = overlayMgrProxy->GetOverlayModuleInfoByBundleName(overlayCbInfo->bundleName, overlayCbInfo->moduleName,
214 overlayCbInfo->infoVec);
215 } else if (overlayCbInfo->option == OverlayOption::OPTION_GET_TARGET_OVERLAY_MODULE_INFOS_BY_BUNDLE_NAME) {
216 ret = overlayMgrProxy->GetOverlayModuleInfoForTarget(overlayCbInfo->targetBundleName,
217 overlayCbInfo->moduleName, overlayCbInfo->infoVec);
218 } else {
219 APP_LOGE("invalid overlay option");
220 return ERROR_BUNDLE_SERVICE_EXCEPTION;
221 }
222 return CommonFunc::ConvertErrCode(ret);
223 }
224
GetOverlayModuleInfoExec(napi_env env,void * data)225 void GetOverlayModuleInfoExec(napi_env env, void *data)
226 {
227 OverlayCallbackInfo *overlayCbInfo = reinterpret_cast<OverlayCallbackInfo *>(data);
228 if (overlayCbInfo == nullptr) {
229 APP_LOGE("overlayCbInfo is null");
230 return;
231 }
232 if (overlayCbInfo->err == NO_ERROR) {
233 overlayCbInfo->err = InnerGetOverlayModuleInfoExec(env, overlayCbInfo);
234 return;
235 }
236 }
237
GetOverlayModuleInfoComplete(napi_env env,napi_status status,void * data)238 void GetOverlayModuleInfoComplete(napi_env env, napi_status status, void *data)
239 {
240 OverlayCallbackInfo *overlayCallbackInfo = reinterpret_cast<OverlayCallbackInfo *>(data);
241 if (overlayCallbackInfo == nullptr) {
242 APP_LOGE("overlayCallbackInfo is null");
243 return;
244 }
245 std::unique_ptr<OverlayCallbackInfo> callbackPtr {overlayCallbackInfo};
246 napi_value result[CALLBACK_PARAM_SIZE] = {0};
247 if (overlayCallbackInfo->err == NO_ERROR) {
248 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
249 if (overlayCallbackInfo->option == OverlayOption::OPTION_GET_OVERLAY_MODULE_INFO) {
250 NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &result[ARGS_POS_ONE]));
251 CommonFunc::ConvertOverlayModuleInfo(env, overlayCallbackInfo->overlayModuleInfo, result[ARGS_POS_ONE]);
252 } else {
253 NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &result[ARGS_POS_ONE]));
254 CommonFunc::ConvertOverlayModuleInfos(env, overlayCallbackInfo->infoVec, result[ARGS_POS_ONE]);
255 }
256 } else {
257 result[ARGS_POS_ZERO] = BusinessError::CreateCommonError(env, overlayCallbackInfo->err,
258 GET_OVERLAY_MODULE_INFO_BY_BUNDLE_NAME, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
259 }
260 CommonFunc::NapiReturnDeferred<OverlayCallbackInfo>(env, overlayCallbackInfo, result, ARGS_SIZE_TWO);
261 }
262
GetOverlayModuleInfo(napi_env env,napi_callback_info info)263 napi_value GetOverlayModuleInfo(napi_env env, napi_callback_info info)
264 {
265 APP_LOGD("NAPI GetOverlayModuleInfo called");
266 NapiArg args(env, info);
267 OverlayCallbackInfo *overlayCallbackInfo = new (std::nothrow) OverlayCallbackInfo(env);
268 if (overlayCallbackInfo == nullptr) {
269 APP_LOGE("overlayCallbackInfo is null");
270 return nullptr;
271 }
272 overlayCallbackInfo->option = OverlayOption::OPTION_GET_OVERLAY_MODULE_INFO;
273 std::unique_ptr<OverlayCallbackInfo> callbackPtr {overlayCallbackInfo};
274 if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_TWO)) {
275 APP_LOGE("param count invalid");
276 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
277 return nullptr;
278 }
279 for (size_t i = 0; i < args.GetMaxArgc(); i++) {
280 napi_valuetype valueType = napi_undefined;
281 napi_typeof(env, args[i], &valueType);
282 if (i == ARGS_POS_ZERO) {
283 if (!CommonFunc::ParseString(env, args[i], overlayCallbackInfo->moduleName) ||
284 overlayCallbackInfo->moduleName.empty()) {
285 APP_LOGE("moduleName %{public}s invalid", overlayCallbackInfo->moduleName.c_str());
286 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, MODULE_NAME, TYPE_STRING);
287 return nullptr;
288 }
289 } else if (i == ARGS_POS_ONE) {
290 if (valueType == napi_function) {
291 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &overlayCallbackInfo->callback));
292 } else {
293 APP_LOGD("GetOverlayModuleInfo extra arg ignored");
294 }
295 } else {
296 APP_LOGE("GetOverlayModuleInfo arg err");
297 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
298 return nullptr;
299 }
300 }
301 auto promise = CommonFunc::AsyncCallNativeMethod<OverlayCallbackInfo>(
302 env, overlayCallbackInfo, GET_OVERLAY_MODULE_INFO, GetOverlayModuleInfoExec, GetOverlayModuleInfoComplete);
303 callbackPtr.release();
304 APP_LOGD("call GetOverlayModuleInfo done");
305 return promise;
306 }
307
GetTargetOverlayModuleInfosComplete(napi_env env,napi_status status,void * data)308 void GetTargetOverlayModuleInfosComplete(napi_env env, napi_status status, void *data)
309 {
310 OverlayCallbackInfo *overlayCallbackInfo = reinterpret_cast<OverlayCallbackInfo *>(data);
311 if (overlayCallbackInfo == nullptr) {
312 APP_LOGE("overlayCallbackInfo is null");
313 return;
314 }
315 std::unique_ptr<OverlayCallbackInfo> callbackPtr {overlayCallbackInfo};
316 napi_value result[CALLBACK_PARAM_SIZE] = {0};
317 if (overlayCallbackInfo->err == NO_ERROR) {
318 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
319 NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &result[ARGS_POS_ONE]));
320 CommonFunc::ConvertOverlayModuleInfos(env, overlayCallbackInfo->infoVec, result[ARGS_POS_ONE]);
321 } else {
322 result[ARGS_POS_ZERO] = BusinessError::CreateCommonError(env, overlayCallbackInfo->err,
323 GET_TARGET_OVERLAY_MODULE_INFOS_BY_BUNDLE_NAME, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
324 }
325 CommonFunc::NapiReturnDeferred<OverlayCallbackInfo>(env, overlayCallbackInfo, result, ARGS_SIZE_TWO);
326 }
327
GetTargetOverlayModuleInfos(napi_env env,napi_callback_info info)328 napi_value GetTargetOverlayModuleInfos(napi_env env, napi_callback_info info)
329 {
330 APP_LOGD("NAPI GetTargetOverlayModuleInfos called");
331 NapiArg args(env, info);
332 OverlayCallbackInfo *overlayCallbackInfo = new (std::nothrow) OverlayCallbackInfo(env);
333 if (overlayCallbackInfo == nullptr) {
334 APP_LOGE("overlayCallbackInfo is null");
335 return nullptr;
336 }
337 overlayCallbackInfo->option = OverlayOption::OPTION_GET_OVERLAY_TARGET_MODULE_INFO;
338 std::unique_ptr<OverlayCallbackInfo> callbackPtr {overlayCallbackInfo};
339 if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_TWO)) {
340 APP_LOGE("param count invalid");
341 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
342 return nullptr;
343 }
344 for (size_t i = 0; i < args.GetMaxArgc(); i++) {
345 napi_valuetype valueType = napi_undefined;
346 napi_typeof(env, args[i], &valueType);
347 if (i == ARGS_POS_ZERO) {
348 if (!CommonFunc::ParseString(env, args[i], overlayCallbackInfo->targetModuleName) ||
349 overlayCallbackInfo->targetModuleName.empty()) {
350 APP_LOGE("targetModuleName %{public}s invalid", overlayCallbackInfo->targetModuleName.c_str());
351 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, TARGET_MODULE_NAME, TYPE_STRING);
352 return nullptr;
353 }
354 } else if (i == ARGS_POS_ONE) {
355 if (valueType == napi_function) {
356 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &overlayCallbackInfo->callback));
357 } else {
358 APP_LOGD("GetTargetOverlayModuleInfos extra arg ignored");
359 }
360 } else {
361 APP_LOGE("GetTargetOverlayModuleInfos arg err");
362 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
363 return nullptr;
364 }
365 }
366 auto promise = CommonFunc::AsyncCallNativeMethod<OverlayCallbackInfo>(
367 env, overlayCallbackInfo, GET_TARGET_OVERLAY_MODULE_INFOS, GetOverlayModuleInfoExec,
368 GetTargetOverlayModuleInfosComplete);
369 callbackPtr.release();
370 APP_LOGD("call GetTargetOverlayModuleInfos done");
371 return promise;
372 }
373
GetOverlayModuleInfoByBundleName(napi_env env,napi_callback_info info)374 napi_value GetOverlayModuleInfoByBundleName(napi_env env, napi_callback_info info)
375 {
376 APP_LOGD("NAPI GetOverlayModuleInfoByBundleName called");
377 NapiArg args(env, info);
378 OverlayCallbackInfo *overlayCallbackInfo = new (std::nothrow) OverlayCallbackInfo(env);
379 if (overlayCallbackInfo == nullptr) {
380 APP_LOGE("overlayCallbackInfo is null");
381 return nullptr;
382 }
383 overlayCallbackInfo->option = OverlayOption::OPTION_GET_OVERLAY_MODULE_INFO_BY_BUNDLE_NAME;
384 std::unique_ptr<OverlayCallbackInfo> callbackPtr {overlayCallbackInfo};
385 if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_THREE)) {
386 APP_LOGE("param count invalid");
387 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
388 return nullptr;
389 }
390 for (size_t i = 0; i < args.GetMaxArgc(); i++) {
391 napi_valuetype valueType = napi_undefined;
392 napi_typeof(env, args[i], &valueType);
393 if (i == ARGS_POS_ZERO) {
394 if (!CommonFunc::ParseString(env, args[i], overlayCallbackInfo->bundleName) ||
395 overlayCallbackInfo->bundleName.empty()) {
396 APP_LOGE("bundleName %{public}s invalid", overlayCallbackInfo->bundleName.c_str());
397 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
398 return nullptr;
399 }
400 } else if (i == ARGS_POS_ONE) {
401 if (valueType == napi_function) {
402 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &overlayCallbackInfo->callback));
403 break;
404 }
405 if (!CommonFunc::ParseString(env, args[i], overlayCallbackInfo->moduleName)) {
406 APP_LOGW("Parse moduleName error, default query for all module OverlayModuleInfo");
407 }
408 } else if (i == ARGS_POS_TWO) {
409 if (valueType == napi_function) {
410 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &overlayCallbackInfo->callback));
411 break;
412 }
413 } else {
414 APP_LOGE("GetOverlayModuleInfoByBundleName arg err");
415 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
416 return nullptr;
417 }
418 }
419
420 auto promise = CommonFunc::AsyncCallNativeMethod<OverlayCallbackInfo>(
421 env, overlayCallbackInfo, GET_OVERLAY_MODULE_INFO_BY_BUNDLE_NAME, GetOverlayModuleInfoExec,
422 GetOverlayModuleInfoComplete);
423 callbackPtr.release();
424 APP_LOGD("call GetOverlayModuleInfoByBundleName done");
425 return promise;
426 }
427
GetTargetOverlayModuleInfosByBundleName(napi_env env,napi_callback_info info)428 napi_value GetTargetOverlayModuleInfosByBundleName(napi_env env, napi_callback_info info)
429 {
430 APP_LOGD("NAPI GetTargetOverlayModuleInfosByBundleName called");
431 NapiArg args(env, info);
432 OverlayCallbackInfo *overlayCallbackInfo = new (std::nothrow) OverlayCallbackInfo(env);
433 if (overlayCallbackInfo == nullptr) {
434 APP_LOGE("overlayCallbackInfo is null");
435 return nullptr;
436 }
437 overlayCallbackInfo->option = OverlayOption::OPTION_GET_TARGET_OVERLAY_MODULE_INFOS_BY_BUNDLE_NAME;
438 std::unique_ptr<OverlayCallbackInfo> callbackPtr {overlayCallbackInfo};
439 if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_THREE)) {
440 APP_LOGE("param count invalid");
441 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
442 return nullptr;
443 }
444 for (size_t i = 0; i < args.GetMaxArgc(); i++) {
445 napi_valuetype valueType = napi_undefined;
446 napi_typeof(env, args[i], &valueType);
447 if (i == ARGS_POS_ZERO) {
448 if (!CommonFunc::ParseString(env, args[i], overlayCallbackInfo->targetBundleName) ||
449 overlayCallbackInfo->targetBundleName.empty()) {
450 APP_LOGE("targetBundleName %{public}s invalid", overlayCallbackInfo->targetBundleName.c_str());
451 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, TARGET_BUNDLE_NAME, TYPE_STRING);
452 return nullptr;
453 }
454 } else if (i == ARGS_POS_ONE) {
455 if (valueType == napi_function) {
456 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &overlayCallbackInfo->callback));
457 break;
458 }
459 if (!CommonFunc::ParseString(env, args[i], overlayCallbackInfo->moduleName)) {
460 APP_LOGW("Parse moduleName error, default query for all module OverlayModuleInfo");
461 }
462 } else if (i == ARGS_POS_TWO) {
463 if (valueType == napi_function) {
464 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &overlayCallbackInfo->callback));
465 break;
466 }
467 } else {
468 APP_LOGE("GetTargetOverlayModuleInfosByBundleName arg err");
469 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
470 return nullptr;
471 }
472 }
473 auto promise = CommonFunc::AsyncCallNativeMethod<OverlayCallbackInfo>(
474 env, overlayCallbackInfo, GET_TARGET_OVERLAY_MODULE_INFOS_BY_BUNDLE_NAME, GetOverlayModuleInfoExec,
475 GetTargetOverlayModuleInfosComplete);
476 callbackPtr.release();
477 APP_LOGD("call GetTargetOverlayModuleInfosByBundleName done");
478 return promise;
479 }
480 } // AppExecFwk
481 } // OHOS