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