diff --git a/frameworks/innerkits/file_access/BUILD.gn b/frameworks/innerkits/file_access/BUILD.gn index 3a391aa6588d196c46c8c0581053b688ac1bcb5e..c7c1b5e60e0e8a50bda6cb2b619c306f4c0e661b 100644 --- a/frameworks/innerkits/file_access/BUILD.gn +++ b/frameworks/innerkits/file_access/BUILD.gn @@ -50,14 +50,14 @@ ohos_shared_library("file_access_ability_kit") { include_dirs = [] sources = [ + "src/file_access_helper.cpp", "src/file_ext_ability.cpp", + "src/file_ext_connection.cpp", "src/file_ext_proxy.cpp", - "src/file_ext_stub_impl.cpp", "src/file_ext_stub.cpp", + "src/file_ext_stub_impl.cpp", "src/js_file_ext_ability.cpp", - "src/napi_common_fileaccess.cpp", - "src/file_access_helper.cpp", - "src/file_ext_connection.cpp", + "src/napi_common_fileaccess.cpp" ] configs = [ ":ability_config" ] public_configs = [ diff --git a/frameworks/innerkits/file_access/include/file_ext_ability.h b/frameworks/innerkits/file_access/include/file_ext_ability.h index b099e5b5860291bc826d8d6a43b3fe1504140eda..5883aa37717d6baa870c706b136dc02d0da8e7dd 100644 --- a/frameworks/innerkits/file_access/include/file_ext_ability.h +++ b/frameworks/innerkits/file_access/include/file_ext_ability.h @@ -37,6 +37,18 @@ public: const sptr &token) override; static FileExtAbility* Create(const std::unique_ptr& runtime); + + virtual int OpenFile(const Uri &uri, int flags); + 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 Rename(const Uri &sourceFileUri, const std::string &displayName, Uri &newFileUri); + + /** + * @brief Set a creator function. + * + * @param creator The function for create a file extension ability. + */ static void SetCreator(const CreatorFunc& creator); private: static CreatorFunc creator_; diff --git a/frameworks/innerkits/file_access/include/file_ext_proxy.h b/frameworks/innerkits/file_access/include/file_ext_proxy.h index 5e96325da87ba9141375654cd5c5ef799fcaf3f9..6d11b3558db168d4c070976598d480936be7b561 100644 --- a/frameworks/innerkits/file_access/include/file_ext_proxy.h +++ b/frameworks/innerkits/file_access/include/file_ext_proxy.h @@ -29,6 +29,11 @@ public: virtual ~FileExtProxy() {} + virtual int OpenFile(const Uri &uri, int flags) override; + 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 Rename(const Uri &sourceFileUri, const std::string &displayName, Uri &newFileUri) 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 a69bc95f5a2921719f3dca2e1596ffce7926a802..fd3748a9471c8effb8d217c368b007dce5ed49a8 100644 --- a/frameworks/innerkits/file_access/include/file_ext_stub.h +++ b/frameworks/innerkits/file_access/include/file_ext_stub.h @@ -30,6 +30,12 @@ public: ~FileExtStub(); int OnRemoteRequest(uint32_t code, MessageParcel& data, MessageParcel& reply, MessageOption& option) override; private: + ErrCode CmdOpenFile(MessageParcel &data, MessageParcel &reply); + ErrCode CmdCreateFile(MessageParcel &data, MessageParcel &reply); + ErrCode CmdMkdir(MessageParcel &data, MessageParcel &reply); + ErrCode CmdDelete(MessageParcel &data, MessageParcel &reply); + ErrCode CmdRename(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 e5a63868a8b87692e50a5fac93cc0cc1c40ab66a..c27a5ccbfd99133df77cf5afe9074b4bb04bd66d 100644 --- a/frameworks/innerkits/file_access/include/file_ext_stub_impl.h +++ b/frameworks/innerkits/file_access/include/file_ext_stub_impl.h @@ -31,6 +31,11 @@ public: virtual ~FileExtStubImpl() {} + int OpenFile(const Uri &uri, int flags) override; + 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 Rename(const Uri &sourceFileUri, const std::string &displayName, Uri &newFileUri) 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 aef51e0000ea1477fc8293abe1a37d25a80989c3..2f786db1657705fe99568b67759fd0bda95dcb0c 100644 --- a/frameworks/innerkits/file_access/include/ifile_ext_base.h +++ b/frameworks/innerkits/file_access/include/ifile_ext_base.h @@ -26,7 +26,21 @@ namespace OHOS { namespace FileAccessFwk { class IFileExtBase : public IRemoteBroker { public: - DECLARE_INTERFACE_DESCRIPTOR(u"OHOS.AppExecFwk.IFileExtBase"); + DECLARE_INTERFACE_DESCRIPTOR(u"OHOS.FileAccessFwk.IFileExtBase"); + + enum { + CMD_OPEN_FILE = 1, + CMD_CREATE_FILE = 2, + CMD_MKDIR = 3, + CMD_DELETE = 4, + CMD_RENAME = 5 + }; + + 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 Rename(const Uri &sourceFileUri, const std::string &displayName, Uri &newFileUri) = 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 662a7f08155f9607f10c00c4f84c184c3e3551e9..6c398613a9914ec2c1e88d41318addc37ac4556b 100644 --- a/frameworks/innerkits/file_access/include/js_file_ext_ability.h +++ b/frameworks/innerkits/file_access/include/js_file_ext_ability.h @@ -41,6 +41,11 @@ public: sptr OnConnect(const AAFwk::Want &want) override; + int OpenFile(const Uri &uri, int flags) override; + 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 Rename(const Uri &sourceFileUri, const std::string &displayName, Uri &newFileUri) 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 8c60f6088480457be55671210e6c0b4319e0489e..60d765a1b8cbf4760e5cec202c2e3d7301af093f 100644 --- a/frameworks/innerkits/file_access/src/file_ext_ability.cpp +++ b/frameworks/innerkits/file_access/src/file_ext_ability.cpp @@ -34,24 +34,24 @@ void FileExtAbility::SetCreator(const CreatorFunc& creator) FileExtAbility* FileExtAbility::Create(const std::unique_ptr& runtime) { - HILOG_INFO("tag dsa %{public}s begin.", __func__); + HILOG_INFO("%{public}s begin.", __func__); if (!runtime) { return new FileExtAbility(); } if (creator_) { return creator_(runtime); } - HILOG_INFO("tag dsa FileExtAbility::Create runtime"); + HILOG_INFO("%{public}s runtime", __func__); switch (runtime->GetLanguage()) { case Runtime::Language::JS: - HILOG_INFO("tag dsa Runtime::Language::JS --> JsFileExtAbility"); + HILOG_INFO("%{public}s Runtime::Language::JS --> JsFileExtAbility", __func__); return JsFileExtAbility::Create(runtime); default: - HILOG_INFO("tag dsa default --> FileExtAbility"); + HILOG_INFO("%{public}s default --> FileExtAbility", __func__); return new FileExtAbility(); } - HILOG_INFO("tag dsa %{public}s begin.", __func__); + HILOG_INFO("%{public}s begin.", __func__); } void FileExtAbility::Init(const std::shared_ptr &record, @@ -59,9 +59,44 @@ void FileExtAbility::Init(const std::shared_ptr &record, std::shared_ptr &handler, const sptr &token) { - HILOG_INFO("tag dsa %{public}s begin.", __func__); + HILOG_INFO("%{public}s begin.", __func__); ExtensionBase<>::Init(record, application, handler, token); - HILOG_INFO("tag dsa %{public}s end.", __func__); + HILOG_INFO("%{public}s end.", __func__); +} + +int FileExtAbility::OpenFile(const Uri &uri, int flags) +{ + HILOG_INFO("%{public}s begin.", __func__); + HILOG_INFO("%{public}s end.", __func__); + return 0; +} + +int FileExtAbility::CreateFile(const Uri &parentUri, const std::string &displayName, Uri &newFileUri) +{ + HILOG_INFO("%{public}s begin.", __func__); + HILOG_INFO("%{public}s end.", __func__); + return 0; +} + +int FileExtAbility::Mkdir(const Uri &parentUri, const std::string &displayName, Uri &newFileUri) +{ + HILOG_INFO("%{public}s begin.", __func__); + HILOG_INFO("%{public}s end.", __func__); + return 0; +} + +int FileExtAbility::Delete(const Uri &sourceFileUri) +{ + HILOG_INFO("%{public}s begin.", __func__); + HILOG_INFO("%{public}s end.", __func__); + return 0; +} + +int FileExtAbility::Rename(const Uri &sourceFileUri, const std::string &displayName, Uri &newFileUri) +{ + HILOG_INFO("%{public}s begin.", __func__); + HILOG_INFO("%{public}s end.", __func__); + return 0; } } // 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 aa411716c21b06e9f41ba07e82e45d5537669ea8..2c5e9d39856b7b4fcebc472aafdd71ee10bafce8 100644 --- a/frameworks/innerkits/file_access/src/file_ext_proxy.cpp +++ b/frameworks/innerkits/file_access/src/file_ext_proxy.cpp @@ -19,5 +19,228 @@ namespace OHOS { namespace FileAccessFwk { +int FileExtProxy::OpenFile(const Uri &uri, int flags) +{ + HILOG_INFO("%{public}s begin.", __func__); + int fd = -1; + MessageParcel data; + if (!data.WriteInterfaceToken(FileExtProxy::GetDescriptor())) { + HILOG_ERROR("%{public}s WriteInterfaceToken failed", __func__); + return fd; + } + + if (!data.WriteParcelable(&uri)) { + HILOG_ERROR("%{public}s fail to WriteParcelable uri", __func__); + return fd; + } + + if (!data.WriteInt32(flags)) { + HILOG_ERROR("%{public}s fail to WriteString mode", __func__); + return fd; + } + + MessageParcel reply; + MessageOption option; + int32_t err = Remote()->SendRequest(CMD_OPEN_FILE, data, reply, option); + if (err != NO_ERROR) { + HILOG_ERROR("%{public}s fail to SendRequest. err: %d", __func__, err); + return fd; + } + + fd = reply.ReadFileDescriptor(); + if (fd == -1) { + HILOG_ERROR("%{public}s fail to ReadFileDescriptor fd", __func__); + return fd; + } + + HILOG_INFO("%{public}s end successfully, return fd=%{public}d", __func__, fd); + return fd; +} + +int FileExtProxy::CreateFile(const Uri &parentUri, const std::string &displayName, Uri &newFileUri) +{ + HILOG_INFO("%{public}s begin.", __func__); + int ret = -1; + MessageParcel data; + if (!data.WriteInterfaceToken(FileExtProxy::GetDescriptor())) { + HILOG_ERROR("%{public}s WriteInterfaceToken failed", __func__); + return ret; + } + + if (!data.WriteParcelable(&parentUri)) { + HILOG_ERROR("%{public}s fail to WriteParcelable parentUri", __func__); + return ret; + } + + if (!data.WriteString(displayName)) { + HILOG_ERROR("%{public}s fail to WriteString mode", __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_CREATE_FILE, 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, tempUri=%{public}s", __func__, tempUri->ToString().c_str()); + return ret; +} + +int FileExtProxy::Mkdir(const Uri &parentUri, const std::string &displayName, Uri &newFileUri) +{ + HILOG_INFO("%{public}s begin.", __func__); + int ret = -1; + MessageParcel data; + if (!data.WriteInterfaceToken(FileExtProxy::GetDescriptor())) { + HILOG_ERROR("%{public}s WriteInterfaceToken failed", __func__); + return ret; + } + + if (!data.WriteParcelable(&parentUri)) { + HILOG_ERROR("%{public}s fail to WriteParcelable parentUri", __func__); + return ret; + } + + if (!data.WriteString(displayName)) { + HILOG_ERROR("%{public}s fail to WriteString displayName", __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_MKDIR, 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, tempUri=%{public}s", __func__, tempUri->ToString().c_str()); + return ret; +} + +int FileExtProxy::Delete(const Uri &sourceFileUri) +{ + HILOG_INFO("%{public}s begin.", __func__); + 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; + } + + MessageParcel reply; + MessageOption option; + int32_t err = Remote()->SendRequest(CMD_DELETE, 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; + } + + HILOG_INFO("%{public}s end successfully, return ret=%{public}d", __func__, ret); + return ret; +} + +int FileExtProxy::Rename(const Uri &sourceFileUri, const std::string &displayName, Uri &newFileUri) +{ + HILOG_INFO("%{public}s begin.", __func__); + 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.WriteString(displayName)) { + HILOG_ERROR("%{public}s fail to WriteString displayName", __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_RENAME, 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, tempUri=%{public}s", __func__, tempUri->ToString().c_str()); + return ret; +} } // 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 6dffcb94af4f169da4dfb1f785f32fb43bdcdd1f..5525628d50b4843853525e891330f6fa12f5cca9 100644 --- a/frameworks/innerkits/file_access/src/file_ext_stub.cpp +++ b/frameworks/innerkits/file_access/src/file_ext_stub.cpp @@ -22,6 +22,11 @@ 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__); } @@ -51,5 +56,175 @@ int FileExtStub::OnRemoteRequest(uint32_t code, MessageParcel& data, MessageParc HILOG_INFO("%{public}s remote request unhandled: %{public}d", __func__, code); return IPCObjectStub::OnRemoteRequest(code, data, reply, option); } + +ErrCode FileExtStub::CmdOpenFile(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; + } + int flags = data.ReadInt32(); + if (flags < 0) { + HILOG_ERROR("%{public}s mode is invalid", __func__); + return ERR_INVALID_VALUE; + } + int fd = OpenFile(*uri, flags); + if (fd < 0) { + HILOG_ERROR("%{public}s OpenFile fail, fd is %{pubilc}d", __func__, fd); + return ERR_INVALID_VALUE; + } + HILOG_INFO("%{public}s retutn fd: %{public}d.", __func__, fd); + + if (!reply.WriteFileDescriptor(fd)) { + HILOG_ERROR("%{public}s fail to WriteFileDescriptor fd", __func__); + return ERR_INVALID_VALUE; + } + HILOG_INFO("%{public}s end.", __func__); + return NO_ERROR; +} + +ErrCode FileExtStub::CmdCreateFile(MessageParcel &data, MessageParcel &reply) +{ + HILOG_INFO("%{public}s begin.", __func__); + std::shared_ptr parentUri(data.ReadParcelable()); + if (parentUri == nullptr) { + HILOG_ERROR("%{public}s parentUri is nullptr", __func__); + return ERR_INVALID_VALUE; + } + std::string displayName = data.ReadString(); + if (displayName.empty()) { + HILOG_ERROR("%{public}s mode 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 = CreateFile(*parentUri, displayName, *fileUriNew); + if (ret < 0) { + HILOG_ERROR("%{public}s CreateFile 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, fileUriNew = %{public}s", __func__, ret, fileUriNew->ToString().c_str()); + HILOG_INFO("%{public}s end. fileUriNew = %{public}s", __func__, fileUriNew->ToString().c_str()); + return NO_ERROR; +} + +ErrCode FileExtStub::CmdMkdir(MessageParcel &data, MessageParcel &reply) +{ + HILOG_INFO("%{public}s begin.", __func__); + std::shared_ptr parentUri(data.ReadParcelable()); + if (parentUri == nullptr) { + HILOG_ERROR("%{public}s parentUri is nullptr", __func__); + return ERR_INVALID_VALUE; + } + std::string displayName = data.ReadString(); + if (displayName.empty()) { + HILOG_ERROR("%{public}s mode 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 = Mkdir(*parentUri, displayName, *fileUriNew); + if (ret < 0) { + HILOG_ERROR("%{public}s Mkdir 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, fileUriNew = %{public}s", __func__, ret, fileUriNew->ToString().c_str()); + HILOG_INFO("%{public}s end. fileUriNew = %{public}s", __func__, fileUriNew->ToString().c_str()); + return NO_ERROR; +} + +ErrCode FileExtStub::CmdDelete(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; + } + + int ret = Delete(*uri); + if (ret < 0) { + HILOG_ERROR("%{public}s Delete fail, ret is %{pubilc}d", __func__, ret); + return ERR_INVALID_VALUE; + } + + if (!reply.WriteInt32(ret)) { + HILOG_ERROR("%{public}s fail to WriteFileDescriptor ret", __func__); + return ERR_INVALID_VALUE; + } + HILOG_INFO("%{public}s end.", __func__); + return NO_ERROR; +} + +ErrCode FileExtStub::CmdRename(MessageParcel &data, MessageParcel &reply) +{ + HILOG_INFO("%{public}s begin.", __func__); + std::shared_ptr sourceFileUri(data.ReadParcelable()); + if (sourceFileUri == nullptr) { + HILOG_ERROR("%{public}s sourceFileUri is nullptr", __func__); + return ERR_INVALID_VALUE; + } + std::string displayName = data.ReadString(); + if (displayName.empty()) { + HILOG_ERROR("%{public}s mode 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 = Rename(*sourceFileUri, displayName, *fileUriNew); + if (ret < 0) { + HILOG_ERROR("%{public}s Rename 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, fileUriNew = %{public}s", __func__, ret, fileUriNew->ToString().c_str()); + HILOG_INFO("%{public}s end. fileUriNew = %{public}s", __func__, fileUriNew->ToString().c_str()); + 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 50a76fd24a9b17a435f1c49c1554332e63c370f4..a649e159cc339e588b4016cebf8a7c27a2993b91 100644 --- a/frameworks/innerkits/file_access/src/file_ext_stub_impl.cpp +++ b/frameworks/innerkits/file_access/src/file_ext_stub_impl.cpp @@ -25,5 +25,78 @@ std::shared_ptr FileExtStubImpl::GetOwner() HILOG_INFO("%{public}s end.", __func__); return extension_; } + +int FileExtStubImpl::OpenFile(const Uri &uri, int flags) +{ + HILOG_INFO("%{public}s begin.", __func__); + int ret = -1; + auto extension = GetOwner(); + if (extension == nullptr) { + HILOG_ERROR("%{public}s end failed.", __func__); + return ret; + } + ret = extension->OpenFile(uri, flags); + HILOG_INFO("%{public}s end successfully, return fd:%{public}d", __func__, ret); + return ret; +} + +int FileExtStubImpl::CreateFile(const Uri &parentUri, const std::string &displayName, Uri &newFileUri) +{ + HILOG_INFO("%{public}s begin.", __func__); + int ret = -1; + auto extension = GetOwner(); + if (extension == nullptr) { + HILOG_ERROR("%{public}s end failed.", __func__); + return ret; + } + ret = extension->CreateFile(parentUri, displayName, newFileUri); + HILOG_INFO("%{public}s end successfully, return ret:%{public}d, %{public}s", + __func__, ret, newFileUri.ToString().c_str()); + return ret; +} + +int FileExtStubImpl::Mkdir(const Uri &parentUri, const std::string &displayName, Uri &newFileUri) +{ + HILOG_INFO("%{public}s begin.", __func__); + int ret = -1; + auto extension = GetOwner(); + if (extension == nullptr) { + HILOG_ERROR("%{public}s end failed.", __func__); + return ret; + } + ret = extension->Mkdir(parentUri, displayName, newFileUri); + HILOG_INFO("%{public}s end successfully, return ret:%{public}d, %{public}s", + __func__, ret, newFileUri.ToString().c_str()); + return ret; +} + +int FileExtStubImpl::Delete(const Uri &sourceFileUri) +{ + HILOG_INFO("%{public}s begin.", __func__); + int ret = -1; + auto extension = GetOwner(); + if (extension == nullptr) { + HILOG_ERROR("%{public}s end failed.", __func__); + return ret; + } + ret = extension->Delete(sourceFileUri); + HILOG_INFO("%{public}s end successfully, return fd:%{public}d", __func__, ret); + return ret; +} + +int FileExtStubImpl::Rename(const Uri &sourceFileUri, const std::string &displayName, Uri &newFileUri) +{ + HILOG_INFO("%{public}s begin.", __func__); + int ret = -1; + auto extension = GetOwner(); + if (extension == nullptr) { + HILOG_ERROR("%{public}s end failed.", __func__); + return ret; + } + ret = extension->Rename(sourceFileUri, displayName, newFileUri); + HILOG_INFO("%{public}s end successfully, return ret:%{public}d, %{public}s", + __func__, ret, newFileUri.ToString().c_str()); + return ret; +} } // 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 9a3efd550c31cdd91ab3bdd82ca19d3b7202caea..51b5ff09740feb9fd2820a2cf896d113c7ce271d 100644 --- a/frameworks/innerkits/file_access/src/js_file_ext_ability.cpp +++ b/frameworks/innerkits/file_access/src/js_file_ext_ability.cpp @@ -18,12 +18,14 @@ #include "extension_context.h" #include "ability_info.h" #include "accesstoken_kit.h" +#include "file_ext_stub_impl.h" #include "hilog_wrapper.h" #include "ipc_skeleton.h" #include "js_runtime.h" #include "js_runtime_utils.h" #include "napi/native_api.h" #include "napi/native_node_api.h" +#include "napi_common_fileaccess.h" #include "napi_common_util.h" #include "napi_common_want.h" #include "napi_remote_object.h" @@ -32,6 +34,7 @@ namespace OHOS { namespace FileAccessFwk { namespace { constexpr size_t ARGC_ONE = 1; +constexpr size_t ARGC_TWO = 2; } using namespace OHOS::AppExecFwk; @@ -40,7 +43,8 @@ using OHOS::Security::AccessToken::AccessTokenKit; JsFileExtAbility* JsFileExtAbility::Create(const std::unique_ptr& runtime) { - HILOG_INFO("tag dsa %{public}s begin.", __func__); + HILOG_INFO("%{public}s begin.", __func__); + HILOG_INFO("%{public}s end.", __func__); return new JsFileExtAbility(static_cast(*runtime)); } @@ -51,38 +55,38 @@ void JsFileExtAbility::Init(const std::shared_ptr &record, const std::shared_ptr &application, std::shared_ptr &handler, const sptr &token) { - HILOG_INFO("tag dsa %{public}s begin.", __func__); + HILOG_INFO("%{public}s begin.", __func__); FileExtAbility::Init(record, application, handler, token); std::string srcPath = ""; GetSrcPath(srcPath); if (srcPath.empty()) { - HILOG_ERROR("tag dsa Failed to get srcPath"); + HILOG_ERROR("%{public}s Failed to get srcPath", __func__); return; } std::string moduleName(Extension::abilityInfo_->moduleName); moduleName.append("::").append(abilityInfo_->name); - HILOG_INFO("tag dsa %{public}s module:%{public}s, srcPath:%{public}s.", + HILOG_INFO("%{public}s module:%{public}s, srcPath:%{public}s.", __func__, moduleName.c_str(), srcPath.c_str()); HandleScope handleScope(jsRuntime_); jsObj_ = jsRuntime_.LoadModule(moduleName, srcPath); if (jsObj_ == nullptr) { - HILOG_ERROR("tag dsa Failed to get jsObj_"); + HILOG_ERROR("%{public}s Failed to get jsObj_", __func__); return; } - HILOG_INFO("tag dsa JsFileExtAbility::Init ConvertNativeValueTo."); + HILOG_INFO("%{public}s ConvertNativeValueTo.", __func__); NativeObject* obj = ConvertNativeValueTo(jsObj_->Get()); if (obj == nullptr) { - HILOG_ERROR("tag dsa Failed to get JsFileExtAbility object"); + HILOG_ERROR("%{public}s Failed to get JsFileExtAbility object", __func__); return; } - HILOG_INFO("tag dsa JsFileExtAbility::Init end."); + HILOG_INFO("%{public}s end.", __func__); } void JsFileExtAbility::OnStart(const AAFwk::Want &want) { - HILOG_INFO("tag dsa %{public}s begin.", __func__); + HILOG_INFO("%{public}s begin.", __func__); Extension::OnStart(want); HandleScope handleScope(jsRuntime_); napi_env env = reinterpret_cast(&jsRuntime_.GetNativeEngine()); @@ -90,23 +94,30 @@ void JsFileExtAbility::OnStart(const AAFwk::Want &want) NativeValue* nativeWant = reinterpret_cast(napiWant); NativeValue* argv[] = {nativeWant}; CallObjectMethod("onCreate", argv, ARGC_ONE); - HILOG_INFO("tag dsa %{public}s end.", __func__); + HILOG_INFO("%{public}s end.", __func__); } sptr JsFileExtAbility::OnConnect(const AAFwk::Want &want) { - HILOG_INFO("tag dsa %{public}s begin.", __func__); + HILOG_INFO("%{public}s begin.", __func__); Extension::OnConnect(want); - HILOG_INFO("tag dsa %{public}s end. ", __func__); - return nullptr; + sptr remoteObject = new (std::nothrow) FileExtStubImpl( + std::static_pointer_cast(shared_from_this()), + reinterpret_cast(&jsRuntime_.GetNativeEngine())); + if (remoteObject == nullptr) { + HILOG_ERROR("%{public}s No memory allocated for FileExtStubImpl", __func__); + return nullptr; + } + HILOG_INFO("%{public}s end. ", __func__); + return remoteObject->AsObject(); } NativeValue* JsFileExtAbility::CallObjectMethod(const char* name, NativeValue* const* argv, size_t argc) { - HILOG_INFO("tag dsa JsFileExtAbility::CallObjectMethod(%{public}s), begin", name); + HILOG_INFO("%{public}s name = %{public}s, begin", __func__, name); if (!jsObj_) { - HILOG_WARN("Not found FileExtAbility.js"); + HILOG_WARN("%{public}s Not found FileExtAbility.js", __func__); return nullptr; } @@ -116,22 +127,22 @@ NativeValue* JsFileExtAbility::CallObjectMethod(const char* name, NativeValue* c NativeValue* value = jsObj_->Get(); NativeObject* obj = ConvertNativeValueTo(value); if (obj == nullptr) { - HILOG_ERROR("tag dsa Failed to get FileExtAbility object"); + HILOG_ERROR("%{public}s Failed to get FileExtAbility object", __func__); return nullptr; } NativeValue* method = obj->GetProperty(name); if (method == nullptr) { - HILOG_ERROR("tag dsa Failed to get '%{public}s' from FileExtAbility object", name); + HILOG_ERROR("%{public}s Failed to get '%{public}s' from FileExtAbility object", __func__, name); return nullptr; } - HILOG_INFO("tag dsa JsFileExtAbility::CallFunction(%{public}s), success", name); + HILOG_INFO("%{public}s, name = %{public}s, success", __func__, name); return handleScope.Escape(nativeEngine.CallFunction(value, method, argv, argc)); } void JsFileExtAbility::GetSrcPath(std::string &srcPath) { - HILOG_INFO("tag dsa %{public}s begin.", __func__); + HILOG_INFO("%{public}s begin.", __func__); if (!Extension::abilityInfo_->isStageBasedModel) { /* temporary compatibility api8 + config.json */ srcPath.append(Extension::abilityInfo_->package); @@ -140,7 +151,7 @@ void JsFileExtAbility::GetSrcPath(std::string &srcPath) srcPath.append(Extension::abilityInfo_->srcPath); } srcPath.append("/").append(Extension::abilityInfo_->name).append(".abc"); - HILOG_INFO("tag dsa %{public}s end1, srcPath:%{public}s", __func__, srcPath.c_str()); + HILOG_INFO("%{public}s end1, srcPath:%{public}s", __func__, srcPath.c_str()); return; } @@ -150,7 +161,150 @@ void JsFileExtAbility::GetSrcPath(std::string &srcPath) srcPath.erase(srcPath.rfind('.')); srcPath.append(".abc"); } - HILOG_INFO("tag dsa %{public}s end2, srcPath:%{public}s", __func__, srcPath.c_str()); + HILOG_INFO("%{public}s end2, srcPath:%{public}s", __func__, srcPath.c_str()); +} + +int JsFileExtAbility::OpenFile(const Uri &uri, int flags) +{ + HILOG_INFO("%{public}s begin.", __func__); + 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); + napi_value napiFlags = nullptr; + napi_create_int32(env, flags, &napiFlags); + + NativeValue* nativeUri = reinterpret_cast(napiUri); + NativeValue* nativeFlags = reinterpret_cast(napiFlags); + NativeValue* argv[] = {nativeUri, nativeFlags}; + NativeValue* nativeResult = CallObjectMethod("openFile", argv, ARGC_TWO); + int ret = -1; + if (nativeResult == nullptr) { + HILOG_ERROR("%{public}s call openFile with return null.", __func__); + return ret; + } + ret = OHOS::AppExecFwk::UnwrapInt32FromJS(env, reinterpret_cast(nativeResult)); + HILOG_INFO("%{public}s end. return fd:%{public}d", __func__, ret); + return ret; +} + +int JsFileExtAbility::CreateFile(const Uri &parentUri, const std::string &displayName, Uri &newFileUri) +{ + HILOG_INFO("%{public}s begin.", __func__); + HandleScope handleScope(jsRuntime_); + napi_env env = reinterpret_cast(&jsRuntime_.GetNativeEngine()); + + napi_value napiParentUri = nullptr; + napi_create_string_utf8(env, parentUri.ToString().c_str(), NAPI_AUTO_LENGTH, &napiParentUri); + napi_value napiDisplayName = nullptr; + napi_create_string_utf8(env, displayName.c_str(), NAPI_AUTO_LENGTH, &napiDisplayName); + + NativeValue* nativeParentUri = reinterpret_cast(napiParentUri); + NativeValue* nativeDisplayName = reinterpret_cast(napiDisplayName); + NativeValue* argv[] = {nativeParentUri, nativeDisplayName}; + NativeValue* nativeResult = CallObjectMethod("createFile", argv, ARGC_TWO); + int ret = -1; + if (nativeResult == nullptr) { + HILOG_ERROR("%{public}s call createFile with return null.", __func__); + return ret; + } + std::string uriStr = OHOS::AppExecFwk::UnwrapStringFromJS(env, reinterpret_cast(nativeResult)); + if (uriStr.empty()) { + HILOG_ERROR("%{public}s call Mkdir 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::Mkdir(const Uri &parentUri, const std::string &displayName, Uri &newFileUri) +{ + HILOG_INFO("%{public}s begin.", __func__); + HandleScope handleScope(jsRuntime_); + napi_env env = reinterpret_cast(&jsRuntime_.GetNativeEngine()); + + napi_value napiParentUri = nullptr; + napi_create_string_utf8(env, parentUri.ToString().c_str(), NAPI_AUTO_LENGTH, &napiParentUri); + napi_value napiDisplayName = nullptr; + napi_create_string_utf8(env, displayName.c_str(), NAPI_AUTO_LENGTH, &napiDisplayName); + + NativeValue* nativeParentUri = reinterpret_cast(napiParentUri); + NativeValue* nativeDisplayName = reinterpret_cast(napiDisplayName); + NativeValue* argv[] = {nativeParentUri, nativeDisplayName}; + NativeValue* nativeResult = CallObjectMethod("mkdir", argv, ARGC_TWO); + int ret = -1; + if (nativeResult == nullptr) { + HILOG_ERROR("%{public}s call Mkdir with return null.", __func__); + return ret; + } + std::string uriStr = OHOS::AppExecFwk::UnwrapStringFromJS(env, reinterpret_cast(nativeResult)); + if (uriStr.empty()) { + HILOG_ERROR("%{public}s call Mkdir 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::Delete(const Uri &sourceFileUri) +{ + HILOG_INFO("%{public}s begin.", __func__); + HandleScope handleScope(jsRuntime_); + napi_env env = reinterpret_cast(&jsRuntime_.GetNativeEngine()); + + napi_value napiUri = nullptr; + napi_create_string_utf8(env, sourceFileUri.ToString().c_str(), NAPI_AUTO_LENGTH, &napiUri); + + NativeValue* nativeUri = reinterpret_cast(napiUri); + NativeValue* argv[] = {nativeUri}; + NativeValue* nativeResult = CallObjectMethod("delete", argv, ARGC_ONE); + int ret = -1; + if (nativeResult == nullptr) { + HILOG_ERROR("%{public}s call delete with return null.", __func__); + return ret; + } + ret = OHOS::AppExecFwk::UnwrapInt32FromJS(env, reinterpret_cast(nativeResult)); + HILOG_INFO("%{public}s end. return fd:%{public}d", __func__, ret); + return ret; +} + +int JsFileExtAbility::Rename(const Uri &sourceFileUri, const std::string &displayName, Uri &newFileUri) +{ + HILOG_INFO("%{public}s begin.", __func__); + 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 napiDisplayName = nullptr; + napi_create_string_utf8(env, displayName.c_str(), NAPI_AUTO_LENGTH, &napiDisplayName); + + NativeValue* nativeSourceFileUri = reinterpret_cast(napiSourceFileUri); + NativeValue* nativeDisplayName = reinterpret_cast(napiDisplayName); + NativeValue* argv[] = {nativeSourceFileUri, nativeDisplayName}; + NativeValue* nativeResult = CallObjectMethod("rename", argv, ARGC_TWO); + int ret = -1; + if (nativeResult == nullptr) { + HILOG_ERROR("%{public}s call rename with return null.", __func__); + return ret; + } + std::string uriStr = OHOS::AppExecFwk::UnwrapStringFromJS(env, reinterpret_cast(nativeResult)); + if (uriStr.empty()) { + HILOG_ERROR("%{public}s call rename 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; } } // namespace FileAccessFwk } // namespace OHOS \ No newline at end of file