• 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 "sts_common.h"
16 #include <cinttypes>
17 
18 #include "ans_log_wrapper.h"
19 #include "ani_common_util.h"
20 
21 namespace OHOS {
22 namespace NotificationSts {
23 constexpr const char* CLASSNAME_BOOLEAN = "Lstd/core/Boolean;";
24 constexpr const char* CLASSNAME_DOUBLE = "Lstd/core/Double;";
25 constexpr const char* CLASSNAME_INT = "Lstd/core/Int;";
GetResizeStr(std::string instr,int32_t length)26 std::string GetResizeStr(std::string instr, int32_t length)
27 {
28     return instr.length() <= length ? instr : instr.substr(0, length);
29 }
30 
IsUndefine(ani_env * env,const ani_object & obj)31 bool IsUndefine(ani_env *env, const ani_object &obj)
32 {
33     if (env == nullptr || obj == nullptr) {
34         ANS_LOGE("IsUndefine fail, has nullptr");
35         return true;
36     }
37     ani_boolean isUndefined;
38     if (ANI_OK != env->Reference_IsUndefined(obj, &isUndefined)) {
39         ANS_LOGE("Reference_IsUndefined  faild");
40         return true;
41     }
42     return (isUndefined == ANI_TRUE) ? true : false;
43 }
44 
GetAniStringByString(ani_env * env,const std::string str,ani_string & aniStr)45 ani_status GetAniStringByString(ani_env* env, const std::string str, ani_string& aniStr)
46 {
47     if (env == nullptr) {
48         ANS_LOGE("GetAniStringByString fail, env is nullptr");
49         return ANI_INVALID_ARGS;
50     }
51     ani_status status = env->String_NewUTF8(str.c_str(), str.size(), &aniStr);
52     if (status != ANI_OK) {
53         ANS_LOGE("String_NewUTF8 failed %{public}d", status);
54         return status;
55     }
56     return status;
57 }
58 
GetStringByAniString(ani_env * env,ani_string str,std::string & res)59 ani_status GetStringByAniString(ani_env *env, ani_string str, std::string &res)
60 {
61     if (str == nullptr || env == nullptr) {
62         ANS_LOGE("GetStringByAniString fail, has nullptr");
63         return ANI_INVALID_ARGS;
64     }
65     res = "";
66     ani_size sz {};
67     ani_status status = ANI_ERROR;
68     if ((status = env->String_GetUTF8Size(str, &sz)) != ANI_OK) {
69         ANS_LOGE("status : %{public}d", status);
70         return status;
71     }
72     res.resize(sz + 1);
73     if ((status = env->String_GetUTF8SubString(str, 0, sz, res.data(), res.size(), &sz)) != ANI_OK) {
74         ANS_LOGE("status : %{public}d", status);
75         return status;
76     }
77     res.resize(sz);
78     return status;
79 }
80 
GetStringArrayByAniObj(ani_env * env,const ani_object ani_obj,std::vector<std::string> & stdVString)81 bool GetStringArrayByAniObj(ani_env *env, const ani_object ani_obj, std::vector<std::string> &stdVString)
82 {
83     if (env == nullptr || ani_obj == nullptr) {
84         ANS_LOGE("GetStringArrayByAniObj fail, has nullptr");
85         return false;
86     }
87     ani_double length;
88     ani_status status = env->Object_GetPropertyByName_Double(ani_obj, "length", &length);
89     if (status != ANI_OK) {
90         ANS_LOGE("Object_GetPropertyByName_Double faild. status %{public}d", status);
91         return false;
92     }
93     for (int i = 0; i < int(length); i++) {
94         ani_ref stringEntryRef;
95         status = env->Object_CallMethodByName_Ref(ani_obj,
96             "$_get", "I:Lstd/core/Object;", &stringEntryRef, (ani_int)i);
97         if (status != ANI_OK) {
98             ANS_LOGE("status : %{public}d", status);
99             return false;
100         }
101         std::string std_string;
102         if (ANI_OK != (status = GetStringByAniString(env, static_cast<ani_string>(stringEntryRef), std_string))) {
103             ANS_LOGE("GetStdString faild. status %{public}d", status);
104             return false;
105         }
106         stdVString.emplace_back(std_string);
107     }
108     return true;
109 }
110 
GetPropertyString(ani_env * env,ani_object obj,const char * name,ani_boolean & isUndefined,std::string & outStr)111 ani_status GetPropertyString(ani_env *env, ani_object obj, const char *name,
112     ani_boolean &isUndefined, std::string &outStr)
113 {
114     if (env == nullptr || obj == nullptr || name == nullptr) {
115         ANS_LOGE("GetPropertyString fail, has nullptr");
116         return ANI_INVALID_ARGS;
117     }
118     ANS_LOGD("GetPropertyString: %{public}s", name);
119     ani_status status = ANI_ERROR;
120     ani_ref strRef;
121     if ((status =env->Object_GetPropertyByName_Ref(obj, name, &strRef)) != ANI_OK) {
122         ANS_LOGE("Object_GetField_Ref bundle fail, status: %{public}d", status);
123         return status;
124     }
125     status = env->Reference_IsUndefined(strRef, &isUndefined);
126     if (status != ANI_OK) {
127         ANS_LOGE("Failed to check undefined for '%{public}s', status: %{public}d", name, status);
128         return status;
129     }
130     if (isUndefined == ANI_TRUE) {
131         ANS_LOGE("%{public}s is undefined", name);
132         return status;
133     }
134     if ((status = GetStringByAniString(env, reinterpret_cast<ani_string>(strRef), outStr)) != ANI_OK) {
135         ANS_LOGE("GetStdString failed");
136         return status;
137     }
138     return status;
139 }
140 
GetPropertyBool(ani_env * env,ani_object obj,const char * name,ani_boolean & isUndefined,bool & outvalue)141 ani_status GetPropertyBool(ani_env *env, ani_object obj, const char *name,
142     ani_boolean &isUndefined, bool &outvalue)
143 {
144     ANS_LOGD("GetPropertyBool start");
145     if (env == nullptr || obj == nullptr || name == nullptr) {
146         ANS_LOGE("GetPropertyBool fail, has nullptr");
147         return ANI_INVALID_ARGS;
148     }
149     ANS_LOGD("GetPropertyBool: %{public}s", name);
150     ani_ref refObj = nullptr;
151     ani_status status = ANI_ERROR;
152     status = env->Object_GetPropertyByName_Ref(obj, name, &refObj);
153     if (ANI_OK != status) {
154         ANS_LOGE("Object_GetPropertyByName_Ref fail, status: %{public}d", status);
155         return status;
156     }
157     if ((status = env->Reference_IsUndefined(refObj, &isUndefined)) != ANI_OK) {
158         ANS_LOGE("Reference_IsUndefined failed, status : %{public}d", status);
159         return status;
160     }
161     if (isUndefined) {
162         ANS_LOGD("%{public}s is undefined", name);
163         return ANI_INVALID_ARGS;
164     }
165     ani_boolean result = ANI_FALSE;
166     if ((status = env->Object_CallMethodByName_Boolean(static_cast<ani_object>(refObj),
167         "unboxed", ":Z", &result)) != ANI_OK) {
168         ANS_LOGE("Object_CallMethodByName_Boolean failed, status : %{public}d", status);
169         return status;
170     }
171     outvalue = (result == ANI_TRUE);
172     return status;
173 }
174 
GetPropertyDouble(ani_env * env,ani_object obj,const char * name,ani_boolean & isUndefined,ani_double & outvalue)175 ani_status GetPropertyDouble(ani_env *env, ani_object obj, const char *name,
176     ani_boolean &isUndefined, ani_double &outvalue)
177 {
178     if (env == nullptr || obj == nullptr || name == nullptr) {
179         ANS_LOGE("GetPropertyDouble fail, has nullptr");
180         return ANI_INVALID_ARGS;
181     }
182     ANS_LOGD("GetPropertyDouble: %{public}s", name);
183     ani_status status = ANI_ERROR;
184     ani_ref refObj;
185     status = GetPropertyRef(env, obj, name, isUndefined, refObj);
186     if (status != ANI_OK || isUndefined == ANI_TRUE) {
187         ANS_LOGE("%{public}s is undefined", name);
188         return ANI_INVALID_ARGS;
189     }
190     if ((status = env->Object_CallMethodByName_Double(static_cast<ani_object>(refObj),
191         "unboxed", ":D", &outvalue)) != ANI_OK) {
192         ANS_LOGE("Object_CallMethodByName_Double failed, status : %{public}d", status);
193         return status;
194     }
195     ANS_LOGD("GetPropertyDouble end.");
196     return status;
197 }
198 
GetPropertyRefValue(ani_env * env,ani_object obj,const char * name,ani_boolean & isUndefined,ani_ref & outRef)199 void GetPropertyRefValue(ani_env *env, ani_object obj, const char *name, ani_boolean &isUndefined, ani_ref &outRef)
200 {
201     if (env == nullptr || obj == nullptr || name == nullptr) {
202         return;
203     }
204     outRef = nullptr;
205     isUndefined = ANI_TRUE;
206     if (env->Object_GetPropertyByName_Ref(obj, name, &outRef) != ANI_OK) {
207         return;
208     }
209     if (outRef == nullptr) {
210         return;
211     }
212     env->Reference_IsUndefined(outRef, &isUndefined);
213 }
214 
GetPropertyRef(ani_env * env,ani_object obj,const char * name,ani_boolean & isUndefined,ani_ref & outRef)215 ani_status GetPropertyRef(ani_env *env, ani_object obj, const char *name, ani_boolean &isUndefined, ani_ref &outRef)
216 {
217     ANS_LOGD("GetPropertyRef call");
218     if (env == nullptr || obj == nullptr || name == nullptr) {
219         ANS_LOGE("GetPropertyRef fail, has nullptr");
220         return ANI_INVALID_ARGS;
221     }
222     ANS_LOGD("GetPropertyRef: %{public}s", name);
223     ani_status status = env->Object_GetPropertyByName_Ref(obj, name, &outRef);
224     if (status != ANI_OK) {
225         ANS_LOGE("Failed to get property '%{public}s', status: %{public}d", name, status);
226         return status;
227     }
228     if (outRef == nullptr) {
229         ANS_LOGE("get Ref fialed, outRef is nullptr");
230         return ANI_ERROR;
231     }
232     status = env->Reference_IsUndefined(outRef, &isUndefined);
233     if (status != ANI_OK) {
234         ANS_LOGE("Failed to check undefined for '%{public}s', status: %{public}d", name, status);
235     }
236     ANS_LOGD("GetPropertyRef end");
237     return status;
238 }
239 
GetPropertyStringArray(ani_env * env,ani_object param,const char * name,ani_boolean & isUndefined,std::vector<std::string> & res)240 ani_status GetPropertyStringArray(ani_env *env, ani_object param, const char *name,
241     ani_boolean &isUndefined, std::vector<std::string> &res)
242 {
243     if (env == nullptr || param == nullptr || name == nullptr) {
244         ANS_LOGE("GetPropertyStringArray fail, has nullptr");
245         return ANI_INVALID_ARGS;
246     }
247     ANS_LOGD("GetPropertyStringArray: %{public}s", name);
248     ani_ref arrayObj = nullptr;
249     ani_status status;
250     ani_double length;
251     if ((status = GetPropertyRef(env, param, name, isUndefined, arrayObj)) != ANI_OK || isUndefined == ANI_TRUE) {
252         ANS_LOGE("GetPropertyRef fail, status = %{public}d, isUndefind = %{public}d", status, isUndefined);
253         return ANI_INVALID_ARGS;
254     }
255     status = env->Object_GetPropertyByName_Double(static_cast<ani_object>(arrayObj), "length", &length);
256     if (status != ANI_OK) {
257         ANS_LOGE("status : %{public}d", status);
258         return status;
259     }
260     std::string str = "";
261     for (int i = 0; i < static_cast<int>(length); i++) {
262         ani_ref stringEntryRef;
263         status = env->Object_CallMethodByName_Ref(static_cast<ani_object>(arrayObj),
264             "$_get", "I:Lstd/core/Object;", &stringEntryRef, (ani_int)i);
265         if (status != ANI_OK) {
266             ANS_LOGE("status : %{public}d, index: %{public}d", status, i);
267             return status;
268         }
269         status = GetStringByAniString(env, static_cast<ani_string>(stringEntryRef), str);
270         if (status != ANI_OK) {
271             ANS_LOGE("GetStdString failed, index: %{public}d", i);
272             return status;
273         }
274         res.push_back(str);
275         ANS_LOGD("GetStdString index: %{public}d %{public}s", i, str.c_str());
276     }
277     return status;
278 }
279 
GetPropertyNumberArray(ani_env * env,ani_object param,const char * name,ani_boolean & isUndefined,std::vector<int64_t> & res)280 ani_status GetPropertyNumberArray(ani_env *env, ani_object param, const char *name,
281     ani_boolean &isUndefined, std::vector<int64_t> &res)
282 {
283     ANS_LOGD("GetPropertyNumberArray enter");
284     ani_ref arrayObj = nullptr;
285     ani_status status;
286     ani_double length;
287     if ((status = GetPropertyRef(env, param, name, isUndefined, arrayObj)) != ANI_OK || isUndefined == ANI_TRUE) {
288         return ANI_INVALID_ARGS;
289     }
290 
291     status = env->Object_GetPropertyByName_Double(static_cast<ani_object>(arrayObj), "length", &length);
292     if (status != ANI_OK) {
293         ANS_LOGI("status : %{public}d", status);
294         return status;
295     }
296 
297     for (int i = 0; i < static_cast<int>(length); i++) {
298         ani_ref numEntryRef;
299         status = env->Object_CallMethodByName_Ref(static_cast<ani_object>(arrayObj),
300             "$_get", "I:Lstd/core/Object;", &numEntryRef, (ani_int)i);
301         if (status != ANI_OK) {
302             ANS_LOGI("status : %{public}d, index: %{public}d", status, i);
303             return status;
304         }
305         ani_double doubleValue = 0.0;
306         status = env->Object_CallMethodByName_Double(static_cast<ani_object>(numEntryRef), "unboxed",
307             ":D", &doubleValue);
308         if (status != ANI_OK) {
309             ANS_LOGI("Object_CallMethodByName_Double uid fail, status: %{public}d", status);
310             return status;
311         }
312         res.push_back(static_cast<int64_t>(doubleValue));
313     }
314     ANS_LOGD("GetPropertyNumberArray leave");
315     return status;
316 }
317 
GetAniStringArrayByVectorString(ani_env * env,std::vector<std::string> & strs)318 ani_object GetAniStringArrayByVectorString(ani_env *env, std::vector<std::string> &strs)
319 {
320     if (env == nullptr) {
321         ANS_LOGE("GetAniStringArrayByVectorString fail, env is nullptr");
322         return nullptr;
323     }
324     int length = strs.size();
325     ani_object arrayObj = newArrayClass(env, length);
326     if (arrayObj == nullptr) {
327         return nullptr;
328     }
329     ani_size i = 0;
330     for (auto &str : strs) {
331         ani_string aniStr;
332         if ((GetAniStringByString(env, str, aniStr) != ANI_OK) || aniStr == nullptr) {
333             ANS_LOGE("GetAniStringByString faild");
334             return nullptr;
335         }
336         ani_status status = env->Object_CallMethodByName_Void(arrayObj, "$_set", "ILstd/core/Object;:V",
337             i, aniStr);
338         if (status != ANI_OK) {
339             ANS_LOGE("Object_CallMethodByName_Void failed %{public}d", status);
340             return nullptr;
341         }
342         i++;
343     }
344     return arrayObj;
345 }
346 
SetFieldString(ani_env * env,ani_class cls,ani_object & object,const std::string fieldName,const std::string value)347 bool SetFieldString(ani_env *env, ani_class cls, ani_object &object,
348     const std::string fieldName, const std::string value)
349 {
350     if (env == nullptr || cls == nullptr || object == nullptr || fieldName.empty()) {
351         ANS_LOGE("SetFieldString fail, has nullptr or fieldName is empty");
352         return false;
353     }
354     ani_field field = nullptr;
355     ani_string string = nullptr;
356     ani_status status = env->Class_FindField(cls, fieldName.c_str(), &field);
357     ANS_LOGD("SetFieldString fieldName : %{public}s", fieldName.c_str());
358     if (status != ANI_OK || field == nullptr) {
359         ANS_LOGE("SetFieldString status : %{public}d", status);
360         return false;
361     }
362     if (value.empty()) {
363         ani_ref nullRef = nullptr;
364         if ((status = env->GetNull(&nullRef)) != ANI_OK) {
365             ANS_LOGE("SetFieldString GetNull fail status : %{public}d", status);
366             return false;
367         }
368         if ((status = env->Object_SetField_Ref(object, field, nullRef)) != ANI_OK) {
369             ANS_LOGE("SetFieldString Object_SetField_Ref fail status : %{public}d", status);
370             return false;
371         }
372         return true;
373     }
374     if ((status = env->String_NewUTF8(value.c_str(), value.size(), &string)) != ANI_OK) {
375         ANS_LOGE("SetFieldString String_NewUTF8 fail status : %{public}d", status);
376         return false;
377     }
378     if ((status = env->Object_SetField_Ref(object, field, string)) != ANI_OK) {
379         ANS_LOGE("SetFieldString Object_SetField_Ref fail status : %{public}d", status);
380         return false;
381     }
382     return true;
383 }
384 
SetOptionalFieldBoolean(ani_env * env,ani_class cls,ani_object & object,const std::string fieldName,bool value)385 bool SetOptionalFieldBoolean(ani_env *env, ani_class cls, ani_object &object,
386     const std::string fieldName, bool value)
387 {
388     if (env == nullptr || cls == nullptr || object == nullptr || fieldName.empty()) {
389         ANS_LOGE("SetOptionalFieldBoolean fail, has nullptr or fieldName is empty");
390         return false;
391     }
392     ani_field field = nullptr;
393     ani_status status = env->Class_FindField(cls, fieldName.c_str(), &field);
394     if (status != ANI_OK || field == nullptr) {
395         ANS_LOGE("Class_FindField failed or null field, status=%{public}d, fieldName=%{public}s",
396             status, fieldName.c_str());
397         return false;
398     }
399     ani_object boolObj = CreateBoolean(env, BoolToAniBoolean(value));
400     if (boolObj == nullptr) {
401         return false;
402     }
403     status = env->Object_SetField_Ref(object, field, boolObj);
404     if (status != ANI_OK) {
405         ANS_LOGE("Object_SetField_Ref failed, status=%{public}d, fieldName=%{public}s",
406             status, fieldName.c_str());
407         return false;
408     }
409     return true;
410 }
411 
SetOptionalFieldDouble(ani_env * env,ani_class cls,ani_object & object,const std::string fieldName,double value)412 bool SetOptionalFieldDouble(ani_env *env, ani_class cls, ani_object &object,
413     const std::string fieldName, double value)
414 {
415     if (env == nullptr || cls == nullptr || object == nullptr || fieldName.empty()) {
416         ANS_LOGE("SetOptionalFieldDouble fail, has nullptr or fieldName is empty");
417         return false;
418     }
419     ani_field field = nullptr;
420     ani_status status = env->Class_FindField(cls, fieldName.c_str(), &field);
421     if (status != ANI_OK || field == nullptr) {
422         ANS_LOGE("Class_FindField failed or null field, status=%{public}d, fieldName=%{public}s",
423             status, fieldName.c_str());
424         return false;
425     }
426     ani_object doubleObj = CreateDouble(env, value);
427     if (doubleObj == nullptr) {
428         return false;
429     }
430     status = env->Object_SetField_Ref(object, field, doubleObj);
431     if (status != ANI_OK) {
432         ANS_LOGE("Object_SetField_Ref failed, status=%{public}d, fieldName=%{public}s",
433             status, fieldName.c_str());
434         return false;
435     }
436     return true;
437 }
438 
CreateBoolean(ani_env * env,bool value)439 ani_object CreateBoolean(ani_env *env, bool value)
440 {
441     ani_class persion_cls;
442     ani_status status = ANI_ERROR;
443     if ((status = env->FindClass(CLASSNAME_BOOLEAN, &persion_cls)) != ANI_OK) {
444         ANS_LOGE("status : %{public}d", status);
445         return nullptr;
446     }
447     ani_method personInfoCtor;
448     if ((status = env->Class_FindMethod(persion_cls, "<ctor>", "Z:V", &personInfoCtor)) != ANI_OK) {
449         ANS_LOGE("status : %{public}d", status);
450         return nullptr;
451     }
452     ani_object personInfoObj;
453     if ((status = env->Object_New(persion_cls, personInfoCtor, &personInfoObj, value ? ANI_TRUE : ANI_FALSE))
454         != ANI_OK) {
455         ANS_LOGE("status : %{public}d", status);
456         return nullptr;
457     }
458     return personInfoObj;
459 }
CreateDouble(ani_env * env,double value)460 ani_object CreateDouble(ani_env *env, double value)
461 {
462     if (env == nullptr) {
463         ANS_LOGE("CreateDouble fail, env is nullptr");
464         return nullptr;
465     }
466     ani_class doubleCls;
467     ani_status status = ANI_ERROR;
468     if ((status = env->FindClass(CLASSNAME_DOUBLE, &doubleCls)) != ANI_OK) {
469         ANS_LOGE("status : %{public}d", status);
470         return nullptr;
471     }
472     ani_method doubleCtor;
473     if ((status = env->Class_FindMethod(doubleCls, "<ctor>", "D:V", &doubleCtor)) != ANI_OK) {
474         ANS_LOGE("status : %{public}d", status);
475         return nullptr;
476     }
477     ani_object doubleObj;
478     if ((status = env->Object_New(doubleCls, doubleCtor, &doubleObj, static_cast<ani_double>(value))) != ANI_OK) {
479         ANS_LOGE("status : %{public}d", status);
480         return nullptr;
481     }
482     return doubleObj;
483 }
484 
newArrayClass(ani_env * env,int length)485 ani_object newArrayClass(ani_env *env, int length)
486 {
487     ANS_LOGD("newArrayClass call");
488     if (env == nullptr || length < 0) {
489         ANS_LOGE("CreateDouble fail, env is nullptr or length is less than zero");
490         return nullptr;
491     }
492     ani_class arrayCls = nullptr;
493     if (ANI_OK != env->FindClass("Lescompat/Array;", &arrayCls)) {
494         ANS_LOGE("FindClass Lescompat/Array; Failed");
495         return nullptr;
496     }
497     ani_method arrayCtor;
498     if (ANI_OK != env->Class_FindMethod(arrayCls, "<ctor>", "I:V", &arrayCtor)) {
499         ANS_LOGE("Class_FindMethod <ctor> Failed");
500         return nullptr;
501     }
502     ani_object arrayObj = nullptr;
503     if (ANI_OK != env->Object_New(arrayCls, arrayCtor, &arrayObj, length)) {
504         ANS_LOGE("Object_New Array Faild");
505         return nullptr;
506     }
507     ANS_LOGD("newArrayClass end");
508     return arrayObj;
509 }
510 
newRecordClass(ani_env * env)511 ani_object newRecordClass(ani_env *env)
512 {
513     ANS_LOGD("newRecordClass call");
514     if (env == nullptr) {
515         ANS_LOGE("newRecordClass fail, env is nullptr");
516         return nullptr;
517     }
518     ani_status status = ANI_ERROR;
519     ani_class recordCls;
520     if (ANI_OK != (status = env->FindClass("Lescompat/Record;", &recordCls))) {
521         ANS_LOGE("newRecordClass fail, FindClass status = %{public}d", status);
522         return nullptr;
523     }
524     ani_method ctor;
525     if (ANI_OK != (status = env->Class_FindMethod(recordCls, "<ctor>", nullptr, &ctor))) {
526         ANS_LOGE("newRecordClass fail, Class_FindMethod status = %{public}d", status);
527         return nullptr;
528     }
529     ani_object recordObj = {};
530     if (ANI_OK != (status = env->Object_New(recordCls, ctor, &recordObj))) {
531         ANS_LOGE("newRecordClass fail, Object_New status = %{public}d", status);
532         return nullptr;
533     }
534     ANS_LOGD("newRecordClass end");
535     return recordObj;
536 }
537 
ConvertArrayDoubleToAniObj(ani_env * env,const std::vector<std::int64_t> values)538 ani_object ConvertArrayDoubleToAniObj(ani_env *env, const std::vector<std::int64_t> values)
539 {
540     if (env == nullptr) {
541         ANS_LOGE("ConvertArrayDoubleToAniObj fail, env is nullptr");
542         return nullptr;
543     }
544     ani_object arrayObj = newArrayClass(env, values.size());
545     if (arrayObj == nullptr) {
546         return nullptr;
547     }
548     for (size_t i = 0; i < values.size(); i++) {
549         ani_object intObj = CreateDouble(env, static_cast<double>(values[i]));
550         if (intObj == nullptr) {
551             ANS_LOGE("null intObj");
552             return nullptr;
553         }
554         ani_status status = env->Object_CallMethodByName_Void(arrayObj, "$_set", "ILstd/core/Object;:V", i, intObj);
555         if (status != ANI_OK) {
556             ANS_LOGE("status : %{public}d", status);
557             return nullptr;
558         }
559     }
560     return arrayObj;
561 }
562 
SetOptionalFieldArrayDouble(ani_env * env,ani_class cls,ani_object & object,const std::string & fieldName,const std::vector<std::int64_t> & values)563 bool SetOptionalFieldArrayDouble(ani_env *env, ani_class cls, ani_object &object, const std::string &fieldName,
564     const std::vector<std::int64_t> &values)
565 {
566     if (env == nullptr || cls == nullptr || object == nullptr || fieldName.empty()) {
567         ANS_LOGE("SetOptionalFieldArrayDouble fail, has nullptr or fieldName is empty");
568         return false;
569     }
570     ani_field field = nullptr;
571     ani_status status = env->Class_FindField(cls, fieldName.c_str(), &field);
572     if (status != ANI_OK) {
573         ANS_LOGE("status : %{public}d", status);
574         return false;
575     }
576     ani_object arrayObj = ConvertArrayDoubleToAniObj(env, values);
577     if (arrayObj == nullptr) {
578         ANS_LOGE("arrayObj is nullptr.");
579         return false;
580     }
581     status = env->Object_SetField_Ref(object, field, arrayObj);
582     if (status != ANI_OK) {
583         ANS_LOGE("status : %{public}d", status);
584         return false;
585     }
586     return true;
587 }
588 
CreateClassObjByClassName(ani_env * env,const char * className,ani_class & cls,ani_object & outAniObj)589 bool CreateClassObjByClassName(ani_env *env, const char *className, ani_class &cls, ani_object &outAniObj)
590 {
591     if (env == nullptr || className == nullptr) {
592         ANS_LOGE("CreateClassObjByClassName fail, has nullptr");
593         return false;
594     }
595     if (ANI_OK != env->FindClass(className, &cls)) {
596         ANS_LOGE("FindClass fail");
597         return false;
598     }
599     ani_method ctor;
600     if (ANI_OK != env->Class_FindMethod(cls, "<ctor>", nullptr, &ctor)) {
601         ANS_LOGE("FindMethod fail");
602         return false;
603     }
604     outAniObj = {};
605     if (ANI_OK != env->Object_New(cls, ctor, &outAniObj)) {
606         ANS_LOGE("Object_New fail");
607         return false;
608     }
609     return true;
610 }
611 
CreateDate(ani_env * env,int64_t time,ani_object & outObj)612 bool CreateDate(ani_env *env, int64_t time, ani_object &outObj)
613 {
614     ANS_LOGD("Create time %{public}" PRId64, time);
615     if (env == nullptr || time < 0) {
616         ANS_LOGE("CreateDate fail, env is nullptr or time is invalid value");
617         return false;
618     }
619     ani_class cls;
620     ani_status status;
621     if (ANI_OK != (status = env->FindClass("escompat.Date", &cls))) {
622         ANS_LOGE("error. not find class name 'escompat.Date'. status %{public}d", status);
623         return false;
624     }
625     ani_method ctor;
626     if ((status = env->Class_FindMethod(cls, "<ctor>", "ILstd/core/Object;:V", &ctor)) != ANI_OK) {
627         ANS_LOGE("error. not find method name '<ctor>'. status %{public}d", status);
628         return false;
629     }
630     ani_object intObj = CreateDouble(env, static_cast<double>(time));
631     if ((status = env->Object_New(cls, ctor, &outObj, intObj)) != ANI_OK) {
632         ANS_LOGE("Object_New faild. status %{public}d", status);
633         return false;
634     }
635     return true;
636 }
637 
GetDateByObject(ani_env * env,ani_object timeObj,int64_t & time)638 bool GetDateByObject(ani_env *env, ani_object timeObj, int64_t &time)
639 {
640     ANS_LOGD("GetDateByObject call");
641     if (env == nullptr || timeObj == nullptr) {
642         ANS_LOGE("GetDateByObject fail, env or timeObj is nullptr");
643         return false;
644     }
645 
646     ani_status status;
647     ani_double timeMsObj = 0;
648     if ((status = env->Object_CallMethodByName_Double(timeObj, "getTime", ":D", &timeMsObj)) != ANI_OK) {
649         ANS_LOGD("Object_CallMethodByName_Double faild. status %{public}d", status);
650         return false;
651     }
652     time = static_cast<int64_t>(timeMsObj);
653     ANS_LOGD("GetDateByObject end");
654     return true;
655 }
656 
CreateInt(ani_env * env,int32_t value)657 ani_object CreateInt(ani_env *env, int32_t value)
658 {
659     ani_class cls;
660     ani_status status = ANI_ERROR;
661     if ((status = env->FindClass(CLASSNAME_INT, &cls)) != ANI_OK) {
662         ANS_LOGE("FindClass '%{public}s' faild. status %{public}d", CLASSNAME_INT, status);
663         return nullptr;
664     }
665     ani_method ctor;
666     if ((status = env->Class_FindMethod(cls, "<ctor>", "I:V", &ctor)) != ANI_OK) {
667         ANS_LOGE("Class_FindMethod '%{public}s' faild. status %{public}d", CLASSNAME_INT, status);
668         return nullptr;
669     }
670     ani_object outObj;
671     if ((status = env->Object_New(cls, ctor, &outObj, value)) != ANI_OK) {
672         ANS_LOGE("Object_New '%{public}s' faild. status %{public}d", CLASSNAME_INT, status);
673         return nullptr;
674     }
675     return outObj;
676 }
677 
SetPropertyOptionalByBoolean(ani_env * env,ani_object & object,const char * name,bool value)678 bool SetPropertyOptionalByBoolean(ani_env *env, ani_object &object, const char *name, bool value)
679 {
680     ANS_LOGD("enter SetPropertyOptionalByBoolean");
681     if (env == nullptr || object == nullptr || name == nullptr) {
682         ANS_LOGE("The parameter is invalid.");
683         return false;
684     }
685     ani_ref boolObj = CreateBoolean(env, value);
686     if (boolObj == nullptr) {
687         ANS_LOGE("CreateBoolean faild");
688         return false;
689     }
690     return SetPropertyByRef(env, object, name, boolObj);
691 }
692 
SetPropertyOptionalByDouble(ani_env * env,ani_object & object,const char * name,double value)693 bool SetPropertyOptionalByDouble(ani_env *env, ani_object &object, const char *name, double value)
694 {
695     ANS_LOGD("enter SetPropertyOptionalByDouble");
696     if (env == nullptr || object == nullptr || name == nullptr) {
697         ANS_LOGE("The parameter is invalid.");
698         return false;
699     }
700     ani_ref doubleObj = CreateDouble(env, value);
701     if (doubleObj == nullptr) {
702         ANS_LOGE("CreateDouble faild");
703         return false;
704     }
705     return SetPropertyByRef(env, object, name, doubleObj);
706 }
707 
SetPropertyOptionalByString(ani_env * env,ani_object & object,const char * name,const std::string value)708 bool SetPropertyOptionalByString(ani_env *env, ani_object &object, const char *name, const std::string value)
709 {
710     ANS_LOGD("enter SetPropertyOptionalByString");
711     if (env == nullptr || object == nullptr || name == nullptr) {
712         ANS_LOGE("The parameter is invalid.");
713         return false;
714     }
715     ani_string stringObj;
716     ani_status status = ANI_OK;
717     if (ANI_OK != (status = GetAniStringByString(env, value, stringObj))) {
718         ANS_LOGE("GetAniStringByString faild. status %{public}d", status);
719         return false;
720     }
721     if (stringObj == nullptr) {
722         ANS_LOGE("CreateString faild");
723         return false;
724     }
725     return SetPropertyByRef(env, object, name, static_cast<ani_ref>(stringObj));
726 }
727 
SetPropertyOptionalByInt(ani_env * env,ani_object & object,const char * name,int32_t value)728 bool SetPropertyOptionalByInt(ani_env *env, ani_object &object, const char *name, int32_t value)
729 {
730     ANS_LOGD("enter SetPropertyOptionalByInt");
731     if (env == nullptr || object == nullptr || name == nullptr) {
732         ANS_LOGE("The parameter is invalid.");
733         return false;
734     }
735     ani_ref IntObj = CreateInt(env, value);
736     if (IntObj == nullptr) {
737         ANS_LOGE("CreateInt faild");
738         return false;
739     }
740     return SetPropertyByRef(env, object, name, IntObj);
741 }
742 
SetPropertyByRef(ani_env * env,ani_object & object,const char * name,ani_ref value)743 bool SetPropertyByRef(ani_env *env, ani_object &object, const char *name, ani_ref value)
744 {
745     ANS_LOGD("enter SetPropertyByRef");
746     ani_status status = ANI_OK;
747     if (env == nullptr || object == nullptr || name == nullptr || value == nullptr) {
748         ANS_LOGE("The parameter is invalid.");
749         return false;
750     }
751     if (ANI_OK != (status = env->Object_SetPropertyByName_Ref(object, name, value))) {
752         ANS_LOGE("set '%{public}s' faild. status %{public}d", name, status);
753         return false;
754     }
755     return true;
756 }
757 
758 } // namespace NotificationSts
759 } // OHOS