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