diff --git a/frameworks/innerkits/file_access/include/file_ext_ability.h b/frameworks/innerkits/file_access/include/file_ext_ability.h index 3ceb9fce6305698387feb2bcb4b982c9fa7816a8..8eec212d36ebe8338d5aa3fdc10b28840ec8bf0a 100644 --- a/frameworks/innerkits/file_access/include/file_ext_ability.h +++ b/frameworks/innerkits/file_access/include/file_ext_ability.h @@ -43,6 +43,7 @@ public: virtual int CreateFile(const Uri &parentUri, const std::string &displayName, Uri &newFileUri); virtual int Mkdir(const Uri &parentUri, const std::string &displayName, Uri &newFileUri); virtual int Delete(const Uri &sourceFileUri); + virtual int Move(const Uri &sourceFileUri, const Uri &targetParentUri, Uri &newFileUri); virtual int Rename(const Uri &sourceFileUri, const std::string &displayName, Uri &newFileUri); virtual std::vector ListFile(const Uri &sourceFileUri); diff --git a/frameworks/innerkits/file_access/include/file_ext_proxy.h b/frameworks/innerkits/file_access/include/file_ext_proxy.h index c91c7e29da5908ed87755424ecd9e00b118dd65a..2bb521df687116c81f6fc7d4b3e0b8dea4bd8b3e 100644 --- a/frameworks/innerkits/file_access/include/file_ext_proxy.h +++ b/frameworks/innerkits/file_access/include/file_ext_proxy.h @@ -33,6 +33,7 @@ public: virtual int CreateFile(const Uri &parentUri, const std::string &displayName, Uri &newFileUri) override; virtual int Mkdir(const Uri &parentUri, const std::string &displayName, Uri &newFileUri) override; virtual int Delete(const Uri &sourceFileUri) override; + virtual int Move(const Uri &sourceFileUri, const Uri &targetParentUri, Uri &newFileUri) override; virtual int Rename(const Uri &sourceFileUri, const std::string &displayName, Uri &newFileUri) override; virtual std::vector ListFile(const Uri &sourceFileUri) override; diff --git a/frameworks/innerkits/file_access/include/file_ext_stub.h b/frameworks/innerkits/file_access/include/file_ext_stub.h index cd79d012a76943d9057e58169605ba4c3776b9ba..101f7c5529eae9b9d80e3eaa4711d0940969ac67 100644 --- a/frameworks/innerkits/file_access/include/file_ext_stub.h +++ b/frameworks/innerkits/file_access/include/file_ext_stub.h @@ -34,6 +34,7 @@ private: ErrCode CmdCreateFile(MessageParcel &data, MessageParcel &reply); ErrCode CmdMkdir(MessageParcel &data, MessageParcel &reply); ErrCode CmdDelete(MessageParcel &data, MessageParcel &reply); + ErrCode CmdMove(MessageParcel &data, MessageParcel &reply); ErrCode CmdRename(MessageParcel &data, MessageParcel &reply); ErrCode CmdListFile(MessageParcel &data, MessageParcel &reply); 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 ac4093b0c4a81d8e349c102b89cb115c174e3e1b..d0247efa53a745fd1ef71fcd1ec9c8622124fe33 100644 --- a/frameworks/innerkits/file_access/include/file_ext_stub_impl.h +++ b/frameworks/innerkits/file_access/include/file_ext_stub_impl.h @@ -35,6 +35,7 @@ public: int CreateFile(const Uri &parentUri, const std::string &displayName, Uri &newFileUri) override; int Mkdir(const Uri &parentUri, const std::string &displayName, Uri &newFileUri) override; int Delete(const Uri &sourceFileUri) override; + int Move(const Uri &sourceFileUri, const Uri &targetParentUri, Uri &newFileUri) override; int Rename(const Uri &sourceFileUri, const std::string &displayName, Uri &newFileUri) override; std::vector ListFile(const Uri &sourceFileUri) override; diff --git a/frameworks/innerkits/file_access/include/ifile_ext_base.h b/frameworks/innerkits/file_access/include/ifile_ext_base.h index 5964a4fbe77b15f5710f6273a8bcb4482818a628..3c7ba272749e8bd65cc112a36f8f95c2a3f36b13 100644 --- a/frameworks/innerkits/file_access/include/ifile_ext_base.h +++ b/frameworks/innerkits/file_access/include/ifile_ext_base.h @@ -35,15 +35,17 @@ public: CMD_CREATE_FILE = 2, CMD_MKDIR = 3, CMD_DELETE = 4, - CMD_RENAME = 5, - CMD_LIST_FILE = 6, - CMD_GET_ROOTS = 7 + CMD_MOVE = 5, + CMD_RENAME = 6, + CMD_LIST_FILE = 7, + CMD_GET_ROOTS = 8 }; virtual int OpenFile(const Uri &uri, int flags) = 0; virtual int CreateFile(const Uri &parentUri, const std::string &displayName, Uri &newFileUri) = 0; virtual int Mkdir(const Uri &parentUri, const std::string &displayName, Uri &newFileUri) = 0; virtual int Delete(const Uri &sourceFileUri) = 0; + virtual int Move(const Uri &sourceFileUri, const Uri &targetParentUri, Uri &newFileUri) = 0; virtual int Rename(const Uri &sourceFileUri, const std::string &displayName, Uri &newFileUri) = 0; virtual std::vector ListFile(const Uri &sourceFileUri) = 0; 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 23a7e3b44b4a84a4b93fab81dcd3d3d4ba3db8a8..14ff3942d26b7bac934b453e0b29937abde1c5f1 100644 --- a/frameworks/innerkits/file_access/include/js_file_ext_ability.h +++ b/frameworks/innerkits/file_access/include/js_file_ext_ability.h @@ -47,6 +47,7 @@ public: int CreateFile(const Uri &parentUri, const std::string &displayName, Uri &newFileUri) override; int Mkdir(const Uri &parentUri, const std::string &displayName, Uri &newFileUri) override; int Delete(const Uri &sourceFileUri) override; + int Move(const Uri &sourceFileUri, const Uri &targetParentUri, Uri &newFileUri) override; int Rename(const Uri &sourceFileUri, const std::string &displayName, Uri &newFileUri) override; std::vector ListFile(const Uri &sourceFileUri) override; diff --git a/frameworks/innerkits/file_access/src/file_ext_ability.cpp b/frameworks/innerkits/file_access/src/file_ext_ability.cpp index b1460d4d4b17704af8f70b080de32b9e79f4d101..8cd07d2e4a3848995fd93e5c9305bfcb42557a88 100644 --- a/frameworks/innerkits/file_access/src/file_ext_ability.cpp +++ b/frameworks/innerkits/file_access/src/file_ext_ability.cpp @@ -92,6 +92,11 @@ int FileExtAbility::Delete(const Uri &sourceFileUri) return 0; } +int FileExtAbility::Move(const Uri &sourceFileUri, const Uri &targetParentUri, Uri &newFileUri) +{ + return 0; +} + int FileExtAbility::Rename(const Uri &sourceFileUri, const std::string &displayName, Uri &newFileUri) { HILOG_INFO("%{public}s begin.", __func__); diff --git a/frameworks/innerkits/file_access/src/file_ext_proxy.cpp b/frameworks/innerkits/file_access/src/file_ext_proxy.cpp index 4d9fe5877f5bde5e5842b9e0d230dfa15fa012b8..c092fc088456934ac9805fa9820ec3a4facb6b3a 100644 --- a/frameworks/innerkits/file_access/src/file_ext_proxy.cpp +++ b/frameworks/innerkits/file_access/src/file_ext_proxy.cpp @@ -192,6 +192,56 @@ int FileExtProxy::Delete(const Uri &sourceFileUri) return ret; } +int FileExtProxy::Move(const Uri &sourceFileUri, const Uri &targetParentUri, Uri &newFileUri) +{ + int ret = -1; + MessageParcel data; + if (!data.WriteInterfaceToken(FileExtProxy::GetDescriptor())) { + HILOG_ERROR("%{public}s WriteInterfaceToken failed", __func__); + return ret; + } + + if (!data.WriteParcelable(&sourceFileUri)) { + HILOG_ERROR("%{public}s fail to WriteParcelable sourceFileUri", __func__); + return ret; + } + + if (!data.WriteParcelable(&targetParentUri)) { + HILOG_ERROR("%{public}s fail to WriteParcelable targetParentUri", __func__); + return ret; + } + + if (!data.WriteParcelable(&newFileUri)) { + HILOG_ERROR("%{public}s fail to WriteParcelable newFileUri", __func__); + return ret; + } + + MessageParcel reply; + MessageOption option; + int32_t err = Remote()->SendRequest(CMD_MOVE, data, reply, option); + if (err != NO_ERROR) { + HILOG_ERROR("%{public}s fail to SendRequest. err: %d", __func__, err); + return ret; + } + + ret = reply.ReadInt32(); + if (ret < 0) { + HILOG_ERROR("%{public}s fail to ReadInt32 ret", __func__); + return ret; + } + + std::unique_ptr tempUri(reply.ReadParcelable()); + if (!tempUri) { + HILOG_ERROR("%{public}s ReadParcelable value is nullptr.", __func__); + ret = -1; + return ret; + } + + newFileUri = Uri(*tempUri); + HILOG_INFO("%{public}s end successfully, newFileUri=%{public}s", __func__, tempUri->ToString().c_str()); + return ret; +} + int FileExtProxy::Rename(const Uri &sourceFileUri, const std::string &displayName, Uri &newFileUri) { HILOG_INFO("%{public}s begin.", __func__); diff --git a/frameworks/innerkits/file_access/src/file_ext_stub.cpp b/frameworks/innerkits/file_access/src/file_ext_stub.cpp index 45ce9b783f53dbf83068236814d9084f985d0cb4..5a684593c9075af4099307f11c7763fb5f539779 100644 --- a/frameworks/innerkits/file_access/src/file_ext_stub.cpp +++ b/frameworks/innerkits/file_access/src/file_ext_stub.cpp @@ -25,6 +25,7 @@ FileExtStub::FileExtStub() stubFuncMap_[CMD_CREATE_FILE] = &FileExtStub::CmdCreateFile; stubFuncMap_[CMD_MKDIR] = &FileExtStub::CmdMkdir; stubFuncMap_[CMD_DELETE] = &FileExtStub::CmdDelete; + stubFuncMap_[CMD_MOVE] = &FileExtStub::CmdMove; stubFuncMap_[CMD_RENAME] = &FileExtStub::CmdRename; stubFuncMap_[CMD_LIST_FILE] = &FileExtStub::CmdListFile; stubFuncMap_[CMD_GET_ROOTS] = &FileExtStub::CmdGetRoots; @@ -187,6 +188,44 @@ ErrCode FileExtStub::CmdDelete(MessageParcel &data, MessageParcel &reply) return NO_ERROR; } +ErrCode FileExtStub::CmdMove(MessageParcel &data, MessageParcel &reply) +{ + std::shared_ptr sourceFileUri(data.ReadParcelable()); + if (sourceFileUri == nullptr) { + HILOG_ERROR("%{public}s sourceFileUri is nullptr", __func__); + return ERR_INVALID_VALUE; + } + std::shared_ptr targetParentUri(data.ReadParcelable()); + if (targetParentUri == nullptr) { + HILOG_ERROR("%{public}s targetParentUri is nullptr", __func__); + return ERR_INVALID_VALUE; + } + std::shared_ptr fileUriNew(data.ReadParcelable()); + if (fileUriNew == nullptr) { + HILOG_ERROR("%{public}s fileUriNew is nullptr", __func__); + return ERR_INVALID_VALUE; + } + + int ret = Move(*sourceFileUri, *targetParentUri, *fileUriNew); + if (ret < 0) { + HILOG_ERROR("%{public}s fail, ret is %{pubilc}d", __func__, ret); + return ERR_INVALID_VALUE; + } + + if (!reply.WriteInt32(ret)) { + HILOG_ERROR("%{public}s fail to WriteInt32 ret", __func__); + return ERR_INVALID_VALUE; + } + + if (!reply.WriteParcelable(&(*fileUriNew))) { + HILOG_ERROR("%{public}s fail to WriteParcelable type", __func__); + return ERR_INVALID_VALUE; + } + + HILOG_INFO("%{public}s end. ret:%d, newFileUri = %{public}s", __func__, ret, fileUriNew->ToString().c_str()); + return NO_ERROR; +} + ErrCode FileExtStub::CmdRename(MessageParcel &data, MessageParcel &reply) { HILOG_INFO("%{public}s begin.", __func__); 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 528e8c3794f8a8dbb59c9ab60175c0000eee2d60..4afcfd6d50e88ff64d561b8bf3a6dff07680a305 100644 --- a/frameworks/innerkits/file_access/src/file_ext_stub_impl.cpp +++ b/frameworks/innerkits/file_access/src/file_ext_stub_impl.cpp @@ -84,6 +84,20 @@ int FileExtStubImpl::Delete(const Uri &sourceFileUri) return ret; } +int FileExtStubImpl::Move(const Uri &sourceFileUri, const Uri &targetParentUri, Uri &newFileUri) +{ + int ret = -1; + auto extension = GetOwner(); + if (extension == nullptr) { + HILOG_ERROR("%{public}s end failed.", __func__); + return ret; + } + ret = extension->Move(sourceFileUri, targetParentUri, newFileUri); + HILOG_INFO("%{public}s end successfully, return ret:%{public}d, %{public}s", + __func__, ret, newFileUri.ToString().c_str()); + return ret; +} + int FileExtStubImpl::Rename(const Uri &sourceFileUri, const std::string &displayName, Uri &newFileUri) { HILOG_INFO("%{public}s begin.", __func__); 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 1e6f0334cbd6a9e2b84e727abbc18ba3b330e5f2..a85bc33075c6b9d40d7dda039f004c38f0caf350 100644 --- a/frameworks/innerkits/file_access/src/js_file_ext_ability.cpp +++ b/frameworks/innerkits/file_access/src/js_file_ext_ability.cpp @@ -276,6 +276,37 @@ int JsFileExtAbility::Delete(const Uri &sourceFileUri) return ret; } +int JsFileExtAbility::Move(const Uri &sourceFileUri, const Uri &targetParentUri, Uri &newFileUri) +{ + HandleScope handleScope(jsRuntime_); + napi_env env = reinterpret_cast(&jsRuntime_.GetNativeEngine()); + + napi_value napiSourceFileUri = nullptr; + napi_create_string_utf8(env, sourceFileUri.ToString().c_str(), NAPI_AUTO_LENGTH, &napiSourceFileUri); + napi_value napiTargetParentUri = nullptr; + napi_create_string_utf8(env, targetParentUri.ToString().c_str(), NAPI_AUTO_LENGTH, &napiTargetParentUri); + + NativeValue* nativeSourceFileUri = reinterpret_cast(napiSourceFileUri); + NativeValue* nativeTargetParentUri = reinterpret_cast(napiTargetParentUri); + NativeValue* argv[] = {nativeSourceFileUri, nativeTargetParentUri}; + NativeValue* nativeResult = CallObjectMethod("move", argv, ARGC_TWO); + int ret = -1; + if (nativeResult == nullptr) { + HILOG_ERROR("%{public}s call move with return null.", __func__); + return ret; + } + std::string uriStr = OHOS::AppExecFwk::UnwrapStringFromJS(env, reinterpret_cast(nativeResult)); + if (uriStr.empty()) { + HILOG_ERROR("%{public}s call move with return empty.", __func__); + return ret; + } else { + ret = NO_ERROR; + } + newFileUri = Uri(uriStr); + HILOG_INFO("%{public}s end. return fd:%{public}d, newFileUri = %{public}s", __func__, ret, uriStr.c_str()); + return ret; +} + int JsFileExtAbility::Rename(const Uri &sourceFileUri, const std::string &displayName, Uri &newFileUri) { HILOG_INFO("%{public}s begin.", __func__);