From 293de3cd58475c07ffc8950cd06d4fdf2ab636bb Mon Sep 17 00:00:00 2001 From: wangjianqiang Date: Wed, 20 Jul 2022 16:36:41 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E6=B7=BB=E5=8A=A0isFileExist?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: wangjianqiang --- .../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 | 4 +- .../include/js_file_access_ext_ability.h | 2 + .../src/file_access_ext_ability.cpp | 5 ++ .../file_access/src/file_access_ext_proxy.cpp | 30 ++++++++++++ .../file_access/src/file_access_ext_stub.cpp | 27 +++++++++++ .../src/file_access_ext_stub_impl.cpp | 15 ++++++ .../file_access/src/file_access_helper.cpp | 15 ++++++ .../src/js_file_access_ext_ability.cpp | 26 ++++++++++ .../file_access_ext_ability.js | 4 ++ .../napi_fileaccess_helper.cpp | 47 +++++++++++++++++++ .../napi_fileaccess_helper.h | 3 +- 16 files changed, 181 insertions(+), 2 deletions(-) diff --git a/frameworks/innerkits/file_access/include/file_access_ext_ability.h b/frameworks/innerkits/file_access/include/file_access_ext_ability.h index 7689afb0..609be712 100644 --- a/frameworks/innerkits/file_access/include/file_access_ext_ability.h +++ b/frameworks/innerkits/file_access/include/file_access_ext_ability.h @@ -48,6 +48,7 @@ public: virtual std::vector ListFile(const Uri &sourceFile); virtual std::vector GetRoots(); + virtual bool IsFileExist(const Uri &uri); static void SetCreator(const CreatorFunc& creator); private: static CreatorFunc creator_; 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 f450951c..c9051094 100644 --- a/frameworks/innerkits/file_access/include/file_access_ext_proxy.h +++ b/frameworks/innerkits/file_access/include/file_access_ext_proxy.h @@ -45,6 +45,7 @@ public: virtual std::vector ListFile(const Uri &sourceFile) override; virtual std::vector GetRoots() override; + virtual bool IsFileExist(const Uri &uri) override; private: static inline BrokerDelegator delegator_; }; 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 8c232892..d4cf4fdc 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 CmdGetRoots(MessageParcel &data, MessageParcel &reply); + ErrCode CmdIsFileExist(MessageParcel &data, MessageParcel &reply); bool CheckCallingPermission(const std::string &permission); using RequestFuncType = int (FileAccessExtStub::*)(MessageParcel &data, MessageParcel &reply); std::map stubFuncMap_; 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 4ee634a0..1a272b0a 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 @@ -42,6 +42,7 @@ public: int Rename(const Uri &sourceFile, const std::string &displayName, Uri &newFile) override; std::vector ListFile(const Uri &sourceFileUri) override; std::vector GetRoots() override; + bool IsFileExist(const Uri &uri) override; private: std::shared_ptr GetOwner(); diff --git a/frameworks/innerkits/file_access/include/file_access_helper.h b/frameworks/innerkits/file_access/include/file_access_helper.h index df3899d0..e136d9f9 100644 --- a/frameworks/innerkits/file_access/include/file_access_helper.h +++ b/frameworks/innerkits/file_access/include/file_access_helper.h @@ -45,6 +45,7 @@ public: bool GetProxy(); bool Release(); + bool IsFileExist(Uri &uri); int OpenFile(Uri &uri, int flags); int CreateFile(Uri &parent, const std::string &displayName, Uri &newFile); int Mkdir(Uri &parent, const std::string &displayName, Uri &newDir); 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 fdc837b8..75b92343 100644 --- a/frameworks/innerkits/file_access/include/ifile_access_ext_base.h +++ b/frameworks/innerkits/file_access/include/ifile_access_ext_base.h @@ -38,7 +38,8 @@ public: CMD_MOVE, CMD_RENAME, CMD_LIST_FILE, - CMD_GET_ROOTS + CMD_GET_ROOTS, + CMD_IS_FILE_EXIST }; virtual int OpenFile(const Uri &uri, int flags) = 0; @@ -50,6 +51,7 @@ public: virtual std::vector ListFile(const Uri &sourceFile) = 0; virtual std::vector GetRoots() = 0; + virtual bool IsFileExist(const Uri &uri) = 0; }; } // namespace FileAccessFwk } // namespace OHOS diff --git a/frameworks/innerkits/file_access/include/js_file_access_ext_ability.h b/frameworks/innerkits/file_access/include/js_file_access_ext_ability.h index 49d26194..240e145d 100644 --- a/frameworks/innerkits/file_access/include/js_file_access_ext_ability.h +++ b/frameworks/innerkits/file_access/include/js_file_access_ext_ability.h @@ -64,6 +64,8 @@ public: int Rename(const Uri &sourceFile, const std::string &displayName, Uri &newFile) override; std::vector ListFile(const Uri &sourceFile) override; std::vector GetRoots() override; + bool IsFileExist(const Uri &uri) override; + private: NativeValue* AsnycCallObjectMethod(const char *name, NativeValue * const *argv = nullptr, size_t argc = 0); NativeValue* CallObjectMethod(const char *name, NativeValue * const *argv = nullptr, size_t argc = 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 a570e63d..0c714597 100644 --- a/frameworks/innerkits/file_access/src/file_access_ext_ability.cpp +++ b/frameworks/innerkits/file_access/src/file_access_ext_ability.cpp @@ -99,5 +99,10 @@ std::vector FileAccessExtAbility::GetRoots() std::vector vec; return vec; } + +bool FileAccessExtAbility::IsFileExist(const Uri &uri) +{ + return true; +} } // namespace FileAccessFwk } // namespace OHOS \ No newline at end of file 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 059331c8..dca62182 100644 --- a/frameworks/innerkits/file_access/src/file_access_ext_proxy.cpp +++ b/frameworks/innerkits/file_access/src/file_access_ext_proxy.cpp @@ -398,5 +398,35 @@ std::vector FileAccessExtProxy::GetRoots() FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return vec; } + +bool FileAccessExtProxy::IsFileExist(const Uri &uri) +{ + StartTrace(HITRACE_TAG_FILEMANAGEMENT, "IsFileExist"); + MessageParcel data; + if (!data.WriteInterfaceToken(FileAccessExtProxy::GetDescriptor())) { + HILOG_ERROR("WriteInterfaceToken failed"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_IPC_ERROR; + } + + if (!data.WriteParcelable(&uri)) { + HILOG_ERROR("fail to WriteParcelable uri"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_IPC_ERROR; + } + + MessageParcel reply; + MessageOption option; + int32_t err = Remote()->SendRequest(CMD_IS_FILE_EXIST, data, reply, option); + if (err != NO_ERROR) { + HILOG_ERROR("fail to SendRequest. err: %{public}d", err); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return false; + } + + bool ret = reply.ReadBool(); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ret; +} } // namespace FileAccessFwk } // namespace OHOS 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 b0887857..cb8b8555 100644 --- a/frameworks/innerkits/file_access/src/file_access_ext_stub.cpp +++ b/frameworks/innerkits/file_access/src/file_access_ext_stub.cpp @@ -384,6 +384,33 @@ ErrCode FileAccessExtStub::CmdGetRoots(MessageParcel &data, MessageParcel &reply return ERR_OK; } +ErrCode FileAccessExtStub::CmdIsFileExist(MessageParcel &data, MessageParcel &reply) +{ + StartTrace(HITRACE_TAG_FILEMANAGEMENT, "CmdIsFileExist"); + std::shared_ptr uri(data.ReadParcelable()); + if (uri == nullptr) { + HILOG_ERROR("IsFIleExist uri is nullptr"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return false; + } + + bool ret = IsFileExist(*uri); + if (ret == false) { + HILOG_ERROR("IsFIleExist fail"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ret; + } + + if (!reply.WriteBool(ret)) { + HILOG_ERROR("IsFIleExist fail "); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return false; + } + + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return true; +} + bool FileAccessExtStub::CheckCallingPermission(const std::string &permission) { StartTrace(HITRACE_TAG_FILEMANAGEMENT, "CmdGetRoots"); 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 26fd26e2..87e67954 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 @@ -153,5 +153,20 @@ std::vector FileAccessExtStubImpl::GetRoots() FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return vec; } + +bool FileAccessExtStubImpl::IsFileExist(const Uri &uri) +{ + StartTrace(HITRACE_TAG_FILEMANAGEMENT, "IsFileExist"); + bool ret = false; + if (extension_ == nullptr) { + HILOG_ERROR("IsFileExist get extension failed."); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ret; + } + + ret = extension_->IsFileExist(uri); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ret; +} } // namespace FileAccessFwk } // namespace OHOS \ No newline at end of file diff --git a/frameworks/innerkits/file_access/src/file_access_helper.cpp b/frameworks/innerkits/file_access/src/file_access_helper.cpp index 9a3a497a..957bc86d 100644 --- a/frameworks/innerkits/file_access/src/file_access_helper.cpp +++ b/frameworks/innerkits/file_access/src/file_access_helper.cpp @@ -272,6 +272,21 @@ std::vector FileAccessHelper::GetRoots() return results; } +bool FileAccessHelper::IsFileExist(Uri &uri) +{ + StartTrace(HITRACE_TAG_FILEMANAGEMENT, "OpenFile"); + bool ret = false; + if (!GetProxy()) { + HILOG_ERROR("failed with invalid fileAccessExtProxy_"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return false; + } + + ret = fileAccessExtProxy_->IsFileExist(uri); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ret; +} + void FileAccessDeathRecipient::OnRemoteDied(const wptr &remote) { if (handler_) { diff --git a/frameworks/innerkits/file_access/src/js_file_access_ext_ability.cpp b/frameworks/innerkits/file_access/src/js_file_access_ext_ability.cpp index 30764f8d..d77668c8 100644 --- a/frameworks/innerkits/file_access/src/js_file_access_ext_ability.cpp +++ b/frameworks/innerkits/file_access/src/js_file_access_ext_ability.cpp @@ -499,7 +499,33 @@ std::vector JsFileAccessExtAbility::GetRoots() HILOG_ERROR("end with faild."); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return vec; +} + +bool JsFileAccessExtAbility::IsFileExist(const Uri &uri) +{ + StartTrace(HITRACE_TAG_FILEMANAGEMENT, "IsFileExist"); + HandleScope handleScope(jsRuntime_); + napi_env env = reinterpret_cast(&jsRuntime_.GetNativeEngine()); + + napi_value napiUri = nullptr; + napi_create_string_utf8(env, uri.ToString().c_str(), NAPI_AUTO_LENGTH, &napiUri); + + NativeValue* nativeUri = reinterpret_cast(napiUri); + NativeValue* argv[] = {nativeUri}; + NativeValue* nativeResult = AsnycCallObjectMethod("isFileExist", argv, ARGC_ONE); + bool ret = false; + if (nativeResult == nullptr) { + HILOG_ERROR("call isFileExist with return null."); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ret; + } + + if(OHOS::AppExecFwk::UnwrapBoolFromJS2(env, reinterpret_cast(nativeResult), ret)) { + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ret; } + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ret; } } // namespace FileAccessFwk } // namespace OHOS \ No newline at end of file diff --git a/interfaces/kits/napi/file_access_ext_ability/file_access_ext_ability.js b/interfaces/kits/napi/file_access_ext_ability/file_access_ext_ability.js index 97f0eb6a..4728e023 100644 --- a/interfaces/kits/napi/file_access_ext_ability/file_access_ext_ability.js +++ b/interfaces/kits/napi/file_access_ext_ability/file_access_ext_ability.js @@ -50,6 +50,10 @@ class FileAccessExtensionAbility { let roots = []; return roots; } + + isFileExist() { + return true; + } } export default FileAccessExtensionAbility \ No newline at end of file diff --git a/interfaces/kits/napi/file_access_module/napi_fileaccess_helper.cpp b/interfaces/kits/napi/file_access_module/napi_fileaccess_helper.cpp index c8edcf9b..010fac4d 100644 --- a/interfaces/kits/napi/file_access_module/napi_fileaccess_helper.cpp +++ b/interfaces/kits/napi/file_access_module/napi_fileaccess_helper.cpp @@ -155,6 +155,7 @@ napi_value FileAccessHelperInit(napi_env env, napi_value exports) DECLARE_NAPI_FUNCTION("rename", NAPI_Rename), DECLARE_NAPI_FUNCTION("listFile", NAPI_ListFile), DECLARE_NAPI_FUNCTION("getRoots", NAPI_GetRoots), + DECLARE_NAPI_FUNCTION("isFileExist", NAPI_IsFileExist), }; napi_value cons = nullptr; NAPI_CALL(env, @@ -599,5 +600,51 @@ napi_value NAPI_GetRoots(napi_env env, napi_callback_info info) } return NVal::CreateUndefined(env).val_; } + +napi_value NAPI_IsFileExist(napi_env env, napi_callback_info info) +{ + NFuncArg funcArg(env, info); + if (!funcArg.InitArgs(NARG_CNT::ONE, NARG_CNT::TWO)) { + NError(EINVAL).ThrowErr(env, "Number of arguments unmatched"); + return nullptr; + } + + bool succ = false; + std::unique_ptr uri; + std::tie(succ, uri, std::ignore) = NVal(env, funcArg[NARG_POS::FIRST]).ToUTF8String(); + if (!succ) { + NError(EINVAL).ThrowErr(env, "Invalid uri"); + return nullptr; + } + + FileAccessHelper *fileAccessHelper = GetFileAccessHelper(env, funcArg.GetThisVar()); + if (fileAccessHelper == nullptr) { + return nullptr; + } + + auto result = std::make_shared(); + string uriString(uri.get()); + auto cbExec = [uriString, result, fileAccessHelper]() -> NError { + OHOS::Uri uri(uriString); + *result = fileAccessHelper->IsFileExist(uri); + return NError(ERRNO_NOERR); + }; + auto cbComplete = [result](napi_env env, NError err) -> NVal { + if (err) { + return { env, err.GetNapiErr(env) }; + } + return { NVal::CreateBool(env, *result) }; + }; + + std::string procedureName = "isFileExist"; + NVal thisVar(env, funcArg.GetThisVar()); + if (funcArg.GetArgc() == NARG_CNT::ONE) { + return NAsyncWorkPromise(env, thisVar).Schedule(procedureName, cbExec, cbComplete).val_; + } else { + NVal cb(env, funcArg[NARG_POS::SECOND]); + return NAsyncWorkCallback(env, thisVar, cb).Schedule(procedureName, cbExec, cbComplete).val_; + } + return NVal::CreateUndefined(env).val_; +} } // namespace AppExecFwk } // namespace OHOS \ No newline at end of file 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 5f3836ce..9f04a077 100644 --- a/interfaces/kits/napi/file_access_module/napi_fileaccess_helper.h +++ b/interfaces/kits/napi/file_access_module/napi_fileaccess_helper.h @@ -32,6 +32,7 @@ namespace FileAccessFwk { napi_value NAPI_Rename(napi_env env, napi_callback_info info); napi_value NAPI_ListFile(napi_env env, napi_callback_info info); napi_value NAPI_GetRoots(napi_env env, napi_callback_info info); + napi_value NAPI_IsFileExist(napi_env env, napi_callback_info info); } } // namespace FileAccessFwk -#endif // FILE_ACCESS_NAPI_H \ No newline at end of file +#endif // NAPI_FILEACCESS_HELPER_H \ No newline at end of file -- Gitee From dd081c64259cd58af6e819dd2a873a96d2595281 Mon Sep 17 00:00:00 2001 From: wangjianqiang Date: Wed, 20 Jul 2022 17:01:56 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E4=BF=AE=E6=94=B9codecheck?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: wangjianqiang --- .../innerkits/file_access/src/js_file_access_ext_ability.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frameworks/innerkits/file_access/src/js_file_access_ext_ability.cpp b/frameworks/innerkits/file_access/src/js_file_access_ext_ability.cpp index d77668c8..8ff19f10 100644 --- a/frameworks/innerkits/file_access/src/js_file_access_ext_ability.cpp +++ b/frameworks/innerkits/file_access/src/js_file_access_ext_ability.cpp @@ -499,6 +499,7 @@ std::vector JsFileAccessExtAbility::GetRoots() HILOG_ERROR("end with faild."); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return vec; + } } bool JsFileAccessExtAbility::IsFileExist(const Uri &uri) @@ -520,7 +521,7 @@ bool JsFileAccessExtAbility::IsFileExist(const Uri &uri) return ret; } - if(OHOS::AppExecFwk::UnwrapBoolFromJS2(env, reinterpret_cast(nativeResult), ret)) { + if (OHOS::AppExecFwk::UnwrapBoolFromJS2(env, reinterpret_cast(nativeResult), ret)) { FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return ret; } -- Gitee From 7a4cdb3ab4e14f796ad372c1539678b354243e38 Mon Sep 17 00:00:00 2001 From: wangjianqiang Date: Thu, 21 Jul 2022 09:55:31 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E7=9A=84=E7=B3=BB=E7=BB=9Fhap?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: wangjianqiang --- .../FileExtensionAbility/FileExtensionAbility.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) 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 a9cb36b1..51c07e2a 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 @@ -308,6 +308,19 @@ export default class FileExtAbility extends Extension { } } + isFileExist(sourceFileUri) { + if (!this.checkUri(sourceFileUri)) { + return false; + } + try { + let path = this.getPath(sourceFileUri); + fileio.accessSync(path); + } catch (e) { + return false; + } + return true; + } + listFile(sourceFileUri) { if (!this.checkUri(sourceFileUri)) { return []; -- Gitee