1 /* 2 * Copyright (c) 2022 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef CORE_IO_FILEMANAGER_H 17 #define CORE_IO_FILEMANAGER_H 18 19 #include <cstdint> 20 21 #include <base/containers/string.h> 22 #include <base/containers/string_view.h> 23 #include <base/containers/unordered_map.h> 24 #include <base/containers/vector.h> 25 #include <base/namespace.h> 26 #include <core/io/intf_directory.h> 27 #include <core/io/intf_file.h> 28 #include <core/io/intf_file_manager.h> 29 #include <core/io/intf_file_system.h> 30 #include <core/namespace.h> 31 #include <core/plugin/intf_interface_helper.h> 32 33 CORE_BEGIN_NAMESPACE() 34 class ProxyFilesystem; 35 36 class FileManager final : public IInterfaceHelper<IFileManager> { 37 public: 38 FileManager(); 39 ~FileManager() override = default; 40 41 IDirectory::Entry GetEntry(BASE_NS::string_view uri) override; 42 43 IFile::Ptr OpenFile(BASE_NS::string_view uri) override; 44 IFile::Ptr OpenFile(BASE_NS::string_view uri, IFile::Mode mode) override; 45 IFile::Ptr CreateFile(BASE_NS::string_view uri) override; 46 bool DeleteFile(BASE_NS::string_view uri) override; 47 bool FileExists(BASE_NS::string_view uri) const override; 48 49 IDirectory::Ptr OpenDirectory(BASE_NS::string_view uri) override; 50 IDirectory::Ptr CreateDirectory(BASE_NS::string_view uri) override; 51 bool DeleteDirectory(BASE_NS::string_view uri) override; 52 bool DirectoryExists(BASE_NS::string_view uri) const override; 53 54 bool Rename(BASE_NS::string_view fromUri, BASE_NS::string_view toUri) override; 55 56 bool RegisterFilesystem(BASE_NS::string_view protocol, IFilesystem::Ptr filesystem) override; 57 void UnregisterFilesystem(BASE_NS::string_view protocol) override; 58 59 void RegisterAssetPath(BASE_NS::string_view uri) override; 60 void UnregisterAssetPath(BASE_NS::string_view uri) override; 61 62 BASE_NS::vector<BASE_NS::string> GetAbsolutePaths(BASE_NS::string_view uri) const; 63 bool CheckExistence(BASE_NS::string_view protocol) override; 64 bool RegisterPath(BASE_NS::string_view protocol, BASE_NS::string_view uri, bool prepend) override; 65 void UnregisterPath(BASE_NS::string_view protocol, BASE_NS::string_view uri) override; 66 67 IFilesystem::Ptr CreateROFilesystem(const void* data, uint64_t size) override; 68 69 IFilesystem* GetFilesystem(BASE_NS::string_view protocol) const override; 70 71 private: 72 // Fix "invalid" uris (converts relative file:// -> absolute. does not affect other protocols.) 73 BASE_NS::string FixPath(BASE_NS::string_view pathIn) const; 74 75 // Current working directory for the "file://" protocol, used to resolve the absolute path. 76 BASE_NS::string basePath_; 77 78 BASE_NS::unordered_map<BASE_NS::string, IFilesystem::Ptr> filesystems_; 79 80 BASE_NS::unordered_map<BASE_NS::string, ProxyFilesystem*> proxyFilesystems_; 81 }; 82 CORE_END_NAMESPACE() 83 84 #endif // CORE_IO_FILEMANAGER_H 85