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..22e4194d69aace41dd51b232a693c7de11a1aa4f 100644 --- a/frameworks/innerkits/file_access/include/file_access_ext_ability.h +++ b/frameworks/innerkits/file_access/include/file_access_ext_ability.h @@ -52,6 +52,7 @@ public: const FileFilter &filter, std::vector &fileInfoVec); virtual int ScanFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount, const FileFilter &filter, std::vector &fileInfoVec); + virtual int UriToFileInfo(const Uri &selectFile, FileInfo &fileInfo); virtual int GetRoots(std::vector &rootInfoVec); virtual int Access(const Uri &uri, bool &isExist); virtual int RegisterNotify(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..0b125108f9db8f461f61d27f39d6c83ed78ef01a 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 UriToFileInfo(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..7d966173c953a1d903017e5d58e03a2d1be4d6b4 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 CmdUriToFileInfo(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..5a9fa8a2491839868e4a38bb278707b82be11885 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 @@ -44,6 +44,7 @@ public: const FileFilter &filter, std::vector &fileInfoVec) override; int ScanFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount, const FileFilter &filter, std::vector &fileInfoVec) override; + int UriToFileInfo(const Uri &selectFile, FileInfo &fileInfo) override; int GetRoots(std::vector &rootInfoVec) override; int Access(const Uri &uri, bool &isExist) override; int RegisterNotify(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..4a602e6247c314402470281d7580c7b587fc450e 100644 --- a/frameworks/innerkits/file_access/include/file_access_helper.h +++ b/frameworks/innerkits/file_access/include/file_access_helper.h @@ -39,6 +39,15 @@ namespace OHOS { namespace FileAccessFwk { using string = std::string; +namespace { + static const std::string SCHEME_NAME = "datashare"; + static const std::string MEDIA_BNUDLE_NAME_ALIAS = "media"; + static const std::string MEDIA_BNUDLE_NAME = "com.ohos.medialibrary.medialibrarydata"; + static const int32_t READ = 0; + static const int32_t WRITE = 1; + static const int32_t WRITE_READ = 2; +} + struct ConnectInfo { AAFwk::Want want = {}; sptr fileAccessExtConnection = nullptr; @@ -69,6 +78,7 @@ public: std::vector &fileInfoVec); int ScanFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount, const FileFilter &filter, std::vector &fileInfoVec); + int UriToFileInfo(Uri &selectFile, FileInfo &fileInfo); int GetRoots(std::vector &rootInfoVec); int On(std::shared_ptr &callback); int Off(); @@ -85,17 +95,12 @@ private: void OnSchedulerDied(const wptr &remote); 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_; - static std::unordered_map wantsMap_; - static std::string GetKeyOfWantsMap(const AAFwk::Want &want); + static std::vector wants_; + static std::string GetKeyOfWants(const AAFwk::Want &want); sptr callerDeathRecipient_ = nullptr; 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..cffceff056c31fbe6692dc33a10f6e06b352591b 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_URI_TO_FILEINFO, CMD_REGISTER_NOTIFY, CMD_UNREGISTER_NOTIFY }; @@ -60,6 +61,7 @@ public: const FileFilter &filter, std::vector &fileInfoVec) = 0; virtual int ScanFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount, const FileFilter &filter, std::vector &fileInfoVec) = 0; + virtual int UriToFileInfo(const Uri &selectFile, FileInfo &fileInfo) = 0; virtual int GetRoots(std::vector &rootInfoVec) = 0; virtual int Access(const Uri &uri, bool &isExist) = 0; virtual int RegisterNotify(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..167a835203b9b06b2836124d247c561418270861 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 @@ -68,6 +68,7 @@ public: int Rename(const Uri &sourceFile, const std::string &displayName, Uri &newFile) override; int ListFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount, const FileFilter &filter, std::vector &fileInfoVec) override; + int UriToFileInfo(const Uri &selectFile, FileInfo &fileInfo) override; int GetRoots(std::vector &rootInfoVec) override; int Access(const Uri &uri, bool &isExist) override; diff --git a/frameworks/innerkits/file_access/include/napi_common_fileaccess.h b/frameworks/innerkits/file_access/include/napi_common_fileaccess.h index bd0dc4d648bfd1d41a4a4cba4fd53f62b44f3659..c970f4f646658179082161b618738b0b322694ca 100644 --- a/frameworks/innerkits/file_access/include/napi_common_fileaccess.h +++ b/frameworks/innerkits/file_access/include/napi_common_fileaccess.h @@ -27,8 +27,6 @@ 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); @@ -39,18 +37,6 @@ uint64_t UnwrapBigIntUint64FromJS(napi_env env, napi_value param, uint64_t defau 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); -napi_value WrapFileInfo(napi_env env, const FileInfo &fileInfo); -bool UnwrapFileInfo(napi_env env, napi_value param, FileInfo &fileInfo); - -napi_value WrapArrayFileInfoToJS(napi_env env, const std::vector &fileInfoVec); -bool UnwrapArrayFileInfoFromJS(napi_env env, napi_value param, std::vector &fileInfoVec); - -napi_value WrapRootInfo(napi_env env, const RootInfo &rootInfo); -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..9856ec8a3b5e868ef6c2c3cbb5a64234ef1b4e8c 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::UriToFileInfo(const Uri &selectFile, FileInfo &fileInfo) +{ + HILOG_ERROR("FileAccessExtAbility::UriToFileInfo 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..867f04b48eb7b441314d535a59048026e97199fa 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::UriToFileInfo(const Uri &selectFile, FileInfo &fileInfo) +{ + StartTrace(HITRACE_TAG_FILEMANAGEMENT, "UriToFileInfo"); + 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_URI_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("UriToFileInfo 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..e99785d2d60a88c238b85c2ca8f4bfbebd21e28e 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_URI_TO_FILEINFO] = &FileAccessExtStub::CmdUriToFileInfo; stubFuncMap_[CMD_REGISTER_NOTIFY] = &FileAccessExtStub::CmdRegisterNotify; stubFuncMap_[CMD_UNREGISTER_NOTIFY] = &FileAccessExtStub::CmdUnregisterNotify; } @@ -457,6 +458,34 @@ ErrCode FileAccessExtStub::CmdGetRoots(MessageParcel &data, MessageParcel &reply return ERR_OK; } +ErrCode FileAccessExtStub::CmdUriToFileInfo(MessageParcel &data, MessageParcel &reply) +{ + StartTrace(HITRACE_TAG_FILEMANAGEMENT, "CmdUriToFileInfo"); + 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 = UriToFileInfo(*uri, fileInfoTemp); + if (!reply.WriteInt32(ret)) { + HILOG_ERROR("Parameter UriToFileInfo fail to WriteInt32 ret"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_PARCEL_FAIL; + } + + if (!reply.WriteParcelable(&fileInfoTemp)) { + HILOG_ERROR("Parameter UriToFileInfo fail to WriteParcelable fileInfoTemp"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_PARCEL_FAIL; + } + + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_OK; +} + ErrCode FileAccessExtStub::CmdAccess(MessageParcel &data, MessageParcel &reply) { StartTrace(HITRACE_TAG_FILEMANAGEMENT, "CmdAccess"); @@ -467,7 +496,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"); 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..5686bcaf81afd3560fd62e5a6c9526f1905c75c4 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::UriToFileInfo(const Uri &selectFile, FileInfo &fileInfo) +{ + StartTrace(HITRACE_TAG_FILEMANAGEMENT, "UriToFileInfo"); + if (extension_ == nullptr) { + HILOG_ERROR("UriToFileInfo get extension failed."); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_IPC_ERROR; + } + + int ret = extension_->UriToFileInfo(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 72da32228bb7456243096cecc1db1364ca25a4e8..579e6942d4fd3addf9c540dc2090c5ce1f65e794 100644 --- a/frameworks/innerkits/file_access/src/file_access_helper.cpp +++ b/frameworks/innerkits/file_access/src/file_access_helper.cpp @@ -28,15 +28,7 @@ namespace OHOS { namespace FileAccessFwk { -namespace { - static const std::string SCHEME_NAME = "datashare"; - static const std::string MEDIA_BNUDLE_NAME_ALIAS = "media"; - static const std::string MEDIA_BNUDLE_NAME = "com.ohos.medialibrary.medialibrarydata"; - static const int32_t READ = 0; - static const int32_t WRITE = 1; - static const int32_t WRITE_READ = 2; -} -std::unordered_map FileAccessHelper::wantsMap_; +std::vector FileAccessHelper::wants_; static int GetUserId() { @@ -137,55 +129,20 @@ std::shared_ptr FileAccessHelper::GetConnectInfo(const std::string return nullptr; } -std::shared_ptr FileAccessHelper::GetConnectInfo(const AAFwk::Want &want) +std::string FileAccessHelper::GetKeyOfWants(const AAFwk::Want &want) { - for (auto iter = cMap_.begin(); iter != cMap_.end(); ++iter) { - auto element = iter->second->want.GetElement(); - auto elementTmp = want.GetElement(); + auto elementTmp = want.GetElement(); + for (auto iter = FileAccessHelper::wants_.begin(); iter != FileAccessHelper::wants_.end(); ++iter) { + auto element = iter->GetElement(); if (element.GetBundleName() == elementTmp.GetBundleName() && element.GetAbilityName() == elementTmp.GetAbilityName()) { - return iter->second; + return element.GetBundleName(); } } - HILOG_ERROR("GetConnectInfo called with want obj return nullptr"); - return nullptr; -} - -std::string FileAccessHelper::GetKeyOfWantsMap(const AAFwk::Want &want) -{ - for (auto iter = FileAccessHelper::wantsMap_.begin(); iter != FileAccessHelper::wantsMap_.end(); ++iter) { - auto element = iter->second.GetElement(); - auto elementTmp = want.GetElement(); - if (element.GetBundleName() == elementTmp.GetBundleName() && - element.GetAbilityName() == elementTmp.GetAbilityName()) { - return iter->first; - } - } - HILOG_ERROR("GetKeyOfWantsMap called return nullptr"); + HILOG_ERROR("GetKeyOfWants did not find a want message to match"); 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) { @@ -195,7 +152,7 @@ std::shared_ptr FileAccessHelper::Creator( } sptr bm = FileAccessHelper::GetBundleMgrProxy(); - FileAccessHelper::wantsMap_.clear(); + FileAccessHelper::wants_.clear(); std::unordered_map> cMap; std::vector extensionInfos; bool ret = bm->QueryExtensionAbilityInfos( @@ -229,7 +186,7 @@ std::shared_ptr FileAccessHelper::Creator( HILOG_ERROR("Creator, connectInfo == nullptr"); return nullptr; } - FileAccessHelper::wantsMap_.insert(std::pair(extensionInfos[i].bundleName, wantTem)); + FileAccessHelper::wants_.push_back(wantTem); connectInfo->want = wantTem; connectInfo->fileAccessExtConnection = fileAccessExtConnection; @@ -257,6 +214,11 @@ std::shared_ptr FileAccessHelper::Creator( return nullptr; } + if (GetRegisteredFileAccessExtAbilityInfo(FileAccessHelper::wants_) != ERR_OK) { + HILOG_ERROR("GetRegisteredFileAccessExtAbilityInfo failed"); + return nullptr; + } + std::unordered_map> cMap; for (size_t i = 0; i < wants.size(); i++) { sptr fileAccessExtConnection = new(std::nothrow) FileAccessExtConnection(); @@ -283,7 +245,11 @@ std::shared_ptr FileAccessHelper::Creator( connectInfo->want = wants[i]; connectInfo->fileAccessExtConnection = fileAccessExtConnection; - string bundleName = FileAccessHelper::GetKeyOfWantsMap(wants[i]); + string bundleName = FileAccessHelper::GetKeyOfWants(wants[i]); + if (bundleName.length() == 0) { + HILOG_ERROR("Creator GetKeyOfWants bundleName not found"); + return nullptr; + } cMap.insert(std::pair>(bundleName, connectInfo)); } FileAccessHelper *ptrFileAccessHelper = new (std::nothrow) FileAccessHelper(context, cMap); @@ -308,6 +274,11 @@ std::shared_ptr FileAccessHelper::Creator(const sptr> cMap; for (size_t i = 0; i < wants.size(); i++) { sptr fileAccessExtConnection = new(std::nothrow) FileAccessExtConnection(); @@ -334,7 +305,11 @@ std::shared_ptr FileAccessHelper::Creator(const sptrwant = wants[i]; connectInfo->fileAccessExtConnection = fileAccessExtConnection; - string bundleName = FileAccessHelper::GetKeyOfWantsMap(wants[i]); + string bundleName = FileAccessHelper::GetKeyOfWants(wants[i]); + if (bundleName.length() == 0) { + HILOG_ERROR("Creator GetKeyOfWants bundleName not found"); + return nullptr; + } cMap.insert(std::pair>(bundleName, connectInfo)); } FileAccessHelper *ptrFileAccessHelper = new (std::nothrow) FileAccessHelper(token, cMap); @@ -355,7 +330,7 @@ bool FileAccessHelper::Release() } cMap_.clear(); token_ = nullptr; - FileAccessHelper::wantsMap_.clear(); + FileAccessHelper::wants_.clear(); return true; } @@ -705,11 +680,9 @@ int FileAccessHelper::GetRegisteredFileAccessExtAbilityInfo(std::vector(extensionInfos[i].bundleName, want)); wantVec.push_back(want); } @@ -744,6 +717,33 @@ int FileAccessHelper::Access(Uri &uri, bool &isExist) return ERR_OK; } +int FileAccessHelper::UriToFileInfo(Uri &selectFile, FileInfo &fileInfo) +{ + StartTrace(HITRACE_TAG_FILEMANAGEMENT, "UriToFileInfo"); + 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->UriToFileInfo(selectFile, fileInfo); + if (ret != ERR_OK) { + HILOG_ERROR("UriToFileInfo 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 fb5591dc04bc5eb3f89900464b372b82af738b2e..6f5cd6c051ae5e70f4e8138d3c2abec998e4785a 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 @@ -186,7 +186,7 @@ NativeValue* JsFileAccessExtAbility::CallObjectMethod(const char* name, NativeVa return nullptr; } - HandleScope handleScope(jsRuntime_); + HandleEscape handleEscape(jsRuntime_); auto& nativeEngine = jsRuntime_.GetNativeEngine(); NativeValue* value = jsObj_->Get(); @@ -211,7 +211,7 @@ NativeValue* JsFileAccessExtAbility::CallObjectMethod(const char* name, NativeVa } FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return handleScope.Escape(nativeEngine.CallFunction(value, method, argv, argc)); + return handleEscape.Escape(nativeEngine.CallFunction(value, method, argv, argc)); } static int DoCallJsMethod(CallJsParam *param) @@ -223,7 +223,7 @@ static int DoCallJsMethod(CallJsParam *param) FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return ERR_INVALID_PARAM; } - HandleScope handleScope(*jsRuntime); + HandleEscape handleEscape(*jsRuntime); auto& nativeEngine = jsRuntime->GetNativeEngine(); size_t argc = 0; NativeValue *argv[MAX_ARG_COUNT] = { nullptr }; @@ -257,7 +257,7 @@ static int DoCallJsMethod(CallJsParam *param) FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return ERR_INVALID_PARAM; } - if (!param->retParser(nativeEngine, handleScope.Escape(nativeEngine.CallFunction(value, method, argv, argc)))) { + if (!param->retParser(nativeEngine, handleEscape.Escape(nativeEngine.CallFunction(value, method, argv, argc)))) { HILOG_INFO("Parser js result fail."); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return ERR_PARSER_FAIL; @@ -1071,5 +1071,76 @@ int JsFileAccessExtAbility::Access(const Uri &uri, bool &isExist) FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return ERR_OK; } + +int JsFileAccessExtAbility::UriToFileInfo(const Uri &selectFile, FileInfo &fileInfo) +{ + StartTrace(HITRACE_TAG_FILEMANAGEMENT, "UriToFileInfo"); + auto value = std::make_shared>(); + if (value == nullptr) { + HILOG_ERROR("UriToFileInfo 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("uriToFileInfo", 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); + 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..2cb81b0ac6e1ffbe46ae3cb6a7c65a094d6a4efa 100644 --- a/frameworks/innerkits/file_access/src/napi_common_fileaccess.cpp +++ b/frameworks/innerkits/file_access/src/napi_common_fileaccess.cpp @@ -22,16 +22,6 @@ 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); - if (jsValue != nullptr) { - return UnwrapInt64FromJS2(env, jsValue, value); - } else { - return false; - } -} - napi_value WrapUint32ToJS(napi_env env, uint32_t value) { napi_value result = nullptr; @@ -106,202 +96,6 @@ bool UnwrapBigIntUint64ByPropertyName(napi_env env, napi_value param, const char } } -napi_value WrapFileInfo(napi_env env, const FileInfo &fileInfo) -{ - napi_value jsObject = nullptr; - napi_value jsValue = nullptr; - - NAPI_CALL(env, napi_create_object(env, &jsObject)); - - jsValue = OHOS::AppExecFwk::WrapStringToJS(env, fileInfo.uri); - SetPropertyValueByPropertyName(env, jsObject, "uri", jsValue); - - jsValue = OHOS::AppExecFwk::WrapStringToJS(env, fileInfo.fileName); - SetPropertyValueByPropertyName(env, jsObject, "fileName", jsValue); - - jsValue = OHOS::AppExecFwk::WrapInt32ToJS(env, fileInfo.mode); - SetPropertyValueByPropertyName(env, jsObject, "mode", jsValue); - - jsValue = OHOS::AppExecFwk::WrapInt64ToJS(env, fileInfo.size); - SetPropertyValueByPropertyName(env, jsObject, "size", jsValue); - - jsValue = OHOS::AppExecFwk::WrapInt64ToJS(env, fileInfo.mtime); - SetPropertyValueByPropertyName(env, jsObject, "mtime", jsValue); - - jsValue = OHOS::AppExecFwk::WrapStringToJS(env, fileInfo.mimeType); - SetPropertyValueByPropertyName(env, jsObject, "mimeType", jsValue); - - return jsObject; -} - -bool UnwrapFileInfo(napi_env env, napi_value param, FileInfo &fileInfo) -{ - if (!IsTypeForNapiValue(env, param, napi_object)) { - return false; - } - - std::string natValueString(""); - if (OHOS::AppExecFwk::UnwrapStringByPropertyName(env, param, "uri", natValueString)) { - fileInfo.uri = natValueString; - } - - if (OHOS::AppExecFwk::UnwrapStringByPropertyName(env, param, "fileName", natValueString)) { - fileInfo.fileName = natValueString; - } - - int32_t natValueInt32 = ERR_OK; - if (UnwrapInt32ByPropertyName(env, param, "mode", natValueInt32)) { - fileInfo.mode = natValueInt32; - } - - int64_t natValueInt64 = ERR_OK; - if (UnwrapInt64ByPropertyName(env, param, "size", natValueInt64)) { - fileInfo.size = natValueInt64; - } - - if (UnwrapInt64ByPropertyName(env, param, "mtime", natValueInt64)) { - fileInfo.mtime = natValueInt64; - } - - if (OHOS::AppExecFwk::UnwrapStringByPropertyName(env, param, "mimeType", natValueString)) { - fileInfo.mimeType = natValueString; - } - - return true; -} - -napi_value WrapArrayFileInfoToJS(napi_env env, const std::vector &fileInfoVec) -{ - napi_value jsArray = nullptr; - napi_value jsValue = nullptr; - uint32_t index = ERR_OK; - NAPI_CALL(env, napi_create_array(env, &jsArray)); - - for (uint32_t i = 0; i < fileInfoVec.size(); i++) { - jsValue = WrapFileInfo(env, fileInfoVec[i]); - if (napi_set_element(env, jsArray, index, jsValue) == napi_ok) { - index++; - } - } - return jsArray; -} - -bool UnwrapArrayFileInfoFromJS(napi_env env, napi_value param, std::vector &fileInfoVec) -{ - uint32_t arraySize = ERR_OK; - napi_value jsValue = nullptr; - if (!IsArrayForNapiValue(env, param, arraySize)) { - return false; - } - - fileInfoVec.clear(); - for (uint32_t i = 0; i < arraySize; i++) { - jsValue = nullptr; - FileInfo fileInfo; - if (napi_get_element(env, param, i, &jsValue) != napi_ok) { - return false; - } - - if (!UnwrapFileInfo(env, jsValue, fileInfo)) { - return false; - } - - fileInfoVec.push_back(fileInfo); - } - return true; -} - -napi_value WrapRootInfo(napi_env env, const RootInfo &rootInfo) -{ - napi_value jsObject = nullptr; - napi_value jsValue = nullptr; - - NAPI_CALL(env, napi_create_object(env, &jsObject)); - - jsValue = WrapInt32ToJS(env, rootInfo.deviceType); - SetPropertyValueByPropertyName(env, jsObject, "deviceType", jsValue); - - jsValue = OHOS::AppExecFwk::WrapStringToJS(env, rootInfo.uri); - SetPropertyValueByPropertyName(env, jsObject, "uri", jsValue); - - jsValue = OHOS::AppExecFwk::WrapStringToJS(env, rootInfo.displayName); - SetPropertyValueByPropertyName(env, jsObject, "displayName", jsValue); - - jsValue = WrapInt32ToJS(env, rootInfo.deviceFlags); - SetPropertyValueByPropertyName(env, jsObject, "deviceFlags", jsValue); - - return jsObject; -} - -bool UnwrapRootInfo(napi_env env, napi_value param, RootInfo &rootInfo) -{ - if (!IsTypeForNapiValue(env, param, napi_object)) { - return false; - } - - int32_t natValueInt32 = 0; - if (UnwrapInt32ByPropertyName(env, param, "deviceType", natValueInt32)) { - rootInfo.deviceType = natValueInt32; - } - - std::string natValueString(""); - if (OHOS::AppExecFwk::UnwrapStringByPropertyName(env, param, "uri", natValueString)) { - rootInfo.uri = natValueString; - } - - if (OHOS::AppExecFwk::UnwrapStringByPropertyName(env, param, "displayName", natValueString)) { - rootInfo.displayName = natValueString; - } - - if (UnwrapInt32ByPropertyName(env, param, "deviceFlags", natValueInt32)) { - rootInfo.deviceFlags = natValueInt32; - } - - return true; -} - -napi_value WrapArrayRootInfoToJS(napi_env env, const std::vector &rootInfoVec) -{ - napi_value jsArray = nullptr; - napi_value jsValue = nullptr; - uint32_t index = ERR_OK; - NAPI_CALL(env, napi_create_array(env, &jsArray)); - - for (uint32_t i = 0; i < rootInfoVec.size(); i++) { - jsValue = WrapRootInfo(env, rootInfoVec[i]); - if (napi_set_element(env, jsArray, index, jsValue) == napi_ok) { - index++; - } - } - return jsArray; -} - -bool UnwrapArrayRootInfoFromJS(napi_env env, napi_value param, std::vector &rootInfoVec) -{ - uint32_t arraySize = ERR_OK; - napi_value jsValue = nullptr; - - if (!IsArrayForNapiValue(env, param, arraySize)) { - return false; - } - - rootInfoVec.clear(); - for (uint32_t i = 0; i < arraySize; i++) { - jsValue = nullptr; - RootInfo rootInfo; - if (napi_get_element(env, param, i, &jsValue) != napi_ok) { - return false; - } - - if (!UnwrapRootInfo(env, jsValue, rootInfo)) { - return false; - } - - rootInfoVec.push_back(rootInfo); - } - return true; -} - napi_value WrapArrayWantToJS(napi_env env, const std::vector &wantVec) { napi_value jsArray = nullptr; diff --git a/frameworks/innerkits/file_access/test/fuzztest/externalfileaccess_fuzzer/external_file_access_fuzzer.cpp b/frameworks/innerkits/file_access/test/fuzztest/externalfileaccess_fuzzer/external_file_access_fuzzer.cpp index 973b860b61f1a869e31c195ad8b407c47d03270b..fcdf2b20d19ca3df5548fed44c7c1afe57d57a89 100644 --- a/frameworks/innerkits/file_access/test/fuzztest/externalfileaccess_fuzzer/external_file_access_fuzzer.cpp +++ b/frameworks/innerkits/file_access/test/fuzztest/externalfileaccess_fuzzer/external_file_access_fuzzer.cpp @@ -31,7 +31,6 @@ using namespace std; using namespace OHOS; using namespace FileAccessFwk; -const int32_t WRITE_READ = 2; const int ABILITY_ID = 5003; shared_ptr g_fah = nullptr; const int UID_TRANSFORM_TMP = 20000000; diff --git a/frameworks/innerkits/file_access/test/fuzztest/medialibraryfileaccess_fuzzer/medialibrary_file_access_fuzzer.cpp b/frameworks/innerkits/file_access/test/fuzztest/medialibraryfileaccess_fuzzer/medialibrary_file_access_fuzzer.cpp index 57fc3748739e27d9c2b0eb996ae6ecb23034024b..a9e8e408ea47ad4818ff754ce5509cca7487baad 100644 --- a/frameworks/innerkits/file_access/test/fuzztest/medialibraryfileaccess_fuzzer/medialibrary_file_access_fuzzer.cpp +++ b/frameworks/innerkits/file_access/test/fuzztest/medialibraryfileaccess_fuzzer/medialibrary_file_access_fuzzer.cpp @@ -32,7 +32,6 @@ using namespace std; using namespace OHOS; using namespace FileAccessFwk; -const int32_t WRITE_READ = 2; const int ABILITY_ID = 5003; shared_ptr g_fah = nullptr; const int UID_TRANSFORM_TMP = 20000000; diff --git a/frameworks/innerkits/file_access/test/unittest/external_file_access_test.cpp b/frameworks/innerkits/file_access/test/unittest/external_file_access_test.cpp index c83667df191fb7c975ed17d2ced0b77a757629f5..7f0515b2954da4592b33143ac68b75b3ab095888 100644 --- a/frameworks/innerkits/file_access/test/unittest/external_file_access_test.cpp +++ b/frameworks/innerkits/file_access/test/unittest/external_file_access_test.cpp @@ -30,9 +30,6 @@ namespace { using namespace std; using namespace OHOS; using namespace FileAccessFwk; -const int32_t READ = 0; -const int32_t WRITE = 1; -const int32_t WRITE_READ = 2; const int ABILITY_ID = 5003; const int INIT_THREADS_NUMBER = 4; const int ACTUAL_SUCCESS_THREADS_NUMBER = 1; @@ -75,7 +72,6 @@ public: vector wantVec; setuid(UID_TRANSFORM_TMP); int ret = FileAccessHelper::GetRegisteredFileAccessExtAbilityInfo(wantVec); - setuid(UID_DEFAULT); EXPECT_EQ(ret, OHOS::FileAccessFwk::ERR_OK); bool sus = false; for (size_t i = 0; i < wantVec.size(); i++) { @@ -94,6 +90,7 @@ public: GTEST_LOG_(ERROR) << "external_file_access_test g_fah is nullptr"; exit(1); } + setuid(UID_DEFAULT); } static void TearDownTestCase() { diff --git a/frameworks/innerkits/file_access/test/unittest/medialibrary_file_access_test.cpp b/frameworks/innerkits/file_access/test/unittest/medialibrary_file_access_test.cpp index 62a5b3ef72153b15dc55ccf58ac66da697806d91..0be6d4a8ffb72d5c014e01c1861c01f6e5720643 100644 --- a/frameworks/innerkits/file_access/test/unittest/medialibrary_file_access_test.cpp +++ b/frameworks/innerkits/file_access/test/unittest/medialibrary_file_access_test.cpp @@ -30,9 +30,6 @@ namespace { using namespace std; using namespace OHOS; using namespace FileAccessFwk; -const int32_t READ = 0; -const int32_t WRITE = 1; -const int32_t WRITE_READ = 2; const int ABILITY_ID = 5003; const int INIT_THREADS_NUMBER = 4; const int ACTUAL_SUCCESS_THREADS_NUMBER = 1; @@ -76,7 +73,6 @@ public: vector wantVec; setuid(UID_TRANSFORM_TMP); int ret = FileAccessHelper::GetRegisteredFileAccessExtAbilityInfo(wantVec); - setuid(UID_DEFAULT); EXPECT_EQ(ret, OHOS::FileAccessFwk::ERR_OK); bool sus = false; for (size_t i = 0; i < wantVec.size(); i++) { @@ -95,6 +91,7 @@ public: GTEST_LOG_(ERROR) << "medialibrary_file_access_test g_fah is nullptr"; exit(1); } + setuid(UID_DEFAULT); } static void TearDownTestCase() { 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..d538f4358ef3899a85f296e0a7d8811912bd28b9 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, }; } + + uriToFileInfo(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..59b4fc4d31cb3c502158317166bb6fdd035fc293 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("uriToFileInfo", NAPI_UriToFileInfo), DECLARE_NAPI_FUNCTION("on", NAPI_On), DECLARE_NAPI_FUNCTION("off", NAPI_Off) }; @@ -253,6 +254,20 @@ napi_value FileAccessHelperInit(napi_env env, napi_value exports) return exports; } +void InitOpenFlags(napi_env env, napi_value exports) +{ + char propertyName[] = "OPENFLAGS"; + napi_property_descriptor desc[] = { + DECLARE_NAPI_STATIC_PROPERTY("READ", NVal::CreateInt32(env, READ).val_), + DECLARE_NAPI_STATIC_PROPERTY("WRITE", NVal::CreateInt32(env, WRITE).val_), + DECLARE_NAPI_STATIC_PROPERTY("WRITE_READ", NVal::CreateInt32(env, WRITE_READ).val_) + }; + napi_value obj = nullptr; + napi_create_object(env, &obj); + napi_define_properties(env, obj, sizeof(desc) / sizeof(desc[0]), desc); + napi_set_named_property(env, exports, propertyName, obj); +} + static FileAccessHelper *GetFileAccessHelper(napi_env env, napi_value thisVar) { if (thisVar == nullptr) { @@ -766,6 +781,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_UriToFileInfo(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->UriToFileInfo(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 = "uriToFileInfo"; + 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..26069715f053b085844741d1357a7b15bd7d38ba 100644 --- a/interfaces/kits/napi/file_access_module/napi_fileaccess_helper.h +++ b/interfaces/kits/napi/file_access_module/napi_fileaccess_helper.h @@ -32,8 +32,10 @@ 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_UriToFileInfo(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); + void InitOpenFlags(napi_env env, napi_value exports); } // namespace FileAccessFwk } // namespace OHOS #endif // NAPI_FILEACCESS_HELPER_H \ No newline at end of file diff --git a/interfaces/kits/napi/file_access_module/napi_notify_callback.cpp b/interfaces/kits/napi/file_access_module/napi_notify_callback.cpp index 9c59a2de2ccdb844327f784cb4d1e31151c9430c..966ca3ffe7c4b1d4f5541edb31360cd249c7f878 100644 --- a/interfaces/kits/napi/file_access_module/napi_notify_callback.cpp +++ b/interfaces/kits/napi/file_access_module/napi_notify_callback.cpp @@ -87,6 +87,7 @@ int NapiNotifyCallback::OnNotify(const NotifyMessage& message) work = nullptr; return ERR_NOTIFY_FAIL; } + return ERR_OK; } } // namespace FileAccessFwk diff --git a/interfaces/kits/napi/file_access_module/native_fileaccess_module.cpp b/interfaces/kits/napi/file_access_module/native_fileaccess_module.cpp index 8ccb330d44ab14db500c4547213f9a57e7c36fb1..00d2faf65a878bac8fc08a06894aecde46e40c97 100644 --- a/interfaces/kits/napi/file_access_module/native_fileaccess_module.cpp +++ b/interfaces/kits/napi/file_access_module/native_fileaccess_module.cpp @@ -42,6 +42,7 @@ static napi_value Init(napi_env env, napi_value exports) InitDeviceType(env, exports); InitFileInfo(env, exports); InitRootInfo(env, exports); + InitOpenFlags(env, exports); std::vector> products; products.emplace_back(std::make_unique(env, exports)); diff --git a/services/file_extension_hap/entry/src/main/ets/Application/AbilityStage.ts b/services/file_extension_hap/entry/src/main/ets/Application/AbilityStage.ts index c4851529e91e899ca93c1f43cbbd1259decafd1f..3da608586d01d13439b99b4c97444defc77c47e7 100644 --- a/services/file_extension_hap/entry/src/main/ets/Application/AbilityStage.ts +++ b/services/file_extension_hap/entry/src/main/ets/Application/AbilityStage.ts @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import AbilityStage from "@ohos.application.AbilityStage" +import AbilityStage from "@ohos.app.ability.AbilityStage" export default class MyAbilityStage extends AbilityStage { onCreate() { 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..ef840c4597eb675fa91dc5af1c0c40dd4a23e83f 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,13 +476,55 @@ export default class FileExtAbility extends Extension { }; } + uriToFileInfo(selectFileUri) { + if (!this.checkUri(selectFileUri)) { + 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; + } + fileInfo = { + uri: selectFileUri, + fileName: fileName, + mode: mode, + size: stat.size, + mtime: stat.mtime, + mimeType: '', + }; + } catch (e) { + hilog.error(DOMAIN_CODE, TAG, 'UriToFileInfo 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', - displayName: 'shared_disk', - deviceType: DeviceType.DEVICE_SHARED_DISK, - deviceFlags: DeviceFlag.SUPPORTS_READ | DeviceFlag.SUPPORTS_WRITE, - }); + let roots = [ + { + uri: 'datashare:///com.ohos.UserFile.ExternalFileManager/data/storage/el1/bundle/storage_daemon', + displayName: 'shared_disk', + deviceType: DeviceType.DEVICE_SHARED_DISK, + deviceFlags: DeviceFlag.SUPPORTS_READ | DeviceFlag.SUPPORTS_WRITE, + }, + ]; + roots = roots.concat(getVolumeInfoList()); return { roots: roots, code: ERR_OK,