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 #include "ani_utils.h"
16
17 #include "accesstoken_common_log.h"
18
19 namespace OHOS {
20 namespace Security {
21 namespace AccessToken {
AniFindNameSpace(ani_env * env,const std::string & namespaceDescriptor,ani_namespace & out)22 bool AniFindNameSpace(ani_env* env, const std::string& namespaceDescriptor, ani_namespace& out)
23 {
24 if (env == nullptr) {
25 LOGE(ATM_DOMAIN, ATM_TAG, "Env is null.");
26 return false;
27 }
28
29 if (env->FindNamespace(namespaceDescriptor.c_str(), &out) != ANI_OK) {
30 LOGE(ATM_DOMAIN, ATM_TAG, "Failed to FindNamespace!");
31 return false;
32 }
33 return true;
34 }
35
AniFindClass(ani_env * env,const std::string & classDescriptor,ani_class & out)36 bool AniFindClass(ani_env* env, const std::string& classDescriptor, ani_class& out)
37 {
38 if (env == nullptr) {
39 LOGE(ATM_DOMAIN, ATM_TAG, "Env is null.");
40 return false;
41 }
42
43 if (env->FindClass(classDescriptor.c_str(), &out) != ANI_OK) {
44 LOGE(ATM_DOMAIN, ATM_TAG, "Failed to FindClass(%{public}s).", classDescriptor.c_str());
45 return false;
46 }
47 return true;
48 }
49
AniClassFindMethod(ani_env * env,const ani_class & aniClass,const std::string & methodDescriptor,const std::string & signature,ani_method & out)50 bool AniClassFindMethod(
51 ani_env* env, const ani_class& aniClass, const std::string& methodDescriptor,
52 const std::string& signature, ani_method& out)
53 {
54 if (env == nullptr) {
55 LOGE(ATM_DOMAIN, ATM_TAG, "Env is null.");
56 return false;
57 }
58
59 if (env->Class_FindMethod(aniClass, methodDescriptor.c_str(), signature.c_str(), &out) != ANI_OK) {
60 LOGE(ATM_DOMAIN, ATM_TAG, "Failed to Class_FindMethod!");
61 return false;
62 }
63 return true;
64 }
65
AniClassFindField(ani_env * env,const ani_class & aniClass,const char * fieldName,ani_field & out)66 bool AniClassFindField(ani_env* env, const ani_class& aniClass, const char* fieldName, ani_field& out)
67 {
68 if (env == nullptr) {
69 LOGE(ATM_DOMAIN, ATM_TAG, "Env is null.");
70 return false;
71 }
72
73 if (env->Class_FindField(aniClass, fieldName, &out) != ANI_OK) {
74 LOGE(ATM_DOMAIN, ATM_TAG, "Class_FindField failed!");
75 return false;
76 }
77 return true;
78 }
79
AniParseUint32(ani_env * env,const ani_ref & aniInt,uint32_t & out)80 bool AniParseUint32(ani_env* env, const ani_ref& aniInt, uint32_t& out)
81 {
82 if (env == nullptr) {
83 LOGE(ATM_DOMAIN, ATM_TAG, "Env is null.");
84 return false;
85 }
86
87 ani_int tmp;
88 ani_status status;
89 if ((status = env->Object_CallMethodByName_Int(
90 static_cast<ani_object>(aniInt), "unboxed", nullptr, &tmp)) != ANI_OK) {
91 LOGE(ATM_DOMAIN, ATM_TAG, "Object_CallMethodByName_Int failed! %{public}d", status);
92 return false;
93 }
94
95 out = static_cast<uint32_t>(tmp);
96 return true;
97 }
98
AniParseAccessTokenIDArray(ani_env * env,const ani_array_ref & array,std::vector<uint32_t> & out)99 bool AniParseAccessTokenIDArray(ani_env* env, const ani_array_ref& array, std::vector<uint32_t>& out)
100 {
101 if (env == nullptr) {
102 LOGE(ATM_DOMAIN, ATM_TAG, "Env is null.");
103 return false;
104 }
105
106 ani_size size;
107 if (env->Array_GetLength(array, &size) != ANI_OK) {
108 LOGE(ATM_DOMAIN, ATM_TAG, "Failed to Array_GetLength!");
109 return false;
110 }
111
112 for (ani_size i = 0; i < size; ++i) {
113 ani_ref elementRef;
114 if (env->Array_Get_Ref(array, i, &elementRef) != ANI_OK) {
115 LOGE(ATM_DOMAIN, ATM_TAG, "Failed to Array_Get_Ref at index %{public}zu!", i);
116 return false;
117 }
118 uint32_t value;
119 if (!AniParseUint32(env, elementRef, value)) {
120 return false;
121 }
122 if (value == 0) {
123 return false;
124 }
125 out.emplace_back(value);
126 }
127 return true;
128 }
129
ParseAniStringVector(ani_env * env,const ani_array_ref & aniStrArr)130 std::vector<std::string> ParseAniStringVector(ani_env* env, const ani_array_ref& aniStrArr)
131 {
132 std::vector<std::string> out;
133 if (env == nullptr) {
134 LOGE(ATM_DOMAIN, ATM_TAG, "Env is null.");
135 return out;
136 }
137 ani_size size = 0;
138 if (env->Array_GetLength(aniStrArr, &size) != ANI_OK) {
139 LOGE(ATM_DOMAIN, ATM_TAG, "Failed to Array_GetLength!");
140 return out;
141 }
142
143 for (ani_size i = 0; i < size; ++i) {
144 ani_ref aniRef;
145 if (env->Array_Get_Ref(aniStrArr, i, &aniRef) != ANI_OK) {
146 LOGE(ATM_DOMAIN, ATM_TAG, "Failed to Array_Get_Ref!");
147 return out;
148 }
149
150 std::string stdStr = ParseAniString(env, static_cast<ani_string>(aniRef));
151 if (!stdStr.empty()) {
152 out.emplace_back(stdStr);
153 }
154 }
155 return out;
156 }
157
AniParseCallback(ani_env * env,const ani_ref & aniCallback,ani_ref & out)158 bool AniParseCallback(ani_env* env, const ani_ref& aniCallback, ani_ref& out)
159 {
160 if (env == nullptr) {
161 LOGE(ATM_DOMAIN, ATM_TAG, "Env is null.");
162 return false;
163 }
164
165 if (env->GlobalReference_Create(aniCallback, &out) != ANI_OK) {
166 LOGE(ATM_DOMAIN, ATM_TAG, "Failed to GlobalReference_Create!");
167 return false;
168 }
169 return true;
170 }
171
AniIsRefUndefined(ani_env * env,const ani_ref & ref)172 bool AniIsRefUndefined(ani_env* env, const ani_ref& ref)
173 {
174 if (env == nullptr) {
175 LOGE(ATM_DOMAIN, ATM_TAG, "Env is null.");
176 return false;
177 }
178
179 ani_boolean isUnd;
180 if (env->Reference_IsUndefined(ref, &isUnd) != ANI_OK) {
181 LOGE(ATM_DOMAIN, ATM_TAG, "Failed to Reference_IsUndefined!");
182 return false;
183 }
184 return isUnd ? true : false;
185 }
186
CreateAniString(ani_env * env,const std::string & str)187 ani_string CreateAniString(ani_env* env, const std::string& str)
188 {
189 ani_string aniStr = {};
190 if (env == nullptr) {
191 LOGE(ATM_DOMAIN, ATM_TAG, "Env is null.");
192 return aniStr;
193 }
194
195 if (env->String_NewUTF8(str.c_str(), str.size(), &aniStr) != ANI_OK) {
196 LOGE(ATM_DOMAIN, ATM_TAG, "Failed to String_NewUTF8!");
197 return aniStr;
198 }
199 return aniStr;
200 }
201
IsCurrentThread(std::thread::id threadId)202 bool IsCurrentThread(std::thread::id threadId)
203 {
204 return threadId == std::this_thread::get_id();
205 }
206
AniIsCallbackRefEqual(ani_env * env,const ani_ref & compareRef,const ani_ref & targetRref,std::thread::id threadId,bool & isEqual)207 bool AniIsCallbackRefEqual(ani_env* env, const ani_ref& compareRef, const ani_ref& targetRref, std::thread::id threadId,
208 bool& isEqual)
209 {
210 if (env == nullptr) {
211 LOGE(ATM_DOMAIN, ATM_TAG, "Env is null.");
212 return false;
213 }
214
215 if (!IsCurrentThread(threadId)) {
216 return false;
217 }
218
219 ani_boolean isEq = false;
220 if (env->Reference_StrictEquals(compareRef, targetRref, &isEq) != ANI_OK) {
221 LOGE(ATM_DOMAIN, ATM_TAG, "Failed to Reference_StrictEquals.");
222 return false;
223 }
224 isEqual = isEq ? true : false;
225 return true;
226 }
227
AniFunctionalObjectCall(ani_env * env,const ani_fn_object & fn,ani_size size,ani_ref * argv,ani_ref & result)228 bool AniFunctionalObjectCall(ani_env* env, const ani_fn_object& fn, ani_size size, ani_ref* argv, ani_ref& result)
229 {
230 if (env == nullptr) {
231 LOGE(ATM_DOMAIN, ATM_TAG, "Env is null.");
232 return false;
233 }
234
235 if (env->FunctionalObject_Call(fn, size, argv, &result) != ANI_OK) {
236 LOGE(ATM_DOMAIN, ATM_TAG, "Failed to AniFunctionalObjectCall.");
237 return false;
238 }
239 return true;
240 }
241
ParseAniString(ani_env * env,const ani_string & aniStr)242 std::string ParseAniString(ani_env* env, const ani_string& aniStr)
243 {
244 if (env == nullptr) {
245 LOGE(ATM_DOMAIN, ATM_TAG, "Env is null.");
246 return "";
247 }
248
249 ani_size strSize;
250 if (env->String_GetUTF8Size(aniStr, &strSize) != ANI_OK) {
251 LOGE(ATM_DOMAIN, ATM_TAG, "Failed to String_GetUTF8Size.");
252 return "";
253 }
254 std::vector<char> buffer(strSize + 1);
255 char* utf8Buffer = buffer.data();
256 ani_size bytesWritten = 0;
257 if (env->String_GetUTF8(aniStr, utf8Buffer, strSize + 1, &bytesWritten) != ANI_OK) {
258 LOGE(ATM_DOMAIN, ATM_TAG, "Failed to String_GetUTF8.");
259 return "";
260 }
261
262 utf8Buffer[bytesWritten] = '\0';
263 std::string content = std::string(utf8Buffer);
264 return content;
265 }
266
CreateAniArrayString(ani_env * env,const std::vector<std::string> & cArray)267 ani_ref CreateAniArrayString(ani_env* env, const std::vector<std::string>& cArray)
268 {
269 if (env == nullptr) {
270 LOGE(ATM_DOMAIN, ATM_TAG, "Env is null.");
271 return nullptr;
272 }
273
274 ani_size length = cArray.size();
275 ani_array_ref aArrayRef = nullptr;
276 ani_class aStringcls = nullptr;
277 if (env->FindClass("Lstd/core/String;", &aStringcls) != ANI_OK) {
278 LOGE(ATM_DOMAIN, ATM_TAG, "Failed to FindClass String.");
279 return nullptr;
280 }
281 ani_ref undefinedRef = nullptr;
282 if (ANI_OK != env->GetUndefined(&undefinedRef)) {
283 LOGE(ATM_DOMAIN, ATM_TAG, "Failed to GetUndefined.");
284 return nullptr;
285 }
286 if (env->Array_New_Ref(aStringcls, length, undefinedRef, &aArrayRef) != ANI_OK) {
287 LOGE(ATM_DOMAIN, ATM_TAG, "Failed to Array_New_Ref.");
288 return nullptr;
289 }
290 ani_string aString = nullptr;
291 for (ani_size i = 0; i < length; ++i) {
292 env->String_NewUTF8(cArray[i].c_str(), cArray[i].size(), &aString);
293 env->Array_Set_Ref(aArrayRef, i, aString);
294 }
295 ani_ref aRef = nullptr;
296 if (env->GlobalReference_Create(aArrayRef, &aRef) != ANI_OK) {
297 LOGE(ATM_DOMAIN, ATM_TAG, "Failed to GlobalReference_Create.");
298 return nullptr;
299 }
300 return aRef;
301 }
302
CreateAniArrayInt(ani_env * env,const std::vector<int32_t> & cArray)303 ani_ref CreateAniArrayInt(ani_env* env, const std::vector<int32_t>& cArray)
304 {
305 if (env == nullptr) {
306 LOGE(ATM_DOMAIN, ATM_TAG, "Env is null.");
307 return nullptr;
308 }
309
310 ani_size length = cArray.size();
311 ani_array_int aArrayInt = nullptr;
312 if (env->Array_New_Int(length, &aArrayInt) != ANI_OK) {
313 LOGE(ATM_DOMAIN, ATM_TAG, "Failed to Array_New_Int.");
314 return nullptr;
315 }
316 for (ani_size i = 0; i < length; ++i) {
317 env->Array_SetRegion_Int(aArrayInt, i, length, &cArray[i]);
318 }
319 ani_ref aRef = nullptr;
320 if (env->GlobalReference_Create(aArrayInt, &aRef) != ANI_OK) {
321 LOGE(ATM_DOMAIN, ATM_TAG, "Failed to GlobalReference_Create.");
322 return nullptr;
323 }
324 return aRef;
325 }
326
CreateAniArrayBool(ani_env * env,const std::vector<bool> & cArray)327 ani_ref CreateAniArrayBool(ani_env* env, const std::vector<bool>& cArray)
328 {
329 if (env == nullptr) {
330 LOGE(ATM_DOMAIN, ATM_TAG, "Env is null.");
331 return nullptr;
332 }
333
334 ani_size length = cArray.size();
335 ani_array_boolean aArrayBool = nullptr;
336 if (env->Array_New_Boolean(length, &aArrayBool) != ANI_OK) {
337 LOGE(ATM_DOMAIN, ATM_TAG, "Failed to Array_New_Boolean.");
338 return nullptr;
339 }
340 std::vector<ani_boolean> boolArray(length);
341 for (ani_size i = 0; i < length; ++i) {
342 boolArray[i] = cArray[i];
343 }
344 for (ani_size i = 0; i < length; ++i) {
345 env->Array_SetRegion_Boolean(aArrayBool, i, length, &boolArray[i]);
346 }
347 ani_ref aRef = nullptr;
348 if (env->GlobalReference_Create(aArrayBool, &aRef) != ANI_OK) {
349 LOGE(ATM_DOMAIN, ATM_TAG, "Failed to GlobalReference_Create.");
350 return nullptr;
351 }
352 return aRef;
353 }
354
DeleteReference(ani_env * env,ani_ref & ref)355 void DeleteReference(ani_env* env, ani_ref& ref)
356 {
357 if (env == nullptr) {
358 LOGE(ATM_DOMAIN, ATM_TAG, "Env is null.");
359 ref = nullptr;
360 return;
361 }
362
363 if (ref != nullptr) {
364 env->GlobalReference_Delete(ref);
365 ref = nullptr;
366 }
367 }
368
CreateBooleanObject(ani_env * env,bool value)369 ani_object CreateBooleanObject(ani_env* env, bool value)
370 {
371 if (env == nullptr) {
372 LOGE(ATM_DOMAIN, ATM_TAG, "Env is null.");
373 return nullptr;
374 }
375
376 ani_class persionCls;
377 ani_status status = ANI_ERROR;
378 if ((status = env->FindClass("Lstd/core/Boolean;", &persionCls)) != ANI_OK) {
379 LOGE(ATM_DOMAIN, ATM_TAG, "Failed to FindClass, status : %{public}d.", static_cast<int32_t>(status));
380 return nullptr;
381 }
382 ani_method personInfoCtor;
383 if ((status = env->Class_FindMethod(persionCls, "<ctor>", "Z:V", &personInfoCtor)) != ANI_OK) {
384 LOGE(ATM_DOMAIN, ATM_TAG, "Failed to FindMethod, status : %{public}d.", static_cast<int32_t>(status));
385 return nullptr;
386 }
387 ani_object personInfoObj;
388 if ((status = env->Object_New(persionCls, personInfoCtor, &personInfoObj, value)) != ANI_OK) {
389 LOGE(ATM_DOMAIN, ATM_TAG, "Failed to Object_New, status : %{public}d.", static_cast<int32_t>(status));
390 return nullptr;
391 }
392 return personInfoObj;
393 }
394
CreateIntObject(ani_env * env,int32_t value)395 ani_object CreateIntObject(ani_env* env, int32_t value)
396 {
397 if (env == nullptr) {
398 LOGE(ATM_DOMAIN, ATM_TAG, "Env is null.");
399 return nullptr;
400 }
401
402 ani_class persionCls;
403 ani_status status = ANI_ERROR;
404 if ((status = env->FindClass("Lstd/core/Int;", &persionCls)) != ANI_OK) {
405 LOGE(ATM_DOMAIN, ATM_TAG, "Failed to FindClass, status : %{public}d.", static_cast<int32_t>(status));
406 return nullptr;
407 }
408 ani_method aniMethod;
409 if ((status = env->Class_FindMethod(persionCls, "<ctor>", "I:V", &aniMethod)) != ANI_OK) {
410 LOGE(ATM_DOMAIN, ATM_TAG, "Failed to FindMethod, status : %{public}d.", static_cast<int32_t>(status));
411 return nullptr;
412 }
413 ani_object aniObject;
414 if ((status = env->Object_New(persionCls, aniMethod, &aniObject, value)) != ANI_OK) {
415 LOGE(ATM_DOMAIN, ATM_TAG, "Failed to Object_New, status : %{public}d.", static_cast<int32_t>(status));
416 return nullptr;
417 }
418 return aniObject;
419 }
420
CreateClassObject(ani_env * env,const std::string & classDescriptor)421 ani_object CreateClassObject(ani_env* env, const std::string& classDescriptor)
422 {
423 if (env == nullptr) {
424 LOGE(ATM_DOMAIN, ATM_TAG, "Env is null.");
425 return nullptr;
426 }
427
428 ani_class aniClass;
429 ani_status status = ANI_ERROR;
430 if ((status = env->FindClass(classDescriptor.c_str(), &aniClass)) != ANI_OK) {
431 LOGE(ATM_DOMAIN, ATM_TAG, "Failed to FindClass, status : %{public}d.", static_cast<int32_t>(status));
432 return nullptr;
433 }
434 ani_method aniMethod;
435 status = env->Class_FindMethod(aniClass, "<ctor>", ":V", &aniMethod);
436 if (status != ANI_OK) {
437 LOGE(ATM_DOMAIN, ATM_TAG, "Failed to Class_FindMethod, status: %{public}d!", status);
438 return nullptr;
439 }
440 ani_object out;
441 status = env->Object_New(aniClass, aniMethod, &out);
442 if (status != ANI_OK) {
443 LOGE(ATM_DOMAIN, ATM_TAG, "Failed to Object_New, status %{public}d!", status);
444 return nullptr;
445 }
446 return out;
447 }
448
CreateArrayObject(ani_env * env,uint32_t length)449 ani_object CreateArrayObject(ani_env* env, uint32_t length)
450 {
451 if (env == nullptr) {
452 LOGE(ATM_DOMAIN, ATM_TAG, "Env is null.");
453 return nullptr;
454 }
455
456 ani_class aniClass;
457 if (!AniFindClass(env, "Lescompat/Array;", aniClass)) {
458 return nullptr;
459 }
460 ani_method aniMethod;
461 ani_status status = env->Class_FindMethod(aniClass, "<ctor>", "I:V", &aniMethod);
462 if (status != ANI_OK) {
463 LOGE(ATM_DOMAIN, ATM_TAG, "Failed to FindMethod, status: %{public}d!", status);
464 return nullptr;
465 }
466 ani_object out;
467 status = env->Object_New(aniClass, aniMethod, &out, length);
468 if (status != ANI_OK) {
469 LOGE(ATM_DOMAIN, ATM_TAG, "Failed to Object_New(size: %{public}d), status %{public}d!", length, status);
470 return nullptr;
471 }
472 return out;
473 }
474
GetBoolProperty(ani_env * env,const ani_object & object,const std::string & property,bool & value)475 bool GetBoolProperty(ani_env* env, const ani_object& object, const std::string& property, bool& value)
476 {
477 if (env == nullptr) {
478 LOGE(ATM_DOMAIN, ATM_TAG, "Env is null.");
479 return false;
480 }
481
482 ani_ref ref;
483 ani_status status = env->Object_GetPropertyByName_Ref(object, property.c_str(), &ref);
484 if (status != ANI_OK) {
485 LOGE(ATM_DOMAIN, ATM_TAG, "Failed to get property(%{public}s), status: %{public}d!",
486 property.c_str(), status);
487 return false;
488 }
489 if (AniIsRefUndefined(env, ref)) {
490 return true;
491 }
492
493 ani_boolean boolValue;
494 if (env->Object_CallMethodByName_Boolean(static_cast<ani_object>(ref), "unboxed", nullptr, &boolValue) != ANI_OK) {
495 LOGE(ATM_DOMAIN, ATM_TAG, "Failed to get bool value of property(%{public}s).", property.c_str());
496 return false;
497 }
498 value = static_cast<bool>(boolValue);
499 return true;
500 }
501
GetIntProperty(ani_env * env,const ani_object & object,const std::string & property,int32_t & value)502 bool GetIntProperty(ani_env* env, const ani_object& object, const std::string& property, int32_t& value)
503 {
504 if (env == nullptr) {
505 LOGE(ATM_DOMAIN, ATM_TAG, "Env is null.");
506 return false;
507 }
508
509 ani_ref ref;
510 ani_status status = env->Object_GetPropertyByName_Ref(object, property.c_str(), &ref);
511 if (status != ANI_OK) {
512 LOGE(ATM_DOMAIN, ATM_TAG, "Failed to get property(%{public}s), status: %{public}d.",
513 property.c_str(), static_cast<int32_t>(status));
514 return false;
515 }
516 if (AniIsRefUndefined(env, ref)) {
517 LOGI(ATM_DOMAIN, ATM_TAG, "Property(%{public}s) is undefined!", property.c_str());
518 return true;
519 }
520
521 ani_int intValue;
522 status = env->Object_CallMethodByName_Int(static_cast<ani_object>(ref), "unboxed", nullptr, &intValue);
523 if (status != ANI_OK) {
524 LOGE(ATM_DOMAIN, ATM_TAG, "Failed to get int value of property(%{public}s), status: %{public}d.",
525 property.c_str(), static_cast<int32_t>(status));
526 return false;
527 }
528 value = static_cast<int32_t>(intValue);
529 return true;
530 }
531
GetLongProperty(ani_env * env,const ani_object & object,const std::string & property,int64_t & value)532 bool GetLongProperty(ani_env* env, const ani_object& object, const std::string& property, int64_t& value)
533 {
534 if (env == nullptr) {
535 LOGE(ATM_DOMAIN, ATM_TAG, "Env is null.");
536 return false;
537 }
538
539 ani_ref ref;
540 ani_status status = env->Object_GetPropertyByName_Ref(object, property.c_str(), &ref);
541 if (status != ANI_OK) {
542 LOGE(ATM_DOMAIN, ATM_TAG, "Failed to get property(%{public}s), status: %{public}d!",
543 property.c_str(), status);
544 return false;
545 }
546 if (AniIsRefUndefined(env, ref)) {
547 return true;
548 }
549
550 ani_long longValue;
551 if (env->Object_CallMethodByName_Long(static_cast<ani_object>(ref), "unboxed", nullptr, &longValue) != ANI_OK) {
552 LOGE(ATM_DOMAIN, ATM_TAG, "Failed to get int64 value of property(%{public}s).", property.c_str());
553 return false;
554 }
555 value = static_cast<int64_t>(longValue);
556 return true;
557 }
558
GetStringProperty(ani_env * env,const ani_object & object,const std::string & property,std::string & value)559 bool GetStringProperty(ani_env* env, const ani_object& object, const std::string& property, std::string& value)
560 {
561 if (env == nullptr) {
562 LOGE(ATM_DOMAIN, ATM_TAG, "Env is null.");
563 return false;
564 }
565
566 ani_ref ref;
567 ani_status status = env->Object_GetPropertyByName_Ref(object, property.c_str(), &ref);
568 if (status != ANI_OK) {
569 LOGE(ATM_DOMAIN, ATM_TAG, "Failed to get property(%{public}s), status: %{public}d!",
570 property.c_str(), status);
571 return false;
572 }
573 if (AniIsRefUndefined(env, ref)) {
574 return true;
575 }
576 value = ParseAniString(env, static_cast<ani_string>(ref));
577 return true;
578 }
579
GetEnumProperty(ani_env * env,const ani_object & object,const std::string & property,int32_t & value)580 bool GetEnumProperty(ani_env* env, const ani_object& object, const std::string& property, int32_t& value)
581 {
582 if (env == nullptr) {
583 LOGE(ATM_DOMAIN, ATM_TAG, "Env is null.");
584 return false;
585 }
586
587 ani_ref ref;
588 ani_status status = env->Object_GetPropertyByName_Ref(object, property.c_str(), &ref);
589 if (status != ANI_OK) {
590 LOGE(ATM_DOMAIN, ATM_TAG, "Failed to get property(%{public}s), status: %{public}d!",
591 property.c_str(), status);
592 return false;
593 }
594 if (AniIsRefUndefined(env, ref)) {
595 return true;
596 }
597 ani_enum_item aniEnum = static_cast<ani_enum_item>(ref);
598 ani_int aniInt;
599 if (env->EnumItem_GetValue_Int(aniEnum, &aniInt) != ANI_OK) {
600 LOGE(ATM_DOMAIN, ATM_TAG, "Failed to get enum value of property(%{public}s).", property.c_str());
601 return false;
602 }
603 value = static_cast<int32_t>(aniInt);
604 return true;
605 }
606
GetStringVecProperty(ani_env * env,const ani_object & object,const std::string & property,std::vector<std::string> & value)607 bool GetStringVecProperty(
608 ani_env* env, const ani_object& object, const std::string& property, std::vector<std::string>& value)
609 {
610 if (env == nullptr) {
611 LOGE(ATM_DOMAIN, ATM_TAG, "Env is null.");
612 return false;
613 }
614
615 ani_ref ref;
616 ani_status status = env->Object_GetPropertyByName_Ref(object, property.c_str(), &ref);
617 if (status != ANI_OK) {
618 LOGE(ATM_DOMAIN, ATM_TAG, "Failed to get property(%{public}s), status: %{public}d!",
619 property.c_str(), status);
620 return false;
621 }
622 if (AniIsRefUndefined(env, ref)) {
623 return true;
624 }
625 ani_array_ref anirefArray = static_cast<ani_array_ref>(ref);
626 value = ParseAniStringVector(env, anirefArray);
627 return true;
628 }
629
SetBoolProperty(ani_env * env,ani_object & object,const std::string & property,bool in)630 bool SetBoolProperty(ani_env* env, ani_object& object, const std::string& property, bool in)
631 {
632 if ((env == nullptr) || (object == nullptr)) {
633 LOGE(ATM_DOMAIN, ATM_TAG, "Input param is nullptr, property(%{public}s).", property.c_str());
634 return false;
635 }
636 ani_status status = env->Object_SetPropertyByName_Boolean(object, property.c_str(), static_cast<ani_boolean>(in));
637 if (status != ANI_OK) {
638 LOGE(ATM_DOMAIN, ATM_TAG, "Set property(%{public}s) failed, status: %{public}d!",
639 property.c_str(), status);
640 return false;
641 }
642 return true;
643 }
644
SetIntProperty(ani_env * env,ani_object & object,const std::string & property,int32_t in)645 bool SetIntProperty(ani_env* env, ani_object& object, const std::string& property, int32_t in)
646 {
647 if ((env == nullptr) || (object == nullptr)) {
648 LOGE(ATM_DOMAIN, ATM_TAG, "Input param is nullptr, property(%{public}s).", property.c_str());
649 return false;
650 }
651 ani_status status = env->Object_SetPropertyByName_Int(object, property.c_str(), static_cast<ani_int>(in));
652 if (status != ANI_OK) {
653 LOGE(ATM_DOMAIN, ATM_TAG, "Set property(%{public}s) failed, status: %{public}d!",
654 property.c_str(), status);
655 return false;
656 }
657 return true;
658 }
659
SetLongProperty(ani_env * env,ani_object & aniObject,const std::string & property,int64_t in)660 bool SetLongProperty(ani_env* env, ani_object& aniObject, const std::string& property, int64_t in)
661 {
662 if ((env == nullptr) || (aniObject == nullptr)) {
663 LOGE(ATM_DOMAIN, ATM_TAG, "Input param is nullptr, property(%{public}s).", property.c_str());
664 return false;
665 }
666 ani_status status = env->Object_SetPropertyByName_Long(aniObject, property.c_str(), static_cast<ani_long>(in));
667 if (status != ANI_OK) {
668 LOGE(ATM_DOMAIN, ATM_TAG, "Set property(%{public}s) failed, status: %{public}d!",
669 property.c_str(), status);
670 return false;
671 }
672 return true;
673 }
674
SetRefProperty(ani_env * env,ani_object & aniObject,const std::string & property,const ani_ref & in)675 bool SetRefProperty(ani_env* env, ani_object& aniObject, const std::string& property, const ani_ref& in)
676 {
677 if ((env == nullptr) || (aniObject == nullptr) || (in == nullptr)) {
678 LOGE(ATM_DOMAIN, ATM_TAG, "Input param is nullptr, property(%{public}s).", property.c_str());
679 return false;
680 }
681 ani_status status = env->Object_SetPropertyByName_Ref(aniObject, property.c_str(), in);
682 if (status != ANI_OK) {
683 LOGE(ATM_DOMAIN, ATM_TAG, "Set property(%{public}s) failed, status: %{public}d!",
684 property.c_str(), status);
685 return false;
686 }
687 return true;
688 }
689
SetOptionalIntProperty(ani_env * env,ani_object & aniObject,const std::string & property,int32_t in)690 bool SetOptionalIntProperty(ani_env* env, ani_object& aniObject, const std::string& property, int32_t in)
691 {
692 if ((env == nullptr) || (aniObject == nullptr)) {
693 LOGE(ATM_DOMAIN, ATM_TAG, "Input param is nullptr, property(%{public}s).", property.c_str());
694 return false;
695 }
696 ani_object intObject = CreateIntObject(env, in);
697 if (intObject == nullptr) {
698 return false;
699 }
700
701 if (!SetRefProperty(env, aniObject, property.c_str(), intObject)) {
702 return false;
703 }
704
705 return true;
706 }
707
SetStringProperty(ani_env * env,ani_object & aniObject,const std::string & property,const std::string & in)708 bool SetStringProperty(ani_env* env, ani_object& aniObject, const std::string& property, const std::string& in)
709 {
710 if ((env == nullptr) || (aniObject == nullptr)) {
711 LOGE(ATM_DOMAIN, ATM_TAG, "Input param is null, property(%{public}s).", property.c_str());
712 return false;
713 }
714 ani_ref aniString = static_cast<ani_ref>(CreateAniString(env, in));
715 if (!SetRefProperty(env, aniObject, property.c_str(), aniString)) {
716 return false;
717 }
718 return true;
719 }
720
SetEnumProperty(ani_env * env,ani_object & aniObject,const std::string & enumDescription,const std::string & property,uint32_t value)721 bool SetEnumProperty(ani_env* env, ani_object& aniObject,
722 const std::string& enumDescription, const std::string& property, uint32_t value)
723 {
724 if ((env == nullptr) || (aniObject == nullptr)) {
725 LOGE(ATM_DOMAIN, ATM_TAG, "Input param is null, property(%{public}s).", property.c_str());
726 return false;
727 }
728 ani_enum aniEnum;
729 if (env->FindEnum(enumDescription.c_str(), &aniEnum) != ANI_OK) {
730 LOGE(ATM_DOMAIN, ATM_TAG, "Failed to FindEnum!");
731 return false;
732 }
733 ani_enum_item aniEnumItem;
734 if (env->Enum_GetEnumItemByIndex(aniEnum, static_cast<ani_size>(value), &aniEnumItem) != ANI_OK) {
735 LOGE(ATM_DOMAIN, ATM_TAG, "Failed to Enum_GetEnumItemByIndex!");
736 return false;
737 }
738 if (!SetRefProperty(env, aniObject, property.c_str(), aniEnumItem)) {
739 return false;
740 }
741 return true;
742 }
743
GetCurrentEnv(ani_vm * vm)744 ani_env* GetCurrentEnv(ani_vm* vm)
745 {
746 if (vm == nullptr) {
747 LOGE(ATM_DOMAIN, ATM_TAG, "Vm is null.");
748 return nullptr;
749 }
750 ani_env* env = nullptr;
751 ani_option interopEnabled {"--interop=enable", nullptr};
752 ani_options aniArgs {1, &interopEnabled};
753 if (vm->AttachCurrentThread(&aniArgs, ANI_VERSION_1, &env) != ANI_OK) {
754 if (vm->GetEnv(ANI_VERSION_1, &env) != ANI_OK) {
755 return nullptr;
756 }
757 }
758 return env;
759 }
760 } // namespace AccessToken
761 } // namespace Security
762 } // namespace OHOS
763