From c955ead8bd22641a1babae2ee5b4e573668bb9bc Mon Sep 17 00:00:00 2001 From: "zhangkaixiang5@huawei.com" Date: Tue, 31 Jan 2023 11:27:38 +0800 Subject: [PATCH] support to open media files by write mode. Signed-off-by: zhangkaixiang5@huawei.com --- interfaces/kits/js/src/mod_fs/common_func.cpp | 16 ++++++++++++++++ interfaces/kits/js/src/mod_fs/common_func.h | 1 + .../kits/js/src/mod_fs/properties/open.cpp | 11 ++++++----- interfaces/kits/js/src/mod_fs/properties/open.h | 1 - 4 files changed, 23 insertions(+), 6 deletions(-) diff --git a/interfaces/kits/js/src/mod_fs/common_func.cpp b/interfaces/kits/js/src/mod_fs/common_func.cpp index 0761373de..7e958a6cd 100644 --- a/interfaces/kits/js/src/mod_fs/common_func.cpp +++ b/interfaces/kits/js/src/mod_fs/common_func.cpp @@ -131,6 +131,22 @@ void CommonFunc::fs_req_cleanup(uv_fs_t* req) } } +string CommonFunc::GetModeFromFlags(int flags) +{ + const string RDONLY = "r"; + const string WRONLY = "w"; + const string APPEND = "a"; + const string TRUNC = "t"; + string mode = RDONLY; + mode += (((flags & O_RDWR) == O_RDWR) ? WRONLY : ""); + mode = (((flags & O_WRONLY) == O_WRONLY) ? WRONLY : mode); + if (mode != RDONLY) { + mode += ((flags & O_TRUNC) ? TRUNC : ""); + mode += ((flags & O_APPEND) ? APPEND : ""); + } + return mode; +} + tuple, unique_ptr> CommonFunc::GetCopyPathArg(napi_env env, napi_value srcPath, napi_value dstPath) diff --git a/interfaces/kits/js/src/mod_fs/common_func.h b/interfaces/kits/js/src/mod_fs/common_func.h index 989320508..29c6812c5 100644 --- a/interfaces/kits/js/src/mod_fs/common_func.h +++ b/interfaces/kits/js/src/mod_fs/common_func.h @@ -56,6 +56,7 @@ struct CommonFunc { napi_value srcPath, napi_value dstPath); static void fs_req_cleanup(uv_fs_t* req); + static std::string GetModeFromFlags(int flags); }; } // namespace ModuleFileIO } // namespace FileManagement diff --git a/interfaces/kits/js/src/mod_fs/properties/open.cpp b/interfaces/kits/js/src/mod_fs/properties/open.cpp index bcd429fc8..dc97db32c 100644 --- a/interfaces/kits/js/src/mod_fs/properties/open.cpp +++ b/interfaces/kits/js/src/mod_fs/properties/open.cpp @@ -40,7 +40,8 @@ static tuple GetJsFlags(napi_env env, const NFuncArg &funcArg) bool succ = false; if (funcArg.GetArgc() >= NARG_CNT::TWO && NVal(env, funcArg[NARG_POS::SECOND]).TypeIs(napi_number)) { tie(succ, mode) = NVal(env, funcArg[NARG_POS::SECOND]).ToInt32(); - if (!succ) { + int invalidMode = (O_WRONLY | O_RDWR); + if (!succ || ((mode & invalidMode) == invalidMode)) { HILOGE("Invalid mode"); NError(EINVAL).ThrowErr(env); return { false, mode }; @@ -77,7 +78,7 @@ static NVal InstantiateFile(napi_env env, int fd, string pathOrUri, bool isUri) return { env, objFile }; } -static int OpenFileByDatashare(napi_env env, napi_value argv, string path) +static int OpenFileByDatashare(napi_env env, napi_value argv, string path, int flags) { std::shared_ptr dataShareHelper = nullptr; int fd = -1; @@ -88,7 +89,7 @@ static int OpenFileByDatashare(napi_env env, napi_value argv, string path) dataShareHelper = DataShare::DataShareHelper::Creator(remote->AsObject(), MEDIALIBRARY_DATA_URI); Uri uri(path); - fd = dataShareHelper->OpenFile(uri, MEDIA_FILEMODE_READONLY); + fd = dataShareHelper->OpenFile(uri, CommonFunc::GetModeFromFlags(flags)); return fd; } @@ -112,7 +113,7 @@ napi_value Open::Sync(napi_env env, napi_callback_info info) return nullptr; } if (DistributedFS::ModuleRemoteUri::RemoteUri::IsMediaUri(path.get())) { - auto fd = OpenFileByDatashare(env, funcArg[NARG_POS::FIRST], path.get()); + auto fd = OpenFileByDatashare(env, funcArg[NARG_POS::FIRST], path.get(), mode); if (fd >= 0) { auto file = InstantiateFile(env, fd, path.get(), true).val_; return file; @@ -168,7 +169,7 @@ napi_value Open::Async(napi_env env, napi_callback_info info) auto argv = funcArg[NARG_POS::FIRST]; auto cbExec = [arg, argv, path = string(path.get()), mode = mode, env = env]() -> NError { if (DistributedFS::ModuleRemoteUri::RemoteUri::IsMediaUri(path)) { - auto fd = OpenFileByDatashare(env, argv, path); + auto fd = OpenFileByDatashare(env, argv, path, mode); if (fd >= 0) { arg->fd = fd; arg->path = ""; diff --git a/interfaces/kits/js/src/mod_fs/properties/open.h b/interfaces/kits/js/src/mod_fs/properties/open.h index 8bf564bbb..4103e5408 100644 --- a/interfaces/kits/js/src/mod_fs/properties/open.h +++ b/interfaces/kits/js/src/mod_fs/properties/open.h @@ -38,7 +38,6 @@ public: const std::string PROCEDURE_OPEN_NAME = "FileIOOpen"; const std::string MEDIALIBRARY_DATA_URI = "datashare:///media"; -const std::string MEDIA_FILEMODE_READONLY = "r"; } // namespace ModuleFileIO } // namespace FileManagement } // namespace OHOS -- Gitee