From 2452b5ccf220f3b78b6b5abcb73f0a7f79d16e82 Mon Sep 17 00:00:00 2001 From: gennnji Date: Mon, 20 Jan 2025 09:38:55 +0800 Subject: [PATCH] add system object file & randomAccessFile Change-Id: I3464aaa48de0585e89f4b02a2e14ff188c314446 Signed-off-by: gennnji --- interfaces/kits/cj/BUILD.gn | 2 +- interfaces/kits/cj/src/file_ffi.cpp | 83 +++++++++++++++++++ interfaces/kits/cj/src/file_ffi.h | 3 + interfaces/kits/cj/src/file_fs_ffi.cpp | 81 ++++++++++++++++++ interfaces/kits/cj/src/file_fs_ffi.h | 6 ++ .../kits/cj/src/randomAccessFile_impl.cpp | 13 +++ .../kits/cj/src/randomAccessFile_impl.h | 1 + 7 files changed, 188 insertions(+), 1 deletion(-) diff --git a/interfaces/kits/cj/BUILD.gn b/interfaces/kits/cj/BUILD.gn index 5fda2a785..79642e8ff 100644 --- a/interfaces/kits/cj/BUILD.gn +++ b/interfaces/kits/cj/BUILD.gn @@ -61,10 +61,10 @@ ohos_shared_library("cj_file_fs_ffi") { include_dirs = [ "${src_path}/common", - "${src_path}/common/napi", "${src_path}/common/napi/n_async", "${src_path}/common/file_helper", "${src_path}/mod_fs", + "${src_path}/mod_fs/class_file", "${src_path}/mod_fs/class_randomaccessfile", "${src_path}/mod_fs/class_readeriterator", "${src_path}/mod_fs/properties", diff --git a/interfaces/kits/cj/src/file_ffi.cpp b/interfaces/kits/cj/src/file_ffi.cpp index b5f68cbd2..398e94f70 100644 --- a/interfaces/kits/cj/src/file_ffi.cpp +++ b/interfaces/kits/cj/src/file_ffi.cpp @@ -18,6 +18,11 @@ #include "file_ffi.h" #include "macro.h" #include "uni_error.h" +#include "js_native_api.h" +#include "js_native_api_types.h" +#include "file_n_exporter.h" +#include "file_entity.h" +#include "n_class.h" using namespace OHOS::FFI; using namespace OHOS::CJSystemapi; @@ -26,6 +31,84 @@ namespace CJSystemapi { namespace FileFs { extern "C" { +napi_value FfiConvertFile2Napi(napi_env env, int64_t id) +{ + napi_value undefined = nullptr; + napi_get_undefined(env, &undefined); + + auto instance = FFIData::GetData(id); + + if (instance == nullptr) { + LOGE("FfiConvertFile2Napi instance not exist %{public}" PRId64, id); + return undefined; + } + + napi_value objRAF = FileManagement::LibN::NClass::InstantiateClass( + env, + OHOS::FileManagement::ModuleFileIO::FileNExporter::className_, + {}); + if (!env || !objRAF) { + LOGE("Empty input: env %d, obj %d", env == nullptr, objRAF == nullptr); + return undefined; + } + + OHOS::FileManagement::ModuleFileIO::FileEntity *rafEntity = nullptr; + napi_status status = napi_unwrap(env, objRAF, reinterpret_cast(&rafEntity)); + if (status != napi_ok) { + LOGE("Cannot unwrap for pointer: %d", status); + return undefined; + } + if (!rafEntity) { + LOGE("Cannot instantiate file because of void entity"); + return undefined; + } + + rafEntity->fd_.swap(instance->fd_); + rafEntity->path_ = instance->path_; + rafEntity->uri_ = instance->uri_; + + napi_valuetype type; + status = napi_typeof(env, objRAF, &type); + if (status != napi_ok || type == napi_undefined) { + LOGE("[File]: create napiobj failed"); + return undefined; + } + + return objRAF; +} + +int64_t FfiCreateFileFromNapi(napi_env env, napi_value objRAF) +{ + using ModuleFileIOFileEntity = OHOS::FileManagement::ModuleFileIO::FileEntity; + using CJFileEntity = OHOS::CJSystemapi::FileFs::FileEntity; + + if (env == nullptr || objRAF == nullptr) { + LOGE("[File]: parameter is nullptr"); + return ERR_INVALID_INSTANCE_CODE; + } + + napi_valuetype type = napi_undefined; + + if (napi_typeof(env, objRAF, &type) != napi_ok || type != napi_object) { + LOGE("[File]: parameter is not object"); + return ERR_INVALID_INSTANCE_CODE; + } + + std::shared_ptr* entity = nullptr; + napi_status status = napi_unwrap(env, objRAF, reinterpret_cast(&entity)); + if (status != napi_ok || entity == nullptr) { + LOGE("Cannot unwrap for pointer: %d", status); + return ERR_INVALID_INSTANCE_CODE; + } + auto native = FFIData::Create(std::move((*entity)->fd_), (*entity)->path_, (*entity)->uri_); + if (native == nullptr) { + LOGE("[File]: Create ffidata failed"); + return ERR_INVALID_INSTANCE_CODE; + } + + return native->GetID(); +} + RetDataI64 FfiOHOSFileFsOpen(const char* path, int64_t mode) { LOGI("FS_TEST::FfiOHOSFILEOpen"); diff --git a/interfaces/kits/cj/src/file_ffi.h b/interfaces/kits/cj/src/file_ffi.h index a3d1a52f0..9dac38501 100644 --- a/interfaces/kits/cj/src/file_ffi.h +++ b/interfaces/kits/cj/src/file_ffi.h @@ -18,8 +18,11 @@ #include "cj_common_ffi.h" #include +#include "napi/native_api.h" extern "C" { + FFI_EXPORT napi_value FfiConvertFile2Napi(napi_env env, int64_t id); + FFI_EXPORT int64_t FfiCreateFileFromNapi(napi_env env, napi_value objRAF); FFI_EXPORT RetDataI64 FfiOHOSFileFsOpen(const char* path, int64_t mode); FFI_EXPORT int32_t FfiOHOSFileFsClose(int64_t file); FFI_EXPORT int32_t FfiOHOSFileFsCloseByFd(int32_t file); diff --git a/interfaces/kits/cj/src/file_fs_ffi.cpp b/interfaces/kits/cj/src/file_fs_ffi.cpp index 2d0c94f8d..bb49d9d9f 100644 --- a/interfaces/kits/cj/src/file_fs_ffi.cpp +++ b/interfaces/kits/cj/src/file_fs_ffi.cpp @@ -25,6 +25,9 @@ #include "move_file.h" #include "symlink.h" #include "uni_error.h" +#include "js_native_api.h" +#include "js_native_api_types.h" +#include "randomaccessfile_n_exporter.h" using namespace OHOS::FFI; @@ -216,6 +219,7 @@ RetDataI64 FfiOHOSFileFsWriteCur(int32_t fd, char* buffer, size_t length, const return ret; } +// RandomAccessFile RetDataI64 FfiOHOSFileFsCreateRandomAccessFileByString(const char* file, int64_t mode) { LOGI("FS_TEST::FfiOHOSFileFsCreateRandomAccessFileByString"); @@ -334,6 +338,83 @@ RetDataI64 FfiOHOSRandomAccessFileRead(int64_t id, char* buf, size_t len, int64_ return ret; } +napi_value FfiConvertRandomAccessFile2Napi(napi_env env, int64_t id) +{ + napi_value undefined = nullptr; + napi_get_undefined(env, &undefined); + + auto instance = FFIData::GetData(id); + if (instance == nullptr || instance->GetEntity() == nullptr) { + LOGE("FfiConvertRandomAccessFile2Napi instance not exist %{public}" PRId64, id); + return undefined; + } + + napi_value objRAF = FileManagement::LibN::NClass::InstantiateClass( + env, + OHOS::FileManagement::ModuleFileIO::RandomAccessFileNExporter::className_, + {}); + if (!env || !objRAF) { + LOGE("Empty input: env %d, obj %d", env == nullptr, objRAF == nullptr); + return undefined; + } + + OHOS::FileManagement::ModuleFileIO::RandomAccessFileEntity *rafEntity = nullptr; + napi_status status = napi_unwrap(env, objRAF, reinterpret_cast(&rafEntity)); + if (status != napi_ok) { + LOGE("Cannot unwrap for pointer: %d", status); + return undefined; + } + if (!rafEntity) { + LOGE("Cannot instantiate randomaccessfile because of void entity"); + return undefined; + } + + rafEntity->fd.swap(instance->GetEntity()->fd); + rafEntity->filePointer = instance->GetEntity()->filePointer; + rafEntity->start = instance->GetEntity()->start; + rafEntity->end = instance->GetEntity()->end; + + napi_valuetype type; + status = napi_typeof(env, objRAF, &type); + if (status != napi_ok || type == napi_undefined) { + LOGE("[RandomAccessFile]: create napiobj failed"); + return undefined; + } + + return objRAF; +} + +int64_t FfiCreateRandomAccessFileFromNapi(napi_env env, napi_value objRAF) +{ + if (env == nullptr || objRAF == nullptr) { + LOGE("[RandomAccessFile]: parameter is nullptr"); + return ERR_INVALID_INSTANCE_CODE; + } + + napi_valuetype type = napi_undefined; + + if (napi_typeof(env, objRAF, &type) != napi_ok || type != napi_object) { + LOGE("[RandomAccessFile]: parameter is not object"); + return ERR_INVALID_INSTANCE_CODE; + } + + std::shared_ptr* entity = nullptr; + napi_status status = napi_unwrap(env, objRAF, reinterpret_cast(&entity)); + if (status != napi_ok || entity == nullptr) { + LOGE("Cannot unwrap for pointer: %d", status); + return ERR_INVALID_INSTANCE_CODE; + } + + auto native = FFIData::Create(*entity); + + if (native == nullptr) { + LOGE("[RandomAccessFile]: Create ffidata failed"); + return ERR_INVALID_INSTANCE_CODE; + } + + return native->GetID(); +} + int32_t FfiOHOSFileFsMkdir(const char* path, bool recursion, bool isTwoArgs) { LOGI("FS_TEST::FfiOHOSFileFsMkdir"); diff --git a/interfaces/kits/cj/src/file_fs_ffi.h b/interfaces/kits/cj/src/file_fs_ffi.h index cfb634aaf..70898e728 100644 --- a/interfaces/kits/cj/src/file_fs_ffi.h +++ b/interfaces/kits/cj/src/file_fs_ffi.h @@ -23,6 +23,7 @@ #include "ffi_remote_data.h" #include "file_fs_impl.h" #include "list_file.h" +#include "napi/native_api.h" extern "C" { FFI_EXPORT RetDataI64 FfiOHOSFileFsStatByID(int32_t file); @@ -30,6 +31,10 @@ extern "C" { FFI_EXPORT RetDataI64 FfiOHOSFileFsCreateStream(const char* path, const char* mode); FFI_EXPORT RetDataI64 FfiOHOSFileFsFdopenStream(int32_t fd, const char* mode); FFI_EXPORT RetDataI64 FfiOHOSFileFsLstat(const char* path); + + // RandomAccessFile + FFI_EXPORT napi_value FfiConvertRandomAccessFile2Napi(napi_env env, int64_t id); + FFI_EXPORT int64_t FfiCreateRandomAccessFileFromNapi(napi_env env, napi_value objRAF); FFI_EXPORT RetDataI64 FfiOHOSFileFsCreateRandomAccessFileByString(const char* file, int64_t mode); FFI_EXPORT RetDataI64 FfiOHOSFileFsCreateRandomAccessFileByID(int64_t file, int64_t mode); FFI_EXPORT int32_t FfiOHOSRandomAccessFileGetFd(int64_t id); @@ -38,6 +43,7 @@ extern "C" { FFI_EXPORT void FfiOHOSRandomAccessFileClose(int64_t id); FFI_EXPORT RetDataI64 FfiOHOSRandomAccessFileWrite(int64_t id, char* buf, size_t len, int64_t offset); FFI_EXPORT RetDataI64 FfiOHOSRandomAccessFileRead(int64_t id, char* buf, size_t len, int64_t offset); + FFI_EXPORT int32_t FfiOHOSFileFsMkdir(const char* path, bool recursion, bool isTwoArgs); FFI_EXPORT int32_t FfiOHOSFileFsRmdir(const char* path); FFI_EXPORT OHOS::CJSystemapi::RetDataCArrConflictFiles FfiOHOSFileFsMoveDir(const char* src, const char* dest, diff --git a/interfaces/kits/cj/src/randomAccessFile_impl.cpp b/interfaces/kits/cj/src/randomAccessFile_impl.cpp index 65239dd45..44def964d 100644 --- a/interfaces/kits/cj/src/randomAccessFile_impl.cpp +++ b/interfaces/kits/cj/src/randomAccessFile_impl.cpp @@ -28,6 +28,7 @@ static int64_t CalculateOffset(int64_t offset, int64_t fPointer) } return offset; } + static int DoWriteRAF(char* buf, size_t len, int fd, int64_t offset) { std::unique_ptr write_req = { @@ -41,6 +42,7 @@ static int DoWriteRAF(char* buf, size_t len, int fd, int64_t offset) int ret = uv_fs_write(nullptr, write_req.get(), fd, &iov, 1, offset, nullptr); return ret; } + static int DoReadRAF(char* buf, size_t len, int fd, int64_t offset) { std::unique_ptr read_req = { @@ -53,11 +55,13 @@ static int DoReadRAF(char* buf, size_t len, int fd, int64_t offset) int ret = uv_fs_read(nullptr, read_req.get(), fd, &iov, 1, offset, nullptr); return ret; } + RandomAccessFileImpl::RandomAccessFileImpl(std::shared_ptr< OHOS::FileManagement::ModuleFileIO::RandomAccessFileEntity> entity) { entity_ = entity; } + int32_t RandomAccessFileImpl::GetFd() { LOGI("start get fs in cpp"); @@ -71,15 +75,18 @@ int32_t RandomAccessFileImpl::GetFd() } return entity_->fd.get()->GetFD(); } + int64_t RandomAccessFileImpl::GetFPointer() { return entity_->filePointer; } + void RandomAccessFileImpl::SetFilePointerSync(int64_t fp) { entity_->filePointer = fp; return; } + void RandomAccessFileImpl::CloseSync() { std::unique_ptr close_req = { @@ -95,6 +102,12 @@ void RandomAccessFileImpl::CloseSync() entity_ = nullptr; return; } + +std::shared_ptr RandomAccessFileImpl::GetEntity() +{ + return entity_; +} + std::tuple RandomAccessFileImpl::WriteSync(char* buf, size_t len, int64_t offset) { int64_t newOffset = CalculateOffset(offset, entity_->filePointer); diff --git a/interfaces/kits/cj/src/randomAccessFile_impl.h b/interfaces/kits/cj/src/randomAccessFile_impl.h index 0e19b6af7..4fbd51a96 100644 --- a/interfaces/kits/cj/src/randomAccessFile_impl.h +++ b/interfaces/kits/cj/src/randomAccessFile_impl.h @@ -34,6 +34,7 @@ public: int64_t GetFPointer(); void SetFilePointerSync(int64_t fp); void CloseSync(); + std::shared_ptr GetEntity(); std::tuple WriteSync(char* buf, size_t len, int64_t offset); std::tuple ReadSync(char* buf, size_t len, int64_t offset); -- Gitee