diff --git a/interfaces/kits/js/src/mod_fs/common_func.cpp b/interfaces/kits/js/src/mod_fs/common_func.cpp index 0761373ded9d4f121c8e10a91fc495426a0dd506..8c533096011109e50c4d29d91c522dc06bb1ab08 100644 --- a/interfaces/kits/js/src/mod_fs/common_func.cpp +++ b/interfaces/kits/js/src/mod_fs/common_func.cpp @@ -263,6 +263,22 @@ tuple, void *, int64_t, bool, int64_t> CommonFunc::GetW } return { true, move(bufferGuard), buf, retLen, hasPos, retPos }; } + +string CommonFunc::GetModeFromFlags(int flags) +{ + static string RDONLY = "r"; + static string WRONLY = "w"; + static string APPEND = "a"; + static 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; +} } // namespace ModuleFileIO } // namespace FileManagement } // namespace OHOS diff --git a/interfaces/kits/js/src/mod_fs/common_func.h b/interfaces/kits/js/src/mod_fs/common_func.h index 9893205087bd56427d71bfdaa6d866b384a6eae8..ebaaeba1b8823ba5d671c65cfbac0a180ffaa47e 100644 --- a/interfaces/kits/js/src/mod_fs/common_func.h +++ b/interfaces/kits/js/src/mod_fs/common_func.h @@ -55,6 +55,7 @@ struct CommonFunc { static std::tuple, std::unique_ptr> GetCopyPathArg(napi_env env, napi_value srcPath, napi_value dstPath); + static std::string GetModeFromFlags(int flags); static void fs_req_cleanup(uv_fs_t* req); }; } // namespace ModuleFileIO diff --git a/interfaces/kits/js/src/mod_fs/properties/open.cpp b/interfaces/kits/js/src/mod_fs/properties/open.cpp index bcd429fc8f3b2a3dfdfc0c4751466849d3001d61..886a6f9cb50a07b055aa6ecb37695af3d4508029 100644 --- a/interfaces/kits/js/src/mod_fs/properties/open.cpp +++ b/interfaces/kits/js/src/mod_fs/properties/open.cpp @@ -77,7 +77,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 +88,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 +112,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 +168,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 8bf564bbb12504369d02c3c01223895a12c84411..4103e5408d1fb2b296257e8e8d06068e4d7c2bd3 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