diff --git a/bundle.json b/bundle.json index ab54d4ccdf7641513c9565b379245c46fbb6f500..a44515c39ec7c66e7575dcc0c3102b10d66c0fec 100644 --- a/bundle.json +++ b/bundle.json @@ -42,8 +42,7 @@ "//foundation/filemanagement/user_file_service/interfaces/kits/napi/file_extension_info_module:fileextensioninfo" ], "test": [ - "//foundation/filemanagement/user_file_service/services/test:user_file_manager_test", - "//foundation/filemanagement/user_file_service/frameworks/innerkits/file_access/test:user_file_service_test" + "//foundation/filemanagement/user_file_service/services/test:user_file_manager_test" ] } } diff --git a/frameworks/innerkits/file_access/BUILD.gn b/frameworks/innerkits/file_access/BUILD.gn index 78e238b3539209392d8e3e68e123e4625c966ddb..14f189dd862447a40d0947c368afb3cfc083afde 100644 --- a/frameworks/innerkits/file_access/BUILD.gn +++ b/frameworks/innerkits/file_access/BUILD.gn @@ -28,6 +28,7 @@ config("ability_config") { "${ability_runtime_napi_path}/inner/napi_common", "//foundation/aafwk/standard/frameworks/kits/appkit/native/app/include", "//foundation/appexecfwk/standard/interfaces/innerkits/appexecfwk_base/include", + "//foundation/distributeddatamgr/distributedfile/interfaces/kits/js/src/common", ] cflags = [] 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 ffc0b19dcfde2d51daf8109641b1509aaa8d9ccf..d3879776f866c4d9773712cc6b58ad828dd42617 100644 --- a/frameworks/innerkits/file_access/include/file_access_ext_ability.h +++ b/frameworks/innerkits/file_access/include/file_access_ext_ability.h @@ -19,12 +19,14 @@ #include "extension_base.h" #include "file_access_extension_info.h" #include "file_access_notify_manager.h" +#include "file_filter.h" namespace OHOS { namespace AbilityRuntime { class Runtime; } namespace FileAccessFwk { +using namespace DistributedFS; using namespace AbilityRuntime; class FileAccessExtAbility; using CreatorFunc = std::function& runtime)>; @@ -40,16 +42,18 @@ public: static FileAccessExtAbility* Create(const std::unique_ptr& runtime); - virtual int OpenFile(const Uri &uri, const int flags); + virtual int OpenFile(const Uri &uri, const int flags, int &fd); virtual int CreateFile(const Uri &parent, const std::string &displayName, Uri &newFile); virtual int Mkdir(const Uri &parent, const std::string &displayName, Uri &newFile); virtual int Delete(const Uri &sourceFile); virtual int Move(const Uri &sourceFile, const Uri &targetParent, Uri &newFile); virtual int Rename(const Uri &sourceFile, const std::string &displayName, Uri &newFile); - - virtual std::vector ListFile(const Uri &sourceFile); - virtual std::vector GetRoots(); - virtual int IsFileExist(const Uri &uri, bool &isExist); + virtual int ListFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount, + const FileFilter &filter, std::vector &fileInfoVec); + virtual int ScanFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount, + const FileFilter &filter, std::vector &fileInfoVec); + virtual int GetRoots(std::vector &rootInfoVec); + virtual int Access(const Uri &uri, bool &isExist); virtual int RegisterNotify(sptr ¬ify); virtual int UnregisterNotify(sptr ¬ify); virtual int Notify(const NotifyMessage &message); 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 ff4e0872773e9f0b1ed44fa934051c29a7054388..b16630b47e6ebffdb77cc2b5094bccc251d9f084 100644 --- a/frameworks/innerkits/file_access/include/file_access_ext_proxy.h +++ b/frameworks/innerkits/file_access/include/file_access_ext_proxy.h @@ -36,16 +36,18 @@ public: virtual ~FileAccessExtProxy() {} - virtual int OpenFile(const Uri &uri, const int flags) override; - virtual int CreateFile(const Uri &parent, const std::string &displayName, Uri &newFile) override; + virtual int OpenFile(const Uri &uri, const int flags, int &fd) override; + virtual int CreateFile(const Uri &parent, const std::string &displayName, Uri &newFile) override; virtual int Mkdir(const Uri &parent, const std::string &displayName, Uri &newFile) override; virtual int Delete(const Uri &sourceFile) override; virtual int Move(const Uri &sourceFile, const Uri &targetParent, Uri &newFile) override; virtual int Rename(const Uri &sourceFile, const std::string &displayName, Uri &newFile) override; - - virtual std::vector ListFile(const Uri &sourceFile) override; - virtual std::vector GetRoots() override; - virtual int IsFileExist(const Uri &uri, bool &isExist) override; + virtual int ListFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount, + const FileFilter &filter, std::vector &fileInfoVec) override; + virtual int ScanFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount, + const FileFilter &filter, std::vector &fileInfoVec) override; + virtual int GetRoots(std::vector &rootInfoVec) override; + virtual int Access(const Uri &uri, bool &isExist) override; virtual int RegisterNotify(sptr ¬ify) override; virtual int UnregisterNotify(sptr ¬ify) override; private: 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 8893926e3baac7920faf863f8fb3e075df259e0e..080287f05eb41985e5a78e244a42085d076826eb 100644 --- a/frameworks/innerkits/file_access/include/file_access_ext_stub.h +++ b/frameworks/innerkits/file_access/include/file_access_ext_stub.h @@ -42,8 +42,9 @@ private: ErrCode CmdMove(MessageParcel &data, MessageParcel &reply); ErrCode CmdRename(MessageParcel &data, MessageParcel &reply); ErrCode CmdListFile(MessageParcel &data, MessageParcel &reply); + ErrCode CmdScanFile(MessageParcel &data, MessageParcel &reply); ErrCode CmdGetRoots(MessageParcel &data, MessageParcel &reply); - ErrCode CmdIsFileExist(MessageParcel &data, MessageParcel &reply); + ErrCode CmdAccess(MessageParcel &data, MessageParcel &reply); ErrCode CmdRegisterNotify(MessageParcel &data, MessageParcel &reply); ErrCode CmdUnregisterNotify(MessageParcel &data, MessageParcel &reply); bool CheckCallingPermission(const std::string &permission); 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 d72745dd30eea65f13052bb68d59b0f6e2427700..8bf80eedae3a4958f98de0440763eba87b4e539b 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 @@ -34,15 +34,18 @@ public: virtual ~FileAccessExtStubImpl() {} - int OpenFile(const Uri &uri, const int flags) override; + int OpenFile(const Uri &uri, const int flags, int &fd) override; int CreateFile(const Uri &parent, const std::string &displayName, Uri &newFile) override; int Mkdir(const Uri &parent, const std::string &displayName, Uri &newFile) override; int Delete(const Uri &sourceFile) override; int Move(const Uri &sourceFile, const Uri &targetParent, Uri &newFile) override; int Rename(const Uri &sourceFile, const std::string &displayName, Uri &newFile) override; - std::vector ListFile(const Uri &sourceFileUri) override; - std::vector GetRoots() override; - int IsFileExist(const Uri &uri, bool &isExist) override; + int ListFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount, + const FileFilter &filter, std::vector &fileInfoVec) override; + int ScanFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount, + const FileFilter &filter, std::vector &fileInfoVec) override; + int GetRoots(std::vector &rootInfoVec) override; + int Access(const Uri &uri, bool &isExist) override; int RegisterNotify(sptr ¬ify) override; int UnregisterNotify(sptr ¬ify) override; diff --git a/frameworks/innerkits/file_access/include/file_access_extension_info.h b/frameworks/innerkits/file_access/include/file_access_extension_info.h index ab4719dbb241a0b4666e5f57b476693e4a05b255..896f96e382b22fcf919b4f5b70fa6f2b9ba20c77 100644 --- a/frameworks/innerkits/file_access/include/file_access_extension_info.h +++ b/frameworks/innerkits/file_access/include/file_access_extension_info.h @@ -24,35 +24,50 @@ namespace OHOS { namespace FileAccessFwk { -enum DeviceType { - DEVICE_LOCAL_DISK = 1, // Local c,d... disk - DEVICE_SHARED_DISK, // Multi-user shared disk - DEVICE_SHARED_TERMINAL, // Distributed networking terminal device - DEVICE_NETWORK_NEIGHBORHOODS, // Network neighbor device - DEVICE_EXTERNAL_MTP, // MTP device - DEVICE_EXTERNAL_USB, // USB device - DEVICE_EXTERNAL_CLOUD // Cloud disk device -}; +/** + * Indicates the type of the device. + */ +constexpr int32_t DEVICE_LOCAL_DISK = 1; // Local c,d... disk +constexpr int32_t DEVICE_SHARED_DISK = 2; // Multi-user shared disk +constexpr int32_t DEVICE_SHARED_TERMINAL = 3; // Distributed networking terminal device +constexpr int32_t DEVICE_NETWORK_NEIGHBORHOODS = 4; // Network neighbor device +constexpr int32_t DEVICE_EXTERNAL_MTP = 5; // MTP device +constexpr int32_t DEVICE_EXTERNAL_USB = 6; // USB device +constexpr int32_t DEVICE_EXTERNAL_CLOUD = 7; // Cloud disk device + +/** + * Indicates the supported capabilities of the device. + */ +const int32_t DEVICE_FLAG_SUPPORTS_READ = 1; +const int32_t DEVICE_FLAG_SUPPORTS_WRITE = 1 << 1; + +/** + * Indicates the supported capabilities of the file or directory. + */ +const int32_t DOCUMENT_FLAG_REPRESENTS_FILE = 1; +const int32_t DOCUMENT_FLAG_REPRESENTS_DIR = 1 << 1; +const int32_t DOCUMENT_FLAG_SUPPORTS_READ = 1 << 2; +const int32_t DOCUMENT_FLAG_SUPPORTS_WRITE = 1 << 3; struct FileInfo : public virtual OHOS::Parcelable { public: - Uri uri = Uri(""); - std::string fileName; - std::string mode; - int64_t size {0}; - int64_t mtime {0}; - std::string mimeType; + std::string uri { "" }; + std::string fileName { "" }; + int32_t mode { 0 }; + int64_t size { 0 }; + int64_t mtime { 0 }; + std::string mimeType { "" }; + + FileInfo() = default; + FileInfo(std::string uri, std::string fileName, int32_t mode, std::string mimeType) + : uri(uri), fileName(fileName), mode(mode), mimeType(mimeType) + {} bool ReadFromParcel(Parcel &parcel) { - std::unique_ptr uriInfo(parcel.ReadParcelable()); - if (uriInfo == nullptr) { - return false; - } - uri = *uriInfo; - + uri = parcel.ReadString(); fileName = parcel.ReadString(); - mode = parcel.ReadString(); + mode = parcel.ReadInt32(); size = parcel.ReadInt64(); mtime = parcel.ReadInt64(); mimeType = parcel.ReadString(); @@ -61,13 +76,13 @@ public: virtual bool Marshalling(Parcel &parcel) const override { - if (!parcel.WriteParcelable(&uri)) { + if (!parcel.WriteString(uri)) { return false; } if (!parcel.WriteString(fileName)) { return false; } - if (!parcel.WriteString(mode)) { + if (!parcel.WriteInt32(mode)) { return false; } if (!parcel.WriteInt64(size)) { @@ -97,52 +112,42 @@ public: } }; -struct DeviceInfo : public virtual OHOS::Parcelable { +struct RootInfo : public virtual OHOS::Parcelable { public: - Uri uri = Uri(""); - std::string displayName; - std::string deviceId; - uint32_t flags {0}; - DeviceType type; + int32_t deviceType { 0 }; + std::string uri { "" }; + std::string displayName { "" }; + int32_t deviceFlags { 0 }; bool ReadFromParcel(Parcel &parcel) { - std::unique_ptr uriInfo(parcel.ReadParcelable()); - if (uriInfo == nullptr) { - return false; - } - uri = *uriInfo; - + deviceType = parcel.ReadInt32(); + uri = parcel.ReadString(); displayName = parcel.ReadString(); - deviceId = parcel.ReadString(); - flags = parcel.ReadUint32(); - type = (DeviceType)parcel.ReadInt32(); + deviceFlags = parcel.ReadInt32(); return true; } virtual bool Marshalling(Parcel &parcel) const override { - if (!parcel.WriteParcelable(&uri)) { - return false; - } - if (!parcel.WriteString(displayName)) { + if (!parcel.WriteInt32(deviceType)) { return false; } - if (!parcel.WriteString(deviceId)) { + if (!parcel.WriteString(uri)) { return false; } - if (!parcel.WriteUint32(flags)) { + if (!parcel.WriteString(displayName)) { return false; } - if (!parcel.WriteInt32((int32_t)type)) { + if (!parcel.WriteInt32(deviceFlags)) { return false; } return true; } - static DeviceInfo *Unmarshalling(Parcel &parcel) + static RootInfo *Unmarshalling(Parcel &parcel) { - DeviceInfo *info = new (std::nothrow) DeviceInfo(); + RootInfo *info = new (std::nothrow) RootInfo(); if (info == nullptr) { return nullptr; } @@ -154,13 +159,6 @@ public: return info; } }; - -const uint32_t FLAG_SUPPORTS_THUMBNAIL = 1; -const uint32_t FLAG_SUPPORTS_WRITE = 1 << 1; -const uint32_t FLAG_SUPPORTS_READ = 1 << 2; -const uint32_t FLAG_SUPPORTS_DELETE = 1 << 3; -const uint32_t FLAG_SUPPORTS_RENAME = 1 << 4; -const uint32_t FLAG_SUPPORTS_MOVE = 1 << 5; } // namespace FileAccessFwk } // namespace OHOS #endif // FILE_ACCESS_EXTENSION_INFO_H \ No newline at end of file diff --git a/frameworks/innerkits/file_access/include/file_access_helper.h b/frameworks/innerkits/file_access/include/file_access_helper.h index 39a51bba113aef71b118fdaac65af80e4df27736..23b2a1521ffd009572860ec99b7def4458e36fba 100644 --- a/frameworks/innerkits/file_access/include/file_access_helper.h +++ b/frameworks/innerkits/file_access/include/file_access_helper.h @@ -48,7 +48,7 @@ class FileAccessHelper final : public std::enable_shared_from_this GetRegisterFileAccessExtAbilityInfo(); + static int GetRegisteredFileAccessExtAbilityInfo(std::vector &wantVec); // create and connect all ability static std::shared_ptr Creator(const std::shared_ptr &context); // create and connect with want, if created, only connect with want @@ -58,15 +58,18 @@ public: const std::vector &wants); bool Release(); - int IsFileExist(Uri &uri, bool &isExist); - int OpenFile(Uri &uri, int flags); + int Access(Uri &uri, bool &isExist); + int OpenFile(Uri &uri, const int flags, int &fd); int CreateFile(Uri &parent, const std::string &displayName, Uri &newFile); int Mkdir(Uri &parent, const std::string &displayName, Uri &newDir); int Delete(Uri &selectFile); int Move(Uri &sourceFile, Uri &targetParent, Uri &newFile); int Rename(Uri &sourceFile, const std::string &displayName, Uri &newFile); - std::vector ListFile(Uri &sourceFile); - std::vector GetRoots(); + int ListFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount, const FileFilter &filter, + std::vector &fileInfoVec); + int ScanFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount, const FileFilter &filter, + std::vector &fileInfoVec); + int GetRoots(std::vector &rootInfoVec); int On(std::shared_ptr &callback); int Off(); private: @@ -81,8 +84,7 @@ private: void AddFileAccessDeathRecipient(const sptr &token); void OnSchedulerDied(const wptr &remote); - std::shared_ptr GetConnectInfo(const std::string &key); - std::shared_ptr GetConnectInfo(Uri &uri); + std::shared_ptr GetConnectInfo(const std::string &bundleName); std::shared_ptr GetConnectInfo(const AAFwk::Want &want); void InsertConnectInfo(const std::string &key, const AAFwk::Want &want, @@ -94,9 +96,10 @@ private: static std::unordered_map wantsMap_; static std::string GetKeyOfWantsMap(const AAFwk::Want &want); - static int getUserId(); sptr callerDeathRecipient_ = nullptr; + + std::mutex notifyAgentMutex_; sptr notifyAgent_ = nullptr; }; 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 63ab8bfd778b3b407d03ecc51e7bbb2fffdb8d41..ddae40eb73bd9e9eb02c850f289a58b372c3e040 100644 --- a/frameworks/innerkits/file_access/include/ifile_access_ext_base.h +++ b/frameworks/innerkits/file_access/include/ifile_access_ext_base.h @@ -23,11 +23,14 @@ #include "file_access_extension_info.h" #include "file_access_framework_errno.h" +#include "file_filter.h" #include "ifile_access_notify.h" #include "uri.h" namespace OHOS { namespace FileAccessFwk { +using namespace DistributedFS; + class IFileAccessExtBase : public IRemoteBroker { public: DECLARE_INTERFACE_DESCRIPTOR(u"OHOS.FileAccessFwk.IFileAccessExtBase"); @@ -40,22 +43,25 @@ public: CMD_MOVE, CMD_RENAME, CMD_LIST_FILE, + CMD_SCAN_FILE, CMD_GET_ROOTS, - CMD_IS_FILE_EXIST, + CMD_ACCESS, CMD_REGISTER_NOTIFY, CMD_UNREGISTER_NOTIFY }; - virtual int OpenFile(const Uri &uri, const int flags) = 0; + virtual int OpenFile(const Uri &uri, const int flags, int &fd) = 0; virtual int CreateFile(const Uri &parent, const std::string &displayName, Uri &newFile) = 0; virtual int Mkdir(const Uri &parent, const std::string &displayName, Uri &newFile) = 0; virtual int Delete(const Uri &sourceFile) = 0; virtual int Move(const Uri &sourceFile, const Uri &targetParent, Uri &newFile) = 0; virtual int Rename(const Uri &sourceFile, const std::string &displayName, Uri &newFile) = 0; - - virtual std::vector ListFile(const Uri &sourceFile) = 0; - virtual std::vector GetRoots() = 0; - virtual int IsFileExist(const Uri &uri, bool &isExist) = 0; + virtual int ListFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount, + const FileFilter &filter, std::vector &fileInfoVec) = 0; + virtual int ScanFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount, + const FileFilter &filter, std::vector &fileInfoVec) = 0; + virtual int GetRoots(std::vector &rootInfoVec) = 0; + virtual int Access(const Uri &uri, bool &isExist) = 0; virtual int RegisterNotify(sptr ¬ify) = 0; virtual int UnregisterNotify(sptr ¬ify) = 0; }; 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 66d4a8f27976fa1f008d04a2fb808dad4907553e..df7179eed7bd8cfe60e527730b12090b08e34c84 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 @@ -60,15 +60,16 @@ public: const sptr &token) override; void OnStart(const AAFwk::Want &want) override; sptr OnConnect(const AAFwk::Want &want) override; - int OpenFile(const Uri &uri, const int flags) override; + int OpenFile(const Uri &uri, const int flags, int &fd) override; int CreateFile(const Uri &parent, const std::string &displayName, Uri &newFile) override; int Mkdir(const Uri &parent, const std::string &displayName, Uri &newFile) override; int Delete(const Uri &sourceFile) override; int Move(const Uri &sourceFile, const Uri &targetParent, Uri &newFile) override; int Rename(const Uri &sourceFile, const std::string &displayName, Uri &newFile) override; - std::vector ListFile(const Uri &sourceFile) override; - std::vector GetRoots() override; - int IsFileExist(const Uri &uri, bool &isExist) override; + int ListFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount, const FileFilter &filter, + std::vector &fileInfoVec) override; + int GetRoots(std::vector &rootInfoVec) override; + int Access(const Uri &uri, bool &isExist) override; private: NativeValue* CallObjectMethod(const char *name, NativeValue * const *argv = nullptr, size_t argc = 0); diff --git a/frameworks/innerkits/file_access/include/napi_common_fileaccess.h b/frameworks/innerkits/file_access/include/napi_common_fileaccess.h index c01347e425443706d097d5a16fbeaaae538ebfcc..bd0dc4d648bfd1d41a4a4cba4fd53f62b44f3659 100644 --- a/frameworks/innerkits/file_access/include/napi_common_fileaccess.h +++ b/frameworks/innerkits/file_access/include/napi_common_fileaccess.h @@ -45,11 +45,11 @@ bool UnwrapFileInfo(napi_env env, napi_value param, FileInfo &fileInfo); napi_value WrapArrayFileInfoToJS(napi_env env, const std::vector &fileInfoVec); bool UnwrapArrayFileInfoFromJS(napi_env env, napi_value param, std::vector &fileInfoVec); -napi_value WrapDeviceInfo(napi_env env, const DeviceInfo &deviceInfo); -bool UnwrapDeviceInfo(napi_env env, napi_value param, DeviceInfo &deviceInfo); +napi_value WrapRootInfo(napi_env env, const RootInfo &rootInfo); +bool UnwrapRootInfo(napi_env env, napi_value param, RootInfo &rootInfo); -napi_value WrapArrayDeviceInfoToJS(napi_env env, const std::vector &deviceInfoVec); -bool UnwrapArrayDeviceInfoFromJS(napi_env env, napi_value param, std::vector &deviceInfoVec); +napi_value WrapArrayRootInfoToJS(napi_env env, const std::vector &rootInfoVec); +bool UnwrapArrayRootInfoFromJS(napi_env env, napi_value param, std::vector &rootInfoVec); napi_value WrapArrayWantToJS(napi_env env, const std::vector &wantVec); bool UnwrapArrayWantFromJS(napi_env env, napi_value param, std::vector &wantVec); diff --git a/frameworks/innerkits/file_access/include/notify/file_access_notify_common.h b/frameworks/innerkits/file_access/include/notify/file_access_notify_common.h index d53b3b9a68c61480484c7dd0dcce5add63fe9999..93c648af5e9ed4b82c57b5313b2237241811ce0c 100644 --- a/frameworks/innerkits/file_access/include/notify/file_access_notify_common.h +++ b/frameworks/innerkits/file_access/include/notify/file_access_notify_common.h @@ -24,39 +24,37 @@ namespace OHOS { namespace FileAccessFwk { -enum NotifyType { - NOTIFY_DEVICE_ONLINE = 1, - NOTIFY_DEVICE_OFFLINE -}; +constexpr int32_t NOTIFY_DEVICE_ONLINE = 1; +constexpr int32_t NOTIFY_DEVICE_OFFLINE = 2; struct NotifyMessage : public virtual OHOS::Parcelable { public: - DeviceType deviceType; - NotifyType notifyType; + int32_t deviceType; + int32_t notifyType; std::string srcUri; // source uri when notifyType is (NOTIFY_FILE_MOVE/NOTIFY_FILE_RENAME), other case is "". std::string dstUri; // destination uri for all notifyType NotifyMessage() = default; - NotifyMessage(const DeviceType deviceTypeIn, const NotifyType ¬ifyTypeIn, const std::string &srcUriIn, + NotifyMessage(const int32_t deviceTypeIn, const int32_t notifyTypeIn, const std::string &srcUriIn, const std::string &dstUriIn) : deviceType(deviceTypeIn), notifyType(notifyTypeIn), srcUri(srcUriIn), dstUri(dstUriIn) {} void ReadFromParcel(Parcel &parcel) { - deviceType = (DeviceType)parcel.ReadInt32(); - notifyType = (NotifyType)parcel.ReadInt32(); + deviceType = parcel.ReadInt32(); + notifyType = parcel.ReadInt32(); srcUri = parcel.ReadString(); dstUri = parcel.ReadString(); } virtual bool Marshalling(Parcel &parcel) const override { - if (!parcel.WriteInt32((int32_t)deviceType)) { + if (!parcel.WriteInt32(deviceType)) { HILOG_ERROR("NotifyMessage Unmarshalling error:write deviceType fail."); return false; } - if (!parcel.WriteInt32((int32_t)notifyType)) { + if (!parcel.WriteInt32(notifyType)) { HILOG_ERROR("NotifyMessage Unmarshalling error:write notifyType fail."); return false; } 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 58baf36d387c7e3d0a45e361bf067ebeef05ccf9..27a8f9759ebbd125d2ca184f2c26eeba97d0c8af 100644 --- a/frameworks/innerkits/file_access/src/file_access_ext_ability.cpp +++ b/frameworks/innerkits/file_access/src/file_access_ext_ability.cpp @@ -61,51 +61,66 @@ void FileAccessExtAbility::Init(const std::shared_ptr &recor ExtensionBase<>::Init(record, application, handler, token); } -int FileAccessExtAbility::OpenFile(const Uri &uri, const int flags) +int FileAccessExtAbility::OpenFile(const Uri &uri, const int flags, int &fd) { - return ERR_OK; + HILOG_ERROR("FileAccessExtAbility::OpenFile Undefined operation"); + return ERR_OPERATION_NOT_SUPPORT; } int FileAccessExtAbility::CreateFile(const Uri &parent, const std::string &displayName, Uri &newFile) { - return ERR_OK; + HILOG_ERROR("FileAccessExtAbility::CreateFile Undefined operation"); + return ERR_OPERATION_NOT_SUPPORT; } int FileAccessExtAbility::Mkdir(const Uri &parent, const std::string &displayName, Uri &newFile) { - return ERR_OK; + HILOG_ERROR("FileAccessExtAbility::Mkdir Undefined operation"); + return ERR_OPERATION_NOT_SUPPORT; } int FileAccessExtAbility::Delete(const Uri &sourceFile) { - return ERR_OK; + HILOG_ERROR("FileAccessExtAbility::Delete Undefined operation"); + return ERR_OPERATION_NOT_SUPPORT; } int FileAccessExtAbility::Move(const Uri &sourceFile, const Uri &targetParent, Uri &newFile) { - return ERR_OK; + HILOG_ERROR("FileAccessExtAbility::Move Undefined operation"); + return ERR_OPERATION_NOT_SUPPORT; } int FileAccessExtAbility::Rename(const Uri &sourceFile, const std::string &displayName, Uri &newFile) { - return ERR_OK; + HILOG_ERROR("FileAccessExtAbility::Rename Undefined operation"); + return ERR_OPERATION_NOT_SUPPORT; } -std::vector FileAccessExtAbility::ListFile(const Uri &sourceFile) +int FileAccessExtAbility::ListFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount, + const FileFilter &filter, std::vector &fileInfoVec) { - std::vector vec; - return vec; + HILOG_ERROR("FileAccessExtAbility::ListFile Undefined operation"); + return ERR_OPERATION_NOT_SUPPORT; } -std::vector FileAccessExtAbility::GetRoots() +int FileAccessExtAbility::ScanFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount, + const FileFilter &filter, std::vector &fileInfoVec) { - std::vector vec; - return vec; + HILOG_ERROR("FileAccessExtAbility::ScanFile Undefined operation"); + return ERR_OPERATION_NOT_SUPPORT; } -int FileAccessExtAbility::IsFileExist(const Uri &uri, bool &isExist) +int FileAccessExtAbility::GetRoots(std::vector &rootInfoVec) { - return ERR_OK; + HILOG_ERROR("FileAccessExtAbility::GetRoots Undefined operation"); + return ERR_OPERATION_NOT_SUPPORT; +} + +int FileAccessExtAbility::Access(const Uri &uri, bool &isExist) +{ + HILOG_ERROR("FileAccessExtAbility::IsFileExist Undefined operation"); + return ERR_OPERATION_NOT_SUPPORT; } bool FileAccessExtAbility::GetNotifyManager() @@ -125,7 +140,7 @@ int FileAccessExtAbility::RegisterNotify(sptr ¬ify) if (!GetNotifyManager()) { HILOG_ERROR("GetNotifyManager fail."); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_ERROR; + return ERR_INVALID_PARAM; } int ret = notifyManager_->RegisterNotify(notify); if (ret != ERR_OK) { @@ -141,7 +156,7 @@ int FileAccessExtAbility::UnregisterNotify(sptr ¬ify) if (!GetNotifyManager()) { HILOG_ERROR("GetNotifyManager fail."); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_ERROR; + return ERR_INVALID_PARAM; } int ret = notifyManager_->UnregisterNotify(notify); if (ret != ERR_OK) { @@ -157,7 +172,7 @@ int FileAccessExtAbility::Notify(const NotifyMessage& message) if (!GetNotifyManager()) { HILOG_ERROR("GetNotifyManager fail."); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_ERROR; + return ERR_INVALID_PARAM; } int ret = notifyManager_->Notify(message); if (ret != ERR_OK) { 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 1085dfd7132d477d8b0a381f1fb5f05baddd1fc3..992adf6ca97cc5b4d4037058bb92d928fde88cf2 100644 --- a/frameworks/innerkits/file_access/src/file_access_ext_proxy.cpp +++ b/frameworks/innerkits/file_access/src/file_access_ext_proxy.cpp @@ -24,102 +24,121 @@ namespace OHOS { namespace FileAccessFwk { -int FileAccessExtProxy::OpenFile(const Uri &uri, const int flags) +int FileAccessExtProxy::OpenFile(const Uri &uri, const int flags, int &fd) { StartTrace(HITRACE_TAG_FILEMANAGEMENT, "OpenFile"); MessageParcel data; if (!data.WriteInterfaceToken(FileAccessExtProxy::GetDescriptor())) { HILOG_ERROR("WriteInterfaceToken failed"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_IPC_ERROR; + return ERR_PARCEL_FAIL; } if (!data.WriteParcelable(&uri)) { HILOG_ERROR("fail to WriteParcelable uri"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_IPC_ERROR; + return ERR_PARCEL_FAIL; } if (!data.WriteInt32(flags)) { - HILOG_ERROR("fail to WriteString mode"); + HILOG_ERROR("fail to WriteInt32 flags"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_IPC_ERROR; + return ERR_PARCEL_FAIL; } MessageParcel reply; MessageOption option; - int32_t err = Remote()->SendRequest(CMD_OPEN_FILE, data, reply, option); - if (err != NO_ERROR) { + int err = Remote()->SendRequest(CMD_OPEN_FILE, data, reply, option); + if (err != ERR_OK) { HILOG_ERROR("fail to SendRequest. err: %{public}d", err); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return err; } - int fd = reply.ReadFileDescriptor(); - if (fd <= ERR_ERROR) { - HILOG_ERROR("fail to ReadFileDescriptor fd"); + int ret = ERR_PARCEL_FAIL; + if (!reply.ReadInt32(ret)) { + HILOG_ERROR("fail to ReadInt32 ret"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_PARCEL_FAIL; + } + + if (ret != ERR_OK) { + HILOG_ERROR("OpenFile operation failed ret : %{public}d", ret); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_INVALID_FD; + return ret; + } + + fd = reply.ReadFileDescriptor(); + if (fd < ERR_OK) { + HILOG_ERROR("fail to ReadFileDescriptor fd: %{public}d", fd); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_PARCEL_FAIL; } FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return fd; + return ERR_OK; } -int FileAccessExtProxy::CreateFile(const Uri &parent, const std::string &displayName, Uri &newFile) +int FileAccessExtProxy::CreateFile(const Uri &parent, const std::string &displayName, Uri &newFile) { StartTrace(HITRACE_TAG_FILEMANAGEMENT, "CreateFile"); MessageParcel data; if (!data.WriteInterfaceToken(FileAccessExtProxy::GetDescriptor())) { HILOG_ERROR("WriteInterfaceToken failed"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_IPC_ERROR; + return ERR_PARCEL_FAIL; } if (!data.WriteParcelable(&parent)) { HILOG_ERROR("fail to WriteParcelable parent"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_IPC_ERROR; + return ERR_PARCEL_FAIL; } if (!data.WriteString(displayName)) { - HILOG_ERROR("fail to WriteString mode"); - FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_IPC_ERROR; - } - - if (!data.WriteParcelable(&newFile)) { - HILOG_ERROR("fail to WriteParcelable newFile"); + HILOG_ERROR("fail to WriteString displayName"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_IPC_ERROR; + return ERR_PARCEL_FAIL; } MessageParcel reply; MessageOption option; - int32_t err = Remote()->SendRequest(CMD_CREATE_FILE, data, reply, option); - if (err != NO_ERROR) { + int err = Remote()->SendRequest(CMD_CREATE_FILE, data, reply, option); + if (err != ERR_OK) { HILOG_ERROR("fail to SendRequest. err: %{public}d", err); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return err; } - int ret = reply.ReadInt32(); - if (ret < ERR_OK) { + int ret = ERR_PARCEL_FAIL; + if (!reply.ReadInt32(ret)) { HILOG_ERROR("fail to ReadInt32 ret"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_PARCEL_FAIL; + } + + if (ret != ERR_OK) { + HILOG_ERROR("CreateFile operation failed ret : %{public}d", ret); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return ret; } std::unique_ptr tempUri(reply.ReadParcelable()); - if (!tempUri) { + if (tempUri == nullptr) { HILOG_ERROR("ReadParcelable value is nullptr."); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_IPC_ERROR; + return ERR_PARCEL_FAIL; } newFile = Uri(*tempUri); + if (newFile.ToString().empty()) { + HILOG_ERROR("get uri is empty."); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_INVALID_RESULT; + } + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ret; + return ERR_OK; } int FileAccessExtProxy::Mkdir(const Uri &parent, const std::string &displayName, Uri &newFile) @@ -129,54 +148,59 @@ int FileAccessExtProxy::Mkdir(const Uri &parent, const std::string &displayName, if (!data.WriteInterfaceToken(FileAccessExtProxy::GetDescriptor())) { HILOG_ERROR("WriteInterfaceToken failed"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_IPC_ERROR; + return ERR_PARCEL_FAIL; } if (!data.WriteParcelable(&parent)) { HILOG_ERROR("fail to WriteParcelable parent"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_IPC_ERROR; + return ERR_PARCEL_FAIL; } if (!data.WriteString(displayName)) { HILOG_ERROR("fail to WriteString displayName"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_IPC_ERROR; - } - - if (!data.WriteParcelable(&newFile)) { - HILOG_ERROR("fail to WriteParcelable newFile"); - FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_IPC_ERROR; + return ERR_PARCEL_FAIL; } MessageParcel reply; MessageOption option; - int32_t err = Remote()->SendRequest(CMD_MKDIR, data, reply, option); - if (err != NO_ERROR) { + int err = Remote()->SendRequest(CMD_MKDIR, data, reply, option); + if (err != ERR_OK) { HILOG_ERROR("fail to SendRequest. err: %{public}d", err); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return err; } - int ret = reply.ReadInt32(); - if (ret < ERR_OK) { + int ret = ERR_PARCEL_FAIL; + if (!reply.ReadInt32(ret)) { HILOG_ERROR("fail to ReadInt32 ret"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_PARCEL_FAIL; + } + + if (ret != ERR_OK) { + HILOG_ERROR("Mkdir operation failed ret : %{public}d", ret); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return ret; } std::unique_ptr tempUri(reply.ReadParcelable()); - if (!tempUri) { + if (tempUri == nullptr) { HILOG_ERROR("ReadParcelable value is nullptr."); - ret = ERR_IPC_ERROR; FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ret; + return ERR_PARCEL_FAIL; } newFile = Uri(*tempUri); + if (newFile.ToString().empty()) { + HILOG_ERROR("get uri is empty."); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_INVALID_RESULT; + } + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ret; + return ERR_OK; } int FileAccessExtProxy::Delete(const Uri &sourceFile) @@ -186,33 +210,39 @@ int FileAccessExtProxy::Delete(const Uri &sourceFile) if (!data.WriteInterfaceToken(FileAccessExtProxy::GetDescriptor())) { HILOG_ERROR("WriteInterfaceToken failed"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_IPC_ERROR; + return ERR_PARCEL_FAIL; } if (!data.WriteParcelable(&sourceFile)) { HILOG_ERROR("fail to WriteParcelable sourceFile"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_IPC_ERROR; + return ERR_PARCEL_FAIL; } MessageParcel reply; MessageOption option; - int32_t err = Remote()->SendRequest(CMD_DELETE, data, reply, option); - if (err != NO_ERROR) { + int err = Remote()->SendRequest(CMD_DELETE, data, reply, option); + if (err != ERR_OK) { HILOG_ERROR("fail to SendRequest. err: %{public}d", err); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return err; } - int ret = reply.ReadInt32(); - if (ret < ERR_OK) { + int ret = ERR_PARCEL_FAIL; + if (!reply.ReadInt32(ret)) { HILOG_ERROR("fail to ReadInt32 ret"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_PARCEL_FAIL; + } + + if (ret != ERR_OK) { + HILOG_ERROR("Delete operation failed ret : %{public}d", ret); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return ret; } FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ret; + return ERR_OK; } int FileAccessExtProxy::Move(const Uri &sourceFile, const Uri &targetParent, Uri &newFile) @@ -222,53 +252,59 @@ int FileAccessExtProxy::Move(const Uri &sourceFile, const Uri &targetParent, Uri if (!data.WriteInterfaceToken(FileAccessExtProxy::GetDescriptor())) { HILOG_ERROR("WriteInterfaceToken failed"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_IPC_ERROR; + return ERR_PARCEL_FAIL; } if (!data.WriteParcelable(&sourceFile)) { HILOG_ERROR("fail to WriteParcelable sourceFile"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_IPC_ERROR; + return ERR_PARCEL_FAIL; } if (!data.WriteParcelable(&targetParent)) { HILOG_ERROR("fail to WriteParcelable targetParent"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_IPC_ERROR; - } - - if (!data.WriteParcelable(&newFile)) { - HILOG_ERROR("fail to WriteParcelable newFile"); - FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_IPC_ERROR; + return ERR_PARCEL_FAIL; } MessageParcel reply; MessageOption option; - int32_t err = Remote()->SendRequest(CMD_MOVE, data, reply, option); - if (err != NO_ERROR) { + int err = Remote()->SendRequest(CMD_MOVE, data, reply, option); + if (err != ERR_OK) { HILOG_ERROR("fail to SendRequest. err: %{public}d", err); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return err; } - int ret = reply.ReadInt32(); - if (ret < ERR_OK) { + int ret = ERR_PARCEL_FAIL; + if (!reply.ReadInt32(ret)) { HILOG_ERROR("fail to ReadInt32 ret"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_PARCEL_FAIL; + } + + if (ret != ERR_OK) { + HILOG_ERROR("Move operation failed ret : %{public}d", ret); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return ret; } std::unique_ptr tempUri(reply.ReadParcelable()); - if (!tempUri) { + if (tempUri == nullptr) { HILOG_ERROR("ReadParcelable value is nullptr."); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_IPC_ERROR; + return ERR_PARCEL_FAIL; } newFile = Uri(*tempUri); + if (newFile.ToString().empty()) { + HILOG_ERROR("get uri is empty."); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_INVALID_RESULT; + } + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ret; + return ERR_OK; } int FileAccessExtProxy::Rename(const Uri &sourceFile, const std::string &displayName, Uri &newFile) @@ -278,168 +314,297 @@ int FileAccessExtProxy::Rename(const Uri &sourceFile, const std::string &display if (!data.WriteInterfaceToken(FileAccessExtProxy::GetDescriptor())) { HILOG_ERROR("WriteInterfaceToken failed"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_IPC_ERROR; + return ERR_PARCEL_FAIL; } if (!data.WriteParcelable(&sourceFile)) { HILOG_ERROR("fail to WriteParcelable sourceFile"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_IPC_ERROR; + return ERR_PARCEL_FAIL; } if (!data.WriteString(displayName)) { HILOG_ERROR("fail to WriteString displayName"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_IPC_ERROR; - } - - if (!data.WriteParcelable(&newFile)) { - HILOG_ERROR("fail to WriteParcelable newFile"); - FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_IPC_ERROR; + return ERR_PARCEL_FAIL; } MessageParcel reply; MessageOption option; - int32_t err = Remote()->SendRequest(CMD_RENAME, data, reply, option); - if (err != NO_ERROR) { + int err = Remote()->SendRequest(CMD_RENAME, data, reply, option); + if (err != ERR_OK) { HILOG_ERROR("fail to SendRequest. err: %{public}d", err); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return err; } - int ret = reply.ReadInt32(); - if (ret < ERR_OK) { + int ret = ERR_PARCEL_FAIL; + if (!reply.ReadInt32(ret)) { HILOG_ERROR("fail to ReadInt32 ret"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_PARCEL_FAIL; + } + + if (ret != ERR_OK) { + HILOG_ERROR("Rename operation failed ret : %{public}d", ret); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return ret; } std::unique_ptr tempUri(reply.ReadParcelable()); - if (!tempUri) { + if (tempUri == nullptr) { HILOG_ERROR("ReadParcelable value is nullptr."); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_IPC_ERROR; + return ERR_PARCEL_FAIL; } newFile = Uri(*tempUri); + if (newFile.ToString().empty()) { + HILOG_ERROR("get uri is empty."); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_INVALID_RESULT; + } + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ret; + return ERR_OK; } -std::vector FileAccessExtProxy::ListFile(const Uri &sourceFile) +static int GetListFileResult(MessageParcel &reply, std::vector &fileInfoVec) +{ + int ret = ERR_PARCEL_FAIL; + if (!reply.ReadInt32(ret)) { + HILOG_ERROR("fail to ReadInt32 ret"); + return ERR_PARCEL_FAIL; + } + + if (ret != ERR_OK) { + HILOG_ERROR("ListFile operation failed ret : %{public}d", ret); + return ret; + } + + int64_t count = 0; + if (!reply.ReadInt64(count)) { + HILOG_ERROR("ListFile operation failed to Read count"); + return ERR_INVALID_RESULT; + } + + fileInfoVec.clear(); + for (int64_t i = 0; i < count; i++) { + std::unique_ptr fileInfoPtr(reply.ReadParcelable()); + if (fileInfoPtr != nullptr) { + fileInfoVec.push_back(*fileInfoPtr); + } + } + return ERR_OK; +} + +int FileAccessExtProxy::ListFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount, + const FileFilter &filter, std::vector &fileInfoVec) { StartTrace(HITRACE_TAG_FILEMANAGEMENT, "ListFile"); - std::vector vec; MessageParcel data; if (!data.WriteInterfaceToken(FileAccessExtProxy::GetDescriptor())) { HILOG_ERROR("WriteInterfaceToken failed"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return vec; + return ERR_PARCEL_FAIL; } - if (!data.WriteParcelable(&sourceFile)) { - HILOG_ERROR("fail to WriteParcelable sourceFileUri"); + if (!data.WriteParcelable(&fileInfo)) { + HILOG_ERROR("fail to WriteParcelable fileInfo"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_PARCEL_FAIL; + } + + if (!data.WriteInt64(offset)) { + HILOG_ERROR("fail to WriteInt64 offset"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_PARCEL_FAIL; + } + + if (!data.WriteInt64(maxCount)) { + HILOG_ERROR("fail to WriteInt64 maxCount"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_PARCEL_FAIL; + } + + if (!data.WriteParcelable(&filter)) { + HILOG_ERROR("fail to WriteParcelable filter"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return vec; + return ERR_PARCEL_FAIL; } MessageParcel reply; MessageOption option; - int32_t err = Remote()->SendRequest(CMD_LIST_FILE, data, reply, option); - if (err != NO_ERROR) { + int err = Remote()->SendRequest(CMD_LIST_FILE, data, reply, option); + if (err != ERR_OK) { HILOG_ERROR("fail to SendRequest. err: %{public}d", err); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return vec; + return err; } - vec.clear(); - int64_t count = reply.ReadInt64(); - for (int32_t i = 0; i < count; i++) { - std::unique_ptr fileInfo(reply.ReadParcelable()); - if (fileInfo != nullptr) { - vec.push_back(*fileInfo); - } + err = GetListFileResult(reply, fileInfoVec); + if (err != ERR_OK) { + HILOG_ERROR("fail to GetListFileResult. err: %{public}d", err); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return err; + } + + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_OK; +} + +int FileAccessExtProxy::ScanFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount, + const FileFilter &filter, std::vector &fileInfoVec) +{ + StartTrace(HITRACE_TAG_FILEMANAGEMENT, "ScanFile"); + MessageParcel data; + if (!data.WriteInterfaceToken(FileAccessExtProxy::GetDescriptor())) { + HILOG_ERROR("WriteInterfaceToken failed"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_PARCEL_FAIL; + } + + if (!data.WriteParcelable(&fileInfo)) { + HILOG_ERROR("fail to WriteParcelable fileInfo"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_PARCEL_FAIL; + } + + if (!data.WriteInt64(offset)) { + HILOG_ERROR("fail to WriteInt64 offset"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_PARCEL_FAIL; + } + + if (!data.WriteInt64(maxCount)) { + HILOG_ERROR("fail to WriteInt64 maxCount"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_PARCEL_FAIL; + } + + if (!data.WriteParcelable(&filter)) { + HILOG_ERROR("fail to WriteParcelable filter"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_PARCEL_FAIL; + } + + MessageParcel reply; + MessageOption option; + int err = Remote()->SendRequest(CMD_SCAN_FILE, data, reply, option); + if (err != ERR_OK) { + HILOG_ERROR("fail to SendRequest. err: %{public}d", err); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return err; + } + + err = GetListFileResult(reply, fileInfoVec); + if (err != ERR_OK) { + HILOG_ERROR("fail to GetListFileResult. err: %{public}d", err); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return err; } FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return vec; + return ERR_OK; } -std::vector FileAccessExtProxy::GetRoots() +int FileAccessExtProxy::GetRoots(std::vector &rootInfoVec) { StartTrace(HITRACE_TAG_FILEMANAGEMENT, "GetRoots"); - std::vector vec; MessageParcel data; if (!data.WriteInterfaceToken(FileAccessExtProxy::GetDescriptor())) { HILOG_ERROR("WriteInterfaceToken failed"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return vec; + return ERR_PARCEL_FAIL; } MessageParcel reply; MessageOption option; - int32_t err = Remote()->SendRequest(CMD_GET_ROOTS, data, reply, option); - if (err != NO_ERROR) { + int err = Remote()->SendRequest(CMD_GET_ROOTS, data, reply, option); + if (err != ERR_OK) { HILOG_ERROR("fail to SendRequest. err: %{public}d", err); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return vec; + return err; + } + + int ret = ERR_PARCEL_FAIL; + if (!reply.ReadInt32(ret)) { + HILOG_ERROR("fail to ReadInt32 ret"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_PARCEL_FAIL; + } + + if (ret != ERR_OK) { + HILOG_ERROR("GetRoots operation failed ret : %{public}d", ret); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ret; + } + + uint64_t count = 0; + if (!reply.ReadUint64(count)) { + HILOG_ERROR("GetRoots operation failed to Read count"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_INVALID_RESULT; } - vec.clear(); - uint64_t count = reply.ReadUint64(); + rootInfoVec.clear(); for (uint64_t i = 0; i < count; i++) { - std::unique_ptr deviceInfo(reply.ReadParcelable()); - if (deviceInfo != nullptr) { - vec.push_back(*deviceInfo); + std::unique_ptr rootInfoPtr(reply.ReadParcelable()); + if (rootInfoPtr != nullptr) { + rootInfoVec.push_back(*rootInfoPtr); } } FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return vec; + return ERR_OK; } -int FileAccessExtProxy::IsFileExist(const Uri &uri, bool &isExist) +int FileAccessExtProxy::Access(const Uri &uri, bool &isExist) { - StartTrace(HITRACE_TAG_FILEMANAGEMENT, "IsFileExist"); + StartTrace(HITRACE_TAG_FILEMANAGEMENT, "Access"); MessageParcel data; if (!data.WriteInterfaceToken(FileAccessExtProxy::GetDescriptor())) { HILOG_ERROR("WriteInterfaceToken failed"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_IPC_ERROR; + return ERR_PARCEL_FAIL; } if (!data.WriteParcelable(&uri)) { HILOG_ERROR("fail to WriteParcelable uri"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_IPC_ERROR; - } - - if (!data.WriteBool(isExist)) { - HILOG_ERROR("fail to WriteBool isExist"); - FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_IPC_ERROR; + return ERR_PARCEL_FAIL; } MessageParcel reply; MessageOption option; - int32_t err = Remote()->SendRequest(CMD_IS_FILE_EXIST, data, reply, option); - if (err != NO_ERROR) { + int err = Remote()->SendRequest(CMD_ACCESS, data, reply, option); + if (err != ERR_OK) { HILOG_ERROR("fail to SendRequest. err: %{public}d", err); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return err; } - int ret = reply.ReadInt32(); - if (ret < ERR_OK) { + int ret = ERR_PARCEL_FAIL; + if (!reply.ReadInt32(ret)) { HILOG_ERROR("fail to ReadInt32 ret"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_PARCEL_FAIL; + } + + if (ret != ERR_OK) { + HILOG_ERROR("Access operation failed ret : %{public}d", ret); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return ret; } - isExist = reply.ReadBool(); + if (!reply.ReadBool(isExist)) { + HILOG_ERROR("fail to ReadInt32 isExist"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_PARCEL_FAIL; + } + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ret; + return ERR_OK; } int FileAccessExtProxy::RegisterNotify(sptr ¬ify) @@ -449,13 +614,13 @@ int FileAccessExtProxy::RegisterNotify(sptr ¬ify) if (!data.WriteInterfaceToken(FileAccessExtProxy::GetDescriptor())) { HILOG_ERROR("WriteInterfaceToken failed"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_IPC_ERROR; + return ERR_PARCEL_FAIL; } if (!data.WriteRemoteObject(notify->AsObject())) { HILOG_ERROR("write subscribe type or parcel failed."); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_IPC_ERROR; + return ERR_PARCEL_FAIL; } MessageParcel reply; @@ -467,14 +632,20 @@ int FileAccessExtProxy::RegisterNotify(sptr ¬ify) return err; } - err = reply.ReadInt32(); - if (err != ERR_OK) { - HILOG_ERROR("fail to RegisterNotify. err: %{public}d", err); + int ret = ERR_PARCEL_FAIL; + if (!reply.ReadInt32(ret)) { + HILOG_ERROR("fail to ReadInt32 ret"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return err; + return ERR_PARCEL_FAIL; + } + + if (ret != ERR_OK) { + HILOG_ERROR("RegisterNotify operation failed ret : %{public}d", ret); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ret; } FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return err; + return ERR_OK; } int FileAccessExtProxy::UnregisterNotify(sptr ¬ify) @@ -484,13 +655,13 @@ int FileAccessExtProxy::UnregisterNotify(sptr ¬ify) if (!data.WriteInterfaceToken(FileAccessExtProxy::GetDescriptor())) { HILOG_ERROR("WriteInterfaceToken failed"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_IPC_ERROR; + return ERR_PARCEL_FAIL; } if (!data.WriteRemoteObject(notify->AsObject())) { HILOG_ERROR("write subscribe type or parcel failed."); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_IPC_ERROR; + return ERR_PARCEL_FAIL; } MessageParcel reply; @@ -502,14 +673,20 @@ int FileAccessExtProxy::UnregisterNotify(sptr ¬ify) return err; } - err = reply.ReadInt32(); - if (err != ERR_OK) { - HILOG_ERROR("fail to UnregisterNotify. err: %{public}d", err); + int ret = ERR_PARCEL_FAIL; + if (!reply.ReadInt32(ret)) { + HILOG_ERROR("fail to ReadInt32 ret"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return err; + return ERR_PARCEL_FAIL; + } + + if (ret != ERR_OK) { + HILOG_ERROR("UnregisterNotify operation failed ret : %{public}d", ret); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ret; } FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return err; + return ERR_OK; } } // 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 8e4c259e132892b53a6511acc9012f1f05b9fce5..dac727228c2569b860bf9c96955fdca9d3d962d1 100644 --- a/frameworks/innerkits/file_access/src/file_access_ext_stub.cpp +++ b/frameworks/innerkits/file_access/src/file_access_ext_stub.cpp @@ -47,8 +47,9 @@ FileAccessExtStub::FileAccessExtStub() stubFuncMap_[CMD_MOVE] = &FileAccessExtStub::CmdMove; stubFuncMap_[CMD_RENAME] = &FileAccessExtStub::CmdRename; stubFuncMap_[CMD_LIST_FILE] = &FileAccessExtStub::CmdListFile; + stubFuncMap_[CMD_SCAN_FILE] = &FileAccessExtStub::CmdScanFile; stubFuncMap_[CMD_GET_ROOTS] = &FileAccessExtStub::CmdGetRoots; - stubFuncMap_[CMD_IS_FILE_EXIST] = &FileAccessExtStub::CmdIsFileExist; + stubFuncMap_[CMD_ACCESS] = &FileAccessExtStub::CmdAccess; stubFuncMap_[CMD_REGISTER_NOTIFY] = &FileAccessExtStub::CmdRegisterNotify; stubFuncMap_[CMD_UNREGISTER_NOTIFY] = &FileAccessExtStub::CmdUnregisterNotify; } @@ -90,29 +91,36 @@ ErrCode FileAccessExtStub::CmdOpenFile(MessageParcel &data, MessageParcel &reply StartTrace(HITRACE_TAG_FILEMANAGEMENT, "CmdOpenFile"); std::shared_ptr uri(data.ReadParcelable()); if (uri == nullptr) { - HILOG_ERROR("parameter-uri is nullptr"); + HILOG_ERROR("Parameter OpenFile fail to ReadParcelable uri"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_INVALID_URI; + return ERR_PARCEL_FAIL; + } + + int flags = ERR_PARCEL_FAIL; + if (!data.ReadInt32(flags)) { + HILOG_ERROR("Parameter OpenFile fail to ReadInt32 flags"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_PARCEL_FAIL; } - int flags = data.ReadInt32(); if (flags < 0) { - HILOG_ERROR("parameter OpenFile flags is invalid"); + HILOG_ERROR("Parameter OpenFile flags is invalid"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_ERROR; + return ERR_INVALID_PARAM; } - int fd = OpenFile(*uri, flags); - if (fd < 0) { - HILOG_ERROR("parameter OpenFile fail, fd is %{pubilc}d", fd); + int fd = -1; + int ret = OpenFile(*uri, flags, fd); + if (!reply.WriteInt32(ret)) { + HILOG_ERROR("Parameter OpenFile fail to WriteInt32 ret"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_INVALID_FD; + return ERR_PARCEL_FAIL; } if (!reply.WriteFileDescriptor(fd)) { - HILOG_ERROR("OpenFile fail to WriteFileDescriptor fd"); + HILOG_ERROR("Parameter OpenFile fail to WriteFileDescriptor fd"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_IPC_ERROR; + return ERR_PARCEL_FAIL; } FinishTrace(HITRACE_TAG_FILEMANAGEMENT); @@ -124,42 +132,37 @@ ErrCode FileAccessExtStub::CmdCreateFile(MessageParcel &data, MessageParcel &rep StartTrace(HITRACE_TAG_FILEMANAGEMENT, "CmdCreateFile"); std::shared_ptr parent(data.ReadParcelable()); if (parent == nullptr) { - HILOG_ERROR("parameter-parent is nullptr"); + HILOG_ERROR("Parameter CreateFile fail to ReadParcelable parent"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_INVALID_URI; - } - - std::string displayName = data.ReadString(); - if (displayName.empty()) { - HILOG_ERROR("parameter CreateFile displayName is nullptr"); - FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_INVALID_PARAM; + return ERR_PARCEL_FAIL; } - std::shared_ptr fileNew(data.ReadParcelable()); - if (fileNew == nullptr) { - HILOG_ERROR("parameter-fileNew is nullptr"); + std::string displayName = ""; + if (!data.ReadString(displayName)) { + HILOG_ERROR("Parameter CreateFile fail to ReadString displayName"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_INVALID_URI; + return ERR_PARCEL_FAIL; } - int ret = CreateFile(*parent, displayName, *fileNew); - if (ret < 0) { - HILOG_ERROR("parameter CreateFile fail, ret is %{pubilc}d", ret); + if (displayName.empty()) { + HILOG_ERROR("Parameter CreateFile displayName is empty"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ret; + return ERR_INVALID_PARAM; } + std::string newFile = ""; + OHOS::Uri newFileUri(newFile); + int ret = CreateFile(*parent, displayName, newFileUri); if (!reply.WriteInt32(ret)) { - HILOG_ERROR("parameter CreateFile fail to WriteInt32 ret"); + HILOG_ERROR("Parameter CreateFile fail to WriteInt32 ret"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_IPC_ERROR; + return ERR_PARCEL_FAIL; } - if (!reply.WriteParcelable(&(*fileNew))) { - HILOG_ERROR("parameter CreateFile fail to WriteParcelable type"); + if (!reply.WriteParcelable(&newFileUri)) { + HILOG_ERROR("Parameter CreateFile fail to WriteParcelable newFileUri"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_IPC_ERROR; + return ERR_PARCEL_FAIL; } FinishTrace(HITRACE_TAG_FILEMANAGEMENT); @@ -171,42 +174,37 @@ ErrCode FileAccessExtStub::CmdMkdir(MessageParcel &data, MessageParcel &reply) StartTrace(HITRACE_TAG_FILEMANAGEMENT, "CmdMkdir"); std::shared_ptr parent(data.ReadParcelable()); if (parent == nullptr) { - HILOG_ERROR("parameter Mkdir parent is nullptr"); - FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_INVALID_URI; - } - - std::string displayName = data.ReadString(); - if (displayName.empty()) { - HILOG_ERROR("parameter Mkdir mode is nullptr"); + HILOG_ERROR("Parameter Mkdir fail to ReadParcelable parent"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_INVALID_PARAM; + return ERR_PARCEL_FAIL; } - std::shared_ptr fileNew(data.ReadParcelable()); - if (fileNew == nullptr) { - HILOG_ERROR("parameter Mkdir fileNew is nullptr"); + std::string displayName = ""; + if (!data.ReadString(displayName)) { + HILOG_ERROR("Parameter Mkdir fail to ReadString displayName"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_INVALID_URI; + return ERR_PARCEL_FAIL; } - int ret = Mkdir(*parent, displayName, *fileNew); - if (ret < 0) { - HILOG_ERROR("parameter Mkdir fail, ret is %{pubilc}d", ret); + if (displayName.empty()) { + HILOG_ERROR("Parameter Mkdir displayName is empty"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ret; + return ERR_INVALID_PARAM; } + std::string newFile = ""; + OHOS::Uri newFileUri(newFile); + int ret = Mkdir(*parent, displayName, newFileUri); if (!reply.WriteInt32(ret)) { - HILOG_ERROR("parameter Mkdir fail to WriteInt32 ret"); + HILOG_ERROR("Parameter Mkdir fail to WriteInt32 ret"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_IPC_ERROR; + return ERR_PARCEL_FAIL; } - if (!reply.WriteParcelable(&(*fileNew))) { - HILOG_ERROR("parameter Mkdir fail to WriteParcelable type"); + if (!reply.WriteParcelable(&newFileUri)) { + HILOG_ERROR("Parameter Mkdir fail to WriteParcelable newFileUri"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_IPC_ERROR; + return ERR_PARCEL_FAIL; } FinishTrace(HITRACE_TAG_FILEMANAGEMENT); @@ -218,22 +216,16 @@ ErrCode FileAccessExtStub::CmdDelete(MessageParcel &data, MessageParcel &reply) StartTrace(HITRACE_TAG_FILEMANAGEMENT, "CmdDelete"); std::shared_ptr uri(data.ReadParcelable()); if (uri == nullptr) { - HILOG_ERROR("parameter Delete uri is nullptr"); + HILOG_ERROR("Parameter Delete fail to ReadParcelable uri"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_INVALID_URI; + return ERR_PARCEL_FAIL; } int ret = Delete(*uri); - if (ret < 0) { - HILOG_ERROR("parameter Delete fail, ret is %{pubilc}d", ret); - FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ret; - } - if (!reply.WriteInt32(ret)) { - HILOG_ERROR("parameter Delete fail to WriteFileDescriptor ret"); + HILOG_ERROR("Parameter Delete fail to WriteInt32 ret"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_IPC_ERROR; + return ERR_PARCEL_FAIL; } FinishTrace(HITRACE_TAG_FILEMANAGEMENT); @@ -245,42 +237,31 @@ ErrCode FileAccessExtStub::CmdMove(MessageParcel &data, MessageParcel &reply) StartTrace(HITRACE_TAG_FILEMANAGEMENT, "CmdMove"); std::shared_ptr sourceFile(data.ReadParcelable()); if (sourceFile == nullptr) { - HILOG_ERROR("parameter Move sourceFile is nullptr"); + HILOG_ERROR("Parameter Move fail to ReadParcelable sourceFile"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_INVALID_URI; + return ERR_PARCEL_FAIL; } std::shared_ptr targetParent(data.ReadParcelable()); if (targetParent == nullptr) { - HILOG_ERROR("parameter Move targetParent is nullptr"); - FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_INVALID_URI; - } - - std::shared_ptr fileNew(data.ReadParcelable()); - if (fileNew == nullptr) { - HILOG_ERROR("parameter Move fileNew is nullptr"); + HILOG_ERROR("Parameter Move fail to ReadParcelable targetParent"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_INVALID_URI; - } - - int ret = Move(*sourceFile, *targetParent, *fileNew); - if (ret < 0) { - HILOG_ERROR("parameter Move fail, ret is %{pubilc}d", ret); - FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ret; + return ERR_PARCEL_FAIL; } + std::string newFile = ""; + OHOS::Uri newFileUri(newFile); + int ret = Move(*sourceFile, *targetParent, newFileUri); if (!reply.WriteInt32(ret)) { - HILOG_ERROR("parameter Move fail to WriteInt32 ret"); + HILOG_ERROR("Parameter Move fail to WriteInt32 ret"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_IPC_ERROR; + return ERR_PARCEL_FAIL; } - if (!reply.WriteParcelable(&(*fileNew))) { - HILOG_ERROR("parameter Move fail to WriteParcelable type"); + if (!reply.WriteParcelable(&newFileUri)) { + HILOG_ERROR("Parameter Move fail to WriteParcelable newFileUri"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_IPC_ERROR; + return ERR_PARCEL_FAIL; } FinishTrace(HITRACE_TAG_FILEMANAGEMENT); @@ -292,71 +273,152 @@ ErrCode FileAccessExtStub::CmdRename(MessageParcel &data, MessageParcel &reply) StartTrace(HITRACE_TAG_FILEMANAGEMENT, "CmdRename"); std::shared_ptr sourceFile(data.ReadParcelable()); if (sourceFile == nullptr) { - HILOG_ERROR("parameter Rename sourceFileUri is nullptr"); + HILOG_ERROR("Parameter Rename fail to ReadParcelable sourceFile"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_INVALID_URI; + return ERR_PARCEL_FAIL; + } + + std::string displayName = ""; + if (!data.ReadString(displayName)) { + HILOG_ERROR("Parameter Rename fail to ReadString displayName"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_PARCEL_FAIL; } - std::string displayName = data.ReadString(); if (displayName.empty()) { - HILOG_ERROR("parameter Rename mode is nullptr"); + HILOG_ERROR("Parameter Rename displayName is empty"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return ERR_INVALID_PARAM; } - std::shared_ptr fileNew(data.ReadParcelable()); - if (fileNew == nullptr) { - HILOG_ERROR("parameter Rename fileUriNew is nullptr"); + std::string newFile = ""; + OHOS::Uri newFileUri(newFile); + int ret = Rename(*sourceFile, displayName, newFileUri); + if (!reply.WriteInt32(ret)) { + HILOG_ERROR("Parameter Rename fail to WriteInt32 ret"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_INVALID_URI; + return ERR_PARCEL_FAIL; } - int ret = Rename(*sourceFile, displayName, *fileNew); - if (ret < 0) { - HILOG_ERROR("parameter Rename fail, ret is %{pubilc}d", ret); + if (!reply.WriteParcelable(&newFileUri)) { + HILOG_ERROR("Parameter Rename fail to WriteParcelable newFileUri"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ret; + return ERR_PARCEL_FAIL; } + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_OK; +} + +ErrCode FileAccessExtStub::CmdListFile(MessageParcel &data, MessageParcel &reply) +{ + StartTrace(HITRACE_TAG_FILEMANAGEMENT, "CmdListFile"); + std::shared_ptr fileInfo(data.ReadParcelable()); + if (fileInfo == nullptr) { + HILOG_ERROR("Parameter ListFile fail to ReadParcelable fileInfo"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_PARCEL_FAIL; + } + + int64_t offset = 0; + if (!data.ReadInt64(offset)) { + HILOG_ERROR("parameter ListFile offset is invalid"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_PARCEL_FAIL; + } + + int64_t maxCount = 0; + if (!data.ReadInt64(maxCount)) { + HILOG_ERROR("parameter ListFile maxCount is invalid"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_PARCEL_FAIL; + } + + std::shared_ptr filter(data.ReadParcelable()); + if (filter == nullptr) { + HILOG_ERROR("parameter ListFile FileFilter is invalid"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_PARCEL_FAIL; + } + + std::vector fileInfoVec; + int ret = ListFile(*fileInfo, offset, maxCount, *filter, fileInfoVec); if (!reply.WriteInt32(ret)) { - HILOG_ERROR("parameter Rename fail to WriteInt32 ret"); + HILOG_ERROR("Parameter ListFile fail to WriteInt32 ret"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_IPC_ERROR; + return ERR_PARCEL_FAIL; } - if (!reply.WriteParcelable(&(*fileNew))) { - HILOG_ERROR("parameter Rename fail to WriteParcelable type"); + int64_t count {fileInfoVec.size()}; + if (!reply.WriteInt64(count)) { + HILOG_ERROR("Parameter ListFile fail to WriteInt64 count"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_IPC_ERROR; + return ERR_PARCEL_FAIL; + } + + for (const auto &fileInfo : fileInfoVec) { + if (!reply.WriteParcelable(&fileInfo)) { + HILOG_ERROR("parameter ListFile fail to WriteParcelable fileInfoVec"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_PARCEL_FAIL; + } } FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return ERR_OK; } -ErrCode FileAccessExtStub::CmdListFile(MessageParcel &data, MessageParcel &reply) +ErrCode FileAccessExtStub::CmdScanFile(MessageParcel &data, MessageParcel &reply) { - StartTrace(HITRACE_TAG_FILEMANAGEMENT, "CmdListFile"); - std::shared_ptr uri(data.ReadParcelable()); - if (uri == nullptr) { - HILOG_ERROR("parameter ListFile uri is nullptr"); + StartTrace(HITRACE_TAG_FILEMANAGEMENT, "CmdScanFile"); + std::shared_ptr fileInfo(data.ReadParcelable()); + if (fileInfo == nullptr) { + HILOG_ERROR("Parameter ScanFile fail to ReadParcelable fileInfo"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_INVALID_URI; + return ERR_PARCEL_FAIL; + } + + int64_t offset = 0; + if (!data.ReadInt64(offset)) { + HILOG_ERROR("parameter ScanFile offset is invalid"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_PARCEL_FAIL; + } + + int64_t maxCount = 0; + if (!data.ReadInt64(maxCount)) { + HILOG_ERROR("parameter ScanFile maxCount is invalid"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_PARCEL_FAIL; + } + + std::shared_ptr filter(data.ReadParcelable()); + if (filter == nullptr) { + HILOG_ERROR("parameter ScanFile FileFilter is invalid"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_PARCEL_FAIL; } - std::vector vec = ListFile(*uri); - uint64_t count {vec.size()}; - if (!reply.WriteUint64(count)) { - HILOG_ERROR("parameter ListFile fail to WriteInt32 count"); + std::vector fileInfoVec; + int ret = ScanFile(*fileInfo, offset, maxCount, *filter, fileInfoVec); + if (!reply.WriteInt32(ret)) { + HILOG_ERROR("Parameter ScanFile fail to WriteInt32 ret"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_IPC_ERROR; + return ERR_PARCEL_FAIL; } - for (uint64_t i = 0; i < count; i++) { - if (!reply.WriteParcelable(&vec[i])) { - HILOG_ERROR("parameter ListFile fail to WriteParcelable vec"); + int64_t count {fileInfoVec.size()}; + if (!reply.WriteInt64(count)) { + HILOG_ERROR("Parameter ScanFile fail to WriteInt64 count"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_PARCEL_FAIL; + } + + for (const auto &fileInfo : fileInfoVec) { + if (!reply.WriteParcelable(&fileInfo)) { + HILOG_ERROR("parameter ScanFile fail to WriteParcelable fileInfoVec"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_IPC_ERROR; + return ERR_PARCEL_FAIL; } } @@ -367,19 +429,27 @@ ErrCode FileAccessExtStub::CmdListFile(MessageParcel &data, MessageParcel &reply ErrCode FileAccessExtStub::CmdGetRoots(MessageParcel &data, MessageParcel &reply) { StartTrace(HITRACE_TAG_FILEMANAGEMENT, "CmdGetRoots"); - std::vector vec = GetRoots(); - uint64_t count {vec.size()}; - if (!reply.WriteUint64(count)) { - HILOG_ERROR("parameter GetRoots fail to WriteInt32 count"); + + std::vector rootInfoVec; + int ret = GetRoots(rootInfoVec); + if (!reply.WriteInt32(ret)) { + HILOG_ERROR("Parameter GetRoots fail to WriteInt32 ret"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_IPC_ERROR; + return ERR_PARCEL_FAIL; } - for (uint64_t i = 0; i < count; i++) { - if (!reply.WriteParcelable(&vec[i])) { - HILOG_ERROR("parameter GetRoots fail to WriteParcelable ret"); + int64_t count {rootInfoVec.size()}; + if (!reply.WriteInt64(count)) { + HILOG_ERROR("Parameter GetRoots fail to WriteInt64 count"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_PARCEL_FAIL; + } + + for (const auto &rootInfo : rootInfoVec) { + if (!reply.WriteParcelable(&rootInfo)) { + HILOG_ERROR("parameter ListFile fail to WriteParcelable rootInfo"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_IPC_ERROR; + return ERR_PARCEL_FAIL; } } @@ -387,34 +457,28 @@ ErrCode FileAccessExtStub::CmdGetRoots(MessageParcel &data, MessageParcel &reply return ERR_OK; } -ErrCode FileAccessExtStub::CmdIsFileExist(MessageParcel &data, MessageParcel &reply) +ErrCode FileAccessExtStub::CmdAccess(MessageParcel &data, MessageParcel &reply) { - StartTrace(HITRACE_TAG_FILEMANAGEMENT, "CmdIsFileExist"); + StartTrace(HITRACE_TAG_FILEMANAGEMENT, "CmdAccess"); std::shared_ptr uri(data.ReadParcelable()); if (uri == nullptr) { - HILOG_ERROR("IsFIleExist uri is nullptr"); + HILOG_ERROR("Access uri is nullptr"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return ERR_INVALID_URI; } bool isExist = data.ReadBool(); - int ret = IsFileExist(*uri, isExist); - if (ret < 0) { - HILOG_ERROR("parameter IsFileExist fail, ret is %{pubilc}d", ret); - FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ret; - } - + int ret = Access(*uri, isExist); if (!reply.WriteInt32(ret)) { - HILOG_ERROR("parameter IsFileExist fail to WriteInt32 ret"); + HILOG_ERROR("Parameter Access fail to WriteInt32 ret"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_IPC_ERROR; + return ERR_PARCEL_FAIL; } if (!reply.WriteBool(isExist)) { - HILOG_ERROR("parameter IsFileExist fail to WriteBool type"); + HILOG_ERROR("Parameter Access fail to WriteBool isExist"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_IPC_ERROR; + return ERR_PARCEL_FAIL; } FinishTrace(HITRACE_TAG_FILEMANAGEMENT); @@ -423,7 +487,7 @@ ErrCode FileAccessExtStub::CmdIsFileExist(MessageParcel &data, MessageParcel &re bool FileAccessExtStub::CheckCallingPermission(const std::string &permission) { - StartTrace(HITRACE_TAG_FILEMANAGEMENT, "CmdGetRoots"); + StartTrace(HITRACE_TAG_FILEMANAGEMENT, "CheckCallingPermission"); Security::AccessToken::AccessTokenID tokenCaller = IPCSkeleton::GetCallingTokenID(); int res = Security::AccessToken::AccessTokenKit::VerifyAccessToken(tokenCaller, permission); if (res != Security::AccessToken::PermissionState::PERMISSION_GRANTED) { @@ -443,21 +507,21 @@ ErrCode FileAccessExtStub::CmdRegisterNotify(MessageParcel &data, MessageParcel if (remote == nullptr) { HILOG_INFO("get remote obj fail."); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_IPC_ERROR; + return ERR_PARCEL_FAIL; } auto notify = iface_cast(remote); if (notify == nullptr) { HILOG_INFO("get notify fail"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_IPC_ERROR; + return ERR_PARCEL_FAIL; } int ret = RegisterNotify(notify); if (!reply.WriteInt32(ret)) { - HILOG_ERROR("WriteInt32 failed"); + HILOG_ERROR("Parameter RegisterNotify fail to WriteInt32 ret"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_IPC_ERROR; + return ERR_PARCEL_FAIL; } FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return ERR_OK; @@ -470,21 +534,21 @@ ErrCode FileAccessExtStub::CmdUnregisterNotify(MessageParcel &data, MessageParce if (remote == nullptr) { HILOG_INFO("get remote obj fail."); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_IPC_ERROR; + return ERR_PARCEL_FAIL; } auto notify = iface_cast(remote); if (notify == nullptr) { HILOG_INFO("get notify fail"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_IPC_ERROR; + return ERR_PARCEL_FAIL; } int ret = UnregisterNotify(notify); if (!reply.WriteInt32(ret)) { - HILOG_ERROR("WriteInt32 failed"); + HILOG_ERROR("Parameter UnregisterNotify fail to WriteInt32 ret"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_IPC_ERROR; + return ERR_PARCEL_FAIL; } FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return ERR_OK; 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 7baf2ac9ba2c1d6f1b89c5f1b455bff719b1b1b8..2bc3c127033787802105816d7eba8f21a68dc858 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 @@ -15,6 +15,8 @@ #include "file_access_ext_stub_impl.h" +#include + #include "file_access_framework_errno.h" #include "hilog_wrapper.h" #include "hitrace_meter.h" @@ -26,17 +28,16 @@ std::shared_ptr FileAccessExtStubImpl::GetOwner() return extension_; } -int FileAccessExtStubImpl::OpenFile(const Uri &uri, const int flags) +int FileAccessExtStubImpl::OpenFile(const Uri &uri, const int flags, int &fd) { StartTrace(HITRACE_TAG_FILEMANAGEMENT, "OpenFile"); - int ret = ERR_ERROR; if (extension_ == nullptr) { HILOG_ERROR("OpenFile get extension failed."); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ret; + return ERR_IPC_ERROR; } - ret = extension_->OpenFile(uri, flags); + int ret = extension_->OpenFile(uri, flags, fd); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return ret; } @@ -44,14 +45,13 @@ int FileAccessExtStubImpl::OpenFile(const Uri &uri, const int flags) int FileAccessExtStubImpl::CreateFile(const Uri &parent, const std::string &displayName, Uri &newFile) { StartTrace(HITRACE_TAG_FILEMANAGEMENT, "CreateFile"); - int ret = ERR_ERROR; if (extension_ == nullptr) { HILOG_ERROR("CreateFile get extension failed."); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ret; + return ERR_IPC_ERROR; } - ret = extension_->CreateFile(parent, displayName, newFile); + int ret = extension_->CreateFile(parent, displayName, newFile); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return ret; } @@ -59,14 +59,13 @@ int FileAccessExtStubImpl::CreateFile(const Uri &parent, const std::string &disp int FileAccessExtStubImpl::Mkdir(const Uri &parent, const std::string &displayName, Uri &newFile) { StartTrace(HITRACE_TAG_FILEMANAGEMENT, "Mkdir"); - int ret = ERR_ERROR; if (extension_ == nullptr) { HILOG_ERROR("Mkdir get extension failed."); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ret; + return ERR_IPC_ERROR; } - ret = extension_->Mkdir(parent, displayName, newFile); + int ret = extension_->Mkdir(parent, displayName, newFile); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return ret; } @@ -74,14 +73,13 @@ int FileAccessExtStubImpl::Mkdir(const Uri &parent, const std::string &displayNa int FileAccessExtStubImpl::Delete(const Uri &sourceFile) { StartTrace(HITRACE_TAG_FILEMANAGEMENT, "Delete"); - int ret = ERR_ERROR; if (extension_ == nullptr) { HILOG_ERROR("Delete get extension failed."); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ret; + return ERR_IPC_ERROR; } - ret = extension_->Delete(sourceFile); + int ret = extension_->Delete(sourceFile); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return ret; } @@ -89,14 +87,13 @@ int FileAccessExtStubImpl::Delete(const Uri &sourceFile) int FileAccessExtStubImpl::Move(const Uri &sourceFile, const Uri &targetParent, Uri &newFile) { StartTrace(HITRACE_TAG_FILEMANAGEMENT, "Move"); - int ret = ERR_ERROR; if (extension_ == nullptr) { HILOG_ERROR("Move get extension failed."); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ret; + return ERR_IPC_ERROR; } - ret = extension_->Move(sourceFile, targetParent, newFile); + int ret = extension_->Move(sourceFile, targetParent, newFile); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return ret; } @@ -104,59 +101,71 @@ int FileAccessExtStubImpl::Move(const Uri &sourceFile, const Uri &targetParent, int FileAccessExtStubImpl::Rename(const Uri &sourceFile, const std::string &displayName, Uri &newFile) { StartTrace(HITRACE_TAG_FILEMANAGEMENT, "Rename"); - int ret = ERR_ERROR; if (extension_ == nullptr) { HILOG_ERROR("Rename get extension failed."); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ret; + return ERR_IPC_ERROR; } - ret = extension_->Rename(sourceFile, displayName, newFile); + int ret = extension_->Rename(sourceFile, displayName, newFile); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return ret; } -std::vector FileAccessExtStubImpl::ListFile(const Uri &sourceFile) +int FileAccessExtStubImpl::ListFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount, + const FileFilter &filter, std::vector &fileInfoVec) { StartTrace(HITRACE_TAG_FILEMANAGEMENT, "ListFile"); - std::vector vec; if (extension_ == nullptr) { HILOG_ERROR("ListFile get extension failed."); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return vec; + return ERR_IPC_ERROR; + } + + int ret = extension_->ListFile(fileInfo, offset, maxCount, filter, fileInfoVec); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ret; +} + +int FileAccessExtStubImpl::ScanFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount, + const FileFilter &filter, std::vector &fileInfoVec) +{ + StartTrace(HITRACE_TAG_FILEMANAGEMENT, "ScanFile"); + if (extension_ == nullptr) { + HILOG_ERROR("ScanFile get extension failed."); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_IPC_ERROR; } - vec = extension_->ListFile(sourceFile); + int ret = extension_->ScanFile(fileInfo, offset, maxCount, filter, fileInfoVec); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return vec; + return ret; } -std::vector FileAccessExtStubImpl::GetRoots() +int FileAccessExtStubImpl::GetRoots(std::vector &rootInfoVec) { StartTrace(HITRACE_TAG_FILEMANAGEMENT, "GetRoots"); - std::vector vec; if (extension_ == nullptr) { HILOG_ERROR("GetRoots get extension failed."); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return vec; + return ERR_IPC_ERROR; } - vec = extension_->GetRoots(); + int ret = extension_->GetRoots(rootInfoVec); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return vec; + return ret; } -int FileAccessExtStubImpl::IsFileExist(const Uri &uri, bool &isExist) +int FileAccessExtStubImpl::Access(const Uri &uri, bool &isExist) { - StartTrace(HITRACE_TAG_FILEMANAGEMENT, "IsFileExist"); - int ret = ERR_ERROR; + StartTrace(HITRACE_TAG_FILEMANAGEMENT, "Access"); if (extension_ == nullptr) { - HILOG_ERROR("IsFileExist get extension failed."); + HILOG_ERROR("Access get extension failed."); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ret; + return ERR_IPC_ERROR; } - ret = extension_->IsFileExist(uri, isExist); + int ret = extension_->Access(uri, isExist); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return ret; } @@ -168,7 +177,7 @@ int FileAccessExtStubImpl::RegisterNotify(sptr ¬ify) if (extension == nullptr) { HILOG_ERROR("get extension failed."); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_ERROR; + return ERR_IPC_ERROR; } int ret = extension->RegisterNotify(notify); @@ -186,7 +195,7 @@ int FileAccessExtStubImpl::UnregisterNotify(sptr ¬ify) if (extension == nullptr) { HILOG_ERROR("get extension failed."); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_ERROR; + return ERR_IPC_ERROR; } int ret = extension->UnregisterNotify(notify); diff --git a/frameworks/innerkits/file_access/src/file_access_helper.cpp b/frameworks/innerkits/file_access/src/file_access_helper.cpp index 34979eb4827f98236aa2f7d27f7dd76d1e90cb11..2f7cdfc00aca67499d0e79e3d0f73e637b3d4424 100644 --- a/frameworks/innerkits/file_access/src/file_access_helper.cpp +++ b/frameworks/innerkits/file_access/src/file_access_helper.cpp @@ -21,15 +21,53 @@ #include "hitrace_meter.h" #include "if_system_ability_manager.h" #include "ifile_access_ext_base.h" -#include "ipc_skeleton.h" #include "iservice_registry.h" #include "system_ability_definition.h" namespace OHOS { namespace FileAccessFwk { -static const int32_t UID_TRANSFORM_DIVISOR = 200000; +namespace { + static const int32_t DEFAULT_USERID = 100; + static const std::string SCHEME_NAME = "datashare"; + static const std::string MEDIA_BNUDLE_NAME_ALIAS = "media"; + static const std::string MEDIA_BNUDLE_NAME = "com.ohos.medialibrary.medialibrarydata"; + static const int32_t READ = 0; + static const int32_t WRITE = 1; + static const int32_t WRITE_READ = 2; +} std::unordered_map FileAccessHelper::wantsMap_; +static bool GetBundleNameFromPath(const std::string &path, std::string &bundleName) +{ + if (path.size() == 0) { + HILOG_ERROR("Uri path error."); + return false; + } + + if (path.front() != '/') { + HILOG_ERROR("Uri path format error."); + return false; + } + + auto tmpPath = path.substr(1); + auto index = tmpPath.find_first_of("/"); + bundleName = tmpPath.substr(0, index); + if (bundleName.compare(MEDIA_BNUDLE_NAME_ALIAS) == 0) { + bundleName = MEDIA_BNUDLE_NAME; + } + return true; +} + +static bool CheckUri(Uri &uri) +{ + std::string schemeStr = std::string(uri.GetScheme()); + if (schemeStr.compare(SCHEME_NAME) != 0) { + HILOG_ERROR("Uri scheme error."); + return false; + } + return true; +} + sptr FileAccessHelper::GetBundleMgrProxy() { sptr systemAbilityManager = @@ -80,26 +118,13 @@ void FileAccessHelper::OnSchedulerDied(const wptr &remote) object = nullptr; } -std::shared_ptr FileAccessHelper::GetConnectInfo(const std::string &key) +std::shared_ptr FileAccessHelper::GetConnectInfo(const std::string &bundleName) { - auto iterator = cMap_.find(key); + auto iterator = cMap_.find(bundleName); if (iterator != cMap_.end()) { return iterator->second; } - HILOG_ERROR("GetConnectInfo called with key return nullptr"); - return nullptr; -} - -std::shared_ptr FileAccessHelper::GetConnectInfo(Uri &uri) -{ - for (auto iter = cMap_.begin(); iter != cMap_.end(); ++iter) { - Uri key(iter->first); - if (key.GetScheme().compare(uri.GetScheme()) == 0) { - return iter->second; - } - } - - HILOG_ERROR("GetConnectInfo called with uri return nullptr"); + HILOG_ERROR("GetConnectInfo called with bundleName return nullptr"); return nullptr; } @@ -117,13 +142,6 @@ std::shared_ptr FileAccessHelper::GetConnectInfo(const AAFwk::Want return nullptr; } -int FileAccessHelper::getUserId() -{ - int uid = IPCSkeleton::GetCallingUid(); - int userId = uid / UID_TRANSFORM_DIVISOR; - return userId; -} - std::string FileAccessHelper::GetKeyOfWantsMap(const AAFwk::Want &want) { for (auto iter = FileAccessHelper::wantsMap_.begin(); iter != FileAccessHelper::wantsMap_.end(); ++iter) { @@ -135,7 +153,7 @@ std::string FileAccessHelper::GetKeyOfWantsMap(const AAFwk::Want &want) } } HILOG_ERROR("GetKeyOfWantsMap called return nullptr"); - return nullptr; + return ""; } void FileAccessHelper::InsertConnectInfo(const std::string &key, @@ -143,8 +161,7 @@ void FileAccessHelper::InsertConnectInfo(const std::string &key, const sptr &fileAccessExtProxy, sptr fileAccessExtConnection) { - Uri uri(key); - std::shared_ptr connectInfo = GetConnectInfo(uri); + std::shared_ptr connectInfo = GetConnectInfo(key); if (connectInfo == nullptr) { std::shared_ptr connectInfo = std::make_shared(); if (connectInfo == nullptr) { @@ -172,9 +189,8 @@ std::shared_ptr FileAccessHelper::Creator( FileAccessHelper::wantsMap_.clear(); std::unordered_map> cMap; std::vector extensionInfos; - int userId = FileAccessHelper::getUserId(); bool ret = bm->QueryExtensionAbilityInfos( - AppExecFwk::ExtensionAbilityType::FILEACCESS_EXTENSION, userId, extensionInfos); + AppExecFwk::ExtensionAbilityType::FILEACCESS_EXTENSION, DEFAULT_USERID, extensionInfos); if (!ret) { HILOG_ERROR("FileAccessHelper::Creator QueryExtensionAbilityInfos failed"); return nullptr; @@ -204,11 +220,11 @@ std::shared_ptr FileAccessHelper::Creator( HILOG_ERROR("Creator, connectInfo == nullptr"); return nullptr; } - FileAccessHelper::wantsMap_.insert(std::pair(extensionInfos[i].uri, wantTem)); + FileAccessHelper::wantsMap_.insert(std::pair(extensionInfos[i].bundleName, wantTem)); connectInfo->want = wantTem; connectInfo->fileAccessExtConnection = fileAccessExtConnection; - cMap.insert(std::pair>(extensionInfos[i].uri, connectInfo)); + cMap.emplace(extensionInfos[i].bundleName, connectInfo); } FileAccessHelper *ptrFileAccessHelper = new (std::nothrow) FileAccessHelper(context, cMap); if (ptrFileAccessHelper == nullptr) { @@ -258,8 +274,8 @@ std::shared_ptr FileAccessHelper::Creator( connectInfo->want = wants[i]; connectInfo->fileAccessExtConnection = fileAccessExtConnection; - string uriTmp = FileAccessHelper::GetKeyOfWantsMap(wants[i]); - cMap.insert(std::pair>(uriTmp, connectInfo)); + string bundleName = FileAccessHelper::GetKeyOfWantsMap(wants[i]); + cMap.insert(std::pair>(bundleName, connectInfo)); } FileAccessHelper *ptrFileAccessHelper = new (std::nothrow) FileAccessHelper(context, cMap); if (ptrFileAccessHelper == nullptr) { @@ -309,8 +325,8 @@ std::shared_ptr FileAccessHelper::Creator(const sptrwant = wants[i]; connectInfo->fileAccessExtConnection = fileAccessExtConnection; - string uriTmp = FileAccessHelper::GetKeyOfWantsMap(wants[i]); - cMap.insert(std::pair>(uriTmp, connectInfo)); + string bundleName = FileAccessHelper::GetKeyOfWantsMap(wants[i]); + cMap.insert(std::pair>(bundleName, connectInfo)); } FileAccessHelper *ptrFileAccessHelper = new (std::nothrow) FileAccessHelper(token, cMap); if (ptrFileAccessHelper == nullptr) { @@ -336,7 +352,13 @@ bool FileAccessHelper::Release() sptr FileAccessHelper::GetProxyByUri(Uri &uri) { - auto connectInfo = GetConnectInfo(uri); + std::string bundleName; + if (!GetBundleNameFromPath(uri.GetPath(), bundleName)) { + HILOG_ERROR("Get BundleName failed."); + return nullptr; + } + + auto connectInfo = GetConnectInfo(bundleName); if (connectInfo == nullptr) { HILOG_ERROR("GetProxyByUri failed with invalid connectInfo"); return nullptr; @@ -363,7 +385,6 @@ bool FileAccessHelper::GetProxy() { for (auto iter = cMap_.begin(); iter != cMap_.end(); ++iter) { auto connectInfo = iter->second; - std::vector results; if (!connectInfo->fileAccessExtConnection->IsExtAbilityConnected()) { connectInfo->fileAccessExtConnection->ConnectFileExtAbility(connectInfo->want, token_); } @@ -381,68 +402,118 @@ bool FileAccessHelper::GetProxy() return true; } -int FileAccessHelper::OpenFile(Uri &uri, int flags) +int FileAccessHelper::OpenFile(Uri &uri, int flags, int &fd) { StartTrace(HITRACE_TAG_FILEMANAGEMENT, "OpenFile"); - int fd = ERR_ERROR; + if (!CheckUri(uri)) { + HILOG_ERROR("Uri format check error."); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_INVALID_URI; + } + + if (flags != READ && flags != WRITE && flags != WRITE_READ) { + HILOG_ERROR("flags type error."); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_INVALID_PARAM; + } + sptr fileExtProxy = GetProxyByUri(uri); if (fileExtProxy == nullptr) { HILOG_ERROR("failed with invalid fileAccessExtProxy"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return fd; + return ERR_IPC_ERROR; + } + + int ret = fileExtProxy->OpenFile(uri, flags, fd); + if (ret != ERR_OK) { + HILOG_ERROR("OpenFile get result error, code:%{public}d", ret); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ret; } - fd = fileExtProxy->OpenFile(uri, flags); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return fd; + return ERR_OK; } int FileAccessHelper::CreateFile(Uri &parent, const std::string &displayName, Uri &newFile) { StartTrace(HITRACE_TAG_FILEMANAGEMENT, "CreateFile"); - int index = ERR_ERROR; + if (!CheckUri(parent)) { + HILOG_ERROR("Uri format check error."); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_INVALID_URI; + } + sptr fileExtProxy = GetProxyByUri(parent); if (fileExtProxy == nullptr) { HILOG_ERROR("failed with invalid fileAccessExtProxy"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return index; + return ERR_IPC_ERROR; + } + + int ret = fileExtProxy->CreateFile(parent, displayName, newFile); + if (ret != ERR_OK) { + HILOG_ERROR("CreateFile get result error, code:%{public}d", ret); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ret; } - index = fileExtProxy->CreateFile(parent, displayName, newFile); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return index; + return ERR_OK; } int FileAccessHelper::Mkdir(Uri &parent, const std::string &displayName, Uri &newDir) { StartTrace(HITRACE_TAG_FILEMANAGEMENT, "Mkdir"); - int index = ERR_ERROR; + if (!CheckUri(parent)) { + HILOG_ERROR("Uri format check error."); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_INVALID_URI; + } + sptr fileExtProxy = GetProxyByUri(parent); if (fileExtProxy == nullptr) { HILOG_ERROR("failed with invalid fileAccessExtProxy"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return index; + return ERR_IPC_ERROR; + } + + int ret = fileExtProxy->Mkdir(parent, displayName, newDir); + if (ret != ERR_OK) { + HILOG_ERROR("Mkdir get result error, code:%{public}d", ret); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ret; } - index = fileExtProxy->Mkdir(parent, displayName, newDir); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return index; + return ERR_OK; } int FileAccessHelper::Delete(Uri &selectFile) { StartTrace(HITRACE_TAG_FILEMANAGEMENT, "Delete"); - int index = ERR_ERROR; + if (!CheckUri(selectFile)) { + HILOG_ERROR("Uri format check error."); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_INVALID_URI; + } + sptr fileExtProxy = GetProxyByUri(selectFile); if (fileExtProxy == nullptr) { HILOG_ERROR("failed with invalid fileAccessExtProxy"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return index; + return ERR_IPC_ERROR; + } + + int ret = fileExtProxy->Delete(selectFile); + if (ret != ERR_OK) { + HILOG_ERROR("Delete get result error, code:%{public}d", ret); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ret; } - index = fileExtProxy->Delete(selectFile); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return index; + return ERR_OK; } int FileAccessHelper::Move(Uri &sourceFile, Uri &targetParent, Uri &newFile) @@ -450,186 +521,297 @@ int FileAccessHelper::Move(Uri &sourceFile, Uri &targetParent, Uri &newFile) StartTrace(HITRACE_TAG_FILEMANAGEMENT, "Move"); Uri sourceFileUri(sourceFile.ToString()); Uri targetParentUri(targetParent.ToString()); + if (!CheckUri(sourceFile)) { + HILOG_ERROR("sourceFile format check error."); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_INVALID_URI; + } + + if (!CheckUri(targetParent)) { + HILOG_ERROR("targetParent format check error."); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_INVALID_URI; + } + if (sourceFileUri.GetScheme() != targetParentUri.GetScheme()) { HILOG_WARN("Operation failed, move not supported"); - return ERR_OPERATION_NOT_PERMITTED; + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_OPERATION_NOT_SUPPORT; } - int index = ERR_ERROR; sptr fileExtProxy = GetProxyByUri(sourceFile); if (fileExtProxy == nullptr) { HILOG_ERROR("failed with invalid fileAccessExtProxy"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return index; + return ERR_IPC_ERROR; + } + + int ret = fileExtProxy->Move(sourceFile, targetParent, newFile); + if (ret != ERR_OK) { + HILOG_ERROR("Move get result error, code:%{public}d", ret); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ret; } - index = fileExtProxy->Move(sourceFile, targetParent, newFile); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return index; + return ERR_OK; } int FileAccessHelper::Rename(Uri &sourceFile, const std::string &displayName, Uri &newFile) { StartTrace(HITRACE_TAG_FILEMANAGEMENT, "Rename"); - int index = ERR_ERROR; + if (!CheckUri(sourceFile)) { + HILOG_ERROR("sourceFile format check error."); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_INVALID_URI; + } + sptr fileExtProxy = GetProxyByUri(sourceFile); if (fileExtProxy == nullptr) { HILOG_ERROR("failed with invalid fileAccessExtProxy"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return index; + return ERR_IPC_ERROR; + } + + int ret = fileExtProxy->Rename(sourceFile, displayName, newFile); + if (ret != ERR_OK) { + HILOG_ERROR("Rename get result error, code:%{public}d", ret); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ret; } - index = fileExtProxy->Rename(sourceFile, displayName, newFile); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return index; + return ERR_OK; } -std::vector FileAccessHelper::ListFile(Uri &sourceFile) +int FileAccessHelper::ListFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount, + const FileFilter &filter, std::vector &fileInfoVec) { StartTrace(HITRACE_TAG_FILEMANAGEMENT, "ListFile"); - std::vector results; + Uri sourceFile(fileInfo.uri); + if (!CheckUri(sourceFile)) { + HILOG_ERROR("sourceFile format check error."); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_INVALID_URI; + } + sptr fileExtProxy = GetProxyByUri(sourceFile); if (fileExtProxy == nullptr) { HILOG_ERROR("failed with invalid fileAccessExtProxy"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return results; + return ERR_IPC_ERROR; + } + + int ret = fileExtProxy->ListFile(fileInfo, offset, maxCount, filter, fileInfoVec); + if (ret != ERR_OK) { + HILOG_ERROR("ListFile get result error, code:%{public}d", ret); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ret; } - results = fileExtProxy->ListFile(sourceFile); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return results; + return ERR_OK; } -std::vector FileAccessHelper::GetRoots() +int FileAccessHelper::ScanFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount, + const FileFilter &filter, std::vector &fileInfoVec) +{ + StartTrace(HITRACE_TAG_FILEMANAGEMENT, "ScanFile"); + Uri sourceFile(fileInfo.uri); + if (!CheckUri(sourceFile)) { + HILOG_ERROR("sourceFile format check error."); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_INVALID_URI; + } + + sptr fileExtProxy = GetProxyByUri(sourceFile); + if (fileExtProxy == nullptr) { + HILOG_ERROR("failed with invalid fileAccessExtProxy"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_IPC_ERROR; + } + + int ret = fileExtProxy->ScanFile(fileInfo, offset, maxCount, filter, fileInfoVec); + if (ret != ERR_OK) { + HILOG_ERROR("ScanFile get result error, code:%{public}d", ret); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ret; + } + + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_OK; +} + +int FileAccessHelper::GetRoots(std::vector &rootInfoVec) { StartTrace(HITRACE_TAG_FILEMANAGEMENT, "GetRoots"); - std::vector rootsInfo; if (!GetProxy()) { HILOG_ERROR("failed with invalid fileAccessExtProxy"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return rootsInfo; + return ERR_IPC_ERROR; } + int ret = ERR_OK; for (auto iter = cMap_.begin(); iter != cMap_.end(); ++iter) { auto connectInfo = iter->second; auto fileAccessExtProxy = connectInfo->fileAccessExtConnection->GetFileExtProxy(); - std::vector results; + std::vector results; if (fileAccessExtProxy) { AddFileAccessDeathRecipient(fileAccessExtProxy->AsObject()); } - results = fileAccessExtProxy->GetRoots(); - rootsInfo.insert(rootsInfo.end(), results.begin(), results.end()); + + ret = fileAccessExtProxy->GetRoots(results); + if (ret != ERR_OK) { + HILOG_ERROR("getRoots get fail ret:%{public}d", ret); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ret; + } + + rootInfoVec.insert(rootInfoVec.end(), results.begin(), results.end()); } - return rootsInfo; + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_OK; } -std::vector FileAccessHelper::GetRegisterFileAccessExtAbilityInfo() +int FileAccessHelper::GetRegisteredFileAccessExtAbilityInfo(std::vector &wantVec) { - std::vector wants; + StartTrace(HITRACE_TAG_FILEMANAGEMENT, "GetRegisteredFileAccessExtAbilityInfo"); std::vector extensionInfos; sptr bm = FileAccessHelper::GetBundleMgrProxy(); - int userId = FileAccessHelper::getUserId(); + if (bm == nullptr) { + HILOG_ERROR("GetBundleMgrProxy nullptr."); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_QUERY_EXTENSIONINFOS_FAIL; + } bool ret = bm->QueryExtensionAbilityInfos( - AppExecFwk::ExtensionAbilityType::FILEACCESS_EXTENSION, userId, extensionInfos); + AppExecFwk::ExtensionAbilityType::FILEACCESS_EXTENSION, DEFAULT_USERID, extensionInfos); if (!ret) { - HILOG_ERROR("FileAccessHelper::GetRegisterFileAccessExtAbilityInfo QueryExtensionAbilityInfos error"); - return wants; + HILOG_ERROR("FileAccessHelper::GetRegisteredFileAccessExtAbilityInfo QueryExtensionAbilityInfos error"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_QUERY_EXTENSIONINFOS_FAIL; } + wantVec.clear(); FileAccessHelper::wantsMap_.clear(); for (size_t i = 0; i < extensionInfos.size(); i++) { AAFwk::Want want; want.SetElementName(extensionInfos[i].bundleName, extensionInfos[i].name); - FileAccessHelper::wantsMap_.insert(std::pair(extensionInfos[i].uri, want)); - wants.push_back(want); + FileAccessHelper::wantsMap_.insert(std::pair(extensionInfos[i].bundleName, want)); + wantVec.push_back(want); } - return wants; + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_OK; } -int FileAccessHelper::IsFileExist(Uri &uri, bool &isExist) +int FileAccessHelper::Access(Uri &uri, bool &isExist) { - StartTrace(HITRACE_TAG_FILEMANAGEMENT, "IsFileExist"); - int ret = ERR_ERROR; + StartTrace(HITRACE_TAG_FILEMANAGEMENT, "Access"); + if (!CheckUri(uri)) { + HILOG_ERROR("uri format check error."); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_INVALID_URI; + } sptr fileExtProxy = GetProxyByUri(uri); if (fileExtProxy == nullptr) { HILOG_ERROR("failed with invalid fileAccessExtProxy"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_IPC_ERROR; + } + + int ret = fileExtProxy->Access(uri, isExist); + if (ret != ERR_OK) { + HILOG_ERROR("Access get result error, code:%{public}d", ret); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return ret; } - ret = fileExtProxy->IsFileExist(uri, isExist); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ret; + return ERR_OK; } int FileAccessHelper::On(std::shared_ptr &callback) { StartTrace(HITRACE_TAG_FILEMANAGEMENT, "On"); - Uri uri("fileAccess://"); - sptr fileExtProxy = GetProxyByUri(uri); - if (fileExtProxy == nullptr) { - HILOG_ERROR("failed with invalid fileExtProxy"); - FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_IPC_ERROR; - } - if (callback == nullptr) { HILOG_ERROR("failed with invalid callback"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_ERROR; + return ERR_INVALID_PARAM; } - if (notifyAgent_ != nullptr) { - HILOG_INFO("notifyAgent registered yet."); - int ret = fileExtProxy->UnregisterNotify(notifyAgent_); - if (ret != ERR_OK) { - HILOG_INFO("fileExtProxy unregisterNotify fail"); - } - notifyAgent_.clear(); + if (!GetProxy()) { + HILOG_ERROR("failed with invalid fileAccessExtProxy"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_IPC_ERROR; } - notifyAgent_ = new(std::nothrow) FileAccessNotifyAgent(callback); + std::lock_guard lock(notifyAgentMutex_); if (notifyAgent_ == nullptr) { - HILOG_INFO("new FileAccessNotifyAgent fail"); - FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_ERROR; + notifyAgent_ = new(std::nothrow) FileAccessNotifyAgent(callback); + if (notifyAgent_ == nullptr) { + HILOG_ERROR("new FileAccessNotifyAgent fail"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_INVALID_PARAM; + } } - auto ret = fileExtProxy->RegisterNotify(notifyAgent_); - if (ret != ERR_OK) { - HILOG_ERROR("fileExtProxy RegisterNotify fail"); + int errorCode = ERR_OK; + for (auto iter = cMap_.begin(); iter != cMap_.end(); ++iter) { + auto connectInfo = iter->second; + auto fileAccessExtProxy = connectInfo->fileAccessExtConnection->GetFileExtProxy(); + if (fileAccessExtProxy == nullptr) { + HILOG_ERROR("fileAccessExtProxy RegisterNotify fail"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_IPC_ERROR; + } + + errorCode = fileAccessExtProxy->RegisterNotify(notifyAgent_); + if (errorCode != ERR_OK) { + HILOG_ERROR("fileAccessExtProxy RegisterNotify fail, bundleName:%{public}s, ret:%{public}d.", + connectInfo->want.GetElement().GetBundleName().c_str(), errorCode); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return errorCode; + } } + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ret; + return ERR_OK; } int FileAccessHelper::Off() { StartTrace(HITRACE_TAG_FILEMANAGEMENT, "Off"); + std::lock_guard lock(notifyAgentMutex_); if (notifyAgent_ == nullptr) { HILOG_ERROR("not registered notify"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return ERR_NOTIFY_NOT_EXIST; } - Uri uri("fileAccess://"); - sptr fileExtProxy = GetProxyByUri(uri); - if (fileExtProxy == nullptr) { - HILOG_ERROR("failed with invalid fileExtProxy"); - FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_IPC_ERROR; - } + int errorCode = ERR_OK; + for (auto [key, value] : cMap_) { + auto connectInfo = value; + auto fileAccessExtProxy = connectInfo->fileAccessExtConnection->GetFileExtProxy(); + if (fileAccessExtProxy == nullptr) { + HILOG_INFO("fileAccessExtProxy UnregisterNotify fail, bundleName:%{public}s", + connectInfo->want.GetElement().GetBundleName().c_str()); + continue; + } - auto ret = fileExtProxy->UnregisterNotify(notifyAgent_); - if (ret != ERR_OK) { - HILOG_ERROR("fileExtProxy unregisterNotify fail"); + errorCode = fileAccessExtProxy->UnregisterNotify(notifyAgent_); + if (errorCode != ERR_OK) { + HILOG_ERROR("fileAccessExtProxy UnregisterNotify fail, bundleName:%{public}s, ret:%{public}d.", + connectInfo->want.GetElement().GetBundleName().c_str(), errorCode); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return errorCode; + } } + notifyAgent_.clear(); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ret; + return ERR_OK; } void FileAccessDeathRecipient::OnRemoteDied(const wptr &remote) 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 c122c13ad64b202fc8736aa944d0f24530e8682a..c1cc9ed045f4e7441cb751185117df4c34b6072a 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 @@ -39,6 +39,7 @@ namespace { constexpr size_t ARGC_ONE = 1; constexpr size_t ARGC_TWO = 2; constexpr size_t ARGC_THREE = 3; + constexpr size_t ARGC_FOUR = 4; constexpr size_t MAX_ARG_COUNT = 5; } @@ -72,7 +73,7 @@ void JsFileAccessExtAbility::Init(const std::shared_ptr &rec moduleName.append("::").append(abilityInfo_->name); HandleScope handleScope(jsRuntime_); - jsObj_ = jsRuntime_.LoadModule(moduleName, srcPath); + jsObj_ = jsRuntime_.LoadModule(moduleName, srcPath, abilityInfo_->hapPath); if (jsObj_ == nullptr) { HILOG_ERROR("Failed to get jsObj_"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); @@ -104,9 +105,9 @@ NativeValue* JsFileAccessExtAbility::FuncCallback(NativeEngine* engine, NativeCa return engine->CreateUndefined(); } - DeviceType deviceType = (DeviceType)UnwrapUint32FromJS(reinterpret_cast(engine), + int32_t deviceType = UnwrapInt32FromJS(reinterpret_cast(engine), reinterpret_cast(info->argv[ARGC_ZERO])); - NotifyType notifyType = (NotifyType)UnwrapUint32FromJS(reinterpret_cast(engine), + int32_t notifyType = UnwrapInt32FromJS(reinterpret_cast(engine), reinterpret_cast(info->argv[ARGC_ONE])); std::string uri = UnwrapStringFromJS(reinterpret_cast(engine), reinterpret_cast(info->argv[ARGC_TWO])); @@ -231,19 +232,19 @@ static int DoCallJsMethod(CallJsParam *param) if (value == nullptr) { HILOG_ERROR("failed to get native value object."); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_ERROR; + return ERR_INVALID_PARAM; } NativeObject *obj = ConvertNativeValueTo(value); if (obj == nullptr) { HILOG_ERROR("failed to get FileExtAbility object."); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_ERROR; + return ERR_INVALID_PARAM; } NativeValue *method = obj->GetProperty(param->funcName.c_str()); if (method == nullptr) { HILOG_ERROR("failed to get %{public}s from FileExtAbility object.", param->funcName.c_str()); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_ERROR; + return ERR_INVALID_PARAM; } if (param->retParser == nullptr) { HILOG_ERROR("ResultValueParser must not null."); @@ -255,6 +256,7 @@ static int DoCallJsMethod(CallJsParam *param) FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return ERR_PARSER_FAIL; } + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return ERR_OK; } @@ -267,19 +269,19 @@ int JsFileAccessExtAbility::CallJsMethod(const std::string &funcName, JsRuntime if (status != napi_ok) { FinishTrace(HITRACE_TAG_FILEMANAGEMENT); HILOG_ERROR("failed to get uv event loop."); - return ERR_ERROR; + return ERR_INVALID_PARAM; } auto param = std::make_shared(funcName, &jsRuntime, jsObj, argParser, retParser); if (param == nullptr) { FinishTrace(HITRACE_TAG_FILEMANAGEMENT); HILOG_ERROR("failed to new param."); - return ERR_ERROR; + return ERR_INVALID_PARAM; } auto work = std::make_shared(); if (work == nullptr) { FinishTrace(HITRACE_TAG_FILEMANAGEMENT); HILOG_ERROR("failed to new uv_work_t."); - return ERR_ERROR; + return ERR_INVALID_PARAM; } work->data = reinterpret_cast(param.get()); int ret = uv_queue_work(loop, work.get(), [](uv_work_t *work) {}, [](uv_work_t *work, int status) { @@ -300,7 +302,7 @@ int JsFileAccessExtAbility::CallJsMethod(const std::string &funcName, JsRuntime if (ret != 0) { FinishTrace(HITRACE_TAG_FILEMANAGEMENT); HILOG_ERROR("failed to exec uv_queue_work."); - return ERR_ERROR; + return ERR_INVALID_PARAM; } std::unique_lock lock(param->fileOperateMutex); param->fileOperateCondition.wait(lock, [param]() { return param->isReady; }); @@ -333,19 +335,27 @@ void JsFileAccessExtAbility::GetSrcPath(std::string &srcPath) FinishTrace(HITRACE_TAG_FILEMANAGEMENT); } -int JsFileAccessExtAbility::OpenFile(const Uri &uri, int flags) +template +struct Value { + T data; + int code {ERR_OK}; +}; + +int JsFileAccessExtAbility::OpenFile(const Uri &uri, int flags, int &fd) { StartTrace(HITRACE_TAG_FILEMANAGEMENT, "OpenFile"); - auto fd = std::make_shared(); + auto value = std::make_shared>(); + if (value == nullptr) { + HILOG_ERROR("OpenFile value is nullptr."); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_NULL_POINTER; + } + auto argParser = [uri, flags](NativeEngine &engine, NativeValue *argv[], size_t &argc) -> bool { NativeValue *nativeUri = engine.CreateString(uri.ToString().c_str(), uri.ToString().length()); - if (nativeUri == nullptr) { - HILOG_ERROR("create uri native js value fail."); - return false; - } NativeValue *nativeFlags = engine.CreateNumber((int32_t)flags); - if (nativeFlags == nullptr) { - HILOG_ERROR("create flags native js value fail."); + if (nativeUri == nullptr || nativeFlags == nullptr) { + HILOG_ERROR("create uri or flags native js value fail."); return false; } argv[ARGC_ZERO] = nativeUri; @@ -353,8 +363,15 @@ int JsFileAccessExtAbility::OpenFile(const Uri &uri, int flags) argc = ARGC_TWO; return true; }; - auto retParser = [fd](NativeEngine &engine, NativeValue *result) -> bool { - bool ret = ConvertFromJsValue(engine, result, *fd); + auto retParser = [value](NativeEngine &engine, NativeValue *result) -> bool { + NativeObject *obj = ConvertNativeValueTo(result); + if (obj == nullptr) { + HILOG_ERROR("Convert js object fail."); + return false; + } + + bool ret = ConvertFromJsValue(engine, obj->GetProperty("fd"), value->data); + ret = ret && ConvertFromJsValue(engine, obj->GetProperty("code"), value->code); if (!ret) { HILOG_ERROR("Convert js value fail."); } @@ -367,23 +384,38 @@ int JsFileAccessExtAbility::OpenFile(const Uri &uri, int flags) FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return errCode; } + + if (value->code != ERR_OK) { + HILOG_ERROR("fileio fail."); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_FILEIO_FAIL; + } + + fd = value->data; + if (fd < ERR_OK) { + HILOG_ERROR("Failed to get file descriptor fd: %{public}d", fd); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_FILEIO_FAIL; + } FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return *fd; + return ERR_OK; } int JsFileAccessExtAbility::CreateFile(const Uri &parent, const std::string &displayName, Uri &newFile) { StartTrace(HITRACE_TAG_FILEMANAGEMENT, "CreateFile"); - auto uri = std::make_shared(); + auto value = std::make_shared>(); + if (value == nullptr) { + HILOG_ERROR("CreateFile value is nullptr."); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_NULL_POINTER; + } + auto argParser = [parent, displayName](NativeEngine &engine, NativeValue *argv[], size_t &argc) -> bool { NativeValue *nativeParent = engine.CreateString(parent.ToString().c_str(), parent.ToString().length()); - if (nativeParent == nullptr) { - HILOG_ERROR("create parent uri native js value fail."); - return false; - } NativeValue *nativeDisplayName = engine.CreateString(displayName.c_str(), displayName.length()); - if (nativeDisplayName == nullptr) { - HILOG_ERROR("create displayName native js value fail."); + if (nativeParent == nullptr || nativeDisplayName == nullptr) { + HILOG_ERROR("create parent uri or displayName native js value fail."); return false; } argv[ARGC_ZERO] = nativeParent; @@ -391,8 +423,15 @@ int JsFileAccessExtAbility::CreateFile(const Uri &parent, const std::string &dis argc = ARGC_TWO; return true; }; - auto retParser = [uri](NativeEngine &engine, NativeValue *result) -> bool { - bool ret = ConvertFromJsValue(engine, result, *uri); + auto retParser = [value](NativeEngine &engine, NativeValue *result) -> bool { + NativeObject *obj = ConvertNativeValueTo(result); + if (obj == nullptr) { + HILOG_ERROR("Convert js object fail."); + return false; + } + + bool ret = ConvertFromJsValue(engine, obj->GetProperty("uri"), value->data); + ret = ret && ConvertFromJsValue(engine, obj->GetProperty("code"), value->code); if (!ret) { HILOG_ERROR("Convert js value fail."); } @@ -405,29 +444,39 @@ int JsFileAccessExtAbility::CreateFile(const Uri &parent, const std::string &dis FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return errCode; } - if ((*uri).empty()) { + + if (value->code != ERR_OK) { + HILOG_ERROR("fileio fail."); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_FILEIO_FAIL; + } + + if ((value->data).empty()) { HILOG_ERROR("call CreateFile with return empty."); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_ERROR; + return ERR_PARSER_FAIL; } - newFile = Uri(*uri); + + newFile = Uri(value->data); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return errCode; + return ERR_OK; } int JsFileAccessExtAbility::Mkdir(const Uri &parent, const std::string &displayName, Uri &newFile) { StartTrace(HITRACE_TAG_FILEMANAGEMENT, "Mkdir"); - auto uri = std::make_shared(); + auto value = std::make_shared>(); + if (value == nullptr) { + HILOG_ERROR("Mkdir value is nullptr."); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_NULL_POINTER; + } + auto argParser = [parent, displayName](NativeEngine &engine, NativeValue *argv[], size_t &argc) -> bool { NativeValue *nativeParent = engine.CreateString(parent.ToString().c_str(), parent.ToString().length()); - if (nativeParent == nullptr) { - HILOG_ERROR("create parent uri native js value fail."); - return false; - } NativeValue *nativeDisplayName = engine.CreateString(displayName.c_str(), displayName.length()); - if (nativeDisplayName == nullptr) { - HILOG_ERROR("create displayName native js value fail."); + if (nativeParent == nullptr || nativeDisplayName == nullptr) { + HILOG_ERROR("create parent uri native js value fail."); return false; } argv[ARGC_ZERO] = nativeParent; @@ -435,11 +484,19 @@ int JsFileAccessExtAbility::Mkdir(const Uri &parent, const std::string &displayN argc = ARGC_TWO; return true; }; - auto retParser = [uri](NativeEngine &engine, NativeValue *result) -> bool { - bool ret = ConvertFromJsValue(engine, result, *uri); + auto retParser = [value](NativeEngine &engine, NativeValue *result) -> bool { + NativeObject *obj = ConvertNativeValueTo(result); + if (obj == nullptr) { + HILOG_ERROR("Convert js object fail."); + return false; + } + + bool ret = ConvertFromJsValue(engine, obj->GetProperty("uri"), value->data); + ret = ret && ConvertFromJsValue(engine, obj->GetProperty("code"), value->code); if (!ret) { HILOG_ERROR("Convert js value fail."); } + return ret; }; @@ -449,20 +506,33 @@ int JsFileAccessExtAbility::Mkdir(const Uri &parent, const std::string &displayN FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return errCode; } - if ((*uri).empty()) { + + if (value->code != ERR_OK) { + HILOG_ERROR("fileio fail."); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_FILEIO_FAIL; + } + + if ((value->data).empty()) { HILOG_ERROR("call Mkdir with return empty."); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_ERROR; + return ERR_PARSER_FAIL; } - newFile = Uri(*uri); + newFile = Uri(value->data); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return errCode; + return ERR_OK; } int JsFileAccessExtAbility::Delete(const Uri &sourceFile) { StartTrace(HITRACE_TAG_FILEMANAGEMENT, "Delete"); auto ret = std::make_shared(); + if (ret == nullptr) { + HILOG_ERROR("Delete value is nullptr."); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_NULL_POINTER; + } + auto argParser = [uri = sourceFile](NativeEngine &engine, NativeValue *argv[], size_t &argc) -> bool { NativeValue *nativeUri = engine.CreateString(uri.ToString().c_str(), uri.ToString().length()); if (nativeUri == nullptr) { @@ -487,34 +557,49 @@ int JsFileAccessExtAbility::Delete(const Uri &sourceFile) FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return errCode; } + + if (*ret != ERR_OK) { + HILOG_ERROR("fileio fail."); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_FILEIO_FAIL; + } + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return *ret; + return ERR_OK; } int JsFileAccessExtAbility::Move(const Uri &sourceFile, const Uri &targetParent, Uri &newFile) { StartTrace(HITRACE_TAG_FILEMANAGEMENT, "Move"); - auto uri = std::make_shared(); + auto value = std::make_shared>(); + if (value == nullptr) { + HILOG_ERROR("Move value is nullptr."); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_NULL_POINTER; + } + auto argParser = [sourceFile, targetParent](NativeEngine &engine, NativeValue* argv[], size_t &argc) -> bool { NativeValue *srcUri = engine.CreateString(sourceFile.ToString().c_str(), sourceFile.ToString().length()); - if (srcUri == nullptr) { + NativeValue *dstUri = engine.CreateString(targetParent.ToString().c_str(), targetParent.ToString().length()); + if (srcUri == nullptr || dstUri == nullptr) { HILOG_ERROR("create sourceFile uri native js value fail."); return false; } - NativeValue *dstUri = engine.CreateString(targetParent.ToString().c_str(), - targetParent.ToString().length()); - if (dstUri == nullptr) { - HILOG_ERROR("create targetParent uri native js value fail."); - return false; - } argv[ARGC_ZERO] = srcUri; argv[ARGC_ONE] = dstUri; argc = ARGC_TWO; return true; }; - auto retParser = [uri](NativeEngine &engine, NativeValue *result) -> bool { - bool ret = ConvertFromJsValue(engine, result, *uri); + auto retParser = [value](NativeEngine &engine, NativeValue *result) -> bool { + NativeObject *obj = ConvertNativeValueTo(result); + if (obj == nullptr) { + HILOG_ERROR("Convert js object fail."); + return false; + } + + bool ret = ConvertFromJsValue(engine, obj->GetProperty("uri"), value->data); + ret = ret && ConvertFromJsValue(engine, obj->GetProperty("code"), value->code); if (!ret) { HILOG_ERROR("Convert js value fail."); } @@ -527,30 +612,38 @@ int JsFileAccessExtAbility::Move(const Uri &sourceFile, const Uri &targetParent, FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return errCode; } - if ((*uri).empty()) { + + if (value->code != ERR_OK) { + HILOG_ERROR("fileio fail."); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_FILEIO_FAIL; + } + + if ((value->data).empty()) { HILOG_ERROR("call move with return empty."); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_ERROR; + return ERR_PARSER_FAIL; } - newFile = Uri(*uri); + newFile = Uri(value->data); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return errCode; + return ERR_OK; } int JsFileAccessExtAbility::Rename(const Uri &sourceFile, const std::string &displayName, Uri &newFile) { StartTrace(HITRACE_TAG_FILEMANAGEMENT, "Rename"); - auto uri = std::make_shared(); + auto value = std::make_shared>(); + if (value == nullptr) { + HILOG_ERROR("Rename value is nullptr."); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_NULL_POINTER; + } auto argParser = [sourceFile, displayName](NativeEngine &engine, NativeValue *argv[], size_t &argc) -> bool { NativeValue *nativeSourceFile = engine.CreateString(sourceFile.ToString().c_str(), sourceFile.ToString().length()); - if (nativeSourceFile == nullptr) { - HILOG_ERROR("create sourceFile uri native js value fail."); - return false; - } NativeValue *nativeDisplayName = engine.CreateString(displayName.c_str(), displayName.length()); - if (nativeDisplayName == nullptr) { - HILOG_ERROR("create displayName native js value fail."); + if (nativeSourceFile == nullptr || nativeDisplayName == nullptr) { + HILOG_ERROR("create sourceFile uri or displayName native js value fail."); return false; } argv[ARGC_ZERO] = nativeSourceFile; @@ -558,8 +651,15 @@ int JsFileAccessExtAbility::Rename(const Uri &sourceFile, const std::string &dis argc = ARGC_TWO; return true; }; - auto retParser = [uri](NativeEngine &engine, NativeValue *result) -> bool { - bool ret = ConvertFromJsValue(engine, result, *uri); + auto retParser = [value](NativeEngine &engine, NativeValue *result) -> bool { + NativeObject *obj = ConvertNativeValueTo(result); + if (obj == nullptr) { + HILOG_ERROR("Convert js object fail."); + return false; + } + + bool ret = ConvertFromJsValue(engine, obj->GetProperty("uri"), value->data); + ret = ret && ConvertFromJsValue(engine, obj->GetProperty("code"), value->code); if (!ret) { HILOG_ERROR("Convert js value fail."); } @@ -572,135 +672,398 @@ int JsFileAccessExtAbility::Rename(const Uri &sourceFile, const std::string &dis FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return errCode; } - if ((*uri).empty()) { + + if (value->code != ERR_OK) { + HILOG_ERROR("fileio fail."); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_FILEIO_FAIL; + } + + if ((value->data).empty()) { HILOG_ERROR("call Rename with return empty."); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_ERROR; + return ERR_PARSER_FAIL; } - newFile = Uri(*uri); + newFile = Uri(value->data); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return errCode; + return ERR_OK; +} + + +static bool ParserListFileJsResult(NativeEngine &engine, NativeValue *nativeValue, Value> &result) +{ + NativeObject *obj = ConvertNativeValueTo(nativeValue); + if (obj == nullptr) { + HILOG_ERROR("Convert js object fail."); + return false; + } + + bool ret = ConvertFromJsValue(engine, obj->GetProperty("code"), result.code); + NativeArray *nativeArray = ConvertNativeValueTo(obj->GetProperty("infos")); + if (nativeArray == nullptr) { + HILOG_ERROR("Convert js array object fail."); + return false; + } + + for (uint32_t i = 0; i < nativeArray->GetLength(); i++) { + NativeValue *nativeFileInfo = nativeArray->GetElement(i); + if (nativeFileInfo == nullptr) { + HILOG_ERROR("get native FileInfo fail."); + return false; + } + + obj = ConvertNativeValueTo(nativeFileInfo); + if (obj == nullptr) { + HILOG_ERROR("Convert js object fail."); + return false; + } + + FileInfo fileInfo; + ret = ret && ConvertFromJsValue(engine, obj->GetProperty("uri"), fileInfo.uri); + ret = ret && ConvertFromJsValue(engine, obj->GetProperty("fileName"), fileInfo.fileName); + ret = ret && ConvertFromJsValue(engine, obj->GetProperty("mode"), fileInfo.mode); + ret = ret && ConvertFromJsValue(engine, obj->GetProperty("size"), fileInfo.size); + ret = ret && ConvertFromJsValue(engine, obj->GetProperty("mtime"), fileInfo.mtime); + ret = ret && ConvertFromJsValue(engine, obj->GetProperty("mimeType"), fileInfo.mimeType); + if (!ret) { + HILOG_ERROR("Convert js value fail."); + return ret; + } + + result.data.emplace_back(std::move(fileInfo)); + } + return true; +} + +static int MakeStringNativeArray(NativeEngine &engine, std::vector &inputArray, NativeValue *resultArray) +{ + NativeArray *nativeArray = ConvertNativeValueTo(resultArray); + if (nativeArray == nullptr) { + HILOG_ERROR("Create NativeArray nullptr"); + return ERR_NULL_POINTER; + } + + bool ret = false; + for (uint32_t i = 0; i < nativeArray->GetLength(); i++) { + NativeValue* nativeValue = engine.CreateString(inputArray[i].c_str(), inputArray[i].length()); + if (nativeValue == nullptr) { + HILOG_ERROR("Create NativeValue fail."); + return ERR_NULL_POINTER; + } + + ret = nativeArray->SetElement(i, nativeValue); + if (!ret) { + HILOG_ERROR("Add NativeValue to NativeArray fail."); + return ERR_PARCEL_FAIL; + } + } + + return ERR_OK; } -std::vector JsFileAccessExtAbility::ListFile(const Uri &sourceFile) +static int MakeJsNativeFileFilter(NativeEngine &engine, const FileFilter &filter, NativeValue *nativeFilter) +{ + nativeFilter = engine.CreateObject(); + if (nativeFilter == nullptr) { + HILOG_ERROR("Create js NativeValue fail."); + return ERR_NULL_POINTER; + } + + NativeValue *suffixArray = engine.CreateArray(filter.GetSuffix().size()); + if (suffixArray == nullptr) { + HILOG_ERROR("Create Suffix native array value fail."); + return ERR_NULL_POINTER; + } + + std::vector suffixVec = filter.GetSuffix(); + int errorCode = MakeStringNativeArray(engine, suffixVec, suffixArray); + if (errorCode != ERR_OK) { + HILOG_ERROR("Create Suffix native array value fail, code:%{public}d.", errorCode); + return errorCode; + } + + NativeValue *displayNameArray = engine.CreateArray(filter.GetDisplayName().size()); + if (displayNameArray == nullptr) { + HILOG_ERROR("Create DisplayName native array value fail."); + return ERR_NULL_POINTER; + } + + std::vector displayNameVec = filter.GetDisplayName(); + errorCode = MakeStringNativeArray(engine, displayNameVec, displayNameArray); + if (errorCode != ERR_OK) { + HILOG_ERROR("Create DisplayName native array value fail, code:%{public}d.", errorCode); + return errorCode; + } + + NativeValue *mimeTypeArray = engine.CreateArray(filter.GetMimeType().size()); + if (mimeTypeArray == nullptr) { + HILOG_ERROR("Create MimeType native array value fail."); + return ERR_NULL_POINTER; + } + + std::vector mimeTypeVec = filter.GetMimeType(); + errorCode = MakeStringNativeArray(engine, mimeTypeVec, mimeTypeArray); + if (errorCode != ERR_OK) { + HILOG_ERROR("Create MimeType native array value fail, code:%{public}d.", errorCode); + return errorCode; + } + + NativeValue *nativeFileSizeOver = engine.CreateNumber(filter.GetFileSizeOver()); + if (nativeFileSizeOver == nullptr) { + HILOG_ERROR("Create NativeFileSizeOver native js value fail."); + return ERR_NULL_POINTER; + } + + NativeValue *nativeLastModifiedAfter = engine.CreateNumber(filter.GetLastModifiedAfter()); + if (nativeLastModifiedAfter == nullptr) { + HILOG_ERROR("Create NativeLastModifiedAfter native js value fail."); + return ERR_NULL_POINTER; + } + + NativeValue *nativeExcludeMedia = engine.CreateBoolean(filter.GetExcludeMedia()); + if (nativeExcludeMedia == nullptr) { + HILOG_ERROR("Create NativeExcludeMedia native js value fail."); + return ERR_NULL_POINTER; + } + + NativeObject *objFilter = ConvertNativeValueTo(nativeFilter); + if (objFilter == nullptr) { + HILOG_ERROR("Convert js object fail."); + return ERR_NULL_POINTER; + } + + bool ret = objFilter->SetProperty("suffix", suffixArray); + ret = ret && objFilter->SetProperty("displayName", displayNameArray); + ret = ret && objFilter->SetProperty("mimeType", mimeTypeArray); + ret = ret && objFilter->SetProperty("fileSizeOver", nativeFileSizeOver); + ret = ret && objFilter->SetProperty("lastModifiedAfter", nativeLastModifiedAfter); + ret = ret && objFilter->SetProperty("excludeMedia", nativeExcludeMedia); + if (!ret) { + HILOG_ERROR("Set property to Filter NativeValue fail."); + return ERR_INVALID_PARAM; + } + + return ERR_OK; +} + +int JsFileAccessExtAbility::ListFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount, + const FileFilter &filter, std::vector &fileInfoVec) { StartTrace(HITRACE_TAG_FILEMANAGEMENT, "ListFile"); - auto fileVec = std::make_shared>(); - auto argParser = [sourceFile](NativeEngine &engine, NativeValue *argv[], size_t &argc) -> bool { - NativeValue *uri = engine.CreateString(sourceFile.ToString().c_str(), sourceFile.ToString().length()); + auto value = std::make_shared>>(); + if (value == nullptr) { + HILOG_ERROR("ListFile value is nullptr."); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_NULL_POINTER; + } + + auto argParser = + [fileInfo, offset, maxCount, filter](NativeEngine &engine, NativeValue *argv[], size_t &argc) -> bool { + NativeValue *uri = engine.CreateString(fileInfo.uri.c_str(), fileInfo.uri.length()); if (uri == nullptr) { HILOG_ERROR("create sourceFile uri native js value fail."); return false; } - argv[ARGC_ZERO] = uri; - argc = ARGC_ONE; - return true; - }; - auto retParser = [fileVec](NativeEngine &engine, NativeValue *result) -> bool { - if (!result->IsArray()) { - HILOG_INFO("result is not array."); + + NativeValue *nativeOffset = engine.CreateNumber(offset); + if (nativeOffset == nullptr) { + HILOG_ERROR("create nativeMaxNum native js value fail."); + return false; + } + + NativeValue *nativeMaxCount = engine.CreateNumber(maxCount); + if (nativeMaxCount == nullptr) { + HILOG_ERROR("create nativeMaxNum native js value fail."); return false; } - NativeArray *nativeArray = ConvertNativeValueTo(result); - for (uint32_t i = 0; i < nativeArray->GetLength(); i++) { - NativeValue *nativeFileInfo = nativeArray->GetElement(i); - NativeObject *obj = ConvertNativeValueTo(nativeFileInfo); - FileInfo fileInfo; - std::string uri; - bool ret = ConvertFromJsValue(engine, obj->GetProperty("uri"), uri); - fileInfo.uri = Uri(uri); - ret = ret && ConvertFromJsValue(engine, obj->GetProperty("fileName"), fileInfo.fileName); - ret = ret && ConvertFromJsValue(engine, obj->GetProperty("mode"), fileInfo.mode); - ret = ret && ConvertFromJsValue(engine, obj->GetProperty("size"), fileInfo.size); - ret = ret && ConvertFromJsValue(engine, obj->GetProperty("mtime"), fileInfo.mtime); - ret = ret && ConvertFromJsValue(engine, obj->GetProperty("mimeType"), fileInfo.mimeType); - if (!ret) { - HILOG_ERROR("Convert js value fail."); + NativeValue* nativeFilter = nullptr; + if (filter.GetHasFilter()) { + int ret = MakeJsNativeFileFilter(engine, filter, nativeFilter); + if (ret != ERR_OK) { + HILOG_ERROR("Create js NativeValue fail."); return ret; } - (*fileVec).emplace_back(std::move(fileInfo)); + } else { + nativeFilter = engine.CreateNull(); + if (nativeFilter == nullptr) { + HILOG_ERROR("Create js NativeValue fail."); + return ERR_NULL_POINTER; + } } + + argv[ARGC_ZERO] = uri; + argv[ARGC_ONE] = nativeOffset; + argv[ARGC_TWO] = nativeMaxCount; + argv[ARGC_THREE] = nativeFilter; + argc = ARGC_FOUR; + return true; + }; + auto retParser = [value](NativeEngine &engine, NativeValue *result) -> bool { + Value> fileInfo; + bool ret = ParserListFileJsResult(engine, result, fileInfo); + if (!ret) { + HILOG_ERROR("Parser js value fail."); + return ret; + } + + *value = std::move(fileInfo); return true; }; auto errCode = CallJsMethod("listFile", jsRuntime_, jsObj_.get(), argParser, retParser); if (errCode != ERR_OK) { HILOG_ERROR("CallJsMethod error, code:%{public}d.", errCode); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return errCode; } + + if (value->code != ERR_OK) { + HILOG_ERROR("fileio fail."); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_FILEIO_FAIL; + } + + fileInfoVec = std::move(value->data); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return std::move(*fileVec); + return ERR_OK; +} + +static bool ParserGetRootsJsResult(NativeEngine &engine, NativeValue *nativeValue, Value> &result) +{ + NativeObject *obj = ConvertNativeValueTo(nativeValue); + if (obj == nullptr) { + HILOG_ERROR("Convert js object fail."); + return false; + } + + bool ret = ConvertFromJsValue(engine, obj->GetProperty("code"), result.code); + NativeArray *nativeArray = ConvertNativeValueTo(obj->GetProperty("roots")); + if (nativeArray == nullptr) { + HILOG_ERROR("nativeArray is nullptr"); + return false; + } + + for (uint32_t i = 0; i < nativeArray->GetLength(); i++) { + NativeValue *nativeRootInfo = nativeArray->GetElement(i); + if (nativeRootInfo == nullptr) { + HILOG_ERROR("get native FileInfo fail."); + return false; + } + + obj = ConvertNativeValueTo(nativeRootInfo); + if (obj == nullptr) { + HILOG_ERROR("Convert js object fail."); + return false; + } + + RootInfo rootInfo; + ret = ret && ConvertFromJsValue(engine, obj->GetProperty("deviceType"), rootInfo.deviceType); + ret = ret && ConvertFromJsValue(engine, obj->GetProperty("uri"), rootInfo.uri); + ret = ret && ConvertFromJsValue(engine, obj->GetProperty("displayName"), rootInfo.displayName); + ret = ret && ConvertFromJsValue(engine, obj->GetProperty("deviceFlags"), rootInfo.deviceFlags); + if (!ret) { + HILOG_ERROR("Convert js value fail."); + return ret; + } + + result.data.emplace_back(std::move(rootInfo)); + } + + return true; } -std::vector JsFileAccessExtAbility::GetRoots() +int JsFileAccessExtAbility::GetRoots(std::vector &rootInfoVec) { StartTrace(HITRACE_TAG_FILEMANAGEMENT, "GetRoots"); - auto devVec = std::make_shared>(); + auto value = std::make_shared>>(); + if (value == nullptr) { + HILOG_ERROR("GetRoots value is nullptr."); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_NULL_POINTER; + } + auto argParser = [](NativeEngine &engine, NativeValue *argv[], size_t &argc) -> bool { argc = ARGC_ZERO; return true; }; - auto retParser = [devVec](NativeEngine &engine, NativeValue *result) -> bool { - if (!result->IsArray()) { - HILOG_INFO("result is not array."); - return false; - } - NativeArray *nativeArray = ConvertNativeValueTo(result); - for (uint32_t i = 0; i < nativeArray->GetLength(); i++) { - NativeValue *nativeDeviceInfo = nativeArray->GetElement(i); - NativeObject *obj = ConvertNativeValueTo(nativeDeviceInfo); - DeviceInfo deviceInfo; - std::string uri; - bool ret = ConvertFromJsValue(engine, obj->GetProperty("uri"), uri); - deviceInfo.uri = Uri(uri); - ret = ret && ConvertFromJsValue(engine, obj->GetProperty("displayName"), deviceInfo.displayName); - ret = ret && ConvertFromJsValue(engine, obj->GetProperty("deviceId"), deviceInfo.deviceId); - ret = ret && ConvertFromJsValue(engine, obj->GetProperty("flags"), deviceInfo.flags); - ret = ret && ConvertFromJsValue(engine, obj->GetProperty("type"), deviceInfo.type); - if (!ret) { - HILOG_ERROR("Convert js value fail."); - return ret; - } - (*devVec).emplace_back(std::move(deviceInfo)); + auto retParser = [value](NativeEngine &engine, NativeValue *result) -> bool { + Value> rootInfoVec; + bool ret = ParserGetRootsJsResult(engine, result, rootInfoVec); + if (!ret) { + HILOG_ERROR("Parser js value fail."); + return ret; } + + *value = std::move(rootInfoVec); return true; }; auto errCode = CallJsMethod("getRoots", jsRuntime_, jsObj_.get(), argParser, retParser); if (errCode != ERR_OK) { - HILOG_ERROR("CallJsMethod error, code:%{public}d.", errCode); + HILOG_ERROR("CallJsMethod error, code:%{public}d", errCode); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return errCode; } + + if (value->code != ERR_OK) { + HILOG_ERROR("fileio fail."); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_FILEIO_FAIL; + } + + rootInfoVec = std::move(value->data); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return std::move(*devVec); + return ERR_OK; } -int JsFileAccessExtAbility::IsFileExist(const Uri &uri, bool &isExist) +int JsFileAccessExtAbility::Access(const Uri &uri, bool &isExist) { - StartTrace(HITRACE_TAG_FILEMANAGEMENT, "IsFileExist"); - auto ret = std::make_shared(); + StartTrace(HITRACE_TAG_FILEMANAGEMENT, "Access"); + auto value = std::make_shared>(); + if (value == nullptr) { + HILOG_ERROR("Access value is nullptr."); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_NULL_POINTER; + } + auto argParser = [uri](NativeEngine &engine, NativeValue *argv[], size_t &argc) -> bool { NativeValue *nativeUri = engine.CreateString(uri.ToString().c_str(), uri.ToString().length()); argv[ARGC_ZERO] = nativeUri; argc = ARGC_ONE; return true; }; - auto retParser = [ret](NativeEngine &engine, NativeValue *result) -> bool { - bool res = ConvertFromJsValue(engine, result, *ret); - if (!res) { + auto retParser = [value](NativeEngine &engine, NativeValue *result) -> bool { + NativeObject *obj = ConvertNativeValueTo(result); + if (obj == nullptr) { + HILOG_ERROR("Convert js object fail."); + return ERR_PARSER_FAIL; + } + + bool ret = ConvertFromJsValue(engine, obj->GetProperty("isExist"), value->data); + ret = ret && ConvertFromJsValue(engine, obj->GetProperty("code"), value->code); + if (!ret) { HILOG_ERROR("Convert js value fail."); } - return res; + return ret; }; - auto errCode = CallJsMethod("isFileExist", jsRuntime_, jsObj_.get(), argParser, retParser); + auto errCode = CallJsMethod("access", jsRuntime_, jsObj_.get(), argParser, retParser); if (errCode != ERR_OK) { HILOG_ERROR("CallJsMethod error, code:%{public}d.", errCode); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return errCode; } - isExist = *ret; + + if (value->code != ERR_OK) { + HILOG_ERROR("fileio fail."); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_FILEIO_FAIL; + } + + isExist = value->data; FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return errCode; + return ERR_OK; } } // namespace FileAccessFwk -} // namespace OHOS \ No newline at end of file +} // namespace OHOS diff --git a/frameworks/innerkits/file_access/src/napi_common_fileaccess.cpp b/frameworks/innerkits/file_access/src/napi_common_fileaccess.cpp index b34865aa73a9d6142bbcce44e927711916ad12bd..b4f3064e3e048a6d83b86d1a47bbd96354c754bf 100644 --- a/frameworks/innerkits/file_access/src/napi_common_fileaccess.cpp +++ b/frameworks/innerkits/file_access/src/napi_common_fileaccess.cpp @@ -113,13 +113,13 @@ napi_value WrapFileInfo(napi_env env, const FileInfo &fileInfo) NAPI_CALL(env, napi_create_object(env, &jsObject)); - jsValue = OHOS::AppExecFwk::WrapStringToJS(env, fileInfo.uri.ToString()); + jsValue = OHOS::AppExecFwk::WrapStringToJS(env, fileInfo.uri); SetPropertyValueByPropertyName(env, jsObject, "uri", jsValue); jsValue = OHOS::AppExecFwk::WrapStringToJS(env, fileInfo.fileName); SetPropertyValueByPropertyName(env, jsObject, "fileName", jsValue); - jsValue = OHOS::AppExecFwk::WrapStringToJS(env, fileInfo.mode); + jsValue = OHOS::AppExecFwk::WrapInt32ToJS(env, fileInfo.mode); SetPropertyValueByPropertyName(env, jsObject, "mode", jsValue); jsValue = OHOS::AppExecFwk::WrapInt64ToJS(env, fileInfo.size); @@ -142,15 +142,16 @@ bool UnwrapFileInfo(napi_env env, napi_value param, FileInfo &fileInfo) std::string natValueString(""); if (OHOS::AppExecFwk::UnwrapStringByPropertyName(env, param, "uri", natValueString)) { - fileInfo.uri = Uri(natValueString); + fileInfo.uri = natValueString; } if (OHOS::AppExecFwk::UnwrapStringByPropertyName(env, param, "fileName", natValueString)) { fileInfo.fileName = natValueString; } - if (OHOS::AppExecFwk::UnwrapStringByPropertyName(env, param, "mode", natValueString)) { - fileInfo.mode = natValueString; + int32_t natValueInt32 = ERR_OK; + if (UnwrapInt32ByPropertyName(env, param, "mode", natValueInt32)) { + fileInfo.mode = natValueInt32; } int64_t natValueInt64 = ERR_OK; @@ -210,71 +211,64 @@ bool UnwrapArrayFileInfoFromJS(napi_env env, napi_value param, std::vector &deviceInfoVec) +napi_value WrapArrayRootInfoToJS(napi_env env, const std::vector &rootInfoVec) { napi_value jsArray = nullptr; napi_value jsValue = nullptr; uint32_t index = ERR_OK; NAPI_CALL(env, napi_create_array(env, &jsArray)); - for (uint32_t i = 0; i < deviceInfoVec.size(); i++) { - jsValue = WrapDeviceInfo(env, deviceInfoVec[i]); + for (uint32_t i = 0; i < rootInfoVec.size(); i++) { + jsValue = WrapRootInfo(env, rootInfoVec[i]); if (napi_set_element(env, jsArray, index, jsValue) == napi_ok) { index++; } @@ -282,7 +276,7 @@ napi_value WrapArrayDeviceInfoToJS(napi_env env, const std::vector & return jsArray; } -bool UnwrapArrayDeviceInfoFromJS(napi_env env, napi_value param, std::vector &deviceInfoVec) +bool UnwrapArrayRootInfoFromJS(napi_env env, napi_value param, std::vector &rootInfoVec) { uint32_t arraySize = ERR_OK; napi_value jsValue = nullptr; @@ -291,19 +285,19 @@ bool UnwrapArrayDeviceInfoFromJS(napi_env env, napi_value param, std::vector fah = nullptr; -Uri newDirUri(""); +Uri g_newDirUri(""); class FileAccessHelperTest : public testing::Test { public: @@ -40,11 +40,23 @@ public: cout << "FileAccessHelperTest code test" << endl; auto saManager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager(); - auto remoteObj = saManager->GetSystemAbility(abilityId); + auto remoteObj = saManager->GetSystemAbility(ABILITY_ID); AAFwk::Want want; - want.SetElementName("com.ohos.medialibrary.medialibrarydata", "FileExtensionAbility"); + vector wantVec; + int ret = FileAccessHelper::GetRegisteredFileAccessExtAbilityInfo(wantVec); + EXPECT_EQ(ret, OHOS::FileAccessFwk::ERR_OK); + bool sus = false; + for (size_t i = 0; i < wantVec.size(); i++) { + auto element = wantVec[i].GetElement(); + if (element.GetBundleName() == "com.ohos.medialibrary.medialibrarydata" && + element.GetAbilityName() == "FileExtensionAbility") { + want = wantVec[i]; + sus = true; + break; + } + } + EXPECT_TRUE(sus); vector wants {want}; - FileAccessHelper::GetRegisterFileAccessExtAbilityInfo(); fah = FileAccessHelper::Creator(remoteObj, wants); } static void TearDownTestCase() {}; @@ -128,7 +140,7 @@ public: }; /** - * @tc.number: SUB_user_file_service_file_access_helper_OpenFile_0000 + * @tc.number: user_file_service_file_access_helper_OpenFile_0000 * @tc.name: file_access_helper_OpenFile_0000 * @tc.desc: Test function of OpenFile interface for SUCCESS. * @tc.size: MEDIUM @@ -146,29 +158,32 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_OpenFile_0000, testing::ext::T OHOS::Security::AccessToken::AccessTokenID tokenId = tokenIdEx.tokenIdExStruct.tokenID; SetSelfTokenID(tokenId); - vector info = fah->GetRoots(); + vector info; + int result = fah->GetRoots(info); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); Uri parentUri(""); if (info.size() > 0) { - parentUri = info[0].uri; + parentUri = Uri(info[0].uri + "/file"); GTEST_LOG_(INFO) << parentUri.ToString(); } - - int result = fah->Mkdir(parentUri, "Download", newDirUri); + + result = fah->Mkdir(parentUri, "Download", g_newDirUri); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - + Uri newDirUriTest(""); - result = fah->Mkdir(newDirUri, "test1", newDirUriTest); + result = fah->Mkdir(g_newDirUri, "test1", newDirUriTest); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); Uri newFileUri(""); result = fah->CreateFile(newDirUriTest, "file_access_helper_OpenFile_0000.txt", newFileUri); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - result = fah->OpenFile(newFileUri, 0); - EXPECT_GT(result, OHOS::FileAccessFwk::ERR_OK); + int fd; + result = fah->OpenFile(newFileUri, 0, fd); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); GTEST_LOG_(INFO) << "OpenFile_0000 result:" << result << endl; - + result = fah->Delete(newDirUriTest); EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); } catch (...) { @@ -178,7 +193,7 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_OpenFile_0000, testing::ext::T } /** - * @tc.number: SUB_user_file_service_file_access_helper_OpenFile_0001 + * @tc.number: user_file_service_file_access_helper_OpenFile_0001 * @tc.name: file_access_helper_OpenFile_0001 * @tc.desc: Test function of OpenFile interface for ERROR which Uri is null. * @tc.size: MEDIUM @@ -191,7 +206,8 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_OpenFile_0001, testing::ext::T GTEST_LOG_(INFO) << "FileAccessHelperTest-begin file_access_helper_OpenFile_0001"; try { Uri uri(""); - int result = fah->OpenFile(uri, 0); + int fd; + int result = fah->OpenFile(uri, 0, fd); EXPECT_LT(result, OHOS::FileAccessFwk::ERR_OK); GTEST_LOG_(INFO) << "OpenFile_0001 result:" << result << endl; } catch (...) { @@ -201,7 +217,7 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_OpenFile_0001, testing::ext::T } /** - * @tc.number: SUB_user_file_service_file_access_helper_OpenFile_0002 + * @tc.number: user_file_service_file_access_helper_OpenFile_0002 * @tc.name: file_access_helper_OpenFile_0002 * @tc.desc: Test function of OpenFile interface for ERROR which Uri is absolute path. * @tc.size: MEDIUM @@ -214,11 +230,12 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_OpenFile_0002, testing::ext::T GTEST_LOG_(INFO) << "FileAccessHelperTest-begin file_access_helper_OpenFile_0002"; try { Uri newFileUri(""); - int result = fah->CreateFile(newDirUri, "file_access_helper_OpenFile_0002.txt", newFileUri); + int result = fah->CreateFile(g_newDirUri, "file_access_helper_OpenFile_0002.txt", newFileUri); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); Uri uri("storage/media/100/local/files/Download/file_access_helper_OpenFile_0002.txt"); - result = fah->OpenFile(uri, 0); + int fd; + result = fah->OpenFile(uri, 0, fd); EXPECT_LT(result, OHOS::FileAccessFwk::ERR_OK); GTEST_LOG_(INFO) << "OpenFile_0002 result:" << result << endl; @@ -231,7 +248,7 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_OpenFile_0002, testing::ext::T } /** - * @tc.number: SUB_user_file_service_file_access_helper_OpenFile_0003 + * @tc.number: user_file_service_file_access_helper_OpenFile_0003 * @tc.name: file_access_helper_OpenFile_0003 * @tc.desc: Test function of OpenFile interface for ERROR which Uri is special symbols. * @tc.size: MEDIUM @@ -244,7 +261,8 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_OpenFile_0003, testing::ext::T GTEST_LOG_(INFO) << "FileAccessHelperTest-begin file_access_helper_OpenFile_0003"; try { Uri uri("~!@#$%^&*()_"); - int result = fah->OpenFile(uri, 0); + int fd; + int result = fah->OpenFile(uri, 0, fd); EXPECT_LT(result, OHOS::FileAccessFwk::ERR_OK); GTEST_LOG_(INFO) << "OpenFile_0003 result:" << result << endl; } catch (...) { @@ -254,7 +272,7 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_OpenFile_0003, testing::ext::T } /** - * @tc.number: SUB_user_file_service_file_access_helper_OpenFile_0004 + * @tc.number: user_file_service_file_access_helper_OpenFile_0004 * @tc.name: file_access_helper_OpenFile_0004 * @tc.desc: Test function of OpenFile interface for ERROR which flag is -1. * @tc.size: MEDIUM @@ -267,10 +285,11 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_OpenFile_0004, testing::ext::T GTEST_LOG_(INFO) << "FileAccessHelperTest-begin file_access_helper_OpenFile_0004"; try { Uri newFileUri(""); - int result = fah->CreateFile(newDirUri, "file_access_helper_OpenFile_0004.txt", newFileUri); + int result = fah->CreateFile(g_newDirUri, "file_access_helper_OpenFile_0004.txt", newFileUri); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - result = fah->OpenFile(newFileUri, -1); + int fd; + result = fah->OpenFile(newFileUri, -1, fd); EXPECT_LT(result, OHOS::FileAccessFwk::ERR_OK); GTEST_LOG_(INFO) << "OpenFile_0004 result:" << result << endl; @@ -283,7 +302,7 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_OpenFile_0004, testing::ext::T } /** - * @tc.number: SUB_user_file_service_file_access_helper_OpenFile_0005 + * @tc.number: user_file_service_file_access_helper_OpenFile_0005 * @tc.name: file_access_helper_OpenFile_0005 * @tc.desc: Test function of OpenFile interface for SUCCESS which flag is 1. * @tc.size: MEDIUM @@ -296,11 +315,12 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_OpenFile_0005, testing::ext::T GTEST_LOG_(INFO) << "FileAccessHelperTest-begin file_access_helper_OpenFile_0005"; try { Uri newFileUri(""); - int result = fah->CreateFile(newDirUri, "file_access_helper_OpenFile_0005.txt", newFileUri); + int result = fah->CreateFile(g_newDirUri, "file_access_helper_OpenFile_0005.txt", newFileUri); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - result = fah->OpenFile(newFileUri, 1); - EXPECT_GT(result, OHOS::FileAccessFwk::ERR_OK); + int fd; + result = fah->OpenFile(newFileUri, 1, fd); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); GTEST_LOG_(INFO) << "OpenFile_0005 result:" << result << endl; result = fah->Delete(newFileUri); @@ -312,7 +332,7 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_OpenFile_0005, testing::ext::T } /** - * @tc.number: SUB_user_file_service_file_access_helper_OpenFile_0006 + * @tc.number: user_file_service_file_access_helper_OpenFile_0006 * @tc.name: file_access_helper_OpenFile_0006 * @tc.desc: Test function of OpenFile interface for SUCCESS which flag is 2. * @tc.size: MEDIUM @@ -325,11 +345,12 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_OpenFile_0006, testing::ext::T GTEST_LOG_(INFO) << "FileAccessHelperTest-begin file_access_helper_OpenFile_0006"; try { Uri newFileUri(""); - int result = fah->CreateFile(newDirUri, "file_access_helper_OpenFile_0006.txt", newFileUri); + int result = fah->CreateFile(g_newDirUri, "file_access_helper_OpenFile_0006.txt", newFileUri); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - result = fah->OpenFile(newFileUri, 2); - EXPECT_GT(result, OHOS::FileAccessFwk::ERR_OK); + int fd; + result = fah->OpenFile(newFileUri, 2, fd); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); GTEST_LOG_(INFO) << "OpenFile_0006 result:" << result << endl; result = fah->Delete(newFileUri); @@ -341,7 +362,7 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_OpenFile_0006, testing::ext::T } /** - * @tc.number: SUB_user_file_service_file_access_helper_CreateFile_0000 + * @tc.number: user_file_service_file_access_helper_CreateFile_0000 * @tc.name: file_access_helper_CreateFile_0000 * @tc.desc: Test function of CreateFile interface for SUCCESS. * @tc.size: MEDIUM @@ -354,7 +375,7 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_CreateFile_0000, testing::ext: GTEST_LOG_(INFO) << "FileAccessHelperTest-begin file_access_helper_CreateFile_0000"; try { Uri newFileUri(""); - int result = fah->CreateFile(newDirUri, "file_access_helper_CreateFile_0000.txt", newFileUri); + int result = fah->CreateFile(g_newDirUri, "file_access_helper_CreateFile_0000.txt", newFileUri); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); GTEST_LOG_(INFO) << "CreateFile_0000 result:" << result << endl; @@ -367,7 +388,7 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_CreateFile_0000, testing::ext: } /** - * @tc.number: SUB_user_file_service_file_access_helper_CreateFile_0001 + * @tc.number: user_file_service_file_access_helper_CreateFile_0001 * @tc.name: file_access_helper_CreateFile_0001 * @tc.desc: Test function of CreateFile interface for ERROR which parentUri is null. * @tc.size: MEDIUM @@ -391,7 +412,7 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_CreateFile_0001, testing::ext: } /** - * @tc.number: SUB_user_file_service_file_access_helper_CreateFile_0002 + * @tc.number: user_file_service_file_access_helper_CreateFile_0002 * @tc.name: file_access_helper_CreateFile_0002 * @tc.desc: Test function of CreateFile interface for ERROR which parentUri is absolute path. * @tc.size: MEDIUM @@ -415,7 +436,7 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_CreateFile_0002, testing::ext: } /** - * @tc.number: SUB_user_file_service_file_access_helper_CreateFile_0003 + * @tc.number: user_file_service_file_access_helper_CreateFile_0003 * @tc.name: file_access_helper_CreateFile_0003 * @tc.desc: Test function of CreateFile interface for ERROR which parentUri is special symbols. * @tc.size: MEDIUM @@ -439,7 +460,7 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_CreateFile_0003, testing::ext: } /** - * @tc.number: SUB_user_file_service_file_access_helper_CreateFile_0004 + * @tc.number: user_file_service_file_access_helper_CreateFile_0004 * @tc.name: file_access_helper_CreateFile_0004 * @tc.desc: Test function of CreateFile interface for ERROR which displayName is null. * @tc.size: MEDIUM @@ -453,7 +474,7 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_CreateFile_0004, testing::ext: try { Uri newFileUri(""); string displayName = ""; - int result = fah->CreateFile(newDirUri, displayName, newFileUri); + int result = fah->CreateFile(g_newDirUri, displayName, newFileUri); EXPECT_NE(result, OHOS::FileAccessFwk::ERR_OK); GTEST_LOG_(INFO) << "CreateFile_0004 result:" << result << endl; } catch (...) { @@ -463,7 +484,7 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_CreateFile_0004, testing::ext: } /** - * @tc.number: SUB_user_file_service_file_access_helper_Mkdir_0000 + * @tc.number: user_file_service_file_access_helper_Mkdir_0000 * @tc.name: file_access_helper_Mkdir_0000 * @tc.desc: Test function of Mkdir interface for SUCCESS. * @tc.size: MEDIUM @@ -476,7 +497,7 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_Mkdir_0000, testing::ext::Test GTEST_LOG_(INFO) << "FileAccessHelperTest-begin file_access_helper_Mkdir_0000"; try { Uri newDirUriTest(""); - int result = fah->Mkdir(newDirUri, "file_access_helper_Mkdir_0000", newDirUriTest); + int result = fah->Mkdir(g_newDirUri, "file_access_helper_Mkdir_0000", newDirUriTest); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); GTEST_LOG_(INFO) << "Mkdir_0000 result:" << result << endl; @@ -489,7 +510,7 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_Mkdir_0000, testing::ext::Test } /** - * @tc.number: SUB_user_file_service_file_access_helper_Mkdir_0001 + * @tc.number: user_file_service_file_access_helper_Mkdir_0001 * @tc.name: file_access_helper_Mkdir_0001 * @tc.desc: Test function of Mkdir interface for ERROR which parentUri is null. * @tc.size: MEDIUM @@ -513,7 +534,7 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_Mkdir_0001, testing::ext::Test } /** - * @tc.number: SUB_user_file_service_file_access_helper_Mkdir_0002 + * @tc.number: user_file_service_file_access_helper_Mkdir_0002 * @tc.name: file_access_helper_Mkdir_0002 * @tc.desc: Test function of Mkdir interface for ERROR which parentUri is absolute path. * @tc.size: MEDIUM @@ -537,7 +558,7 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_Mkdir_0002, testing::ext::Test } /** - * @tc.number: SUB_user_file_service_file_access_helper_Mkdir_0003 + * @tc.number: user_file_service_file_access_helper_Mkdir_0003 * @tc.name: file_access_helper_Mkdir_0003 * @tc.desc: Test function of Mkdir interface for ERROR which parentUri is special symbols. * @tc.size: MEDIUM @@ -561,7 +582,7 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_Mkdir_0003, testing::ext::Test } /** - * @tc.number: SUB_user_file_service_file_access_helper_Mkdir_0004 + * @tc.number: user_file_service_file_access_helper_Mkdir_0004 * @tc.name: file_access_helper_Mkdir_0004 * @tc.desc: Test function of Mkdir interface for ERROR which displayName is null. * @tc.size: MEDIUM @@ -575,7 +596,7 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_Mkdir_0004, testing::ext::Test try { Uri newDirUriTest(""); string displayName = ""; - int result = fah->Mkdir(newDirUri, displayName, newDirUriTest); + int result = fah->Mkdir(g_newDirUri, displayName, newDirUriTest); EXPECT_NE(result, OHOS::FileAccessFwk::ERR_OK); GTEST_LOG_(INFO) << "Mkdir_0004 result:" << result << endl; } catch (...) { @@ -585,7 +606,7 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_Mkdir_0004, testing::ext::Test } /** - * @tc.number: SUB_user_file_service_file_access_helper_Delete_0000 + * @tc.number: user_file_service_file_access_helper_Delete_0000 * @tc.name: file_access_helper_Delete_0000 * @tc.desc: Test function of Delete interface for SUCCESS which delete file. * @tc.size: MEDIUM @@ -598,7 +619,7 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_Delete_0000, testing::ext::Tes GTEST_LOG_(INFO) << "FileAccessHelperTest-begin file_access_helper_Delete_0000"; try { Uri newDirUriTest(""); - int result = fah->Mkdir(newDirUri, "test", newDirUriTest); + int result = fah->Mkdir(g_newDirUri, "test", newDirUriTest); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); Uri newFileUri(""); @@ -608,7 +629,7 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_Delete_0000, testing::ext::Tes result = fah->Delete(newFileUri); EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); GTEST_LOG_(INFO) << "Delete_0000 result:" << result << endl; - + result = fah->Delete(newDirUriTest); EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); } catch (...) { @@ -618,7 +639,7 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_Delete_0000, testing::ext::Tes } /** - * @tc.number: SUB_user_file_service_file_access_helper_Delete_0001 + * @tc.number: user_file_service_file_access_helper_Delete_0001 * @tc.name: file_access_helper_Delete_0001 * @tc.desc: Test function of Delete interface for SUCCESS which delete folder. * @tc.size: MEDIUM @@ -631,9 +652,9 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_Delete_0001, testing::ext::Tes GTEST_LOG_(INFO) << "FileAccessHelperTest-begin file_access_helper_Delete_0001"; try { Uri newDirUriTest(""); - int result = fah->Mkdir(newDirUri, "test", newDirUriTest); + int result = fah->Mkdir(g_newDirUri, "test", newDirUriTest); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - + result = fah->Delete(newDirUriTest); EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); GTEST_LOG_(INFO) << "Delete_0001 result:" << result << endl; @@ -644,7 +665,7 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_Delete_0001, testing::ext::Tes } /** - * @tc.number: SUB_user_file_service_file_access_helper_Delete_0002 + * @tc.number: user_file_service_file_access_helper_Delete_0002 * @tc.name: file_access_helper_Delete_0002 * @tc.desc: Test function of Delete interface for ERROR which selectFileUri is null. * @tc.size: MEDIUM @@ -667,7 +688,7 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_Delete_0002, testing::ext::Tes } /** - * @tc.number: SUB_user_file_service_file_access_helper_Delete_0003 + * @tc.number: user_file_service_file_access_helper_Delete_0003 * @tc.name: file_access_helper_Delete_0003 * @tc.desc: Test function of Delete interface for ERROR which selectFileUri is absolute path. * @tc.size: MEDIUM @@ -680,13 +701,13 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_Delete_0003, testing::ext::Tes GTEST_LOG_(INFO) << "FileAccessHelperTest-begin file_access_helper_Delete_0003"; try { Uri newDirUriTest(""); - int result = fah->Mkdir(newDirUri, "test", newDirUriTest); + int result = fah->Mkdir(g_newDirUri, "test", newDirUriTest); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - + Uri selectFileUri("storage/media/100/local/files/Download/test"); result = fah->Delete(selectFileUri); EXPECT_LT(result, OHOS::FileAccessFwk::ERR_OK); - + result = fah->Delete(newDirUriTest); EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); GTEST_LOG_(INFO) << "Delete_0003 result:" << result << endl; @@ -697,7 +718,7 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_Delete_0003, testing::ext::Tes } /** - * @tc.number: SUB_user_file_service_file_access_helper_Delete_0004 + * @tc.number: user_file_service_file_access_helper_Delete_0004 * @tc.name: file_access_helper_Delete_0004 * @tc.desc: Test function of Delete interface for ERROR which selectFileUri is special symbols. * @tc.size: MEDIUM @@ -720,7 +741,7 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_Delete_0004, testing::ext::Tes } /** - * @tc.number: SUB_user_file_service_file_access_helper_Move_0000 + * @tc.number: user_file_service_file_access_helper_Move_0000 * @tc.name: file_access_helper_Move_0000 * @tc.desc: Test function of Move interface for SUCCESS which move file. * @tc.size: MEDIUM @@ -734,10 +755,10 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_Move_0000, testing::ext::TestS try { Uri newDirUriTest1(""); Uri newDirUriTest2(""); - int result = fah->Mkdir(newDirUri, "test1", newDirUriTest1); + int result = fah->Mkdir(g_newDirUri, "test1", newDirUriTest1); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - result = fah->Mkdir(newDirUri, "test2", newDirUriTest2); + result = fah->Mkdir(g_newDirUri, "test2", newDirUriTest2); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); Uri testUri(""); @@ -748,7 +769,7 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_Move_0000, testing::ext::TestS result = fah->Move(testUri, newDirUriTest2, testUri2); EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); GTEST_LOG_(INFO) << "Move_0000 result:" << result << endl; - + result = fah->Delete(newDirUriTest1); EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); @@ -761,7 +782,7 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_Move_0000, testing::ext::TestS } /** - * @tc.number: SUB_user_file_service_file_access_helper_Move_0001 + * @tc.number: user_file_service_file_access_helper_Move_0001 * @tc.name: file_access_helper_Move_0001 * @tc.desc: Test function of Move interface for SUCCESS which move folder. * @tc.size: MEDIUM @@ -775,10 +796,10 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_Move_0001, testing::ext::TestS try { Uri newDirUriTest1(""); Uri newDirUriTest2(""); - int result = fah->Mkdir(newDirUri, "test1", newDirUriTest1); + int result = fah->Mkdir(g_newDirUri, "test1", newDirUriTest1); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - result = fah->Mkdir(newDirUri, "test2", newDirUriTest2); + result = fah->Mkdir(g_newDirUri, "test2", newDirUriTest2); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); Uri testUri(""); @@ -799,7 +820,7 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_Move_0001, testing::ext::TestS } /** - * @tc.number: SUB_user_file_service_file_access_helper_Move_0002 + * @tc.number: user_file_service_file_access_helper_Move_0002 * @tc.name: file_access_helper_Move_0002 * @tc.desc: Test function of Move interface for ERROR which sourceFileUri is null. * @tc.size: MEDIUM @@ -812,15 +833,15 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_Move_0002, testing::ext::TestS GTEST_LOG_(INFO) << "FileAccessHelperTest-begin file_access_helper_Move_0002"; try { Uri newDirUriTest(""); - int result = fah->Mkdir(newDirUri, "test", newDirUriTest); + int result = fah->Mkdir(g_newDirUri, "test", newDirUriTest); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); Uri testUri(""); Uri sourceFileUri(""); result = fah->Move(sourceFileUri, newDirUriTest, testUri); - EXPECT_EQ(result, ERR_OPERATION_NOT_PERMITTED); + EXPECT_LT(result, OHOS::FileAccessFwk::ERR_OK); GTEST_LOG_(INFO) << "Move_0002 result:" << result << endl; - + result = fah->Delete(newDirUriTest); EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); } catch (...) { @@ -830,7 +851,7 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_Move_0002, testing::ext::TestS } /** - * @tc.number: SUB_user_file_service_file_access_helper_Move_0003 + * @tc.number: user_file_service_file_access_helper_Move_0003 * @tc.name: file_access_helper_Move_0003 * @tc.desc: Test function of Move interface for ERROR which sourceFileUri is absolute path. * @tc.size: MEDIUM @@ -844,10 +865,10 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_Move_0003, testing::ext::TestS try { Uri newDirUriTest1(""); Uri newDirUriTest2(""); - int result = fah->Mkdir(newDirUri, "test1", newDirUriTest1); + int result = fah->Mkdir(g_newDirUri, "test1", newDirUriTest1); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - result = fah->Mkdir(newDirUri, "test2", newDirUriTest2); + result = fah->Mkdir(g_newDirUri, "test2", newDirUriTest2); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); Uri testUri(""); @@ -857,9 +878,9 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_Move_0003, testing::ext::TestS Uri testUri2(""); Uri sourceFileUri("storage/media/100/local/files/Download/test1/test.txt"); result = fah->Move(sourceFileUri, newDirUriTest2, testUri2); - EXPECT_EQ(result, ERR_OPERATION_NOT_PERMITTED); + EXPECT_LT(result, OHOS::FileAccessFwk::ERR_OK); GTEST_LOG_(INFO) << "Move_0003 result:" << result << endl; - + result = fah->Delete(newDirUriTest1); EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); @@ -872,7 +893,7 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_Move_0003, testing::ext::TestS } /** - * @tc.number: SUB_user_file_service_file_access_helper_Move_0004 + * @tc.number: user_file_service_file_access_helper_Move_0004 * @tc.name: file_access_helper_Move_0004 * @tc.desc: Test function of Move interface for ERROR which sourceFileUri is special symbols. * @tc.size: MEDIUM @@ -885,15 +906,15 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_Move_0004, testing::ext::TestS GTEST_LOG_(INFO) << "FileAccessHelperTest-begin file_access_helper_Move_0004"; try { Uri newDirUriTest(""); - int result = fah->Mkdir(newDirUri, "test", newDirUriTest); + int result = fah->Mkdir(g_newDirUri, "test", newDirUriTest); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); Uri testUri(""); Uri sourceFileUri("~!@#$%^&*()_"); result = fah->Move(sourceFileUri, newDirUriTest, testUri); - EXPECT_EQ(result, ERR_OPERATION_NOT_PERMITTED); + EXPECT_LT(result, OHOS::FileAccessFwk::ERR_OK); GTEST_LOG_(INFO) << "Move_0004 result:" << result << endl; - + result = fah->Delete(newDirUriTest); EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); } catch (...) { @@ -903,7 +924,7 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_Move_0004, testing::ext::TestS } /** - * @tc.number: SUB_user_file_service_file_access_helper_Move_0005 + * @tc.number: user_file_service_file_access_helper_Move_0005 * @tc.name: file_access_helper_Move_0005 * @tc.desc: Test function of Move interface for ERROR which targetParentUri is null. * @tc.size: MEDIUM @@ -916,7 +937,7 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_Move_0005, testing::ext::TestS GTEST_LOG_(INFO) << "FileAccessHelperTest-begin file_access_helper_Move_0005"; try { Uri newDirUriTest(""); - int result = fah->Mkdir(newDirUri, "test1", newDirUriTest); + int result = fah->Mkdir(g_newDirUri, "test1", newDirUriTest); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); Uri testUri(""); @@ -926,9 +947,9 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_Move_0005, testing::ext::TestS Uri testUri2(""); Uri targetParentUri(""); result = fah->Move(testUri, targetParentUri, testUri2); - EXPECT_EQ(result, ERR_OPERATION_NOT_PERMITTED); + EXPECT_LT(result, OHOS::FileAccessFwk::ERR_OK); GTEST_LOG_(INFO) << "Move_0005 result:" << result << endl; - + result = fah->Delete(newDirUriTest); EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); } catch (...) { @@ -938,7 +959,7 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_Move_0005, testing::ext::TestS } /** - * @tc.number: SUB_user_file_service_file_access_helper_Move_0006 + * @tc.number: user_file_service_file_access_helper_Move_0006 * @tc.name: file_access_helper_Move_0006 * @tc.desc: Test function of Move interface for ERROR which targetParentUri is absolute path. * @tc.size: MEDIUM @@ -952,10 +973,10 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_Move_0006, testing::ext::TestS try { Uri newDirUriTest1(""); Uri newDirUriTest2(""); - int result = fah->Mkdir(newDirUri, "test1", newDirUriTest1); + int result = fah->Mkdir(g_newDirUri, "test1", newDirUriTest1); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - result = fah->Mkdir(newDirUri, "test2", newDirUriTest2); + result = fah->Mkdir(g_newDirUri, "test2", newDirUriTest2); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); Uri testUri(""); @@ -965,9 +986,9 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_Move_0006, testing::ext::TestS Uri testUri2(""); Uri targetParentUri("storage/media/100/local/files/Download/test2"); result = fah->Move(testUri, targetParentUri, testUri2); - EXPECT_EQ(result, ERR_OPERATION_NOT_PERMITTED); + EXPECT_LT(result, OHOS::FileAccessFwk::ERR_OK); GTEST_LOG_(INFO) << "Move_0006 result:" << result << endl; - + result = fah->Delete(newDirUriTest1); EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); @@ -980,7 +1001,7 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_Move_0006, testing::ext::TestS } /** - * @tc.number: SUB_user_file_service_file_access_helper_Move_0007 + * @tc.number: user_file_service_file_access_helper_Move_0007 * @tc.name: file_access_helper_Move_0007 * @tc.desc: Test function of Move interface for ERROR which targetParentUri is special symbols. * @tc.size: MEDIUM @@ -994,10 +1015,10 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_Move_0007, testing::ext::TestS try { Uri newDirUriTest1(""); Uri newDirUriTest2(""); - int result = fah->Mkdir(newDirUri, "test1", newDirUriTest1); + int result = fah->Mkdir(g_newDirUri, "test1", newDirUriTest1); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - result = fah->Mkdir(newDirUri, "test2", newDirUriTest2); + result = fah->Mkdir(g_newDirUri, "test2", newDirUriTest2); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); Uri testUri(""); @@ -1007,9 +1028,9 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_Move_0007, testing::ext::TestS Uri testUri2(""); Uri targetParentUri("~!@#$^%&*()_"); result = fah->Move(testUri, targetParentUri, testUri2); - EXPECT_EQ(result, ERR_OPERATION_NOT_PERMITTED); + EXPECT_LT(result, OHOS::FileAccessFwk::ERR_OK); GTEST_LOG_(INFO) << "Move_0007 result:" << result << endl; - + result = fah->Delete(newDirUriTest1); EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); @@ -1022,7 +1043,7 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_Move_0007, testing::ext::TestS } /** - * @tc.number: SUB_user_file_service_file_access_helper_Move_0008 + * @tc.number: user_file_service_file_access_helper_Move_0008 * @tc.name: file_access_helper_Move_0008 * @tc.desc: Test function of Move interface for SUCCESS which move empty folder. * @tc.size: MEDIUM @@ -1036,10 +1057,10 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_Move_0008, testing::ext::TestS try { Uri newDirUriTest1(""); Uri newDirUriTest2(""); - int result = fah->Mkdir(newDirUri, "test1", newDirUriTest1); + int result = fah->Mkdir(g_newDirUri, "test1", newDirUriTest1); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - result = fah->Mkdir(newDirUri, "test2", newDirUriTest2); + result = fah->Mkdir(g_newDirUri, "test2", newDirUriTest2); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); Uri testUri2(""); @@ -1056,7 +1077,7 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_Move_0008, testing::ext::TestS } /** - * @tc.number: SUB_user_file_service_file_access_helper_Move_0009 + * @tc.number: user_file_service_file_access_helper_Move_0009 * @tc.name: file_access_helper_Move_0009 * @tc.desc: Test function of Move interface for SUCCESS which move more file in folder. * @tc.size: MEDIUM @@ -1070,14 +1091,14 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_Move_0009, testing::ext::TestS try { Uri newDirUriTest1(""); Uri newDirUriTest2(""); - int result = fah->Mkdir(newDirUri, "test1", newDirUriTest1); + int result = fah->Mkdir(g_newDirUri, "test1", newDirUriTest1); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - result = fah->Mkdir(newDirUri, "test2", newDirUriTest2); + result = fah->Mkdir(g_newDirUri, "test2", newDirUriTest2); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + Uri testUri(""); for (size_t i = 0; i < 2000; i++) { - Uri testUri(""); string fileName = "test" + ToString(i) + ".txt"; fah->CreateFile(newDirUriTest1, fileName, testUri); } @@ -1096,7 +1117,7 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_Move_0009, testing::ext::TestS } /** - * @tc.number: SUB_user_file_service_file_access_helper_Move_0010 + * @tc.number: user_file_service_file_access_helper_Move_0010 * @tc.name: file_access_helper_Move_0010 * @tc.desc: Test function of Move interface for SUCCESS which move Multilevel directory folder. * @tc.size: MEDIUM @@ -1110,10 +1131,10 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_Move_0010, testing::ext::TestS try { Uri newDirUriTest1(""); Uri newDirUriTest2(""); - int result = fah->Mkdir(newDirUri, "test1", newDirUriTest1); + int result = fah->Mkdir(g_newDirUri, "test1", newDirUriTest1); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - result = fah->Mkdir(newDirUri, "test2", newDirUriTest2); + result = fah->Mkdir(g_newDirUri, "test2", newDirUriTest2); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); Uri testUri(""); @@ -1136,7 +1157,7 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_Move_0010, testing::ext::TestS } /** - * @tc.number: SUB_user_file_service_file_access_helper_Rename_0000 + * @tc.number: user_file_service_file_access_helper_Rename_0000 * @tc.name: file_access_helper_Rename_0000 * @tc.desc: Test function of Rename interface for SUCCESS which rename file. * @tc.size: MEDIUM @@ -1149,7 +1170,7 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_Rename_0000, testing::ext::Tes GTEST_LOG_(INFO) << "FileAccessHelperTest-begin file_access_helper_Rename_0000"; try { Uri newDirUriTest(""); - int result = fah->Mkdir(newDirUri, "test", newDirUriTest); + int result = fah->Mkdir(g_newDirUri, "test", newDirUriTest); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); Uri testUri(""); @@ -1170,7 +1191,7 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_Rename_0000, testing::ext::Tes } /** - * @tc.number: SUB_user_file_service_file_access_helper_Rename_0001 + * @tc.number: user_file_service_file_access_helper_Rename_0001 * @tc.name: file_access_helper_Rename_0001 * @tc.desc: Test function of Rename interface for SUCCESS which rename folder. * @tc.size: MEDIUM @@ -1183,7 +1204,7 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_Rename_0001, testing::ext::Tes GTEST_LOG_(INFO) << "FileAccessHelperTest-begin file_access_helper_Rename_0001"; try { Uri newDirUriTest(""); - int result = fah->Mkdir(newDirUri, "test", newDirUriTest); + int result = fah->Mkdir(g_newDirUri, "test", newDirUriTest); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); Uri renameUri(""); @@ -1200,7 +1221,7 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_Rename_0001, testing::ext::Tes } /** - * @tc.number: SUB_user_file_service_file_access_helper_Rename_0002 + * @tc.number: user_file_service_file_access_helper_Rename_0002 * @tc.name: file_access_helper_Rename_0002 * @tc.desc: Test function of Rename interface for ERROR which sourceFileUri is null. * @tc.size: MEDIUM @@ -1224,7 +1245,7 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_Rename_0002, testing::ext::Tes } /** - * @tc.number: SUB_user_file_service_file_access_helper_Rename_0003 + * @tc.number: user_file_service_file_access_helper_Rename_0003 * @tc.name: file_access_helper_Rename_0003 * @tc.desc: Test function of Rename interface for ERROR which sourceFileUri is absolute path. * @tc.size: MEDIUM @@ -1237,7 +1258,7 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_Rename_0003, testing::ext::Tes GTEST_LOG_(INFO) << "FileAccessHelperTest-begin file_access_helper_Rename_0003"; try { Uri newDirUriTest(""); - int result = fah->Mkdir(newDirUri, "test", newDirUriTest); + int result = fah->Mkdir(g_newDirUri, "test", newDirUriTest); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); Uri testUri(""); @@ -1249,7 +1270,7 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_Rename_0003, testing::ext::Tes result = fah->Rename(sourceFileUri, "testRename.txt", renameUri); EXPECT_LT(result, OHOS::FileAccessFwk::ERR_OK); GTEST_LOG_(INFO) << "Rename_0003 result:" << result << endl; - + result = fah->Delete(newDirUriTest); EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); } catch (...) { @@ -1259,7 +1280,7 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_Rename_0003, testing::ext::Tes } /** - * @tc.number: SUB_user_file_service_file_access_helper_Rename_0004 + * @tc.number: user_file_service_file_access_helper_Rename_0004 * @tc.name: file_access_helper_Rename_0004 * @tc.desc: Test function of Rename interface for ERROR which sourceFileUri is special symbols. * @tc.size: MEDIUM @@ -1283,7 +1304,7 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_Rename_0004, testing::ext::Tes } /** - * @tc.number: SUB_user_file_service_file_access_helper_Rename_0005 + * @tc.number: user_file_service_file_access_helper_Rename_0005 * @tc.name: file_access_helper_Rename_0005 * @tc.desc: Test function of Rename interface for ERROR which displayName is null. * @tc.size: MEDIUM @@ -1296,7 +1317,7 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_Rename_0005, testing::ext::Tes GTEST_LOG_(INFO) << "FileAccessHelperTest-begin file_access_helper_Rename_0005"; try { Uri newDirUriTest(""); - int result = fah->Mkdir(newDirUri, "test", newDirUriTest); + int result = fah->Mkdir(g_newDirUri, "test", newDirUriTest); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); Uri testUri(""); @@ -1305,9 +1326,7 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_Rename_0005, testing::ext::Tes Uri renameUri(""); result = fah->Rename(testUri, "", renameUri); - - int errorCode = 102825990; - EXPECT_EQ(result, errorCode); + EXPECT_LT(result, OHOS::FileAccessFwk::ERR_OK); GTEST_LOG_(INFO) << "Rename_0005 result:" << result << endl; result = fah->Delete(newDirUriTest); @@ -1319,7 +1338,7 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_Rename_0005, testing::ext::Tes } /** - * @tc.number: SUB_user_file_service_file_access_helper_ListFile_0000 + * @tc.number: user_file_service_file_access_helper_ListFile_0000 * @tc.name: file_access_helper_ListFile_0000 * @tc.desc: Test function of ListFile interface for SUCCESS. * @tc.size: MEDIUM @@ -1332,16 +1351,23 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_ListFile_0000, testing::ext::T GTEST_LOG_(INFO) << "FileAccessHelperTest-begin file_access_helper_ListFile_0000"; try { Uri newDirUriTest(""); - int result = fah->Mkdir(newDirUri, "test", newDirUriTest); + int result = fah->Mkdir(g_newDirUri, "test", newDirUriTest); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); Uri testUri(""); result = fah->CreateFile(newDirUriTest, "file_access_helper_ListFile_0000.txt", testUri); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - std::vector fileInfo = fah->ListFile(newDirUriTest); - EXPECT_GT(fileInfo.size(), 0); - GTEST_LOG_(INFO) << "ListFile_0000 result:" << fileInfo.size() << endl; + FileInfo fileInfo; + fileInfo.uri = newDirUriTest.ToString(); + int64_t offset = 0; + int64_t maxCount = 1000; + std::vector fileInfoVec; + FileFilter filter; + result = fah->ListFile(fileInfo, offset, maxCount, filter, fileInfoVec); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + EXPECT_GT(fileInfoVec.size(), 0); + GTEST_LOG_(INFO) << "ListFile_0000 result:" << fileInfoVec.size() << endl; result = fah->Delete(newDirUriTest); EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); @@ -1352,7 +1378,7 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_ListFile_0000, testing::ext::T } /** - * @tc.number: SUB_user_file_service_file_access_helper_ListFile_0001 + * @tc.number: user_file_service_file_access_helper_ListFile_0001 * @tc.name: file_access_helper_ListFile_0001 * @tc.desc: Test function of ListFile interface for ERROR which Uri is nullptr. * @tc.size: MEDIUM @@ -1365,9 +1391,16 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_ListFile_0001, testing::ext::T GTEST_LOG_(INFO) << "FileAccessHelperTest-begin file_access_helper_ListFile_0001"; try { Uri sourceFileUri(""); - std::vector fileInfo = fah->ListFile(sourceFileUri); - EXPECT_EQ(fileInfo.size(), 0); - GTEST_LOG_(INFO) << "ListFile_0001 result:" << fileInfo.size() << endl; + FileInfo fileInfo; + fileInfo.uri = sourceFileUri.ToString(); + int64_t offset = 0; + int64_t maxCount = 1000; + vector fileInfoVec; + FileFilter filter({}, {}, {}, 0, 0, false, false); + int result = fah->ListFile(fileInfo, offset, maxCount, filter, fileInfoVec); + EXPECT_LT(result, OHOS::FileAccessFwk::ERR_OK); + EXPECT_EQ(fileInfoVec.size(), 0); + GTEST_LOG_(INFO) << "ListFile_0001 result:" << fileInfoVec.size() << endl; } catch (...) { GTEST_LOG_(INFO) << "FileAccessHelperTest-an exception occurred."; } @@ -1375,7 +1408,7 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_ListFile_0001, testing::ext::T } /** - * @tc.number: SUB_user_file_service_file_access_helper_ListFile_0002 + * @tc.number: user_file_service_file_access_helper_ListFile_0002 * @tc.name: file_access_helper_ListFile_0002 * @tc.desc: Test function of ListFile interface for ERROR which sourceFileUri is absolute path. * @tc.size: MEDIUM @@ -1388,7 +1421,7 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_ListFile_0002, testing::ext::T GTEST_LOG_(INFO) << "FileAccessHelperTest-begin file_access_helper_ListFile_0002"; try { Uri newDirUriTest(""); - int result = fah->Mkdir(newDirUri, "test", newDirUriTest); + int result = fah->Mkdir(g_newDirUri, "test", newDirUriTest); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); Uri testUri(""); @@ -1396,9 +1429,16 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_ListFile_0002, testing::ext::T EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); Uri sourceFileUri("storage/media/100/local/files/Download/test/test.txt"); - std::vector fileInfo = fah->ListFile(sourceFileUri); - EXPECT_EQ(fileInfo.size(), 0); - GTEST_LOG_(INFO) << "ListFile_0002 result:" << fileInfo.size() << endl; + FileInfo fileInfo; + fileInfo.uri = sourceFileUri.ToString(); + int64_t offset = 0; + int64_t maxCount = 1000; + vector fileInfoVec; + FileFilter filter({}, {}, {}, 0, 0, false, false); + result = fah->ListFile(fileInfo, offset, maxCount, filter, fileInfoVec); + EXPECT_LT(result, OHOS::FileAccessFwk::ERR_OK); + EXPECT_EQ(fileInfoVec.size(), 0); + GTEST_LOG_(INFO) << "ListFile_0002 result:" << fileInfoVec.size() << endl; result = fah->Delete(newDirUriTest); EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); @@ -1409,7 +1449,7 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_ListFile_0002, testing::ext::T } /** - * @tc.number: SUB_user_file_service_file_access_helper_ListFile_0003 + * @tc.number: user_file_service_file_access_helper_ListFile_0003 * @tc.name: file_access_helper_ListFile_0003 * @tc.desc: Test function of ListFile interface for ERROR which sourceFileUri is special symbols. * @tc.size: MEDIUM @@ -1422,9 +1462,16 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_ListFile_0003, testing::ext::T GTEST_LOG_(INFO) << "FileAccessHelperTest-begin file_access_helper_ListFile_0003"; try { Uri sourceFileUri("~!@#$%^&*()_"); - std::vector fileInfo = fah->ListFile(sourceFileUri); - EXPECT_EQ(fileInfo.size(), 0); - GTEST_LOG_(INFO) << "ListFile_0003 result:" << fileInfo.size() << endl; + FileInfo fileInfo; + fileInfo.uri = sourceFileUri.ToString(); + int64_t offset = 0; + int64_t maxCount = 1000; + vector fileInfoVec; + FileFilter filter; + int result = fah->ListFile(fileInfo, offset, maxCount, filter, fileInfoVec); + EXPECT_NE(result, OHOS::FileAccessFwk::ERR_OK); + EXPECT_EQ(fileInfoVec.size(), 0); + GTEST_LOG_(INFO) << "ListFile_0003 result:" << fileInfoVec.size() << endl; } catch (...) { GTEST_LOG_(INFO) << "FileAccessHelperTest-an exception occurred."; } @@ -1432,7 +1479,217 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_ListFile_0003, testing::ext::T } /** - * @tc.number: SUB_user_file_service_file_access_helper_GetRoots_0000 + * @tc.number: user_file_service_file_access_helper_ListFile_0004 + * @tc.name: file_access_helper_ListFile_0004 + * @tc.desc: Test function of ListFile interface for ERROR which add filter. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: SR000H0386 + */ +HWTEST_F(FileAccessHelperTest, file_access_helper_ListFile_0004, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "FileAccessHelperTest-begin file_access_helper_ListFile_0004"; + try { + Uri newDirUriTest(""); + int result = fah->Mkdir(g_newDirUri, "test", newDirUriTest); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + + Uri testUri1(""); + result = fah->CreateFile(newDirUriTest, "file_access_helper_ListFile_0004.txt", testUri1); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + Uri testUri2(""); + result = fah->CreateFile(newDirUriTest, "file_access_helper_ListFile_0004.docx", testUri2); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + + FileInfo fileInfo; + fileInfo.uri = newDirUriTest.ToString(); + int64_t offset = 0; + int64_t maxCount = 1000; + std::vector fileInfoVec; + FileFilter filter({".txt"}, {}, {}, 0, 0, false, true); + result = fah->ListFile(fileInfo, offset, maxCount, filter, fileInfoVec); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + EXPECT_EQ(fileInfoVec.size(), 1); + + result = fah->Delete(newDirUriTest); + EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); + } catch (...) { + GTEST_LOG_(INFO) << "FileExtensionHelperTest-an exception occurred."; + } + GTEST_LOG_(INFO) << "FileAccessHelperTest-end file_access_helper_ListFile_0004"; +} + +/** + * @tc.number: user_file_service_file_access_helper_ScanFile_0000 + * @tc.name: file_access_helper_ScanFile_0000 + * @tc.desc: Test function of ScanFile interface for SUCCESS which scan root directory with filter. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: SR000H0386 + */ +HWTEST_F(FileAccessHelperTest, file_access_helper_ScanFile_0000, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "FileAccessHelperTest-begin file_access_helper_ScanFile_0000"; + try { + Uri newDirUriTest(""); + int result = fah->Mkdir(g_newDirUri, "Download", newDirUriTest); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + + Uri testUri(""); + FileInfo fileInfo; + result = fah->CreateFile(newDirUriTest, "file_access_helper_ScanFile_0000.q1w2e3r4", testUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + result = fah->CreateFile(newDirUriTest, "file_access_helper_ScanFile_0000.txt", testUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + fileInfo.uri = "datashare:///media/root"; + int64_t offset = 0; + int64_t maxCount = 1000; + std::vector fileInfoVec; + FileFilter filter({".q1w2e3r4"}, {}, {}, 0, 0, false, true); + result = fah->ScanFile(fileInfo, offset, maxCount, filter, fileInfoVec); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + EXPECT_GE(fileInfoVec.size(), 1); + GTEST_LOG_(INFO) << "ScanFile_0000 result:" << fileInfoVec.size() << endl; + + result = fah->Delete(newDirUriTest); + EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); + } catch (...) { + GTEST_LOG_(INFO) << "FileAccessHelperTest-an exception occurred."; + } + GTEST_LOG_(INFO) << "FileAccessHelperTest-end file_access_helper_ScanFile_0000"; +} + +/** + * @tc.number: user_file_service_file_access_helper_ScanFile_0001 + * @tc.name: file_access_helper_ScanFile_0001 + * @tc.desc: Test function of ScanFile interface for SUCCESS which scan root directory with no filter. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: SR000H0386 + */ +HWTEST_F(FileAccessHelperTest, file_access_helper_ScanFile_0001, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "FileAccessHelperTest-begin file_access_helper_ScanFile_0001"; + try { + Uri newDirUriTest(""); + int result = fah->Mkdir(g_newDirUri, "Download", newDirUriTest); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + + Uri testUri(""); + FileInfo fileInfo; + fileInfo.uri = "datashare:///media/root"; + result = fah->CreateFile(newDirUriTest, "file_access_helper_ScanFile_0001.q1w2e3r4", testUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + result = fah->CreateFile(newDirUriTest, "file_access_helper_ScanFile_0001.txt", testUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + int64_t offset = 0; + int64_t maxCount = 1000; + std::vector fileInfoVec; + FileFilter filter({}, {}, {}, 0, 0, false, false); + result = fah->ScanFile(fileInfo, offset, maxCount, filter, fileInfoVec); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + EXPECT_GE(fileInfoVec.size(), 2); + GTEST_LOG_(INFO) << "ScanFile_0000 result:" << fileInfoVec.size() << endl; + + result = fah->Delete(newDirUriTest); + EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); + } catch (...) { + GTEST_LOG_(INFO) << "FileAccessHelperTest-an exception occurred."; + } + GTEST_LOG_(INFO) << "FileAccessHelperTest-end file_access_helper_ScanFile_0001"; +} + +/** + * @tc.number: user_file_service_file_access_helper_ScanFile_0002 + * @tc.name: file_access_helper_ScanFile_0002 + * @tc.desc: Test function of ScanFile interface for SUCCESS which self created directory with filter. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: SR000H0386 + */ +HWTEST_F(FileAccessHelperTest, file_access_helper_ScanFile_0002, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "FileAccessHelperTest-begin file_access_helper_ScanFile_0002"; + try { + Uri newDirUriTest(""); + int result = fah->Mkdir(g_newDirUri, "Download", newDirUriTest); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + + Uri testUri(""); + result = fah->CreateFile(newDirUriTest, "file_access_helper_ScanFile_0002.q1w2e3r4", testUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + result = fah->CreateFile(newDirUriTest, "file_access_helper_ScanFile_0000.txt", testUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + result = fah->CreateFile(newDirUriTest, "file_access_helper_ScanFile_0000.docx", testUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + FileInfo fileInfo; + fileInfo.uri = newDirUriTest.ToString(); + int64_t offset = 0; + int64_t maxCount = 1000; + std::vector fileInfoVec; + FileFilter filter({".q1w2e3r4"}, {}, {}, 0, 0, false, true); + result = fah->ScanFile(fileInfo, offset, maxCount, filter, fileInfoVec); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + EXPECT_EQ(fileInfoVec.size(), 1); + FileFilter filter1({".q1w2e3r4", ".txt"}, {}, {}, 0, 0, false, true); + result = fah->ScanFile(fileInfo, offset, maxCount, filter1, fileInfoVec); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + EXPECT_EQ(fileInfoVec.size(), 2); + + GTEST_LOG_(INFO) << "ScanFile_0002 result:" << fileInfoVec.size() << endl; + result = fah->Delete(newDirUriTest); + EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); + } catch (...) { + GTEST_LOG_(INFO) << "FileAccessHelperTest-an exception occurred."; + } + GTEST_LOG_(INFO) << "FileAccessHelperTest-end file_access_helper_ScanFile_0002"; +} + +/** + * @tc.number: user_file_service_file_access_helper_ScanFile_0003 + * @tc.name: file_access_helper_ScanFile_0003 + * @tc.desc: Test function of ScanFile interface for SUCCESS which self created directory with filter. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: SR000H0386 + */ +HWTEST_F(FileAccessHelperTest, file_access_helper_ScanFile_0003, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "FileAccessHelperTest-begin file_access_helper_ScanFile_0003"; + try { + Uri newDirUriTest(""); + int result = fah->Mkdir(g_newDirUri, "Download", newDirUriTest); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + + Uri testUri(""); + result = fah->CreateFile(newDirUriTest, "file_access_helper_ScanFile_0003.q1w2e3r4", testUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + FileInfo fileInfo; + fileInfo.uri = newDirUriTest.ToString(); + int64_t offset = 0; + int64_t maxCount = 1000; + std::vector fileInfoVec; + FileFilter filter({".q1w2e3r4"}, {}, {}, 0, 0, false, true); + result = fah->ScanFile(fileInfo, offset, maxCount, filter, fileInfoVec); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + EXPECT_EQ(fileInfoVec.size(), 1); + GTEST_LOG_(INFO) << "ScanFile_0003 result:" << fileInfoVec.size() << endl; + + result = fah->Delete(newDirUriTest); + EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); + } catch (...) { + GTEST_LOG_(INFO) << "FileAccessHelperTest-an exception occurred."; + } + GTEST_LOG_(INFO) << "FileAccessHelperTest-end file_access_helper_ScanFile_0003"; +} + +/** + * @tc.number: user_file_service_file_access_helper_GetRoots_0000 * @tc.name: file_access_helper_GetRoots_0000 * @tc.desc: Test function of GetRoots interface for SUCCESS. * @tc.size: MEDIUM @@ -1445,18 +1702,25 @@ HWTEST_F(FileAccessHelperTest, file_access_helper_GetRoots_0000, testing::ext::T GTEST_LOG_(INFO) << "FileAccessHelperTest-begin file_access_helper_GetRoots_0000"; try { uint64_t selfTokenId_ = GetSelfTokenID(); - - vector info = fah->GetRoots(); + + vector info; + int result = fah->GetRoots(info); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); EXPECT_GT(info.size(), 0); + if (info.size() > 0) { + GTEST_LOG_(INFO) << info[0].uri; + GTEST_LOG_(INFO) << info[0].displayName; + GTEST_LOG_(INFO) << info[0].deviceType; + GTEST_LOG_(INFO) << info[0].deviceFlags; + } + string uri = "datashare:///media/root"; string displayName = "LOCAL"; - uint32_t flag = 0; - EXPECT_EQ(info[0].uri.ToString(), uri); + EXPECT_EQ(info[0].uri, uri); EXPECT_EQ(info[0].displayName, displayName); - EXPECT_EQ(info[0].flags, flag); - EXPECT_EQ(info[0].type, DEVICE_LOCAL_DISK); + EXPECT_EQ(info[0].deviceType, DEVICE_LOCAL_DISK); SetSelfTokenID(selfTokenId_); } catch (...) { diff --git a/frameworks/innerkits/file_access/test/file_extension_helper_test.cpp b/frameworks/innerkits/file_access/test/file_extension_helper_test.cpp index 4b34b99965ff4395bdf4e43786f7d994900b629c..ae68864ead86f18a5b4e6963e7637723d4ab4290 100644 --- a/frameworks/innerkits/file_access/test/file_extension_helper_test.cpp +++ b/frameworks/innerkits/file_access/test/file_extension_helper_test.cpp @@ -28,8 +28,84 @@ namespace { using namespace std; using namespace OHOS; using namespace FileAccessFwk; -int abilityId = 5003; +int ABILITY_ID = 5003; shared_ptr fah = nullptr; +OHOS::Security::AccessToken::AccessTokenID tokenId; + +// permission state +OHOS::Security::AccessToken::PermissionStateFull g_infoManagerTestState = { + .permissionName = "ohos.permission.FILE_ACCESS_MANAGER", + .isGeneral = true, + .resDeviceID = {"local"}, + .grantStatus = {OHOS::Security::AccessToken::PermissionState::PERMISSION_GRANTED}, + .grantFlags = {1} +}; + +OHOS::Security::AccessToken::PermissionStateFull g_infoManagerTestState1 = { + .permissionName = "ohos.permission.READ_MEDIA", + .isGeneral = true, + .resDeviceID = {"local"}, + .grantStatus = {OHOS::Security::AccessToken::PermissionState::PERMISSION_GRANTED}, + .grantFlags = {1} +}; + +OHOS::Security::AccessToken::PermissionStateFull g_infoManagerTestState2 = { + .permissionName = "ohos.permission.WRITE_MEDIA", + .isGeneral = true, + .resDeviceID = {"local"}, + .grantStatus = {OHOS::Security::AccessToken::PermissionState::PERMISSION_GRANTED}, + .grantFlags = {1} +}; + +// permission define +OHOS::Security::AccessToken::PermissionDef g_infoManagerTestPermDef = { + .permissionName = "ohos.permission.FILE_ACCESS_MANAGER", + .bundleName = "ohos.acts.multimedia.mediaLibrary", + .grantMode = 1, + .availableLevel = OHOS::Security::AccessToken::APL_NORMAL, + .label = "label", + .labelId = 1, + .description = "FILE_ACCESS_MANAGER", + .descriptionId = 1 +}; + +OHOS::Security::AccessToken::PermissionDef g_infoManagerTestPermDef1 = { + .permissionName = "ohos.permission.READ_MEDIA", + .bundleName = "ohos.acts.multimedia.mediaLibrary", + .grantMode = 1, + .availableLevel = OHOS::Security::AccessToken::APL_NORMAL, + .label = "label", + .labelId = 1, + .description = "READ_MEDIA", + .descriptionId = 1 +}; + +OHOS::Security::AccessToken::PermissionDef g_infoManagerTestPermDef2 = { + .permissionName = "ohos.permission.WRITE_MEDIA", + .bundleName = "ohos.acts.multimedia.mediaLibrary", + .grantMode = 1, + .availableLevel = OHOS::Security::AccessToken::APL_NORMAL, + .label = "label", + .labelId = 1, + .description = "WRITE_MEDIA", + .descriptionId = 1 +}; + +// permission info +OHOS::Security::AccessToken::HapPolicyParams g_infoManagerTestPolicyPrams = { + .apl = OHOS::Security::AccessToken::APL_NORMAL, + .domain = "test.domain", + .permList = {g_infoManagerTestPermDef, g_infoManagerTestPermDef1, g_infoManagerTestPermDef2}, + .permStateList = {g_infoManagerTestState, g_infoManagerTestState1, g_infoManagerTestState2} +}; + +// hap info +OHOS::Security::AccessToken::HapInfoParams g_infoManagerTestInfoParms = { + .userID = 1, + .bundleName = "FileExtensionHelperTest", + .instIndex = 0, + .appIDDesc = "testtesttesttest" +}; class FileExtensionHelperTest : public testing::Test { public: @@ -38,95 +114,42 @@ public: cout << "FileExtensionHelperTest code test" << endl; auto saManager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager(); - auto remoteObj = saManager->GetSystemAbility(abilityId); + auto remoteObj = saManager->GetSystemAbility(ABILITY_ID); AAFwk::Want want; - want.SetElementName("com.ohos.UserFile.ExternalFileManager", "FileExtensionAbility"); + vector wantVec; + int ret = FileAccessHelper::GetRegisteredFileAccessExtAbilityInfo(wantVec); + EXPECT_EQ(ret, OHOS::FileAccessFwk::ERR_OK); + bool sus = false; + for (size_t i = 0; i < wantVec.size(); i++) { + auto element = wantVec[i].GetElement(); + if (element.GetBundleName() == "com.ohos.UserFile.ExternalFileManager" && + element.GetAbilityName() == "FileExtensionAbility") { + want = wantVec[i]; + sus = true; + break; + } + } + EXPECT_TRUE(sus); vector wants {want}; - FileAccessHelper::GetRegisterFileAccessExtAbilityInfo(); fah = FileAccessHelper::Creator(remoteObj, wants); + + OHOS::Security::AccessToken::AccessTokenIDEx tokenIdEx = {0}; + tokenIdEx = OHOS::Security::AccessToken::AccessTokenKit::AllocHapToken + (g_infoManagerTestInfoParms, g_infoManagerTestPolicyPrams); + tokenId = tokenIdEx.tokenIdExStruct.tokenID; + SetSelfTokenID(tokenId); } - static void TearDownTestCase() {}; + static void TearDownTestCase() { + fah->Release(); + fah = nullptr; + OHOS::Security::AccessToken::AccessTokenKit::DeleteToken(tokenId); + }; void SetUp() {}; void TearDown() {}; - - // permission state - OHOS::Security::AccessToken::PermissionStateFull g_infoManagerTestState = { - .permissionName = "ohos.permission.FILE_ACCESS_MANAGER", - .isGeneral = true, - .resDeviceID = {"local"}, - .grantStatus = {OHOS::Security::AccessToken::PermissionState::PERMISSION_GRANTED}, - .grantFlags = {1} - }; - - OHOS::Security::AccessToken::PermissionStateFull g_infoManagerTestState1 = { - .permissionName = "ohos.permission.READ_MEDIA", - .isGeneral = true, - .resDeviceID = {"local"}, - .grantStatus = {OHOS::Security::AccessToken::PermissionState::PERMISSION_GRANTED}, - .grantFlags = {1} - }; - - OHOS::Security::AccessToken::PermissionStateFull g_infoManagerTestState2 = { - .permissionName = "ohos.permission.WRITE_MEDIA", - .isGeneral = true, - .resDeviceID = {"local"}, - .grantStatus = {OHOS::Security::AccessToken::PermissionState::PERMISSION_GRANTED}, - .grantFlags = {1} - }; - - // permission define - OHOS::Security::AccessToken::PermissionDef g_infoManagerTestPermDef = { - .permissionName = "ohos.permission.FILE_ACCESS_MANAGER", - .bundleName = "ohos.acts.multimedia.mediaLibrary", - .grantMode = 1, - .availableLevel = OHOS::Security::AccessToken::APL_NORMAL, - .label = "label", - .labelId = 1, - .description = "FILE_ACCESS_MANAGER", - .descriptionId = 1 - }; - - OHOS::Security::AccessToken::PermissionDef g_infoManagerTestPermDef1 = { - .permissionName = "ohos.permission.READ_MEDIA", - .bundleName = "ohos.acts.multimedia.mediaLibrary", - .grantMode = 1, - .availableLevel = OHOS::Security::AccessToken::APL_NORMAL, - .label = "label", - .labelId = 1, - .description = "READ_MEDIA", - .descriptionId = 1 - }; - - OHOS::Security::AccessToken::PermissionDef g_infoManagerTestPermDef2 = { - .permissionName = "ohos.permission.WRITE_MEDIA", - .bundleName = "ohos.acts.multimedia.mediaLibrary", - .grantMode = 1, - .availableLevel = OHOS::Security::AccessToken::APL_NORMAL, - .label = "label", - .labelId = 1, - .description = "WRITE_MEDIA", - .descriptionId = 1 - }; - - // permission info - OHOS::Security::AccessToken::HapPolicyParams g_infoManagerTestPolicyPrams = { - .apl = OHOS::Security::AccessToken::APL_NORMAL, - .domain = "test.domain", - .permList = {g_infoManagerTestPermDef, g_infoManagerTestPermDef1, g_infoManagerTestPermDef2}, - .permStateList = {g_infoManagerTestState, g_infoManagerTestState1, g_infoManagerTestState2} - }; - - // hap info - OHOS::Security::AccessToken::HapInfoParams g_infoManagerTestInfoParms = { - .userID = 1, - .bundleName = "FileExtensionHelperTest", - .instIndex = 0, - .appIDDesc = "testtesttesttest" - }; }; /** - * @tc.number: SUB_user_file_service_file_extension_helper_OpenFile_0000 + * @tc.number: user_file_service_file_extension_helper_OpenFile_0000 * @tc.name: file_extension_helper_OpenFile_0000 * @tc.desc: Test function of OpenFile interface for SUCCESS. * @tc.size: MEDIUM @@ -138,30 +161,28 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_OpenFile_0000, testing:: { GTEST_LOG_(INFO) << "FileExtensionHelperTest-begin file_extension_helper_OpenFile_0000"; try { - OHOS::Security::AccessToken::AccessTokenIDEx tokenIdEx = {0}; - tokenIdEx = OHOS::Security::AccessToken::AccessTokenKit::AllocHapToken - (g_infoManagerTestInfoParms, g_infoManagerTestPolicyPrams); - OHOS::Security::AccessToken::AccessTokenID tokenId = tokenIdEx.tokenIdExStruct.tokenID; - SetSelfTokenID(tokenId); - vector info = fah->GetRoots(); + vector info; + int result = fah->GetRoots(info); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); for (size_t i = 0; i < info.size(); i++) { - Uri parentUri = info[i].uri; + Uri parentUri(info[i].uri); GTEST_LOG_(INFO) << parentUri.ToString(); - + Uri newDirUriTest1(""); - int result = fah->Mkdir(parentUri, "test1", newDirUriTest1); + result = fah->Mkdir(parentUri, "test1", newDirUriTest1); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); Uri newFileUri(""); result = fah->CreateFile(newDirUriTest1, "file_extension_helper_OpenFile_0000.txt", newFileUri); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - result = fah->OpenFile(newFileUri, 0); - EXPECT_GT(result, OHOS::FileAccessFwk::ERR_OK); + int fd; + result = fah->OpenFile(newFileUri, 0, fd); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); GTEST_LOG_(INFO) << "OpenFile_0000 result:" << result << endl; - + result = fah->Delete(newDirUriTest1); EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); } @@ -172,7 +193,7 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_OpenFile_0000, testing:: } /** - * @tc.number: SUB_user_file_service_file_extension_helper_OpenFile_0001 + * @tc.number: user_file_service_file_extension_helper_OpenFile_0001 * @tc.name: file_extension_helper_OpenFile_0001 * @tc.desc: Test function of OpenFile interface for ERROR which Uri is null. * @tc.size: MEDIUM @@ -185,7 +206,8 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_OpenFile_0001, testing:: GTEST_LOG_(INFO) << "FileExtensionHelperTest-begin file_extension_helper_OpenFile_0001"; try { Uri uri(""); - int result = fah->OpenFile(uri, 0); + int fd; + int result = fah->OpenFile(uri, 0, fd); EXPECT_LT(result, OHOS::FileAccessFwk::ERR_OK); GTEST_LOG_(INFO) << "OpenFile_0001 result:" << result << endl; } catch (...) { @@ -195,7 +217,7 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_OpenFile_0001, testing:: } /** - * @tc.number: SUB_user_file_service_file_extension_helper_OpenFile_0002 + * @tc.number: user_file_service_file_extension_helper_OpenFile_0002 * @tc.name: file_extension_helper_OpenFile_0002 * @tc.desc: Test function of OpenFile interface for ERROR which Uri is absolute path. * @tc.size: MEDIUM @@ -207,15 +229,18 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_OpenFile_0002, testing:: { GTEST_LOG_(INFO) << "FileExtensionHelperTest-begin file_extension_helper_OpenFile_0002"; try { - vector info = fah->GetRoots(); + vector info; + int result = fah->GetRoots(info); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); for (size_t i = 0; i < info.size(); i++) { - Uri parentUri = info[i].uri; + Uri parentUri(info[i].uri); Uri newFileUri(""); - int result = fah->CreateFile(parentUri, "file_extension_helper_OpenFile_0002.txt", newFileUri); + result = fah->CreateFile(parentUri, "file_extension_helper_OpenFile_0002.txt", newFileUri); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); Uri uri("storage/media/100/local/files/Download/file_extension_helper_OpenFile_0002.txt"); - result = fah->OpenFile(uri, 0); + int fd; + result = fah->OpenFile(uri, 0, fd); EXPECT_LT(result, OHOS::FileAccessFwk::ERR_OK); GTEST_LOG_(INFO) << "OpenFile_0002 result:" << result << endl; @@ -229,7 +254,7 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_OpenFile_0002, testing:: } /** - * @tc.number: SUB_user_file_service_file_extension_helper_OpenFile_0003 + * @tc.number: user_file_service_file_extension_helper_OpenFile_0003 * @tc.name: file_extension_helper_OpenFile_0003 * @tc.desc: Test function of OpenFile interface for ERROR which Uri is special symbols. * @tc.size: MEDIUM @@ -242,7 +267,8 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_OpenFile_0003, testing:: GTEST_LOG_(INFO) << "FileExtensionHelperTest-begin file_extension_helper_OpenFile_0003"; try { Uri uri("~!@#$%^&*()_"); - int result = fah->OpenFile(uri, 0); + int fd; + int result = fah->OpenFile(uri, 0, fd); EXPECT_LT(result, OHOS::FileAccessFwk::ERR_OK); GTEST_LOG_(INFO) << "OpenFile_0003 result:" << result << endl; } catch (...) { @@ -252,7 +278,7 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_OpenFile_0003, testing:: } /** - * @tc.number: SUB_user_file_service_file_extension_helper_OpenFile_0004 + * @tc.number: user_file_service_file_extension_helper_OpenFile_0004 * @tc.name: file_extension_helper_OpenFile_0004 * @tc.desc: Test function of OpenFile interface for ERROR which flag is -1. * @tc.size: MEDIUM @@ -264,14 +290,17 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_OpenFile_0004, testing:: { GTEST_LOG_(INFO) << "FileExtensionHelperTest-begin file_extension_helper_OpenFile_0004"; try { - vector info = fah->GetRoots(); + vector info; + int result = fah->GetRoots(info); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); for (size_t i = 0; i < info.size(); i++) { - Uri parentUri = info[i].uri; + Uri parentUri(info[i].uri); Uri newFileUri(""); - int result = fah->CreateFile(parentUri, "file_extension_helper_OpenFile_0004.txt", newFileUri); + result = fah->CreateFile(parentUri, "file_extension_helper_OpenFile_0004.txt", newFileUri); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - result = fah->OpenFile(newFileUri, -1); + int fd; + result = fah->OpenFile(newFileUri, -1, fd); EXPECT_LT(result, OHOS::FileAccessFwk::ERR_OK); GTEST_LOG_(INFO) << "OpenFile_0004 result:" << result << endl; @@ -285,7 +314,7 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_OpenFile_0004, testing:: } /** - * @tc.number: SUB_user_file_service_file_extension_helper_OpenFile_0005 + * @tc.number: user_file_service_file_extension_helper_OpenFile_0005 * @tc.name: file_extension_helper_OpenFile_0005 * @tc.desc: Test function of OpenFile interface for SUCCESS which flag is 1. * @tc.size: MEDIUM @@ -297,15 +326,18 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_OpenFile_0005, testing:: { GTEST_LOG_(INFO) << "FileExtensionHelperTest-begin file_extension_helper_OpenFile_0005"; try { - vector info = fah->GetRoots(); + vector info; + int result = fah->GetRoots(info); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); for (size_t i = 0; i < info.size(); i++) { - Uri parentUri = info[i].uri; + Uri parentUri(info[i].uri); Uri newFileUri(""); - int result = fah->CreateFile(parentUri, "file_extension_helper_OpenFile_0005.txt", newFileUri); + result = fah->CreateFile(parentUri, "file_extension_helper_OpenFile_0005.txt", newFileUri); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - result = fah->OpenFile(newFileUri, 1); - EXPECT_GT(result, OHOS::FileAccessFwk::ERR_OK); + int fd; + result = fah->OpenFile(newFileUri, 1, fd); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); GTEST_LOG_(INFO) << "OpenFile_0005 result:" << result << endl; result = fah->Delete(newFileUri); @@ -318,7 +350,7 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_OpenFile_0005, testing:: } /** - * @tc.number: SUB_user_file_service_file_extension_helper_OpenFile_0006 + * @tc.number: user_file_service_file_extension_helper_OpenFile_0006 * @tc.name: file_extension_helper_OpenFile_0006 * @tc.desc: Test function of OpenFile interface for SUCCESS which flag is 2. * @tc.size: MEDIUM @@ -330,15 +362,18 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_OpenFile_0006, testing:: { GTEST_LOG_(INFO) << "FileExtensionHelperTest-begin file_extension_helper_OpenFile_0006"; try { - vector info = fah->GetRoots(); + vector info; + int result = fah->GetRoots(info); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); for (size_t i = 0; i < info.size(); i++) { - Uri parentUri = info[i].uri; + Uri parentUri(info[i].uri); Uri newFileUri(""); - int result = fah->CreateFile(parentUri, "file_extension_helper_OpenFile_0006.txt", newFileUri); + result = fah->CreateFile(parentUri, "file_extension_helper_OpenFile_0006.txt", newFileUri); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - result = fah->OpenFile(newFileUri, 2); - EXPECT_GT(result, OHOS::FileAccessFwk::ERR_OK); + int fd; + result = fah->OpenFile(newFileUri, 2, fd); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); GTEST_LOG_(INFO) << "OpenFile_0006 result:" << result << endl; result = fah->Delete(newFileUri); @@ -351,7 +386,7 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_OpenFile_0006, testing:: } /** - * @tc.number: SUB_user_file_service_file_extension_helper_CreateFile_0000 + * @tc.number: user_file_service_file_extension_helper_CreateFile_0000 * @tc.name: file_extension_helper_CreateFile_0000 * @tc.desc: Test function of CreateFile interface for SUCCESS. * @tc.size: MEDIUM @@ -363,11 +398,13 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_CreateFile_0000, testing { GTEST_LOG_(INFO) << "FileExtensionHelperTest-begin file_extension_helper_CreateFile_0000"; try { - vector info = fah->GetRoots(); + vector info; + int result = fah->GetRoots(info); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); for (size_t i = 0; i < info.size(); i++) { - Uri parentUri = info[i].uri; + Uri parentUri(info[i].uri); Uri newFileUri(""); - int result = fah->CreateFile(parentUri, "file_extension_helper_CreateFile_0000.txt", newFileUri); + result = fah->CreateFile(parentUri, "file_extension_helper_CreateFile_0000.txt", newFileUri); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); GTEST_LOG_(INFO) << "CreateFile_0000 result:" << result << endl; @@ -381,7 +418,7 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_CreateFile_0000, testing } /** - * @tc.number: SUB_user_file_service_file_extension_helper_CreateFile_0001 + * @tc.number: user_file_service_file_extension_helper_CreateFile_0001 * @tc.name: file_extension_helper_CreateFile_0001 * @tc.desc: Test function of CreateFile interface for ERROR which parentUri is null. * @tc.size: MEDIUM @@ -405,7 +442,7 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_CreateFile_0001, testing } /** - * @tc.number: SUB_user_file_service_file_extension_helper_CreateFile_0002 + * @tc.number: user_file_service_file_extension_helper_CreateFile_0002 * @tc.name: file_extension_helper_CreateFile_0002 * @tc.desc: Test function of CreateFile interface for ERROR which parentUri is absolute path. * @tc.size: MEDIUM @@ -429,7 +466,7 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_CreateFile_0002, testing } /** - * @tc.number: SUB_user_file_service_file_extension_helper_CreateFile_0003 + * @tc.number: user_file_service_file_extension_helper_CreateFile_0003 * @tc.name: file_extension_helper_CreateFile_0003 * @tc.desc: Test function of CreateFile interface for ERROR which parentUri is special symbols. * @tc.size: MEDIUM @@ -453,7 +490,7 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_CreateFile_0003, testing } /** - * @tc.number: SUB_user_file_service_file_extension_helper_CreateFile_0004 + * @tc.number: user_file_service_file_extension_helper_CreateFile_0004 * @tc.name: file_extension_helper_CreateFile_0004 * @tc.desc: Test function of CreateFile interface for ERROR which displayName is null. * @tc.size: MEDIUM @@ -465,12 +502,14 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_CreateFile_0004, testing { GTEST_LOG_(INFO) << "FileExtensionHelperTest-begin file_extension_helper_CreateFile_0004"; try { - vector info = fah->GetRoots(); + vector info; + int result = fah->GetRoots(info); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); for (size_t i = 0; i < info.size(); i++) { - Uri parentUri = info[i].uri; + Uri parentUri(info[i].uri); Uri newFileUri(""); string displayName = ""; - int result = fah->CreateFile(parentUri, displayName, newFileUri); + result = fah->CreateFile(parentUri, displayName, newFileUri); EXPECT_NE(result, OHOS::FileAccessFwk::ERR_OK); GTEST_LOG_(INFO) << "CreateFile_0004 result:" << result << endl; } @@ -481,7 +520,7 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_CreateFile_0004, testing } /** - * @tc.number: SUB_user_file_service_file_extension_helper_Mkdir_0000 + * @tc.number: user_file_service_file_extension_helper_Mkdir_0000 * @tc.name: file_extension_helper_Mkdir_0000 * @tc.desc: Test function of Mkdir interface for SUCCESS. * @tc.size: MEDIUM @@ -493,11 +532,13 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_Mkdir_0000, testing::ext { GTEST_LOG_(INFO) << "FileExtensionHelperTest-begin file_extension_helper_Mkdir_0000"; try { - vector info = fah->GetRoots(); + vector info; + int result = fah->GetRoots(info); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); for (size_t i = 0; i < info.size(); i++) { - Uri parentUri = info[i].uri; + Uri parentUri(info[i].uri); Uri newDirUriTest(""); - int result = fah->Mkdir(parentUri, "file_extension_helper_Mkdir_0000", newDirUriTest); + result = fah->Mkdir(parentUri, "file_extension_helper_Mkdir_0000", newDirUriTest); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); GTEST_LOG_(INFO) << "Mkdir_0000 result:" << result << endl; @@ -511,7 +552,7 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_Mkdir_0000, testing::ext } /** - * @tc.number: SUB_user_file_service_file_extension_helper_Mkdir_0001 + * @tc.number: user_file_service_file_extension_helper_Mkdir_0001 * @tc.name: file_extension_helper_Mkdir_0001 * @tc.desc: Test function of Mkdir interface for ERROR which parentUri is null. * @tc.size: MEDIUM @@ -535,7 +576,7 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_Mkdir_0001, testing::ext } /** - * @tc.number: SUB_user_file_service_file_extension_helper_Mkdir_0002 + * @tc.number: user_file_service_file_extension_helper_Mkdir_0002 * @tc.name: file_extension_helper_Mkdir_0002 * @tc.desc: Test function of Mkdir interface for ERROR which parentUri is absolute path. * @tc.size: MEDIUM @@ -559,7 +600,7 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_Mkdir_0002, testing::ext } /** - * @tc.number: SUB_user_file_service_file_extension_helper_Mkdir_0003 + * @tc.number: user_file_service_file_extension_helper_Mkdir_0003 * @tc.name: file_extension_helper_Mkdir_0003 * @tc.desc: Test function of Mkdir interface for ERROR which parentUri is special symbols. * @tc.size: MEDIUM @@ -583,7 +624,7 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_Mkdir_0003, testing::ext } /** - * @tc.number: SUB_user_file_service_file_extension_helper_Mkdir_0004 + * @tc.number: user_file_service_file_extension_helper_Mkdir_0004 * @tc.name: file_extension_helper_Mkdir_0004 * @tc.desc: Test function of Mkdir interface for ERROR which displayName is null. * @tc.size: MEDIUM @@ -595,12 +636,14 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_Mkdir_0004, testing::ext { GTEST_LOG_(INFO) << "FileExtensionHelperTest-begin file_extension_helper_Mkdir_0004"; try { - vector info = fah->GetRoots(); + vector info; + int result = fah->GetRoots(info); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); for (size_t i = 0; i < info.size(); i++) { - Uri parentUri = info[i].uri; + Uri parentUri(info[i].uri); Uri newDirUriTest(""); string displayName = ""; - int result = fah->Mkdir(parentUri, displayName, newDirUriTest); + result = fah->Mkdir(parentUri, displayName, newDirUriTest); EXPECT_NE(result, OHOS::FileAccessFwk::ERR_OK); GTEST_LOG_(INFO) << "Mkdir_0004 result:" << result << endl; } @@ -611,7 +654,7 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_Mkdir_0004, testing::ext } /** - * @tc.number: SUB_user_file_service_file_extension_helper_Delete_0000 + * @tc.number: user_file_service_file_extension_helper_Delete_0000 * @tc.name: file_extension_helper_Delete_0000 * @tc.desc: Test function of Delete interface for SUCCESS which delete file. * @tc.size: MEDIUM @@ -623,11 +666,13 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_Delete_0000, testing::ex { GTEST_LOG_(INFO) << "FileExtensionHelperTest-begin file_extension_helper_Delete_0000"; try { - vector info = fah->GetRoots(); + vector info; + int result = fah->GetRoots(info); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); for (size_t i = 0; i < info.size(); i++) { - Uri parentUri = info[i].uri; + Uri parentUri(info[i].uri); Uri newDirUriTest(""); - int result = fah->Mkdir(parentUri, "test", newDirUriTest); + result = fah->Mkdir(parentUri, "test", newDirUriTest); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); Uri newFileUri(""); @@ -637,7 +682,7 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_Delete_0000, testing::ex result = fah->Delete(newFileUri); EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); GTEST_LOG_(INFO) << "Delete_0000 result:" << result << endl; - + result = fah->Delete(newDirUriTest); EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); } @@ -648,7 +693,7 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_Delete_0000, testing::ex } /** - * @tc.number: SUB_user_file_service_file_extension_helper_Delete_0001 + * @tc.number: user_file_service_file_extension_helper_Delete_0001 * @tc.name: file_extension_helper_Delete_0001 * @tc.desc: Test function of Delete interface for SUCCESS which delete folder. * @tc.size: MEDIUM @@ -660,13 +705,15 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_Delete_0001, testing::ex { GTEST_LOG_(INFO) << "FileExtensionHelperTest-begin file_extension_helper_Delete_0001"; try { - vector info = fah->GetRoots(); + vector info; + int result = fah->GetRoots(info); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); for (size_t i = 0; i < info.size(); i++) { - Uri parentUri = info[i].uri; + Uri parentUri(info[i].uri); Uri newDirUriTest(""); - int result = fah->Mkdir(parentUri, "test", newDirUriTest); + result = fah->Mkdir(parentUri, "test", newDirUriTest); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - + result = fah->Delete(newDirUriTest); EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); GTEST_LOG_(INFO) << "Delete_0001 result:" << result << endl; @@ -678,7 +725,7 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_Delete_0001, testing::ex } /** - * @tc.number: SUB_user_file_service_file_extension_helper_Delete_0002 + * @tc.number: user_file_service_file_extension_helper_Delete_0002 * @tc.name: file_extension_helper_Delete_0002 * @tc.desc: Test function of Delete interface for ERROR which selectFileUri is null. * @tc.size: MEDIUM @@ -701,7 +748,7 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_Delete_0002, testing::ex } /** - * @tc.number: SUB_user_file_service_file_extension_helper_Delete_0003 + * @tc.number: user_file_service_file_extension_helper_Delete_0003 * @tc.name: file_extension_helper_Delete_0003 * @tc.desc: Test function of Delete interface for ERROR which selectFileUri is absolute path. * @tc.size: MEDIUM @@ -713,22 +760,24 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_Delete_0003, testing::ex { GTEST_LOG_(INFO) << "FileExtensionHelperTest-begin file_extension_helper_Delete_0003"; try { - vector info = fah->GetRoots(); + vector info; + int result = fah->GetRoots(info); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); for (size_t i = 0; i < info.size(); i++) { - Uri parentUri = info[i].uri; + Uri parentUri(info[i].uri); Uri newDirUriTest(""); - int result = fah->Mkdir(parentUri, "test", newDirUriTest); + result = fah->Mkdir(parentUri, "test", newDirUriTest); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - + Uri selectFileUri("storage/media/100/local/files/Download/test"); result = fah->Delete(selectFileUri); EXPECT_LT(result, OHOS::FileAccessFwk::ERR_OK); - + result = fah->Delete(newDirUriTest); EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); GTEST_LOG_(INFO) << "Delete_0003 result:" << result << endl; } - + } catch (...) { GTEST_LOG_(INFO) << "FileExtensionHelperTest-an exception occurred."; } @@ -736,7 +785,7 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_Delete_0003, testing::ex } /** - * @tc.number: SUB_user_file_service_file_extension_helper_Delete_0004 + * @tc.number: user_file_service_file_extension_helper_Delete_0004 * @tc.name: file_extension_helper_Delete_0004 * @tc.desc: Test function of Delete interface for ERROR which selectFileUri is special symbols. * @tc.size: MEDIUM @@ -759,7 +808,7 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_Delete_0004, testing::ex } /** - * @tc.number: SUB_user_file_service_file_extension_helper_Move_0000 + * @tc.number: user_file_service_file_extension_helper_Move_0000 * @tc.name: file_extension_helper_Move_0000 * @tc.desc: Test function of Move interface for SUCCESS which move file. * @tc.size: MEDIUM @@ -771,12 +820,14 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_Move_0000, testing::ext: { GTEST_LOG_(INFO) << "FileExtensionHelperTest-begin file_extension_helper_Move_0000"; try { - vector info = fah->GetRoots(); + vector info; + int result = fah->GetRoots(info); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); for (size_t i = 0; i < info.size(); i++) { - Uri parentUri = info[i].uri; + Uri parentUri(info[i].uri); Uri newDirUriTest1(""); Uri newDirUriTest2(""); - int result = fah->Mkdir(parentUri, "test1", newDirUriTest1); + result = fah->Mkdir(parentUri, "test1", newDirUriTest1); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); result = fah->Mkdir(parentUri, "test2", newDirUriTest2); @@ -790,7 +841,7 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_Move_0000, testing::ext: result = fah->Move(testUri, newDirUriTest2, testUri2); EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); GTEST_LOG_(INFO) << "Move_0000 result:" << result << endl; - + result = fah->Delete(newDirUriTest1); EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); @@ -804,7 +855,7 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_Move_0000, testing::ext: } /** - * @tc.number: SUB_user_file_service_file_extension_helper_Move_0001 + * @tc.number: user_file_service_file_extension_helper_Move_0001 * @tc.name: file_extension_helper_Move_0001 * @tc.desc: Test function of Move interface for SUCCESS which move folder. * @tc.size: MEDIUM @@ -816,12 +867,14 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_Move_0001, testing::ext: { GTEST_LOG_(INFO) << "FileExtensionHelperTest-begin file_extension_helper_Move_0001"; try { - vector info = fah->GetRoots(); + vector info; + int result = fah->GetRoots(info); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); for (size_t i = 0; i < info.size(); i++) { - Uri parentUri = info[i].uri; + Uri parentUri(info[i].uri); Uri newDirUriTest1(""); Uri newDirUriTest2(""); - int result = fah->Mkdir(parentUri, "test1", newDirUriTest1); + result = fah->Mkdir(parentUri, "test1", newDirUriTest1); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); result = fah->Mkdir(parentUri, "test2", newDirUriTest2); @@ -846,7 +899,7 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_Move_0001, testing::ext: } /** - * @tc.number: SUB_user_file_service_file_extension_helper_Move_0002 + * @tc.number: user_file_service_file_extension_helper_Move_0002 * @tc.name: file_extension_helper_Move_0002 * @tc.desc: Test function of Move interface for ERROR which sourceFileUri is null. * @tc.size: MEDIUM @@ -858,19 +911,21 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_Move_0002, testing::ext: { GTEST_LOG_(INFO) << "FileExtensionHelperTest-begin file_extension_helper_Move_0002"; try { - vector info = fah->GetRoots(); + vector info; + int result = fah->GetRoots(info); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); for (size_t i = 0; i < info.size(); i++) { - Uri parentUri = info[i].uri; + Uri parentUri(info[i].uri); Uri newDirUriTest(""); - int result = fah->Mkdir(parentUri, "test", newDirUriTest); + result = fah->Mkdir(parentUri, "test", newDirUriTest); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); Uri testUri(""); Uri sourceFileUri(""); result = fah->Move(sourceFileUri, newDirUriTest, testUri); - EXPECT_EQ(result, ERR_OPERATION_NOT_PERMITTED); + EXPECT_LT(result, OHOS::FileAccessFwk::ERR_OK); GTEST_LOG_(INFO) << "Move_0002 result:" << result << endl; - + result = fah->Delete(newDirUriTest); EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); } @@ -881,7 +936,7 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_Move_0002, testing::ext: } /** - * @tc.number: SUB_user_file_service_file_extension_helper_Move_0003 + * @tc.number: user_file_service_file_extension_helper_Move_0003 * @tc.name: file_extension_helper_Move_0003 * @tc.desc: Test function of Move interface for ERROR which sourceFileUri is absolute path. * @tc.size: MEDIUM @@ -893,12 +948,14 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_Move_0003, testing::ext: { GTEST_LOG_(INFO) << "FileExtensionHelperTest-begin file_extension_helper_Move_0003"; try { - vector info = fah->GetRoots(); + vector info; + int result = fah->GetRoots(info); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); for (size_t i = 0; i < info.size(); i++) { - Uri parentUri = info[i].uri; + Uri parentUri(info[i].uri); Uri newDirUriTest1(""); Uri newDirUriTest2(""); - int result = fah->Mkdir(parentUri, "test1", newDirUriTest1); + result = fah->Mkdir(parentUri, "test1", newDirUriTest1); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); result = fah->Mkdir(parentUri, "test2", newDirUriTest2); @@ -911,9 +968,9 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_Move_0003, testing::ext: Uri testUri2(""); Uri sourceFileUri("storage/media/100/local/files/Download/test1/test.txt"); result = fah->Move(sourceFileUri, newDirUriTest2, testUri2); - EXPECT_EQ(result, ERR_OPERATION_NOT_PERMITTED); + EXPECT_LT(result, OHOS::FileAccessFwk::ERR_OK); GTEST_LOG_(INFO) << "Move_0003 result:" << result << endl; - + result = fah->Delete(newDirUriTest1); EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); @@ -927,7 +984,7 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_Move_0003, testing::ext: } /** - * @tc.number: SUB_user_file_service_file_extension_helper_Move_0004 + * @tc.number: user_file_service_file_extension_helper_Move_0004 * @tc.name: file_extension_helper_Move_0004 * @tc.desc: Test function of Move interface for ERROR which sourceFileUri is special symbols. * @tc.size: MEDIUM @@ -939,19 +996,21 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_Move_0004, testing::ext: { GTEST_LOG_(INFO) << "FileExtensionHelperTest-begin file_extension_helper_Move_0004"; try { - vector info = fah->GetRoots(); + vector info; + int result = fah->GetRoots(info); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); for (size_t i = 0; i < info.size(); i++) { - Uri parentUri = info[i].uri; + Uri parentUri(info[i].uri); Uri newDirUriTest(""); - int result = fah->Mkdir(parentUri, "test", newDirUriTest); + result = fah->Mkdir(parentUri, "test", newDirUriTest); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); Uri testUri(""); Uri sourceFileUri("~!@#$%^&*()_"); result = fah->Move(sourceFileUri, newDirUriTest, testUri); - EXPECT_EQ(result, ERR_OPERATION_NOT_PERMITTED); + EXPECT_LT(result, OHOS::FileAccessFwk::ERR_OK); GTEST_LOG_(INFO) << "Move_0004 result:" << result << endl; - + result = fah->Delete(newDirUriTest); EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); } @@ -962,7 +1021,7 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_Move_0004, testing::ext: } /** - * @tc.number: SUB_user_file_service_file_extension_helper_Move_0005 + * @tc.number: user_file_service_file_extension_helper_Move_0005 * @tc.name: file_extension_helper_Move_0005 * @tc.desc: Test function of Move interface for ERROR which targetParentUri is null. * @tc.size: MEDIUM @@ -974,11 +1033,13 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_Move_0005, testing::ext: { GTEST_LOG_(INFO) << "FileExtensionHelperTest-begin file_extension_helper_Move_0005"; try { - vector info = fah->GetRoots(); + vector info; + int result = fah->GetRoots(info); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); for (size_t i = 0; i < info.size(); i++) { - Uri parentUri = info[i].uri; + Uri parentUri(info[i].uri); Uri newDirUriTest(""); - int result = fah->Mkdir(parentUri, "test1", newDirUriTest); + result = fah->Mkdir(parentUri, "test1", newDirUriTest); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); Uri testUri(""); @@ -988,9 +1049,9 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_Move_0005, testing::ext: Uri testUri2(""); Uri targetParentUri(""); result = fah->Move(testUri, targetParentUri, testUri2); - EXPECT_EQ(result, ERR_OPERATION_NOT_PERMITTED); + EXPECT_LT(result, OHOS::FileAccessFwk::ERR_OK); GTEST_LOG_(INFO) << "Move_0005 result:" << result << endl; - + result = fah->Delete(newDirUriTest); EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); } @@ -1001,7 +1062,7 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_Move_0005, testing::ext: } /** - * @tc.number: SUB_user_file_service_file_extension_helper_Move_0006 + * @tc.number: user_file_service_file_extension_helper_Move_0006 * @tc.name: file_extension_helper_Move_0006 * @tc.desc: Test function of Move interface for ERROR which targetParentUri is absolute path. * @tc.size: MEDIUM @@ -1013,12 +1074,14 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_Move_0006, testing::ext: { GTEST_LOG_(INFO) << "FileExtensionHelperTest-begin file_extension_helper_Move_0006"; try { - vector info = fah->GetRoots(); + vector info; + int result = fah->GetRoots(info); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); for (size_t i = 0; i < info.size(); i++) { - Uri parentUri = info[i].uri; + Uri parentUri(info[i].uri); Uri newDirUriTest1(""); Uri newDirUriTest2(""); - int result = fah->Mkdir(parentUri, "test1", newDirUriTest1); + result = fah->Mkdir(parentUri, "test1", newDirUriTest1); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); result = fah->Mkdir(parentUri, "test2", newDirUriTest2); @@ -1031,9 +1094,9 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_Move_0006, testing::ext: Uri testUri2(""); Uri targetParentUri("storage/media/100/local/files/Download/test2"); result = fah->Move(testUri, targetParentUri, testUri2); - EXPECT_EQ(result, ERR_OPERATION_NOT_PERMITTED); + EXPECT_LT(result, OHOS::FileAccessFwk::ERR_OK); GTEST_LOG_(INFO) << "Move_0006 result:" << result << endl; - + result = fah->Delete(newDirUriTest1); EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); @@ -1047,7 +1110,7 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_Move_0006, testing::ext: } /** - * @tc.number: SUB_user_file_service_file_extension_helper_Move_0007 + * @tc.number: user_file_service_file_extension_helper_Move_0007 * @tc.name: file_extension_helper_Move_0007 * @tc.desc: Test function of Move interface for ERROR which targetParentUri is special symbols. * @tc.size: MEDIUM @@ -1059,12 +1122,14 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_Move_0007, testing::ext: { GTEST_LOG_(INFO) << "FileExtensionHelperTest-begin file_extension_helper_Move_0007"; try { - vector info = fah->GetRoots(); + vector info; + int result = fah->GetRoots(info); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); for (size_t i = 0; i < info.size(); i++) { - Uri parentUri = info[i].uri; + Uri parentUri(info[i].uri); Uri newDirUriTest1(""); Uri newDirUriTest2(""); - int result = fah->Mkdir(parentUri, "test1", newDirUriTest1); + result = fah->Mkdir(parentUri, "test1", newDirUriTest1); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); result = fah->Mkdir(parentUri, "test2", newDirUriTest2); @@ -1077,9 +1142,9 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_Move_0007, testing::ext: Uri testUri2(""); Uri targetParentUri("~!@#$^%&*()_"); result = fah->Move(testUri, targetParentUri, testUri2); - EXPECT_EQ(result, ERR_OPERATION_NOT_PERMITTED); + EXPECT_LT(result, OHOS::FileAccessFwk::ERR_OK); GTEST_LOG_(INFO) << "Move_0007 result:" << result << endl; - + result = fah->Delete(newDirUriTest1); EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); @@ -1093,7 +1158,7 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_Move_0007, testing::ext: } /** - * @tc.number: SUB_user_file_service_file_extension_helper_Move_0008 + * @tc.number: user_file_service_file_extension_helper_Move_0008 * @tc.name: file_extension_helper_Move_0008 * @tc.desc: Test function of Move interface for SUCCESS which move empty folder. * @tc.size: MEDIUM @@ -1105,12 +1170,14 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_Move_0008, testing::ext: { GTEST_LOG_(INFO) << "FileExtensionHelperTest-begin file_extension_helper_Move_0008"; try { - vector info = fah->GetRoots(); + vector info; + int result = fah->GetRoots(info); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); for (size_t i = 0; i < info.size(); i++) { - Uri parentUri = info[i].uri; + Uri parentUri(info[i].uri); Uri newDirUriTest1(""); Uri newDirUriTest2(""); - int result = fah->Mkdir(parentUri, "test1", newDirUriTest1); + result = fah->Mkdir(parentUri, "test1", newDirUriTest1); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); result = fah->Mkdir(parentUri, "test2", newDirUriTest2); @@ -1131,7 +1198,7 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_Move_0008, testing::ext: } /** - * @tc.number: SUB_user_file_service_file_extension_helper_Move_0009 + * @tc.number: user_file_service_file_extension_helper_Move_0009 * @tc.name: file_extension_helper_Move_0009 * @tc.desc: Test function of Move interface for SUCCESS which move more file in folder. * @tc.size: MEDIUM @@ -1143,20 +1210,22 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_Move_0009, testing::ext: { GTEST_LOG_(INFO) << "FileExtensionHelperTest-begin file_extension_helper_Move_0009"; try { - vector info = fah->GetRoots(); + vector info; + int result = fah->GetRoots(info); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); for (size_t i = 0; i < info.size(); i++) { - Uri parentUri = info[i].uri; + Uri parentUri(info[i].uri); Uri newDirUriTest1(""); Uri newDirUriTest2(""); - int result = fah->Mkdir(parentUri, "test1", newDirUriTest1); + result = fah->Mkdir(parentUri, "test1", newDirUriTest1); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); result = fah->Mkdir(parentUri, "test2", newDirUriTest2); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + Uri testUri(""); for (size_t j = 0; j < 2000; j++) { - Uri testUri(""); string fileName = "test" + ToString(j) + ".txt"; fah->CreateFile(newDirUriTest1, fileName, testUri); } @@ -1176,7 +1245,7 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_Move_0009, testing::ext: } /** - * @tc.number: SUB_user_file_service_file_extension_helper_Move_0010 + * @tc.number: user_file_service_file_extension_helper_Move_0010 * @tc.name: file_extension_helper_Move_0010 * @tc.desc: Test function of Move interface for SUCCESS which move Multilevel directory folder. * @tc.size: MEDIUM @@ -1188,12 +1257,14 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_Move_0010, testing::ext: { GTEST_LOG_(INFO) << "FileExtensionHelperTest-begin file_extension_helper_Move_0010"; try { - vector info = fah->GetRoots(); + vector info; + int result = fah->GetRoots(info); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); for (size_t i = 0; i < info.size(); i++) { - Uri parentUri = info[i].uri; + Uri parentUri(info[i].uri); Uri newDirUriTest1(""); Uri newDirUriTest2(""); - int result = fah->Mkdir(parentUri, "test1", newDirUriTest1); + result = fah->Mkdir(parentUri, "test1", newDirUriTest1); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); result = fah->Mkdir(parentUri, "test2", newDirUriTest2); @@ -1221,7 +1292,7 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_Move_0010, testing::ext: } /** - * @tc.number: SUB_user_file_service_file_extension_helper_Move_0011 + * @tc.number: user_file_service_file_extension_helper_Move_0011 * @tc.name: file_extension_helper_Move_0011 * @tc.desc: Test function of Move interface for SUCCESS which move other equipment file. * @tc.size: MEDIUM @@ -1233,19 +1304,21 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_Move_0011, testing::ext: { GTEST_LOG_(INFO) << "FileExtensionHelperTest-begin file_extension_helper_Move_0011"; try { - vector info = fah->GetRoots(); + vector info; + int result = fah->GetRoots(info); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); for (size_t i = 0; i < info.size(); i++) { - Uri parentUri = info[i].uri; + Uri parentUri(info[i].uri); Uri newDirUriTest1(""); Uri newDirUriTest2(""); - int result = fah->Mkdir(parentUri, "test1", newDirUriTest1); + result = fah->Mkdir(parentUri, "test1", newDirUriTest1); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - + Uri testUri(""); fah->CreateFile(newDirUriTest1, "test.txt", testUri); for (size_t j = i + 1; j < info.size(); j++) { - Uri otherUri = info[j].uri; + Uri otherUri(info[j].uri); result = fah->Mkdir(otherUri, "test2", newDirUriTest2); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); @@ -1271,7 +1344,7 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_Move_0011, testing::ext: } /** - * @tc.number: SUB_user_file_service_file_extension_helper_Rename_0000 + * @tc.number: user_file_service_file_extension_helper_Rename_0000 * @tc.name: file_extension_helper_Rename_0000 * @tc.desc: Test function of Rename interface for SUCCESS which rename file. * @tc.size: MEDIUM @@ -1283,11 +1356,13 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_Rename_0000, testing::ex { GTEST_LOG_(INFO) << "FileExtensionHelperTest-begin file_extension_helper_Rename_0000"; try { - vector info = fah->GetRoots(); + vector info; + int result = fah->GetRoots(info); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); for (size_t i = 0; i < info.size(); i++) { - Uri parentUri = info[i].uri; + Uri parentUri(info[i].uri); Uri newDirUriTest(""); - int result = fah->Mkdir(parentUri, "test", newDirUriTest); + result = fah->Mkdir(parentUri, "test", newDirUriTest); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); Uri testUri(""); @@ -1309,7 +1384,7 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_Rename_0000, testing::ex } /** - * @tc.number: SUB_user_file_service_file_extension_helper_Rename_0001 + * @tc.number: user_file_service_file_extension_helper_Rename_0001 * @tc.name: file_extension_helper_Rename_0001 * @tc.desc: Test function of Rename interface for SUCCESS which rename folder. * @tc.size: MEDIUM @@ -1321,11 +1396,13 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_Rename_0001, testing::ex { GTEST_LOG_(INFO) << "FileExtensionHelperTest-begin file_extension_helper_Rename_0001"; try { - vector info = fah->GetRoots(); + vector info; + int result = fah->GetRoots(info); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); for (size_t i = 0; i < info.size(); i++) { - Uri parentUri = info[i].uri; + Uri parentUri(info[i].uri); Uri newDirUriTest(""); - int result = fah->Mkdir(parentUri, "test", newDirUriTest); + result = fah->Mkdir(parentUri, "test", newDirUriTest); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); Uri renameUri(""); @@ -1343,7 +1420,7 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_Rename_0001, testing::ex } /** - * @tc.number: SUB_user_file_service_file_extension_helper_Rename_0002 + * @tc.number: user_file_service_file_extension_helper_Rename_0002 * @tc.name: file_extension_helper_Rename_0002 * @tc.desc: Test function of Rename interface for ERROR which sourceFileUri is null. * @tc.size: MEDIUM @@ -1367,7 +1444,7 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_Rename_0002, testing::ex } /** - * @tc.number: SUB_user_file_service_file_extension_helper_Rename_0003 + * @tc.number: user_file_service_file_extension_helper_Rename_0003 * @tc.name: file_extension_helper_Rename_0003 * @tc.desc: Test function of Rename interface for ERROR which sourceFileUri is absolute path. * @tc.size: MEDIUM @@ -1379,11 +1456,13 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_Rename_0003, testing::ex { GTEST_LOG_(INFO) << "FileExtensionHelperTest-begin file_extension_helper_Rename_0003"; try { - vector info = fah->GetRoots(); + vector info; + int result = fah->GetRoots(info); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); for (size_t i = 0; i < info.size(); i++) { - Uri parentUri = info[i].uri; + Uri parentUri(info[i].uri); Uri newDirUriTest(""); - int result = fah->Mkdir(parentUri, "test", newDirUriTest); + result = fah->Mkdir(parentUri, "test", newDirUriTest); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); Uri testUri(""); @@ -1395,7 +1474,7 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_Rename_0003, testing::ex result = fah->Rename(sourceFileUri, "testRename.txt", renameUri); EXPECT_LT(result, OHOS::FileAccessFwk::ERR_OK); GTEST_LOG_(INFO) << "Rename_0003 result:" << result << endl; - + result = fah->Delete(newDirUriTest); EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); } @@ -1406,7 +1485,7 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_Rename_0003, testing::ex } /** - * @tc.number: SUB_user_file_service_file_extension_helper_Rename_0004 + * @tc.number: user_file_service_file_extension_helper_Rename_0004 * @tc.name: file_extension_helper_Rename_0004 * @tc.desc: Test function of Rename interface for ERROR which sourceFileUri is special symbols. * @tc.size: MEDIUM @@ -1430,7 +1509,7 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_Rename_0004, testing::ex } /** - * @tc.number: SUB_user_file_service_file_extension_helper_Rename_0005 + * @tc.number: user_file_service_file_extension_helper_Rename_0005 * @tc.name: file_extension_helper_Rename_0005 * @tc.desc: Test function of Rename interface for ERROR which displayName is null. * @tc.size: MEDIUM @@ -1442,11 +1521,13 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_Rename_0005, testing::ex { GTEST_LOG_(INFO) << "FileExtensionHelperTest-begin file_extension_helper_Rename_0005"; try { - vector info = fah->GetRoots(); + vector info; + int result = fah->GetRoots(info); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); for (size_t i = 0; i < info.size(); i++) { - Uri parentUri = info[i].uri; + Uri parentUri(info[i].uri); Uri newDirUriTest(""); - int result = fah->Mkdir(parentUri, "test", newDirUriTest); + result = fah->Mkdir(parentUri, "test", newDirUriTest); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); Uri testUri(""); @@ -1455,9 +1536,7 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_Rename_0005, testing::ex Uri renameUri(""); result = fah->Rename(testUri, "", renameUri); - - int errorCode = 102825990; - EXPECT_EQ(result, errorCode); + EXPECT_LT(result, OHOS::FileAccessFwk::ERR_OK); GTEST_LOG_(INFO) << "Rename_0005 result:" << result << endl; result = fah->Delete(newDirUriTest); @@ -1470,7 +1549,7 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_Rename_0005, testing::ex } /** - * @tc.number: SUB_user_file_service_file_extension_helper_ListFile_0000 + * @tc.number: user_file_service_file_extension_helper_ListFile_0000 * @tc.name: file_extension_helper_ListFile_0000 * @tc.desc: Test function of ListFile interface for SUCCESS. * @tc.size: MEDIUM @@ -1482,20 +1561,28 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_ListFile_0000, testing:: { GTEST_LOG_(INFO) << "FileExtensionHelperTest-begin file_extension_helper_ListFile_0000"; try { - vector info = fah->GetRoots(); + vector info; + int result = fah->GetRoots(info); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); for (size_t i = 0; i < info.size(); i++) { - Uri parentUri = info[i].uri; + Uri parentUri(info[i].uri); Uri newDirUriTest(""); - int result = fah->Mkdir(parentUri, "test", newDirUriTest); + result = fah->Mkdir(parentUri, "test", newDirUriTest); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); Uri testUri(""); result = fah->CreateFile(newDirUriTest, "file_extension_helper_ListFile_0000.txt", testUri); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - std::vector fileInfo = fah->ListFile(newDirUriTest); - EXPECT_GT(fileInfo.size(), 0); - GTEST_LOG_(INFO) << "ListFile_0000 result:" << fileInfo.size() << endl; + FileInfo fileInfo; + fileInfo.uri = newDirUriTest.ToString(); + int64_t offset = 0; + int64_t maxCount = 1000; + std::vector fileInfoVec; + FileFilter filter; + result = fah->ListFile(fileInfo, offset, maxCount, filter, fileInfoVec); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + EXPECT_GT(fileInfoVec.size(), 0); result = fah->Delete(newDirUriTest); EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); @@ -1507,7 +1594,7 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_ListFile_0000, testing:: } /** - * @tc.number: SUB_user_file_service_file_extension_helper_ListFile_0001 + * @tc.number: user_file_service_file_extension_helper_ListFile_0001 * @tc.name: file_extension_helper_ListFile_0001 * @tc.desc: Test function of ListFile interface for ERROR which Uri is nullptr. * @tc.size: MEDIUM @@ -1520,9 +1607,15 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_ListFile_0001, testing:: GTEST_LOG_(INFO) << "FileExtensionHelperTest-begin file_extension_helper_ListFile_0001"; try { Uri sourceFileUri(""); - std::vector fileInfo = fah->ListFile(sourceFileUri); - EXPECT_EQ(fileInfo.size(), 0); - GTEST_LOG_(INFO) << "ListFile_0001 result:" << fileInfo.size() << endl; + FileInfo fileInfo; + fileInfo.uri = sourceFileUri.ToString(); + int64_t offset = 0; + int64_t maxCount = 1000; + std::vector fileInfoVec; + FileFilter filter; + int result = fah->ListFile(fileInfo, offset, maxCount, filter, fileInfoVec); + EXPECT_NE(result, OHOS::FileAccessFwk::ERR_OK); + EXPECT_EQ(fileInfoVec.size(), 0); } catch (...) { GTEST_LOG_(INFO) << "FileExtensionHelperTest-an exception occurred."; } @@ -1530,7 +1623,7 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_ListFile_0001, testing:: } /** - * @tc.number: SUB_user_file_service_file_extension_helper_ListFile_0002 + * @tc.number: user_file_service_file_extension_helper_ListFile_0002 * @tc.name: file_extension_helper_ListFile_0002 * @tc.desc: Test function of ListFile interface for ERROR which sourceFileUri is absolute path. * @tc.size: MEDIUM @@ -1542,11 +1635,13 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_ListFile_0002, testing:: { GTEST_LOG_(INFO) << "FileExtensionHelperTest-begin file_extension_helper_ListFile_0002"; try { - vector info = fah->GetRoots(); + vector info; + int result = fah->GetRoots(info); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); for (size_t i = 0; i < info.size(); i++) { - Uri parentUri = info[i].uri; + Uri parentUri(info[i].uri); Uri newDirUriTest(""); - int result = fah->Mkdir(parentUri, "test", newDirUriTest); + result = fah->Mkdir(parentUri, "test", newDirUriTest); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); Uri testUri(""); @@ -1554,9 +1649,16 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_ListFile_0002, testing:: EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); Uri sourceFileUri("storage/media/100/local/files/Download/test/test.txt"); - std::vector fileInfo = fah->ListFile(sourceFileUri); - EXPECT_EQ(fileInfo.size(), 0); - GTEST_LOG_(INFO) << "ListFile_0002 result:" << fileInfo.size() << endl; + FileInfo fileInfo; + fileInfo.uri = sourceFileUri.ToString(); + Uri sourceFile(fileInfo.uri); + int64_t offset = 0; + int64_t maxCount = 1000; + std::vector fileInfoVec; + FileFilter filter; + result = fah->ListFile(fileInfo, offset, maxCount, filter, fileInfoVec); + EXPECT_NE(result, OHOS::FileAccessFwk::ERR_OK); + EXPECT_EQ(fileInfoVec.size(), 0); result = fah->Delete(newDirUriTest); EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); @@ -1568,7 +1670,7 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_ListFile_0002, testing:: } /** - * @tc.number: SUB_user_file_service_file_extension_helper_ListFile_0003 + * @tc.number: user_file_service_file_extension_helper_ListFile_0003 * @tc.name: file_extension_helper_ListFile_0003 * @tc.desc: Test function of ListFile interface for ERROR which sourceFileUri is special symbols. * @tc.size: MEDIUM @@ -1581,9 +1683,16 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_ListFile_0003, testing:: GTEST_LOG_(INFO) << "FileExtensionHelperTest-begin file_extension_helper_ListFile_0003"; try { Uri sourceFileUri("~!@#$%^&*()_"); - std::vector fileInfo = fah->ListFile(sourceFileUri); - EXPECT_EQ(fileInfo.size(), 0); - GTEST_LOG_(INFO) << "ListFile_0003 result:" << fileInfo.size() << endl; + FileInfo fileInfo; + fileInfo.uri = sourceFileUri.ToString(); + Uri sourceFile(fileInfo.uri); + int64_t offset = 0; + int64_t maxCount = 1000; + std::vector fileInfoVec; + FileFilter filter; + int result = fah->ListFile(fileInfo, offset, maxCount, filter, fileInfoVec); + EXPECT_NE(result, OHOS::FileAccessFwk::ERR_OK); + EXPECT_EQ(fileInfoVec.size(), 0); } catch (...) { GTEST_LOG_(INFO) << "FileExtensionHelperTest-an exception occurred."; } @@ -1591,7 +1700,7 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_ListFile_0003, testing:: } /** - * @tc.number: SUB_user_file_service_file_extension_helper_GetRoots_0000 + * @tc.number: user_file_service_file_extension_helper_GetRoots_0000 * @tc.name: file_extension_helper_GetRoots_0000 * @tc.desc: Test function of GetRoots interface for SUCCESS. * @tc.size: MEDIUM @@ -1603,28 +1712,17 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_GetRoots_0000, testing:: { GTEST_LOG_(INFO) << "FileExtensionHelperTest-begin file_extension_helper_GetRoots_0000"; try { - vector info = fah->GetRoots(); + vector info; + int result = fah->GetRoots(info); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); EXPECT_GT(info.size(), 0); GTEST_LOG_(INFO) << "GetRoots_0000 result:" << info.size() << endl; for (size_t i = 0; i < info.size(); i++) { - GTEST_LOG_(INFO) << info[i].uri.ToString(); + GTEST_LOG_(INFO) << info[i].uri; GTEST_LOG_(INFO) << info[i].displayName; - GTEST_LOG_(INFO) << info[i].deviceId; - GTEST_LOG_(INFO) << info[i].flags; - GTEST_LOG_(INFO) << info[i].type; - - string uri = info[i].uri.ToString(); - string findStr = "external"; - uint32_t flag = 58; - DeviceType type = DEVICE_LOCAL_DISK; - - if (uri.find(findStr) == string::npos) { - type = DEVICE_SHARED_DISK; - } - - EXPECT_EQ(info[i].flags, flag); - EXPECT_EQ(info[i].type, type); + GTEST_LOG_(INFO) << info[i].deviceFlags; + GTEST_LOG_(INFO) << info[i].deviceType; } } catch (...) { GTEST_LOG_(INFO) << "FileExtensionHelperTest-an exception occurred."; @@ -1633,7 +1731,7 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_GetRoots_0000, testing:: } /** - * @tc.number: SUB_user_file_service_file_extension_helper_allInterface_0000 + * @tc.number: user_file_service_file_extension_helper_allInterface_0000 * @tc.name: file_extension_helper_allInterface_0000 * @tc.desc: Test function of allInterface interface for SUCCESS. * @tc.size: MEDIUM @@ -1645,22 +1743,30 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_allInterface_0000, testi { GTEST_LOG_(INFO) << "FileExtensionHelperTest-begin file_extension_helper_allInterface_0000"; try { - uint64_t selfTokenId_ = GetSelfTokenID(); - auto saManager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager(); - auto remoteObj = saManager->GetSystemAbility(abilityId); - vector wants = FileAccessHelper::GetRegisterFileAccessExtAbilityInfo(); + auto remoteObj = saManager->GetSystemAbility(ABILITY_ID); + vector wants; + int ret = FileAccessHelper::GetRegisteredFileAccessExtAbilityInfo(wants); + EXPECT_EQ(ret, OHOS::FileAccessFwk::ERR_OK); shared_ptr fahs = FileAccessHelper::Creator(remoteObj, wants); - vector info = fahs->GetRoots(); + vector info; + int result = fah->GetRoots(info); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); for (size_t i = 0; i < info.size(); i++) { - Uri parentUri = info[i].uri; + Uri parentUri(info[i].uri); string uri = parentUri.ToString(); GTEST_LOG_(INFO) << uri; - Uri documentUri(""); - int result = fahs->Mkdir(parentUri, "Documents", documentUri); + string document = uri + "/Documents"; + Uri documentUri(document); + bool isExist = false; + result = fahs->Access(documentUri, isExist); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + if (!isExist) { + result = fahs->Mkdir(parentUri, "Documents", documentUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + } Uri newDirUriTest1(""); Uri newDirUriTest2(""); @@ -1681,22 +1787,75 @@ HWTEST_F(FileExtensionHelperTest, file_extension_helper_allInterface_0000, testi result = fahs->Move(newFileUri, newDirUriTest2, moveUri); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - result = fahs->OpenFile(moveUri, 0); - EXPECT_GT(result, OHOS::FileAccessFwk::ERR_OK); + int fd; + result = fah->OpenFile(moveUri, 0, fd); + EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); GTEST_LOG_(INFO) << "OpenFile_0000 result:" << result << endl; - + result = fahs->Delete(newDirUriTest1); EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); result = fahs->Delete(newDirUriTest2); EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); } + } catch (...) { + GTEST_LOG_(INFO) << "FileExtensionHelperTest-an exception occurred."; + } + GTEST_LOG_(INFO) << "FileExtensionHelperTest-end file_extension_helper_allInterface_0000"; +} + +/** + * @tc.number: user_file_service_file_extension_helper_Access_0000 + * @tc.name: file_extension_helper_Access_0000 + * @tc.desc: Test function of Access interface for SUCCESS. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: SR000H0386 + */ +HWTEST_F(FileExtensionHelperTest, file_extension_helper_Access_0000, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "FileExtensionHelperTest-begin file_extension_helper_Access_0000"; + try { + uint64_t selfTokenId_ = GetSelfTokenID(); + + vector info; + int result = fah->GetRoots(info); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + for (size_t i = 0; i < info.size(); i++) { + Uri parentUri(info[i].uri); + GTEST_LOG_(INFO) << parentUri.ToString(); + + Uri newDirUriTest(""); + result = fah->Mkdir(parentUri, "test1", newDirUriTest); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + + Uri newFileUri(""); + result = fah->CreateFile(newDirUriTest, "file_extension_helper_Access_0000.txt", newFileUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + + bool isExist = false; + result = fah->Access(newDirUriTest, isExist); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + EXPECT_TRUE(isExist); + + result = fah->Access(newFileUri, isExist); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + EXPECT_TRUE(isExist); + + result = fah->Delete(newDirUriTest); + EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); + + result = fah->Access(newDirUriTest, isExist); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + EXPECT_FALSE(isExist); + } SetSelfTokenID(selfTokenId_); } catch (...) { GTEST_LOG_(INFO) << "FileExtensionHelperTest-an exception occurred."; } - GTEST_LOG_(INFO) << "FileExtensionHelperTest-end file_extension_helper_allInterface_0000"; + GTEST_LOG_(INFO) << "FileExtensionHelperTest-end file_extension_helper_Access_0000"; } } // namespace \ No newline at end of file diff --git a/interfaces/kits/napi/common/file_extension_info_napi.cpp b/interfaces/kits/napi/common/file_extension_info_napi.cpp index c355723620449269f5ab7c7bd32feaaa2ca55ba3..386b921f90e6fc723ddbe73293468f2432cb0eb4 100644 --- a/interfaces/kits/napi/common/file_extension_info_napi.cpp +++ b/interfaces/kits/napi/common/file_extension_info_napi.cpp @@ -19,6 +19,7 @@ #include #include +#include "filemgmt_libn.h" #include "file_access_extension_info.h" #include "file_access_notify_common.h" #include "hilog_wrapper.h" @@ -27,6 +28,8 @@ namespace OHOS { namespace FileAccessFwk { +using namespace FileManagement::LibN; + static napi_value CreateStringUtf8(napi_env env, const std::string &str) { napi_value value = nullptr; @@ -37,16 +40,6 @@ static napi_value CreateStringUtf8(napi_env env, const std::string &str) return value; } -static napi_value CreateUint32(napi_env env, uint32_t val) -{ - napi_value value = nullptr; - if (napi_create_uint32(env, val, &value) != napi_ok) { - HILOG_ERROR("CreateUint32, value is not napi_ok"); - return nullptr; - } - return value; -} - static napi_value FileInfoConstructor(napi_env env, napi_callback_info info) { size_t argc = 0; @@ -63,7 +56,7 @@ static napi_value FileInfoConstructor(napi_env env, napi_callback_info info) return res; } -static napi_value DeviceInfoConstructor(napi_env env, napi_callback_info info) +static napi_value RootInfoConstructor(napi_env env, napi_callback_info info) { size_t argc = 0; napi_value args[1] = {0}; @@ -72,23 +65,34 @@ static napi_value DeviceInfoConstructor(napi_env env, napi_callback_info info) napi_status status = napi_get_cb_info(env, info, &argc, args, &res, &data); if (status != napi_ok) { - HILOG_ERROR("DeviceInfoConstructor, status is not napi_ok"); + HILOG_ERROR("RootInfoConstructor, status is not napi_ok"); return nullptr; } return res; } -void InitFlag(napi_env env, napi_value exports) +void InitDeviceFlag(napi_env env, napi_value exports) +{ + char propertyName[] = "DeviceFlag"; + napi_property_descriptor desc[] = { + DECLARE_NAPI_STATIC_PROPERTY("SUPPORTS_READ", NVal::CreateInt32(env, DEVICE_FLAG_SUPPORTS_READ).val_), + DECLARE_NAPI_STATIC_PROPERTY("SUPPORTS_WRITE", NVal::CreateInt32(env, DEVICE_FLAG_SUPPORTS_WRITE).val_) + }; + napi_value obj = nullptr; + napi_create_object(env, &obj); + napi_define_properties(env, obj, sizeof(desc) / sizeof(desc[0]), desc); + napi_set_named_property(env, exports, propertyName, obj); +} + +void InitDocumentFlag(napi_env env, napi_value exports) { - char propertyName[] = "FLAG"; + char propertyName[] = "DocumentFlag"; napi_property_descriptor desc[] = { - DECLARE_NAPI_STATIC_PROPERTY("SUPPORTS_THUMBNAIL", CreateUint32(env, FLAG_SUPPORTS_THUMBNAIL)), - DECLARE_NAPI_STATIC_PROPERTY("SUPPORTS_WRITE", CreateUint32(env, FLAG_SUPPORTS_WRITE)), - DECLARE_NAPI_STATIC_PROPERTY("SUPPORTS_READ", CreateUint32(env, FLAG_SUPPORTS_READ)), - DECLARE_NAPI_STATIC_PROPERTY("SUPPORTS_DELETE", CreateUint32(env, FLAG_SUPPORTS_DELETE)), - DECLARE_NAPI_STATIC_PROPERTY("SUPPORTS_RENAME", CreateUint32(env, FLAG_SUPPORTS_RENAME)), - DECLARE_NAPI_STATIC_PROPERTY("SUPPORTS_MOVE", CreateUint32(env, FLAG_SUPPORTS_MOVE)) + DECLARE_NAPI_STATIC_PROPERTY("REPRESENTS_FILE", NVal::CreateInt32(env, DOCUMENT_FLAG_REPRESENTS_FILE).val_), + DECLARE_NAPI_STATIC_PROPERTY("REPRESENTS_DIR", NVal::CreateInt32(env, DOCUMENT_FLAG_REPRESENTS_DIR).val_), + DECLARE_NAPI_STATIC_PROPERTY("SUPPORTS_READ", NVal::CreateInt32(env, DOCUMENT_FLAG_SUPPORTS_READ).val_), + DECLARE_NAPI_STATIC_PROPERTY("SUPPORTS_WRITE", NVal::CreateInt32(env, DOCUMENT_FLAG_SUPPORTS_WRITE).val_) }; napi_value obj = nullptr; napi_create_object(env, &obj); @@ -100,8 +104,8 @@ void InitNotifyType(napi_env env, napi_value exports) { char propertyName[] = "NotifyType"; napi_property_descriptor desc[] = { - DECLARE_NAPI_STATIC_PROPERTY("DEVICE_ONLINE", CreateUint32(env, NOTIFY_DEVICE_ONLINE)), - DECLARE_NAPI_STATIC_PROPERTY("DEVICE_OFFLINE", CreateUint32(env, NOTIFY_DEVICE_OFFLINE)) + DECLARE_NAPI_STATIC_PROPERTY("DEVICE_ONLINE", NVal::CreateInt32(env, NOTIFY_DEVICE_ONLINE).val_), + DECLARE_NAPI_STATIC_PROPERTY("DEVICE_OFFLINE", NVal::CreateInt32(env, NOTIFY_DEVICE_OFFLINE).val_) }; napi_value obj = nullptr; napi_create_object(env, &obj); @@ -130,13 +134,14 @@ void InitDeviceType(napi_env env, napi_value exports) { char propertyName[] = "DeviceType"; napi_property_descriptor desc[] = { - DECLARE_NAPI_STATIC_PROPERTY("LOCAL_DISK", CreateUint32(env, DEVICE_LOCAL_DISK)), - DECLARE_NAPI_STATIC_PROPERTY("SHARED_DISK", CreateUint32(env, DEVICE_SHARED_DISK)), - DECLARE_NAPI_STATIC_PROPERTY("SHARED_TERMINAL", CreateUint32(env, DEVICE_SHARED_TERMINAL)), - DECLARE_NAPI_STATIC_PROPERTY("NETWORK_NEIGHBORHOODS", CreateUint32(env, DEVICE_NETWORK_NEIGHBORHOODS)), - DECLARE_NAPI_STATIC_PROPERTY("EXTERNAL_MTP", CreateUint32(env, DEVICE_EXTERNAL_MTP)), - DECLARE_NAPI_STATIC_PROPERTY("EXTERNAL_USB", CreateUint32(env, DEVICE_EXTERNAL_USB)), - DECLARE_NAPI_STATIC_PROPERTY("EXTERNAL_CLOUD", CreateUint32(env, DEVICE_EXTERNAL_CLOUD)) + DECLARE_NAPI_STATIC_PROPERTY("DEVICE_LOCAL_DISK", NVal::CreateInt32(env, DEVICE_LOCAL_DISK).val_), + DECLARE_NAPI_STATIC_PROPERTY("DEVICE_SHARED_DISK", NVal::CreateInt32(env, DEVICE_SHARED_DISK).val_), + DECLARE_NAPI_STATIC_PROPERTY("DEVICE_SHARED_TERMINAL", NVal::CreateInt32(env, DEVICE_SHARED_TERMINAL).val_), + DECLARE_NAPI_STATIC_PROPERTY("DEVICE_NETWORK_NEIGHBORHOODS", + NVal::CreateInt32(env, DEVICE_NETWORK_NEIGHBORHOODS).val_), + DECLARE_NAPI_STATIC_PROPERTY("DEVICE_EXTERNAL_MTP", NVal::CreateInt32(env, DEVICE_EXTERNAL_MTP).val_), + DECLARE_NAPI_STATIC_PROPERTY("DEVICE_EXTERNAL_USB", NVal::CreateInt32(env, DEVICE_EXTERNAL_USB).val_), + DECLARE_NAPI_STATIC_PROPERTY("DEVICE_EXTERNAL_CLOUD", NVal::CreateInt32(env, DEVICE_EXTERNAL_CLOUD).val_) }; napi_value obj = nullptr; napi_create_object(env, &obj); @@ -144,19 +149,20 @@ void InitDeviceType(napi_env env, napi_value exports) napi_set_named_property(env, exports, propertyName, obj); } -void InitDeviceInfo(napi_env env, napi_value exports) +void InitRootInfo(napi_env env, napi_value exports) { - char className[] = "DeviceInfo"; + char className[] = "RootInfo"; napi_property_descriptor desc[] = { + { "deviceType", nullptr, nullptr, nullptr, nullptr, CreateStringUtf8(env, "deviceType"), + napi_writable, nullptr }, { "uri", nullptr, nullptr, nullptr, nullptr, CreateStringUtf8(env, "uri"), napi_writable, nullptr }, - { "displayName", nullptr, nullptr, nullptr, nullptr, - CreateStringUtf8(env, "displayName"), napi_writable, nullptr }, - { "deviceId", nullptr, nullptr, nullptr, nullptr, CreateStringUtf8(env, "deviceId"), napi_writable, nullptr }, - { "flags", nullptr, nullptr, nullptr, nullptr, CreateStringUtf8(env, "flags"), napi_writable, nullptr }, - { "type", nullptr, nullptr, nullptr, nullptr, CreateStringUtf8(env, "type"), napi_writable, nullptr } + { "displayName", nullptr, nullptr, nullptr, nullptr, CreateStringUtf8(env, "displayName"), + napi_writable, nullptr }, + { "deviceFlags", nullptr, nullptr, nullptr, nullptr, CreateStringUtf8(env, "deviceFlags"), + napi_writable, nullptr } }; napi_value obj = nullptr; - napi_define_class(env, className, NAPI_AUTO_LENGTH, DeviceInfoConstructor, nullptr, + napi_define_class(env, className, NAPI_AUTO_LENGTH, RootInfoConstructor, nullptr, sizeof(desc) / sizeof(*desc), desc, &obj); napi_set_named_property(env, exports, className, obj); } diff --git a/interfaces/kits/napi/common/file_extension_info_napi.h b/interfaces/kits/napi/common/file_extension_info_napi.h index 6fc9c0dea8cd2fc80326c873e2f31d4f0a541f23..3bf190e54ae4ac8a7b5c2bb44bd8dc88705e912c 100644 --- a/interfaces/kits/napi/common/file_extension_info_napi.h +++ b/interfaces/kits/napi/common/file_extension_info_napi.h @@ -20,11 +20,12 @@ namespace OHOS { namespace FileAccessFwk { -void InitFlag(napi_env env, napi_value exports); +void InitDeviceFlag(napi_env env, napi_value exports); +void InitDocumentFlag(napi_env env, napi_value exports); void InitNotifyType(napi_env env, napi_value exports); void InitDeviceType(napi_env env, napi_value exports); void InitFileInfo(napi_env env, napi_value exports); -void InitDeviceInfo(napi_env env, napi_value exports); +void InitRootInfo(napi_env env, napi_value exports); } // namespace FileAccessFwk } // namespace OHOS #endif // FILE_EXTENSION_INFO_NAPI_H \ 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 3af025e5a016a6eb83273ba7c08c1ddb5392a22d..b8844cecd11b4602662c07a68dc1ab53cfa6694e 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 @@ -20,42 +20,66 @@ class FileAccessExtensionAbility { registerCallback(callback) { } - openFile(uri, mode) { - return 0; + openFile(sourceFileUri, flags) { + return { + fd: -1, + code: ERR_ERROR, + }; } createFile(parentUri, displayName) { - return ""; + return { + uri: "", + code: ERR_ERROR, + }; } mkdir(parentUri, displayName) { - return ""; + return { + uri: "", + code: ERR_ERROR, + }; } - delete(sourceFileUri) { - return 0; + delete(selectFileUri) { + return { + code: ERR_ERROR, + }; } move(sourceFileUri, targetParentUri) { - return ""; + return { + uri: '', + code: ERR_ERROR, + }; } rename(sourceFileUri, displayName) { - return ""; + return { + uri: '', + code: ERR_ERROR, + }; } - listFile(sourceFileUri) { - let infos = []; - return infos; + listFile(sourceFileUri, offset, count, filter) { + return { + infos: [], + code: ERR_ERROR, + }; } getRoots() { - let roots = []; - return roots; + return { + roots: [], + code: ERR_ERROR, + }; } - isFileExist() { - return true; + access(sourceFileUri) { + return { + isExist: false, + code: ERR_ERROR, + }; } } diff --git a/interfaces/kits/napi/file_access_module/BUILD.gn b/interfaces/kits/napi/file_access_module/BUILD.gn index 3e556e1254b5c01ed2636b7ef3378259167d49ca..39eea3bfb7a9cd9ebdf85766ed5136fef72ab266 100644 --- a/interfaces/kits/napi/file_access_module/BUILD.gn +++ b/interfaces/kits/napi/file_access_module/BUILD.gn @@ -22,16 +22,24 @@ ohos_shared_library("fileaccess") { include_dirs = [ "./", - "${BASE_DIR}/utils", "${BASE_DIR}/interfaces/kits/napi/common", + "${BASE_DIR}/interfaces/kits/napi/file_access_module/file_info", + "${BASE_DIR}/interfaces/kits/napi/file_access_module/root_info", + "${BASE_DIR}/utils", + "//foundation/distributeddatamgr/distributedfile/interfaces/kits/js/src/common", "//foundation/distributeddatamgr/distributedfile/utils/filemgmt_libn/include", ] sources = [ "${BASE_DIR}/interfaces/kits/napi/common/file_extension_info_napi.cpp", + "file_info/napi_file_info_exporter.cpp", + "file_info/napi_file_iterator_exporter.cpp", "napi_fileaccess_helper.cpp", "napi_notify_callback.cpp", + "napi_utils.cpp", "native_fileaccess_module.cpp", + "root_info/napi_root_info_exporter.cpp", + "root_info/napi_root_iterator_exporter.cpp", ] deps = [ diff --git a/interfaces/kits/napi/file_access_module/file_info/file_info_entity.h b/interfaces/kits/napi/file_access_module/file_info/file_info_entity.h new file mode 100644 index 0000000000000000000000000000000000000000..3450af5b38a9c545f52486ffeba6d19552c5df4d --- /dev/null +++ b/interfaces/kits/napi/file_access_module/file_info/file_info_entity.h @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FILE_INFO_ENTITY_H +#define FILE_INFO_ENTITY_H + +#include "file_access_extension_info.h" +#include "file_access_helper.h" +#include "file_filter.h" + +namespace OHOS { +namespace FileAccessFwk { +using namespace DistributedFS; + +struct FileInfoEntity { + FileAccessHelper *fileAccessHelper { nullptr }; + FileInfo fileInfo; + FileFilter filter { {}, {}, {}, 0, 0, false, false }; +}; +} // namespace FileAccessFwk +} // namespace OHOS +#endif // FILE_INFO_ENTITY_H \ No newline at end of file diff --git a/interfaces/kits/napi/file_access_module/file_info/file_iterator_entity.h b/interfaces/kits/napi/file_access_module/file_info/file_iterator_entity.h new file mode 100644 index 0000000000000000000000000000000000000000..990fdc36691d0ce58c47e69a6e347cbe0bc10696 --- /dev/null +++ b/interfaces/kits/napi/file_access_module/file_info/file_iterator_entity.h @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FILE_ITERATOR_ENTITY_H +#define FILE_ITERATOR_ENTITY_H + +#include + +#include "file_access_extension_info.h" +#include "file_access_helper.h" +#include "hilog_wrapper.h" +#include "file_filter.h" + +namespace OHOS { +namespace FileAccessFwk { +using namespace DistributedFS; + +constexpr int64_t MAX_COUNT = 1000; // ListFile get file's max count + +struct FileIteratorEntity { + FileAccessHelper *fileAccessHelper { nullptr }; + std::mutex entityOperateMutex; + FileInfo fileInfo; + std::vector fileInfoVec; + int64_t offset { 0 }; + int64_t pos { 0 }; + FileFilter filter { {}, {}, {}, 0, 0, false, false }; + int flag { 0 }; +}; +} // namespace FileAccessFwk +} // namespace OHOS +#endif // FILE_ITERATOR_ENTITY_H \ No newline at end of file diff --git a/interfaces/kits/napi/file_access_module/file_info/napi_file_info_exporter.cpp b/interfaces/kits/napi/file_access_module/file_info/napi_file_info_exporter.cpp new file mode 100644 index 0000000000000000000000000000000000000000..35895ac58118cd02c1895c0e17d7f317611dce88 --- /dev/null +++ b/interfaces/kits/napi/file_access_module/file_info/napi_file_info_exporter.cpp @@ -0,0 +1,299 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "napi_file_info_exporter.h" + +#include "file_access_framework_errno.h" +#include "file_info_entity.h" +#include "file_iterator_entity.h" +#include "hilog_wrapper.h" +#include "napi_file_iterator_exporter.h" +#include "napi_utils.h" + +namespace OHOS { +namespace FileAccessFwk { +bool NapiFileInfoExporter::Export() +{ + std::vector props = { + NVal::DeclareNapiFunction("listFile", ListFile), + NVal::DeclareNapiFunction("scanFile", ScanFile), + NVal::DeclareNapiGetter("uri", GetUri), + NVal::DeclareNapiGetter("fileName", GetFileName), + NVal::DeclareNapiGetter("mode", GetMode), + NVal::DeclareNapiGetter("size", GetSize), + NVal::DeclareNapiGetter("mtime", GetMtime), + NVal::DeclareNapiGetter("mimeType", GetMimeType), + }; + + std::string className = GetClassName(); + bool succ = false; + napi_value classValue = nullptr; + std::tie(succ, classValue) = NClass::DefineClass(exports_.env_, className, + NapiFileInfoExporter::Constructor, std::move(props)); + if (!succ) { + NError(ERR_NULL_POINTER).ThrowErr(exports_.env_, "INNER BUG. Failed to define class NapiFileInfoExporter"); + return false; + } + + succ = NClass::SaveClass(exports_.env_, className, classValue); + if (!succ) { + NError(ERR_NULL_POINTER).ThrowErr(exports_.env_, "INNER BUG. Failed to save class NapiFileInfoExporter"); + return false; + } + + return exports_.AddProp(className, classValue); +} + +napi_value NapiFileInfoExporter::Constructor(napi_env env, napi_callback_info info) +{ + NFuncArg funcArg(env, info); + if (!funcArg.InitArgs(NARG_CNT::ZERO)) { + NError(ERR_PARAM_NUMBER).ThrowErr(env, "Number of arguments unmatched"); + return nullptr; + } + + auto fileInfoEntity = std::make_unique(); + if (fileInfoEntity == nullptr) { + NError(ERR_NULL_POINTER).ThrowErr(env, "Cannot get entity of fileInfoEntity"); + return nullptr; + } + + if (!NClass::SetEntityFor(env, funcArg.GetThisVar(), std::move(fileInfoEntity))) { + NError(ERR_NULL_POINTER).ThrowErr(env, "INNER BUG. Failed to wrap entity for obj FileInfoEntity"); + return nullptr; + } + + return funcArg.GetThisVar(); +} + +napi_value NapiFileInfoExporter::ListFile(napi_env env, napi_callback_info info) +{ + NFuncArg funcArg(env, info); + if (!funcArg.InitArgs(NARG_CNT::ZERO, NARG_CNT::ONE)) { + NError(ERR_PARAM_NUMBER).ThrowErr(env, "Number of arguments unmatched"); + return nullptr; + } + + FileFilter filter({}, {}, {}, 0, 0, false, false); + if (funcArg.GetArgc() == NARG_CNT::ONE) { + auto ret = GetFileFilterParam(NVal(env, funcArg.GetArg(NARG_POS::FIRST)), filter); + if (ret != ERR_OK) { + NError(ret).ThrowErr(env, "ListFile get FileFilter param fail"); + return nullptr; + } + } + + auto fileInfoEntity = NClass::GetEntityOf(env, funcArg.GetThisVar()); + if (fileInfoEntity == nullptr) { + NError(ERR_NULL_POINTER).ThrowErr(env, "Cannot get entity of FileInfoEntity"); + return nullptr; + } + + if (IsDirectory(fileInfoEntity->fileInfo.mode) != ERR_OK) { + HILOG_ERROR("current FileInfo's mode error"); + return NVal::CreateUndefined(env).val_; + } + + if (fileInfoEntity->fileAccessHelper == nullptr) { + NError(ERR_NULL_POINTER).ThrowErr(env, "fileAccessHelper is null."); + return nullptr; + } + + auto objFileIteratorExporter = NClass::InstantiateClass(env, NapiFileIteratorExporter::className_, {}); + if (objFileIteratorExporter == nullptr) { + NError(ERR_NULL_POINTER).ThrowErr(env, "Cannot instantiate class NapiFileIteratorExporter"); + return nullptr; + } + + auto fileIteratorEntity = NClass::GetEntityOf(env, objFileIteratorExporter); + if (fileIteratorEntity == nullptr) { + NError(ERR_NULL_POINTER).ThrowErr(env, "Cannot get the entity of FileIteratorEntity"); + return nullptr; + } + + { + std::lock_guard lock(fileIteratorEntity->entityOperateMutex); + fileIteratorEntity->fileAccessHelper = fileInfoEntity->fileAccessHelper; + fileIteratorEntity->fileInfo = fileInfoEntity->fileInfo; + fileIteratorEntity->fileInfoVec.clear(); + fileIteratorEntity->offset = 0; + fileIteratorEntity->pos = 0; + fileIteratorEntity->filter = std::move(filter); + fileIteratorEntity->flag = 0; + auto ret = fileInfoEntity->fileAccessHelper->ListFile(fileInfoEntity->fileInfo, fileIteratorEntity->offset, + MAX_COUNT, fileIteratorEntity->filter, fileIteratorEntity->fileInfoVec); + if (ret != ERR_OK) { + NError(ret).ThrowErr(env, "exec ListFile fail"); + return nullptr; + } + } + + return NVal(env, objFileIteratorExporter).val_; +} + +napi_value NapiFileInfoExporter::ScanFile(napi_env env, napi_callback_info info) +{ + NFuncArg funcArg(env, info); + if (!funcArg.InitArgs(NARG_CNT::ZERO, NARG_CNT::ONE)) { + NError(ERR_PARAM_NUMBER).ThrowErr(env, "Number of arguments unmatched"); + return nullptr; + } + + FileFilter filter({}, {}, {}, 0, 0, false, false); + if (funcArg.GetArgc() == NARG_CNT::ONE) { + auto ret = GetFileFilterParam(NVal(env, funcArg.GetArg(NARG_POS::FIRST)), filter); + if (ret != ERR_OK) { + NError(ret).ThrowErr(env, "ScanFile get FileFilter param fail"); + return nullptr; + } + } + + auto fileInfoEntity = NClass::GetEntityOf(env, funcArg.GetThisVar()); + if (fileInfoEntity == nullptr) { + NError(ERR_NULL_POINTER).ThrowErr(env, "Cannot get entity of FileInfoEntity"); + return nullptr; + } + + if (IsDirectory(fileInfoEntity->fileInfo.mode) != ERR_OK) { + HILOG_ERROR("current FileInfo's mode error"); + return NVal::CreateUndefined(env).val_; + } + + if (fileInfoEntity->fileAccessHelper == nullptr) { + NError(ERR_NULL_POINTER).ThrowErr(env, "fileAccessHelper is null."); + return nullptr; + } + + auto objFileIteratorExporter = NClass::InstantiateClass(env, NapiFileIteratorExporter::className_, {}); + if (objFileIteratorExporter == nullptr) { + NError(ERR_NULL_POINTER).ThrowErr(env, "Cannot instantiate class NapiFileIteratorExporter"); + return nullptr; + } + + auto fileIteratorEntity = NClass::GetEntityOf(env, objFileIteratorExporter); + if (fileIteratorEntity == nullptr) { + NError(ERR_NULL_POINTER).ThrowErr(env, "Cannot get the entity of FileIteratorEntity"); + return nullptr; + } + + { + std::lock_guard lock(fileIteratorEntity->entityOperateMutex); + fileIteratorEntity->fileAccessHelper = fileInfoEntity->fileAccessHelper; + fileIteratorEntity->fileInfo = fileInfoEntity->fileInfo; + fileIteratorEntity->fileInfoVec.clear(); + fileIteratorEntity->offset = 0; + fileIteratorEntity->pos = 0; + fileIteratorEntity->filter = std::move(filter); + fileIteratorEntity->flag = 1; + auto ret = fileInfoEntity->fileAccessHelper->ScanFile(fileInfoEntity->fileInfo, fileIteratorEntity->offset, + MAX_COUNT, fileIteratorEntity->filter, fileIteratorEntity->fileInfoVec); + if (ret != ERR_OK) { + NError(ret).ThrowErr(env, "exec ScanFile fail"); + return nullptr; + } + } + + return NVal(env, objFileIteratorExporter).val_; +} + +static FileInfoEntity *GetFileInfoEntity(napi_env env, napi_callback_info info) +{ + NFuncArg funcArg(env, info); + if (!funcArg.InitArgs(NARG_CNT::ZERO)) { + NError(ERR_PARAM_NUMBER).ThrowErr(env, "Number of arguments unmatched"); + return nullptr; + } + + auto fileInfoEntity = NClass::GetEntityOf(env, funcArg.GetThisVar()); + if (fileInfoEntity == nullptr) { + NError(ERR_NULL_POINTER).ThrowErr(env, "Cannot get entity of FileInfoEntity"); + return nullptr; + } + + return fileInfoEntity; +} + +napi_value NapiFileInfoExporter::GetUri(napi_env env, napi_callback_info info) +{ + auto fileInfoEntity = GetFileInfoEntity(env, info); + if (fileInfoEntity == nullptr) { + HILOG_ERROR("Failed to get entity of FileInfoEntity"); + return NVal::CreateUndefined(env).val_; + } + + return NVal::CreateUTF8String(env, fileInfoEntity->fileInfo.uri).val_; +} + +napi_value NapiFileInfoExporter::GetFileName(napi_env env, napi_callback_info info) +{ + auto fileInfoEntity = GetFileInfoEntity(env, info); + if (fileInfoEntity == nullptr) { + HILOG_ERROR("Failed to get entity of FileInfoEntity"); + return NVal::CreateUndefined(env).val_; + } + + return NVal::CreateUTF8String(env, fileInfoEntity->fileInfo.fileName).val_; +} + +napi_value NapiFileInfoExporter::GetMode(napi_env env, napi_callback_info info) +{ + auto fileInfoEntity = GetFileInfoEntity(env, info); + if (fileInfoEntity == nullptr) { + HILOG_ERROR("Failed to get entity of FileInfoEntity"); + return NVal::CreateUndefined(env).val_; + } + + return NVal::CreateInt32(env, fileInfoEntity->fileInfo.mode).val_; +} + +napi_value NapiFileInfoExporter::GetSize(napi_env env, napi_callback_info info) +{ + auto fileInfoEntity = GetFileInfoEntity(env, info); + if (fileInfoEntity == nullptr) { + HILOG_ERROR("Failed to get entity of FileInfoEntity"); + return NVal::CreateUndefined(env).val_; + } + + return NVal::CreateInt64(env, fileInfoEntity->fileInfo.size).val_; +} + +napi_value NapiFileInfoExporter::GetMtime(napi_env env, napi_callback_info info) +{ + auto fileInfoEntity = GetFileInfoEntity(env, info); + if (fileInfoEntity == nullptr) { + HILOG_ERROR("Failed to get entity of FileInfoEntity"); + return NVal::CreateUndefined(env).val_; + } + + return NVal::CreateInt64(env, fileInfoEntity->fileInfo.mtime).val_; +} + +napi_value NapiFileInfoExporter::GetMimeType(napi_env env, napi_callback_info info) +{ + auto fileInfoEntity = GetFileInfoEntity(env, info); + if (fileInfoEntity == nullptr) { + HILOG_ERROR("Failed to get entity of FileInfoEntity"); + return NVal::CreateUndefined(env).val_; + } + + return NVal::CreateUTF8String(env, fileInfoEntity->fileInfo.mimeType).val_; +} + +std::string NapiFileInfoExporter::GetClassName() +{ + return NapiFileInfoExporter::className_; +} +} // namespace FileAccessFwk +} // namespace OHOS \ No newline at end of file diff --git a/interfaces/kits/napi/file_access_module/file_info/napi_file_info_exporter.h b/interfaces/kits/napi/file_access_module/file_info/napi_file_info_exporter.h new file mode 100644 index 0000000000000000000000000000000000000000..cba95c6bd0a2c3af239cfed11d4f105c2d4d34ad --- /dev/null +++ b/interfaces/kits/napi/file_access_module/file_info/napi_file_info_exporter.h @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef NAPI_FILE_INFO_EXPORTER_H +#define NAPI_FILE_INFO_EXPORTER_H + +#include + +#include "file_access_extension_info.h" +#include "file_access_helper.h" +#include "filemgmt_libn.h" + +namespace OHOS { +namespace FileAccessFwk { +using namespace FileManagement::LibN; + +class NapiFileInfoExporter final : public NExporter { +public: + inline static const std::string className_ = "NapiFileInfoExporter"; + + NapiFileInfoExporter(napi_env env, napi_value exports) : NExporter(env, exports) {}; + ~NapiFileInfoExporter() = default; + + static napi_value Constructor(napi_env env, napi_callback_info info); + static napi_value ListFile(napi_env env, napi_callback_info info); + static napi_value ScanFile(napi_env env, napi_callback_info info); + static napi_value GetUri(napi_env env, napi_callback_info info); + static napi_value GetFileName(napi_env env, napi_callback_info info); + static napi_value GetMode(napi_env env, napi_callback_info info); + static napi_value GetSize(napi_env env, napi_callback_info info); + static napi_value GetMtime(napi_env env, napi_callback_info info); + static napi_value GetMimeType(napi_env env, napi_callback_info info); + + bool Export() override; + std::string GetClassName() override; +}; +} // namespace FileAccessFwk +} // namespace OHOS +#endif // NAPI_FILE_INFO_EXPORTER_H \ No newline at end of file diff --git a/interfaces/kits/napi/file_access_module/file_info/napi_file_iterator_exporter.cpp b/interfaces/kits/napi/file_access_module/file_info/napi_file_iterator_exporter.cpp new file mode 100644 index 0000000000000000000000000000000000000000..139439d397e04305bd4918f678eb5ea3ea42dfd4 --- /dev/null +++ b/interfaces/kits/napi/file_access_module/file_info/napi_file_iterator_exporter.cpp @@ -0,0 +1,181 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "napi_file_iterator_exporter.h" + +#include + +#include "file_info_entity.h" +#include "file_iterator_entity.h" +#include "hilog_wrapper.h" +#include "napi_file_info_exporter.h" +#include "napi_utils.h" + +namespace OHOS { +namespace FileAccessFwk { +bool NapiFileIteratorExporter::Export() +{ + std::vector props = { + NVal::DeclareNapiFunction("next", Next), + }; + + std::string className = GetClassName(); + bool succ = false; + napi_value classValue = nullptr; + std::tie(succ, classValue) = NClass::DefineClass(exports_.env_, className, + NapiFileIteratorExporter::Constructor, std::move(props)); + if (!succ) { + NError(ERR_NULL_POINTER).ThrowErr(exports_.env_, "INNER BUG. Failed to define class NapiFileIteratorExporter"); + return false; + } + + succ = NClass::SaveClass(exports_.env_, className, classValue); + if (!succ) { + NError(ERR_NULL_POINTER).ThrowErr(exports_.env_, "INNER BUG. Failed to save class NapiFileIteratorExporter"); + return false; + } + + return exports_.AddProp(className, classValue); +} + +napi_value NapiFileIteratorExporter::Constructor(napi_env env, napi_callback_info info) +{ + NFuncArg funcArg(env, info); + if (!funcArg.InitArgs(NARG_CNT::ZERO)) { + NError(ERR_PARAM_NUMBER).ThrowErr(env, "Number of arguments unmatched"); + return nullptr; + } + + auto fileIteratorEntity = std::make_unique(); + if (fileIteratorEntity == nullptr) { + NError(ERR_NULL_POINTER).ThrowErr(env, "New obj FileIteratorEntity fail"); + return nullptr; + } + + if (!NClass::SetEntityFor(env, funcArg.GetThisVar(), std::move(fileIteratorEntity))) { + NError(ERR_NULL_POINTER).ThrowErr(env, "INNER BUG. Failed to wrap entity for obj FileIteratorEntity"); + return nullptr; + } + + return funcArg.GetThisVar(); +} + +static int MakeResult(napi_value &objFileInfoExporter, FileIteratorEntity *fileIteratorEntity, + FileInfoEntity *fileInfoEntity, napi_env env, NVal &nVal) +{ + std::lock_guard lock(fileIteratorEntity->entityOperateMutex); + if (fileIteratorEntity->fileInfoVec.size() == 0) { + fileIteratorEntity->fileInfoVec.clear(); + fileIteratorEntity->offset = 0; + fileIteratorEntity->pos = 0; + fileInfoEntity = nullptr; + objFileInfoExporter = NVal::CreateUndefined(env).val_; + nVal.AddProp("value", objFileInfoExporter); + nVal.AddProp("done", NVal::CreateBool(env, true).val_); + return ERR_OK; + } + + if (fileIteratorEntity->pos == MAX_COUNT) { + fileIteratorEntity->fileInfoVec.clear(); + fileIteratorEntity->offset += MAX_COUNT; + fileIteratorEntity->pos = 0; + if (fileIteratorEntity->flag == 0) { + int ret = fileIteratorEntity->fileAccessHelper->ListFile(fileIteratorEntity->fileInfo, + fileIteratorEntity->offset, MAX_COUNT, fileIteratorEntity->filter, fileIteratorEntity->fileInfoVec); + if (ret != ERR_OK) { + HILOG_ERROR("exec ListFile fail, code:%{public}d", ret); + return ret; + } + } else if (fileIteratorEntity->flag == 1) { + int ret = fileIteratorEntity->fileAccessHelper->ScanFile(fileIteratorEntity->fileInfo, + fileIteratorEntity->offset, MAX_COUNT, fileIteratorEntity->filter, fileIteratorEntity->fileInfoVec); + if (ret != ERR_OK) { + HILOG_ERROR("exec ScanFile fail, code:%{public}d", ret); + return ret; + } + } + } + + if (fileIteratorEntity->pos == fileIteratorEntity->fileInfoVec.size()) { + fileIteratorEntity->fileInfoVec.clear(); + fileIteratorEntity->offset = 0; + fileIteratorEntity->pos = 0; + fileInfoEntity = nullptr; + objFileInfoExporter = NVal::CreateUndefined(env).val_; + nVal.AddProp("value", objFileInfoExporter); + nVal.AddProp("done", NVal::CreateBool(env, true).val_); + return ERR_OK; + } + + fileInfoEntity->fileAccessHelper = fileIteratorEntity->fileAccessHelper; + fileInfoEntity->fileInfo = fileIteratorEntity->fileInfoVec[fileIteratorEntity->pos]; + fileIteratorEntity->pos++; + nVal.AddProp("value", objFileInfoExporter); + nVal.AddProp("done", NVal::CreateBool(env, false).val_); + return ERR_OK; +} + +napi_value NapiFileIteratorExporter::Next(napi_env env, napi_callback_info info) +{ + NFuncArg funcArg(env, info); + if (!funcArg.InitArgs(NARG_CNT::ZERO)) { + NError(ERR_PARAM_NUMBER).ThrowErr(env, "Number of arguments unmatched"); + return nullptr; + } + + auto fileIteratorEntity = NClass::GetEntityOf(env, funcArg.GetThisVar()); + if (fileIteratorEntity == nullptr) { + NError(ERR_NULL_POINTER).ThrowErr(env, "Cannot get entity of FileIteratorEntity"); + return nullptr; + } + + if (IsDirectory(fileIteratorEntity->fileInfo.mode) != ERR_OK) { + HILOG_ERROR("current FileInfo's mode error"); + return NVal::CreateUndefined(env).val_; + } + + auto objFileInfoExporter = NClass::InstantiateClass(env, NapiFileInfoExporter::className_, {}); + if (objFileInfoExporter == nullptr) { + NError(ERR_NULL_POINTER).ThrowErr(env, "Cannot instantiate class NapiFileInfoExporter"); + return nullptr; + } + + auto fileInfoEntity = NClass::GetEntityOf(env, objFileInfoExporter); + if (fileInfoEntity == nullptr) { + NError(ERR_NULL_POINTER).ThrowErr(env, "Cannot get the entity of FileInfoEntity"); + return nullptr; + } + + if (fileIteratorEntity->fileAccessHelper == nullptr) { + NError(ERR_NULL_POINTER).ThrowErr(env, "fileAccessHelper is null."); + return nullptr; + } + + auto retNVal = NVal::CreateObject(env); + int ret = MakeResult(objFileInfoExporter, fileIteratorEntity, fileInfoEntity, env, retNVal); + if (ret != ERR_OK) { + NError(ret).ThrowErr(env, "MakeResult fail."); + return nullptr; + } + + return retNVal.val_; +} + +std::string NapiFileIteratorExporter::GetClassName() +{ + return NapiFileIteratorExporter::className_; +} +} // namespace FileAccessFwk +} // namespace OHOS \ No newline at end of file diff --git a/interfaces/kits/napi/file_access_module/file_info/napi_file_iterator_exporter.h b/interfaces/kits/napi/file_access_module/file_info/napi_file_iterator_exporter.h new file mode 100644 index 0000000000000000000000000000000000000000..e1b51314bcce9ca4b510166e1bcab8624e08a740 --- /dev/null +++ b/interfaces/kits/napi/file_access_module/file_info/napi_file_iterator_exporter.h @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef NAPI_FILE_ITERATOR_EXPORTER_H +#define NAPI_FILE_ITERATOR_EXPORTER_H + +#include + +#include "file_access_extension_info.h" +#include "file_access_helper.h" +#include "filemgmt_libn.h" + +namespace OHOS { +namespace FileAccessFwk { +using namespace FileManagement::LibN; + +class NapiFileIteratorExporter final : public NExporter { +public: + inline static const std::string className_ = "NapiFileIteratorExporter"; + + NapiFileIteratorExporter(napi_env env, napi_value exports) : NExporter(env, exports) {}; + ~NapiFileIteratorExporter() = default; + + static napi_value Constructor(napi_env env, napi_callback_info info); + static napi_value Next(napi_env env, napi_callback_info info); + + bool Export() override; + std::string GetClassName() override; +}; +} // namespace FileAccessFwk +} // namespace OHOS +#endif // NAPI_FILE_ITERATOR_EXPORTER_H \ 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 8164e0318b0fe13cbea31da54d94d41105dc7308..804a73fbafbae16953c0578387aef5a606309e3e 100644 --- a/interfaces/kits/napi/file_access_module/napi_fileaccess_helper.cpp +++ b/interfaces/kits/napi/file_access_module/napi_fileaccess_helper.cpp @@ -20,13 +20,17 @@ #include "file_access_framework_errno.h" #include "file_access_helper.h" +#include "file_info_entity.h" #include "filemgmt_libn.h" #include "hilog_wrapper.h" #include "ifile_access_notify.h" #include "napi_base_context.h" #include "napi_common_fileaccess.h" +#include "napi_error.h" +#include "napi_file_info_exporter.h" #include "napi_notify_callback.h" -#include "n_val.h" +#include "napi_root_iterator_exporter.h" +#include "root_iterator_entity.h" #include "securec.h" #include "uri.h" @@ -48,7 +52,7 @@ static napi_value FileAccessHelperConstructor(napi_env env, napi_callback_info i { NFuncArg funcArg(env, info); if (!funcArg.InitArgs(NARG_CNT::ONE, NARG_CNT::TWO)) { - NError(EINVAL).ThrowErr(env, "Number of arguments unmatched"); + NapiError(ERR_PARAM_NUMBER).ThrowErr(env); return nullptr; } @@ -87,12 +91,12 @@ static napi_value FileAccessHelperConstructor(napi_env env, napi_callback_info i auto finalize = [](napi_env env, void *data, void *hint) { FileAccessHelper *objectInfo = static_cast(data); - g_fileAccessHelperList.remove_if([objectInfo](const std::shared_ptr &fileAccessHelper) { - return objectInfo == fileAccessHelper.get(); - }); if (objectInfo != nullptr) { objectInfo->Release(); - delete objectInfo; + g_fileAccessHelperList.remove_if([objectInfo](const std::shared_ptr &fileAccessHelper) { + return objectInfo == fileAccessHelper.get(); + }); + objectInfo = nullptr; } }; if (napi_wrap(env, thisVar, fileAccessHelper.get(), finalize, nullptr, nullptr) != napi_ok) { @@ -106,7 +110,7 @@ napi_value AcquireFileAccessHelperWrap(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"); + NapiError(ERR_PARAM_NUMBER).ThrowErr(env); return nullptr; } @@ -163,18 +167,23 @@ napi_value NAPI_CreateFileAccessHelper(napi_env env, napi_callback_info info) return ret; } -napi_value NAPI_GetRegisterFileAccessExtAbilityInfo(napi_env env, napi_callback_info info) +napi_value NAPI_GetFileAccessAbilityInfo(napi_env env, napi_callback_info info) { NFuncArg funcArg(env, info); if (!funcArg.InitArgs(NARG_CNT::ZERO, NARG_CNT::ONE)) { - NError(EINVAL).ThrowErr(env, "Number of arguments unmatched"); + NapiError(ERR_PARAM_NUMBER).ThrowErr(env); return nullptr; } auto result = std::make_shared>(); + if (result == nullptr) { + NapiError(ERR_NULL_POINTER).ThrowErr(env); + return nullptr; + } + auto cbExec = [result]() -> NError { - *result = FileAccessHelper::GetRegisterFileAccessExtAbilityInfo(); - return NError(ERRNO_NOERR); + int ret = FileAccessHelper::GetRegisteredFileAccessExtAbilityInfo(*result); + return NError(ret); }; auto cbComplete = [result](napi_env env, NError err) -> NVal { if (err) { @@ -183,14 +192,14 @@ napi_value NAPI_GetRegisterFileAccessExtAbilityInfo(napi_env env, napi_callback_ napi_value jsArray = WrapArrayWantToJS(env, *result); return {env, jsArray}; }; - const std::string procedureName = "getRegisterFileAccessExtAbilityInfo"; + const std::string procedureName = "getFileAccessAbilityInfo"; NVal thisVar(env, funcArg.GetThisVar()); if (funcArg.GetArgc() == NARG_CNT::ZERO) { return NAsyncWorkPromise(env, thisVar).Schedule(procedureName, cbExec, cbComplete).val_; } NVal cb(env, funcArg[NARG_POS::FIRST]); if (!cb.TypeIs(napi_function)) { - NError(EINVAL).ThrowErr(env, "argument type unmatched"); + NapiError(ERR_INVALID_PARAM).ThrowErr(env); return nullptr; } return NAsyncWorkCallback(env, thisVar, cb).Schedule(procedureName, cbExec, cbComplete).val_; @@ -200,14 +209,13 @@ napi_value FileAccessHelperInit(napi_env env, napi_value exports) { napi_property_descriptor properties[] = { DECLARE_NAPI_FUNCTION("openFile", NAPI_OpenFile), - DECLARE_NAPI_FUNCTION("mkdir", NAPI_Mkdir), + DECLARE_NAPI_FUNCTION("mkDir", NAPI_Mkdir), DECLARE_NAPI_FUNCTION("createFile", NAPI_CreateFile), DECLARE_NAPI_FUNCTION("delete", NAPI_Delete), DECLARE_NAPI_FUNCTION("move", NAPI_Move), DECLARE_NAPI_FUNCTION("rename", NAPI_Rename), - DECLARE_NAPI_FUNCTION("listFile", NAPI_ListFile), DECLARE_NAPI_FUNCTION("getRoots", NAPI_GetRoots), - DECLARE_NAPI_FUNCTION("isFileExist", NAPI_IsFileExist), + DECLARE_NAPI_FUNCTION("access", NAPI_Access), DECLARE_NAPI_FUNCTION("on", NAPI_On), DECLARE_NAPI_FUNCTION("off", NAPI_Off) }; @@ -227,7 +235,7 @@ napi_value FileAccessHelperInit(napi_env env, napi_value exports) napi_property_descriptor export_properties[] = { DECLARE_NAPI_FUNCTION("createFileAccessHelper", NAPI_CreateFileAccessHelper), - DECLARE_NAPI_FUNCTION("getRegisterFileAccessExtAbilityInfo", NAPI_GetRegisterFileAccessExtAbilityInfo), + DECLARE_NAPI_FUNCTION("getFileAccessAbilityInfo", NAPI_GetFileAccessAbilityInfo), }; NAPI_CALL(env, napi_define_properties(env, exports, sizeof(export_properties) / sizeof(export_properties[0]), export_properties)); @@ -237,14 +245,14 @@ napi_value FileAccessHelperInit(napi_env env, napi_value exports) static FileAccessHelper *GetFileAccessHelper(napi_env env, napi_value thisVar) { if (thisVar == nullptr) { - NError(EINVAL).ThrowErr(env, "thisVar is nullper"); + NapiError(ERR_INVALID_PARAM).ThrowErr(env); return nullptr; } FileAccessHelper *fileAccessHelper = nullptr; napi_unwrap(env, thisVar, (void **)&fileAccessHelper); if (fileAccessHelper == nullptr) { - NError(EINVAL).ThrowErr(env, "fileAccessHelper is nullper"); + NapiError(ERR_GET_FILEACCESS_HELPER).ThrowErr(env); return nullptr; } return fileAccessHelper; @@ -259,13 +267,13 @@ static std::tuple, std::unique_ptr> GetRea std::unique_ptr name = nullptr; std::tie(succ, uri, std::ignore) = NVal(env, sourceFile).ToUTF8String(); if (!succ) { - NError(EINVAL).ThrowErr(env, "first parameter is Invalid"); + NapiError(ERR_INVALID_PARAM).ThrowErr(env); return { false, std::move(uri), std::move(name) }; } std::tie(succ, name, std::ignore) = NVal(env, targetParent).ToUTF8String(); if (!succ) { - NError(EINVAL).ThrowErr(env, "second parameter is Invalid"); + NapiError(ERR_INVALID_PARAM).ThrowErr(env); return { false, std::move(uri), std::move(name) }; } @@ -276,7 +284,7 @@ napi_value NAPI_OpenFile(napi_env env, napi_callback_info info) { NFuncArg funcArg(env, info); if (!funcArg.InitArgs(NARG_CNT::TWO, NARG_CNT::THREE)) { - NError(EINVAL).ThrowErr(env, "Number of arguments unmatched"); + NapiError(ERR_PARAM_NUMBER).ThrowErr(env); return nullptr; } @@ -284,14 +292,14 @@ napi_value NAPI_OpenFile(napi_env env, napi_callback_info info) 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"); + NapiError(ERR_INVALID_PARAM).ThrowErr(env); return nullptr; } int flags; std::tie(succ, flags) = NVal(env, funcArg[NARG_POS::SECOND]).ToInt32(); if (!succ) { - NError(EINVAL).ThrowErr(env, "Invalid flags"); + NapiError(ERR_INVALID_PARAM).ThrowErr(env); return nullptr; } @@ -301,11 +309,16 @@ napi_value NAPI_OpenFile(napi_env env, napi_callback_info info) } auto result = std::make_shared(); + if (result == nullptr) { + NapiError(ERR_NULL_POINTER).ThrowErr(env); + return nullptr; + } + string uriString(uri.get()); auto cbExec = [uriString, flags, result, fileAccessHelper]() -> NError { OHOS::Uri uri(uriString); - *result = fileAccessHelper->OpenFile(uri, flags); - return NError(ERRNO_NOERR); + int ret = fileAccessHelper->OpenFile(uri, flags, *result); + return NError(ret); }; auto cbComplete = [result](napi_env env, NError err) -> NVal { if (err) { @@ -322,7 +335,7 @@ napi_value NAPI_OpenFile(napi_env env, napi_callback_info info) NVal cb(env, funcArg[NARG_POS::THIRD]); if (!cb.TypeIs(napi_function)) { - NError(EINVAL).ThrowErr(env, "not function type"); + NapiError(ERR_INVALID_PARAM).ThrowErr(env); return nullptr; } return NAsyncWorkCallback(env, thisVar, cb).Schedule(procedureName, cbExec, cbComplete).val_; @@ -332,7 +345,7 @@ napi_value NAPI_CreateFile(napi_env env, napi_callback_info info) { NFuncArg funcArg(env, info); if (!funcArg.InitArgs(NARG_CNT::TWO, NARG_CNT::THREE)) { - NError(EINVAL).ThrowErr(env, "Number of arguments unmatched"); + NapiError(ERR_PARAM_NUMBER).ThrowErr(env); return nullptr; } @@ -350,6 +363,11 @@ napi_value NAPI_CreateFile(napi_env env, napi_callback_info info) } auto result = std::make_shared(); + if (result == nullptr) { + NapiError(ERR_NULL_POINTER).ThrowErr(env); + return nullptr; + } + string uriString(uri.get()); string name(displayName.get()); auto cbExec = [uriString, name, result, fileAccessHelper]() -> NError { @@ -374,7 +392,7 @@ napi_value NAPI_CreateFile(napi_env env, napi_callback_info info) NVal cb(env, funcArg[NARG_POS::THIRD]); if (!cb.TypeIs(napi_function)) { - NError(EINVAL).ThrowErr(env, "not function type"); + NapiError(ERR_INVALID_PARAM).ThrowErr(env); return nullptr; } return NAsyncWorkCallback(env, thisVar, cb).Schedule(procedureName, cbExec, cbComplete).val_; @@ -384,7 +402,7 @@ napi_value NAPI_Mkdir(napi_env env, napi_callback_info info) { NFuncArg funcArg(env, info); if (!funcArg.InitArgs(NARG_CNT::TWO, NARG_CNT::THREE)) { - NError(EINVAL).ThrowErr(env, "Number of arguments unmatched"); + NapiError(ERR_PARAM_NUMBER).ThrowErr(env); return nullptr; } @@ -402,6 +420,11 @@ napi_value NAPI_Mkdir(napi_env env, napi_callback_info info) } auto result = std::make_shared(); + if (result == nullptr) { + NapiError(ERR_NULL_POINTER).ThrowErr(env); + return nullptr; + } + string uriString(uri.get()); string name(displayName.get()); auto cbExec = [uriString, name, result, fileAccessHelper]() -> NError { @@ -426,7 +449,7 @@ napi_value NAPI_Mkdir(napi_env env, napi_callback_info info) NVal cb(env, funcArg[NARG_POS::THIRD]); if (!cb.TypeIs(napi_function)) { - NError(EINVAL).ThrowErr(env, "not function type"); + NapiError(ERR_INVALID_PARAM).ThrowErr(env); return nullptr; } return NAsyncWorkCallback(env, thisVar, cb).Schedule(procedureName, cbExec, cbComplete).val_; @@ -436,7 +459,7 @@ napi_value NAPI_Delete(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"); + NapiError(ERR_PARAM_NUMBER).ThrowErr(env); return nullptr; } @@ -444,7 +467,7 @@ napi_value NAPI_Delete(napi_env env, napi_callback_info info) 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"); + NapiError(ERR_INVALID_PARAM).ThrowErr(env); return nullptr; } @@ -454,6 +477,11 @@ napi_value NAPI_Delete(napi_env env, napi_callback_info info) } auto result = std::make_shared(); + if (result == nullptr) { + NapiError(ERR_NULL_POINTER).ThrowErr(env); + return nullptr; + } + string uriString(uri.get()); auto cbExec = [uriString, result, fileAccessHelper]() -> NError { OHOS::Uri uri(uriString); @@ -475,7 +503,7 @@ napi_value NAPI_Delete(napi_env env, napi_callback_info info) NVal cb(env, funcArg[NARG_POS::SECOND]); if (!cb.TypeIs(napi_function)) { - NError(EINVAL).ThrowErr(env, "not function type"); + NapiError(ERR_INVALID_PARAM).ThrowErr(env); return nullptr; } return NAsyncWorkCallback(env, thisVar, cb).Schedule(procedureName, cbExec, cbComplete).val_; @@ -485,7 +513,7 @@ napi_value NAPI_Move(napi_env env, napi_callback_info info) { NFuncArg funcArg(env, info); if (!funcArg.InitArgs(NARG_CNT::TWO, NARG_CNT::THREE)) { - NError(EINVAL).ThrowErr(env, "Number of arguments unmatched"); + NapiError(ERR_PARAM_NUMBER).ThrowErr(env); return nullptr; } @@ -503,6 +531,11 @@ napi_value NAPI_Move(napi_env env, napi_callback_info info) } auto result = std::make_shared(); + if (result == nullptr) { + NapiError(ERR_NULL_POINTER).ThrowErr(env); + return nullptr; + } + string sourceFileString(sourceFile.get()); string targetParentString(targetParent.get()); auto cbExec = [sourceFileString, targetParentString, result, fileAccessHelper]() -> NError { @@ -528,7 +561,7 @@ napi_value NAPI_Move(napi_env env, napi_callback_info info) NVal cb(env, funcArg[NARG_POS::THIRD]); if (!cb.TypeIs(napi_function)) { - NError(EINVAL).ThrowErr(env, "not function type"); + NapiError(ERR_INVALID_PARAM).ThrowErr(env); return nullptr; } return NAsyncWorkCallback(env, thisVar, cb).Schedule(procedureName, cbExec, cbComplete).val_; @@ -538,7 +571,7 @@ napi_value NAPI_Rename(napi_env env, napi_callback_info info) { NFuncArg funcArg(env, info); if (!funcArg.InitArgs(NARG_CNT::TWO, NARG_CNT::THREE)) { - NError(EINVAL).ThrowErr(env, "Number of arguments unmatched"); + NapiError(ERR_PARAM_NUMBER).ThrowErr(env); return nullptr; } @@ -556,6 +589,11 @@ napi_value NAPI_Rename(napi_env env, napi_callback_info info) } auto result = std::make_shared(); + if (result == nullptr) { + NapiError(ERR_NULL_POINTER).ThrowErr(env); + return nullptr; + } + string uriString(uri.get()); string name(displayName.get()); auto cbExec = [uriString, name, result, fileAccessHelper]() -> NError { @@ -580,108 +618,94 @@ napi_value NAPI_Rename(napi_env env, napi_callback_info info) NVal cb(env, funcArg[NARG_POS::THIRD]); if (!cb.TypeIs(napi_function)) { - NError(EINVAL).ThrowErr(env, "not function type"); + NapiError(ERR_INVALID_PARAM).ThrowErr(env); return nullptr; } return NAsyncWorkCallback(env, thisVar, cb).Schedule(procedureName, cbExec, cbComplete).val_; } -napi_value NAPI_ListFile(napi_env env, napi_callback_info info) +static int MakeGetRootsResult(napi_env &env, FileAccessHelper *helper, std::vector &rootInfoVec, NVal &nVal) { - 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; + auto objRootIterator = NClass::InstantiateClass(env, NapiRootIteratorExporter::className_, {}); + if (objRootIterator == nullptr) { + HILOG_INFO("Cannot instantiate class NapiRootIteratorExporter"); + return ERR_NULL_POINTER; } - FileAccessHelper *fileAccessHelper = GetFileAccessHelper(env, funcArg.GetThisVar()); - if (fileAccessHelper == nullptr) { - return nullptr; + auto rootIteratorEntity = NClass::GetEntityOf(env, objRootIterator); + if (rootIteratorEntity == nullptr) { + HILOG_INFO("Cannot get the entity of RootIteratorEntity"); + return ERR_NULL_POINTER; } - auto result = std::make_shared>(); - string uriString(uri.get()); - auto cbExec = [uriString, result, fileAccessHelper]() -> NError { - OHOS::Uri uri(uriString); - *result = fileAccessHelper->ListFile(uri); - return NError(ERRNO_NOERR); - }; - auto cbComplete = [result](napi_env env, NError err) -> NVal { - if (err) { - return { env, err.GetNapiErr(env) }; - } - napi_value jsArray = WrapArrayFileInfoToJS(env, *result); - return {env, jsArray}; - }; - - const std::string procedureName = "listFile"; - NVal thisVar(env, funcArg.GetThisVar()); - if (funcArg.GetArgc() == NARG_CNT::ONE) { - return NAsyncWorkPromise(env, thisVar).Schedule(procedureName, cbExec, cbComplete).val_; - } + std::lock_guard lock(rootIteratorEntity->entityOperateMutex); + rootIteratorEntity->fileAccessHelper = helper; + rootIteratorEntity->devVec = std::move(rootInfoVec); + rootIteratorEntity->pos = 0; + nVal = { env, objRootIterator }; - NVal cb(env, funcArg[NARG_POS::SECOND]); - if (!cb.TypeIs(napi_function)) { - NError(EINVAL).ThrowErr(env, "not function type"); - return nullptr; - } - return NAsyncWorkCallback(env, thisVar, cb).Schedule(procedureName, cbExec, cbComplete).val_; + return ERR_OK; } napi_value NAPI_GetRoots(napi_env env, napi_callback_info info) { NFuncArg funcArg(env, info); if (!funcArg.InitArgs(NARG_CNT::ZERO, NARG_CNT::ONE)) { - NError(EINVAL).ThrowErr(env, "Number of arguments unmatched"); + NapiError(ERR_PARAM_NUMBER).ThrowErr(env); return nullptr; } FileAccessHelper *fileAccessHelper = GetFileAccessHelper(env, funcArg.GetThisVar()); if (fileAccessHelper == nullptr) { + NapiError(ERR_NULL_POINTER).ThrowErr(env); + return nullptr; + } + + auto result = std::make_shared>(); + if (result == nullptr) { + NapiError(ERR_NULL_POINTER).ThrowErr(env); return nullptr; } - auto result = std::make_shared>(); auto cbExec = [result, fileAccessHelper]() -> NError { - *result = fileAccessHelper->GetRoots(); - return NError(ERRNO_NOERR); + int ret = fileAccessHelper->GetRoots(*result); + return NError(ret); }; - auto cbComplete = [result](napi_env env, NError err) -> NVal { + auto cbComplete = [fileAccessHelper, result](napi_env env, NError err) -> NVal { if (err) { return { env, err.GetNapiErr(env) }; } - napi_value jsArray = WrapArrayDeviceInfoToJS(env, *result); - return {env, jsArray}; + + NVal nVal; + int ret = MakeGetRootsResult(env, fileAccessHelper, *result, nVal); + if (ret != ERR_OK) { + return { env, NError([ret]() -> std::tuple { + return { ret, "Make GetRoots Result fail" }; + }).GetNapiErr(env) }; + } + + return nVal; }; const std::string procedureName = "getRoots"; NVal thisVar(env, funcArg.GetThisVar()); - if (funcArg.GetArgc() == NARG_CNT::ZERO) { return NAsyncWorkPromise(env, thisVar).Schedule(procedureName, cbExec, cbComplete).val_; } NVal cb(env, funcArg[NARG_POS::FIRST]); if (!cb.TypeIs(napi_function)) { - NError(EINVAL).ThrowErr(env, "not function type"); + NapiError(ERR_INVALID_PARAM).ThrowErr(env); return nullptr; } return NAsyncWorkCallback(env, thisVar, cb).Schedule(procedureName, cbExec, cbComplete).val_; } -napi_value NAPI_IsFileExist(napi_env env, napi_callback_info info) +napi_value NAPI_Access(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"); + NapiError(ERR_PARAM_NUMBER).ThrowErr(env); return nullptr; } @@ -689,7 +713,7 @@ napi_value NAPI_IsFileExist(napi_env env, napi_callback_info info) 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"); + NapiError(ERR_INVALID_PARAM).ThrowErr(env); return nullptr; } @@ -703,7 +727,7 @@ napi_value NAPI_IsFileExist(napi_env env, napi_callback_info info) auto cbExec = [uriString, result, fileAccessHelper]() -> NError { OHOS::Uri uri(uriString); bool isExist = false; - int ret = fileAccessHelper->IsFileExist(uri, isExist); + int ret = fileAccessHelper->Access(uri, isExist); *result = isExist; return NError(ret); }; @@ -714,14 +738,14 @@ napi_value NAPI_IsFileExist(napi_env env, napi_callback_info info) return { NVal::CreateBool(env, *result) }; }; - const std::string procedureName = "isFileExist"; + const std::string procedureName = "access"; NVal thisVar(env, funcArg.GetThisVar()); if (funcArg.GetArgc() == NARG_CNT::ONE) { return NAsyncWorkPromise(env, thisVar).Schedule(procedureName, cbExec, cbComplete).val_; } NVal cb(env, funcArg[NARG_POS::SECOND]); if (!cb.TypeIs(napi_function)) { - NError(EINVAL).ThrowErr(env, "not function type"); + NapiError(ERR_INVALID_PARAM).ThrowErr(env); return nullptr; } return NAsyncWorkCallback(env, thisVar, cb).Schedule(procedureName, cbExec, cbComplete).val_; @@ -730,7 +754,7 @@ napi_value NAPI_IsFileExist(napi_env env, napi_callback_info info) napi_value NAPI_On(napi_env env, napi_callback_info info) { NFuncArg funcArg(env, info); - if (!funcArg.InitArgs(NARG_CNT::ONE, NARG_CNT::ONE)) { + if (!funcArg.InitArgs(NARG_CNT::ONE)) { NError(EINVAL).ThrowErr(env, "Number of arguments unmatched"); return nullptr; } @@ -753,8 +777,9 @@ napi_value NAPI_On(napi_env env, napi_callback_info info) return nullptr; } - if (fileAccessHelper->On(callback) != ERR_OK) { - NError(EINVAL).ThrowErr(env, "FileAccessHelper::On fail."); + auto retCode = fileAccessHelper->On(callback); + if (retCode != ERR_OK) { + NError(retCode).ThrowErr(env, "FileAccessHelper::On fail."); return nullptr; } return NVal::CreateUndefined(env).val_; @@ -763,7 +788,7 @@ napi_value NAPI_On(napi_env env, napi_callback_info info) napi_value NAPI_Off(napi_env env, napi_callback_info info) { NFuncArg funcArg(env, info); - if (!funcArg.InitArgs(NARG_CNT::ZERO, NARG_CNT::ONE)) { + if (!funcArg.InitArgs(NARG_CNT::ZERO)) { NError(EINVAL).ThrowErr(env, "Number of arguments unmatched"); return nullptr; } @@ -774,34 +799,10 @@ napi_value NAPI_Off(napi_env env, napi_callback_info info) return nullptr; } - auto result = std::make_shared(); - auto cbExec = [result, fileAccessHelper]() -> NError { - *result = fileAccessHelper->Off(); - if (*result != ERR_OK) { - return NError([result]() -> std::tuple { - return { *result, "FileAccessHelper::Off fail." }; - }); - } - return NError(ERRNO_NOERR); - }; - auto cbComplete = [result](napi_env env, NError err) -> NVal { - if (err) { - return { env, err.GetNapiErr(env) }; - } - return NVal::CreateInt32(env, (int32_t)(*result)); - }; - - std::string procedureName = "Off"; - if (funcArg.GetArgc() == NARG_CNT::ZERO) { - return NAsyncWorkPromise(env, NVal(env, funcArg.GetThisVar())).Schedule(procedureName, cbExec, cbComplete).val_; - } else { - NVal cb(env, funcArg[NARG_POS::FIRST]); - if (!cb.TypeIs(napi_function)) { - NError(EINVAL).ThrowErr(env, "Argument must be function"); - return nullptr; - } - return NAsyncWorkCallback(env, NVal(env, funcArg.GetThisVar()), cb) - .Schedule(procedureName, cbExec, cbComplete).val_; + auto retCode = fileAccessHelper->Off(); + if (retCode != ERR_OK) { + NError(retCode).ThrowErr(env, "FileAccessHelper::Off fail."); + return nullptr; } return NVal::CreateUndefined(env).val_; } 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 b0ec4e817304f096f8bc30f4a32babee59ccc152..8c4f0fb688d0611c470c3e9448e191aa8b205568 100644 --- a/interfaces/kits/napi/file_access_module/napi_fileaccess_helper.h +++ b/interfaces/kits/napi/file_access_module/napi_fileaccess_helper.h @@ -30,11 +30,10 @@ namespace FileAccessFwk { napi_value NAPI_Delete(napi_env env, napi_callback_info info); napi_value NAPI_Move(napi_env env, napi_callback_info info); 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); + napi_value NAPI_Access(napi_env env, napi_callback_info info); napi_value NAPI_On(napi_env env, napi_callback_info info); napi_value NAPI_Off(napi_env env, napi_callback_info info); -} } // namespace FileAccessFwk +} // namespace OHOS #endif // NAPI_FILEACCESS_HELPER_H \ No newline at end of file diff --git a/interfaces/kits/napi/file_access_module/napi_notify_callback.cpp b/interfaces/kits/napi/file_access_module/napi_notify_callback.cpp index 9e79d0d8e7910ece3c9e26bf17e0d7af22136b69..9c59a2de2ccdb844327f784cb4d1e31151c9430c 100644 --- a/interfaces/kits/napi/file_access_module/napi_notify_callback.cpp +++ b/interfaces/kits/napi/file_access_module/napi_notify_callback.cpp @@ -59,9 +59,9 @@ int NapiNotifyCallback::OnNotify(const NotifyMessage& message) CallbackParam *param = reinterpret_cast(work->data); NVal napiNotifyMessage = NVal::CreateObject(param->callback_->env_); napiNotifyMessage.AddProp("deviceType", - NVal::CreateInt32(param->callback_->env_, (int32_t)param->message_.deviceType).val_); + NVal::CreateInt32(param->callback_->env_, param->message_.deviceType).val_); napiNotifyMessage.AddProp("notifyType", - NVal::CreateInt32(param->callback_->env_, (int32_t)param->message_.notifyType).val_); + NVal::CreateInt32(param->callback_->env_, param->message_.notifyType).val_); napiNotifyMessage.AddProp("srcUri", NVal::CreateUTF8String(param->callback_->env_, param->message_.srcUri).val_); napiNotifyMessage.AddProp("dstUri", @@ -81,14 +81,10 @@ int NapiNotifyCallback::OnNotify(const NotifyMessage& message) delete work; }); if (ret != 0) { - if (work->data != nullptr) { - delete (CallbackParam *)(work->data); - work->data = nullptr; - } - if (work != nullptr) { - delete work; - work = nullptr; - } + delete (CallbackParam *)(work->data); + work->data = nullptr; + delete work; + work = nullptr; return ERR_NOTIFY_FAIL; } return ERR_OK; diff --git a/interfaces/kits/napi/file_access_module/napi_notify_callback.h b/interfaces/kits/napi/file_access_module/napi_notify_callback.h index 5dec5b4f3dbac336ae9b782c84c11bb26c1a3337..2f89b00623c39153eb63eed7bf4740f9329543f8 100644 --- a/interfaces/kits/napi/file_access_module/napi_notify_callback.h +++ b/interfaces/kits/napi/file_access_module/napi_notify_callback.h @@ -44,6 +44,6 @@ private: napi_env env_; uv_loop_s *loop_ = nullptr; }; -} // FileAccessFwk -} // OHOS +} // namespace FileAccessFwk +} // namespace OHOS #endif // NAPI_NOTIFY_CALLBACK_H \ No newline at end of file diff --git a/interfaces/kits/napi/file_access_module/napi_utils.cpp b/interfaces/kits/napi/file_access_module/napi_utils.cpp new file mode 100644 index 0000000000000000000000000000000000000000..ecbe70a55c22dccb462633f27c49c70e76b1fe86 --- /dev/null +++ b/interfaces/kits/napi/file_access_module/napi_utils.cpp @@ -0,0 +1,128 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "napi_utils.h" + +#include +#include +#include + +#include "file_access_extension_info.h" +#include "file_access_framework_errno.h" +#include "hilog_wrapper.h" + +namespace OHOS { +namespace FileAccessFwk { +int IsDirectory(const int64_t mode) +{ + if ((mode & DOCUMENT_FLAG_REPRESENTS_DIR) != DOCUMENT_FLAG_REPRESENTS_DIR) { + HILOG_ERROR("current FileInfo is not dir"); + return ERR_INVALID_PARAM; + } + + if ((mode & DOCUMENT_FLAG_REPRESENTS_FILE) == DOCUMENT_FLAG_REPRESENTS_FILE) { + HILOG_ERROR("file mode(%{public}" PRId64 ") is incorrect", mode); + return ERR_INVALID_PARAM; + } + + return ERR_OK; +} + +int GetFileFilterParam(const NVal &argv, FileFilter &filter) +{ + bool ret = false; + filter.SetHasFilter(false); + if (argv.HasProp("suffix")) { + std::vector suffixs; + std::tie(ret, suffixs, std::ignore) = argv.GetProp("suffix").ToStringArray(); + if (!ret) { + HILOG_ERROR("FileFilter get suffix param fail."); + return ERR_INVALID_PARAM; + } + + filter.SetSuffix(suffixs); + filter.SetHasFilter(true); + } else { + return ERR_INVALID_PARAM; + } + + if (argv.HasProp("displayName")) { + std::vector displayNames; + std::tie(ret, displayNames, std::ignore) = argv.GetProp("displayName").ToStringArray(); + if (!ret) { + HILOG_ERROR("FileFilter get displayName param fail."); + return ERR_INVALID_PARAM; + } + + filter.SetDisplayName(displayNames); + filter.SetHasFilter(true); + } + + if (argv.HasProp("mimeType")) { + std::vector mimeTypes; + std::tie(ret, mimeTypes, std::ignore) = argv.GetProp("mimeType").ToStringArray(); + if (!ret) { + HILOG_ERROR("FileFilter get mimeType param fail."); + return ERR_INVALID_PARAM; + } + + filter.SetMimeType(mimeTypes); + filter.SetHasFilter(true); + } + + if (argv.HasProp("fileSizeOver")) { + int64_t fileSizeOver; + std::tie(ret, fileSizeOver) = argv.GetProp("fileSizeOver").ToInt64(); + if (!ret) { + HILOG_ERROR("FileFilter get fileSizeOver param fail."); + return ERR_INVALID_PARAM; + } + + filter.SetFileSizeOver(fileSizeOver); + filter.SetHasFilter(true); + } + + if (argv.HasProp("lastModifiedAfter")) { + double lastModifiedAfter; + std::tie(ret, lastModifiedAfter) = argv.GetProp("lastModifiedAfter").ToDouble(); + if (!ret) { + HILOG_ERROR("FileFilter get lastModifiedAfter param fail."); + return ERR_INVALID_PARAM; + } + + filter.SetLastModifiedAfter(lastModifiedAfter); + filter.SetHasFilter(true); + } + + if (argv.HasProp("excludeMedia")) { + bool excludeMedia; + std::tie(ret, excludeMedia) = argv.GetProp("excludeMedia").ToBool(); + if (!ret) { + HILOG_ERROR("FileFilter get excludeMedia param fail."); + return ERR_INVALID_PARAM; + } + + filter.SetExcludeMedia(excludeMedia); + filter.SetHasFilter(true); + } + + if (!filter.GetHasFilter()) { + HILOG_ERROR("FileFilter must have one property."); + return ERR_INVALID_PARAM; + } + return ERR_OK; +} +} // namespace FileAccessFwk +} // namespace OHOS \ No newline at end of file diff --git a/interfaces/kits/napi/file_access_module/napi_utils.h b/interfaces/kits/napi/file_access_module/napi_utils.h new file mode 100644 index 0000000000000000000000000000000000000000..6f127d96f33de408feabbc3ff27c90ab778032bc --- /dev/null +++ b/interfaces/kits/napi/file_access_module/napi_utils.h @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef NAPI_UTILS_H +#define NAPI_UTILS_H + +#include + +#include "filemgmt_libn.h" +#include "file_filter.h" + +namespace OHOS { +namespace FileAccessFwk { +using namespace DistributedFS; +using namespace FileManagement::LibN; + +int IsDirectory(const int64_t mode); +int GetFileFilterParam(const NVal &argv, FileFilter &filter); +} // namespace FileAccessFwk +} // namespace OHOS +#endif // NAPI_UTILS_H \ No newline at end of file diff --git a/interfaces/kits/napi/file_access_module/native_fileaccess_module.cpp b/interfaces/kits/napi/file_access_module/native_fileaccess_module.cpp index 19127d0ae1f51a51764174a3c2c8e7903fb6ee40..8ccb330d44ab14db500c4547213f9a57e7c36fb1 100644 --- a/interfaces/kits/napi/file_access_module/native_fileaccess_module.cpp +++ b/interfaces/kits/napi/file_access_module/native_fileaccess_module.cpp @@ -13,14 +13,22 @@ * limitations under the License. */ +#include +#include + +#include "filemgmt_libn.h" #include "file_extension_info_napi.h" #include "hilog_wrapper.h" #include "napi_fileaccess_helper.h" -#include "napi/native_api.h" -#include "napi/native_node_api.h" +#include "napi_file_info_exporter.h" +#include "napi_file_iterator_exporter.h" +#include "napi_root_info_exporter.h" +#include "napi_root_iterator_exporter.h" namespace OHOS { namespace FileAccessFwk { +using namespace FileManagement::LibN; + EXTERN_C_START /* * The module initialization. @@ -28,11 +36,27 @@ EXTERN_C_START static napi_value Init(napi_env env, napi_value exports) { FileAccessHelperInit(env, exports); - InitFlag(env, exports); + InitDeviceFlag(env, exports); + InitDocumentFlag(env, exports); InitNotifyType(env, exports); InitDeviceType(env, exports); InitFileInfo(env, exports); - InitDeviceInfo(env, exports); + InitRootInfo(env, exports); + + std::vector> products; + products.emplace_back(std::make_unique(env, exports)); + products.emplace_back(std::make_unique(env, exports)); + products.emplace_back(std::make_unique(env, exports)); + products.emplace_back(std::make_unique(env, exports)); + for (auto &&product : products) { + if (!product->Export()) { + HILOG_ERROR("INNER BUG. Failed to export class %{public}s", product->GetClassName().c_str()); + return nullptr; + } else { + HILOG_ERROR("Class %{public}s has been exported", product->GetClassName().c_str()); + } + } + return exports; } EXTERN_C_END diff --git a/interfaces/kits/napi/file_access_module/root_info/napi_root_info_exporter.cpp b/interfaces/kits/napi/file_access_module/root_info/napi_root_info_exporter.cpp new file mode 100644 index 0000000000000000000000000000000000000000..6cb3b456ea9a2a58955859b570a77d0f3d8186cf --- /dev/null +++ b/interfaces/kits/napi/file_access_module/root_info/napi_root_info_exporter.cpp @@ -0,0 +1,283 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef NAPI_FILEACCESS_HELPER_H +#define NAPI_FILEACCESS_HELPER_H + +#include "napi_root_info_exporter.h" + +#include "file_access_framework_errno.h" +#include "file_filter.h" +#include "file_iterator_entity.h" +#include "hilog_wrapper.h" +#include "napi_file_iterator_exporter.h" +#include "napi_utils.h" +#include "root_info_entity.h" + +namespace OHOS { +namespace FileAccessFwk { +bool NapiRootInfoExporter::Export() +{ + std::vector props = { + NVal::DeclareNapiFunction("listFile", ListFile), + NVal::DeclareNapiFunction("scanFile", ScanFile), + NVal::DeclareNapiGetter("deviceType", GetDeviceType), + NVal::DeclareNapiGetter("uri", GetUri), + NVal::DeclareNapiGetter("displayName", GetDisplayName), + NVal::DeclareNapiGetter("deviceFlags", GetDeviceFlags) + }; + + std::string className = GetClassName(); + bool succ = false; + napi_value classValue = nullptr; + std::tie(succ, classValue) = NClass::DefineClass(exports_.env_, className, + NapiRootInfoExporter::Constructor, std::move(props)); + if (!succ) { + NError(ERR_NULL_POINTER).ThrowErr(exports_.env_, "INNER BUG. Failed to define class NapiRootInfoExporter"); + return false; + } + + succ = NClass::SaveClass(exports_.env_, className, classValue); + if (!succ) { + NError(ERR_NULL_POINTER).ThrowErr(exports_.env_, "INNER BUG. Failed to save class NapiRootInfoExporter"); + return false; + } + + return exports_.AddProp(className, classValue); +} + +napi_value NapiRootInfoExporter::Constructor(napi_env env, napi_callback_info info) +{ + NFuncArg funcArg(env, info); + if (!funcArg.InitArgs(NARG_CNT::ZERO)) { + NError(ERR_PARAM_NUMBER).ThrowErr(env, "Number of arguments unmatched"); + return nullptr; + } + + auto rootInfoEntity = std::make_unique(); + if (rootInfoEntity == nullptr) { + NError(ERR_NULL_POINTER).ThrowErr(env, "Cannot get entity of RootInfoEntity"); + return nullptr; + } + + if (!NClass::SetEntityFor(env, funcArg.GetThisVar(), std::move(rootInfoEntity))) { + NError(ERR_NULL_POINTER).ThrowErr(env, "INNER BUG. Failed to wrap entity for obj RootInfoEntity"); + return nullptr; + } + + return funcArg.GetThisVar(); +} + +napi_value NapiRootInfoExporter::ListFile(napi_env env, napi_callback_info info) +{ + NFuncArg funcArg(env, info); + if (!funcArg.InitArgs(NARG_CNT::ZERO, NARG_CNT::ONE)) { + NError(ERR_PARAM_NUMBER).ThrowErr(env, "Number of arguments unmatched"); + return nullptr; + } + + FileFilter filter({}, {}, {}, 0, 0, false, false); + if (funcArg.GetArgc() == NARG_CNT::ONE) { + auto ret = GetFileFilterParam(NVal(env, funcArg.GetArg(NARG_POS::FIRST)), filter); + if (ret != ERR_OK) { + NError(ret).ThrowErr(env, "ListFile get FileFilter param fail"); + return nullptr; + } + } + + auto rootEntity = NClass::GetEntityOf(env, funcArg.GetThisVar()); + if (rootEntity == nullptr) { + NError(ERR_NULL_POINTER).ThrowErr(env, "Cannot get entity of FileInfoEntity"); + return nullptr; + } + + if (rootEntity->fileAccessHelper == nullptr) { + NError(ERR_NULL_POINTER).ThrowErr(env, "fileAccessHelper is null."); + return nullptr; + } + + napi_value objFileIteratorExporter = NClass::InstantiateClass(env, NapiFileIteratorExporter::className_, {}); + if (objFileIteratorExporter == nullptr) { + NError(ERR_NULL_POINTER).ThrowErr(env, "Cannot instantiate class NapiFileIteratorExporter"); + return nullptr; + } + + auto fileIteratorEntity = NClass::GetEntityOf(env, objFileIteratorExporter); + if (fileIteratorEntity == nullptr) { + NError(ERR_NULL_POINTER).ThrowErr(env, "Cannot get the entity of FileIteratorEntity"); + return nullptr; + } + + FileInfo fileInfo; + fileInfo.uri = rootEntity->rootInfo.uri; + fileInfo.mode = DOCUMENT_FLAG_REPRESENTS_DIR | DOCUMENT_FLAG_SUPPORTS_READ | DOCUMENT_FLAG_SUPPORTS_WRITE; + { + std::lock_guard lock(fileIteratorEntity->entityOperateMutex); + fileIteratorEntity->fileAccessHelper = rootEntity->fileAccessHelper; + fileIteratorEntity->fileInfo = fileInfo; + fileIteratorEntity->fileInfoVec.clear(); + fileIteratorEntity->offset = 0; + fileIteratorEntity->pos = 0; + fileIteratorEntity->filter = std::move(filter); + fileIteratorEntity->flag = 0; + auto ret = rootEntity->fileAccessHelper->ListFile(fileInfo, fileIteratorEntity->offset, + MAX_COUNT, filter, fileIteratorEntity->fileInfoVec); + if (ret != ERR_OK) { + NError(ret).ThrowErr(env, "ListFile get result fail."); + return nullptr; + } + } + + return NVal(env, objFileIteratorExporter).val_; +} + +napi_value NapiRootInfoExporter::ScanFile(napi_env env, napi_callback_info info) +{ + NFuncArg funcArg(env, info); + if (!funcArg.InitArgs(NARG_CNT::ZERO, NARG_CNT::ONE)) { + NError(ERR_PARAM_NUMBER).ThrowErr(env, "Number of arguments unmatched"); + return nullptr; + } + + FileFilter filter({}, {}, {}, 0, 0, false, false); + if (funcArg.GetArgc() == NARG_CNT::ONE) { + auto ret = GetFileFilterParam(NVal(env, funcArg.GetArg(NARG_POS::FIRST)), filter); + if (ret != ERR_OK) { + NError(ret).ThrowErr(env, "ScanFile get FileFilter param fail"); + return nullptr; + } + } + + auto rootEntity = NClass::GetEntityOf(env, funcArg.GetThisVar()); + if (rootEntity == nullptr) { + NError(ERR_NULL_POINTER).ThrowErr(env, "Cannot get entity of FileInfoEntity"); + return nullptr; + } + + if (rootEntity->fileAccessHelper == nullptr) { + NError(ERR_NULL_POINTER).ThrowErr(env, "fileAccessHelper is null."); + return nullptr; + } + + napi_value objFileIteratorExporter = NClass::InstantiateClass(env, NapiFileIteratorExporter::className_, {}); + if (objFileIteratorExporter == nullptr) { + NError(ERR_NULL_POINTER).ThrowErr(env, "Cannot instantiate class NapiFileIteratorExporter"); + return nullptr; + } + + auto fileIteratorEntity = NClass::GetEntityOf(env, objFileIteratorExporter); + if (fileIteratorEntity == nullptr) { + NError(ERR_NULL_POINTER).ThrowErr(env, "Cannot get the entity of FileIteratorEntity"); + return nullptr; + } + + FileInfo fileInfo; + fileInfo.uri = rootEntity->rootInfo.uri; + fileInfo.mode = DOCUMENT_FLAG_REPRESENTS_DIR | DOCUMENT_FLAG_SUPPORTS_READ | DOCUMENT_FLAG_SUPPORTS_WRITE; + { + std::lock_guard lock(fileIteratorEntity->entityOperateMutex); + fileIteratorEntity->fileAccessHelper = rootEntity->fileAccessHelper; + fileIteratorEntity->fileInfo = fileInfo; + fileIteratorEntity->fileInfoVec.clear(); + fileIteratorEntity->offset = 0; + fileIteratorEntity->pos = 0; + fileIteratorEntity->filter = std::move(filter); + fileIteratorEntity->flag = 1; + auto ret = rootEntity->fileAccessHelper->ScanFile(fileInfo, fileIteratorEntity->offset, + MAX_COUNT, filter, fileIteratorEntity->fileInfoVec); + if (ret != ERR_OK) { + NError(ret).ThrowErr(env, "ScanFile get result fail."); + return nullptr; + } + } + + return NVal(env, objFileIteratorExporter).val_; +} + +napi_value NapiRootInfoExporter::GetDeviceType(napi_env env, napi_callback_info info) +{ + NFuncArg funcArg(env, info); + if (!funcArg.InitArgs(NARG_CNT::ZERO)) { + NError(ERR_PARAM_NUMBER).ThrowErr(env, "Number of arguments unmatched"); + return nullptr; + } + + auto rootInfoEntity = NClass::GetEntityOf(env, funcArg.GetThisVar()); + if (rootInfoEntity == nullptr) { + NError(ERR_NULL_POINTER).ThrowErr(env, "Cannot get entity of RootInfoEntity"); + return nullptr; + } + + return NVal::CreateInt64(env, (int64_t)(rootInfoEntity->rootInfo.deviceType)).val_; +} + +napi_value NapiRootInfoExporter::GetUri(napi_env env, napi_callback_info info) +{ + NFuncArg funcArg(env, info); + if (!funcArg.InitArgs(NARG_CNT::ZERO)) { + NError(ERR_PARAM_NUMBER).ThrowErr(env, "Number of arguments unmatched"); + return nullptr; + } + + auto rootInfoEntity = NClass::GetEntityOf(env, funcArg.GetThisVar()); + if (rootInfoEntity == nullptr) { + NError(ERR_NULL_POINTER).ThrowErr(env, "Cannot get entity of RootInfoEntity"); + return nullptr; + } + + return NVal::CreateUTF8String(env, rootInfoEntity->rootInfo.uri).val_; +} + +napi_value NapiRootInfoExporter::GetDisplayName(napi_env env, napi_callback_info info) +{ + NFuncArg funcArg(env, info); + if (!funcArg.InitArgs(NARG_CNT::ZERO)) { + NError(ERR_PARAM_NUMBER).ThrowErr(env, "Number of arguments unmatched"); + return nullptr; + } + + auto rootInfoEntity = NClass::GetEntityOf(env, funcArg.GetThisVar()); + if (rootInfoEntity == nullptr) { + NError(ERR_NULL_POINTER).ThrowErr(env, "Cannot get entity of RootInfoEntity"); + return nullptr; + } + + return NVal::CreateUTF8String(env, rootInfoEntity->rootInfo.displayName).val_; +} + +napi_value NapiRootInfoExporter::GetDeviceFlags(napi_env env, napi_callback_info info) +{ + NFuncArg funcArg(env, info); + if (!funcArg.InitArgs(NARG_CNT::ZERO)) { + NError(ERR_PARAM_NUMBER).ThrowErr(env, "Number of arguments unmatched"); + return nullptr; + } + + auto rootInfoEntity = NClass::GetEntityOf(env, funcArg.GetThisVar()); + if (rootInfoEntity == nullptr) { + NError(ERR_NULL_POINTER).ThrowErr(env, "Cannot get entity of RootInfoEntity"); + return nullptr; + } + + return NVal::CreateInt64(env, rootInfoEntity->rootInfo.deviceFlags).val_; +} + +std::string NapiRootInfoExporter::GetClassName() +{ + return NapiRootInfoExporter::className_; +} +} // namespace FileAccessFwk +} // namespace OHOS +#endif // NAPI_FILEACCESS_HELPER_H \ No newline at end of file diff --git a/interfaces/kits/napi/file_access_module/root_info/napi_root_info_exporter.h b/interfaces/kits/napi/file_access_module/root_info/napi_root_info_exporter.h new file mode 100644 index 0000000000000000000000000000000000000000..3892fd2639d53343582d3d33ab9d299343176c95 --- /dev/null +++ b/interfaces/kits/napi/file_access_module/root_info/napi_root_info_exporter.h @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef NAPI_ROOT_INFO_EXPORTER_H +#define NAPI_ROOT_INFO_EXPORTER_H + +#include + +#include "file_access_extension_info.h" +#include "file_access_helper.h" +#include "filemgmt_libn.h" + +namespace OHOS { +namespace FileAccessFwk { +using namespace FileManagement::LibN; + +class NapiRootInfoExporter final : public NExporter { +public: + inline static const std::string className_ = "NapiRootInfoExporter"; + + NapiRootInfoExporter(napi_env env, napi_value exports) : NExporter(env, exports) {}; + ~NapiRootInfoExporter() = default; + + static napi_value Constructor(napi_env env, napi_callback_info info); + static napi_value ListFile(napi_env env, napi_callback_info info); + static napi_value ScanFile(napi_env env, napi_callback_info info); + static napi_value GetDeviceType(napi_env env, napi_callback_info info); + static napi_value GetUri(napi_env env, napi_callback_info info); + static napi_value GetDisplayName(napi_env env, napi_callback_info info); + static napi_value GetDeviceFlags(napi_env env, napi_callback_info info); + + bool Export() override; + std::string GetClassName() override; +}; +} // namespace FileAccessFwk +} // namespace OHOS +#endif // NAPI_ROOT_INFO_EXPORTER_H \ No newline at end of file diff --git a/interfaces/kits/napi/file_access_module/root_info/napi_root_iterator_exporter.cpp b/interfaces/kits/napi/file_access_module/root_info/napi_root_iterator_exporter.cpp new file mode 100644 index 0000000000000000000000000000000000000000..0961321b52274278a287c15244e9737781429123 --- /dev/null +++ b/interfaces/kits/napi/file_access_module/root_info/napi_root_iterator_exporter.cpp @@ -0,0 +1,127 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "napi_root_iterator_exporter.h" + +#include "hilog_wrapper.h" +#include "napi_root_info_exporter.h" +#include "root_info_entity.h" +#include "root_iterator_entity.h" + +namespace OHOS { +namespace FileAccessFwk { +bool NapiRootIteratorExporter::Export() +{ + std::vector props = { + NVal::DeclareNapiFunction("next", Next), + }; + + std::string className = GetClassName(); + bool succ = false; + napi_value classValue = nullptr; + std::tie(succ, classValue) = NClass::DefineClass(exports_.env_, className, + NapiRootIteratorExporter::Constructor, std::move(props)); + if (!succ) { + NError(ERR_NULL_POINTER).ThrowErr(exports_.env_, + "INNER BUG. Failed to define class NapiRootIteratorExporter"); + return false; + } + + succ = NClass::SaveClass(exports_.env_, className, classValue); + if (!succ) { + NError(ERR_NULL_POINTER).ThrowErr(exports_.env_, "INNER BUG. Failed to save class NapiRootIteratorExporter"); + return false; + } + + return exports_.AddProp(className, classValue); +} + +napi_value NapiRootIteratorExporter::Constructor(napi_env env, napi_callback_info info) +{ + NFuncArg funcArg(env, info); + if (!funcArg.InitArgs(NARG_CNT::ZERO)) { + NError(ERR_PARAM_NUMBER).ThrowErr(env, "Number of arguments unmatched"); + return nullptr; + } + + auto rootIteratorEntity = std::make_unique(); + if (rootIteratorEntity == nullptr) { + NError(ERR_NULL_POINTER).ThrowErr(env, "Cannot get entity of rootIteratorEntity"); + return nullptr; + } + + if (!NClass::SetEntityFor(env, funcArg.GetThisVar(), std::move(rootIteratorEntity))) { + NError(ERR_NULL_POINTER).ThrowErr(env, "INNER BUG. Failed to wrap entity for obj FileIteratorEntity"); + return nullptr; + } + + return funcArg.GetThisVar(); +} + +napi_value NapiRootIteratorExporter::Next(napi_env env, napi_callback_info info) +{ + NFuncArg funcArg(env, info); + if (!funcArg.InitArgs(NARG_CNT::ZERO)) { + NError(ERR_PARAM_NUMBER).ThrowErr(env, "Number of arguments unmatched"); + return nullptr; + } + + napi_value thisVar = funcArg.GetThisVar(); + auto rootIterator = NClass::GetEntityOf(env, thisVar); + if (rootIterator == nullptr) { + NError(ERR_NULL_POINTER).ThrowErr(env, "Cannot get entity of RootIteratorEntity"); + return nullptr; + } + + napi_value objRootInfoExporter = NClass::InstantiateClass(env, NapiRootInfoExporter::className_, {}); + if (objRootInfoExporter == nullptr) { + NError(ERR_NULL_POINTER).ThrowErr(env, "Cannot instantiate class NapiRootInfoExporter"); + return nullptr; + } + + auto rootInfoEntity = NClass::GetEntityOf(env, objRootInfoExporter); + if (rootInfoEntity == nullptr) { + NError(ERR_NULL_POINTER).ThrowErr(env, "Cannot get the entity of RootInfoEntity"); + return nullptr; + } + + auto retNVal = NVal::CreateObject(env); + bool done = true; + { + std::lock_guard lock(rootIterator->entityOperateMutex); + auto len = (int64_t)rootIterator->devVec.size(); + rootInfoEntity->fileAccessHelper = rootIterator->fileAccessHelper; + if (rootIterator->pos < len) { + rootInfoEntity->rootInfo = rootIterator->devVec[rootIterator->pos]; + done = false; + rootIterator->pos++; + } else { + rootInfoEntity = nullptr; + objRootInfoExporter = NVal::CreateUndefined(env).val_; + done = true; + } + retNVal.AddProp("value", objRootInfoExporter); + retNVal.AddProp("done", NVal::CreateBool(env, done).val_); + } + + return retNVal.val_; +} + +std::string NapiRootIteratorExporter::GetClassName() +{ + return NapiRootIteratorExporter::className_; +} +} // namespace FileAccessFwk +} // namespace OHOS \ No newline at end of file diff --git a/interfaces/kits/napi/file_access_module/root_info/napi_root_iterator_exporter.h b/interfaces/kits/napi/file_access_module/root_info/napi_root_iterator_exporter.h new file mode 100644 index 0000000000000000000000000000000000000000..9902d7d103ee56d1c564139d935f52cf4d73b524 --- /dev/null +++ b/interfaces/kits/napi/file_access_module/root_info/napi_root_iterator_exporter.h @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef NAPI_ROOT_ITERATOR_H +#define NAPI_ROOT_ITERATOR_H + +#include + +#include "filemgmt_libn.h" + +namespace OHOS { +namespace FileAccessFwk { +using namespace FileManagement::LibN; +class NapiRootIteratorExporter final : public NExporter { +public: + inline static const std::string className_ = "NapiRootIteratorExporter"; + + NapiRootIteratorExporter(napi_env env, napi_value exports) : NExporter(env, exports) {}; + ~NapiRootIteratorExporter() = default; + + static napi_value Constructor(napi_env env, napi_callback_info info); + static napi_value Next(napi_env env, napi_callback_info info); + + bool Export() override; + std::string GetClassName() override; +}; +} // namespace FileAccessFwk +} // namespace OHOS +#endif // NAPI_ROOT_ITERATOR_H \ No newline at end of file diff --git a/interfaces/kits/napi/file_access_module/root_info/root_info_entity.h b/interfaces/kits/napi/file_access_module/root_info/root_info_entity.h new file mode 100644 index 0000000000000000000000000000000000000000..136c8bec43fed81904736aab2d9efec0925e2d2c --- /dev/null +++ b/interfaces/kits/napi/file_access_module/root_info/root_info_entity.h @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef ROOT_INFO_ENTITY_H +#define ROOT_INFO_ENTITY_H + +#include "file_access_extension_info.h" +#include "file_access_helper.h" + +namespace OHOS { +namespace FileAccessFwk { +struct RootInfoEntity { + FileAccessHelper *fileAccessHelper { nullptr }; + RootInfo rootInfo; +}; +} // namespace FileAccessFwk +} // namespace OHOS +#endif // ROOT_INFO_ENTITY_H \ No newline at end of file diff --git a/interfaces/kits/napi/file_access_module/root_info/root_iterator_entity.h b/interfaces/kits/napi/file_access_module/root_info/root_iterator_entity.h new file mode 100644 index 0000000000000000000000000000000000000000..49959bd01b76e108f7fa78c95f4d9f8c1c54bc7e --- /dev/null +++ b/interfaces/kits/napi/file_access_module/root_info/root_iterator_entity.h @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef ROOT_ITERATOR_ENTITY_H +#define ROOT_ITERATOR_ENTITY_H + +#include +#include + +#include "file_access_extension_info.h" +#include "file_access_helper.h" + +namespace OHOS { +namespace FileAccessFwk { +struct RootIteratorEntity { + FileAccessHelper *fileAccessHelper { nullptr }; + std::vector devVec; + std::mutex entityOperateMutex; + int64_t pos { 0 }; +}; +} // namespace FileAccessFwk +} // namespace OHOS +#endif // ROOT_ITERATOR_ENTITY_H \ No newline at end of file diff --git a/interfaces/kits/napi/file_extension_info_module/BUILD.gn b/interfaces/kits/napi/file_extension_info_module/BUILD.gn index c72090e2c0487dd48c239de9fe6ba8b720d8501f..caa8cd4380e71769ffbbc12fda6b80fc38d5bdd2 100644 --- a/interfaces/kits/napi/file_extension_info_module/BUILD.gn +++ b/interfaces/kits/napi/file_extension_info_module/BUILD.gn @@ -23,9 +23,10 @@ ohos_shared_library("fileextensioninfo") { include_dirs = [ ".", - "${UFS_BASE_PATH}/interfaces/kits/napi/common", + "//foundation/distributeddatamgr/distributedfile/utils/filemgmt_libn/include", "${FRAMEWORK_PATH}/innerkits/file_access/include", "${FRAMEWORK_PATH}/innerkits/file_access/include/notify", + "${UFS_BASE_PATH}/interfaces/kits/napi/common", "${UFS_BASE_PATH}/utils", ] @@ -34,7 +35,10 @@ ohos_shared_library("fileextensioninfo") { "module_export_napi.cpp", ] - deps = [ "//foundation/arkui/napi:ace_napi" ] + deps = [ + "//foundation/arkui/napi:ace_napi", + "//foundation/distributeddatamgr/distributedfile/utils/filemgmt_libn:filemgmt_libn", + ] external_deps = [ "ability_base:want", diff --git a/interfaces/kits/napi/file_extension_info_module/module_export_napi.cpp b/interfaces/kits/napi/file_extension_info_module/module_export_napi.cpp index 1f34d44379827f7ecea6830e2d1102d73e3bc9b2..aecf94166f3e7a7a63e9da384e3bcbc4d4516b02 100644 --- a/interfaces/kits/napi/file_extension_info_module/module_export_napi.cpp +++ b/interfaces/kits/napi/file_extension_info_module/module_export_napi.cpp @@ -23,11 +23,12 @@ namespace OHOS { namespace FileAccessFwk { napi_value FileExtensionInfoExport(napi_env env, napi_value exports) { - InitFlag(env, exports); + InitDeviceFlag(env, exports); + InitDocumentFlag(env, exports); InitNotifyType(env, exports); InitDeviceType(env, exports); InitFileInfo(env, exports); - InitDeviceInfo(env, exports); + InitRootInfo(env, exports); return exports; } 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 1f02bcea4526f5c12d33b27ef2124d24e8faf1bd..ad06af17812021855b531ff1851e644f28072ef4 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 @@ -21,15 +21,18 @@ import fileExtensionInfo from "@ohos.fileExtensionInfo" import hilog from '@ohos.hilog' import process from '@ohos.process'; -const FLAG = fileExtensionInfo.FLAG; +const DeviceFlag = fileExtensionInfo.DeviceFlag; +const DocumentFlag = fileExtensionInfo.DocumentFlag; const NotifyType = fileExtensionInfo.NotifyType; -const DEVICE_TYPE = fileExtensionInfo.DeviceType; +const DeviceType = fileExtensionInfo.DeviceType; const BUNDLE_NAME = 'com.ohos.UserFile.ExternalFileManager'; const DEFAULT_MODE = 0o666; const CREATE_FILE_FLAGS = 0o100; -const FILE_ACCESS = 'fileAccess://'; +const URI_SCHEME = 'datashare://'; const DOMAIN_CODE = 0x0001; const TAG = 'js_server'; +const ERR_OK = 0; +const ERR_ERROR = -1; let callbackFun = null; export default class FileExtAbility extends Extension { @@ -63,8 +66,8 @@ export default class FileExtAbility extends Extension { } checkUri(uri) { - if (uri.indexOf(FILE_ACCESS) == 0) { - uri = uri.replace(FILE_ACCESS, ''); + if (uri.indexOf(URI_SCHEME) == 0) { + uri = uri.replace(URI_SCHEME, ''); return /^\/([^\/]+\/?)+$/.test(uri); } else { return false; @@ -81,6 +84,7 @@ export default class FileExtAbility extends Extension { if (arr[1].indexOf('/') > 0) { path = path.replace(arr[1].split('/')[0], ''); } + path = path.replace('/' + BUNDLE_NAME, ''); if (path.charAt(path.length - 1) == '/') { path = path.substr(0, path.length - 1); } @@ -154,7 +158,7 @@ export default class FileExtAbility extends Extension { } isCrossDeviceLink(sourceFileUri, targetParentUri) { - let roots = this.getRoots(); + let roots = this.getRoots().roots; for (let index = 0; index < roots.length; index++) { let uri = roots[index].uri; if (sourceFileUri.indexOf(uri) == 0 && targetParentUri.indexOf(uri) == 0) { @@ -166,68 +170,88 @@ export default class FileExtAbility extends Extension { openFile(sourceFileUri, flags) { if (!this.checkUri(sourceFileUri)) { - return -1; + return { + fd: ERR_ERROR, + code: ERR_ERROR, + }; } let fd = 0; try { let path = this.getPath(sourceFileUri); fd = fileio.openSync(path, flags, DEFAULT_MODE); + return { + fd: fd, + code: ERR_OK, + }; } catch (e) { hilog.error(DOMAIN_CODE, TAG, 'openFile error ' + e.message); - fd = -1; - } - return fd; - } - - closeFile(fd) { - try { - fileio.closeSync(fd); - return true; - } catch (e) { - hilog.error(DOMAIN_CODE, TAG, 'closeFile error ' + e.message); - return false; + return { + fd: ERR_ERROR, + code: ERR_ERROR, + }; } } createFile(parentUri, displayName) { if (!this.checkUri(parentUri)) { - return ''; + return { + uri: '', + code: ERR_ERROR, + }; } try { let newFileUri = this.genNewFileUri(parentUri, displayName); - if (this.isFileExist(newFileUri)) { - return ''; + if (this.access(newFileUri).isExist) { + return { + uri: '', + code: ERR_ERROR, + }; } let path = this.getPath(newFileUri); fileio.openSync(path, CREATE_FILE_FLAGS, DEFAULT_MODE); - return newFileUri; + return { + uri: newFileUri, + code: ERR_OK, + }; } catch (e) { hilog.error(DOMAIN_CODE, TAG, 'createFile error ' + e.message); - return ''; + return { + uri: '', + code: ERR_ERROR, + }; } } mkdir(parentUri, displayName) { if (!this.checkUri(parentUri)) { - return ''; + return { + uri: '', + code: ERR_ERROR, + }; } try { let newFileUri = this.genNewFileUri(parentUri, displayName); let path = this.getPath(newFileUri); fileio.mkdirSync(path); - return newFileUri; + return { + uri: newFileUri, + code: ERR_OK, + }; } catch (e) { hilog.error(DOMAIN_CODE, TAG, 'mkdir error ' + e.message); - return ''; + return { + uri: '', + code: ERR_ERROR, + }; } } delete(selectFileUri) { if (!this.checkUri(selectFileUri)) { - return -1; + return ERR_ERROR; } let path = this.getPath(selectFileUri); - let code = 0; + let code = ERR_OK; this.recurseDir(path, function (filePath, isDirectory, hasNextFile) { try { if (isDirectory) { @@ -239,7 +263,7 @@ export default class FileExtAbility extends Extension { } } catch (e) { hilog.error(DOMAIN_CODE, TAG, 'delete error ' + e.message); - code = -1; + code = ERR_ERROR; } }); return code; @@ -247,7 +271,10 @@ export default class FileExtAbility extends Extension { move(sourceFileUri, targetParentUri) { if (!this.checkUri(sourceFileUri) || !this.checkUri(targetParentUri)) { - return ''; + return { + uri: '', + code: ERR_ERROR, + }; } let displayName = this.getFileName(sourceFileUri); let newFileUri = this.genNewFileUri(targetParentUri, displayName); @@ -255,26 +282,41 @@ export default class FileExtAbility extends Extension { let newPath = this.getPath(newFileUri); if (oldPath == newPath) { // move to the same directory - return newFileUri; + return { + uri: newFileUri, + code: ERR_OK, + }; } else if (newPath.indexOf(oldPath) == 0) { // move to a subdirectory of the source directory - return ''; + return { + uri: '', + code: ERR_ERROR, + }; } try { // The source file does not exist or the destination is not a directory fileio.accessSync(oldPath); let stat = fileio.statSync(this.getPath(targetParentUri)); if (!stat || !stat.isDirectory()) { - return ''; + return { + uri: '', + code: ERR_ERROR, + }; } // If not across devices, use fileio.renameSync to move if (!this.isCrossDeviceLink(sourceFileUri, targetParentUri)) { fileio.renameSync(oldPath, newPath); - return newFileUri; + return { + uri: newFileUri, + code: ERR_OK, + }; } } catch (e) { hilog.error(DOMAIN_CODE, TAG, 'move error ' + e.message); - return ''; + return { + uri: '', + code: ERR_ERROR, + }; } let hasError = false; /** @@ -307,110 +349,142 @@ export default class FileExtAbility extends Extension { } }); if (hasError) { - return ''; + return { + uri: '', + code: ERR_ERROR, + }; } - return newFileUri; + return { + uri: newFileUri, + code: ERR_OK, + }; } rename(sourceFileUri, displayName) { if (!this.checkUri(sourceFileUri)) { - return ''; + return { + uri: '', + code: ERR_ERROR, + }; } try { let newFileUri = this.renameUri(sourceFileUri, displayName); let oldPath = this.getPath(sourceFileUri); let newPath = this.getPath(newFileUri); fileio.renameSync(oldPath, newPath); - return newFileUri; + return { + uri: newFileUri, + code: ERR_OK, + }; } catch (e) { hilog.error(DOMAIN_CODE, TAG, 'rename error ' + e.message); - return ''; - } - } - - query(sourceFileUri) { - if (!this.checkUri(sourceFileUri)) { - return null; - } - try { - let path = this.getPath(sourceFileUri); - let stat = fileio.statSync(path); return { - uri: sourceFileUri, - fileName: this.getFileName(sourceFileUri), - mode: '' + stat.mode, - size: stat.size, - mtime: stat.mtime, - mimeType: '', + uri: '', + code: ERR_ERROR, }; - } catch (e) { - hilog.error(DOMAIN_CODE, TAG, 'query error ' + e.message); - return null; } } - isFileExist(sourceFileUri) { + access(sourceFileUri) { if (!this.checkUri(sourceFileUri)) { - hilog.error(DOMAIN_CODE, TAG, 'isFileExist checkUri fail'); - return false; + hilog.error(DOMAIN_CODE, TAG, 'access checkUri fail'); + return { + isExist: false, + code: ERR_ERROR, + }; } try { let path = this.getPath(sourceFileUri); fileio.accessSync(path); } catch (e) { - hilog.error(DOMAIN_CODE, TAG, 'isFileExist error ' + e.message); - return false; + hilog.error(DOMAIN_CODE, TAG, 'access error ' + e.message); + if (e.message == 'No such file or directory') { + return { + isExist: false, + code: ERR_OK, + }; + } + return { + isExist: false, + code: ERR_ERROR, + } } - return true; + return { + isExist: true, + code: ERR_OK, + }; } - listFile(sourceFileUri) { + listFile(sourceFileUri, offset, count, filter) { if (!this.checkUri(sourceFileUri)) { - return []; + return { + infos: [], + code: ERR_ERROR, + }; } let infos = []; try { let path = this.getPath(sourceFileUri); let dir = fileio.opendirSync(path); let hasNextFile = true; + let i = 0; while (hasNextFile) { try { let dirent = dir.readSync(); let stat = fileio.statSync(path + '/' + dirent.name); + let mode = DocumentFlag.SUPPORTS_READ | DocumentFlag.SUPPORTS_WRITE; + if (stat.isDirectory()) { + mode |= DocumentFlag.REPRESENTS_DIR; + } else { + mode |= DocumentFlag.REPRESENTS_FILE; + } + + if (offset > i) { + i++; + continue; + } + infos.push({ uri: this.genNewFileUri(sourceFileUri, dirent.name), fileName: dirent.name, - mode: '' + stat.mode, + mode: mode, size: stat.size, mtime: stat.mtime, mimeType: '', }); + + i++; + if (i == (offset + count)) { + hasNextFile = false; + break; + } } catch (e) { hasNextFile = false; } } } catch (e) { hilog.error(DOMAIN_CODE, TAG, 'listFile error ' + e.message); - infos = []; + return { + infos: [], + code: ERR_ERROR, + }; } - return infos; + return { + infos: infos, + code: ERR_OK, + }; } getRoots() { let roots = getVolumeInfoList().concat({ - uri: 'fileAccess:///data/storage/el1/bundle/storage_daemon', - displayName: 'storage_daemon', - deviceId: '', - type: DEVICE_TYPE.SHARED_DISK, - flags: FLAG.SUPPORTS_WRITE | - FLAG.SUPPORTS_DELETE | - FLAG.SUPPORTS_RENAME | - FLAG.SUPPORTS_COPY | - FLAG.SUPPORTS_MOVE | - FLAG.SUPPORTS_REMOVE | - FLAG.DIR_SUPPORTS_CREATE | - FLAG.DIR_PREFERS_LAST_MODIFIED, + uri: 'datashare:///com.ohos.UserFile.ExternalFileManager/data/storage/el1/bundle/storage_daemon', + displayName: 'shared_disk', + deviceType: DeviceType.DEVICE_SHARED_DISK, + deviceFlags: DeviceFlag.SUPPORTS_READ | DeviceFlag.SUPPORTS_WRITE, }); - return roots; + return { + roots: roots, + code: ERR_OK, + }; } }; \ No newline at end of file diff --git a/services/file_extension_hap/entry/src/main/ets/FileExtensionAbility/VolumeManager.ts b/services/file_extension_hap/entry/src/main/ets/FileExtensionAbility/VolumeManager.ts index dbc8b69795bb685ac2a078c68996d2e565625155..bd41e8d958565f770fe842611e44fa13bac6fb53 100644 --- a/services/file_extension_hap/entry/src/main/ets/FileExtensionAbility/VolumeManager.ts +++ b/services/file_extension_hap/entry/src/main/ets/FileExtensionAbility/VolumeManager.ts @@ -18,29 +18,25 @@ import fileExtensionInfo from "@ohos.fileExtensionInfo" if (!globalThis.volumeInfoList) { globalThis.volumeInfoList = []; } -const FLAG = fileExtensionInfo.FLAG; -const DEVICE_TYPE = fileExtensionInfo.DeviceType; +const DeviceFlag = fileExtensionInfo.DeviceFlag; +const DeviceType = fileExtensionInfo.DeviceType; function init() { + globalThis.volumeInfoList = []; volumeManager.getAllVolumes().then((volumes) => { - let flags = FLAG.SUPPORTS_WRITE | - FLAG.SUPPORTS_DELETE | - FLAG.SUPPORTS_RENAME | - FLAG.SUPPORTS_COPY | - FLAG.SUPPORTS_MOVE | - FLAG.SUPPORTS_REMOVE | - FLAG.DIR_SUPPORTS_CREATE | - FLAG.DIR_PREFERS_LAST_MODIFIED; + let flags = DeviceFlag.SUPPORTS_READ | DeviceFlag.SUPPORTS_WRITE; for (let i = 0; i < volumes.length; i++) { let volume = volumes[i]; + if (!volume.path) { + continue; + } let volumeInfo = { 'volumeId': volume.id, 'fsUuid': volume.uuid, 'path': volume.path, 'uri': path2uri('', volume.path), 'displayName': volume.id, - 'deviceId': '', - 'flags': flags, - 'type': DEVICE_TYPE.EXTERNAL_USB + 'deviceFlags': flags, + 'deviceType': DeviceType.DEVICE_EXTERNAL_USB } globalThis.volumeInfoList.push(volumeInfo); } @@ -52,7 +48,7 @@ function addVolumeInfo(volumeInfo) { } function path2uri(id, path) { - return `fileAccess://${id}${path}`; + return `datashare://${id}/com.ohos.UserFile.ExternalFileManager${path}`; } function findVolumeInfo(volumeId) { diff --git a/services/file_extension_hap/entry/src/main/module.json b/services/file_extension_hap/entry/src/main/module.json index 2d0708d1cf005a0a8d741af092d8530a40c39ef7..4173f4c23e3f4c2b7e52c59a0ba63dfa6e7aa0a3 100644 --- a/services/file_extension_hap/entry/src/main/module.json +++ b/services/file_extension_hap/entry/src/main/module.json @@ -18,7 +18,7 @@ "srcEntrance": "./ets/FileExtensionAbility/FileExtensionAbility.ts", "name": "FileExtensionAbility", "type": "fileAccess", - "uri": "fileAccess://fileAccess", + "uri": "fileAccess://com.ohos.UserFile.ExternalFileManager", "visible": true } ], diff --git a/services/src/fileoper/media_file_utils.cpp b/services/src/fileoper/media_file_utils.cpp index 4b7423e47208df20ca0dab512cf928aeea5d845a..78e84898b7451f8d1c44c5dfe64238d694bc5d70 100644 --- a/services/src/fileoper/media_file_utils.cpp +++ b/services/src/fileoper/media_file_utils.cpp @@ -324,10 +324,10 @@ int MediaFileUtils::DoInsert(const string &name, const string &path, const strin ERR_LOG("path not exist"); return E_NOEXIST; } - values.PutString(Media::MEDIA_DATA_DB_RELATIVE_PATH, albumPath); - values.PutString(Media::MEDIA_DATA_DB_NAME, name); - values.PutString(Media::MEDIA_DATA_DB_MIME_TYPE, GetMimeType(name)); - values.PutInt(Media::MEDIA_DATA_DB_MEDIA_TYPE, GetMediaType(name)); + values.Put(Media::MEDIA_DATA_DB_RELATIVE_PATH, albumPath); + values.Put(Media::MEDIA_DATA_DB_NAME, name); + values.Put(Media::MEDIA_DATA_DB_MIME_TYPE, GetMimeType(name)); + values.Put(Media::MEDIA_DATA_DB_MEDIA_TYPE, GetMediaType(name)); Uri createAsset(Media::MEDIALIBRARY_DATA_URI + "/" + Media::MEDIA_FILEOPRN + "/" + Media::MEDIA_FILEOPRN_CREATEASSET); int index = abilityHelper->Insert(createAsset, values); diff --git a/services/test/BUILD.gn b/services/test/BUILD.gn index fe28dfeb9b1aff31fccae61dfce864b0a942e1a4..1ab8e2a5367bb85dfb5f6bfe2120435e0a842abf 100644 --- a/services/test/BUILD.gn +++ b/services/test/BUILD.gn @@ -26,6 +26,7 @@ ohos_unittest("file_manager_proxy_test") { "$FMS_BASE_DIR/src/server", "$FMS_BASE_DIR/src/fileoper", "//third_party/googletest/googlemock/include/gmock", + "//foundation/multimedia/media_library/frameworks/utils/include", "//foundation/multimedia/media_library/interfaces/inner_api/media_library_helper/include", ] @@ -59,6 +60,7 @@ ohos_unittest("oper_factory_test") { "$FMS_BASE_DIR/src/client", "$FMS_BASE_DIR/src/server", "$FMS_BASE_DIR/src/fileoper", + "//foundation/multimedia/media_library/frameworks/utils/include", "//foundation/multimedia/media_library/interfaces/inner_api/media_library_helper/include", ] @@ -92,6 +94,7 @@ ohos_unittest("file_manager_service_test") { "$FMS_BASE_DIR/src/client", "$FMS_BASE_DIR/src/server", "$FMS_BASE_DIR/src/fileoper", + "//foundation/multimedia/media_library/frameworks/utils/include", "//foundation/multimedia/media_library/interfaces/inner_api/media_library_helper/include", ] diff --git a/utils/file_access_framework_errno.h b/utils/file_access_framework_errno.h index 86978f08f3b5457f3812e55c6dbb6e737b4dad06..0fd9402bd39b7eae88305dcd0ca13f283aab8d01 100644 --- a/utils/file_access_framework_errno.h +++ b/utils/file_access_framework_errno.h @@ -23,23 +23,26 @@ namespace FileAccessFwk { enum { MODULE_FILE_ACCESS_FRAMEWORK = 0x01 }; -constexpr ErrCode BASE_OFFSET = ErrCodeOffset(SUBSYS_FILEMANAGEMENT, MODULE_FILE_ACCESS_FRAMEWORK); +constexpr ErrCode BASE_OFFSET = -ErrCodeOffset(SUBSYS_FILEMANAGEMENT, MODULE_FILE_ACCESS_FRAMEWORK); enum { ERR_OK = 0, - ERR_ERROR = -1, ERR_IPC_ERROR = BASE_OFFSET, // ipc error ERR_PERMISSION_DENIED, // no permission - ERR_INVALID_FD, // invalid fd ERR_INVALID_URI, // invalid uri - ERR_URI_CHECK, // check uri head fail + ERR_FILEIO_FAIL, // fileio fail + ERR_PARAM_NUMBER, // Parameter number is abnormal + ERR_INVALID_PARAM, // invalid parameter + ERR_PARSER_FAIL, // parser js result error + ERR_OPERATION_NOT_SUPPORT, // Operation not support + ERR_GET_FILEACCESS_HELPER, // get fileAccessHelper fail ERR_INVALID_NOTIFY, // invalid notify ERR_REMOVE_NOTIFY_FAIL, // remove notify fail ERR_NOTIFY_NOT_EXIST, // the notify is not exist ERR_NOTIFY_FAIL, // notify client fail - ERR_FILEIO_FAIL, // fileio fail - ERR_INVALID_PARAM, // invalid parameter - ERR_PARSER_FAIL, // parser js result error - ERR_OPERATION_NOT_PERMITTED // Operation not permitted + ERR_QUERY_EXTENSIONINFOS_FAIL, // QueryExtensionAbilityInfos fail + ERR_PARCEL_FAIL, // parcel fail + ERR_INVALID_RESULT, // code success result fail + ERR_NULL_POINTER // get value is nullptr }; } // namespace FileAccessFwk } // namespace OHOS diff --git a/utils/napi_error.h b/utils/napi_error.h new file mode 100644 index 0000000000000000000000000000000000000000..9d81b6a37733299b80d2010c3ad95dd5af431fc9 --- /dev/null +++ b/utils/napi_error.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef NAPI_ERROR_H +#define NAPI_ERROR_H + +#include "hilog_wrapper.h" +#include "n_napi.h" +#include "n_error.h" + +namespace OHOS { +namespace FileAccessFwk { +namespace { + constexpr int ERRNO_NOERR = 0; +} +class NapiError : public OHOS::FileManagement::LibN::NError { +public: + NapiError(int ePosix) : errno_(ePosix) {} + ~NapiError() = default; + void ThrowErr(napi_env env) + { + napi_value tmp = nullptr; + std::string errMsg = ""; + napi_get_and_clear_last_exception(env, &tmp); + // Note that ace engine cannot thow errors created by napi_create_error so far + napi_status throwStatus = napi_throw_error(env, std::to_string(errno_).c_str(), errMsg.c_str()); + if (throwStatus != napi_ok) { + HILOG_WARN("Failed to throw an exception, %{public}d, code = %{public}s", + throwStatus, std::to_string(errno_).c_str()); + } + } +private: + int errno_ = ERRNO_NOERR; +}; +} +} +#endif \ No newline at end of file