diff --git a/interfaces/kits/js/BUILD.gn b/interfaces/kits/js/BUILD.gn index f98ab96396b03094261a549a6b763023eb4b2284..a80ccf98979a9b6539f9b4b33b146d9c658618bc 100644 --- a/interfaces/kits/js/BUILD.gn +++ b/interfaces/kits/js/BUILD.gn @@ -935,6 +935,7 @@ ohos_shared_library("ani_securitylabel_class") { "hilog:libhilog", "libuv:uv", "runtime_core:ani", + "runtime_core:ani_helpers", "runtime_core:libarkruntime", ] use_exceptions = true diff --git a/interfaces/kits/js/src/common/ani_helper/ani_helper.h b/interfaces/kits/js/src/common/ani_helper/ani_helper.h index 27ef05d38a58a9c0a57b0f1f1a19166494630636..9b7f4e136928c14fa3d18fdd01babfa6e2557287 100644 --- a/interfaces/kits/js/src/common/ani_helper/ani_helper.h +++ b/interfaces/kits/js/src/common/ani_helper/ani_helper.h @@ -67,6 +67,7 @@ public: { ani_method method; string setter = "" + property; + // Pls replace manually auto status = env->Class_FindMethod(cls, setter.c_str(), nullptr, &method); if (status != ANI_OK) { return status; @@ -103,7 +104,10 @@ public: return { true, nullopt }; } ani_long value; - status = env->Object_CallMethodByName_Long(static_cast(property), "longValue", ":J", &value); + arkts::ani_signature::SignatureBuilder longValueSigBuilder; + longValueSigBuilder.SetReturnLong(); + auto longValueSignature = longValueSigBuilder.BuildSignatureDescriptor(); + status = env->Object_CallMethodByName_Long(static_cast(property), "longValue", longValueSignature.c_str(), &value); if (status != ANI_OK) { return { false, nullopt }; } diff --git a/interfaces/kits/js/src/common/ani_helper/bind_function.h b/interfaces/kits/js/src/common/ani_helper/bind_function.h index 3c951b25125364260b1879851df4f1b832e9b233..10ad26f1e6574e70c216c4d7a2c2a1f3562a75e8 100644 --- a/interfaces/kits/js/src/common/ani_helper/bind_function.h +++ b/interfaces/kits/js/src/common/ani_helper/bind_function.h @@ -39,6 +39,7 @@ ANI_EXPORT ani_status BindClass(ani_env *env, const char *className, const std:: } ani_class cls; + // Pls replace manually if (ANI_OK != env->FindClass(className, &cls)) { HILOGE("Cannot find class '%{private}s'", className); return ANI_NOT_FOUND; @@ -66,6 +67,7 @@ ANI_EXPORT ani_status BindNamespace( } ani_namespace ns; + // Pls replace manually if (ANI_OK != env->FindNamespace(namespaceStr, &ns)) { HILOGE("Cannot find namespace '%{private}s'", namespaceStr); return ANI_NOT_FOUND; diff --git a/interfaces/kits/js/src/common/ani_helper/error_handler.h b/interfaces/kits/js/src/common/ani_helper/error_handler.h index cab44cc1ca34c21392affa2009f29f8d98d43103..31dac86f3a4a2c805e9263768fbc28b96699d8b5 100644 --- a/interfaces/kits/js/src/common/ani_helper/error_handler.h +++ b/interfaces/kits/js/src/common/ani_helper/error_handler.h @@ -85,13 +85,17 @@ private: const std::string &errMsg, const std::optional &errData = std::nullopt) { ani_class cls; + // Pls replace manually if (ANI_OK != env->FindClass(className, &cls)) { HILOGE("Cannot find class '%{private}s'", className); return { ANI_NOT_FOUND, nullptr }; } ani_method ctor; - if (ANI_OK != env->Class_FindMethod(cls, "", ":V", &ctor)) { + auto methodCtor = arkts::ani_signature::Builder::BuildConstructorName(); + arkts::ani_signature::SignatureBuilder methodCtorSigBuilder; + auto methodCtorSignature = methodCtorSigBuilder.BuildSignatureDescriptor(); + if (ANI_OK != env->Class_FindMethod(cls, methodCtor.c_str(), methodCtorSignature.c_str(), &ctor)) { HILOGE("Cannot find constructor for class '%{private}s'", className); return { ANI_NOT_FOUND, nullptr }; } diff --git a/interfaces/kits/js/src/common/ani_helper/type_converter.cpp b/interfaces/kits/js/src/common/ani_helper/type_converter.cpp index e618699674ad19375fb59c8391765074e448a6d9..b507ec2d40da3c58a39c421d982749d33dbe6f1c 100644 --- a/interfaces/kits/js/src/common/ani_helper/type_converter.cpp +++ b/interfaces/kits/js/src/common/ani_helper/type_converter.cpp @@ -58,11 +58,13 @@ std::tuple> TypeConverter::ToOptionalInt32(ani_env } ani_double doubleValue; + // Pls replace manually if (ANI_OK == env->Object_CallMethodByName_Double(value, "doubleValue", nullptr, &doubleValue)) { return { true, std::make_optional(static_cast(doubleValue)) }; } ani_int intValue; + // Pls replace manually if (ANI_OK == env->Object_CallMethodByName_Int(value, "intValue", nullptr, &intValue)) { return { true, std::make_optional(intValue) }; } @@ -83,11 +85,13 @@ std::tuple> TypeConverter::ToOptionalInt64(ani_env } ani_double doubleValue; + // Pls replace manually if (ANI_OK == env->Object_CallMethodByName_Double(value, "doubleValue", nullptr, &doubleValue)) { return { true, std::make_optional(static_cast(doubleValue)) }; } ani_long longValue; + // Pls replace manually if (ANI_OK == env->Object_CallMethodByName_Long(value, "longValue", nullptr, &longValue)) { return { true, std::make_optional(longValue) }; } @@ -143,10 +147,12 @@ static std::tuple ParseFd(ani_env *env, const ani_object &pathOrF ani_boolean isFd = false; ani_class DoubleClass; - env->FindClass("Lstd/core/Double;", &DoubleClass); + auto classTypeDouble = arkts::ani_signature::Builder::BuildClass({"std", "core", "Double"}); + env->FindClass(classTypeDouble.Descriptor().c_str(), &DoubleClass); env->Object_InstanceOf(pathOrFd, DoubleClass, &isFd); if (isFd) { ani_double doubleValue; + // Pls replace manually if (ANI_OK != env->Object_CallMethodByName_Double(pathOrFd, "doubleValue", nullptr, &doubleValue)) { HILOGE("Parse file path failed"); return { false, 0 }; @@ -156,10 +162,12 @@ static std::tuple ParseFd(ani_env *env, const ani_object &pathOrF } ani_class IntClass; - env->FindClass("Lstd/core/Int;", &IntClass); + auto classTypeInt = arkts::ani_signature::Builder::BuildClass({"std", "core", "Int"}); + env->FindClass(classTypeInt.Descriptor().c_str(), &IntClass); env->Object_InstanceOf(pathOrFd, IntClass, &isFd); if (isFd) { ani_int fd; + // Pls replace manually if (ANI_OK != env->Object_CallMethodByName_Int(pathOrFd, "intValue", nullptr, &fd)) { HILOGE("Parse file path failed"); return { false, 0 }; @@ -178,7 +186,8 @@ std::tuple TypeConverter::ToFileInfo(ani_env *env, const ani_obj } ani_class stringClass; - env->FindClass("Lstd/core/String;", &stringClass); + auto classTypeString = arkts::ani_signature::Builder::BuildClass({"std", "core", "String"}); + env->FindClass(classTypeString.Descriptor().c_str(), &stringClass); ani_boolean isPath = false; env->Object_InstanceOf(pathOrFd, stringClass, &isPath); @@ -235,7 +244,8 @@ std::tuple TypeConverter::ToAniStringList( ani_array_ref result = nullptr; ani_class itemCls = nullptr; - if (env->FindClass("Lstd/core/String;", &itemCls) != ANI_OK) { + auto classTypeString = arkts::ani_signature::Builder::BuildClass({"std", "core", "String"}); + if (env->FindClass(classTypeString.Descriptor().c_str(), &itemCls) != ANI_OK) { return { false, result }; } if (env->Array_New_Ref(itemCls, length, nullptr, &result) != ANI_OK) { diff --git a/interfaces/kits/js/src/mod_fs/class_file/ani/file_wrapper.cpp b/interfaces/kits/js/src/mod_fs/class_file/ani/file_wrapper.cpp index 047f033a5bf60d0b18b3dd57db9e5bc21fb752ff..c43bed19ac28182845d922b83b9da04a149cb6e2 100644 --- a/interfaces/kits/js/src/mod_fs/class_file/ani/file_wrapper.cpp +++ b/interfaces/kits/js/src/mod_fs/class_file/ani/file_wrapper.cpp @@ -44,12 +44,17 @@ ani_object FileWrapper::Wrap(ani_env *env, const FsFile *file) { static const char *className = "L@ohos/file/fs/FileInner;"; ani_class cls; + // Pls replace manually if (ANI_OK != env->FindClass(className, &cls)) { HILOGE("Cannot find class %s", className); return nullptr; } ani_method ctor; - if (ANI_OK != env->Class_FindMethod(cls, "", "J:V", &ctor)) { + auto methodCtor = arkts::ani_signature::Builder::BuildConstructorName(); + arkts::ani_signature::SignatureBuilder methodCtorSigBuilder; + methodCtorSigBuilder.AddLong(); + auto methodCtorSignature = methodCtorSigBuilder.BuildSignatureDescriptor(); + if (ANI_OK != env->Class_FindMethod(cls, methodCtor.c_str(), methodCtorSignature.c_str(), &ctor)) { HILOGE("Cannot find constructor method for class %s", className); return nullptr; } diff --git a/interfaces/kits/js/src/mod_fs/class_randomaccessfile/ani/randomaccessfile_ani.cpp b/interfaces/kits/js/src/mod_fs/class_randomaccessfile/ani/randomaccessfile_ani.cpp index 36f30dad896fd81b72a4be4e7e80c0d242281c88..5ccca74bc85ceea83cee16985b668065dc9384f6 100644 --- a/interfaces/kits/js/src/mod_fs/class_randomaccessfile/ani/randomaccessfile_ani.cpp +++ b/interfaces/kits/js/src/mod_fs/class_randomaccessfile/ani/randomaccessfile_ani.cpp @@ -101,7 +101,8 @@ static tuple> ToWriteOptions(ani_env *env, ani_obje static tuple ParseStringBuffer(ani_env *env, const ani_object &buf) { ani_class cls; - env->FindClass("Lstd/core/String;", &cls); + auto classTypeString = arkts::ani_signature::Builder::BuildClass({"std", "core", "String"}); + env->FindClass(classTypeString.Descriptor().c_str(), &cls); ani_boolean isString; env->Object_InstanceOf(buf, cls, &isString); @@ -115,7 +116,8 @@ static tuple ParseStringBuffer(ani_env *env, const ani_object static tuple ParseArrayBuffer(ani_env *env, const ani_object &buf) { ani_class cls; - env->FindClass("Lescompat/ArrayBuffer;", &cls); + auto classTypeArrayBuffer = arkts::ani_signature::Builder::BuildClass({"escompat", "ArrayBuffer"}); + env->FindClass(classTypeArrayBuffer.Descriptor().c_str(), &cls); ani_boolean isArrayBuffer; env->Object_InstanceOf(buf, cls, &isArrayBuffer); diff --git a/interfaces/kits/js/src/mod_fs/class_readeriterator/ani/reader_iterator_ani.cpp b/interfaces/kits/js/src/mod_fs/class_readeriterator/ani/reader_iterator_ani.cpp index b5f8b55b93c91b0b2b2c1b9a046cdc2968dab24f..e5dab742a3135b59324613c41c72bbb6bee0b290 100644 --- a/interfaces/kits/js/src/mod_fs/class_readeriterator/ani/reader_iterator_ani.cpp +++ b/interfaces/kits/js/src/mod_fs/class_readeriterator/ani/reader_iterator_ani.cpp @@ -32,12 +32,17 @@ ani_object ReaderIteratorAni::Wrap(ani_env *env, const FsReaderIterator *it) static const char *className = "L@ohos/file/fs/ReaderIteratorInner;"; ani_class cls; + // Pls replace manually if (ANI_OK != env->FindClass(className, &cls)) { HILOGE("Cannot find class %s", className); return nullptr; } ani_method ctor; - if (ANI_OK != env->Class_FindMethod(cls, "", "J:V", &ctor)) { + auto methodCtor = arkts::ani_signature::Builder::BuildConstructorName(); + arkts::ani_signature::SignatureBuilder methodCtorSigBuilder; + methodCtorSigBuilder.AddLong(); + auto methodCtorSignature = methodCtorSigBuilder.BuildSignatureDescriptor(); + if (ANI_OK != env->Class_FindMethod(cls, methodCtor.c_str(), methodCtorSignature.c_str(), &ctor)) { HILOGE("Cannot find constructor method for class %s", className); return nullptr; } diff --git a/interfaces/kits/js/src/mod_fs/class_readeriterator/ani/reader_iterator_result_ani.cpp b/interfaces/kits/js/src/mod_fs/class_readeriterator/ani/reader_iterator_result_ani.cpp index 0ea8f121b13ffdf8bf88536279e737b91519685b..9954d9bf8c190ea9ca7719bcb53a70b033d72722 100644 --- a/interfaces/kits/js/src/mod_fs/class_readeriterator/ani/reader_iterator_result_ani.cpp +++ b/interfaces/kits/js/src/mod_fs/class_readeriterator/ani/reader_iterator_result_ani.cpp @@ -31,12 +31,17 @@ ani_object ReaderIteratorResultAni::Wrap(ani_env *env, const ReaderIteratorResul static const char *className = "L@ohos/file/fs/ReaderIteratorResultInner;"; ani_class cls; + // Pls replace manually if (ANI_OK != env->FindClass(className, &cls)) { HILOGE("Cannot find class %s", className); return nullptr; } ani_method ctor; - if (ANI_OK != env->Class_FindMethod(cls, "", "J:V", &ctor)) { + auto methodCtor = arkts::ani_signature::Builder::BuildConstructorName(); + arkts::ani_signature::SignatureBuilder methodCtorSigBuilder; + methodCtorSigBuilder.AddLong(); + auto methodCtorSignature = methodCtorSigBuilder.BuildSignatureDescriptor(); + if (ANI_OK != env->Class_FindMethod(cls, methodCtor.c_str(), methodCtorSignature.c_str(), &ctor)) { HILOGE("Cannot find constructor method for class %s", className); return nullptr; } 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 02a9bca9fc8b1a7d4bac48c492a1e73069ccb491..ffad472e24078605fa09e4a78b8975a1cb31acb4 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 @@ -34,6 +34,7 @@ static ani_status SetNumProperty( { ani_method setter; ani_status ret; + // Pls replace manually if ((ret = env->Class_FindMethod(cls, name, nullptr, &setter)) != ANI_OK) { HILOGE("Class_FindMethod Fail %{private}s, err: %{private}d", name, ret); return ret; @@ -50,13 +51,18 @@ static ani_status SetBigIntProperty( ani_class cls; ani_status ret; + // Pls replace manually if ((ret = env->FindClass(className, &cls)) != ANI_OK) { HILOGE("Not found %{private}s, err: %{private}d", className, ret); return ret; } ani_method ctor; - if ((ret = env->Class_FindMethod(cls, "", "D:V", &ctor)) != ANI_OK) { + auto methodCtor = arkts::ani_signature::Builder::BuildConstructorName(); + arkts::ani_signature::SignatureBuilder methodCtorSigBuilder; + methodCtorSigBuilder.AddDouble(); + auto methodCtorSignature = methodCtorSigBuilder.BuildSignatureDescriptor(); + if ((ret = env->Class_FindMethod(cls, methodCtor.c_str(), methodCtorSignature.c_str(), &ctor)) != ANI_OK) { HILOGE("Not found ctor, err: %{private}d", ret); return ret; } @@ -67,6 +73,7 @@ static ani_status SetBigIntProperty( } ani_method setter; + // Pls replace manually if ((ret = env->Class_FindMethod(statCls, name, nullptr, &setter)) != ANI_OK) { HILOGE("Class_FindMethod Fail %{private}s, err: %{private}d", name, ret); return ret; @@ -90,6 +97,7 @@ static ani_status SetEnumLocation( { ani_method setter; ani_status ret; + // Pls replace manually if ((ret = env->Class_FindMethod(cls, name, nullptr, &setter)) != ANI_OK) { HILOGE("Class_FindMethod Fail %{private}s, err: %{private}d", name, ret); return ret; @@ -151,13 +159,18 @@ tuple StatWrapper::Wrap(ani_env *env, FsStat *fsStat) ani_class cls; ani_status ret; + // Pls replace manually if ((ret = env->FindClass(className, &cls)) != ANI_OK) { HILOGE("Not found %{private}s, err: %{private}d", className, ret); return { ret, statObject }; } ani_method ctor; - if ((ret = env->Class_FindMethod(cls, "", "J:V", &ctor)) != ANI_OK) { + auto methodCtor = arkts::ani_signature::Builder::BuildConstructorName(); + arkts::ani_signature::SignatureBuilder methodCtorSigBuilder; + methodCtorSigBuilder.AddLong(); + auto methodCtorSignature = methodCtorSigBuilder.BuildSignatureDescriptor(); + if ((ret = env->Class_FindMethod(cls, methodCtor.c_str(), methodCtorSignature.c_str(), &ctor)) != ANI_OK) { HILOGE("Not found ctor, err: %{private}d", ret); return { ret, statObject }; } diff --git a/interfaces/kits/js/src/mod_fs/class_stream/ani/stream_ani.cpp b/interfaces/kits/js/src/mod_fs/class_stream/ani/stream_ani.cpp index abce84a4d07513b72e48dd90e3495560b081af26..590054517a5b22c883de457f37141566510f5bbc 100644 --- a/interfaces/kits/js/src/mod_fs/class_stream/ani/stream_ani.cpp +++ b/interfaces/kits/js/src/mod_fs/class_stream/ani/stream_ani.cpp @@ -92,7 +92,8 @@ static tuple> ToWriteOptions(ani_env *env, ani_obje static std::tuple ParseStringBuffer(ani_env *env, const ani_object &buf) { ani_class cls; - env->FindClass("Lstd/core/String;", &cls); + auto classTypeString = arkts::ani_signature::Builder::BuildClass({"std", "core", "String"}); + env->FindClass(classTypeString.Descriptor().c_str(), &cls); ani_boolean isString; env->Object_InstanceOf(buf, cls, &isString); @@ -106,7 +107,8 @@ static std::tuple ParseStringBuffer(ani_env *env, const ani_ob static std::tuple ParseArrayBuffer(ani_env *env, const ani_object &buf) { ani_class cls; - env->FindClass("Lescompat/ArrayBuffer;", &cls); + auto classTypeArrayBuffer = arkts::ani_signature::Builder::BuildClass({"escompat", "ArrayBuffer"}); + env->FindClass(classTypeArrayBuffer.Descriptor().c_str(), &cls); ani_boolean isArrayBuffer; env->Object_InstanceOf(buf, cls, &isArrayBuffer); diff --git a/interfaces/kits/js/src/mod_fs/class_stream/ani/stream_wrapper.cpp b/interfaces/kits/js/src/mod_fs/class_stream/ani/stream_wrapper.cpp index 31ff9ec263797ba2f333c5a252a4b5a4daba373e..36b059dae5b52f9893330852862f3e639584a691 100644 --- a/interfaces/kits/js/src/mod_fs/class_stream/ani/stream_wrapper.cpp +++ b/interfaces/kits/js/src/mod_fs/class_stream/ani/stream_wrapper.cpp @@ -45,12 +45,17 @@ ani_object StreamWrapper::Wrap(ani_env *env, const FsStream *stream) { static const char *className = "L@ohos/file/fs/StreamInner;"; ani_class cls; + // Pls replace manually if (ANI_OK != env->FindClass(className, &cls)) { HILOGE("Cannot find class %s", className); return nullptr; } ani_method ctor; - if (ANI_OK != env->Class_FindMethod(cls, "", "J:V", &ctor)) { + auto methodCtor = arkts::ani_signature::Builder::BuildConstructorName(); + arkts::ani_signature::SignatureBuilder methodCtorSigBuilder; + methodCtorSigBuilder.AddLong(); + auto methodCtorSignature = methodCtorSigBuilder.BuildSignatureDescriptor(); + if (ANI_OK != env->Class_FindMethod(cls, methodCtor.c_str(), methodCtorSignature.c_str(), &ctor)) { HILOGE("Cannot find constructor method for class %s", className); return nullptr; } diff --git a/interfaces/kits/js/src/mod_fs/class_tasksignal/ani/task_signal_ani.cpp b/interfaces/kits/js/src/mod_fs/class_tasksignal/ani/task_signal_ani.cpp index f22a814f94d56868bfe4f8051093be06a053930e..2a9d335383cf2fc18aa12c761aa81cee1e13d14a 100644 --- a/interfaces/kits/js/src/mod_fs/class_tasksignal/ani/task_signal_ani.cpp +++ b/interfaces/kits/js/src/mod_fs/class_tasksignal/ani/task_signal_ani.cpp @@ -1,113 +1,114 @@ -/* - * Copyright (c) 2025 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "task_signal_ani.h" - -#include "ani_helper.h" -#include "copy_core.h" -#include "error_handler.h" -#include "filemgmt_libhilog.h" -#include "task_signal_entity_core.h" -#include "type_converter.h" - -namespace OHOS { -namespace FileManagement { -namespace ModuleFileIO { -namespace ANI { -using namespace std; -using namespace OHOS::FileManagement::ModuleFileIO; - -static TaskSignalEntityCore *Unwrap(ani_env *env, ani_object object) -{ - ani_long entity; - auto ret = env->Object_GetFieldByName_Long(object, "nativeTaskSignal", &entity); - if (ret != ANI_OK) { - HILOGE("Unwrap taskSignalEntityCore err: %{private}d", ret); - return nullptr; - } - return reinterpret_cast(entity); -} - -void TaskSignalAni::Cancel(ani_env *env, [[maybe_unused]] ani_object object) -{ - auto entity = Unwrap(env, object); - if (entity == nullptr) { - ErrorHandler::Throw(env, EINVAL); - return; - } - if (entity->taskSignal_ == nullptr) { - HILOGE("Failed to get watcherEntity when stop."); - ErrorHandler::Throw(env, EINVAL); - return; - } - - auto ret = entity->taskSignal_->Cancel(); - if (ret != NO_ERROR) { - HILOGE("Failed to cancel the task."); - ErrorHandler::Throw(env, CANCEL_ERR); - return; - } -} - -void TaskSignalAni::OnCancel(ani_env *env, [[maybe_unused]] ani_object object) -{ - auto entity = Unwrap(env, object); - if (entity == nullptr) { - ErrorHandler::Throw(env, EINVAL); - return; - } - if (entity->taskSignal_ == nullptr) { - HILOGE("Failed to get watcherEntity when stop."); - ErrorHandler::Throw(env, EINVAL); - return; - } - - ani_ref globalObj; - auto status = env->GlobalReference_Create(object, &globalObj); - if (status != ANI_OK) { - HILOGE("GlobalReference_Create, err: %{private}d", status); - return; - } - ani_vm *vm = nullptr; - env->GetVM(&vm); - auto cb = [vm, &globalObj](string filePath) -> void { - auto env = AniHelper::GetThreadEnv(vm); - if (env == nullptr) { - HILOGE("failed to GetThreadEnv"); - return; - } - - // std::vector vec; - auto [succPath, path] = TypeConverter::ToAniString(env, filePath); - if (!succPath) { - HILOGE("ToAniString failed"); - return; - } - - auto ret = env->Object_CallMethodByName_Void(static_cast(globalObj), - "onCancelCallback", nullptr, path); - if (ret != ANI_OK) { - HILOGE("Call onCancelCallback failed, err: %{private}d", ret); - return; - } - }; - auto callbackContext = std::make_shared(cb); - entity->callbackContextCore_ = callbackContext; - entity->taskSignal_->SetTaskSignalListener(entity); -} -} // namespace ANI -} // namespace ModuleFileIO -} // namespace FileManagement +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "task_signal_ani.h" + +#include "ani_helper.h" +#include "copy_core.h" +#include "error_handler.h" +#include "filemgmt_libhilog.h" +#include "task_signal_entity_core.h" +#include "type_converter.h" + +namespace OHOS { +namespace FileManagement { +namespace ModuleFileIO { +namespace ANI { +using namespace std; +using namespace OHOS::FileManagement::ModuleFileIO; + +static TaskSignalEntityCore *Unwrap(ani_env *env, ani_object object) +{ + ani_long entity; + auto ret = env->Object_GetFieldByName_Long(object, "nativeTaskSignal", &entity); + if (ret != ANI_OK) { + HILOGE("Unwrap taskSignalEntityCore err: %{private}d", ret); + return nullptr; + } + return reinterpret_cast(entity); +} + +void TaskSignalAni::Cancel(ani_env *env, [[maybe_unused]] ani_object object) +{ + auto entity = Unwrap(env, object); + if (entity == nullptr) { + ErrorHandler::Throw(env, EINVAL); + return; + } + if (entity->taskSignal_ == nullptr) { + HILOGE("Failed to get watcherEntity when stop."); + ErrorHandler::Throw(env, EINVAL); + return; + } + + auto ret = entity->taskSignal_->Cancel(); + if (ret != NO_ERROR) { + HILOGE("Failed to cancel the task."); + ErrorHandler::Throw(env, CANCEL_ERR); + return; + } +} + +void TaskSignalAni::OnCancel(ani_env *env, [[maybe_unused]] ani_object object) +{ + auto entity = Unwrap(env, object); + if (entity == nullptr) { + ErrorHandler::Throw(env, EINVAL); + return; + } + if (entity->taskSignal_ == nullptr) { + HILOGE("Failed to get watcherEntity when stop."); + ErrorHandler::Throw(env, EINVAL); + return; + } + + ani_ref globalObj; + auto status = env->GlobalReference_Create(object, &globalObj); + if (status != ANI_OK) { + HILOGE("GlobalReference_Create, err: %{private}d", status); + return; + } + ani_vm *vm = nullptr; + env->GetVM(&vm); + auto cb = [vm, &globalObj](string filePath) -> void { + auto env = AniHelper::GetThreadEnv(vm); + if (env == nullptr) { + HILOGE("failed to GetThreadEnv"); + return; + } + + // std::vector vec; + auto [succPath, path] = TypeConverter::ToAniString(env, filePath); + if (!succPath) { + HILOGE("ToAniString failed"); + return; + } + + // Pls replace manually + auto ret = env->Object_CallMethodByName_Void(static_cast(globalObj), + "onCancelCallback", nullptr, path); + if (ret != ANI_OK) { + HILOGE("Call onCancelCallback failed, err: %{private}d", ret); + return; + } + }; + auto callbackContext = std::make_shared(cb); + entity->callbackContextCore_ = callbackContext; + entity->taskSignal_->SetTaskSignalListener(entity); +} +} // namespace ANI +} // namespace ModuleFileIO +} // namespace FileManagement } // namespace OHOS \ No newline at end of file diff --git a/interfaces/kits/js/src/mod_fs/properties/ani/close_ani.cpp b/interfaces/kits/js/src/mod_fs/properties/ani/close_ani.cpp index f49ccf2f256d3f877b6970f70c7c27e698fcd57e..d7c49b15a3b6a66f76f39cc662de74ad9426427e 100644 --- a/interfaces/kits/js/src/mod_fs/properties/ani/close_ani.cpp +++ b/interfaces/kits/js/src/mod_fs/properties/ani/close_ani.cpp @@ -34,11 +34,13 @@ tuple ParseFd(ani_env *env, ani_object obj) { int32_t result = -1; ani_class IntClass; - env->FindClass("Lstd/core/Double;", &IntClass); + auto classTypeDouble = arkts::ani_signature::Builder::BuildClass({"std", "core", "Double"}); + env->FindClass(classTypeDouble.Descriptor().c_str(), &IntClass); ani_boolean isInt; env->Object_InstanceOf(obj, IntClass, &isInt); if (isInt) { ani_int fd; + // Pls replace manually if (ANI_OK != env->Object_CallMethodByName_Int(obj, "intValue", nullptr, &fd)) { HILOGE("Get fd value failed"); return { false, result }; @@ -48,7 +50,8 @@ tuple ParseFd(ani_env *env, ani_object obj) } ani_class FileClass; - env->FindClass("L@ohos/file/fs/FileInner;", &FileClass); + auto classTypeFileInner = arkts::ani_signature::Builder::BuildClass({"@ohos", "file", "fs", "FileInner"}); + env->FindClass(classTypeFileInner.Descriptor().c_str(), &FileClass); ani_boolean isFile; env->Object_InstanceOf(obj, FileClass, &isFile); if (isFile) { diff --git a/interfaces/kits/js/src/mod_fs/properties/ani/copy_ani.cpp b/interfaces/kits/js/src/mod_fs/properties/ani/copy_ani.cpp index 1f9b713c328cf0f9e8fef23f1eef5d2f60fc0116..1901dc6f18bed72cbd58f720fb4765f212d00da1 100644 --- a/interfaces/kits/js/src/mod_fs/properties/ani/copy_ani.cpp +++ b/interfaces/kits/js/src/mod_fs/properties/ani/copy_ani.cpp @@ -50,13 +50,19 @@ static void SetProgressListenerCb(ani_env *env, ani_ref &callback, CopyOptions & HILOGE("progressSize or totalSize exceed MAX_VALUE: %{private}llu %{private}llu", progressSize, totalSize); } + // Pls replace manually if ((ret = env->FindClass(className, &cls)) != ANI_OK) { HILOGE("Not found %{private}s, err: %{private}d", className, ret); return; } ani_method ctor; - if ((ret = env->Class_FindMethod(cls, "", "DD:V", &ctor)) != ANI_OK) { + auto methodCtor = arkts::ani_signature::Builder::BuildConstructorName(); + arkts::ani_signature::SignatureBuilder methodCtorSigBuilder; + methodCtorSigBuilder.AddDouble(); + methodCtorSigBuilder.AddDouble(); + auto methodCtorSignature = methodCtorSigBuilder.BuildSignatureDescriptor(); + if ((ret = env->Class_FindMethod(cls, methodCtor.c_str(), methodCtorSignature.c_str(), &ctor)) != ANI_OK) { HILOGE("Not found ctor, err: %{private}d", ret); return; } diff --git a/interfaces/kits/js/src/mod_fs/properties/ani/create_randomaccessfile_ani.cpp b/interfaces/kits/js/src/mod_fs/properties/ani/create_randomaccessfile_ani.cpp index 3b72266483578e7be989880e7260df0654d1b4cd..bec402b155bb8974ec08fb7e987b90f2f19133f2 100644 --- a/interfaces/kits/js/src/mod_fs/properties/ani/create_randomaccessfile_ani.cpp +++ b/interfaces/kits/js/src/mod_fs/properties/ani/create_randomaccessfile_ani.cpp @@ -33,12 +33,17 @@ static ani_object Wrap(ani_env *env, const FsRandomAccessFile *rafFile) { static const char *className = "L@ohos/file/fs/RandomAccessFileInner;"; ani_class cls; + // Pls replace manually if (ANI_OK != env->FindClass(className, &cls)) { HILOGE("Cannot find class %s", className); return nullptr; } ani_method ctor; - if (ANI_OK != env->Class_FindMethod(cls, "", "J:V", &ctor)) { + auto methodCtor = arkts::ani_signature::Builder::BuildConstructorName(); + arkts::ani_signature::SignatureBuilder methodCtorSigBuilder; + methodCtorSigBuilder.AddLong(); + auto methodCtorSignature = methodCtorSigBuilder.BuildSignatureDescriptor(); + if (ANI_OK != env->Class_FindMethod(cls, methodCtor.c_str(), methodCtorSignature.c_str(), &ctor)) { HILOGE("Cannot find constructor method for class %s", className); return nullptr; } @@ -74,7 +79,8 @@ static ani_object Wrap(ani_env *env, const FsRandomAccessFile *rafFile) static tuple JudgeFile(ani_env *env, ani_object obj) { ani_class stringClass; - env->FindClass("Lstd/core/String;", &stringClass); + auto classTypeString = arkts::ani_signature::Builder::BuildClass({"std", "core", "String"}); + env->FindClass(classTypeString.Descriptor().c_str(), &stringClass); ani_boolean isString = false; env->Object_InstanceOf(obj, stringClass, &isString); if (isString) { @@ -82,7 +88,8 @@ static tuple JudgeFile(ani_env *env, ani_object obj) } ani_class fileClass; - env->FindClass("L@ohos/file/fs/FileInner;", &fileClass); + auto classTypeFileInner = arkts::ani_signature::Builder::BuildClass({"@ohos", "file", "fs", "FileInner"}); + env->FindClass(classTypeFileInner.Descriptor().c_str(), &fileClass); ani_boolean isFile = false; env->Object_InstanceOf(obj, fileClass, &isFile); if (isFile) { diff --git a/interfaces/kits/js/src/mod_fs/properties/ani/listfile_ani.cpp b/interfaces/kits/js/src/mod_fs/properties/ani/listfile_ani.cpp index 8540848a3f65a064ee14969ddb619248aeb6c414..8ff449112a0b6d19fbbdfc2650b011c3f1f52422 100644 --- a/interfaces/kits/js/src/mod_fs/properties/ani/listfile_ani.cpp +++ b/interfaces/kits/js/src/mod_fs/properties/ani/listfile_ani.cpp @@ -40,8 +40,10 @@ tuple ParseBooleanParam(ani_env *env, ani_object obj, string tag) return { true, false }; } ani_boolean bool_ref_res; - if (ANI_OK != env->Object_CallMethodByName_Boolean( - static_cast(bool_ref), "unboxed", ":Z", &bool_ref_res)) { + arkts::ani_signature::SignatureBuilder unboxedSigBuilder; + unboxedSigBuilder.SetReturnBoolean(); + auto unboxedSignature = unboxedSigBuilder.BuildSignatureDescriptor(); + if (ANI_OK != env->Object_CallMethodByName_Boolean(static_cast(bool_ref), "unboxed", unboxedSignature.c_str(), &bool_ref_res)) { return { false, false }; } return { true, static_cast(bool_ref_res) }; @@ -60,6 +62,7 @@ tuple ParseIntParam(ani_env *env, ani_object obj, string tag) return { true, result }; } ani_int result_ref_res; + // Pls replace manually if (ANI_OK != env->Object_CallMethodByName_Int( static_cast(result_ref), "intValue", nullptr, &result_ref_res)) { result = -1; @@ -82,6 +85,7 @@ tuple> ParseDoubleParam(ani_env *env, ani_object obj, str } ani_double result_ref_res; + // Pls replace manually if (ANI_OK != env->Object_CallMethodByName_Double( static_cast(result_ref), "doubleValue", nullptr, &result_ref_res)) { return { false, nullopt }; diff --git a/interfaces/kits/js/src/mod_fs/properties/ani/write_ani.cpp b/interfaces/kits/js/src/mod_fs/properties/ani/write_ani.cpp index a87254108e209a06388e25516bac32315abe795e..b7c14857765a510394ea3703b0519f2b7106cf60 100644 --- a/interfaces/kits/js/src/mod_fs/properties/ani/write_ani.cpp +++ b/interfaces/kits/js/src/mod_fs/properties/ani/write_ani.cpp @@ -64,7 +64,8 @@ static tuple> ToWriteOptions(ani_env *env, ani_obje static std::tuple ParseStringBuffer(ani_env *env, const ani_object &buf) { ani_class cls; - env->FindClass("Lstd/core/String;", &cls); + auto classTypeString = arkts::ani_signature::Builder::BuildClass({"std", "core", "String"}); + env->FindClass(classTypeString.Descriptor().c_str(), &cls); ani_boolean isString; env->Object_InstanceOf(buf, cls, &isString); @@ -78,7 +79,8 @@ static std::tuple ParseStringBuffer(ani_env *env, const ani_ob static std::tuple ParseArrayBuffer(ani_env *env, const ani_object &buf) { ani_class cls; - env->FindClass("Lescompat/ArrayBuffer;", &cls); + auto classTypeArrayBuffer = arkts::ani_signature::Builder::BuildClass({"escompat", "ArrayBuffer"}); + env->FindClass(classTypeArrayBuffer.Descriptor().c_str(), &cls); ani_boolean isArrayBuffer; env->Object_InstanceOf(buf, cls, &isArrayBuffer);