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