From bdbe27c27c7b0cb3fd5342affeb2fe4e565ff385 Mon Sep 17 00:00:00 2001 From: chenkai008 Date: Fri, 17 Jun 2022 10:33:10 +0800 Subject: [PATCH 1/2] add getRoots listFile fun Signed-off-by: chenkai008 --- .../file_access/include/file_ext_ability.h | 4 ++ .../file_access/include/file_ext_proxy.h | 3 + .../file_access/include/file_ext_stub.h | 5 +- .../file_access/include/file_ext_stub_impl.h | 3 + .../file_access/include/ifile_ext_base.h | 8 ++- .../file_access/include/js_file_ext_ability.h | 5 ++ .../file_access/src/file_ext_ability.cpp | 12 ++++ .../file_access/src/file_ext_proxy.cpp | 67 +++++++++++++++++++ .../file_access/src/file_ext_stub.cpp | 51 +++++++++++++- .../file_access/src/file_ext_stub_impl.cpp | 28 ++++++++ .../file_access/src/js_file_ext_ability.cpp | 49 ++++++++++++++ 11 files changed, 231 insertions(+), 4 deletions(-) diff --git a/frameworks/innerkits/file_access/include/file_ext_ability.h b/frameworks/innerkits/file_access/include/file_ext_ability.h index 5883aa37..3ceb9fce 100644 --- a/frameworks/innerkits/file_access/include/file_ext_ability.h +++ b/frameworks/innerkits/file_access/include/file_ext_ability.h @@ -17,6 +17,7 @@ #define FILE_EXT_ABILITY_H #include "extension_base.h" +#include "file_extension_info.h" namespace OHOS { namespace AbilityRuntime { @@ -44,6 +45,9 @@ public: virtual int Delete(const Uri &sourceFileUri); virtual int Rename(const Uri &sourceFileUri, const std::string &displayName, Uri &newFileUri); + virtual std::vector ListFile(const Uri &sourceFileUri); + virtual std::vector GetRoots(); + /** * @brief Set a creator function. * diff --git a/frameworks/innerkits/file_access/include/file_ext_proxy.h b/frameworks/innerkits/file_access/include/file_ext_proxy.h index 6d11b355..c91c7e29 100644 --- a/frameworks/innerkits/file_access/include/file_ext_proxy.h +++ b/frameworks/innerkits/file_access/include/file_ext_proxy.h @@ -34,6 +34,9 @@ public: virtual int Mkdir(const Uri &parentUri, const std::string &displayName, Uri &newFileUri) override; virtual int Delete(const Uri &sourceFileUri) override; virtual int Rename(const Uri &sourceFileUri, const std::string &displayName, Uri &newFileUri) override; + + virtual std::vector ListFile(const Uri &sourceFileUri) override; + virtual std::vector GetRoots() override; private: static inline BrokerDelegator delegator_; }; diff --git a/frameworks/innerkits/file_access/include/file_ext_stub.h b/frameworks/innerkits/file_access/include/file_ext_stub.h index fd3748a9..cd79d012 100644 --- a/frameworks/innerkits/file_access/include/file_ext_stub.h +++ b/frameworks/innerkits/file_access/include/file_ext_stub.h @@ -35,7 +35,10 @@ private: ErrCode CmdMkdir(MessageParcel &data, MessageParcel &reply); ErrCode CmdDelete(MessageParcel &data, MessageParcel &reply); ErrCode CmdRename(MessageParcel &data, MessageParcel &reply); - + + ErrCode CmdListFile(MessageParcel &data, MessageParcel &reply); + ErrCode CmdGetRoots(MessageParcel &data, MessageParcel &reply); + using RequestFuncType = int (FileExtStub::*)(MessageParcel &data, MessageParcel &reply); std::map stubFuncMap_; }; diff --git a/frameworks/innerkits/file_access/include/file_ext_stub_impl.h b/frameworks/innerkits/file_access/include/file_ext_stub_impl.h index c27a5ccb..ac4093b0 100644 --- a/frameworks/innerkits/file_access/include/file_ext_stub_impl.h +++ b/frameworks/innerkits/file_access/include/file_ext_stub_impl.h @@ -36,6 +36,9 @@ public: int Mkdir(const Uri &parentUri, const std::string &displayName, Uri &newFileUri) override; int Delete(const Uri &sourceFileUri) override; int Rename(const Uri &sourceFileUri, const std::string &displayName, Uri &newFileUri) override; + + std::vector ListFile(const Uri &sourceFileUri) override; + std::vector GetRoots() override; private: std::shared_ptr GetOwner(); diff --git a/frameworks/innerkits/file_access/include/ifile_ext_base.h b/frameworks/innerkits/file_access/include/ifile_ext_base.h index 2f786db1..24f43f63 100644 --- a/frameworks/innerkits/file_access/include/ifile_ext_base.h +++ b/frameworks/innerkits/file_access/include/ifile_ext_base.h @@ -20,6 +20,7 @@ #include #include +#include "file_extension_info.h" #include "uri.h" namespace OHOS { @@ -33,7 +34,9 @@ public: CMD_CREATE_FILE = 2, CMD_MKDIR = 3, CMD_DELETE = 4, - CMD_RENAME = 5 + CMD_RENAME = 5, + CMD_LIST_FILE = 6, + CMD_GET_ROOTS = 7 }; virtual int OpenFile(const Uri &uri, int flags) = 0; @@ -41,6 +44,9 @@ public: virtual int Mkdir(const Uri &parentUri, const std::string &displayName, Uri &newFileUri) = 0; virtual int Delete(const Uri &sourceFileUri) = 0; virtual int Rename(const Uri &sourceFileUri, const std::string &displayName, Uri &newFileUri) = 0; + + virtual std::vector ListFile(const Uri &sourceFileUri) = 0; + virtual std::vector GetRoots() = 0; }; } // namespace FileAccessFwk } // namespace OHOS diff --git a/frameworks/innerkits/file_access/include/js_file_ext_ability.h b/frameworks/innerkits/file_access/include/js_file_ext_ability.h index 6c398613..23a7e3b4 100644 --- a/frameworks/innerkits/file_access/include/js_file_ext_ability.h +++ b/frameworks/innerkits/file_access/include/js_file_ext_ability.h @@ -18,6 +18,8 @@ #include "file_ext_ability.h" +#include "napi_common_fileaccess.h" +#include "file_extension_info.h" #include "js_runtime.h" #include "native_engine/native_reference.h" #include "native_engine/native_value.h" @@ -46,6 +48,9 @@ public: int Mkdir(const Uri &parentUri, const std::string &displayName, Uri &newFileUri) override; int Delete(const Uri &sourceFileUri) override; int Rename(const Uri &sourceFileUri, const std::string &displayName, Uri &newFileUri) override; + + std::vector ListFile(const Uri &sourceFileUri) override; + std::vector GetRoots() override; private: NativeValue* CallObjectMethod(const char *name, NativeValue * const *argv = nullptr, size_t argc = 0); void GetSrcPath(std::string &srcPath); diff --git a/frameworks/innerkits/file_access/src/file_ext_ability.cpp b/frameworks/innerkits/file_access/src/file_ext_ability.cpp index 60d765a1..b1460d4d 100644 --- a/frameworks/innerkits/file_access/src/file_ext_ability.cpp +++ b/frameworks/innerkits/file_access/src/file_ext_ability.cpp @@ -98,5 +98,17 @@ int FileExtAbility::Rename(const Uri &sourceFileUri, const std::string &displayN HILOG_INFO("%{public}s end.", __func__); return 0; } + +std::vector FileExtAbility::ListFile(const Uri &sourceFileUri) +{ + std::vector vec; + return vec; +} + +std::vector FileExtAbility::GetRoots() +{ + std::vector vec; + return vec; +} } // namespace FileAccessFwk } // namespace OHOS \ No newline at end of file diff --git a/frameworks/innerkits/file_access/src/file_ext_proxy.cpp b/frameworks/innerkits/file_access/src/file_ext_proxy.cpp index 2c5e9d39..84406b37 100644 --- a/frameworks/innerkits/file_access/src/file_ext_proxy.cpp +++ b/frameworks/innerkits/file_access/src/file_ext_proxy.cpp @@ -242,5 +242,72 @@ int FileExtProxy::Rename(const Uri &sourceFileUri, const std::string &displayNam HILOG_INFO("%{public}s end successfully, tempUri=%{public}s", __func__, tempUri->ToString().c_str()); return ret; } + +std::vector FileExtProxy::ListFile(const Uri &sourceFileUri) +{ + HILOG_INFO("%{public}s begin.", __func__); + std::vector vec; + MessageParcel data; + if (!data.WriteInterfaceToken(FileExtProxy::GetDescriptor())) { + HILOG_ERROR("%{public}s WriteInterfaceToken failed", __func__); + return vec; + } + + if (!data.WriteParcelable(&sourceFileUri)) { + HILOG_ERROR("%{public}s fail to WriteParcelable sourceFileUri", __func__); + return vec; + } + + MessageParcel reply; + MessageOption option; + int32_t err = Remote()->SendRequest(CMD_LIST_FILE, data, reply, option); + if (err != NO_ERROR) { + HILOG_ERROR("%{public}s fail to SendRequest. err: %d", __func__, err); + return vec; + } + + vec.clear(); + int32_t count = reply.ReadInt32(); + for (int32_t i = 0; i < count; i++) { + std::unique_ptr fileInfo(reply.ReadParcelable()); + if (fileInfo != nullptr) { + vec.push_back(*fileInfo); + } + } + + HILOG_INFO("%{public}s end successfully, return vec.size=%{public}d", __func__, vec.size()); + return vec; +} + +std::vector FileExtProxy::GetRoots() +{ + HILOG_INFO("%{public}s begin.", __func__); + std::vector vec; + MessageParcel data; + if (!data.WriteInterfaceToken(FileExtProxy::GetDescriptor())) { + HILOG_ERROR("%{public}s WriteInterfaceToken failed", __func__); + return vec; + } + + MessageParcel reply; + MessageOption option; + int32_t err = Remote()->SendRequest(CMD_GET_ROOTS, data, reply, option); + if (err != NO_ERROR) { + HILOG_ERROR("%{public}s fail to SendRequest. err: %d", __func__, err); + return vec; + } + + vec.clear(); + uint64_t count = reply.ReadUint32(); + for (uint64_t i = 0; i < count; i++) { + std::unique_ptr deviceInfo(reply.ReadParcelable()); + if (deviceInfo != nullptr) { + vec.push_back(*deviceInfo); + } + } + + HILOG_INFO("%{public}s end successfully, return vec.size=%{public}d", __func__, vec.size()); + return vec; +} } // namespace FileAccessFwk } // namespace OHOS diff --git a/frameworks/innerkits/file_access/src/file_ext_stub.cpp b/frameworks/innerkits/file_access/src/file_ext_stub.cpp index 5525628d..2d6c198e 100644 --- a/frameworks/innerkits/file_access/src/file_ext_stub.cpp +++ b/frameworks/innerkits/file_access/src/file_ext_stub.cpp @@ -21,13 +21,13 @@ namespace OHOS { namespace FileAccessFwk { FileExtStub::FileExtStub() { - HILOG_INFO("%{public}s begin.", __func__); stubFuncMap_[CMD_OPEN_FILE] = &FileExtStub::CmdOpenFile; stubFuncMap_[CMD_CREATE_FILE] = &FileExtStub::CmdCreateFile; stubFuncMap_[CMD_MKDIR] = &FileExtStub::CmdMkdir; stubFuncMap_[CMD_DELETE] = &FileExtStub::CmdDelete; stubFuncMap_[CMD_RENAME] = &FileExtStub::CmdRename; - HILOG_INFO("%{public}s end.", __func__); + stubFuncMap_[CMD_LIST_FILE] = &FileExtStub::CmdListFile; + stubFuncMap_[CMD_GET_ROOTS] = &FileExtStub::CmdGetRoots; } FileExtStub::~FileExtStub() @@ -226,5 +226,52 @@ ErrCode FileExtStub::CmdRename(MessageParcel &data, MessageParcel &reply) HILOG_INFO("%{public}s end. fileUriNew = %{public}s", __func__, fileUriNew->ToString().c_str()); return NO_ERROR; } + +ErrCode FileExtStub::CmdListFile(MessageParcel &data, MessageParcel &reply) +{ + HILOG_INFO("%{public}s begin.", __func__); + std::shared_ptr uri(data.ReadParcelable()); + if (uri == nullptr) { + HILOG_ERROR("%{public}s uri is nullptr", __func__); + return ERR_INVALID_VALUE; + } + + std::vector vec = ListFile(*uri); + uint64_t count {vec.size()}; + if (!reply.WriteUint64(count)) { + HILOG_ERROR("%{public}s fail to WriteInt32 count", __func__); + return ERR_INVALID_VALUE; + } + for (uint64_t i = 0; i < count; i++) { + if (!reply.WriteParcelable(&vec[i])) { + HILOG_ERROR("%{public}s fail to WriteParcelable vec, index = %{public}llu", __func__, i); + return ERR_INVALID_VALUE; + } + } + + HILOG_INFO("%{public}s end.", __func__); + return NO_ERROR; +} + +ErrCode FileExtStub::CmdGetRoots(MessageParcel &data, MessageParcel &reply) +{ + HILOG_INFO("%{public}s begin.", __func__); + + std::vector vec = GetRoots(); + uint64_t count {vec.size()}; + if (!reply.WriteUint64(count)) { + HILOG_ERROR("%{public}s fail to WriteInt32 count", __func__); + return ERR_INVALID_VALUE; + } + for (uint64_t i = 0; i < count; i++) { + if (!reply.WriteParcelable(&vec[i])) { + HILOG_ERROR("%{public}s fail to WriteParcelable ret, index = %{public}llu", __func__, i); + return ERR_INVALID_VALUE; + } + } + + HILOG_INFO("%{public}s end.", __func__); + return NO_ERROR; +} } // namespace FileAccessFwk } // namespace OHOS diff --git a/frameworks/innerkits/file_access/src/file_ext_stub_impl.cpp b/frameworks/innerkits/file_access/src/file_ext_stub_impl.cpp index a649e159..528e8c37 100644 --- a/frameworks/innerkits/file_access/src/file_ext_stub_impl.cpp +++ b/frameworks/innerkits/file_access/src/file_ext_stub_impl.cpp @@ -98,5 +98,33 @@ int FileExtStubImpl::Rename(const Uri &sourceFileUri, const std::string &display __func__, ret, newFileUri.ToString().c_str()); return ret; } + +std::vector FileExtStubImpl::ListFile(const Uri &sourceFileUri) +{ + HILOG_INFO("%{public}s begin.", __func__); + std::vector vec; + auto extension = GetOwner(); + if (extension == nullptr) { + HILOG_ERROR("%{public}s end failed.", __func__); + return vec; + } + vec = extension->ListFile(sourceFileUri); + HILOG_INFO("%{public}s end", __func__); + return vec; +} + +std::vector FileExtStubImpl::GetRoots() +{ + HILOG_INFO("%{public}s begin.", __func__); + std::vector vec; + auto extension = GetOwner(); + if (extension == nullptr) { + HILOG_ERROR("%{public}s end failed.", __func__); + return vec; + } + vec = extension->GetRoots(); + HILOG_INFO("%{public}s end.", __func__); + return vec; +} } // namespace FileAccessFwk } // namespace OHOS diff --git a/frameworks/innerkits/file_access/src/js_file_ext_ability.cpp b/frameworks/innerkits/file_access/src/js_file_ext_ability.cpp index 51b5ff09..d12d4cb1 100644 --- a/frameworks/innerkits/file_access/src/js_file_ext_ability.cpp +++ b/frameworks/innerkits/file_access/src/js_file_ext_ability.cpp @@ -33,6 +33,7 @@ namespace OHOS { namespace FileAccessFwk { namespace { +constexpr size_t ARGC_ZERO = 0; constexpr size_t ARGC_ONE = 1; constexpr size_t ARGC_TWO = 2; } @@ -306,5 +307,53 @@ int JsFileExtAbility::Rename(const Uri &sourceFileUri, const std::string &displa HILOG_INFO("%{public}s end. return fd:%{public}d, newFileUri = %{public}s", __func__, ret, uriStr.c_str()); return ret; } + +std::vector JsFileExtAbility::ListFile(const Uri &sourceFileUri) +{ + HILOG_INFO("%{public}s begin.", __func__); + HandleScope handleScope(jsRuntime_); + napi_env env = reinterpret_cast(&jsRuntime_.GetNativeEngine()); + + napi_value napiUri = nullptr; + std::vector vec; + napi_create_string_utf8(env, sourceFileUri.ToString().c_str(), NAPI_AUTO_LENGTH, &napiUri); + + NativeValue* nativeUri = reinterpret_cast(napiUri); + NativeValue* argv[] = {nativeUri}; + NativeValue* nativeResult = CallObjectMethod("listFile", argv, ARGC_ONE); + if (nativeResult == nullptr) { + HILOG_ERROR("%{public}s call listFile with return null.", __func__); + return vec; + } + if(UnwrapArrayFileInfoFromJS(env, reinterpret_cast(nativeResult), vec)) { + HILOG_INFO("%{public}s end vec.size:%{public}d.", __func__, vec.size()); + return vec; + } else { + HILOG_ERROR("%{public}s end with faild.", __func__); + return vec; + } +} + +std::vector JsFileExtAbility::GetRoots() +{ + HILOG_INFO("%{public}s begin.", __func__); + HandleScope handleScope(jsRuntime_); + napi_env env = reinterpret_cast(&jsRuntime_.GetNativeEngine()); + + std::vector vec; + NativeValue* argv[] = {}; + NativeValue* nativeResult = CallObjectMethod("getRoots", argv, ARGC_ZERO); + if (nativeResult == nullptr) { + HILOG_ERROR("%{public}s call getRoots with return null.", __func__); + return vec; + } + if(UnwrapArrayDeviceInfoFromJS(env, reinterpret_cast(nativeResult), vec)) { + HILOG_INFO("%{public}s end vec.size:%{public}d.", __func__, vec.size()); + return vec; + } else { + HILOG_ERROR("%{public}s end with faild.", __func__); + return vec; + } +} } // namespace FileAccessFwk } // namespace OHOS \ No newline at end of file -- Gitee From cd5df27ee1d584e321010c4fbef19decbcfb4d1e Mon Sep 17 00:00:00 2001 From: chenkai008 Date: Fri, 17 Jun 2022 10:39:19 +0800 Subject: [PATCH 2/2] add space Signed-off-by: chenkai008 --- frameworks/innerkits/file_access/src/js_file_ext_ability.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/innerkits/file_access/src/js_file_ext_ability.cpp b/frameworks/innerkits/file_access/src/js_file_ext_ability.cpp index d12d4cb1..e0968938 100644 --- a/frameworks/innerkits/file_access/src/js_file_ext_ability.cpp +++ b/frameworks/innerkits/file_access/src/js_file_ext_ability.cpp @@ -325,7 +325,7 @@ std::vector JsFileExtAbility::ListFile(const Uri &sourceFileUri) HILOG_ERROR("%{public}s call listFile with return null.", __func__); return vec; } - if(UnwrapArrayFileInfoFromJS(env, reinterpret_cast(nativeResult), vec)) { + if (UnwrapArrayFileInfoFromJS(env, reinterpret_cast(nativeResult), vec)) { HILOG_INFO("%{public}s end vec.size:%{public}d.", __func__, vec.size()); return vec; } else { @@ -347,7 +347,7 @@ std::vector JsFileExtAbility::GetRoots() HILOG_ERROR("%{public}s call getRoots with return null.", __func__); return vec; } - if(UnwrapArrayDeviceInfoFromJS(env, reinterpret_cast(nativeResult), vec)) { + if (UnwrapArrayDeviceInfoFromJS(env, reinterpret_cast(nativeResult), vec)) { HILOG_INFO("%{public}s end vec.size:%{public}d.", __func__, vec.size()); return vec; } else { -- Gitee