/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* vim: set ts=8 sts=2 et sw=2 tw=80: */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef DOM_FS_PARENT_DATAMODEL_FILESYSTEMFILEMANAGER_H_ #define DOM_FS_PARENT_DATAMODEL_FILESYSTEMFILEMANAGER_H_ #include "ErrorList.h" #include "mozilla/UniquePtr.h" #include "mozilla/dom/FileSystemTypes.h" #include "mozilla/dom/QMResult.h" #include "nsIFile.h" #include "nsString.h" template class nsCOMPtr; class nsIFileURL; namespace mozilla::dom { namespace quota { struct OriginMetadata; } // namespace quota namespace fs { struct FileId; namespace data { /** * @brief Get the directory for file system items of specified origin. * Use this instead of constructing the path from quota manager's storage path. * * @param aOrigin Specified origin * @return Result, QMResult> Top file system directory */ Result, QMResult> GetFileSystemDirectory( const quota::OriginMetadata& aOriginMetadata); /** * @brief Ensure that the origin-specific directory for file system exists. * * @param aOriginMetadata Specified origin metadata * @return nsresult Error if operation failed */ nsresult EnsureFileSystemDirectory( const quota::OriginMetadata& aOriginMetadata); /** * @brief Get file system's database path for specified origin. * Use this to get the database path instead of constructing it from * quota manager's storage path - without the side effect of potentially * creating it. * * @param aOrigin Specified origin * @return Result, QMResult> Database file object */ Result, QMResult> GetDatabaseFile( const quota::OriginMetadata& aOriginMetadata); /** * @brief Get file system's database url with directory lock parameter for * specified origin. Use this to open a database connection and have the quota * manager guard against its deletion or busy errors due to other connections. * * @param aOrigin Specified origin * @param aDirectoryLockId Directory lock id from the quota manager * @return Result, QMResult> Database file URL object */ Result, QMResult> GetDatabaseFileURL( const quota::OriginMetadata& aOriginMetadata, const int64_t aDirectoryLockId); /** * @brief Creates and removes disk-backed representations of the file systems' * file entries for a specified origin. * * Other components should not depend on how the files are organized on disk * but instead rely on the entry id and have access to the local file using the * GetOrCreateFile result. * * The local paths are not necessarily stable in the long term and if they * absolutely must be cached, there should be a way to repopulate the cache * after an internal reorganization of the file entry represenations on disk, * for some currently unforeseen maintenance reason. * * Example: if GetOrCreateFile used to map entryId 'abc' to path '/c/u/1/123' * and now it maps it to '/d/u/1/12/123', the cache should either update all * paths at once through a migration, or purge them and save a new value * whenever a call to GetOrCreateFile is made. */ class FileSystemFileManager { public: /** * @brief Create a File System File Manager object for a specified origin. * * @param aOrigin * @return Result */ static Result, QMResult> CreateFileSystemFileManager(const quota::OriginMetadata& aOriginMetadata); /** * @brief Create a File System File Manager object which keeps file entries * under a specified directory instead of quota manager's storage path. * This should only be used for testing and preferably removed. * * @param topDirectory * @return Result */ static Result CreateFileSystemFileManager( nsCOMPtr&& topDirectory); /** * @brief Get a file object for a specified entry id. If a file for the entry * does not exist, returns an appropriate error. * * @param aEntryId Specified id of a file system entry * @return Result, QMResult> File or error. */ Result, QMResult> GetFile(const FileId& aFileId) const; /** * @brief Get or create a disk-backed file object for a specified entry id. * * @param aFileId Specified id of a file system entry * @return Result, QMResult> File abstraction or IO error */ Result, QMResult> GetOrCreateFile(const FileId& aFileId); /** * @brief Create a disk-backed file object as a copy. * * @param aDestinationFileId Specified id of file to be created * @param aSourceFileId Specified id of the file from which we make a copy * @return Result, QMResult> File abstraction or IO error */ Result, QMResult> CreateFileFrom( const FileId& aDestinationFileId, const FileId& aSourceFileId); /** * @brief Remove the disk-backed file object for a specified entry id. * Note: The returned value is 0 in release builds. * * @param aFileId Specified id of a file system entry * @return Result Error or file size */ Result RemoveFile(const FileId& aFileId); /** * @brief This method can be used to try to delete a group of files from the * disk. In debug builds, the sum of the usages is provided ad return value, * in release builds the sum is not calculated. * The method attempts to remove all the files requested. */ Result, QMResult> RemoveFiles( const nsTArray& aFileIds, nsTArray& aFailedRemovals); private: explicit FileSystemFileManager(nsCOMPtr&& aTopDirectory); nsCOMPtr mTopDirectory; }; } // namespace data } // namespace fs } // namespace mozilla::dom #endif // DOM_FS_PARENT_DATAMODEL_FILESYSTEMFILEMANAGER_H_