diff --git a/interfaces/kits/js/src/common/ani_helper/ani_signature.cpp b/interfaces/kits/js/src/common/ani_helper/ani_signature.cpp index 87ee3dfe32090a7ff846dd0c7092f252b133542d..4a683a78389923e50500cae3dfe396b8b81857c8 100644 --- a/interfaces/kits/js/src/common/ani_helper/ani_signature.cpp +++ b/interfaces/kits/js/src/common/ani_helper/ani_signature.cpp @@ -115,6 +115,9 @@ const Type FS::WatchEventInner::classType = Builder::BuildClass("@ohos.file.fs.W const string FS::WatchEventInner::classDesc = FS::WatchEventInner::classType.Descriptor(); const string FS::WatchEventInner::ctorSig = Builder::BuildSignatureDescriptor({ BuiltInTypes::stringType, BasicTypes::doubleType, BasicTypes::doubleType }); +// FS::LocationType +const Type FS::LocationType::classType = Builder::BuildClass("@ohos.file.fs.fileIo.LocationType"); +const string FS::LocationType::classDesc = FS::LocationType::classType.Descriptor(); // Impl::EnvironmentImpl const Type Impl::EnvironmentImpl::classType = Builder::BuildClass("@ohos.file.environment.EnvironmentImpl"); const string Impl::EnvironmentImpl::classDesc = Impl::EnvironmentImpl::classType.Descriptor(); diff --git a/interfaces/kits/js/src/common/ani_helper/ani_signature.h b/interfaces/kits/js/src/common/ani_helper/ani_signature.h index c05470dc09694c075f7eb1eded41dadb52f42070..8b7e4328169b56ae56340086e9ef251da41e2c4c 100644 --- a/interfaces/kits/js/src/common/ani_helper/ani_signature.h +++ b/interfaces/kits/js/src/common/ani_helper/ani_signature.h @@ -176,6 +176,11 @@ struct WatchEventInner : public BaseType { static const string ctorSig; }; +struct LocationType : public BaseType { + static const Type classType; + static const string classDesc; +}; + } // namespace FS namespace Impl { diff --git a/interfaces/kits/js/src/mod_fs/class_stat/ani/stat_wrapper.cpp b/interfaces/kits/js/src/mod_fs/class_stat/ani/stat_wrapper.cpp index 7545be6454b6718d5ac25e6d8e9bd558365cd4b8..94aae30c15e5a868ab11a6c870f0948b744edc8a 100644 --- a/interfaces/kits/js/src/mod_fs/class_stat/ani/stat_wrapper.cpp +++ b/interfaces/kits/js/src/mod_fs/class_stat/ani/stat_wrapper.cpp @@ -80,14 +80,31 @@ static ani_status SetBigIntProperty( return env->Object_CallMethod_Void(statObject, setter, object); } -static ani_int GetLocationEnumIndex(const Location &value) +static ani_enum_item GetLocationEnumIndex(ani_env *env, const Location &value) { - switch (value) { - case LOCAL: - return ani_int(0); - case CLOUD: - return ani_int(1); + ani_enum enumType; + auto classDesc = FS::LocationType::classDesc.c_str(); + ani_status ret = env->FindEnum(classDesc, &enumType); + if (ret != ANI_OK) { + HILOGE("FindEnum %{private}s failed, err: %{private}d", classDesc, ret); + return nullptr; + } + + size_t valueAsSizeT = static_cast(value); + if (valueAsSizeT < 1) { + HILOGE("Invalid Location value: %{private}zu", valueAsSizeT); + return nullptr; + } + + size_t index = valueAsSizeT - 1; + + ani_enum_item enumItem; + ret = env->Enum_GetEnumItemByIndex(enumType, index, &enumItem); + if (ret != ANI_OK) { + HILOGE("Enum_GetEnumItemByIndex failed, index: %{private}zu, err: %{private}d", index, ret); + return nullptr; } + return enumItem; } static ani_status SetEnumLocation( @@ -100,7 +117,7 @@ static ani_status SetEnumLocation( return ret; } - return env->Object_CallMethod_Void(object, setter, GetLocationEnumIndex(value)); + return env->Object_CallMethod_Void(object, setter, GetLocationEnumIndex(env, value)); } const static string MODE_SETTER = Builder::BuildSetterName("mode");