diff --git a/interfaces/ets/ani/hisysevent/ets/@ohos.hiSysEvent.ets b/interfaces/ets/ani/hisysevent/ets/@ohos.hiSysEvent.ets index 0d1b156a266bf32018260c73b01367df1a567250..c4a8134d12aae2f75aa0abac57868bfb535aab61 100644 --- a/interfaces/ets/ani/hisysevent/ets/@ohos.hiSysEvent.ets +++ b/interfaces/ets/ani/hisysevent/ets/@ohos.hiSysEvent.ets @@ -19,8 +19,7 @@ class SysEventInfoAni implements hiSysEvent.SysEventInfo { domain: string = ""; name: string = ""; eventType: hiSysEvent.EventType = hiSysEvent.EventType.FAULT; - params?: - undefined | Record; + params?: object; } class WatcherAni implements hiSysEvent.Watcher { @@ -71,7 +70,7 @@ export default namespace hiSysEvent { domain: string; name: string; eventType: EventType; - params?: Record; + params?: object; } export interface Watcher { diff --git a/interfaces/ets/ani/hisysevent/include/hisysevent_ani.h b/interfaces/ets/ani/hisysevent/include/hisysevent_ani.h index e26885d4e83d3807ea24d8efa161d3b6026dc5e2..d6e1164990d016a7f8559053cc703d7cdff05d8d 100644 --- a/interfaces/ets/ani/hisysevent/include/hisysevent_ani.h +++ b/interfaces/ets/ani/hisysevent/include/hisysevent_ani.h @@ -35,22 +35,16 @@ using HiSysEventInfo = struct HiSysEventInfo { }; using JsCallerInfo = std::pair; -struct ParamArray { - std::vector boolArray; - std::vector numberArray; - std::vector stringArray; - std::vector bigintArray; -}; - enum ParamType { BL = 0, DOU, I64, U64, STR, BOOL_ARR, DOUBLE_ARR, I64_ARR, U64_ARR, STR_ARR }; enum AniArgsType { ANI_UNKNOWN = 0, ANI_BOOLEAN = 1, - ANI_NUMBER = 2, - ANI_STRING = 3, - ANI_BIGINT = 4, - ANI_UNDEFINED = 5, + ANI_INT = 2, + ANI_DOUBLE = 3, + ANI_STRING = 4, + ANI_BIGINT = 5, + ANI_UNDEFINED = 6, }; class HiSysEventAni { diff --git a/interfaces/ets/ani/hisysevent/include/hisysevent_ani_util.h b/interfaces/ets/ani/hisysevent/include/hisysevent_ani_util.h index e008fccb8d9e906387352825324d7acb1fe7d290..bde45045b5781c2f7ac28f78a43f5b4e30cf6efc 100644 --- a/interfaces/ets/ani/hisysevent/include/hisysevent_ani_util.h +++ b/interfaces/ets/ani/hisysevent/include/hisysevent_ani_util.h @@ -76,6 +76,12 @@ public: static double ParseNumberValue(ani_env *env, ani_ref elementRef); static std::map ParseRecord(ani_env *env, ani_ref recordRef); static std::string ParseStringValue(ani_env *env, ani_ref aniStrRef); + static int ParseIntValue(ani_env *env, ani_ref elementRef); + static void GetBooleans(ani_env *env, ani_ref arrayRef, std::vector &bools); + static void GetDoubles(ani_env *env, ani_ref arrayRef, std::vector &doubles); + static void GetIntsToDoubles(ani_env *env, ani_ref arrayRef, std::vector &doubles); + static void GetStrings(ani_env *env, ani_ref arrayRef, std::vector &strs); + static void GetBigints(ani_env *env, ani_ref arrayRef, std::vector &bigints); static ani_object WriteResult(ani_env *env, const std::pair& result); static ani_object CreateDoubleUint64(ani_env *env, uint64_t number); static ani_object CreateDoubleInt64(ani_env *env, int64_t number); diff --git a/interfaces/ets/ani/hisysevent/src/hisysevent_ani.cpp b/interfaces/ets/ani/hisysevent/src/hisysevent_ani.cpp index 3f627a233839dfdc397302e7b3680565aea51300..32652753b7d226002babbf563887a8771c2fd81b 100644 --- a/interfaces/ets/ani/hisysevent/src/hisysevent_ani.cpp +++ b/interfaces/ets/ani/hisysevent/src/hisysevent_ani.cpp @@ -58,7 +58,8 @@ constexpr char CALL_LINE_INFO_DELIMITER = ':'; constexpr char PATH_DELIMITER = '/'; const std::pair OBJECT_TYPE[] = { {CLASS_NAME_BOOLEAN, AniArgsType::ANI_BOOLEAN}, - {CLASS_NAME_DOUBLE, AniArgsType::ANI_NUMBER}, + {CLASS_NAME_INT, AniArgsType::ANI_INT}, + {CLASS_NAME_DOUBLE, AniArgsType::ANI_DOUBLE}, {CLASS_NAME_STRING, AniArgsType::ANI_STRING}, {CLASS_NAME_BIGINT, AniArgsType::ANI_BIGINT}, }; @@ -86,49 +87,6 @@ static AniArgsType GetArgType(ani_env *env, ani_object elementObj) return AniArgsType::ANI_UNKNOWN; } -static void AppendArray(ani_env *env, ani_ref value, AniArgsType type, ParamArray& paramArray) -{ - switch (type) { - case AniArgsType::ANI_BOOLEAN: - paramArray.boolArray.emplace_back(HiSysEventAniUtil::ParseBoolValue(env, value)); - break; - case AniArgsType::ANI_NUMBER: - paramArray.numberArray.emplace_back(HiSysEventAniUtil::ParseNumberValue(env, value)); - break; - case AniArgsType::ANI_STRING: - paramArray.stringArray.emplace_back(HiSysEventAniUtil::ParseStringValue(env, value)); - break; - case AniArgsType::ANI_BIGINT: - paramArray.bigintArray.emplace_back(HiSysEventAniUtil::ParseBigintValue(env, value)); - break; - default: - HILOG_ERROR(LOG_CORE, "Unexpected type"); - break; - } -} - -static bool AddArrayParam(AniArgsType type, const std::string& key, ParamArray& paramArray, HiSysEventInfo& info) -{ - switch (type) { - case AniArgsType::ANI_BOOLEAN: - info.params[key] = paramArray.boolArray; - break; - case AniArgsType::ANI_NUMBER: - info.params[key] = paramArray.numberArray; - break; - case AniArgsType::ANI_STRING: - info.params[key] = paramArray.stringArray; - break; - case AniArgsType::ANI_BIGINT: - info.params[key] = paramArray.bigintArray; - break; - default: - HILOG_ERROR(LOG_CORE, "Unexpected type"); - return false; - } - return true; -} - static bool IsValidParamType(AniArgsType type) { return (type > static_cast(AniArgsType::ANI_UNKNOWN) && @@ -153,24 +111,46 @@ static bool AddArrayParamToEventInfo(ani_env *env, const std::string& key, ani_r HILOG_ERROR(LOG_CORE, "get array length failed"); return false; } - ParamArray paramArray; AniArgsType arrayType = GetArrayType(env, static_cast(arrayRef)); if (!IsValidParamType(arrayType)) { return false; } - for (ani_size i = 0; i < size; i++) { - ani_ref valueRef {}; - if (ANI_OK != env->Array_Get_Ref(static_cast(arrayRef), i, &valueRef)) { - HILOG_ERROR(LOG_CORE, "get array %{public}zu failed", i); - return false; + switch (arrayType) { + case AniArgsType::ANI_BOOLEAN: { + std::vector bools; + HiSysEventAniUtil::GetBooleans(env, arrayRef, bools); + info.params[key] = bools; + break; } - if (GetArgType(env, static_cast(valueRef)) != arrayType) { - HILOG_ERROR(LOG_CORE, "element type in arrry not same"); - return false; + case AniArgsType::ANI_INT: { + std::vector doubles; + HiSysEventAniUtil::GetIntsToDoubles(env, arrayRef, doubles); + info.params[key] = doubles; + break; } - AppendArray(env, valueRef, arrayType, paramArray); + case AniArgsType::ANI_DOUBLE: { + std::vector doubles; + HiSysEventAniUtil::GetDoubles(env, arrayRef, doubles); + info.params[key] = doubles; + break; + } + case AniArgsType::ANI_STRING: { + std::vector strs; + HiSysEventAniUtil::GetStrings(env, arrayRef, strs); + info.params[key] = strs; + break; + } + case AniArgsType::ANI_BIGINT:{ + std::vector bigints; + HiSysEventAniUtil::GetBigints(env, arrayRef, bigints); + info.params[key] = bigints; + break; + } + default: + HILOG_ERROR(LOG_CORE, "Unexpected type"); + return false; } - return AddArrayParam(arrayType, key, paramArray, info); + return true; } static bool AddParamToEventInfo(ani_env *env, const std::string& key, ani_ref value, HiSysEventInfo& info) @@ -183,7 +163,10 @@ static bool AddParamToEventInfo(ani_env *env, const std::string& key, ani_ref va case AniArgsType::ANI_BOOLEAN: info.params[key] = HiSysEventAniUtil::ParseBoolValue(env, value); break; - case AniArgsType::ANI_NUMBER: + case AniArgsType::ANI_INT: + info.params[key] = static_cast(HiSysEventAniUtil::ParseIntValue(env, value)); + break; + case AniArgsType::ANI_DOUBLE: info.params[key] = HiSysEventAniUtil::ParseNumberValue(env, value); break; case AniArgsType::ANI_STRING: diff --git a/interfaces/ets/ani/hisysevent/src/hisysevent_ani_util.cpp b/interfaces/ets/ani/hisysevent/src/hisysevent_ani_util.cpp index 752879007b2a76919c6d6e67a1588a6eb574c085..ee840e606649c704a9cadd9eb4457f153cf428c3 100644 --- a/interfaces/ets/ani/hisysevent/src/hisysevent_ani_util.cpp +++ b/interfaces/ets/ani/hisysevent/src/hisysevent_ani_util.cpp @@ -129,6 +129,26 @@ bool HiSysEventAniUtil::ParseBoolValue(ani_env *env, ani_ref elementRef) return static_cast(booleanVal); } +int HiSysEventAniUtil::ParseIntValue(ani_env *env, ani_ref elementRef) +{ + ani_int intVal = 0; + ani_class cls {}; + if (ANI_OK != env->FindClass(CLASS_NAME_INT, &cls)) { + HILOG_ERROR(LOG_CORE, "find class %{public}s failed", CLASS_NAME_INT); + return static_cast(intVal); + } + ani_method unboxedMethod {}; + if (ANI_OK != env->Class_FindMethod(cls, FUNC_NAME_UNBOXED, ":I", &unboxedMethod)) { + HILOG_ERROR(LOG_CORE, "find method %{public}s failed", FUNC_NAME_UNBOXED); + return static_cast(intVal); + } + if (ANI_OK != env->Object_CallMethod_Int(static_cast(elementRef), unboxedMethod, &intVal)) { + HILOG_ERROR(LOG_CORE, "call method %{public}s failed", FUNC_NAME_UNBOXED); + return static_cast(intVal); + } + return static_cast(intVal); +} + double HiSysEventAniUtil::ParseNumberValue(ani_env *env, ani_ref elementRef) { ani_double doubleVal = 0; @@ -765,3 +785,88 @@ void HiSysEventAniUtil::DetachAniEnv(ani_vm *vm) HILOG_ERROR(LOG_CORE, "detach env failed"); } } + +void HiSysEventAniUtil::GetBooleans(ani_env *env, ani_ref arrayRef, std::vector& bools) +{ + ani_size len = 0; + if (ANI_OK != env->Array_GetLength(static_cast(arrayRef), &len)) { + HILOG_ERROR(LOG_CORE, "failed to get the length of array"); + return; + } + for (ani_size i = 0; i < len; i++) { + ani_ref element = nullptr; + if (ANI_OK != env->Array_Get_Ref(static_cast(arrayRef), i, &element)) { + HILOG_ERROR(LOG_CORE, "failed to get the element of array"); + return; + } + bools.emplace_back(HiSysEventAniUtil::ParseBoolValue(env, element)); + } +} + +void HiSysEventAniUtil::GetDoubles(ani_env *env, ani_ref arrayRef, std::vector& doubles) +{ + ani_size len = 0; + if (ANI_OK != env->Array_GetLength(static_cast(arrayRef), &len)) { + HILOG_ERROR(LOG_CORE, "failed to get the length of array"); + return; + } + for (ani_size i = 0; i < len; i++) { + ani_ref element = nullptr; + if (ANI_OK != env->Array_Get_Ref(static_cast(arrayRef), i, &element)) { + HILOG_ERROR(LOG_CORE, "failed to get the element of array"); + return; + } + doubles.push_back(HiSysEventAniUtil::ParseNumberValue(env, element)); + } +} + +void HiSysEventAniUtil::GetStrings(ani_env *env, ani_ref arrayRef, std::vector& strs) +{ + ani_size len = 0; + if (ANI_OK != env->Array_GetLength(static_cast(arrayRef), &len)) { + HILOG_ERROR(LOG_CORE, "failed to get the length of array"); + return; + } + for (ani_size i = 0; i < len; i++) { + ani_ref element = nullptr; + if (ANI_OK != env->Array_Get_Ref(static_cast(arrayRef), i, &element)) { + HILOG_ERROR(LOG_CORE, "failed to get the element of array"); + return; + } + strs.push_back(HiSysEventAniUtil::ParseStringValue(env, element)); + } +} + +void HiSysEventAniUtil::GetIntsToDoubles(ani_env *env, ani_ref arrayRef, std::vector& doubles) +{ + ani_size len = 0; + if (ANI_OK != env->Array_GetLength(static_cast(arrayRef), &len)) { + HILOG_ERROR(LOG_CORE, "failed to get the length of array"); + return; + } + for (ani_size i = 0; i < len; i++) { + ani_ref element = nullptr; + if (ANI_OK != env->Array_Get_Ref(static_cast(arrayRef), i, &element)) { + HILOG_ERROR(LOG_CORE, "failed to get the element of array"); + return; + } + doubles.push_back(static_cast(HiSysEventAniUtil::ParseIntValue(env, element))); + } +} + +void HiSysEventAniUtil::GetBigints(ani_env *env, ani_ref arrayRef, std::vector& bigints) +{ + ani_size len = 0; + if (ANI_OK != env->Array_GetLength(static_cast(arrayRef), &len)) { + HILOG_ERROR(LOG_CORE, "failed to get the length of array"); + return; + } + for (ani_size i = 0; i < len; i++) { + ani_ref element = nullptr; + if (ANI_OK != env->Array_Get_Ref(static_cast(arrayRef), i, &element)) { + HILOG_ERROR(LOG_CORE, "failed to get the element of array"); + return; + } + bigints.push_back(HiSysEventAniUtil::ParseBigintValue(env, element)); + } +}