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