From 3110167e2961129cd4bb5f8bb6f7ca7eaa9926d4 Mon Sep 17 00:00:00 2001 From: caochuan Date: Tue, 14 Feb 2023 11:00:22 +0800 Subject: [PATCH 1/6] feat: add query interface for FAF Signed-off-by: caochuan --- .../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 | 1 + .../include/ifile_access_ext_base.h | 2 + .../src/file_access_ext_ability.cpp | 6 ++ .../file_access/src/file_access_ext_proxy.cpp | 79 +++++++++++++++++ .../file_access/src/file_access_ext_stub.cpp | 48 ++++++++++ .../src/file_access_ext_stub_impl.cpp | 14 +++ .../file_access/src/file_access_helper.cpp | 31 +++++++ .../medialibrary_file_access_test.cpp | 38 ++++++++ .../kits/napi/file_access_module/BUILD.gn | 6 ++ .../napi_fileaccess_helper.cpp | 87 ++++++++++++++++++- .../napi_fileaccess_helper.h | 1 + 15 files changed, 316 insertions(+), 1 deletion(-) 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 158b6895..94576278 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 Query(const Uri &uri, std::vector &columns, std::vector &results); virtual int GetFileInfoFromUri(const Uri &selectFile, FileInfo &fileInfo); virtual int GetFileInfoFromRelativePath(const std::string &selectFile, FileInfo &fileInfo); virtual int GetRoots(std::vector &rootInfoVec); 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 8c079705..3d8e223d 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 Query(const Uri &uri, std::vector &columns, std::vector &results) override; virtual int GetFileInfoFromUri(const Uri &selectFile, FileInfo &fileInfo) override; virtual int GetFileInfoFromRelativePath(const std::string &selectFile, FileInfo &fileInfo) override; virtual int GetRoots(std::vector &rootInfoVec) 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 3c42652f..6033b9c0 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 CmdQuery(MessageParcel &data, MessageParcel &reply); ErrCode CmdGetFileInfoFromUri(MessageParcel &data, MessageParcel &reply); ErrCode CmdGetFileInfoFromRelativePath(MessageParcel &data, MessageParcel &reply); ErrCode CmdGetRoots(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 281c2542..9b9146b2 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 Query(const Uri &uri, std::vector &columns, std::vector &results) override; int GetFileInfoFromUri(const Uri &selectFile, FileInfo &fileInfo) override; int GetFileInfoFromRelativePath(const std::string &selectFile, FileInfo &fileInfo) override; int GetRoots(std::vector &rootInfoVec) override; diff --git a/frameworks/innerkits/file_access/include/file_access_helper.h b/frameworks/innerkits/file_access/include/file_access_helper.h index 30af9962..5f3f107e 100644 --- a/frameworks/innerkits/file_access/include/file_access_helper.h +++ b/frameworks/innerkits/file_access/include/file_access_helper.h @@ -80,6 +80,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 Query(Uri &uri, std::vector &columns, std::vector &results); int GetFileInfoFromUri(Uri &selectFile, FileInfo &fileInfo); int GetFileInfoFromRelativePath(std::string &selectFile, FileInfo &fileInfo); int GetRoots(std::vector &rootInfoVec); 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 7b17c163..57ae83ee 100644 --- a/frameworks/innerkits/file_access/include/ifile_access_ext_base.h +++ b/frameworks/innerkits/file_access/include/ifile_access_ext_base.h @@ -44,6 +44,7 @@ public: CMD_RENAME, CMD_LIST_FILE, CMD_SCAN_FILE, + CMD_QUERY, CMD_GET_ROOTS, CMD_ACCESS, CMD_GET_FILEINFO_FROM_URI, @@ -62,6 +63,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 Query(const Uri &uri, std::vector &columns, std::vector &results) = 0; virtual int GetFileInfoFromUri(const Uri &selectFile, FileInfo &fileInfo) = 0; virtual int GetFileInfoFromRelativePath(const std::string &selectFile, FileInfo &fileInfo) = 0; virtual int GetRoots(std::vector &rootInfoVec) = 0; 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 5c6fedc4..696143d6 100644 --- a/frameworks/innerkits/file_access/src/file_access_ext_ability.cpp +++ b/frameworks/innerkits/file_access/src/file_access_ext_ability.cpp @@ -111,6 +111,12 @@ int FileAccessExtAbility::ScanFile(const FileInfo &fileInfo, const int64_t offse return EPERM; } +int FileAccessExtAbility::Query(const Uri &uri, std::vector &columns, std::vector &results) +{ + HILOG_ERROR("FileAccessExtAbility::Query Undefined operation"); + return EPERM; +} + int FileAccessExtAbility::GetRoots(std::vector &rootInfoVec) { HILOG_ERROR("FileAccessExtAbility::GetRoots 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 04caffb0..0e8d1387 100644 --- a/frameworks/innerkits/file_access/src/file_access_ext_proxy.cpp +++ b/frameworks/innerkits/file_access/src/file_access_ext_proxy.cpp @@ -508,6 +508,85 @@ int FileAccessExtProxy::ScanFile(const FileInfo &fileInfo, const int64_t offset, return ERR_OK; } +static int GetQueryResult(MessageParcel &reply, std::vector &results) +{ + HILOG_DEBUG("enter GetQueryResult"); + int ret = E_IPCS; + if (!reply.ReadInt32(ret)) { + HILOG_ERROR("fail to ReadInt32 ret"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return E_IPCS; + } + + if (ret != ERR_OK) { + HILOG_ERROR("Query operation failed ret : %{public}d", ret); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ret; + } + + uint64_t count = 0; + if (!reply.ReadUint64(count)) { + HILOG_ERROR("Query operation failed to Read count"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return E_IPCS; + } + + results.clear(); + for (uint64_t i = 0; i < count; i++) { + results.push_back(reply.ReadString()); + } + return ERR_OK; +} + +int FileAccessExtProxy::Query(const Uri &uri, std::vector &columns, std::vector &results) +{ + StartTrace(HITRACE_TAG_FILEMANAGEMENT, "Query"); + MessageParcel data; + if (!data.WriteInterfaceToken(FileAccessExtProxy::GetDescriptor())) { + HILOG_ERROR("WriteInterfaceToken failed"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return E_IPCS; + } + + if (!data.WriteParcelable(&uri)) { + HILOG_ERROR("fail to WriteParcelable sourceFile"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return E_IPCS; + } + int64_t count = columns.size(); + if (!data.WriteInt64(count)) { + HILOG_ERROR("Parameter Query fail to WriteInt64 count"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return E_IPCS; + } + + for (const auto &column : columns) { + if (!data.WriteString(column)) { + HILOG_ERROR("parameter Query fail to WriteParcelable column"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return E_IPCS; + } + } + + MessageParcel reply; + MessageOption option; + int err = Remote()->SendRequest(CMD_QUERY, data, reply, option); + if (err != ERR_OK) { + HILOG_ERROR("fail to SendRequest. err: %{public}d", err); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return err; + } + + err = GetQueryResult(reply, results); + if (err != ERR_OK) { + HILOG_ERROR("fail to GetQueryResult. err: %{public}d", err); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return err; + } + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_OK; +} + int FileAccessExtProxy::GetRoots(std::vector &rootInfoVec) { StartTrace(HITRACE_TAG_FILEMANAGEMENT, "GetRoots"); 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 a5ba5dcf..567814d0 100644 --- a/frameworks/innerkits/file_access/src/file_access_ext_stub.cpp +++ b/frameworks/innerkits/file_access/src/file_access_ext_stub.cpp @@ -48,6 +48,7 @@ FileAccessExtStub::FileAccessExtStub() stubFuncMap_[CMD_RENAME] = &FileAccessExtStub::CmdRename; stubFuncMap_[CMD_LIST_FILE] = &FileAccessExtStub::CmdListFile; stubFuncMap_[CMD_SCAN_FILE] = &FileAccessExtStub::CmdScanFile; + stubFuncMap_[CMD_QUERY] = &FileAccessExtStub::CmdQuery; stubFuncMap_[CMD_GET_ROOTS] = &FileAccessExtStub::CmdGetRoots; stubFuncMap_[CMD_ACCESS] = &FileAccessExtStub::CmdAccess; stubFuncMap_[CMD_GET_FILEINFO_FROM_URI] = &FileAccessExtStub::CmdGetFileInfoFromUri; @@ -459,6 +460,53 @@ ErrCode FileAccessExtStub::CmdGetRoots(MessageParcel &data, MessageParcel &reply return ERR_OK; } +ErrCode FileAccessExtStub::CmdQuery(MessageParcel &data, MessageParcel &reply) +{ + StartTrace(HITRACE_TAG_FILEMANAGEMENT, "CmdQuery"); + std::shared_ptr uri(data.ReadParcelable()); + if (uri == nullptr) { + HILOG_ERROR("Parameter Move fail to ReadParcelable uri"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return E_URIS; + } + + uint64_t count = 0; + if (!data.ReadUint64(count)) { + HILOG_ERROR("Query operation failed to Read count"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return E_IPCS; + } + std::vector columns; + for (uint64_t i = 0; i < count; i++) { + columns.push_back(data.ReadString()); + } + std::vector results; + int ret = Query(*uri, columns, results); + if (!reply.WriteInt32(ret)) { + HILOG_ERROR("Parameter Query fail to WriteInt32 ret"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return E_IPCS; + } + + int64_t resCount {results.size()}; + if (!reply.WriteInt64(resCount)) { + HILOG_ERROR("Parameter Query fail to WriteInt64 count"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return E_IPCS; + } + + for (const auto &result : results) { + if (!reply.WriteString(result)) { + HILOG_ERROR("parameter Query fail to WriteParcelable column"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return E_IPCS; + } + } + + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_OK; +} + ErrCode FileAccessExtStub::CmdGetFileInfoFromUri(MessageParcel &data, MessageParcel &reply) { StartTrace(HITRACE_TAG_FILEMANAGEMENT, "CmdGetFileInfoFromUri"); 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 355ac1b7..584a1dc7 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 @@ -142,6 +142,20 @@ int FileAccessExtStubImpl::ScanFile(const FileInfo &fileInfo, const int64_t offs return ret; } +int FileAccessExtStubImpl::Query(const Uri &uri, std::vector &columns, std::vector &results) +{ + StartTrace(HITRACE_TAG_FILEMANAGEMENT, "Query"); + if (extension_ == nullptr) { + HILOG_ERROR("Query get extension failed."); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return E_IPCS; + } + + int ret = extension_->Query(uri, columns, results); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ret; +} + int FileAccessExtStubImpl::GetRoots(std::vector &rootInfoVec) { StartTrace(HITRACE_TAG_FILEMANAGEMENT, "GetRoots"); diff --git a/frameworks/innerkits/file_access/src/file_access_helper.cpp b/frameworks/innerkits/file_access/src/file_access_helper.cpp index 117c3882..afa94316 100644 --- a/frameworks/innerkits/file_access/src/file_access_helper.cpp +++ b/frameworks/innerkits/file_access/src/file_access_helper.cpp @@ -693,6 +693,37 @@ int FileAccessHelper::ScanFile(const FileInfo &fileInfo, const int64_t offset, c return ERR_OK; } +int FileAccessHelper::Query (Uri &uri, std::vector &columns, std::vector &results) +{ + StartTrace(HITRACE_TAG_FILEMANAGEMENT, "Query"); + if (!IsSystemApp()) { + HILOG_ERROR("FileAccessHelper::Query check IsSystemAppByFullTokenID failed"); + return E_PERMISSION_SYS; + } + + if (!CheckUri(uri)) { + HILOG_ERROR("sourceFile format check error."); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return E_URIS; + } + + sptr fileExtProxy = GetProxyByUri(uri); + if (fileExtProxy == nullptr) { + HILOG_ERROR("failed with invalid fileAccessExtProxy"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return E_IPCS; + } + int ret = fileExtProxy->Query(uri, columns, results); + if (ret != ERR_OK) { + HILOG_ERROR("Rename get result error, code:%{public}d", ret); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ret; + } + + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_OK; +} + int FileAccessHelper::GetRoots(std::vector &rootInfoVec) { StartTrace(HITRACE_TAG_FILEMANAGEMENT, "GetRoots"); 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 c33661e8..674643a2 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 @@ -2141,6 +2141,44 @@ 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_Query_0000 + * @tc.name: medialibrary_file_access_Query_0000 + * @tc.desc: Test function of Query interface for SUCCESS. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: SR000H0386 + */ +HWTEST_F(FileAccessHelperTest, medialibrary_file_access_Query_0000, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "FileAccessHelperTest-begin medialibrary_file_access_Query_0000"; + try { + Uri trueUri("datashare:///media/file/Documents/5"); + Uri targetUri(""); + std::string fileName = "test.txt"; + int result = g_fah->CreateFile(trueUri, fileName, targetUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + const std::string MEDIA_DATA_DB_RELATIVE_PATH = "relative_path"; + const std::string MEDIA_DATA_DB_NAME = "display_name"; + const std::string MEDIA_DATA_DB_ID = "file_id"; + std::vector columns; + std::vector results; + + columns.push_back(MEDIA_DATA_DB_ID); + columns.push_back(MEDIA_DATA_DB_RELATIVE_PATH); + columns.push_back(MEDIA_DATA_DB_NAME); + result = g_fah->Query(targetUri, columns, results); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + EXPECT_EQ(results.at(2), fileName); + result = g_fah->Delete(targetUri); + EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); + } catch (...) { + GTEST_LOG_(ERROR) << "medialibrary_file_access_Query_0000 occurs an exception."; + } + GTEST_LOG_(INFO) << "FileAccessHelperTest-end medialibrary_file_access_Query_0000"; +} + /** * @tc.number: user_file_service_medialibrary_file_access_GetFileInfoFromUri_0000 * @tc.name: medialibrary_file_access_GetFileInfoFromUri_0000 diff --git a/interfaces/kits/napi/file_access_module/BUILD.gn b/interfaces/kits/napi/file_access_module/BUILD.gn index 6566b9af..c9f999f3 100644 --- a/interfaces/kits/napi/file_access_module/BUILD.gn +++ b/interfaces/kits/napi/file_access_module/BUILD.gn @@ -28,6 +28,9 @@ ohos_shared_library("fileaccess") { "${BASE_DIR}/utils", "//foundation/filemanagement/file_api/interfaces/kits/js/src/common", "//foundation/filemanagement/file_api/utils/filemgmt_libn/include", + "//foundation/multimedia/media_library/frameworks/services/media_file_extension/include", + "//foundation/multimedia/media_library/frameworks/utils/include", + "//foundation/multimedia/media_library/interfaces/inner_api/media_library_helper/include", ] sources = [ @@ -54,7 +57,10 @@ ohos_shared_library("fileaccess") { "ability_runtime:abilitykit_native", "ability_runtime:napi_base_context", "c_utils:utils", + "data_share:datashare_common", + "data_share:datashare_provider", "hiviewdfx_hilog_native:libhilog", "napi:ace_napi", + "relational_store:native_rdb", ] } 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 152c66d2..32f8a8fa 100644 --- a/interfaces/kits/napi/file_access_module/napi_fileaccess_helper.cpp +++ b/interfaces/kits/napi/file_access_module/napi_fileaccess_helper.cpp @@ -18,13 +18,15 @@ #include #include #include - +#include #include "file_access_framework_errno.h" #include "file_access_helper.h" #include "file_info_entity.h" #include "filemgmt_libn.h" #include "hilog_wrapper.h" #include "ifile_access_notify.h" +#include "media_file_extention_utils.h" +#include "medialibrary_db_const.h" #include "napi_base_context.h" #include "napi_common_fileaccess.h" #include "napi_file_info_exporter.h" @@ -37,6 +39,7 @@ using namespace OHOS::AAFwk; using namespace OHOS::AppExecFwk; using namespace OHOS::FileManagement::LibN; +using namespace OHOS::Media; namespace OHOS { namespace FileAccessFwk { @@ -44,6 +47,7 @@ namespace { const std::string FILEACCESS_CLASS_NAME = "FileAccessHelper"; static napi_ref g_constructorRef = nullptr; constexpr uint32_t INITIAL_REFCOUNT = 1; + using json = nlohmann::json; } std::list> g_fileAccessHelperList; @@ -228,6 +232,7 @@ napi_value FileAccessHelperInit(napi_env env, napi_value exports) DECLARE_NAPI_FUNCTION("createFile", NAPI_CreateFile), DECLARE_NAPI_FUNCTION("delete", NAPI_Delete), DECLARE_NAPI_FUNCTION("move", NAPI_Move), + DECLARE_NAPI_FUNCTION("query", NAPI_Query), DECLARE_NAPI_FUNCTION("rename", NAPI_Rename), DECLARE_NAPI_FUNCTION("getRoots", NAPI_GetRoots), DECLARE_NAPI_FUNCTION("access", NAPI_Access), @@ -602,6 +607,86 @@ napi_value NAPI_Move(napi_env env, napi_callback_info info) return NAsyncWorkCallback(env, thisVar, cb).Schedule(procedureName, cbExec, cbComplete).val_; } +napi_value NAPI_Query(napi_env env, napi_callback_info info) +{ + NFuncArg funcArg(env, info); + if (!funcArg.InitArgs(NARG_CNT::TWO, NARG_CNT::THREE)) { + NError(EINVAL).ThrowErr(env); + return nullptr; + } + + bool succ = false; + std::unique_ptr uri; + std::unique_ptr metaJson; + std::tie(succ, uri, metaJson) = GetReadArg(env, funcArg[NARG_POS::FIRST], funcArg[NARG_POS::SECOND]); + if (!succ) { + return nullptr; + } + std::string uriString(uri.get()); + std::string metaJsonString(metaJson.get()); + if (!json::accept(metaJsonString)) { + NError(EINVAL).ThrowErr(env); + return nullptr; + } + FileAccessHelper *fileAccessHelper = GetFileAccessHelper(env, funcArg.GetThisVar()); + if (fileAccessHelper == nullptr) { + return nullptr; + } + + auto columns = std::make_shared>(); + auto results = std::make_shared>(); + auto jsonObject = json::parse(metaJsonString); + for (json::iterator it = jsonObject.begin(); it != jsonObject.end(); ++it) { + auto iterator = RESULT_TYPE_MAP.find(it.key()); + if (iterator == RESULT_TYPE_MAP.end()) { + NError(EINVAL).ThrowErr(env); + return nullptr; + } + columns->push_back(it.key()); + } + auto cbExec = [uriString, columns, results, fileAccessHelper]() -> NError { + OHOS::Uri uri(uriString); + int ret = fileAccessHelper->Query(uri, *columns, *results); + return NError(ret); + }; + auto cbComplete = [columns, results](napi_env env, NError err) -> NVal { + if (err) { + return { env, err.GetNapiErr(env) }; + } + json reslutJson; + for (int i = 0; i < int(columns->size()); i++) { + auto memberType = RESULT_TYPE_MAP.at(columns->at(i)); + switch (memberType) { + case STRING_TYPE: + reslutJson[(*columns)[i]] = (*results)[i]; + break; + case INT32_TYPE: + reslutJson[(*columns)[i]] = std::stoi((*results)[i]); + break; + case INT64_TYPE: + reslutJson[(*columns)[i]] = std::stol((*results)[i]); + break; + default: + HILOG_INFO("not match memberType %{public}d", memberType); + break; + } + } + return { NVal::CreateUTF8String(env, reslutJson.dump()) }; + }; + const std::string procedureName = "query"; + NVal thisVar(env, funcArg.GetThisVar()); + if (funcArg.GetArgc() == NARG_CNT::TWO) { + return NAsyncWorkPromise(env, thisVar).Schedule(procedureName, cbExec, cbComplete).val_; + } + + NVal cb(env, funcArg[NARG_POS::THIRD]); + if (!cb.TypeIs(napi_function)) { + NError(EINVAL).ThrowErr(env); + return nullptr; + } + return NAsyncWorkCallback(env, thisVar, cb).Schedule(procedureName, cbExec, cbComplete).val_; +} + napi_value NAPI_Rename(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 e29f3d39..430d70c3 100644 --- a/interfaces/kits/napi/file_access_module/napi_fileaccess_helper.h +++ b/interfaces/kits/napi/file_access_module/napi_fileaccess_helper.h @@ -29,6 +29,7 @@ namespace FileAccessFwk { napi_value NAPI_Mkdir(napi_env env, napi_callback_info info); napi_value NAPI_Delete(napi_env env, napi_callback_info info); napi_value NAPI_Move(napi_env env, napi_callback_info info); + napi_value NAPI_Query(napi_env env, napi_callback_info info); 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); -- Gitee From d35d9dff6f70b80378e226a935a0e3fdbb4ced78 Mon Sep 17 00:00:00 2001 From: caochuan Date: Tue, 14 Mar 2023 17:01:12 +0800 Subject: [PATCH 2/6] feat: add etxernal file query Signed-off-by: caochuan --- .../js/napi/file_access_module/BUILD.gn | 1 + .../napi_fileaccess_helper.cpp | 54 ++++------- .../include/file_access_extension_info.h | 35 +++++++ .../file_access/include/file_access_helper.h | 3 +- .../include/js_file_access_ext_ability.h | 1 + .../file_access/src/file_access_helper.cpp | 64 ++++++++++++- .../src/js_file_access_ext_ability.cpp | 94 +++++++++++++++++++ .../FileExtensionAbility.ts | 27 ++++++ 8 files changed, 237 insertions(+), 42 deletions(-) diff --git a/frameworks/js/napi/file_access_module/BUILD.gn b/frameworks/js/napi/file_access_module/BUILD.gn index 22b338d4..c5152d69 100644 --- a/frameworks/js/napi/file_access_module/BUILD.gn +++ b/frameworks/js/napi/file_access_module/BUILD.gn @@ -60,6 +60,7 @@ ohos_shared_library("fileaccess") { "data_share:datashare_provider", "relational_store:native_rdb", "file_api:filemgmt_libn", + "file_api:remote_uri_native", "hiviewdfx_hilog_native:libhilog", ] } diff --git a/frameworks/js/napi/file_access_module/napi_fileaccess_helper.cpp b/frameworks/js/napi/file_access_module/napi_fileaccess_helper.cpp index 32f8a8fa..30c39b6b 100644 --- a/frameworks/js/napi/file_access_module/napi_fileaccess_helper.cpp +++ b/frameworks/js/napi/file_access_module/napi_fileaccess_helper.cpp @@ -32,6 +32,7 @@ #include "napi_file_info_exporter.h" #include "napi_notify_callback.h" #include "napi_root_iterator_exporter.h" +#include "remote_uri.h" #include "root_iterator_entity.h" #include "securec.h" #include "uri.h" @@ -40,6 +41,7 @@ using namespace OHOS::AAFwk; using namespace OHOS::AppExecFwk; using namespace OHOS::FileManagement::LibN; using namespace OHOS::Media; +using namespace OHOS::DistributedFS::ModuleRemoteUri; namespace OHOS { namespace FileAccessFwk { @@ -620,59 +622,36 @@ napi_value NAPI_Query(napi_env env, napi_callback_info info) std::unique_ptr metaJson; std::tie(succ, uri, metaJson) = GetReadArg(env, funcArg[NARG_POS::FIRST], funcArg[NARG_POS::SECOND]); if (!succ) { + NError(EINVAL).ThrowErr(env); return nullptr; } + std::string uriString(uri.get()); + std::string metaJsonString(metaJson.get()); - if (!json::accept(metaJsonString)) { - NError(EINVAL).ThrowErr(env); - return nullptr; - } + auto metaJsonPtr = std::make_shared(metaJsonString); + FileAccessHelper *fileAccessHelper = GetFileAccessHelper(env, funcArg.GetThisVar()); if (fileAccessHelper == nullptr) { + NError(EINVAL).ThrowErr(env); return nullptr; } - auto columns = std::make_shared>(); - auto results = std::make_shared>(); - auto jsonObject = json::parse(metaJsonString); - for (json::iterator it = jsonObject.begin(); it != jsonObject.end(); ++it) { - auto iterator = RESULT_TYPE_MAP.find(it.key()); - if (iterator == RESULT_TYPE_MAP.end()) { - NError(EINVAL).ThrowErr(env); - return nullptr; - } - columns->push_back(it.key()); - } - auto cbExec = [uriString, columns, results, fileAccessHelper]() -> NError { + + auto cbExec = [uriString, metaJsonPtr, fileAccessHelper]() -> NError { OHOS::Uri uri(uriString); - int ret = fileAccessHelper->Query(uri, *columns, *results); + int ret = fileAccessHelper->Query(uri, *metaJsonPtr); return NError(ret); }; - auto cbComplete = [columns, results](napi_env env, NError err) -> NVal { + + auto cbComplete = [metaJsonPtr](napi_env env, NError err) -> NVal { if (err) { return { env, err.GetNapiErr(env) }; } - json reslutJson; - for (int i = 0; i < int(columns->size()); i++) { - auto memberType = RESULT_TYPE_MAP.at(columns->at(i)); - switch (memberType) { - case STRING_TYPE: - reslutJson[(*columns)[i]] = (*results)[i]; - break; - case INT32_TYPE: - reslutJson[(*columns)[i]] = std::stoi((*results)[i]); - break; - case INT64_TYPE: - reslutJson[(*columns)[i]] = std::stol((*results)[i]); - break; - default: - HILOG_INFO("not match memberType %{public}d", memberType); - break; - } - } - return { NVal::CreateUTF8String(env, reslutJson.dump()) }; + + return { NVal::CreateUTF8String(env, *metaJsonPtr) }; }; + const std::string procedureName = "query"; NVal thisVar(env, funcArg.GetThisVar()); if (funcArg.GetArgc() == NARG_CNT::TWO) { @@ -684,6 +663,7 @@ napi_value NAPI_Query(napi_env env, napi_callback_info info) NError(EINVAL).ThrowErr(env); return nullptr; } + return NAsyncWorkCallback(env, thisVar, cb).Schedule(procedureName, cbExec, cbComplete).val_; } diff --git a/interfaces/inner_api/file_access/include/file_access_extension_info.h b/interfaces/inner_api/file_access/include/file_access_extension_info.h index d1bfd225..499f992e 100644 --- a/interfaces/inner_api/file_access/include/file_access_extension_info.h +++ b/interfaces/inner_api/file_access/include/file_access_extension_info.h @@ -18,6 +18,7 @@ #include #include +#include #include "parcel.h" #include "uri.h" @@ -49,6 +50,18 @@ const uint32_t DOCUMENT_FLAG_REPRESENTS_DIR = 1 << 1; const uint32_t DOCUMENT_FLAG_SUPPORTS_READ = 1 << 2; const uint32_t DOCUMENT_FLAG_SUPPORTS_WRITE = 1 << 3; +const std::string MEDIA_DATA_DB_NAME = "display_name"; +const std::string MEDIA_DATA_DB_RELATIVE_PATH = "relative_path"; +const std::string MEDIA_DATA_DB_SIZE = "size"; +const std::string MEDIA_DATA_DB_DATE_MODIFIED = "date_modified"; +const std::string MEDIA_DATA_DB_DATE_ADDED = "date_added"; +const std::string MEDIA_DATA_DB_HEIGHT = "height"; +const std::string MEDIA_DATA_DB_WIDTH = "width"; +const std::string MEDIA_DATA_DB_DURATION = "duration"; + +const std::string FILE_DATA_ATIME = "atime"; +const std::string FILE_DATA_MTIME = "mtime"; + struct FileInfo : public virtual OHOS::Parcelable { public: std::string uri { "" }; @@ -169,6 +182,28 @@ public: return info; } }; + +enum ResultType { + STRING_TYPE = 1, + INT32_TYPE, + INT64_TYPE, +}; + +static const std::unordered_map MEDIA_RESULT_TYPE = { + { MEDIA_DATA_DB_NAME, STRING_TYPE }, + { MEDIA_DATA_DB_RELATIVE_PATH, STRING_TYPE }, + { MEDIA_DATA_DB_SIZE, INT64_TYPE }, + { MEDIA_DATA_DB_DATE_ADDED, INT64_TYPE }, + { MEDIA_DATA_DB_DATE_MODIFIED, INT64_TYPE }, + { MEDIA_DATA_DB_WIDTH, INT32_TYPE }, + { MEDIA_DATA_DB_HEIGHT, INT32_TYPE }, + { MEDIA_DATA_DB_DURATION, INT32_TYPE }, +}; + +static const std::unordered_map FILE_RESULT_MAP = { + { MEDIA_DATA_DB_DATE_ADDED, FILE_DATA_ATIME }, + { MEDIA_DATA_DB_DATE_MODIFIED, FILE_DATA_MTIME }, +}; } // namespace FileAccessFwk } // namespace OHOS #endif // FILE_ACCESS_EXTENSION_INFO_H \ No newline at end of file diff --git a/interfaces/inner_api/file_access/include/file_access_helper.h b/interfaces/inner_api/file_access/include/file_access_helper.h index 5f3f107e..2c58b827 100644 --- a/interfaces/inner_api/file_access/include/file_access_helper.h +++ b/interfaces/inner_api/file_access/include/file_access_helper.h @@ -47,6 +47,7 @@ namespace { static const int32_t READ = 0; static const int32_t WRITE = 1; static const int32_t WRITE_READ = 2; + using json = nlohmann::json; } struct ConnectInfo { @@ -80,7 +81,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 Query(Uri &uri, std::vector &columns, std::vector &results); + int Query(Uri &uri, std::string &metaJson); int GetFileInfoFromUri(Uri &selectFile, FileInfo &fileInfo); int GetFileInfoFromRelativePath(std::string &selectFile, FileInfo &fileInfo); int GetRoots(std::vector &rootInfoVec); diff --git a/interfaces/inner_api/file_access/include/js_file_access_ext_ability.h b/interfaces/inner_api/file_access/include/js_file_access_ext_ability.h index 8c3eb4d9..ac4b0bd2 100644 --- a/interfaces/inner_api/file_access/include/js_file_access_ext_ability.h +++ b/interfaces/inner_api/file_access/include/js_file_access_ext_ability.h @@ -71,6 +71,7 @@ public: int GetFileInfoFromUri(const Uri &selectFile, FileInfo &fileInfo) override; int GetRoots(std::vector &rootInfoVec) override; int Access(const Uri &uri, bool &isExist) override; + int Query(const Uri &uri, std::vector &columns, std::vector &results) override; private: NativeValue* CallObjectMethod(const char *name, NativeValue * const *argv = nullptr, size_t argc = 0); diff --git a/interfaces/inner_api/file_access/src/file_access_helper.cpp b/interfaces/inner_api/file_access/src/file_access_helper.cpp index afa94316..f20de055 100644 --- a/interfaces/inner_api/file_access/src/file_access_helper.cpp +++ b/interfaces/inner_api/file_access/src/file_access_helper.cpp @@ -15,18 +15,22 @@ #include "file_access_helper.h" +#include #include "bundle_constants.h" #include "bundle_mgr_proxy.h" #include "file_access_framework_errno.h" +#include "file_access_extension_info.h" #include "hilog_wrapper.h" #include "hitrace_meter.h" #include "if_system_ability_manager.h" #include "ifile_access_ext_base.h" #include "ipc_skeleton.h" #include "iservice_registry.h" +#include "remote_uri.h" #include "system_ability_definition.h" #include "tokenid_kit.h" +using namespace OHOS::DistributedFS::ModuleRemoteUri; namespace OHOS { namespace FileAccessFwk { std::vector FileAccessHelper::wants_; @@ -693,7 +697,7 @@ int FileAccessHelper::ScanFile(const FileInfo &fileInfo, const int64_t offset, c return ERR_OK; } -int FileAccessHelper::Query (Uri &uri, std::vector &columns, std::vector &results) +int FileAccessHelper::Query (Uri &uri, std::string &metaJson) { StartTrace(HITRACE_TAG_FILEMANAGEMENT, "Query"); if (!IsSystemApp()) { @@ -702,24 +706,76 @@ int FileAccessHelper::Query (Uri &uri, std::vector &columns, std::v } if (!CheckUri(uri)) { - HILOG_ERROR("sourceFile format check error."); + HILOG_ERROR("Uri format check error."); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return E_URIS; } + if (!json::accept(metaJson)) { + HILOG_ERROR("metaJson format check error."); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return E_GETRESULT; + } + + auto jsonObject = json::parse(metaJson); + auto columns = std::make_shared>(); + for (json::iterator it = jsonObject.begin(); it != jsonObject.end(); ++it) { + auto iterator = MEDIA_RESULT_TYPE.find(it.key()); + if (iterator == MEDIA_RESULT_TYPE.end()) { + HILOG_ERROR("columns format check error."); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return E_GETRESULT; + } + columns->push_back(it.key()); + } + + if (columns->empty()) { + HILOG_ERROR("columns is empty."); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return E_GETRESULT; + } + sptr fileExtProxy = GetProxyByUri(uri); if (fileExtProxy == nullptr) { HILOG_ERROR("failed with invalid fileAccessExtProxy"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return E_IPCS; } - int ret = fileExtProxy->Query(uri, columns, results); + + std::string uriString(uri.ToString()); + if (!RemoteUri::IsMediaUri(uriString)) { + HILOG_ERROR("sourceFile format check error."); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return E_URIS; + } + auto results = std::make_shared>(); + int ret = fileExtProxy->Query(uri, *columns, *results); if (ret != ERR_OK) { - HILOG_ERROR("Rename get result error, code:%{public}d", ret); + HILOG_ERROR("Query get result error, code:%{public}d", ret); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return ret; } + for (int i = 0; i < int(columns->size()); i++) { + auto memberType = MEDIA_RESULT_TYPE.at(columns->at(i)); + switch (memberType) { + case STRING_TYPE: + jsonObject[(*columns)[i]] = (*results)[i]; + break; + case INT32_TYPE: + jsonObject[(*columns)[i]] = std::stoi((*results)[i]); + break; + case INT64_TYPE: + jsonObject[(*columns)[i]] = std::stol((*results)[i]); + break; + default: + jsonObject[(*columns)[i]] = ' '; + HILOG_INFO("not match memberType %{public}d", memberType); + break; + } + } + + metaJson = jsonObject.dump(); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return ERR_OK; } diff --git a/interfaces/inner_api/file_access/src/js_file_access_ext_ability.cpp b/interfaces/inner_api/file_access/src/js_file_access_ext_ability.cpp index b0e3b877..293ec8f8 100644 --- a/interfaces/inner_api/file_access/src/js_file_access_ext_ability.cpp +++ b/interfaces/inner_api/file_access/src/js_file_access_ext_ability.cpp @@ -1072,6 +1072,100 @@ int JsFileAccessExtAbility::Access(const Uri &uri, bool &isExist) return ERR_OK; } +static bool ParserQueryFileJsResult(NativeEngine &engine, NativeValue *nativeValue, Value> &results) +{ + NativeObject *obj = ConvertNativeValueTo(nativeValue); + if (obj == nullptr) { + HILOG_ERROR("Convert js object fail."); + return false; + } + + bool ret = ConvertFromJsValue(engine, obj->GetProperty("code"), results.code); + NativeArray *nativeArray = ConvertNativeValueTo(obj->GetProperty("results")); + if (nativeArray == nullptr) { + HILOG_ERROR("Convert js array object fail."); + return false; + } + for (uint32_t i = 0; i < nativeArray->GetLength(); i++) { + + NativeValue *result = nativeArray->GetElement(i); + if (result == nullptr) { + HILOG_ERROR("get native FileInfo fail."); + return false; + } + std::string tempValue; + ret = ret && ConvertFromJsValue(engine, result, tempValue); + if (!ret) { + HILOG_ERROR("Convert js value fail."); + } + results.data.emplace_back(tempValue); + } + return ret; +} + +int JsFileAccessExtAbility::Query(const Uri &uri, std::vector &columns, std::vector &results) +{ + StartTrace(HITRACE_TAG_FILEMANAGEMENT, "Query"); + auto value = std::make_shared>>(); + if (value == nullptr) { + HILOG_ERROR("Query value is nullptr."); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return E_GETRESULT; + } + + auto argParser = [uri, &columns](NativeEngine &engine, NativeValue *argv[], size_t &argc) -> bool { + HILOG_ERROR("enter argParser Query uri = %{public}s column = %{public}s", uri.ToString().c_str(), + columns.at(0).c_str()); + NativeValue *nativeUri = engine.CreateString(uri.ToString().c_str(), uri.ToString().length()); + if (nativeUri == nullptr) { + HILOG_ERROR("create uri native js value fail."); + return false; + } + NativeValue *resultArray = engine.CreateArray(columns.size()); + if (resultArray == nullptr) { + HILOG_ERROR("Create MimeType native array value fail."); + return E_GETRESULT; + } + + int errorCode = MakeStringNativeArray(engine, columns, resultArray); + if (errorCode != ERR_OK) { + HILOG_ERROR("Create resultArray native array value fail, code:%{public}d.", errorCode); + return errorCode; + } + argv[ARGC_ZERO] = nativeUri; + argv[ARGC_ONE] = resultArray; + argc = ARGC_TWO; + return true; + }; + auto retParser = [value](NativeEngine &engine, NativeValue *result) -> bool { + Value> res; + bool ret = ParserQueryFileJsResult(engine, result, res); + if (!ret) { + HILOG_ERROR("Parser js value fail."); + return ret; + } + value->data = res.data; + return ret; + }; + + auto errCode = CallJsMethod("query", 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("query fail."); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return value->code; + } + + results = std::move(value->data); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_OK; +} + int JsFileAccessExtAbility::GetFileInfoFromUri(const Uri &selectFile, FileInfo &fileInfo) { StartTrace(HITRACE_TAG_FILEMANAGEMENT, "GetFileInfoFromUri"); 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 0954189d..495994b8 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 @@ -538,4 +538,31 @@ export default class FileExtAbility extends Extension { code: ERR_OK, }; } + + query(uri, columns) { + if (!this.checkUri(uri)) { + return { + results: [], + code: E_URIS, + }; + } + let results = []; + try { + let path = this.getPath(uri); + let stat = fileio.statSync(path); + for (let column in columns) { + results.push(stat[column]); + } + } catch(e) { + hilog.error(DOMAIN_CODE, TAG, 'query error ' + e.message); + return { + results: [], + code: E_GETRESULT, + }; + } + return { + results: results, + code: ERR_OK, + }; + } }; \ No newline at end of file -- Gitee From 60e7409cb7c44c9afbc7e54d1f36fed6d339c2fe Mon Sep 17 00:00:00 2001 From: caochuan Date: Tue, 21 Mar 2023 13:22:19 +0800 Subject: [PATCH 3/6] add file access ext Signed-off-by: caochuan --- .../napi_fileaccess_helper.cpp | 22 +- .../napi_fileaccess_helper.h | 1 + .../native_fileaccess_module.cpp | 1 + interfaces/inner_api/file_access/BUILD.gn | 5 + .../include/file_access_extension_info.h | 25 +- .../file_access/include/file_access_helper.h | 8 + .../file_access/src/file_access_ext_proxy.cpp | 9 +- .../file_access/src/file_access_ext_stub.cpp | 8 +- .../file_access/src/file_access_helper.cpp | 128 ++++++---- .../src/js_file_access_ext_ability.cpp | 38 +-- .../FileExtensionAbility.ts | 14 +- .../medialibrary_file_access_test.cpp | 222 ++++++++++++++++-- 12 files changed, 373 insertions(+), 108 deletions(-) diff --git a/frameworks/js/napi/file_access_module/napi_fileaccess_helper.cpp b/frameworks/js/napi/file_access_module/napi_fileaccess_helper.cpp index 30c39b6b..cf4a99a3 100644 --- a/frameworks/js/napi/file_access_module/napi_fileaccess_helper.cpp +++ b/frameworks/js/napi/file_access_module/napi_fileaccess_helper.cpp @@ -280,6 +280,25 @@ void InitOpenFlags(napi_env env, napi_value exports) napi_set_named_property(env, exports, propertyName, obj); } +void InitQueryFlags(napi_env env, napi_value exports) +{ + char propertyName[] = "QUERYFLAGS"; + napi_property_descriptor desc[] = { + DECLARE_NAPI_STATIC_PROPERTY("DISPLAY_NAME", NVal::CreateUTF8String(env, DISPLAY_NAME).val_), + DECLARE_NAPI_STATIC_PROPERTY("DATE_ADDED", NVal::CreateUTF8String(env, DATE_ADDED).val_), + DECLARE_NAPI_STATIC_PROPERTY("DATE_MODIFIED", NVal::CreateUTF8String(env, DATE_MODIFIED).val_), + DECLARE_NAPI_STATIC_PROPERTY("RELATIVE_PATH", NVal::CreateUTF8String(env, RELATIVE_PATH).val_), + DECLARE_NAPI_STATIC_PROPERTY("FILE_SIZE", NVal::CreateUTF8String(env, FILE_SIZE).val_), + DECLARE_NAPI_STATIC_PROPERTY("WIDTH", NVal::CreateUTF8String(env, WIDTH).val_), + DECLARE_NAPI_STATIC_PROPERTY("HEIGHT", NVal::CreateUTF8String(env, HEIGHT).val_), + DECLARE_NAPI_STATIC_PROPERTY("DURATION", NVal::CreateUTF8String(env, DURATION).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) { @@ -627,13 +646,10 @@ napi_value NAPI_Query(napi_env env, napi_callback_info info) } std::string uriString(uri.get()); - std::string metaJsonString(metaJson.get()); auto metaJsonPtr = std::make_shared(metaJsonString); - FileAccessHelper *fileAccessHelper = GetFileAccessHelper(env, funcArg.GetThisVar()); if (fileAccessHelper == nullptr) { - NError(EINVAL).ThrowErr(env); return nullptr; } diff --git a/frameworks/js/napi/file_access_module/napi_fileaccess_helper.h b/frameworks/js/napi/file_access_module/napi_fileaccess_helper.h index 430d70c3..14d6b843 100644 --- a/frameworks/js/napi/file_access_module/napi_fileaccess_helper.h +++ b/frameworks/js/napi/file_access_module/napi_fileaccess_helper.h @@ -38,6 +38,7 @@ namespace FileAccessFwk { 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); + void InitQueryFlags(napi_env env, napi_value exports); } // namespace FileAccessFwk } // namespace OHOS #endif // NAPI_FILEACCESS_HELPER_H \ No newline at end of file diff --git a/frameworks/js/napi/file_access_module/native_fileaccess_module.cpp b/frameworks/js/napi/file_access_module/native_fileaccess_module.cpp index 0b0ca6d1..752d3427 100644 --- a/frameworks/js/napi/file_access_module/native_fileaccess_module.cpp +++ b/frameworks/js/napi/file_access_module/native_fileaccess_module.cpp @@ -43,6 +43,7 @@ static napi_value Init(napi_env env, napi_value exports) InitFileInfo(env, exports); InitRootInfo(env, exports); InitOpenFlags(env, exports); + InitQueryFlags(env, exports); std::vector> products; products.emplace_back(std::make_unique(env, exports)); diff --git a/interfaces/inner_api/file_access/BUILD.gn b/interfaces/inner_api/file_access/BUILD.gn index c34163cb..a899e0a2 100644 --- a/interfaces/inner_api/file_access/BUILD.gn +++ b/interfaces/inner_api/file_access/BUILD.gn @@ -15,6 +15,7 @@ import("//build/ohos.gni") import("//foundation/filemanagement/user_file_service/filemanagement_aafwk.gni") BASE_DIR = "//foundation/filemanagement/user_file_service" +MEDIA_DIR = "//foundation/multimedia/media_library" config("ability_config") { visibility = [ ":*" ] @@ -55,6 +56,9 @@ ohos_shared_library("file_access_extension_ability_kit") { include_dirs = [ "${ability_runtime_path}/interfaces/kits/native/appkit/ability_runtime/context", "//foundation/communication/ipc/ipc/native/src/napi/include", + "${MEDIA_DIR}/frameworks/services/media_file_extension/include", + "${MEDIA_DIR}/frameworks/utils/include", + "${MEDIA_DIR}/interfaces/inner_api/media_library_helper/include", ] sources = [ @@ -93,6 +97,7 @@ ohos_shared_library("file_access_extension_ability_kit") { "access_token:libaccesstoken_sdk", "bundle_framework:appexecfwk_core", "c_utils:utils", + "file_api:remote_uri_native", "hitrace_native:hitrace_meter", "hiviewdfx_hilog_native:libhilog", "ipc:ipc_core", diff --git a/interfaces/inner_api/file_access/include/file_access_extension_info.h b/interfaces/inner_api/file_access/include/file_access_extension_info.h index 499f992e..b3f91f08 100644 --- a/interfaces/inner_api/file_access/include/file_access_extension_info.h +++ b/interfaces/inner_api/file_access/include/file_access_extension_info.h @@ -25,6 +25,19 @@ namespace OHOS { namespace FileAccessFwk { +namespace { + const std::string MEDIA_DATA_DB_NAME = "display_name"; + const std::string MEDIA_DATA_DB_RELATIVE_PATH = "relative_path"; + const std::string MEDIA_DATA_DB_SIZE = "size"; + const std::string MEDIA_DATA_DB_DATE_MODIFIED = "date_modified"; + const std::string MEDIA_DATA_DB_DATE_ADDED = "date_added"; + const std::string MEDIA_DATA_DB_HEIGHT = "height"; + const std::string MEDIA_DATA_DB_WIDTH = "width"; + const std::string MEDIA_DATA_DB_DURATION = "duration"; + + const std::string FILE_DATA_ATIME = "atime"; + const std::string FILE_DATA_MTIME = "mtime"; +} /** * Indicates the type of the device. */ @@ -50,18 +63,6 @@ const uint32_t DOCUMENT_FLAG_REPRESENTS_DIR = 1 << 1; const uint32_t DOCUMENT_FLAG_SUPPORTS_READ = 1 << 2; const uint32_t DOCUMENT_FLAG_SUPPORTS_WRITE = 1 << 3; -const std::string MEDIA_DATA_DB_NAME = "display_name"; -const std::string MEDIA_DATA_DB_RELATIVE_PATH = "relative_path"; -const std::string MEDIA_DATA_DB_SIZE = "size"; -const std::string MEDIA_DATA_DB_DATE_MODIFIED = "date_modified"; -const std::string MEDIA_DATA_DB_DATE_ADDED = "date_added"; -const std::string MEDIA_DATA_DB_HEIGHT = "height"; -const std::string MEDIA_DATA_DB_WIDTH = "width"; -const std::string MEDIA_DATA_DB_DURATION = "duration"; - -const std::string FILE_DATA_ATIME = "atime"; -const std::string FILE_DATA_MTIME = "mtime"; - struct FileInfo : public virtual OHOS::Parcelable { public: std::string uri { "" }; diff --git a/interfaces/inner_api/file_access/include/file_access_helper.h b/interfaces/inner_api/file_access/include/file_access_helper.h index 2c58b827..7055d1a5 100644 --- a/interfaces/inner_api/file_access/include/file_access_helper.h +++ b/interfaces/inner_api/file_access/include/file_access_helper.h @@ -47,6 +47,14 @@ namespace { static const int32_t READ = 0; static const int32_t WRITE = 1; static const int32_t WRITE_READ = 2; + static const std::string DISPLAY_NAME = "display_name"; + static const std::string DATE_ADDED = "date_added"; + static const std::string DATE_MODIFIED = "date_modified"; + static const std::string RELATIVE_PATH = "relative_path"; + static const std::string FILE_SIZE = "size"; + static const std::string WIDTH = "width"; + static const std::string HEIGHT = "height"; + static const std::string DURATION = "duration"; using json = nlohmann::json; } diff --git a/interfaces/inner_api/file_access/src/file_access_ext_proxy.cpp b/interfaces/inner_api/file_access/src/file_access_ext_proxy.cpp index 0e8d1387..46bcc47b 100644 --- a/interfaces/inner_api/file_access/src/file_access_ext_proxy.cpp +++ b/interfaces/inner_api/file_access/src/file_access_ext_proxy.cpp @@ -514,25 +514,22 @@ static int GetQueryResult(MessageParcel &reply, std::vector &result int ret = E_IPCS; if (!reply.ReadInt32(ret)) { HILOG_ERROR("fail to ReadInt32 ret"); - FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return E_IPCS; } if (ret != ERR_OK) { HILOG_ERROR("Query operation failed ret : %{public}d", ret); - FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return ret; } - uint64_t count = 0; - if (!reply.ReadUint64(count)) { + int64_t count = 0; + if (!reply.ReadInt64(count)) { HILOG_ERROR("Query operation failed to Read count"); - FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return E_IPCS; } results.clear(); - for (uint64_t i = 0; i < count; i++) { + for (int64_t i = 0; i < count; i++) { results.push_back(reply.ReadString()); } return ERR_OK; diff --git a/interfaces/inner_api/file_access/src/file_access_ext_stub.cpp b/interfaces/inner_api/file_access/src/file_access_ext_stub.cpp index 567814d0..99eda3e6 100644 --- a/interfaces/inner_api/file_access/src/file_access_ext_stub.cpp +++ b/interfaces/inner_api/file_access/src/file_access_ext_stub.cpp @@ -465,19 +465,19 @@ ErrCode FileAccessExtStub::CmdQuery(MessageParcel &data, MessageParcel &reply) StartTrace(HITRACE_TAG_FILEMANAGEMENT, "CmdQuery"); std::shared_ptr uri(data.ReadParcelable()); if (uri == nullptr) { - HILOG_ERROR("Parameter Move fail to ReadParcelable uri"); + HILOG_ERROR("Parameter Query fail to ReadParcelable uri"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return E_URIS; } - uint64_t count = 0; - if (!data.ReadUint64(count)) { + int64_t count = 0; + if (!data.ReadInt64(count)) { HILOG_ERROR("Query operation failed to Read count"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return E_IPCS; } std::vector columns; - for (uint64_t i = 0; i < count; i++) { + for (int64_t i = 0; i < count; i++) { columns.push_back(data.ReadString()); } std::vector results; diff --git a/interfaces/inner_api/file_access/src/file_access_helper.cpp b/interfaces/inner_api/file_access/src/file_access_helper.cpp index f20de055..903cd390 100644 --- a/interfaces/inner_api/file_access/src/file_access_helper.cpp +++ b/interfaces/inner_api/file_access/src/file_access_helper.cpp @@ -697,42 +697,100 @@ int FileAccessHelper::ScanFile(const FileInfo &fileInfo, const int64_t offset, c return ERR_OK; } -int FileAccessHelper::Query (Uri &uri, std::string &metaJson) +static int GetQueryColumns(std::string &uri, std::string &metaJson, std::vector &columns) { - StartTrace(HITRACE_TAG_FILEMANAGEMENT, "Query"); - if (!IsSystemApp()) { - HILOG_ERROR("FileAccessHelper::Query check IsSystemAppByFullTokenID failed"); - return E_PERMISSION_SYS; - } - - if (!CheckUri(uri)) { - HILOG_ERROR("Uri format check error."); - FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return E_URIS; - } - if (!json::accept(metaJson)) { HILOG_ERROR("metaJson format check error."); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return E_GETRESULT; + return EINVAL; } auto jsonObject = json::parse(metaJson); - auto columns = std::make_shared>(); + std::string column; for (json::iterator it = jsonObject.begin(); it != jsonObject.end(); ++it) { auto iterator = MEDIA_RESULT_TYPE.find(it.key()); if (iterator == MEDIA_RESULT_TYPE.end()) { HILOG_ERROR("columns format check error."); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return E_GETRESULT; + return EINVAL; } - columns->push_back(it.key()); + if (!RemoteUri::IsMediaUri(uri)) { + auto iterator = FILE_RESULT_MAP.find(it.key()); + if (iterator != FILE_RESULT_MAP.end()) { + column = iterator->second; + } + } + column = it.key(); + columns.push_back(column); } - if (columns->empty()) { + if (columns.empty()) { HILOG_ERROR("columns is empty."); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return E_GETRESULT; + return EINVAL; + } + return ERR_OK; +} + +static int GetQueryResult(std::string &uri, std::vector &columns, std::vector &results, std::string &metaJson) +{ + json jsonObject; + if (RemoteUri::IsMediaUri(uri)) { + for (size_t i = 0; i < columns.size(); i++) { + auto memberType = MEDIA_RESULT_TYPE.at(columns.at(i)); + switch (memberType) { + case STRING_TYPE: + jsonObject[columns[i]] = results[i]; + break; + case INT32_TYPE: + jsonObject[columns[i]] = std::stoi(results[i]); + break; + case INT64_TYPE: + jsonObject[columns[i]] = std::stol(results[i]); + break; + default: + jsonObject[columns[i]] = ' '; + HILOG_ERROR("not match memberType %{public}d", memberType); + break; + } + } + } else { + for (size_t i = 0; i < columns.size(); i++) { + if (results[i].empty()) { + jsonObject[columns[i]] = " "; + continue; + } + jsonObject[columns[i]] = std::stoi(results[i]); + } + } + metaJson = jsonObject.dump(); + + return ERR_OK; +} + +int FileAccessHelper::Query (Uri &uri, std::string &metaJson) +{ + StartTrace(HITRACE_TAG_FILEMANAGEMENT, "Query"); + if (!IsSystemApp()) { + HILOG_ERROR("FileAccessHelper::Query check IsSystemAppByFullTokenID failed"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return E_PERMISSION_SYS; + } + + if (!CheckUri(uri)) { + HILOG_ERROR("Uri format check error."); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return E_URIS; + } + + std::string uriString(uri.ToString()); + std::vector columns; + std::vector results; + int ret = GetQueryColumns(uriString, metaJson, columns); + if (ret != ERR_OK) { + HILOG_ERROR("Query get columns error, code:%{public}d", ret); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ret; } sptr fileExtProxy = GetProxyByUri(uri); @@ -742,40 +800,20 @@ int FileAccessHelper::Query (Uri &uri, std::string &metaJson) return E_IPCS; } - std::string uriString(uri.ToString()); - if (!RemoteUri::IsMediaUri(uriString)) { - HILOG_ERROR("sourceFile format check error."); - FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return E_URIS; - } - auto results = std::make_shared>(); - int ret = fileExtProxy->Query(uri, *columns, *results); + ret = fileExtProxy->Query(uri, columns, results); if (ret != ERR_OK) { HILOG_ERROR("Query get result error, code:%{public}d", ret); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return ret; } - for (int i = 0; i < int(columns->size()); i++) { - auto memberType = MEDIA_RESULT_TYPE.at(columns->at(i)); - switch (memberType) { - case STRING_TYPE: - jsonObject[(*columns)[i]] = (*results)[i]; - break; - case INT32_TYPE: - jsonObject[(*columns)[i]] = std::stoi((*results)[i]); - break; - case INT64_TYPE: - jsonObject[(*columns)[i]] = std::stol((*results)[i]); - break; - default: - jsonObject[(*columns)[i]] = ' '; - HILOG_INFO("not match memberType %{public}d", memberType); - break; - } + ret = GetQueryResult(uriString, columns, results, metaJson); + if (ret != ERR_OK) { + HILOG_ERROR("Query get result error, code:%{public}d", ret); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ret; } - metaJson = jsonObject.dump(); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return ERR_OK; } diff --git a/interfaces/inner_api/file_access/src/js_file_access_ext_ability.cpp b/interfaces/inner_api/file_access/src/js_file_access_ext_ability.cpp index 293ec8f8..3df384c6 100644 --- a/interfaces/inner_api/file_access/src/js_file_access_ext_ability.cpp +++ b/interfaces/inner_api/file_access/src/js_file_access_ext_ability.cpp @@ -1081,26 +1081,32 @@ static bool ParserQueryFileJsResult(NativeEngine &engine, NativeValue *nativeVal } bool ret = ConvertFromJsValue(engine, obj->GetProperty("code"), results.code); + if (!ret) { + HILOG_ERROR("Convert js value fail."); + return ret; + } + NativeArray *nativeArray = ConvertNativeValueTo(obj->GetProperty("results")); if (nativeArray == nullptr) { HILOG_ERROR("Convert js array object fail."); return false; } + for (uint32_t i = 0; i < nativeArray->GetLength(); i++) { - - NativeValue *result = nativeArray->GetElement(i); - if (result == nullptr) { - HILOG_ERROR("get native FileInfo fail."); - return false; - } + NativeValue *queryResult = nativeArray->GetElement(i); + if (queryResult == nullptr) { + HILOG_ERROR("get native queryResult fail."); + return false; + } std::string tempValue; - ret = ret && ConvertFromJsValue(engine, result, tempValue); + ret = ConvertFromJsValue(engine, queryResult, tempValue); if (!ret) { HILOG_ERROR("Convert js value fail."); + return ret; } - results.data.emplace_back(tempValue); + results.data.emplace_back(std::move(tempValue)); } - return ret; + return true; } int JsFileAccessExtAbility::Query(const Uri &uri, std::vector &columns, std::vector &results) @@ -1114,8 +1120,6 @@ int JsFileAccessExtAbility::Query(const Uri &uri, std::vector &colu } auto argParser = [uri, &columns](NativeEngine &engine, NativeValue *argv[], size_t &argc) -> bool { - HILOG_ERROR("enter argParser Query uri = %{public}s column = %{public}s", uri.ToString().c_str(), - columns.at(0).c_str()); NativeValue *nativeUri = engine.CreateString(uri.ToString().c_str(), uri.ToString().length()); if (nativeUri == nullptr) { HILOG_ERROR("create uri native js value fail."); @@ -1126,10 +1130,9 @@ int JsFileAccessExtAbility::Query(const Uri &uri, std::vector &colu HILOG_ERROR("Create MimeType native array value fail."); return E_GETRESULT; } - int errorCode = MakeStringNativeArray(engine, columns, resultArray); if (errorCode != ERR_OK) { - HILOG_ERROR("Create resultArray native array value fail, code:%{public}d.", errorCode); + HILOG_ERROR("Create native array value fail, code:%{public}d.", errorCode); return errorCode; } argv[ARGC_ZERO] = nativeUri; @@ -1138,13 +1141,13 @@ int JsFileAccessExtAbility::Query(const Uri &uri, std::vector &colu return true; }; auto retParser = [value](NativeEngine &engine, NativeValue *result) -> bool { - Value> res; - bool ret = ParserQueryFileJsResult(engine, result, res); + Value> queryResult; + bool ret = ParserQueryFileJsResult(engine, result, queryResult); if (!ret) { HILOG_ERROR("Parser js value fail."); return ret; } - value->data = res.data; + value->data = queryResult.data; return ret; }; @@ -1162,6 +1165,9 @@ int JsFileAccessExtAbility::Query(const Uri &uri, std::vector &colu } results = std::move(value->data); + for (auto res : results) { + HILOG_ERROR("value1 = %{public}s",(res).c_str()); + } FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return ERR_OK; } 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 495994b8..3c29cfdb 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 @@ -546,18 +546,24 @@ export default class FileExtAbility extends Extension { code: E_URIS, }; } - let results = []; + var results = []; + try { let path = this.getPath(uri); let stat = fileio.statSync(path); - for (let column in columns) { - results.push(stat[column]); + + for (let index in columns) { + if (columns[index] in stat) { + results.push(String(stat[columns[index]])); + } else { + results.push(""); + } } } catch(e) { hilog.error(DOMAIN_CODE, TAG, 'query error ' + e.message); return { results: [], - code: E_GETRESULT, + code: e.code, }; } return { diff --git a/test/unittest/medialibrary_file_access_test.cpp b/test/unittest/medialibrary_file_access_test.cpp index 8ca642d1..c3da3c24 100644 --- a/test/unittest/medialibrary_file_access_test.cpp +++ b/test/unittest/medialibrary_file_access_test.cpp @@ -17,6 +17,7 @@ #include #include +#include #include #include "accesstoken_kit.h" @@ -31,6 +32,7 @@ namespace { using namespace std; using namespace OHOS; using namespace FileAccessFwk; +using json = nlohmann::json; const int ABILITY_ID = 5003; const int INIT_THREADS_NUMBER = 4; const int ACTUAL_SUCCESS_THREADS_NUMBER = 1; @@ -2148,37 +2150,221 @@ HWTEST_F(FileAccessHelperTest, medialibrary_file_access_GetRoots_0000, testing:: * @tc.size: MEDIUM * @tc.type: FUNC * @tc.level Level 1 - * @tc.require: SR000H0386 + * @tc.require: I69J1R */ HWTEST_F(FileAccessHelperTest, medialibrary_file_access_Query_0000, testing::ext::TestSize.Level1) { GTEST_LOG_(INFO) << "FileAccessHelperTest-begin medialibrary_file_access_Query_0000"; try { - Uri trueUri("datashare:///media/file/Documents/5"); - Uri targetUri(""); + Uri newDirUriTest(""); std::string fileName = "test.txt"; - int result = g_fah->CreateFile(trueUri, fileName, targetUri); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - const std::string MEDIA_DATA_DB_RELATIVE_PATH = "relative_path"; - const std::string MEDIA_DATA_DB_NAME = "display_name"; - const std::string MEDIA_DATA_DB_ID = "file_id"; - std::vector columns; - std::vector results; + std::string relativePath = "Download/Query/"; + int ret = g_fah->Mkdir(g_newDirUri, "Query", newDirUriTest); + EXPECT_EQ(ret, OHOS::FileAccessFwk::ERR_OK); + Uri testUri(""); + ret = g_fah->CreateFile(newDirUriTest, fileName, testUri); + EXPECT_EQ(ret, OHOS::FileAccessFwk::ERR_OK); - columns.push_back(MEDIA_DATA_DB_ID); - columns.push_back(MEDIA_DATA_DB_RELATIVE_PATH); - columns.push_back(MEDIA_DATA_DB_NAME); - result = g_fah->Query(targetUri, columns, results); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - EXPECT_EQ(results.at(2), fileName); - result = g_fah->Delete(targetUri); - EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); + json testJson = { + {"relative_path", " "}, + {"display_name", " "} + }; + auto testJsonString = testJson.dump(); + ret = g_fah->Query(testUri, testJsonString); + EXPECT_EQ(ret, OHOS::FileAccessFwk::ERR_OK); + GTEST_LOG_(ERROR) << testJsonString; + auto jsonObject = json::parse(testJsonString); + + EXPECT_EQ(jsonObject.at("relative_path"), relativePath); + EXPECT_EQ(jsonObject.at("display_name"), fileName); + ret = g_fah->Delete(newDirUriTest); + EXPECT_EQ(ret, OHOS::FileAccessFwk::ERR_OK); } catch (...) { GTEST_LOG_(ERROR) << "medialibrary_file_access_Query_0000 occurs an exception."; } GTEST_LOG_(INFO) << "FileAccessHelperTest-end medialibrary_file_access_Query_0000"; } +/** + * @tc.number: user_file_service_medialibrary_file_access_Query_0001 + * @tc.name: medialibrary_file_access_Query_0001 + * @tc.desc: Test function of Query interface for ERROR which Uri is null. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I69J1R + */ +HWTEST_F(FileAccessHelperTest, medialibrary_file_access_Query_0001, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "FileAccessHelperTest-begin medialibrary_file_access_Query_0001"; + try { + Uri testUri(""); + json testJson = { + {"relative_path", " "}, + {"display_name", " "} + }; + auto testJsonString = testJson.dump(); + int ret = g_fah->Query(testUri, testJsonString); + EXPECT_NE(ret, OHOS::FileAccessFwk::ERR_OK); + } catch (...) { + GTEST_LOG_(ERROR) << "medialibrary_file_access_Query_0001 occurs an exception."; + } + GTEST_LOG_(INFO) << "FileAccessHelperTest-end medialibrary_file_access_Query_0001"; +} + +/** + * @tc.number: user_file_service_medialibrary_file_access_Query_0002 + * @tc.name: medialibrary_file_access_Query_0002 + * @tc.desc: Test function of Query interface for ERROR which Uri is not a media path. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I69J1R + */ +HWTEST_F(FileAccessHelperTest, medialibrary_file_access_Query_0002, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "FileAccessHelperTest-begin medialibrary_file_access_Query_0002"; + try { + Uri testUri("file:///media/image/7"); + json testJson = { + {"relative_path", " "}, + {"display_name", " "} + }; + auto testJsonString = testJson.dump(); + int ret = g_fah->Query(testUri, testJsonString); + EXPECT_NE(ret, OHOS::FileAccessFwk::ERR_OK); + } catch (...) { + GTEST_LOG_(ERROR) << "medialibrary_file_access_Query_0002 occurs an exception."; + } + GTEST_LOG_(INFO) << "FileAccessHelperTest-end medialibrary_file_access_Query_0002"; +} + +/** + * @tc.number: user_file_service_medialibrary_file_access_Query_0003 + * @tc.name: medialibrary_file_access_Query_0003 + * @tc.desc: Test function of Query interface for ERROR which Uri is unreadable code. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I69J1R + */ +HWTEST_F(FileAccessHelperTest, medialibrary_file_access_Query_0003, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "FileAccessHelperTest-begin medialibrary_file_access_Query_0003"; + try { + Uri testUri("&*()*/?"); + json testJson = { + {"relative_path", " "}, + {"display_name", " "} + }; + auto testJsonString = testJson.dump(); + int ret = g_fah->Query(testUri, testJsonString); + EXPECT_NE(ret, OHOS::FileAccessFwk::ERR_OK); + } catch (...) { + GTEST_LOG_(ERROR) << "medialibrary_file_access_Query_0003 occurs an exception."; + } + GTEST_LOG_(INFO) << "FileAccessHelperTest-end medialibrary_file_access_Query_0003"; +} + +/** + * @tc.number: user_file_service_medialibrary_file_access_Query_0004 + * @tc.name: medialibrary_file_access_Query_0004 + * @tc.desc: Test function of Query interface for ERROR which Uri is not a local path. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I69J1R + */ +HWTEST_F(FileAccessHelperTest, medialibrary_file_access_Query_0004, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "FileAccessHelperTest-begin medialibrary_file_access_Query_0004"; + try { + Uri testUri("//file/test.txt"); + json testJson = { + {"relative_path", " "}, + {"display_name", " "} + }; + auto testJsonString = testJson.dump(); + int ret = g_fah->Query(testUri, testJsonString); + EXPECT_NE(ret, OHOS::FileAccessFwk::ERR_OK); + } catch (...) { + GTEST_LOG_(ERROR) << "medialibrary_file_access_Query_0004 occurs an exception."; + } + GTEST_LOG_(INFO) << "FileAccessHelperTest-end medialibrary_file_access_Query_0004"; +} + +/** + * @tc.number: user_file_service_medialibrary_file_access_Query_0005 + * @tc.name: medialibrary_file_access_Query_0005 + * @tc.desc: Test function of Query interface for which column nonexistence. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I69J1R + */ +HWTEST_F(FileAccessHelperTest, medialibrary_file_access_Query_0005, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "FileAccessHelperTest-begin medialibrary_file_access_Query_0005"; + try { + Uri newDirUriTest(""); + std::string fileName = "test.txt"; + std::string relativePath = "test/test.txt"; + const std::string MEDIA_DATA_DB_RELATIVE_PATH = "relative_path"; + const std::string MEDIA_DATA_DB_NAME = "display_name"; + int ret = g_fah->Mkdir(g_newDirUri, "Query005", newDirUriTest); + EXPECT_EQ(ret, OHOS::FileAccessFwk::ERR_OK); + Uri testUri(""); + ret = g_fah->CreateFile(newDirUriTest, fileName, testUri); + EXPECT_EQ(ret, OHOS::FileAccessFwk::ERR_OK); + json testJson = { + {"relative_path", " "}, + {"display_name", " "}, + {"test", " "} + }; + auto testJsonString = testJson.dump(); + ret = g_fah->Query(testUri, testJsonString); + EXPECT_NE(ret, OHOS::FileAccessFwk::ERR_OK); + ret = g_fah->Delete(newDirUriTest); + EXPECT_EQ(ret, OHOS::FileAccessFwk::ERR_OK); + } catch (...) { + GTEST_LOG_(ERROR) << "medialibrary_file_access_Query_0005 occurs an exception."; + } + GTEST_LOG_(INFO) << "FileAccessHelperTest-end medialibrary_file_access_Query_0005"; +} + +/** + * @tc.number: user_file_service_medialibrary_file_access_Query_0006 + * @tc.name: medialibrary_file_access_Query_0006 + * @tc.desc: Test function of Query interface for which column is null. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I69J1R + */ +HWTEST_F(FileAccessHelperTest, medialibrary_file_access_Query_0006, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "FileAccessHelperTest-begin medialibrary_file_access_Query_0006"; + try { + Uri newDirUriTest(""); + std::string fileName = "test.txt"; + std::string relativePath = "test/test.txt"; + int ret = g_fah->Mkdir(g_newDirUri, "Query006", newDirUriTest); + EXPECT_EQ(ret, OHOS::FileAccessFwk::ERR_OK); + Uri testUri(""); + ret = g_fah->CreateFile(newDirUriTest, fileName, testUri); + EXPECT_EQ(ret, OHOS::FileAccessFwk::ERR_OK); + json testJson; + auto testJsonString = testJson.dump(); + ret = g_fah->Query(testUri, testJsonString); + EXPECT_NE(ret, OHOS::FileAccessFwk::ERR_OK); + ret = g_fah->Delete(newDirUriTest); + EXPECT_EQ(ret, OHOS::FileAccessFwk::ERR_OK); + } catch (...) { + GTEST_LOG_(ERROR) << "medialibrary_file_access_Query_0006 occurs an exception."; + } + GTEST_LOG_(INFO) << "FileAccessHelperTest-end medialibrary_file_access_Query_0006"; +} + /** * @tc.number: user_file_service_medialibrary_file_access_GetFileInfoFromUri_0000 * @tc.name: medialibrary_file_access_GetFileInfoFromUri_0000 -- Gitee From 64ae59502ee11bb8092310d4fb4ec97b05f3645b Mon Sep 17 00:00:00 2001 From: caochuan Date: Mon, 27 Mar 2023 15:16:08 +0800 Subject: [PATCH 4/6] feat: add get Dir's size Signed-off-by: caochuan --- .../napi/common/file_extension_info_napi.cpp | 19 ++++++++ .../js/napi/common/file_extension_info_napi.h | 1 + .../napi_fileaccess_helper.cpp | 29 ++--------- .../napi_fileaccess_helper.h | 1 - interfaces/inner_api/file_access/BUILD.gn | 4 -- .../include/file_access_extension_info.h | 47 ++++++++---------- .../file_access/include/file_access_helper.h | 9 ---- .../file_access/src/file_access_helper.cpp | 33 ++++--------- .../src/js_file_access_ext_ability.cpp | 13 ++--- .../FileExtensionAbility.ts | 48 ++++++++++++++++--- 10 files changed, 97 insertions(+), 107 deletions(-) diff --git a/frameworks/js/napi/common/file_extension_info_napi.cpp b/frameworks/js/napi/common/file_extension_info_napi.cpp index 86931c7f..ab16243b 100644 --- a/frameworks/js/napi/common/file_extension_info_napi.cpp +++ b/frameworks/js/napi/common/file_extension_info_napi.cpp @@ -170,5 +170,24 @@ void InitRootInfo(napi_env env, napi_value exports) sizeof(desc) / sizeof(*desc), desc, &obj); napi_set_named_property(env, exports, className, obj); } + +void InitQueryFlags(napi_env env, napi_value exports) +{ + char propertyName[] = "FileKey"; + napi_property_descriptor desc[] = { + DECLARE_NAPI_STATIC_PROPERTY("DISPLAY_NAME", NVal::CreateUTF8String(env, DISPLAY_NAME).val_), + DECLARE_NAPI_STATIC_PROPERTY("DATE_ADDED", NVal::CreateUTF8String(env, DATE_ADDED).val_), + DECLARE_NAPI_STATIC_PROPERTY("DATE_MODIFIED", NVal::CreateUTF8String(env, DATE_MODIFIED).val_), + DECLARE_NAPI_STATIC_PROPERTY("RELATIVE_PATH", NVal::CreateUTF8String(env, RELATIVE_PATH).val_), + DECLARE_NAPI_STATIC_PROPERTY("FILE_SIZE", NVal::CreateUTF8String(env, FILE_SIZE).val_), + DECLARE_NAPI_STATIC_PROPERTY("WIDTH", NVal::CreateUTF8String(env, WIDTH).val_), + DECLARE_NAPI_STATIC_PROPERTY("HEIGHT", NVal::CreateUTF8String(env, HEIGHT).val_), + DECLARE_NAPI_STATIC_PROPERTY("DURATION", NVal::CreateUTF8String(env, DURATION).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); +} } // namespace FileAccessFwk } // namespace OHOS \ No newline at end of file diff --git a/frameworks/js/napi/common/file_extension_info_napi.h b/frameworks/js/napi/common/file_extension_info_napi.h index 3bf190e5..0d552980 100644 --- a/frameworks/js/napi/common/file_extension_info_napi.h +++ b/frameworks/js/napi/common/file_extension_info_napi.h @@ -26,6 +26,7 @@ void InitNotifyType(napi_env env, napi_value exports); void InitDeviceType(napi_env env, napi_value exports); void InitFileInfo(napi_env env, napi_value exports); void InitRootInfo(napi_env env, napi_value exports); +void InitQueryFlags(napi_env env, napi_value exports); } // namespace FileAccessFwk } // namespace OHOS #endif // FILE_EXTENSION_INFO_NAPI_H \ No newline at end of file diff --git a/frameworks/js/napi/file_access_module/napi_fileaccess_helper.cpp b/frameworks/js/napi/file_access_module/napi_fileaccess_helper.cpp index e0cab354..71eb5c3e 100644 --- a/frameworks/js/napi/file_access_module/napi_fileaccess_helper.cpp +++ b/frameworks/js/napi/file_access_module/napi_fileaccess_helper.cpp @@ -18,7 +18,6 @@ #include #include #include -#include #include "file_access_extension_info.h" #include "file_access_framework_errno.h" @@ -47,7 +46,6 @@ namespace { const std::string FILEACCESS_CLASS_NAME = "FileAccessHelper"; static napi_ref g_constructorRef = nullptr; constexpr uint32_t INITIAL_REFCOUNT = 1; - using json = nlohmann::json; } std::list> g_fileAccessHelperList; @@ -279,25 +277,6 @@ void InitOpenFlags(napi_env env, napi_value exports) napi_set_named_property(env, exports, propertyName, obj); } -void InitQueryFlags(napi_env env, napi_value exports) -{ - char propertyName[] = "FileKey"; - napi_property_descriptor desc[] = { - DECLARE_NAPI_STATIC_PROPERTY("DISPLAY_NAME", NVal::CreateUTF8String(env, DISPLAY_NAME).val_), - DECLARE_NAPI_STATIC_PROPERTY("DATE_ADDED", NVal::CreateUTF8String(env, DATE_ADDED).val_), - DECLARE_NAPI_STATIC_PROPERTY("DATE_MODIFIED", NVal::CreateUTF8String(env, DATE_MODIFIED).val_), - DECLARE_NAPI_STATIC_PROPERTY("RELATIVE_PATH", NVal::CreateUTF8String(env, RELATIVE_PATH).val_), - DECLARE_NAPI_STATIC_PROPERTY("FILE_SIZE", NVal::CreateUTF8String(env, FILE_SIZE).val_), - DECLARE_NAPI_STATIC_PROPERTY("WIDTH", NVal::CreateUTF8String(env, WIDTH).val_), - DECLARE_NAPI_STATIC_PROPERTY("HEIGHT", NVal::CreateUTF8String(env, HEIGHT).val_), - DECLARE_NAPI_STATIC_PROPERTY("DURATION", NVal::CreateUTF8String(env, DURATION).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) { @@ -644,15 +623,14 @@ napi_value NAPI_Query(napi_env env, napi_callback_info info) return nullptr; } - std::string uriString(uri.get()); - std::string metaJsonString(metaJson.get()); - auto metaJsonPtr = std::make_shared(metaJsonString); FileAccessHelper *fileAccessHelper = GetFileAccessHelper(env, funcArg.GetThisVar()); if (fileAccessHelper == nullptr) { return nullptr; } - + std::string uriString(uri.get()); + std::string metaJsonString(metaJson.get()); + auto metaJsonPtr = std::make_shared(metaJsonString); auto cbExec = [uriString, metaJsonPtr, fileAccessHelper]() -> NError { OHOS::Uri uri(uriString); int ret = fileAccessHelper->Query(uri, *metaJsonPtr); @@ -663,7 +641,6 @@ napi_value NAPI_Query(napi_env env, napi_callback_info info) if (err) { return { env, err.GetNapiErr(env) }; } - return { NVal::CreateUTF8String(env, *metaJsonPtr) }; }; diff --git a/frameworks/js/napi/file_access_module/napi_fileaccess_helper.h b/frameworks/js/napi/file_access_module/napi_fileaccess_helper.h index 4bb22033..5fd5a444 100644 --- a/frameworks/js/napi/file_access_module/napi_fileaccess_helper.h +++ b/frameworks/js/napi/file_access_module/napi_fileaccess_helper.h @@ -39,7 +39,6 @@ namespace FileAccessFwk { 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); - void InitQueryFlags(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/inner_api/file_access/BUILD.gn b/interfaces/inner_api/file_access/BUILD.gn index 45816cc9..2a98fc34 100644 --- a/interfaces/inner_api/file_access/BUILD.gn +++ b/interfaces/inner_api/file_access/BUILD.gn @@ -15,7 +15,6 @@ import("//build/ohos.gni") import("//foundation/filemanagement/user_file_service/filemanagement_aafwk.gni") BASE_DIR = "//foundation/filemanagement/user_file_service" -MEDIA_DIR = "//foundation/multimedia/media_library" config("ability_config") { visibility = [ ":*" ] @@ -56,9 +55,6 @@ ohos_shared_library("file_access_extension_ability_kit") { include_dirs = [ "${ability_runtime_path}/interfaces/kits/native/appkit/ability_runtime/context", "//foundation/communication/ipc/ipc/native/src/napi/include", - "${MEDIA_DIR}/frameworks/services/media_file_extension/include", - "${MEDIA_DIR}/frameworks/utils/include", - "${MEDIA_DIR}/interfaces/inner_api/media_library_helper/include", ] sources = [ diff --git a/interfaces/inner_api/file_access/include/file_access_extension_info.h b/interfaces/inner_api/file_access/include/file_access_extension_info.h index ca4d1649..12a055a2 100644 --- a/interfaces/inner_api/file_access/include/file_access_extension_info.h +++ b/interfaces/inner_api/file_access/include/file_access_extension_info.h @@ -25,19 +25,17 @@ namespace OHOS { namespace FileAccessFwk { -namespace { - const std::string MEDIA_DATA_DB_NAME = "display_name"; - const std::string MEDIA_DATA_DB_RELATIVE_PATH = "relative_path"; - const std::string MEDIA_DATA_DB_SIZE = "size"; - const std::string MEDIA_DATA_DB_DATE_MODIFIED = "date_modified"; - const std::string MEDIA_DATA_DB_DATE_ADDED = "date_added"; - const std::string MEDIA_DATA_DB_HEIGHT = "height"; - const std::string MEDIA_DATA_DB_WIDTH = "width"; - const std::string MEDIA_DATA_DB_DURATION = "duration"; - - const std::string FILE_DATA_ATIME = "atime"; - const std::string FILE_DATA_MTIME = "mtime"; -} +//Properties of the Common file +const std::string DISPLAY_NAME = "display_name"; +const std::string RELATIVE_PATH = "relative_path"; +const std::string FILE_SIZE = "size"; +const std::string DATE_MODIFIED = "date_modified"; +const std::string DATE_ADDED = "date_added"; +//Properties of the picture file +const std::string HEIGHT = "height"; +const std::string WIDTH = "width"; +//Properties of an image or audio file +const std::string DURATION = "duration"; /** * Indicates the type of the device. */ @@ -190,20 +188,15 @@ enum ResultType { INT64_TYPE, }; -static const std::unordered_map MEDIA_RESULT_TYPE = { - { MEDIA_DATA_DB_NAME, STRING_TYPE }, - { MEDIA_DATA_DB_RELATIVE_PATH, STRING_TYPE }, - { MEDIA_DATA_DB_SIZE, INT64_TYPE }, - { MEDIA_DATA_DB_DATE_ADDED, INT64_TYPE }, - { MEDIA_DATA_DB_DATE_MODIFIED, INT64_TYPE }, - { MEDIA_DATA_DB_WIDTH, INT32_TYPE }, - { MEDIA_DATA_DB_HEIGHT, INT32_TYPE }, - { MEDIA_DATA_DB_DURATION, INT32_TYPE }, -}; - -static const std::unordered_map FILE_RESULT_MAP = { - { MEDIA_DATA_DB_DATE_ADDED, FILE_DATA_ATIME }, - { MEDIA_DATA_DB_DATE_MODIFIED, FILE_DATA_MTIME }, +static const std::unordered_map FILE_RESULT_TYPE = { + { DISPLAY_NAME, STRING_TYPE }, + { RELATIVE_PATH, STRING_TYPE }, + { FILE_SIZE, INT64_TYPE }, + { DATE_ADDED, INT64_TYPE }, + { DATE_MODIFIED, INT64_TYPE }, + { WIDTH, INT32_TYPE }, + { HEIGHT, INT32_TYPE }, + { DURATION, INT32_TYPE }, }; struct ThumbnailSize : public virtual OHOS::Parcelable { diff --git a/interfaces/inner_api/file_access/include/file_access_helper.h b/interfaces/inner_api/file_access/include/file_access_helper.h index d4b7e1f5..542c5431 100644 --- a/interfaces/inner_api/file_access/include/file_access_helper.h +++ b/interfaces/inner_api/file_access/include/file_access_helper.h @@ -49,15 +49,6 @@ namespace { static const int32_t READ = 0; static const int32_t WRITE = 1; static const int32_t WRITE_READ = 2; - static const std::string DISPLAY_NAME = "display_name"; - static const std::string DATE_ADDED = "date_added"; - static const std::string DATE_MODIFIED = "date_modified"; - static const std::string RELATIVE_PATH = "relative_path"; - static const std::string FILE_SIZE = "size"; - static const std::string WIDTH = "width"; - static const std::string HEIGHT = "height"; - static const std::string DURATION = "duration"; - using json = nlohmann::json; } struct ConnectInfo { diff --git a/interfaces/inner_api/file_access/src/file_access_helper.cpp b/interfaces/inner_api/file_access/src/file_access_helper.cpp index 47f2b7cb..6d33970e 100644 --- a/interfaces/inner_api/file_access/src/file_access_helper.cpp +++ b/interfaces/inner_api/file_access/src/file_access_helper.cpp @@ -35,6 +35,7 @@ using namespace OHOS::DistributedFS::ModuleRemoteUri; namespace OHOS { namespace FileAccessFwk { using namespace Media; +using json = nlohmann::json; std::vector FileAccessHelper::wants_; static int GetUserId() @@ -747,22 +748,14 @@ static int GetQueryColumns(std::string &uri, std::string &metaJson, std::vector< } auto jsonObject = json::parse(metaJson); - std::string column; for (json::iterator it = jsonObject.begin(); it != jsonObject.end(); ++it) { - auto iterator = MEDIA_RESULT_TYPE.find(it.key()); - if (iterator == MEDIA_RESULT_TYPE.end()) { + auto iterator = FILE_RESULT_TYPE.find(it.key()); + if (iterator == FILE_RESULT_TYPE.end()) { HILOG_ERROR("columns format check error."); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return EINVAL; } - if (!RemoteUri::IsMediaUri(uri)) { - auto iterator = FILE_RESULT_MAP.find(it.key()); - if (iterator != FILE_RESULT_MAP.end()) { - column = iterator->second; - } - } - column = it.key(); - columns.push_back(column); + columns.push_back(it.key()); } if (columns.empty()) { @@ -776,10 +769,9 @@ static int GetQueryColumns(std::string &uri, std::string &metaJson, std::vector< static int GetQueryResult(std::string &uri, std::vector &columns, std::vector &results, std::string &metaJson) { json jsonObject; - if (RemoteUri::IsMediaUri(uri)) { - for (size_t i = 0; i < columns.size(); i++) { - auto memberType = MEDIA_RESULT_TYPE.at(columns.at(i)); - switch (memberType) { + for (size_t i = 0; i < columns.size(); i++) { + auto memberType = FILE_RESULT_TYPE.at(columns.at(i)); + switch (memberType) { case STRING_TYPE: jsonObject[columns[i]] = results[i]; break; @@ -793,15 +785,6 @@ static int GetQueryResult(std::string &uri, std::vector &columns, s jsonObject[columns[i]] = ' '; HILOG_ERROR("not match memberType %{public}d", memberType); break; - } - } - } else { - for (size_t i = 0; i < columns.size(); i++) { - if (results[i].empty()) { - jsonObject[columns[i]] = " "; - continue; - } - jsonObject[columns[i]] = std::stoi(results[i]); } } metaJson = jsonObject.dump(); @@ -809,7 +792,7 @@ static int GetQueryResult(std::string &uri, std::vector &columns, s return ERR_OK; } -int FileAccessHelper::Query (Uri &uri, std::string &metaJson) +int FileAccessHelper::Query(Uri &uri, std::string &metaJson) { StartTrace(HITRACE_TAG_FILEMANAGEMENT, "Query"); if (!IsSystemApp()) { diff --git a/interfaces/inner_api/file_access/src/js_file_access_ext_ability.cpp b/interfaces/inner_api/file_access/src/js_file_access_ext_ability.cpp index 3df384c6..9344ecaa 100644 --- a/interfaces/inner_api/file_access/src/js_file_access_ext_ability.cpp +++ b/interfaces/inner_api/file_access/src/js_file_access_ext_ability.cpp @@ -1082,9 +1082,9 @@ static bool ParserQueryFileJsResult(NativeEngine &engine, NativeValue *nativeVal bool ret = ConvertFromJsValue(engine, obj->GetProperty("code"), results.code); if (!ret) { - HILOG_ERROR("Convert js value fail."); - return ret; - } + HILOG_ERROR("Convert js value fail."); + return ret; + } NativeArray *nativeArray = ConvertNativeValueTo(obj->GetProperty("results")); if (nativeArray == nullptr) { @@ -1095,8 +1095,8 @@ static bool ParserQueryFileJsResult(NativeEngine &engine, NativeValue *nativeVal for (uint32_t i = 0; i < nativeArray->GetLength(); i++) { NativeValue *queryResult = nativeArray->GetElement(i); if (queryResult == nullptr) { - HILOG_ERROR("get native queryResult fail."); - return false; + HILOG_ERROR("get native queryResult fail."); + return false; } std::string tempValue; ret = ConvertFromJsValue(engine, queryResult, tempValue); @@ -1165,9 +1165,6 @@ int JsFileAccessExtAbility::Query(const Uri &uri, std::vector &colu } results = std::move(value->data); - for (auto res : results) { - HILOG_ERROR("value1 = %{public}s",(res).c_str()); - } FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return ERR_OK; } 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 3c29cfdb..8f160c95 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 @@ -36,6 +36,10 @@ const ERR_ERROR = -1; const E_EXIST = 13900015; const E_URIS = 14300002; const E_GETRESULT = 14300004; +const DATA_DB_DATE_ADDED = "date_added"; +const DATA_DB_DATE_MODIFIED = "date_modified"; +const FILE_DATA_ATIME = "atime"; +const FILE_DATA_MTIME = "mtime"; let callbackFun = null; export default class FileExtAbility extends Extension { @@ -549,17 +553,47 @@ export default class FileExtAbility extends Extension { var results = []; try { - let path = this.getPath(uri); - let stat = fileio.statSync(path); - + let dirPath = this.getPath(uri); + let stat = fileio.statSync(dirPath); + let convertColumn = new Map([ + [DATA_DB_DATE_ADDED, FILE_DATA_ATIME], + [DATA_DB_DATE_MODIFIED, FILE_DATA_MTIME] + ]); for (let index in columns) { - if (columns[index] in stat) { - results.push(String(stat[columns[index]])); + let column = columns[index]; + convertColumn.forEach((value, key) =>{ + if (column === key) { + column = value; + } + }); + if (column == "relative_path") { + let index = dirPath.lastIndexOf("/"); + let target = dirPath.substring(0,index+1); + results.push(target); + continue; + } + if (column in stat) { + if (column == "size" && stat.isDirectory()) { + let size = 0; + this.recurseDir(dirPath, function (filePath, isDirectory, hasNextFile) { + if (isDirectory && !hasNextFile) { + return; + } + + if (!isDirectory) { + let stat = fileio.statSync(filePath); + size += stat.size; + } + }); + results.push(String(size)); + continue; + } + results.push(String(stat[column])); } else { - results.push(""); + results.push("0"); } } - } catch(e) { + } catch (e) { hilog.error(DOMAIN_CODE, TAG, 'query error ' + e.message); return { results: [], -- Gitee From fb272a3e02ef1f25598c11bff8e8b60d8e8cf330 Mon Sep 17 00:00:00 2001 From: caochuan Date: Wed, 29 Mar 2023 08:51:18 +0800 Subject: [PATCH 5/6] delete remote uri Signed-off-by: caochuan --- interfaces/inner_api/file_access/BUILD.gn | 1 - .../file_access/src/file_access_helper.cpp | 2 - .../FileExtensionAbility.ts | 9 + .../medialibrary_file_access_test.cpp | 223 ------------------ 4 files changed, 9 insertions(+), 226 deletions(-) diff --git a/interfaces/inner_api/file_access/BUILD.gn b/interfaces/inner_api/file_access/BUILD.gn index 2a98fc34..01e6a02b 100644 --- a/interfaces/inner_api/file_access/BUILD.gn +++ b/interfaces/inner_api/file_access/BUILD.gn @@ -94,7 +94,6 @@ ohos_shared_library("file_access_extension_ability_kit") { "access_token:libaccesstoken_sdk", "bundle_framework:appexecfwk_core", "c_utils:utils", - "file_api:remote_uri_native", "hitrace_native:hitrace_meter", "hiviewdfx_hilog_native:libhilog", "ipc:ipc_core", diff --git a/interfaces/inner_api/file_access/src/file_access_helper.cpp b/interfaces/inner_api/file_access/src/file_access_helper.cpp index 6d33970e..918f84bc 100644 --- a/interfaces/inner_api/file_access/src/file_access_helper.cpp +++ b/interfaces/inner_api/file_access/src/file_access_helper.cpp @@ -26,12 +26,10 @@ #include "ifile_access_ext_base.h" #include "ipc_skeleton.h" #include "iservice_registry.h" -#include "remote_uri.h" #include "image_source.h" #include "system_ability_definition.h" #include "tokenid_kit.h" -using namespace OHOS::DistributedFS::ModuleRemoteUri; namespace OHOS { namespace FileAccessFwk { using namespace Media; 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 8f160c95..3de44370 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 @@ -566,12 +566,21 @@ export default class FileExtAbility extends Extension { column = value; } }); + + if (column == "display_name") { + let index = dirPath.lastIndexOf("/"); + let target = dirPath.substring(index+1,); + results.push(String(target)); + continue; + } + if (column == "relative_path") { let index = dirPath.lastIndexOf("/"); let target = dirPath.substring(0,index+1); results.push(target); continue; } + if (column in stat) { if (column == "size" && stat.isDirectory()) { let size = 0; diff --git a/test/unittest/medialibrary_file_access_test.cpp b/test/unittest/medialibrary_file_access_test.cpp index 8b56cb14..97bf3a05 100644 --- a/test/unittest/medialibrary_file_access_test.cpp +++ b/test/unittest/medialibrary_file_access_test.cpp @@ -17,7 +17,6 @@ #include #include -#include #include #include "accesstoken_kit.h" @@ -33,7 +32,6 @@ namespace { using namespace std; using namespace OHOS; using namespace FileAccessFwk; -using json = nlohmann::json; using namespace OHOS::Media; const int ABILITY_ID = 5003; const int INIT_THREADS_NUMBER = 4; @@ -2145,227 +2143,6 @@ 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_Query_0000 - * @tc.name: medialibrary_file_access_Query_0000 - * @tc.desc: Test function of Query interface for SUCCESS. - * @tc.size: MEDIUM - * @tc.type: FUNC - * @tc.level Level 1 - * @tc.require: I69J1R - */ -HWTEST_F(FileAccessHelperTest, medialibrary_file_access_Query_0000, testing::ext::TestSize.Level1) -{ - GTEST_LOG_(INFO) << "FileAccessHelperTest-begin medialibrary_file_access_Query_0000"; - try { - Uri newDirUriTest(""); - std::string fileName = "test.txt"; - std::string relativePath = "Download/Query/"; - int ret = g_fah->Mkdir(g_newDirUri, "Query", newDirUriTest); - EXPECT_EQ(ret, OHOS::FileAccessFwk::ERR_OK); - Uri testUri(""); - ret = g_fah->CreateFile(newDirUriTest, fileName, testUri); - EXPECT_EQ(ret, OHOS::FileAccessFwk::ERR_OK); - - json testJson = { - {"relative_path", " "}, - {"display_name", " "} - }; - auto testJsonString = testJson.dump(); - ret = g_fah->Query(testUri, testJsonString); - EXPECT_EQ(ret, OHOS::FileAccessFwk::ERR_OK); - auto jsonObject = json::parse(testJsonString); - - EXPECT_EQ(jsonObject.at("relative_path"), relativePath); - EXPECT_EQ(jsonObject.at("display_name"), fileName); - ret = g_fah->Delete(newDirUriTest); - EXPECT_EQ(ret, OHOS::FileAccessFwk::ERR_OK); - } catch (...) { - GTEST_LOG_(ERROR) << "medialibrary_file_access_Query_0000 occurs an exception."; - } - GTEST_LOG_(INFO) << "FileAccessHelperTest-end medialibrary_file_access_Query_0000"; -} - -/** - * @tc.number: user_file_service_medialibrary_file_access_Query_0001 - * @tc.name: medialibrary_file_access_Query_0001 - * @tc.desc: Test function of Query interface for ERROR which Uri is null. - * @tc.size: MEDIUM - * @tc.type: FUNC - * @tc.level Level 1 - * @tc.require: I69J1R - */ -HWTEST_F(FileAccessHelperTest, medialibrary_file_access_Query_0001, testing::ext::TestSize.Level1) -{ - GTEST_LOG_(INFO) << "FileAccessHelperTest-begin medialibrary_file_access_Query_0001"; - try { - Uri testUri(""); - json testJson = { - {"relative_path", " "}, - {"display_name", " "} - }; - auto testJsonString = testJson.dump(); - int ret = g_fah->Query(testUri, testJsonString); - EXPECT_NE(ret, OHOS::FileAccessFwk::ERR_OK); - } catch (...) { - GTEST_LOG_(ERROR) << "medialibrary_file_access_Query_0001 occurs an exception."; - } - GTEST_LOG_(INFO) << "FileAccessHelperTest-end medialibrary_file_access_Query_0001"; -} - -/** - * @tc.number: user_file_service_medialibrary_file_access_Query_0002 - * @tc.name: medialibrary_file_access_Query_0002 - * @tc.desc: Test function of Query interface for ERROR which Uri is not a media path. - * @tc.size: MEDIUM - * @tc.type: FUNC - * @tc.level Level 1 - * @tc.require: I69J1R - */ -HWTEST_F(FileAccessHelperTest, medialibrary_file_access_Query_0002, testing::ext::TestSize.Level1) -{ - GTEST_LOG_(INFO) << "FileAccessHelperTest-begin medialibrary_file_access_Query_0002"; - try { - Uri testUri("file:///media/image/7"); - json testJson = { - {"relative_path", " "}, - {"display_name", " "} - }; - auto testJsonString = testJson.dump(); - int ret = g_fah->Query(testUri, testJsonString); - EXPECT_NE(ret, OHOS::FileAccessFwk::ERR_OK); - } catch (...) { - GTEST_LOG_(ERROR) << "medialibrary_file_access_Query_0002 occurs an exception."; - } - GTEST_LOG_(INFO) << "FileAccessHelperTest-end medialibrary_file_access_Query_0002"; -} - -/** - * @tc.number: user_file_service_medialibrary_file_access_Query_0003 - * @tc.name: medialibrary_file_access_Query_0003 - * @tc.desc: Test function of Query interface for ERROR which Uri is unreadable code. - * @tc.size: MEDIUM - * @tc.type: FUNC - * @tc.level Level 1 - * @tc.require: I69J1R - */ -HWTEST_F(FileAccessHelperTest, medialibrary_file_access_Query_0003, testing::ext::TestSize.Level1) -{ - GTEST_LOG_(INFO) << "FileAccessHelperTest-begin medialibrary_file_access_Query_0003"; - try { - Uri testUri("&*()*/?"); - json testJson = { - {"relative_path", " "}, - {"display_name", " "} - }; - auto testJsonString = testJson.dump(); - int ret = g_fah->Query(testUri, testJsonString); - EXPECT_NE(ret, OHOS::FileAccessFwk::ERR_OK); - } catch (...) { - GTEST_LOG_(ERROR) << "medialibrary_file_access_Query_0003 occurs an exception."; - } - GTEST_LOG_(INFO) << "FileAccessHelperTest-end medialibrary_file_access_Query_0003"; -} - -/** - * @tc.number: user_file_service_medialibrary_file_access_Query_0004 - * @tc.name: medialibrary_file_access_Query_0004 - * @tc.desc: Test function of Query interface for ERROR which Uri is not a local path. - * @tc.size: MEDIUM - * @tc.type: FUNC - * @tc.level Level 1 - * @tc.require: I69J1R - */ -HWTEST_F(FileAccessHelperTest, medialibrary_file_access_Query_0004, testing::ext::TestSize.Level1) -{ - GTEST_LOG_(INFO) << "FileAccessHelperTest-begin medialibrary_file_access_Query_0004"; - try { - Uri testUri("//file/test.txt"); - json testJson = { - {"relative_path", " "}, - {"display_name", " "} - }; - auto testJsonString = testJson.dump(); - int ret = g_fah->Query(testUri, testJsonString); - EXPECT_NE(ret, OHOS::FileAccessFwk::ERR_OK); - } catch (...) { - GTEST_LOG_(ERROR) << "medialibrary_file_access_Query_0004 occurs an exception."; - } - GTEST_LOG_(INFO) << "FileAccessHelperTest-end medialibrary_file_access_Query_0004"; -} - -/** - * @tc.number: user_file_service_medialibrary_file_access_Query_0005 - * @tc.name: medialibrary_file_access_Query_0005 - * @tc.desc: Test function of Query interface for which column nonexistence. - * @tc.size: MEDIUM - * @tc.type: FUNC - * @tc.level Level 1 - * @tc.require: I69J1R - */ -HWTEST_F(FileAccessHelperTest, medialibrary_file_access_Query_0005, testing::ext::TestSize.Level1) -{ - GTEST_LOG_(INFO) << "FileAccessHelperTest-begin medialibrary_file_access_Query_0005"; - try { - Uri newDirUriTest(""); - std::string fileName = "test.txt"; - std::string relativePath = "test/test.txt"; - const std::string MEDIA_DATA_DB_RELATIVE_PATH = "relative_path"; - const std::string MEDIA_DATA_DB_NAME = "display_name"; - int ret = g_fah->Mkdir(g_newDirUri, "Query005", newDirUriTest); - EXPECT_EQ(ret, OHOS::FileAccessFwk::ERR_OK); - Uri testUri(""); - ret = g_fah->CreateFile(newDirUriTest, fileName, testUri); - EXPECT_EQ(ret, OHOS::FileAccessFwk::ERR_OK); - json testJson = { - {"relative_path", " "}, - {"display_name", " "}, - {"test", " "} - }; - auto testJsonString = testJson.dump(); - ret = g_fah->Query(testUri, testJsonString); - EXPECT_NE(ret, OHOS::FileAccessFwk::ERR_OK); - ret = g_fah->Delete(newDirUriTest); - EXPECT_EQ(ret, OHOS::FileAccessFwk::ERR_OK); - } catch (...) { - GTEST_LOG_(ERROR) << "medialibrary_file_access_Query_0005 occurs an exception."; - } - GTEST_LOG_(INFO) << "FileAccessHelperTest-end medialibrary_file_access_Query_0005"; -} - -/** - * @tc.number: user_file_service_medialibrary_file_access_Query_0006 - * @tc.name: medialibrary_file_access_Query_0006 - * @tc.desc: Test function of Query interface for which column is null. - * @tc.size: MEDIUM - * @tc.type: FUNC - * @tc.level Level 1 - * @tc.require: I69J1R - */ -HWTEST_F(FileAccessHelperTest, medialibrary_file_access_Query_0006, testing::ext::TestSize.Level1) -{ - GTEST_LOG_(INFO) << "FileAccessHelperTest-begin medialibrary_file_access_Query_0006"; - try { - Uri newDirUriTest(""); - std::string fileName = "test.txt"; - std::string relativePath = "test/test.txt"; - int ret = g_fah->Mkdir(g_newDirUri, "Query006", newDirUriTest); - EXPECT_EQ(ret, OHOS::FileAccessFwk::ERR_OK); - Uri testUri(""); - ret = g_fah->CreateFile(newDirUriTest, fileName, testUri); - EXPECT_EQ(ret, OHOS::FileAccessFwk::ERR_OK); - json testJson; - auto testJsonString = testJson.dump(); - ret = g_fah->Query(testUri, testJsonString); - EXPECT_NE(ret, OHOS::FileAccessFwk::ERR_OK); - ret = g_fah->Delete(newDirUriTest); - EXPECT_EQ(ret, OHOS::FileAccessFwk::ERR_OK); - } catch (...) { - GTEST_LOG_(ERROR) << "medialibrary_file_access_Query_0006 occurs an exception."; - } - GTEST_LOG_(INFO) << "FileAccessHelperTest-end medialibrary_file_access_Query_0006"; -} - /** * @tc.number: user_file_service_medialibrary_file_access_GetFileInfoFromUri_0000 * @tc.name: medialibrary_file_access_GetFileInfoFromUri_0000 -- Gitee From efea1e8a1abc7fc615d65e3a15693f1c0a596d2e Mon Sep 17 00:00:00 2001 From: caochuan Date: Thu, 30 Mar 2023 13:28:53 +0800 Subject: [PATCH 6/6] update review opinions Signed-off-by: caochuan --- .../file_access/src/file_access_ext_proxy.cpp | 1 - .../file_access/src/file_access_ext_stub.cpp | 2 +- .../file_access/src/file_access_helper.cpp | 4 +-- .../src/js_file_access_ext_ability.cpp | 14 ++++---- .../FileExtensionAbility.ts | 36 +++++++++---------- 5 files changed, 29 insertions(+), 28 deletions(-) diff --git a/interfaces/inner_api/file_access/src/file_access_ext_proxy.cpp b/interfaces/inner_api/file_access/src/file_access_ext_proxy.cpp index 14dd89d7..303e95a6 100644 --- a/interfaces/inner_api/file_access/src/file_access_ext_proxy.cpp +++ b/interfaces/inner_api/file_access/src/file_access_ext_proxy.cpp @@ -510,7 +510,6 @@ int FileAccessExtProxy::ScanFile(const FileInfo &fileInfo, const int64_t offset, static int GetQueryResult(MessageParcel &reply, std::vector &results) { - HILOG_DEBUG("enter GetQueryResult"); int ret = E_IPCS; if (!reply.ReadInt32(ret)) { HILOG_ERROR("fail to ReadInt32 ret"); diff --git a/interfaces/inner_api/file_access/src/file_access_ext_stub.cpp b/interfaces/inner_api/file_access/src/file_access_ext_stub.cpp index 9bc9e761..88c97d9b 100644 --- a/interfaces/inner_api/file_access/src/file_access_ext_stub.cpp +++ b/interfaces/inner_api/file_access/src/file_access_ext_stub.cpp @@ -472,7 +472,7 @@ ErrCode FileAccessExtStub::CmdQuery(MessageParcel &data, MessageParcel &reply) if (uri == nullptr) { HILOG_ERROR("Parameter Query fail to ReadParcelable uri"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return E_URIS; + return E_IPCS; } int64_t count = 0; diff --git a/interfaces/inner_api/file_access/src/file_access_helper.cpp b/interfaces/inner_api/file_access/src/file_access_helper.cpp index 918f84bc..76d3e50a 100644 --- a/interfaces/inner_api/file_access/src/file_access_helper.cpp +++ b/interfaces/inner_api/file_access/src/file_access_helper.cpp @@ -764,7 +764,8 @@ static int GetQueryColumns(std::string &uri, std::string &metaJson, std::vector< return ERR_OK; } -static int GetQueryResult(std::string &uri, std::vector &columns, std::vector &results, std::string &metaJson) +static int GetQueryResult(std::string &uri, std::vector &columns, std::vector &results, + std::string &metaJson) { json jsonObject; for (size_t i = 0; i < columns.size(); i++) { @@ -786,7 +787,6 @@ static int GetQueryResult(std::string &uri, std::vector &columns, s } } metaJson = jsonObject.dump(); - return ERR_OK; } diff --git a/interfaces/inner_api/file_access/src/js_file_access_ext_ability.cpp b/interfaces/inner_api/file_access/src/js_file_access_ext_ability.cpp index 9344ecaa..c9028f58 100644 --- a/interfaces/inner_api/file_access/src/js_file_access_ext_ability.cpp +++ b/interfaces/inner_api/file_access/src/js_file_access_ext_ability.cpp @@ -1072,7 +1072,8 @@ int JsFileAccessExtAbility::Access(const Uri &uri, bool &isExist) return ERR_OK; } -static bool ParserQueryFileJsResult(NativeEngine &engine, NativeValue *nativeValue, Value> &results) +static bool ParserQueryFileJsResult(NativeEngine &engine, NativeValue *nativeValue, + Value> &results) { NativeObject *obj = ConvertNativeValueTo(nativeValue); if (obj == nullptr) { @@ -1082,7 +1083,7 @@ static bool ParserQueryFileJsResult(NativeEngine &engine, NativeValue *nativeVal bool ret = ConvertFromJsValue(engine, obj->GetProperty("code"), results.code); if (!ret) { - HILOG_ERROR("Convert js value fail."); + HILOG_ERROR("Convert the code of js value fail."); return ret; } @@ -1097,7 +1098,7 @@ static bool ParserQueryFileJsResult(NativeEngine &engine, NativeValue *nativeVal if (queryResult == nullptr) { HILOG_ERROR("get native queryResult fail."); return false; - } + } std::string tempValue; ret = ConvertFromJsValue(engine, queryResult, tempValue); if (!ret) { @@ -1128,12 +1129,12 @@ int JsFileAccessExtAbility::Query(const Uri &uri, std::vector &colu NativeValue *resultArray = engine.CreateArray(columns.size()); if (resultArray == nullptr) { HILOG_ERROR("Create MimeType native array value fail."); - return E_GETRESULT; + return false; } int errorCode = MakeStringNativeArray(engine, columns, resultArray); if (errorCode != ERR_OK) { HILOG_ERROR("Create native array value fail, code:%{public}d.", errorCode); - return errorCode; + return false; } argv[ARGC_ZERO] = nativeUri; argv[ARGC_ONE] = resultArray; @@ -1147,6 +1148,7 @@ int JsFileAccessExtAbility::Query(const Uri &uri, std::vector &colu HILOG_ERROR("Parser js value fail."); return ret; } + value->code = queryResult.code; value->data = queryResult.data; return ret; }; @@ -1159,7 +1161,7 @@ int JsFileAccessExtAbility::Query(const Uri &uri, std::vector &colu } if (value->code != ERR_OK) { - HILOG_ERROR("query fail."); + HILOG_ERROR("fileio fail."); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return value->code; } 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 3de44370..d924ed28 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 @@ -36,10 +36,10 @@ const ERR_ERROR = -1; const E_EXIST = 13900015; const E_URIS = 14300002; const E_GETRESULT = 14300004; -const DATA_DB_DATE_ADDED = "date_added"; -const DATA_DB_DATE_MODIFIED = "date_modified"; -const FILE_DATA_ATIME = "atime"; -const FILE_DATA_MTIME = "mtime"; +const DATA_DB_DATE_ADDED = 'date_added'; +const DATA_DB_DATE_MODIFIED = 'date_modified'; +const FILE_DATA_ATIME = 'atime'; +const FILE_DATA_MTIME = 'mtime'; let callbackFun = null; export default class FileExtAbility extends Extension { @@ -550,7 +550,7 @@ export default class FileExtAbility extends Extension { code: E_URIS, }; } - var results = []; + let queryResults = []; try { let dirPath = this.getPath(uri); @@ -567,22 +567,22 @@ export default class FileExtAbility extends Extension { } }); - if (column == "display_name") { - let index = dirPath.lastIndexOf("/"); - let target = dirPath.substring(index+1,); - results.push(String(target)); + if (column === 'display_name') { + let index = dirPath.lastIndexOf('/'); + let target = dirPath.substring(index + 1, ); + queryResults.push(String(target)); continue; } - if (column == "relative_path") { - let index = dirPath.lastIndexOf("/"); - let target = dirPath.substring(0,index+1); - results.push(target); + if (column === 'relative_path') { + let index = dirPath.lastIndexOf('/'); + let target = dirPath.substring(0, index + 1); + queryResults.push(target); continue; } if (column in stat) { - if (column == "size" && stat.isDirectory()) { + if (column === 'size' && stat.isDirectory()) { let size = 0; this.recurseDir(dirPath, function (filePath, isDirectory, hasNextFile) { if (isDirectory && !hasNextFile) { @@ -594,12 +594,12 @@ export default class FileExtAbility extends Extension { size += stat.size; } }); - results.push(String(size)); + queryResults.push(String(size)); continue; } - results.push(String(stat[column])); + queryResults.push(String(stat[column])); } else { - results.push("0"); + queryResults.push('0'); } } } catch (e) { @@ -610,7 +610,7 @@ export default class FileExtAbility extends Extension { }; } return { - results: results, + results: queryResults, code: ERR_OK, }; } -- Gitee