// Copyright 2020 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. module storage.mojom; import "mojo/public/mojom/base/big_string.mojom"; import "mojo/public/mojom/base/file.mojom"; import "mojo/public/mojom/base/file_error.mojom"; import "mojo/public/mojom/base/file_info.mojom"; import "mojo/public/mojom/base/file_path.mojom"; // Determines how |Directory.GetEntries()| operates. enum GetEntriesMode { // Only regular files will be enumerated. kFilesOnly, // Both files and directories will be enumerated. kFilesAndDirectories, }; // A special type of file path which, unlike mojo_base.mojom.FilePath, is // restricted to descending (i.e. no references to parent directories via "..") // relative (i.e. non-absolute) paths only. For C++ bindings, this is enforced // by type-mapping traits. struct StrictRelativePath { // The actual path data. mojo_base.mojom.FilePath path; }; // Indicates how a file should be opened and/or created by // |Directory.OpenFile()|. enum FileOpenMode { // Only opens the file if it already exists. kOpenIfExists, // Only creates and opens the file if it did not already exist. kCreateAndOpenOnlyIfNotExists, // Always opens the file, creating a new one only if it didn't already exist. kAlwaysOpen, // Always creates a new file, overwriting any old file that may exist. kAlwaysCreate, // Only opens the file if it already exists, truncating the file on open. kOpenIfExistsAndTruncate, }; // Indicates the type of read access a file should have when opened by // |Directory.OpenFile()|. enum FileReadAccess { // No read access. kReadNotAllowed, // Read access allowed. kReadAllowed, }; // Indicates the type of write access a file should have when opened by // |Directory.OpenFile()|. enum FileWriteAccess { // No write access. kWriteNotAllowed, // Full write access allowed. kWriteAllowed, // Append-only write access allowed. kAppendOnly, }; // A structure used to describe access rights for a specific path in the // filesystem. struct PathAccessInfo { // Indicates whether the path can be opened for reading. bool can_read; // Indicates whether the path can be opened for writing. bool can_write; }; // An empty interface used to hold remote ownership of a lock acquired via // |Directory.LockFile()| below. Closing the remote endpoint of this interface // effectively releases the corresponding lock even if |Release()| is not // called. interface FileLock { // Immediately releases the lock. After this is called once, the FileLock is // permanently released. Subsequent disconnection or calls to |Release()| will // have no interesting side-effects. [Sync] Release() => (mojo_base.mojom.FileError error); }; // A client interface consumed by the Storage Service in order to access // directory contents from within a sandboxed process. Must be implemented by // a more privileged process like the browser. // // Each bound Directory interface corresponds to a fixed directory in the // filesystem, and all StrictRelatvePath references must be interpreted as // relative to that directory. interface Directory { // Binds a new Directory receiver scoped to the same root as this Directory. Clone(pending_receiver receiver); // Indicates whether |path| exists. [Sync] PathExists(StrictRelativePath path) => (bool exists); // Enumerates all files and/or subdirectories within |path|. Not recursive. // All returned paths are relative to |path|. [Sync] GetEntries(StrictRelativePath path, GetEntriesMode mode) => (mojo_base.mojom.FileError error, array entries); // Opens a file at |path|. [Sync] OpenFile(StrictRelativePath path, FileOpenMode mode, FileReadAccess read_access, FileWriteAccess write_access) => (mojo_base.mojom.FileError error, mojo_base.mojom.File? file); // Creates a new directory at |path|. [Sync] CreateDirectory(StrictRelativePath path) => (mojo_base.mojom.FileError error); // Deletes the file or directory at |path| if it exists and returns true iff // successful. Not recursive. Will fail if there are subdirectories. This // will return true if |path| does not exist. [Sync] DeleteFile(StrictRelativePath path) => (bool success); // Retrieves information about a specific filesystem entry at |path|. Returns // null on failure, or a populated |info| struct on success. [Sync] GetFileInfo(StrictRelativePath path) => (mojo_base.mojom.FileInfo? info); // Retrieves access information about a specific filesystem entry at |path|. // Returns null on failure or a populated |info| struct on success. [Sync] GetPathAccess(StrictRelativePath path) => (PathAccessInfo? info); // Renames a file from |old_path| to |new_path|. Note that if |new_path| // already exists, it will be overwritten by this call. [Sync] RenameFile(StrictRelativePath old_path, StrictRelativePath new_path) => (mojo_base.mojom.FileError error); // Attempts to acquire an exclusive lock on the lock file identified by // |path|, creating a new file if it didn't already exist. Upon success, // |error| will be FILE_OK, and |lock| will be valid. As long as the caller // retains |lock|, the acquired lock will be held. Destroying |lock| or // explicitly calling |Release()| on it releases the lock. [Sync] LockFile(StrictRelativePath path) => (mojo_base.mojom.FileError error, pending_remote? lock); };