1 /*
2 * Copyright (c) 2025 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "ets_app_manager_utils.h"
17
18 #include <cstdint>
19 #include <vector>
20
21 #include "ani_common_util.h"
22 #include "ani_enum_convert.h"
23 #include "ets_error_utils.h"
24 #include "hilog_tag_wrapper.h"
25
26 namespace OHOS {
27 namespace AppManagerEts {
28 namespace {
29 constexpr const char* DATA_CLASS_NAME = "Lapplication/AppStateData/AppStateData;";
30 constexpr const char* CLASSNAME_ARRAY = "Lescompat/Array;";
31 constexpr const char* INFO_INNER_CLASS_NAME = "Lapplication/RunningMultiAppInfo/RunningMultiAppInfoInner;";
32 constexpr const char* INSTANCE_INNER_CLASS_NAME = "Lapplication/RunningMultiAppInfo/RunningMultiInstanceInfoInner;";
33 constexpr const char* CLONE_INNER_CLASS_NAME = "Lapplication/RunningMultiAppInfo/RunningAppCloneInner;";
34 constexpr const char *PROCESS_DATA_CLASS_NAME = "Lapplication/ProcessData/ProcessData;";
35 constexpr const char *MULTI_APP_MODE_ENUM_NAME = "Lapplication/MultiAppMode/MultiAppMode;";
36 } // namespace
37
WrapAppStateData(ani_env * env,const AppExecFwk::AppStateData & appStateData)38 ani_object WrapAppStateData(ani_env *env, const AppExecFwk::AppStateData &appStateData)
39 {
40 ani_class cls = nullptr;
41 ani_status status = ANI_ERROR;
42 ani_method method = nullptr;
43 ani_object object = nullptr;
44 if (env == nullptr) {
45 TAG_LOGE(AAFwkTag::APPMGR, "null env");
46 return nullptr;
47 }
48 if ((status = env->FindClass(DATA_CLASS_NAME, &cls)) != ANI_OK) {
49 TAG_LOGE(AAFwkTag::APPMGR, "status : %{public}d", status);
50 return nullptr;
51 }
52 if (cls == nullptr) {
53 TAG_LOGE(AAFwkTag::APPMGR, "null cls");
54 return nullptr;
55 }
56 if ((status = env->Class_FindMethod(cls, "<ctor>", ":V", &method)) != ANI_OK) {
57 TAG_LOGE(AAFwkTag::APPMGR, "status : %{public}d", status);
58 return nullptr;
59 }
60 if ((status = env->Object_New(cls, method, &object)) != ANI_OK) {
61 TAG_LOGE(AAFwkTag::APPMGR, "status : %{public}d", status);
62 return nullptr;
63 }
64 if (object == nullptr) {
65 TAG_LOGE(AAFwkTag::APPMGR, "null object");
66 return nullptr;
67 }
68 if (!SetAppStateData(env, object, appStateData)) {
69 TAG_LOGE(AAFwkTag::APPMGR, "SetAppStateData failed");
70 return nullptr;
71 }
72 return object;
73 }
74
SetAppStateData(ani_env * env,ani_object object,const AppExecFwk::AppStateData & appStateData)75 bool SetAppStateData(ani_env *env, ani_object object, const AppExecFwk::AppStateData &appStateData)
76 {
77 if (env == nullptr) {
78 TAG_LOGE(AAFwkTag::APPMGR, "null env");
79 return false;
80 }
81 ani_status status = ANI_OK;
82 status = env->Object_SetFieldByName_Ref(
83 object, "bundleName", OHOS::AppExecFwk::GetAniString(env, appStateData.bundleName));
84 if (status != ANI_OK) {
85 TAG_LOGE(AAFwkTag::APPMGR, "failed status:%{public}d", status);
86 return false;
87 }
88 status = env->Object_SetFieldByName_Double(object, "uid", static_cast<double>(appStateData.uid));
89 if (status != ANI_OK) {
90 TAG_LOGE(AAFwkTag::APPMGR, "failed status:%{public}d", status);
91 return false;
92 }
93 status = env->Object_SetFieldByName_Double(object, "state", static_cast<double>(appStateData.state));
94 if (status != ANI_OK) {
95 TAG_LOGE(AAFwkTag::APPMGR, "failed status:%{public}d", status);
96 return false;
97 }
98 status = env->Object_SetFieldByName_Boolean(object, "isSplitScreenMode", appStateData.isSplitScreenMode);
99 if (status != ANI_OK) {
100 TAG_LOGE(AAFwkTag::APPMGR, "failed status:%{public}d", status);
101 return false;
102 }
103 status = env->Object_SetFieldByName_Boolean(object, "isFloatingWindowMode", appStateData.isFloatingWindowMode);
104 if (status != ANI_OK) {
105 TAG_LOGE(AAFwkTag::APPMGR, "failed status:%{public}d", status);
106 return false;
107 }
108 return true;
109 }
110
CreateAppStateDataArray(ani_env * env,const std::vector<AppExecFwk::AppStateData> & data)111 ani_object CreateAppStateDataArray(ani_env *env, const std::vector<AppExecFwk::AppStateData> &data)
112 {
113 ani_class arrayCls = nullptr;
114 ani_status status = ANI_OK;
115 status = env->FindClass(CLASSNAME_ARRAY, &arrayCls);
116 if (status != ANI_OK) {
117 TAG_LOGE(AAFwkTag::APPMGR, "status : %{public}d", status);
118 return nullptr;
119 }
120
121 ani_method arrayCtor = nullptr;
122 status = env->Class_FindMethod(arrayCls, "<ctor>", "I:V", &arrayCtor);
123 if (status != ANI_OK) {
124 TAG_LOGE(AAFwkTag::APPMGR, "status : %{public}d", status);
125 return nullptr;
126 }
127
128 ani_object arrayObj = nullptr;
129 status = env->Object_New(arrayCls, arrayCtor, &arrayObj, data.size());
130 if (status != ANI_OK) {
131 TAG_LOGE(AAFwkTag::APPMGR, "status : %{public}d", status);
132 return arrayObj;
133 }
134
135 ani_size index = 0;
136 for (auto &appStateData : data) {
137 ani_ref aniData = WrapAppStateData(env, appStateData);
138 if (aniData == nullptr) {
139 TAG_LOGE(AAFwkTag::APPMGR, "null aniData");
140 break;
141 }
142 status = env->Object_CallMethodByName_Void(arrayObj, "$_set", "ILstd/core/Object;:V", index, aniData);
143 if (status != ANI_OK) {
144 TAG_LOGE(AAFwkTag::APPMGR, "status : %{public}d", status);
145 break;
146 }
147 index++;
148 }
149 return arrayObj;
150 }
151
NewArrayClass(ani_env * env,const std::vector<std::string> & data)152 ani_object NewArrayClass(ani_env *env, const std::vector<std::string> &data)
153 {
154 ani_class arrayCls = nullptr;
155 ani_status status = ANI_OK;
156 if (env == nullptr) {
157 TAG_LOGE(AAFwkTag::APPMGR, "null env");
158 return nullptr;
159 }
160 status = env->FindClass(CLASSNAME_ARRAY, &arrayCls);
161 if (status != ANI_OK) {
162 TAG_LOGE(AAFwkTag::APPMGR, "status : %{public}d", status);
163 return nullptr;
164 }
165
166 ani_method arrayCtor = nullptr;
167 status = env->Class_FindMethod(arrayCls, "<ctor>", "I:V", &arrayCtor);
168 if (status != ANI_OK) {
169 TAG_LOGE(AAFwkTag::APPMGR, "status : %{public}d", status);
170 return nullptr;
171 }
172
173 ani_object arrayObj = nullptr;
174 status = env->Object_New(arrayCls, arrayCtor, &arrayObj, data.size());
175 if (status != ANI_OK) {
176 TAG_LOGE(AAFwkTag::APPMGR, "status : %{public}d", status);
177 return arrayObj;
178 }
179
180 ani_size index = 0;
181 for (auto &item : data) {
182 ani_string aniString;
183 status = env->String_NewUTF8(item.c_str(), item.size(), &aniString);
184 if (status != ANI_OK) {
185 TAG_LOGE(AAFwkTag::APPMGR, "String_NewUTF8 failed status : %{public}d", status);
186 break;
187 }
188 status = env->Object_CallMethodByName_Void(arrayObj, "$_set", "ILstd/core/Object;:V", index, aniString);
189 if (status != ANI_OK) {
190 TAG_LOGE(AAFwkTag::APPMGR, "Object_CallMethodByName_Void failed status : %{public}d", status);
191 break;
192 }
193 index++;
194 }
195 return arrayObj;
196 }
197
CreateEmptyAniArray(ani_env * env)198 ani_object CreateEmptyAniArray(ani_env *env)
199 {
200 ani_class arrayCls = nullptr;
201 ani_status status = ANI_OK;
202
203 if (env == nullptr) {
204 TAG_LOGE(AAFwkTag::APPMGR, "null env");
205 return nullptr;
206 }
207
208 status = env->FindClass(CLASSNAME_ARRAY, &arrayCls);
209 if (status != ANI_OK) {
210 TAG_LOGE(AAFwkTag::APPMGR, "FindClass failed status : %{public}d", status);
211 return nullptr;
212 }
213
214 ani_method arrayCtor = nullptr;
215 status = env->Class_FindMethod(arrayCls, "<ctor>", ":V", &arrayCtor);
216 if (status != ANI_OK) {
217 TAG_LOGE(AAFwkTag::APPMGR, "find ctor failed status : %{public}d", status);
218 return nullptr;
219 }
220
221 ani_object arrayObj = nullptr;
222 status = env->Object_New(arrayCls, arrayCtor, &arrayObj);
223 if (status != ANI_OK) {
224 TAG_LOGE(AAFwkTag::APPMGR, "Object_New array failed status : %{public}d", status);
225 return arrayObj;
226 }
227 return arrayObj;
228 }
229
CreateEmptyMultiAppInfo(ani_env * env)230 ani_object CreateEmptyMultiAppInfo(ani_env *env)
231 {
232 ani_class cls = nullptr;
233 ani_status status = ANI_ERROR;
234 ani_method method = nullptr;
235 ani_object object = nullptr;
236 if (env == nullptr) {
237 TAG_LOGE(AAFwkTag::APPMGR, "null env");
238 return nullptr;
239 }
240 if ((status = env->FindClass(INFO_INNER_CLASS_NAME, &cls)) != ANI_OK) {
241 TAG_LOGE(AAFwkTag::APPMGR, "FindClass failed status : %{public}d", status);
242 return nullptr;
243 }
244 if (cls == nullptr) {
245 TAG_LOGE(AAFwkTag::APPMGR, "null cls");
246 return nullptr;
247 }
248 if ((status = env->Class_FindMethod(cls, "<ctor>", ":V", &method)) != ANI_OK) {
249 TAG_LOGE(AAFwkTag::APPMGR, "find ctor failed status : %{public}d", status);
250 return nullptr;
251 }
252 if ((status = env->Object_New(cls, method, &object)) != ANI_OK) {
253 TAG_LOGE(AAFwkTag::APPMGR, "Object_New failed status : %{public}d", status);
254 return nullptr;
255 }
256 if (object == nullptr) {
257 TAG_LOGE(AAFwkTag::APPMGR, "null object");
258 return nullptr;
259 }
260 return object;
261 }
262
CreateRunningMultiInstanceInfoArray(ani_env * env,const std::vector<AppExecFwk::RunningMultiInstanceInfo> & infos)263 ani_object CreateRunningMultiInstanceInfoArray(ani_env *env,
264 const std::vector<AppExecFwk::RunningMultiInstanceInfo> &infos)
265 {
266 ani_class arrayCls = nullptr;
267 ani_status status = ANI_OK;
268
269 if (env == nullptr) {
270 TAG_LOGE(AAFwkTag::APPMGR, "null env");
271 return nullptr;
272 }
273
274 status = env->FindClass(CLASSNAME_ARRAY, &arrayCls);
275 if (status != ANI_OK) {
276 TAG_LOGE(AAFwkTag::APPMGR, "status : %{public}d", status);
277 return nullptr;
278 }
279
280 ani_method arrayCtor = nullptr;
281 status = env->Class_FindMethod(arrayCls, "<ctor>", "I:V", &arrayCtor);
282 if (status != ANI_OK) {
283 TAG_LOGE(AAFwkTag::APPMGR, "status : %{public}d", status);
284 return nullptr;
285 }
286
287 ani_object arrayObj = nullptr;
288 status = env->Object_New(arrayCls, arrayCtor, &arrayObj, infos.size());
289 if (status != ANI_OK) {
290 TAG_LOGE(AAFwkTag::APPMGR, "status : %{public}d", status);
291 return arrayObj;
292 }
293
294 ani_size index = 0;
295 for (auto &instanceInfo : infos) {
296 ani_ref ani_info = WrapRunningMultiInstanceInfo(env, instanceInfo);
297 if (ani_info == nullptr) {
298 TAG_LOGE(AAFwkTag::APPMGR, "null ani_info");
299 break;
300 }
301 status = env->Object_CallMethodByName_Void(arrayObj, "$_set", "ILstd/core/Object;:V", index, ani_info);
302 if (status != ANI_OK) {
303 TAG_LOGE(AAFwkTag::APPMGR, "status : %{public}d", status);
304 break;
305 }
306 index++;
307 }
308 return arrayObj;
309 }
310
CreateRunningAppCloneArray(ani_env * env,const std::vector<AppExecFwk::RunningAppClone> & infos)311 ani_object CreateRunningAppCloneArray(ani_env *env, const std::vector<AppExecFwk::RunningAppClone> &infos)
312 {
313 ani_class arrayCls = nullptr;
314 ani_status status = ANI_OK;
315
316 if (env == nullptr) {
317 TAG_LOGE(AAFwkTag::APPMGR, "null env");
318 return nullptr;
319 }
320
321 status = env->FindClass(CLASSNAME_ARRAY, &arrayCls);
322 if (status != ANI_OK) {
323 TAG_LOGE(AAFwkTag::APPMGR, "status : %{public}d", status);
324 return nullptr;
325 }
326
327 ani_method arrayCtor = nullptr;
328 status = env->Class_FindMethod(arrayCls, "<ctor>", "I:V", &arrayCtor);
329 if (status != ANI_OK) {
330 TAG_LOGE(AAFwkTag::APPMGR, "status : %{public}d", status);
331 return nullptr;
332 }
333
334 ani_object arrayObj = nullptr;
335 status = env->Object_New(arrayCls, arrayCtor, &arrayObj, infos.size());
336 if (status != ANI_OK) {
337 TAG_LOGE(AAFwkTag::APPMGR, "status : %{public}d", status);
338 return arrayObj;
339 }
340
341 ani_size index = 0;
342 for (auto &runningAppclone : infos) {
343 ani_ref ani_info = WrapRunningAppClone(env, runningAppclone);
344 if (ani_info == nullptr) {
345 TAG_LOGE(AAFwkTag::APPMGR, "null ani_info");
346 break;
347 }
348 status = env->Object_CallMethodByName_Void(arrayObj, "$_set", "ILstd/core/Object;:V", index, ani_info);
349 if (status != ANI_OK) {
350 TAG_LOGE(AAFwkTag::APPMGR, "status : %{public}d", status);
351 break;
352 }
353 index++;
354 }
355 return arrayObj;
356 }
357
SetRunningMultiAppInfo(ani_env * env,ani_object object,const AppExecFwk::RunningMultiAppInfo & runningMultiAppInfo)358 bool SetRunningMultiAppInfo(ani_env *env, ani_object object, const AppExecFwk::RunningMultiAppInfo &runningMultiAppInfo)
359 {
360 if (env == nullptr) {
361 TAG_LOGE(AAFwkTag::APPMGR, "null env");
362 return false;
363 }
364 ani_status status = env->Object_SetPropertyByName_Ref(
365 object, "bundleName", OHOS::AppExecFwk::GetAniString(env, runningMultiAppInfo.bundleName));
366 if (status != ANI_OK) {
367 TAG_LOGE(AAFwkTag::APPMGR, "bundleName failed status:%{public}d", status);
368 return false;
369 }
370 ani_enum_item modeItem = nullptr;
371 OHOS::AAFwk::AniEnumConvertUtil::EnumConvert_NativeToEts(
372 env, MULTI_APP_MODE_ENUM_NAME, runningMultiAppInfo.mode, modeItem);
373 status = env->Object_SetPropertyByName_Ref(object, "mode", modeItem);
374 if (status != ANI_OK) {
375 TAG_LOGE(AAFwkTag::APPMGR, "mode failed status:%{public}d", status);
376 return false;
377 }
378 status = env->Object_SetPropertyByName_Ref(object,
379 "runningMultiInstances",
380 CreateRunningMultiInstanceInfoArray(env, runningMultiAppInfo.runningMultiIntanceInfos));
381 if (status != ANI_OK) {
382 TAG_LOGE(AAFwkTag::APPMGR, "runningMultiInstances failed status:%{public}d", status);
383 return false;
384 }
385 status = env->Object_SetPropertyByName_Ref(
386 object, "runningAppClones", CreateRunningAppCloneArray(env, runningMultiAppInfo.runningAppClones));
387 if (status != ANI_OK) {
388 TAG_LOGE(AAFwkTag::APPMGR, "runningAppClones failed status:%{public}d", status);
389 return false;
390 }
391 return true;
392 }
393
WrapRunningMultiAppInfo(ani_env * env,const AppExecFwk::RunningMultiAppInfo & runningMultiAppInfo)394 ani_object WrapRunningMultiAppInfo(ani_env *env, const AppExecFwk::RunningMultiAppInfo &runningMultiAppInfo)
395 {
396 ani_class cls = nullptr;
397 ani_status status = ANI_ERROR;
398 ani_method method = nullptr;
399 ani_object object = nullptr;
400 if (env == nullptr) {
401 TAG_LOGE(AAFwkTag::APPMGR, "null env");
402 return nullptr;
403 }
404 if ((status = env->FindClass(INFO_INNER_CLASS_NAME, &cls)) != ANI_OK) {
405 TAG_LOGE(AAFwkTag::APPMGR, "status : %{public}d", status);
406 return nullptr;
407 }
408 if (cls == nullptr) {
409 TAG_LOGE(AAFwkTag::APPMGR, "null cls");
410 return nullptr;
411 }
412 if ((status = env->Class_FindMethod(cls, "<ctor>", ":V", &method)) != ANI_OK) {
413 TAG_LOGE(AAFwkTag::APPMGR, "find ctor failed status : %{public}d", status);
414 return nullptr;
415 }
416 if ((status = env->Object_New(cls, method, &object)) != ANI_OK) {
417 TAG_LOGE(AAFwkTag::APPMGR, "Object_New failed status : %{public}d", status);
418 return nullptr;
419 }
420 if (object == nullptr) {
421 TAG_LOGE(AAFwkTag::APPMGR, "null object");
422 return nullptr;
423 }
424 if (!SetRunningMultiAppInfo(env, object, runningMultiAppInfo)) {
425 TAG_LOGE(AAFwkTag::APPMGR, "SetRunningMultiAppInfo failed");
426 return nullptr;
427 }
428 return object;
429 }
430
WrapRunningMultiInstanceInfo(ani_env * env,const AppExecFwk::RunningMultiInstanceInfo & instanceInfo)431 ani_object WrapRunningMultiInstanceInfo(ani_env *env, const AppExecFwk::RunningMultiInstanceInfo &instanceInfo)
432 {
433 ani_class cls = nullptr;
434 ani_status status = ANI_ERROR;
435 ani_method method = nullptr;
436 ani_object object = nullptr;
437 if (env == nullptr) {
438 TAG_LOGE(AAFwkTag::APPMGR, "null env");
439 return nullptr;
440 }
441 if ((status = env->FindClass(INSTANCE_INNER_CLASS_NAME, &cls)) != ANI_OK) {
442 TAG_LOGE(AAFwkTag::APPMGR, "status : %{public}d", status);
443 return nullptr;
444 }
445 if (cls == nullptr) {
446 TAG_LOGE(AAFwkTag::APPMGR, "null cls");
447 return nullptr;
448 }
449 if ((status = env->Class_FindMethod(cls, "<ctor>", ":V", &method)) != ANI_OK) {
450 TAG_LOGE(AAFwkTag::APPMGR, "status : %{public}d", status);
451 return nullptr;
452 }
453 if ((status = env->Object_New(cls, method, &object)) != ANI_OK) {
454 TAG_LOGE(AAFwkTag::APPMGR, "status : %{public}d", status);
455 return nullptr;
456 }
457 if (object == nullptr) {
458 TAG_LOGE(AAFwkTag::APPMGR, "null object");
459 return nullptr;
460 }
461 if (!SetRunningMultiInstanceInfo(env, object, instanceInfo)) {
462 TAG_LOGE(AAFwkTag::APPMGR, "SetRunningMultiInstanceInfo failed");
463 return nullptr;
464 }
465 return object;
466 }
467
SetRunningMultiInstanceInfo(ani_env * env,ani_object object,const AppExecFwk::RunningMultiInstanceInfo & instanceInfo)468 bool SetRunningMultiInstanceInfo(
469 ani_env *env, ani_object object, const AppExecFwk::RunningMultiInstanceInfo &instanceInfo)
470 {
471 if (env == nullptr) {
472 TAG_LOGE(AAFwkTag::APPMGR, "null env");
473 return false;
474 }
475 ani_status status = env->Object_SetPropertyByName_Ref(
476 object, "instanceKey", OHOS::AppExecFwk::GetAniString(env, instanceInfo.instanceKey));
477 if (status != ANI_OK) {
478 TAG_LOGE(AAFwkTag::APPMGR, "failed status:%{public}d", status);
479 return false;
480 }
481 return true;
482 }
483
WrapRunningAppClone(ani_env * env,const AppExecFwk::RunningAppClone & runningAppClone)484 ani_object WrapRunningAppClone(ani_env *env, const AppExecFwk::RunningAppClone &runningAppClone)
485 {
486 ani_class cls = nullptr;
487 ani_status status = ANI_ERROR;
488 ani_method method = nullptr;
489 ani_object object = nullptr;
490 if (env == nullptr) {
491 TAG_LOGE(AAFwkTag::APPMGR, "null env");
492 return nullptr;
493 }
494 if ((status = env->FindClass(CLONE_INNER_CLASS_NAME, &cls)) != ANI_OK) {
495 TAG_LOGE(AAFwkTag::APPMGR, "status : %{public}d", status);
496 return nullptr;
497 }
498 if (cls == nullptr) {
499 TAG_LOGE(AAFwkTag::APPMGR, "null cls");
500 return nullptr;
501 }
502 if ((status = env->Class_FindMethod(cls, "<ctor>", ":V", &method)) != ANI_OK) {
503 TAG_LOGE(AAFwkTag::APPMGR, "status : %{public}d", status);
504 return nullptr;
505 }
506 if ((status = env->Object_New(cls, method, &object)) != ANI_OK) {
507 TAG_LOGE(AAFwkTag::APPMGR, "status : %{public}d", status);
508 return nullptr;
509 }
510 if (object == nullptr) {
511 TAG_LOGE(AAFwkTag::APPMGR, "null object");
512 return nullptr;
513 }
514 if (!SetRunningAppClone(env, object, runningAppClone)) {
515 TAG_LOGE(AAFwkTag::APPMGR, "SetRunningAppClone failed");
516 return nullptr;
517 }
518 return object;
519 }
520
SetRunningAppClone(ani_env * env,ani_object object,const AppExecFwk::RunningAppClone & runningAppClone)521 bool SetRunningAppClone(ani_env *env, ani_object object, const AppExecFwk::RunningAppClone &runningAppClone)
522 {
523 if (env == nullptr) {
524 TAG_LOGE(AAFwkTag::APPMGR, "null env");
525 return false;
526 }
527 ani_status status = env->Object_SetPropertyByName_Double(object, "appCloneIndex", runningAppClone.appCloneIndex);
528 if (status != ANI_OK) {
529 TAG_LOGE(AAFwkTag::APPMGR, "appCloneIndex failed status:%{public}d", status);
530 return false;
531 }
532 status = env->Object_SetPropertyByName_Double(object, "uid", runningAppClone.uid);
533 if (status != ANI_OK) {
534 TAG_LOGE(AAFwkTag::APPMGR, "uid failed status:%{public}d", status);
535 return false;
536 }
537 ani_class arrayCls = nullptr;
538 status = env->FindClass(CLASSNAME_ARRAY, &arrayCls);
539 if (status != ANI_OK) {
540 TAG_LOGE(AAFwkTag::APPMGR, "find class failed status : %{public}d", status);
541 return false;
542 }
543 ani_method arrayCtor;
544 status = env->Class_FindMethod(arrayCls, "<ctor>", "I:V", &arrayCtor);
545 if (status != ANI_OK) {
546 TAG_LOGE(AAFwkTag::APPMGR, "find ctor failed status : %{public}d", status);
547 return false;
548 }
549 ani_object arrayObj;
550 status = env->Object_New(arrayCls, arrayCtor, &arrayObj, runningAppClone.pids.size());
551 if (status != ANI_OK) {
552 TAG_LOGE(AAFwkTag::APPMGR, "Object_New array failed status : %{public}d", status);
553 return false;
554 }
555 ani_size index = 0;
556 for (auto &pid : runningAppClone.pids) {
557 status = env->Object_CallMethodByName_Void(arrayObj, "$_set", "ID;:V", index, pid);
558 if (status != ANI_OK) {
559 TAG_LOGE(AAFwkTag::APPMGR, "set failed status : %{public}d", status);
560 return false;
561 }
562 index++;
563 }
564 status = env->Object_SetPropertyByName_Ref(object, "pids", arrayObj);
565 if (status != ANI_OK) {
566 TAG_LOGE(AAFwkTag::APPMGR, "pids failed status:%{public}d", status);
567 return false;
568 }
569 return true;
570 }
571
WrapProcessData(ani_env * env,const AppExecFwk::ProcessData & processData)572 ani_object WrapProcessData(ani_env *env, const AppExecFwk::ProcessData &processData)
573 {
574 ani_class cls = nullptr;
575 ani_status status = ANI_ERROR;
576 ani_method method = nullptr;
577 ani_object object = nullptr;
578 if (env == nullptr) {
579 TAG_LOGE(AAFwkTag::APPMGR, "null env");
580 return nullptr;
581 }
582 if ((status = env->FindClass(PROCESS_DATA_CLASS_NAME, &cls)) != ANI_OK) {
583 TAG_LOGE(AAFwkTag::APPMGR, "status : %{public}d", status);
584 return nullptr;
585 }
586 if (cls == nullptr) {
587 TAG_LOGE(AAFwkTag::APPMGR, "null cls");
588 return nullptr;
589 }
590 if ((status = env->Class_FindMethod(cls, "<ctor>", ":V", &method)) != ANI_OK) {
591 TAG_LOGE(AAFwkTag::APPMGR, "status : %{public}d", status);
592 return nullptr;
593 }
594 if ((status = env->Object_New(cls, method, &object)) != ANI_OK) {
595 TAG_LOGE(AAFwkTag::APPMGR, "status : %{public}d", status);
596 return nullptr;
597 }
598 if (object == nullptr) {
599 TAG_LOGE(AAFwkTag::APPMGR, "null object");
600 return nullptr;
601 }
602 if (!SetProcessData(env, object, processData)) {
603 TAG_LOGE(AAFwkTag::APPMGR, "SetProcessData failed");
604 return nullptr;
605 }
606 return object;
607 }
608
SetProcessData(ani_env * env,ani_object object,const AppExecFwk::ProcessData & processData)609 bool SetProcessData(ani_env *env, ani_object object, const AppExecFwk::ProcessData &processData)
610 {
611 if (env == nullptr) {
612 TAG_LOGE(AAFwkTag::APPMGR, "null env");
613 return false;
614 }
615 ani_status status = env->Object_SetFieldByName_Ref(
616 object, "bundleName", OHOS::AppExecFwk::GetAniString(env, processData.bundleName));
617 if (status != ANI_OK) {
618 TAG_LOGE(AAFwkTag::APPMGR, "bundleName failed status:%{public}d", status);
619 return false;
620 }
621 status = env->Object_SetFieldByName_Double(object, "pid", processData.pid);
622 if (status != ANI_OK) {
623 TAG_LOGE(AAFwkTag::APPMGR, "pid failed status:%{public}d", status);
624 return false;
625 }
626 status = env->Object_SetFieldByName_Double(object, "uid", processData.uid);
627 if (status != ANI_OK) {
628 TAG_LOGE(AAFwkTag::APPMGR, "uid failed status:%{public}d", status);
629 return false;
630 }
631 status = env->Object_SetFieldByName_Double(object, "state", static_cast<double>(processData.state));
632 if (status != ANI_OK) {
633 TAG_LOGE(AAFwkTag::APPMGR, "state failed status:%{public}d", status);
634 return false;
635 }
636 status = env->Object_SetFieldByName_Boolean(object, "isContinuousTask", processData.isContinuousTask);
637 if (status != ANI_OK) {
638 TAG_LOGE(AAFwkTag::APPMGR, "isContinuousTask failed status:%{public}d", status);
639 return false;
640 }
641 status = env->Object_SetFieldByName_Boolean(object, "isKeepAlive", processData.isKeepAlive);
642 if (status != ANI_OK) {
643 TAG_LOGE(AAFwkTag::APPMGR, "isKeepAlive failed status:%{public}d", status);
644 return false;
645 }
646 return true;
647 }
648
UnWrapArrayString(ani_env * env,ani_object arrayObj,std::vector<std::string> & stringList)649 bool UnWrapArrayString(ani_env *env, ani_object arrayObj, std::vector<std::string> &stringList)
650 {
651 if (env == nullptr || arrayObj == nullptr) {
652 TAG_LOGE(AAFwkTag::APPMGR, "env null or arrayObj null");
653 return false;
654 }
655 stringList.clear();
656 ani_size size = 0;
657 ani_status status = ANI_ERROR;
658 if ((status = env->Array_GetLength(reinterpret_cast<ani_array>(arrayObj), &size)) != ANI_OK) {
659 TAG_LOGE(AAFwkTag::APPMGR, "status : %{public}d", status);
660 return false;
661 }
662 ani_ref ref = nullptr;
663 ani_size idx = 0;
664 for (idx = 0; idx < size; idx++) {
665 if ((status = env->Array_Get_Ref(reinterpret_cast<ani_array_ref>(arrayObj), idx, &ref)) != ANI_OK) {
666 TAG_LOGE(AAFwkTag::APPMGR, "status : %{public}d, index: %{public}zu", status, idx);
667 return false;
668 }
669 std::string str = "";
670 if (!OHOS::AppExecFwk::GetStdString(env, reinterpret_cast<ani_string>(ref), str)) {
671 TAG_LOGE(AAFwkTag::JSNAPI, "GetStdString failed, index: %{public}zu", idx);
672 return false;
673 }
674 stringList.push_back(str);
675 }
676 return true;
677 }
678
CreateDoubleAniArray(ani_env * env,const std::vector<int32_t> & dataArry)679 ani_object CreateDoubleAniArray(ani_env * env, const std::vector<int32_t> &dataArry)
680 {
681 ani_class arrayCls = nullptr;
682 ani_status status = ANI_OK;
683
684 if (env == nullptr) {
685 TAG_LOGE(AAFwkTag::APPMGR, "null env");
686 return nullptr;
687 }
688
689 status = env->FindClass(CLASSNAME_ARRAY, &arrayCls);
690 if (status != ANI_OK) {
691 TAG_LOGE(AAFwkTag::APPMGR, "status : %{public}d", status);
692 return nullptr;
693 }
694
695 ani_method arrayCtor = nullptr;
696 status = env->Class_FindMethod(arrayCls, "<ctor>", "I:V", &arrayCtor);
697 if (status != ANI_OK) {
698 TAG_LOGE(AAFwkTag::APPMGR, "status : %{public}d", status);
699 return nullptr;
700 }
701
702 ani_object arrayObj = nullptr;
703 status = env->Object_New(arrayCls, arrayCtor, &arrayObj, dataArry.size());
704 if (status != ANI_OK) {
705 TAG_LOGE(AAFwkTag::APPMGR, "status : %{public}d", status);
706 return arrayObj;
707 }
708
709 for (size_t i = 0; i < dataArry.size(); i++) {
710 ani_object intObj = AppExecFwk::CreateDouble(env, static_cast<double>(dataArry[i]));
711 if (intObj == nullptr) {
712 TAG_LOGE(AAFwkTag::APPMGR, "intObj nullptr");
713 return nullptr;
714 }
715 ani_status status = env->Object_CallMethodByName_Void(arrayObj, "$_set", "ILstd/core/Object;:V", i, intObj);
716 if (status != ANI_OK) {
717 TAG_LOGE(AAFwkTag::APPMGR, "status : %{public}d", status);
718 return nullptr;
719 }
720 }
721 return arrayObj;
722 }
723 } // namespace AppManagerEts
724 } // namespace OHOS
725