From b5c215d99588ae5e590d47c636f293eb578e362a Mon Sep 17 00:00:00 2001 From: onexiaomin Date: Sun, 9 Oct 2022 22:12:52 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E8=BD=AC=E6=8D=A2fileinfo?= =?UTF-8?q?=E7=9A=84=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: onexiaomin --- .../include/file_access_ext_ability.h | 1 + .../include/file_access_ext_proxy.h | 1 + .../include/file_access_ext_stub.h | 1 + .../include/file_access_ext_stub_impl.h | 1 + .../file_access/include/file_access_helper.h | 5 +- .../include/ifile_access_ext_base.h | 2 + .../include/js_file_access_ext_ability.h | 1 + .../include/napi_common_fileaccess.h | 13 +- .../src/file_access_ext_ability.cpp | 6 + .../file_access/src/file_access_ext_proxy.cpp | 50 ++++ .../file_access/src/file_access_ext_stub.cpp | 31 ++- .../src/file_access_ext_stub_impl.cpp | 14 ++ .../file_access/src/file_access_helper.cpp | 48 ++-- .../src/js_file_access_ext_ability.cpp | 79 ++++++- .../src/napi_common_fileaccess.cpp | 77 +----- .../test/external_file_access_test.cpp | 222 ++++++++++++++++++ .../test/medialibrary_file_access_test.cpp | 86 +++++++ .../file_access_ext_ability.js | 7 + .../napi_fileaccess_helper.cpp | 90 ++++++- .../napi_fileaccess_helper.h | 1 + .../FileExtensionAbility.ts | 46 ++++ 21 files changed, 669 insertions(+), 113 deletions(-) diff --git a/frameworks/innerkits/file_access/include/file_access_ext_ability.h b/frameworks/innerkits/file_access/include/file_access_ext_ability.h index d3879776..2042857c 100644 --- a/frameworks/innerkits/file_access/include/file_access_ext_ability.h +++ b/frameworks/innerkits/file_access/include/file_access_ext_ability.h @@ -53,6 +53,7 @@ public: virtual int ScanFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount, const FileFilter &filter, std::vector &fileInfoVec); virtual int GetRoots(std::vector &rootInfoVec); + virtual int TransformToFileInfo(const Uri &selectFile, FileInfo &fileInfo); virtual int Access(const Uri &uri, bool &isExist); virtual int RegisterNotify(sptr ¬ify); virtual int UnregisterNotify(sptr ¬ify); diff --git a/frameworks/innerkits/file_access/include/file_access_ext_proxy.h b/frameworks/innerkits/file_access/include/file_access_ext_proxy.h index b16630b4..c858f879 100644 --- a/frameworks/innerkits/file_access/include/file_access_ext_proxy.h +++ b/frameworks/innerkits/file_access/include/file_access_ext_proxy.h @@ -46,6 +46,7 @@ public: const FileFilter &filter, std::vector &fileInfoVec) override; virtual int ScanFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount, const FileFilter &filter, std::vector &fileInfoVec) override; + virtual int TransformToFileInfo(const Uri &selectFile, FileInfo &fileInfo) override; virtual int GetRoots(std::vector &rootInfoVec) override; virtual int Access(const Uri &uri, bool &isExist) override; virtual int RegisterNotify(sptr ¬ify) override; diff --git a/frameworks/innerkits/file_access/include/file_access_ext_stub.h b/frameworks/innerkits/file_access/include/file_access_ext_stub.h index 080287f0..26f65f37 100644 --- a/frameworks/innerkits/file_access/include/file_access_ext_stub.h +++ b/frameworks/innerkits/file_access/include/file_access_ext_stub.h @@ -43,6 +43,7 @@ private: ErrCode CmdRename(MessageParcel &data, MessageParcel &reply); ErrCode CmdListFile(MessageParcel &data, MessageParcel &reply); ErrCode CmdScanFile(MessageParcel &data, MessageParcel &reply); + ErrCode CmdTransformToFileInfo(MessageParcel &data, MessageParcel &reply); ErrCode CmdGetRoots(MessageParcel &data, MessageParcel &reply); ErrCode CmdAccess(MessageParcel &data, MessageParcel &reply); ErrCode CmdRegisterNotify(MessageParcel &data, MessageParcel &reply); diff --git a/frameworks/innerkits/file_access/include/file_access_ext_stub_impl.h b/frameworks/innerkits/file_access/include/file_access_ext_stub_impl.h index 8bf80eed..c488a92d 100644 --- a/frameworks/innerkits/file_access/include/file_access_ext_stub_impl.h +++ b/frameworks/innerkits/file_access/include/file_access_ext_stub_impl.h @@ -45,6 +45,7 @@ public: int ScanFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount, const FileFilter &filter, std::vector &fileInfoVec) override; int GetRoots(std::vector &rootInfoVec) override; + int TransformToFileInfo(const Uri &selectFile, FileInfo &fileInfo) override; int Access(const Uri &uri, bool &isExist) override; int RegisterNotify(sptr ¬ify) override; int UnregisterNotify(sptr ¬ify) override; diff --git a/frameworks/innerkits/file_access/include/file_access_helper.h b/frameworks/innerkits/file_access/include/file_access_helper.h index 23b2a152..027a4782 100644 --- a/frameworks/innerkits/file_access/include/file_access_helper.h +++ b/frameworks/innerkits/file_access/include/file_access_helper.h @@ -72,6 +72,7 @@ public: int GetRoots(std::vector &rootInfoVec); int On(std::shared_ptr &callback); int Off(); + int TransformToFileInfo(Uri &selectFile, FileInfo &fileInfo); private: sptr GetProxyByUri(Uri &uri); bool GetProxy(); @@ -86,10 +87,6 @@ private: std::shared_ptr GetConnectInfo(const std::string &bundleName); std::shared_ptr GetConnectInfo(const AAFwk::Want &want); - void InsertConnectInfo(const std::string &key, - const AAFwk::Want &want, - const sptr &fileExtProxy, - sptr fileExtConnection); sptr token_ = nullptr; std::unordered_map> cMap_; diff --git a/frameworks/innerkits/file_access/include/ifile_access_ext_base.h b/frameworks/innerkits/file_access/include/ifile_access_ext_base.h index ddae40eb..dd6ce022 100644 --- a/frameworks/innerkits/file_access/include/ifile_access_ext_base.h +++ b/frameworks/innerkits/file_access/include/ifile_access_ext_base.h @@ -46,6 +46,7 @@ public: CMD_SCAN_FILE, CMD_GET_ROOTS, CMD_ACCESS, + CMD_TRANSFORM_TO_FILEINFO, CMD_REGISTER_NOTIFY, CMD_UNREGISTER_NOTIFY }; @@ -61,6 +62,7 @@ public: virtual int ScanFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount, const FileFilter &filter, std::vector &fileInfoVec) = 0; virtual int GetRoots(std::vector &rootInfoVec) = 0; + virtual int TransformToFileInfo(const Uri &selectFile, FileInfo &fileInfo) = 0; virtual int Access(const Uri &uri, bool &isExist) = 0; virtual int RegisterNotify(sptr ¬ify) = 0; virtual int UnregisterNotify(sptr ¬ify) = 0; diff --git a/frameworks/innerkits/file_access/include/js_file_access_ext_ability.h b/frameworks/innerkits/file_access/include/js_file_access_ext_ability.h index df7179ee..196bbca3 100644 --- a/frameworks/innerkits/file_access/include/js_file_access_ext_ability.h +++ b/frameworks/innerkits/file_access/include/js_file_access_ext_ability.h @@ -69,6 +69,7 @@ public: int ListFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount, const FileFilter &filter, std::vector &fileInfoVec) override; int GetRoots(std::vector &rootInfoVec) override; + int TransformToFileInfo(const Uri &selectFile, FileInfo &fileInfo) override; int Access(const Uri &uri, bool &isExist) override; private: diff --git a/frameworks/innerkits/file_access/include/napi_common_fileaccess.h b/frameworks/innerkits/file_access/include/napi_common_fileaccess.h index bd0dc4d6..03d191dd 100644 --- a/frameworks/innerkits/file_access/include/napi_common_fileaccess.h +++ b/frameworks/innerkits/file_access/include/napi_common_fileaccess.h @@ -27,17 +27,9 @@ namespace OHOS { namespace FileAccessFwk { -bool UnwrapInt64ByPropertyName(napi_env env, napi_value param, const char *propertyName, int64_t &value); - -napi_value WrapUint32ToJS(napi_env env, uint32_t value); -uint32_t UnwrapUint32FromJS(napi_env env, napi_value param, uint32_t defaultValue = 0); -bool UnwrapUint32FromJS2(napi_env env, napi_value param, uint32_t &value); -bool UnwrapUint32ByPropertyName(napi_env env, napi_value param, const char *propertyName, uint32_t &value); -napi_value WrapBigIntUint64ToJS(napi_env env, uint64_t value); -uint64_t UnwrapBigIntUint64FromJS(napi_env env, napi_value param, uint64_t defaultValue = 0); -bool UnwrapBigIntUint64FromJS2(napi_env env, napi_value param, uint64_t &defaultValue); -bool UnwrapBigIntUint64ByPropertyName(napi_env env, napi_value param, const char *propertyName, uint64_t &value); +/* +bool UnwrapInt64ByPropertyName(napi_env env, napi_value param, const char *propertyName, int64_t &value); napi_value WrapFileInfo(napi_env env, const FileInfo &fileInfo); bool UnwrapFileInfo(napi_env env, napi_value param, FileInfo &fileInfo); @@ -51,6 +43,7 @@ bool UnwrapRootInfo(napi_env env, napi_value param, RootInfo &rootInfo); napi_value WrapArrayRootInfoToJS(napi_env env, const std::vector &rootInfoVec); bool UnwrapArrayRootInfoFromJS(napi_env env, napi_value param, std::vector &rootInfoVec); +*/ napi_value WrapArrayWantToJS(napi_env env, const std::vector &wantVec); bool UnwrapArrayWantFromJS(napi_env env, napi_value param, std::vector &wantVec); } // namespace FileAccessFwk diff --git a/frameworks/innerkits/file_access/src/file_access_ext_ability.cpp b/frameworks/innerkits/file_access/src/file_access_ext_ability.cpp index 27a8f975..2caa1616 100644 --- a/frameworks/innerkits/file_access/src/file_access_ext_ability.cpp +++ b/frameworks/innerkits/file_access/src/file_access_ext_ability.cpp @@ -117,6 +117,12 @@ int FileAccessExtAbility::GetRoots(std::vector &rootInfoVec) return ERR_OPERATION_NOT_SUPPORT; } +int FileAccessExtAbility::TransformToFileInfo(const Uri &selectFile, FileInfo &fileInfo) +{ + HILOG_ERROR("FileAccessExtAbility::TransformToFileInfo Undefined operation"); + return ERR_OPERATION_NOT_SUPPORT; +} + int FileAccessExtAbility::Access(const Uri &uri, bool &isExist) { HILOG_ERROR("FileAccessExtAbility::IsFileExist Undefined operation"); diff --git a/frameworks/innerkits/file_access/src/file_access_ext_proxy.cpp b/frameworks/innerkits/file_access/src/file_access_ext_proxy.cpp index 992adf6c..ecf340c4 100644 --- a/frameworks/innerkits/file_access/src/file_access_ext_proxy.cpp +++ b/frameworks/innerkits/file_access/src/file_access_ext_proxy.cpp @@ -559,6 +559,56 @@ int FileAccessExtProxy::GetRoots(std::vector &rootInfoVec) return ERR_OK; } +int FileAccessExtProxy::TransformToFileInfo(const Uri &selectFile, FileInfo &fileInfo) +{ + StartTrace(HITRACE_TAG_FILEMANAGEMENT, "TransformToFileInfo"); + MessageParcel data; + if (!data.WriteInterfaceToken(FileAccessExtProxy::GetDescriptor())) { + HILOG_ERROR("WriteInterfaceToken failed"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_PARCEL_FAIL; + } + + if (!data.WriteParcelable(&selectFile)) { + HILOG_ERROR("fail to WriteParcelable selectFile"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_PARCEL_FAIL; + } + + MessageParcel reply; + MessageOption option; + int err = Remote()->SendRequest(CMD_TRANSFORM_TO_FILEINFO, data, reply, option); + if (err != ERR_OK) { + HILOG_ERROR("fail to SendRequest. err: %{public}d", err); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return err; + } + + int ret = ERR_PARCEL_FAIL; + if (!reply.ReadInt32(ret)) { + HILOG_ERROR("fail to ReadInt32 ret"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_PARCEL_FAIL; + } + + if (ret != ERR_OK) { + HILOG_ERROR("TransformToFileInfo operation failed ret : %{public}d", ret); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ret; + } + + std::unique_ptr fileInfoTemp(reply.ReadParcelable()); + if (fileInfoTemp == nullptr) { + HILOG_ERROR("ReadParcelable value is nullptr."); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_PARCEL_FAIL; + } + + fileInfo = *fileInfoTemp; + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_OK; +} + int FileAccessExtProxy::Access(const Uri &uri, bool &isExist) { StartTrace(HITRACE_TAG_FILEMANAGEMENT, "Access"); diff --git a/frameworks/innerkits/file_access/src/file_access_ext_stub.cpp b/frameworks/innerkits/file_access/src/file_access_ext_stub.cpp index dac72722..04e6c158 100644 --- a/frameworks/innerkits/file_access/src/file_access_ext_stub.cpp +++ b/frameworks/innerkits/file_access/src/file_access_ext_stub.cpp @@ -50,6 +50,7 @@ FileAccessExtStub::FileAccessExtStub() stubFuncMap_[CMD_SCAN_FILE] = &FileAccessExtStub::CmdScanFile; stubFuncMap_[CMD_GET_ROOTS] = &FileAccessExtStub::CmdGetRoots; stubFuncMap_[CMD_ACCESS] = &FileAccessExtStub::CmdAccess; + stubFuncMap_[CMD_TRANSFORM_TO_FILEINFO] = &FileAccessExtStub::CmdTransformToFileInfo; stubFuncMap_[CMD_REGISTER_NOTIFY] = &FileAccessExtStub::CmdRegisterNotify; stubFuncMap_[CMD_UNREGISTER_NOTIFY] = &FileAccessExtStub::CmdUnregisterNotify; } @@ -467,7 +468,7 @@ ErrCode FileAccessExtStub::CmdAccess(MessageParcel &data, MessageParcel &reply) return ERR_INVALID_URI; } - bool isExist = data.ReadBool(); + bool isExist = false; int ret = Access(*uri, isExist); if (!reply.WriteInt32(ret)) { HILOG_ERROR("Parameter Access fail to WriteInt32 ret"); @@ -485,6 +486,34 @@ ErrCode FileAccessExtStub::CmdAccess(MessageParcel &data, MessageParcel &reply) return ERR_OK; } +ErrCode FileAccessExtStub::CmdTransformToFileInfo(MessageParcel &data, MessageParcel &reply) +{ + StartTrace(HITRACE_TAG_FILEMANAGEMENT, "CmdTransformToFileInfo"); + std::shared_ptr uri(data.ReadParcelable()); + if (uri == nullptr) { + HILOG_ERROR("SelectFile uri is nullptr"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_INVALID_URI; + } + + FileInfo fileInfoTemp; + int ret = TransformToFileInfo(*uri, fileInfoTemp); + if (!reply.WriteInt32(ret)) { + HILOG_ERROR("Parameter TransformToFileInfo fail to WriteInt32 ret"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_PARCEL_FAIL; + } + + if (!reply.WriteParcelable(&fileInfoTemp)) { + HILOG_ERROR("Parameter TransformToFileInfo fail to WriteParcelable fileInfoTemp"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_PARCEL_FAIL; + } + + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_OK; +} + bool FileAccessExtStub::CheckCallingPermission(const std::string &permission) { StartTrace(HITRACE_TAG_FILEMANAGEMENT, "CheckCallingPermission"); diff --git a/frameworks/innerkits/file_access/src/file_access_ext_stub_impl.cpp b/frameworks/innerkits/file_access/src/file_access_ext_stub_impl.cpp index 2bc3c127..43134083 100644 --- a/frameworks/innerkits/file_access/src/file_access_ext_stub_impl.cpp +++ b/frameworks/innerkits/file_access/src/file_access_ext_stub_impl.cpp @@ -156,6 +156,20 @@ int FileAccessExtStubImpl::GetRoots(std::vector &rootInfoVec) return ret; } +int FileAccessExtStubImpl::TransformToFileInfo(const Uri &selectFile, FileInfo &fileInfo) +{ + StartTrace(HITRACE_TAG_FILEMANAGEMENT, "TransformToFileInfo"); + if (extension_ == nullptr) { + HILOG_ERROR("TransformToFileInfo get extension failed."); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_IPC_ERROR; + } + + int ret = extension_->TransformToFileInfo(selectFile, fileInfo); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ret; +} + int FileAccessExtStubImpl::Access(const Uri &uri, bool &isExist) { StartTrace(HITRACE_TAG_FILEMANAGEMENT, "Access"); diff --git a/frameworks/innerkits/file_access/src/file_access_helper.cpp b/frameworks/innerkits/file_access/src/file_access_helper.cpp index df86cb65..16c3a3c9 100644 --- a/frameworks/innerkits/file_access/src/file_access_helper.cpp +++ b/frameworks/innerkits/file_access/src/file_access_helper.cpp @@ -165,27 +165,6 @@ std::string FileAccessHelper::GetKeyOfWantsMap(const AAFwk::Want &want) return ""; } -void FileAccessHelper::InsertConnectInfo(const std::string &key, - const AAFwk::Want &want, - const sptr &fileAccessExtProxy, - sptr fileAccessExtConnection) -{ - std::shared_ptr connectInfo = GetConnectInfo(key); - if (connectInfo == nullptr) { - std::shared_ptr connectInfo = std::make_shared(); - if (connectInfo == nullptr) { - HILOG_ERROR("InsertConnectInfo called with connectInfo == nullptr"); - return ; - } - connectInfo->want = want; - connectInfo->fileAccessExtConnection = fileAccessExtConnection; - cMap_.insert(std::pair>(key, connectInfo)); - } else { - connectInfo->want = want; - connectInfo->fileAccessExtConnection = fileAccessExtConnection; - } -} - std::shared_ptr FileAccessHelper::Creator( const std::shared_ptr &context) { @@ -741,6 +720,33 @@ int FileAccessHelper::Access(Uri &uri, bool &isExist) return ERR_OK; } +int FileAccessHelper::TransformToFileInfo(Uri &selectFile, FileInfo &fileInfo) +{ + StartTrace(HITRACE_TAG_FILEMANAGEMENT, "TransformToFileInfo"); + if (!CheckUri(selectFile)) { + HILOG_ERROR("selectFile uri format check error."); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_INVALID_URI; + } + + sptr fileExtProxy = GetProxyByUri(selectFile); + if (fileExtProxy == nullptr) { + HILOG_ERROR("failed with invalid fileAccessExtProxy"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_IPC_ERROR; + } + + int ret = fileExtProxy->TransformToFileInfo(selectFile, fileInfo); + if (ret != ERR_OK) { + HILOG_ERROR("TransformToFileInfo get result error, code:%{public}d", ret); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ret; + } + + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_OK; +} + int FileAccessHelper::On(std::shared_ptr &callback) { StartTrace(HITRACE_TAG_FILEMANAGEMENT, "On"); diff --git a/frameworks/innerkits/file_access/src/js_file_access_ext_ability.cpp b/frameworks/innerkits/file_access/src/js_file_access_ext_ability.cpp index c1cc9ed0..40b80653 100644 --- a/frameworks/innerkits/file_access/src/js_file_access_ext_ability.cpp +++ b/frameworks/innerkits/file_access/src/js_file_access_ext_ability.cpp @@ -496,7 +496,6 @@ int JsFileAccessExtAbility::Mkdir(const Uri &parent, const std::string &displayN if (!ret) { HILOG_ERROR("Convert js value fail."); } - return ret; }; @@ -699,6 +698,10 @@ static bool ParserListFileJsResult(NativeEngine &engine, NativeValue *nativeValu } bool ret = ConvertFromJsValue(engine, obj->GetProperty("code"), result.code); + if (!ret) { + HILOG_ERROR("Convert js value fail."); + return false; + } NativeArray *nativeArray = ConvertNativeValueTo(obj->GetProperty("infos")); if (nativeArray == nullptr) { HILOG_ERROR("Convert js array object fail."); @@ -1065,5 +1068,79 @@ int JsFileAccessExtAbility::Access(const Uri &uri, bool &isExist) FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return ERR_OK; } + +int JsFileAccessExtAbility::TransformToFileInfo(const Uri &selectFile, FileInfo &fileInfo) +{ + StartTrace(HITRACE_TAG_FILEMANAGEMENT, "TransformToFileInfo"); + auto value = std::make_shared>(); + if (value == nullptr) { + HILOG_ERROR("TransformToFileInfo value is nullptr."); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_NULL_POINTER; + } + + auto argParser = [selectFile](NativeEngine &engine, NativeValue *argv[], size_t &argc) -> bool { + NativeValue *nativeUri = engine.CreateString(selectFile.ToString().c_str(), selectFile.ToString().length()); + if (nativeUri == nullptr) { + HILOG_ERROR("create selectFile uri native js value fail."); + return false; + } + argv[ARGC_ZERO] = nativeUri; + argc = ARGC_ONE; + return true; + }; + auto retParser = [value](NativeEngine &engine, NativeValue *result) -> bool { + NativeObject *obj = ConvertNativeValueTo(result); + if (obj == nullptr) { + HILOG_ERROR("Convert js object fail."); + return false; + } + bool ret = ConvertFromJsValue(engine, obj->GetProperty("code"), value->code); + if (!ret) { + HILOG_ERROR("Convert js value fail."); + return false; + } + + obj = ConvertNativeValueTo(obj->GetProperty("fileInfo")); + if (obj == nullptr) { + HILOG_ERROR("Convert js-fileInfo object fail."); + return false; + } + + FileInfo fileInfo; + ret = ret && ConvertFromJsValue(engine, obj->GetProperty("uri"), fileInfo.uri); + ret = ret && ConvertFromJsValue(engine, obj->GetProperty("fileName"), fileInfo.fileName); + ret = ret && ConvertFromJsValue(engine, obj->GetProperty("mode"), fileInfo.mode); + ret = ret && ConvertFromJsValue(engine, obj->GetProperty("size"), fileInfo.size); + ret = ret && ConvertFromJsValue(engine, obj->GetProperty("mtime"), fileInfo.mtime); + ret = ret && ConvertFromJsValue(engine, obj->GetProperty("mimeType"), fileInfo.mimeType); + if (!ret) { + HILOG_ERROR("Convert js value fail."); + return false; + } + value->data = std::move(fileInfo); + return ret; + }; + + auto errCode = CallJsMethod("TransformToFileInfo", jsRuntime_, jsObj_.get(), argParser, retParser); + if (errCode != ERR_OK) { + HILOG_ERROR("CallJsMethod error, code:%{public}d.", errCode); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return errCode; + } + + if (value->code != ERR_OK) { + HILOG_ERROR("fileio fail."); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_FILEIO_FAIL; + } + + fileInfo = std::move(value->data); + HILOG_INFO("TransformToFileInfo, code:%{public}d.", value->code); + HILOG_INFO("TransformToFileInfo, data->uri:%{public}s fileName:%{public}s mode:%{public}d size:%{public}d mtime:%{public}d", + fileInfo.uri.c_str(), fileInfo.fileName.c_str(), fileInfo.mode, (int32_t)fileInfo.size, (int32_t)fileInfo.mtime); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_OK; +} } // namespace FileAccessFwk } // namespace OHOS diff --git a/frameworks/innerkits/file_access/src/napi_common_fileaccess.cpp b/frameworks/innerkits/file_access/src/napi_common_fileaccess.cpp index b4f3064e..a350b953 100644 --- a/frameworks/innerkits/file_access/src/napi_common_fileaccess.cpp +++ b/frameworks/innerkits/file_access/src/napi_common_fileaccess.cpp @@ -22,6 +22,7 @@ namespace OHOS { namespace FileAccessFwk { using namespace OHOS::AppExecFwk; +/* bool UnwrapInt64ByPropertyName(napi_env env, napi_value param, const char *propertyName, int64_t &value) { napi_value jsValue = GetPropertyValueByPropertyName(env, param, propertyName, napi_number); @@ -32,80 +33,6 @@ bool UnwrapInt64ByPropertyName(napi_env env, napi_value param, const char *prope } } -napi_value WrapUint32ToJS(napi_env env, uint32_t value) -{ - napi_value result = nullptr; - NAPI_CALL(env, napi_create_uint32(env, value, &result)); - return result; -} - -uint32_t UnwrapUint32FromJS(napi_env env, napi_value param, uint32_t defaultValue) -{ - uint32_t value = defaultValue; - if (napi_get_value_uint32(env, param, &value) == napi_ok) { - return value; - } else { - return defaultValue; - } -} - -bool UnwrapUint32FromJS2(napi_env env, napi_value param, uint32_t &value) -{ - bool result = false; - if (napi_get_value_uint32(env, param, &value) == napi_ok) { - result = true; - } - return result; -} - -bool UnwrapUint32ByPropertyName(napi_env env, napi_value param, const char *propertyName, uint32_t &value) -{ - napi_value jsValue = GetPropertyValueByPropertyName(env, param, propertyName, napi_number); - if (jsValue != nullptr) { - return UnwrapUint32FromJS2(env, jsValue, value); - } else { - return false; - } -} - -napi_value WrapBigIntUint64ToJS(napi_env env, uint64_t value) -{ - napi_value result = nullptr; - NAPI_CALL(env, napi_create_bigint_uint64(env, value, &result)); - return result; -} - -uint64_t UnwrapBigIntUint64FromJS(napi_env env, napi_value param, uint64_t defaultValue) -{ - bool lossless = true; - uint64_t value = defaultValue; - if (napi_get_value_bigint_uint64(env, param, &value, &lossless) == napi_ok) { - return value; - } else { - return defaultValue; - } -} - -bool UnwrapBigIntUint64FromJS2(napi_env env, napi_value param, uint64_t &defaultValue) -{ - bool lossless = true; - if (napi_get_value_bigint_uint64(env, param, &defaultValue, &lossless) == napi_ok) { - return true; - } else { - return false; - } -} - -bool UnwrapBigIntUint64ByPropertyName(napi_env env, napi_value param, const char *propertyName, uint64_t &value) -{ - napi_value jsValue = GetPropertyValueByPropertyName(env, param, propertyName, napi_bigint); - if (jsValue != nullptr) { - return UnwrapBigIntUint64FromJS2(env, jsValue, value); - } else { - return false; - } -} - napi_value WrapFileInfo(napi_env env, const FileInfo &fileInfo) { napi_value jsObject = nullptr; @@ -301,7 +228,7 @@ bool UnwrapArrayRootInfoFromJS(napi_env env, napi_value param, std::vector &wantVec) { napi_value jsArray = nullptr; diff --git a/frameworks/innerkits/file_access/test/external_file_access_test.cpp b/frameworks/innerkits/file_access/test/external_file_access_test.cpp index b669e51f..236d8f9b 100644 --- a/frameworks/innerkits/file_access/test/external_file_access_test.cpp +++ b/frameworks/innerkits/file_access/test/external_file_access_test.cpp @@ -2214,4 +2214,226 @@ HWTEST_F(FileExtensionHelperTest, external_file_access_Access_0000, testing::ext } GTEST_LOG_(INFO) << "FileExtensionHelperTest-end external_file_access_Access_0000"; } + +/** + * @tc.number: user_file_service_external_file_access_TransformToFileInfo_0000 + * @tc.name: external_file_access_TransformToFileInfo_0000 + * @tc.desc: Test function of TransformToFileInfo interface for SUCCESS. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: SR000H0386 + */ +HWTEST_F(FileExtensionHelperTest, external_file_access_TransformToFileInfo_0000, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "FileExtensionHelperTest-begin external_file_access_TransformToFileInfo_0000"; + try { + vector info; + int result = g_fah->GetRoots(info); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + for (size_t i = 0; i < info.size(); i++) { + Uri parentUri(info[i].uri); + GTEST_LOG_(INFO) << parentUri.ToString(); + Uri newDirUriTest1(""); + result = g_fah->Mkdir(parentUri, "test1", newDirUriTest1); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + FileInfo dirInfo; + result = g_fah->TransformToFileInfo(newDirUriTest1, dirInfo); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + GTEST_LOG_(INFO) << "TransformToFileInfo_0000 result:" << result << endl; + } + } catch (...) { + GTEST_LOG_(ERROR) << "external_file_access_TransformToFileInfo_0000 occurs an exception."; + } + GTEST_LOG_(INFO) << "FileExtensionHelperTest-end external_file_access_TransformToFileInfo_0000"; +} + +/** + * @tc.number: user_file_service_external_file_access_TransformToFileInfo_0001 + * @tc.name: external_file_access_TransformToFileInfo_0001 + * @tc.desc: Test function of TransformToFileInfo interface for ERROR which Uri is null. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: SR000H0386 + */ +HWTEST_F(FileExtensionHelperTest, external_file_access_TransformToFileInfo_0001, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "FileExtensionHelperTest-begin external_file_access_TransformToFileInfo_0001"; + try { + Uri uri(""); + FileInfo fileInfo; + int result = g_fah->TransformToFileInfo(uri, fileInfo); + EXPECT_LT(result, OHOS::FileAccessFwk::ERR_OK); + GTEST_LOG_(INFO) << "TransformToFileInfo_0001 result:" << result << endl; + } catch (...) { + GTEST_LOG_(ERROR) << "external_file_access_TransformToFileInfo_0001 occurs an exception."; + } + GTEST_LOG_(INFO) << "FileExtensionHelperTest-end external_file_access_TransformToFileInfo_0001"; +} + +/** + * @tc.number: user_file_service_external_file_access_TransformToFileInfo_0002 + * @tc.name: external_file_access_TransformToFileInfo_0002 + * @tc.desc: Test function of TransformToFileInfo interface for ERROR which Uri is absolute path. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: SR000H0386 + */ +HWTEST_F(FileExtensionHelperTest, external_file_access_TransformToFileInfo_0002, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "FileExtensionHelperTest-begin external_file_access_TransformToFileInfo_0002"; + try { + vector info; + int result = g_fah->GetRoots(info); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + for (size_t i = 0; i < info.size(); i++) { + Uri parentUri(info[i].uri); + Uri newFileUri(""); + result = g_fah->CreateFile(parentUri, "external_file_access_TransformToFileInfo_0002.txt", newFileUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + FileInfo fileInfo1; + result = g_fah->TransformToFileInfo(newFileUri, fileInfo1); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + Uri uri("storage/media/100/local/files/Download/external_file_access_TransformToFileInfo_0002.txt"); + FileInfo fileInfo2; + result = g_fah->TransformToFileInfo(uri, fileInfo2); + EXPECT_LT(result, OHOS::FileAccessFwk::ERR_OK); + Uri noExistUri("storage/media/100/local/files/Download/external_file_access_TransformToFileInfo_NoExistFile_0002.txt"); + FileInfo fileInfo3; + result = g_fah->TransformToFileInfo(noExistUri, fileInfo3); + EXPECT_LT(result, OHOS::FileAccessFwk::ERR_OK); + GTEST_LOG_(INFO) << "TransformToFileInfo_0002 result:" << result << endl; + result = g_fah->Delete(newFileUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + } + } catch (...) { + GTEST_LOG_(ERROR) << "external_file_access_TransformToFileInfo_0002 occurs an exception."; + } + GTEST_LOG_(INFO) << "FileExtensionHelperTest-end external_file_access_TransformToFileInfo_0002"; +} + +/** + * @tc.number: user_file_service_external_file_access_TransformToFileInfo_0003 + * @tc.name: external_file_access_TransformToFileInfo_0003 + * @tc.desc: Test function of TransformToFileInfo interface for ERROR which Uri is special symbols. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: SR000H0386 + */ +HWTEST_F(FileExtensionHelperTest, external_file_access_TransformToFileInfo_0003, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "FileExtensionHelperTest-begin external_file_access_TransformToFileInfo_0003"; + try { + Uri uri("~!@#$%^&*()_"); + FileInfo fileInfo; + int result = g_fah->TransformToFileInfo(uri, fileInfo); + EXPECT_LT(result, OHOS::FileAccessFwk::ERR_OK); + GTEST_LOG_(INFO) << "TransformToFileInfo_0003 result:" << result << endl; + } catch (...) { + GTEST_LOG_(ERROR) << "external_file_access_TransformToFileInfo_0003 occurs an exception."; + } + GTEST_LOG_(INFO) << "FileExtensionHelperTest-end external_file_access_TransformToFileInfo_0003"; +} + +/** + * @tc.number: user_file_service_external_file_access_TransformToFileInfo_0004 + * @tc.name: external_file_access_TransformToFileInfo_0004 + * @tc.desc: Test function of TransformToFileInfo interface for SUCCESS which Uri is root directory and then + * lists the files in the directory. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: SR000H0386 + */ +HWTEST_F(FileExtensionHelperTest, external_file_access_TransformToFileInfo_0004, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "FileExtensionHelperTest-begin external_file_access_TransformToFileInfo_0004"; + try { + Uri uri("/"); + FileInfo fileInfo; + int result = g_fah->TransformToFileInfo(uri, fileInfo); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + int64_t offset = 0; + int64_t maxCount = 1000; + std::vector fileInfoVec; + FileFilter filter; + result = g_fah->ListFile(fileInfo, offset, maxCount, filter, fileInfoVec); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + EXPECT_GT(fileInfoVec.size(), OHOS::FileAccessFwk::ERR_OK); + GTEST_LOG_(INFO) << "TransformToFileInfo_0004 result:" << result << endl; + } catch (...) { + GTEST_LOG_(ERROR) << "external_file_access_TransformToFileInfo_0004 occurs an exception."; + } + GTEST_LOG_(INFO) << "FileExtensionHelperTest-end external_file_access_TransformToFileInfo_0004"; +} + +/** + * @tc.number: user_file_service_external_file_access_TransformToFileInfo_0005 + * @tc.name: external_file_access_TransformToFileInfo_0005 + * @tc.desc: Test function of TransformToFileInfo interface for ERROR which uri not exist + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: SR000H0386 + */ +HWTEST_F(FileExtensionHelperTest, external_file_access_TransformToFileInfo_0005, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "FileExtensionHelperTest-begin external_file_access_TransformToFileInfo_0005"; + try { + Uri uri("/NoExist"); + FileInfo fileInfo; + int result = g_fah->TransformToFileInfo(uri, fileInfo); + EXPECT_LT(result, OHOS::FileAccessFwk::ERR_OK); + GTEST_LOG_(INFO) << "TransformToFileInfo_0005 result:" << result << endl; + } catch (...) { + GTEST_LOG_(ERROR) << "external_file_access_TransformToFileInfo_0005 occurs an exception."; + } + GTEST_LOG_(INFO) << "FileExtensionHelperTest-end external_file_access_TransformToFileInfo_0005"; +} + +/** + * @tc.number: user_file_service_external_file_access_TransformToFileInfo_0006 + * @tc.name: external_file_access_TransformToFileInfo_0006 + * @tc.desc: Test function of TransformToFileInfo interface for SUCCESS to list the files in the directory. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: SR000H0387 + */ +HWTEST_F(FileExtensionHelperTest, external_file_access_TransformToFileInfo_0006, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "FileExtensionHelperTest-begin external_file_access_TransformToFileInfo_0006"; + try { + vector info; + int result = g_fah->GetRoots(info); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + for (size_t i = 0; i < info.size(); i++) { + Uri parentUri(info[i].uri); + Uri newDirUriTest(""); + result = g_fah->Mkdir(parentUri, "test", newDirUriTest); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + Uri testUri(""); + result = g_fah->CreateFile(newDirUriTest, "external_file_access_TransformToFileInfo_0006.txt", testUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + FileInfo fileInfo; + result = g_fah->TransformToFileInfo(newDirUriTest, fileInfo); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + int64_t offset = 0; + int64_t maxCount = 1000; + std::vector fileInfoVec; + FileFilter filter; + result = g_fah->ListFile(fileInfo, offset, maxCount, filter, fileInfoVec); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + EXPECT_GT(fileInfoVec.size(), OHOS::FileAccessFwk::ERR_OK); + result = g_fah->Delete(newDirUriTest); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + } + } catch (...) { + GTEST_LOG_(ERROR) << "external_file_access_TransformToFileInfo_0006 occurs an exception."; + } + GTEST_LOG_(INFO) << "FileExtensionHelperTest-end external_file_access_TransformToFileInfo_0006"; +} } // namespace \ No newline at end of file diff --git a/frameworks/innerkits/file_access/test/medialibrary_file_access_test.cpp b/frameworks/innerkits/file_access/test/medialibrary_file_access_test.cpp index 14111c9c..542a2fc1 100644 --- a/frameworks/innerkits/file_access/test/medialibrary_file_access_test.cpp +++ b/frameworks/innerkits/file_access/test/medialibrary_file_access_test.cpp @@ -2149,4 +2149,90 @@ HWTEST_F(FileAccessHelperTest, medialibrary_file_access_GetRoots_0000, testing:: } GTEST_LOG_(INFO) << "FileAccessHelperTest-end medialibrary_file_access_GetRoots_0000"; } + +/** + * @tc.number: user_file_service_medialibrary_file_access_TransformToFileInfo_0000 + * @tc.name: medialibrary_file_access_TransformToFileInfo_0000 + * @tc.desc: Test function of TransformToFileInfo interface for SUCCESS which scan root directory with no filter. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: SR000HB866 + */ +HWTEST_F(FileAccessHelperTest, medialibrary_file_access_TransformToFileInfo_0000, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "FileAccessHelperTest-begin medialibrary_file_access_TransformToFileInfo_0000"; + try { + Uri newDirUriTest(""); + int result = g_fah->Mkdir(g_newDirUri, "test", newDirUriTest); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + Uri testUri(""); + result = g_fah->CreateFile(newDirUriTest, "medialibrary_file_access_TransformToFileInfo_0000.q1w2e3r4", testUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->CreateFile(newDirUriTest, "medialibrary_file_access_TransformToFileInfo_0000.txt", testUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + FileInfo fileInfo; + result = g_fah->TransformToFileInfo(newDirUriTest, fileInfo); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + int64_t offset = 0; + int64_t maxCount = 1000; + std::vector fileInfoVec; + FileFilter filter({}, {}, {}, 0, 0, false, false); + result = g_fah->ScanFile(fileInfo, offset, maxCount, filter, fileInfoVec); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + EXPECT_GE(fileInfoVec.size(), 2); + GTEST_LOG_(INFO) << "TransformToFileInfo_0000 result:" << fileInfoVec.size() << endl; + result = g_fah->Delete(newDirUriTest); + EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); + } catch (...) { + GTEST_LOG_(ERROR) << "medialibrary_file_access_TransformToFileInfo_0000 occurs an exception."; + } + GTEST_LOG_(INFO) << "FileAccessHelperTest-end medialibrary_file_access_TransformToFileInfo_0000"; +} + +/** + * @tc.number: user_file_service_medialibrary_file_access_TransformToFileInfo_0001 + * @tc.name: medialibrary_file_access_TransformToFileInfo_0001 + * @tc.desc: Test function of TransformToFileInfo interface for SUCCESS which self created directory with filter. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: SR000HB866 + */ +HWTEST_F(FileAccessHelperTest, medialibrary_file_access_TransformToFileInfo_0001, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "FileAccessHelperTest-begin medialibrary_file_access_TransformToFileInfo_0001"; + try { + Uri newDirUriTest(""); + int result = g_fah->Mkdir(g_newDirUri, "test", newDirUriTest); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + Uri testUri(""); + result = g_fah->CreateFile(newDirUriTest, "medialibrary_file_access_TransformToFileInfo_0001.q1w2e3r4", testUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->CreateFile(newDirUriTest, "medialibrary_file_access_ScanFile_0001.txt", testUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->CreateFile(newDirUriTest, "medialibrary_file_access_ScanFile_0001.docx", testUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + FileInfo fileInfo; + result = g_fah->TransformToFileInfo(newDirUriTest, fileInfo); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + int64_t offset = 0; + int64_t maxCount = 1000; + std::vector fileInfoVec; + FileFilter filter({".q1w2e3r4"}, {}, {}, 0, 0, false, true); + result = g_fah->ScanFile(fileInfo, offset, maxCount, filter, fileInfoVec); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + EXPECT_EQ(fileInfoVec.size(), 1); + FileFilter filter1({".q1w2e3r4", ".txt"}, {}, {}, 0, 0, false, true); + result = g_fah->ScanFile(fileInfo, offset, maxCount, filter1, fileInfoVec); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + EXPECT_EQ(fileInfoVec.size(), 2); + GTEST_LOG_(INFO) << "TransformToFileInfo_0001 result:" << fileInfoVec.size() << endl; + result = g_fah->Delete(newDirUriTest); + EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); + } catch (...) { + GTEST_LOG_(ERROR) << "medialibrary_file_access_TransformToFileInfo_0001 occurs an exception."; + } + GTEST_LOG_(INFO) << "FileAccessHelperTest-end medialibrary_file_access_TransformToFileInfo_0001"; +} } // namespace \ No newline at end of file diff --git a/interfaces/kits/napi/file_access_ext_ability/file_access_ext_ability.js b/interfaces/kits/napi/file_access_ext_ability/file_access_ext_ability.js index b8844cec..f9a4561e 100644 --- a/interfaces/kits/napi/file_access_ext_ability/file_access_ext_ability.js +++ b/interfaces/kits/napi/file_access_ext_ability/file_access_ext_ability.js @@ -81,6 +81,13 @@ class FileAccessExtensionAbility { code: ERR_ERROR, }; } + + transformToFileInfo(selectFileUri) { + return { + fileInfo: [], + code: ERR_ERROR, + }; + } } export default FileAccessExtensionAbility \ No newline at end of file diff --git a/interfaces/kits/napi/file_access_module/napi_fileaccess_helper.cpp b/interfaces/kits/napi/file_access_module/napi_fileaccess_helper.cpp index abfc95bf..296f3e8d 100644 --- a/interfaces/kits/napi/file_access_module/napi_fileaccess_helper.cpp +++ b/interfaces/kits/napi/file_access_module/napi_fileaccess_helper.cpp @@ -227,6 +227,7 @@ napi_value FileAccessHelperInit(napi_env env, napi_value exports) DECLARE_NAPI_FUNCTION("rename", NAPI_Rename), DECLARE_NAPI_FUNCTION("getRoots", NAPI_GetRoots), DECLARE_NAPI_FUNCTION("access", NAPI_Access), + DECLARE_NAPI_FUNCTION("transformToFileInfo", NAPI_TransformToFileInfo), DECLARE_NAPI_FUNCTION("on", NAPI_On), DECLARE_NAPI_FUNCTION("off", NAPI_Off) }; @@ -456,7 +457,7 @@ napi_value NAPI_Mkdir(napi_env env, napi_callback_info info) } return { NVal::CreateUTF8String(env, *result) }; }; - const std::string procedureName = "mkdir"; + const std::string procedureName = "mkDir"; NVal thisVar(env, funcArg.GetThisVar()); if (funcArg.GetArgc() == NARG_CNT::TWO) { return NAsyncWorkPromise(env, thisVar).Schedule(procedureName, cbExec, cbComplete).val_; @@ -738,6 +739,11 @@ napi_value NAPI_Access(napi_env env, napi_callback_info info) } auto result = std::make_shared(); + if (result == nullptr) { + NapiError(ERR_NULL_POINTER).ThrowErr(env); + return nullptr; + } + string uriString(uri.get()); auto cbExec = [uriString, result, fileAccessHelper]() -> NError { OHOS::Uri uri(uriString); @@ -766,6 +772,88 @@ napi_value NAPI_Access(napi_env env, napi_callback_info info) return NAsyncWorkCallback(env, thisVar, cb).Schedule(procedureName, cbExec, cbComplete).val_; } +static int MakeFileInfoResult(napi_env &env, FileAccessHelper *helper, FileInfo &fileinfo, NVal &nVal) +{ + auto objFileInfo = NClass::InstantiateClass(env, NapiFileInfoExporter::className_, {}); + if (objFileInfo == nullptr) { + HILOG_INFO("Cannot instantiate class NapiFileInfoExporter"); + return ERR_NULL_POINTER; + } + + auto fileInfoEntity = NClass::GetEntityOf(env, objFileInfo); + if (fileInfoEntity == nullptr) { + HILOG_INFO("Cannot get the entity of fileInfoEntity"); + return ERR_NULL_POINTER; + } + fileInfoEntity->fileAccessHelper = helper; + fileInfoEntity->fileInfo = std::move(fileinfo); + nVal = { env, objFileInfo }; + + return ERR_OK; +} + +napi_value NAPI_TransformToFileInfo(napi_env env, napi_callback_info info) +{ + NFuncArg funcArg(env, info); + if (!funcArg.InitArgs(NARG_CNT::ONE, NARG_CNT::TWO)) { + NapiError(ERR_PARAM_NUMBER).ThrowErr(env); + return nullptr; + } + + bool succ = false; + std::unique_ptr uri; + std::tie(succ, uri, std::ignore) = NVal(env, funcArg[NARG_POS::FIRST]).ToUTF8String(); + if (!succ) { + NapiError(ERR_INVALID_PARAM).ThrowErr(env); + return nullptr; + } + + FileAccessHelper *fileAccessHelper = GetFileAccessHelper(env, funcArg.GetThisVar()); + if (fileAccessHelper == nullptr) { + return nullptr; + } + + auto result = std::make_shared(); + if (result == nullptr) { + NapiError(ERR_NULL_POINTER).ThrowErr(env); + return nullptr; + } + + string uriString(uri.get()); + auto cbExec = [uriString, result, fileAccessHelper]() -> NError { + OHOS::Uri uri(uriString); + int ret = fileAccessHelper->TransformToFileInfo(uri, *result); + return NError(ret); + }; + auto cbComplete = [fileAccessHelper, result](napi_env env, NError err) -> NVal { + if (err) { + return { env, err.GetNapiErr(env) }; + } + + NVal nVal; + int ret = MakeFileInfoResult(env, fileAccessHelper, *result, nVal); + if (ret != ERR_OK) { + return { env, NError([ret]() -> std::tuple { + return { ret, "Make FileInfo Result fail" }; + }).GetNapiErr(env) }; + } + + return nVal; + }; + + const std::string procedureName = "transformToFileInfo"; + NVal thisVar(env, funcArg.GetThisVar()); + if (funcArg.GetArgc() == NARG_CNT::ONE) { + return NAsyncWorkPromise(env, thisVar).Schedule(procedureName, cbExec, cbComplete).val_; + } + NVal cb(env, funcArg[NARG_POS::SECOND]); + if (!cb.TypeIs(napi_function)) { + NapiError(ERR_INVALID_PARAM).ThrowErr(env); + return nullptr; + } + return NAsyncWorkCallback(env, thisVar, cb).Schedule(procedureName, cbExec, cbComplete).val_; +} + napi_value NAPI_On(napi_env env, napi_callback_info info) { NFuncArg funcArg(env, info); diff --git a/interfaces/kits/napi/file_access_module/napi_fileaccess_helper.h b/interfaces/kits/napi/file_access_module/napi_fileaccess_helper.h index 8c4f0fb6..ff91bfad 100644 --- a/interfaces/kits/napi/file_access_module/napi_fileaccess_helper.h +++ b/interfaces/kits/napi/file_access_module/napi_fileaccess_helper.h @@ -32,6 +32,7 @@ namespace FileAccessFwk { napi_value NAPI_Rename(napi_env env, napi_callback_info info); napi_value NAPI_GetRoots(napi_env env, napi_callback_info info); napi_value NAPI_Access(napi_env env, napi_callback_info info); + napi_value NAPI_TransformToFileInfo(napi_env env, napi_callback_info info); napi_value NAPI_On(napi_env env, napi_callback_info info); napi_value NAPI_Off(napi_env env, napi_callback_info info); } // namespace FileAccessFwk diff --git a/services/file_extension_hap/entry/src/main/ets/FileExtensionAbility/FileExtensionAbility.ts b/services/file_extension_hap/entry/src/main/ets/FileExtensionAbility/FileExtensionAbility.ts index ad06af17..efead7f3 100644 --- a/services/file_extension_hap/entry/src/main/ets/FileExtensionAbility/FileExtensionAbility.ts +++ b/services/file_extension_hap/entry/src/main/ets/FileExtensionAbility/FileExtensionAbility.ts @@ -70,6 +70,7 @@ export default class FileExtAbility extends Extension { uri = uri.replace(URI_SCHEME, ''); return /^\/([^\/]+\/?)+$/.test(uri); } else { + hilog.error(DOMAIN_CODE, TAG, 'checkUri error, uri is ' + uri); return false; } } @@ -475,6 +476,51 @@ export default class FileExtAbility extends Extension { }; } + TransformToFileInfo(selectFileUri) { + if (!this.checkUri(sourceFileUri)) { + return { + fileInfo: {}, + code: ERR_ERROR, + }; + } + let fileInfo = {}; + try { + let path = this.getPath(selectFileUri); + let fileName = this.getFileName(path); + let stat = fileio.statSync(path) + let mode = DocumentFlag.SUPPORTS_READ | DocumentFlag.SUPPORTS_WRITE; + if (stat.isDirectory()) { + mode |= DocumentFlag.REPRESENTS_DIR; + } else { + mode |= DocumentFlag.REPRESENTS_FILE; + } + hilog.info(DOMAIN_CODE, TAG, 'path ' + path); + hilog.info(DOMAIN_CODE, TAG, 'mode ' + mode); + hilog.info(DOMAIN_CODE, TAG, 'size ' + stat.size); + hilog.info(DOMAIN_CODE, TAG, 'mtime ' + stat.mtime); + hilog.info(DOMAIN_CODE, TAG, 'selectFileUri ' + selectFileUri); + hilog.info(DOMAIN_CODE, TAG, 'fileName ' + fileName); + fileInfo = { + uri: selectFileUri, + fileName: fileName, + mode: mode, + size: stat.size, + mtime: stat.mtime, + mimeType: '', + }; + } catch (e) { + hilog.error(DOMAIN_CODE, TAG, 'TransformToFileInfo error ' + e.message); + return { + fileInfo: {}, + code: ERR_ERROR, + }; + } + return { + fileInfo: fileInfo, + code: ERR_OK, + }; + } + getRoots() { let roots = getVolumeInfoList().concat({ uri: 'datashare:///com.ohos.UserFile.ExternalFileManager/data/storage/el1/bundle/storage_daemon', -- Gitee