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