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 d3879776f866c4d9773712cc6b58ad828dd42617..2042857c2add0cd80498ada06012397364824cab 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 b16630b47e6ebffdb77cc2b5094bccc251d9f084..c858f879d777555a10a89a4dfca105697591464e 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 080287f05eb41985e5a78e244a42085d076826eb..26f65f37579869f9cf73ade8ebd899fb9d253475 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 8bf80eedae3a4958f98de0440763eba87b4e539b..c488a92d8f39a004510e8517099fce76003303d3 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 23b2a1521ffd009572860ec99b7def4458e36fba..027a4782385864f0957238c3cc8d69bf6cc89de2 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 ddae40eb73bd9e9eb02c850f289a58b372c3e040..dd6ce02241d3e7d994d4a0667ec0097628bd3750 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 df7179eed7bd8cfe60e527730b12090b08e34c84..196bbca3fbda19a6e9990786aa5dc9e259c7db82 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 bd0dc4d648bfd1d41a4a4cba4fd53f62b44f3659..03d191dd548a3e4c0ae509437a75c5da7aaf094f 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 27a8f9759ebbd125d2ca184f2c26eeba97d0c8af..2caa161688e58bc6bc2b9003d1b36b0d663a91a7 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 992adf6ca97cc5b4d4037058bb92d928fde88cf2..ecf340c4c45b50c163e1f54092acd0b6ba94cdd7 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 dac727228c2569b860bf9c96955fdca9d3d962d1..04e6c158163e13d14545c337795a72d58d88cf92 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 2bc3c127033787802105816d7eba8f21a68dc858..431340839e8cafb1785a6e78f16c431f6e5b0468 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 df86cb65ab9ade3e96843ae193b64cb08a26fd1f..16c3a3c9e435bf1170ab30948928d182b674ad47 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 c1cc9ed045f4e7441cb751185117df4c34b6072a..40b806532931db10938174183289865126e0bc8c 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 b4f3064e3e048a6d83b86d1a47bbd96354c754bf..a350b9531fb51545d68ae97794ade540e6afbdb8 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 b669e51fbf002787942b92437bc9d16ba56845a4..1f730a8a93bd270ae4f36c821bcab53fa08237ca 100644 --- a/frameworks/innerkits/file_access/test/external_file_access_test.cpp +++ b/frameworks/innerkits/file_access/test/external_file_access_test.cpp @@ -1996,7 +1996,6 @@ HWTEST_F(FileExtensionHelperTest, external_file_access_ListFile_0003, testing::e Uri sourceFileUri("~!@#$%^&*()_"); FileInfo fileInfo; fileInfo.uri = sourceFileUri.ToString(); - Uri sourceFile(fileInfo.uri); int64_t offset = 0; int64_t maxCount = 1000; std::vector fileInfoVec; @@ -2214,4 +2213,101 @@ 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_000 +_0000 + * @tc.name: external_file_access_TransformToFileInfo_000 + * @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_000, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "FileExtensionHelperTest-begin external_file_access_TransformToFileInfo_000"; + try { + uint64_t selfTokenId = GetSelfTokenID(); + 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 newDirUriTest(""); + result = g_fah->Mkdir(parentUri, "testDir", newDirUriTest); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + Uri newFileUri(""); + result = g_fah->CreateFile(newDirUriTest, "external_file_access_TransformToFileInfo_000.txt", newFileUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + + int64_t offset = 0; + int64_t maxCount = 1000; + FileFilter filter; + + FileInfo fileinfo; + result = g_fah->TransformToFileInfo(newFileUri, fileinfo); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + GTEST_LOG_(INFO) << fileinfo.uri; + GTEST_LOG_(INFO) << fileinfo.fileName; + GTEST_LOG_(INFO) << fileinfo.size; + GTEST_LOG_(INFO) << fileinfo.mode; + GTEST_LOG_(INFO) << fileinfo.mtime; + GTEST_LOG_(INFO) << fileinfo.mimeType; + std::vector fileInfoVecTemp; + result = g_fah->ListFile(fileinfo, offset, maxCount, filter, fileInfoVecTemp); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + EXPECT_EQ(fileInfoVecTemp.size(), OHOS::FileAccessFwk::ERR_OK); + + FileInfo dirInfo; + result = g_fah->TransformToFileInfo(newDirUriTest, dirInfo); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + GTEST_LOG_(INFO) << dirInfo.uri; + GTEST_LOG_(INFO) << dirInfo.fileName; + GTEST_LOG_(INFO) << dirInfo.size; + GTEST_LOG_(INFO) << dirInfo.mode; + GTEST_LOG_(INFO) << dirInfo.mtime; + GTEST_LOG_(INFO) << dirInfo.mimeType; + std::vector fileInfoVec; + result = g_fah->ListFile(dirInfo, offset, maxCount, filter, fileInfoVec); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + EXPECT_GT(fileInfoVec.size(), OHOS::FileAccessFwk::ERR_OK); + GTEST_LOG_(INFO) << fileInfoVec[0].uri; + GTEST_LOG_(INFO) << fileInfoVec[0].fileName; + GTEST_LOG_(INFO) << fileInfoVec[0].size; + GTEST_LOG_(INFO) << fileInfoVec[0].mode; + GTEST_LOG_(INFO) << fileInfoVec[0].mtime; + GTEST_LOG_(INFO) << fileInfoVec[0].mimeType; + + FileInfo rootInfo; + result = g_fah->TransformToFileInfo(parentUri, rootInfo); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + GTEST_LOG_(INFO) << rootInfo.uri; + GTEST_LOG_(INFO) << rootInfo.fileName; + GTEST_LOG_(INFO) << rootInfo.size; + GTEST_LOG_(INFO) << rootInfo.mode; + GTEST_LOG_(INFO) << rootInfo.mtime; + GTEST_LOG_(INFO) << rootInfo.mimeType; + std::vector fileInfoVecFromRoot; + result = g_fah->ListFile(rootInfo, offset, maxCount, filter, fileInfoVecFromRoot); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + EXPECT_GT(fileInfoVecFromRoot.size(), OHOS::FileAccessFwk::ERR_OK); + GTEST_LOG_(INFO) << fileInfoVecFromRoot.size(); + GTEST_LOG_(INFO) << fileInfoVecFromRoot[0].uri; + GTEST_LOG_(INFO) << fileInfoVecFromRoot[0].fileName; + GTEST_LOG_(INFO) << fileInfoVecFromRoot[0].size; + GTEST_LOG_(INFO) << fileInfoVecFromRoot[0].mode; + GTEST_LOG_(INFO) << fileInfoVecFromRoot[0].mtime; + GTEST_LOG_(INFO) << fileInfoVecFromRoot[0].mimeType; + + result = g_fah->Delete(newDirUriTest); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + } + SetSelfTokenID(selfTokenId); + } catch (...) { + GTEST_LOG_(ERROR) << "external_file_access_TransformToFileInfo_000 occurs an exception."; + } + GTEST_LOG_(INFO) << "FileExtensionHelperTest-end external_file_access_TransformToFileInfo_000"; +} } // 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 b8844cecd11b4602662c07a68dc1ab53cfa6694e..85a8609d319ca3316fbd961172238b72f002bd0d 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 abfc95bfbeed55d9bfd783b428849020fe407be8..296f3e8d6076a15abcd31a62f28f9537e2d7c270 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 8c4f0fb688d0611c470c3e9448e191aa8b205568..ff91bfad4b7a9d99848ec8596c7bff96ae4487da 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 ad06af17812021855b531ff1851e644f28072ef4..efead7f31bcb73889ac5b466e99596185161df95 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',