| // Copyright 2013 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef CHROME_BROWSER_ASH_FILE_MANAGER_PATH_UTIL_H_ |
| #define CHROME_BROWSER_ASH_FILE_MANAGER_PATH_UTIL_H_ |
| |
| #include <optional> |
| #include <string> |
| #include <string_view> |
| #include <vector> |
| |
| #include "base/files/file_path.h" |
| #include "base/functional/callback.h" |
| #include "chrome/browser/ash/guest_os/guest_id.h" |
| #include "storage/browser/file_system/file_system_url.h" |
| |
| class GURL; |
| class Profile; |
| |
| namespace base { |
| class Pickle; |
| } // namespace base |
| |
| namespace ui { |
| class DataTransferEndpoint; |
| struct FileInfo; |
| } // namespace ui |
| |
| namespace file_manager::util { |
| |
| // Absolute path for FuseBox media mount point (sans a trailing slash). |
| extern const base::FilePath::CharType kFuseBoxMediaPath[]; |
| |
| // Absolute path for FuseBox media mount point (with a trailing slash). |
| extern const base::FilePath::CharType kFuseBoxMediaSlashPath[]; |
| |
| // Absolute base path for removable media on Chrome OS. Exposed here so it can |
| // be used by tests. |
| extern const base::FilePath::CharType kRemovableMediaPath[]; |
| |
| // Absolute path for the folder containing Android files. |
| extern const base::FilePath::CharType kAndroidFilesPath[]; |
| |
| // Absolute path for the folder containing font files. |
| extern const base::FilePath::CharType kSystemFontsPath[]; |
| |
| // Absolute path for the folder containing archive mounts. |
| extern const base::FilePath::CharType kArchiveMountPath[]; |
| |
| // FuseBox as a named constant string: "fusebox". |
| extern const char kFuseBox[]; |
| |
| // The storage::FileSystemURL mount name prefix for FuseBox mounts. |
| extern const char kFuseBoxMountNamePrefix[]; |
| |
| // The "foo." in "/media/fuse/fusebox/foo.bar/x/y.z" FuseBox filenames, per |
| // volume type (Android Documents Provider, File System Provider, Media |
| // Transfer Protocol, etc). The "foo.bar" component as a whole is also known as |
| // the FuseBox subdir. |
| // |
| // They end in a "." to clearly separate the "foo" and the "bar". This is not a |
| // "-" or a "_", to avoid any ambiguity when "bar" is the base64url encoding of |
| // something. This is not a ":", since /bin/bash tab completion would otherwise |
| // backslash-escape the colon (which works but it's avoidable complexity) and |
| // e.g. $PATH-like environment variables are colon separated. |
| extern const char kFuseBoxSubdirPrefixADP[]; |
| extern const char kFuseBoxSubdirPrefixFSP[]; |
| extern const char kFuseBoxSubdirPrefixLOC[]; |
| extern const char kFuseBoxSubdirPrefixMTP[]; |
| extern const char kFuseBoxSubdirPrefixTMP[]; |
| |
| // Name of the mount point used to store temporary files for sharing. |
| extern const char kShareCacheMountPointName[]; |
| |
| // Returns the valid FilesApp origin. It may be either the System Web App |
| // chrome:// URL or the legacy Chrome App chrome-extension:// URL. |
| const url::Origin& GetFilesAppOrigin(); |
| |
| // Gets the absolute path for the 'Downloads' folder for the |profile|. |
| base::FilePath GetDownloadsFolderForProfile(Profile* profile); |
| |
| // Gets the absolute path for the 'MyFiles' folder for the |profile|. |
| base::FilePath GetMyFilesFolderForProfile(Profile* profile); |
| |
| // Gets the absolute path for the user's Android Play files (Movies, Pictures, |
| // etc..., Android apps excluded). The default path may be overridden by tests. |
| base::FilePath GetAndroidFilesPath(); |
| |
| // Gets the absolute path for the user's Share Cache directory, which is used |
| // to store temporary files being shared from one app to another. |
| base::FilePath GetShareCacheFilePath(Profile* profile); |
| |
| // Converts |old_path| to |new_path| and returns true, if the old path points |
| // to an old location of user folders (in "Downloads" or "Google Drive"). |
| // The |profile| argument is used for determining the location of the |
| // "Downloads" folder. |
| // |
| // As of now (M40), the conversion is used only during initialization of |
| // download_prefs, where profile unaware initialization precedes profile |
| // aware stage. Below are the list of relocations we have made in the past. |
| // *Updated in M73 to handle /home/chronos/user to |
| // /home/chronos/u-{hash}/MyFiles/Downloads |
| // |
| // M27: crbug.com/229304, for supporting {offline, recent, shared} folders |
| // in Drive. Migration code for this is removed in M34. |
| // M34-35: crbug.com/313539, 356322, for supporting multi profiles. |
| // Migration code is removed in M40. |
| bool MigratePathFromOldFormat(Profile* profile, |
| const base::FilePath& old_base, |
| const base::FilePath& old_path, |
| base::FilePath* new_path); |
| |
| // Converts |old_path| in <cryptohome>/Downloads[/*] to |new_path| in |
| // <cryptohome/MyFiles/Downloads[*]. Returns true if path is changed else |
| // returns false if |old_path| was not inside Downloads, and |new_path| is |
| // undefined. |
| // |
| // Introduced in M73. This code updates values stored in prefs. |
| // TODO(crbug.com/41430020) Remove this when no users are running M72 or |
| // earlier. |
| bool MigrateFromDownloadsToMyFiles(Profile* profile, |
| const base::FilePath& old_path, |
| base::FilePath* new_path); |
| |
| // Convers |old_path| in /special/drive-<hash> to |new_path| in |
| // /media/fuse/drivefs-<id>. Returns true if path is changed else |
| // returns false if |old_path| was not inside Drive, and |new_path| is |
| // undefined. |
| bool MigrateToDriveFs(Profile* profile, |
| const base::FilePath& old_path, |
| base::FilePath* new_path); |
| |
| // The canonical mount point name for "Downloads" folder. |
| std::string GetDownloadsMountPointName(Profile* profile); |
| |
| // The canonical mount point name for "ShareCache" folder. |
| std::string GetShareCacheMountPointName(Profile* profile); |
| |
| // The canonical mount point name for ARC "Play files" folder. |
| std::string GetAndroidFilesMountPointName(); |
| |
| // The canonical mount point name for crostini "Linux files" folder. |
| std::string GetCrostiniMountPointName(Profile* profile); |
| |
| // The canonical mount point name for the Guest OS `id`. |
| std::string GetGuestOsMountPointName(Profile* profile, |
| const guest_os::GuestId& id); |
| |
| // The actual directory the crostini "Linux files" folder is mounted. |
| base::FilePath GetCrostiniMountDirectory(Profile* profile); |
| |
| // The actual directory the Guest OS with `mountPointName` is mounted in. |
| base::FilePath GetGuestOsMountDirectory(std::string mountPointName); |
| |
| // Convert a cracked |file_system_url| to a path inside a VM mounted at |
| // |vm_mount| (e.g. /mnt/chromeos). If |map_crostini_home| is set, paths under |
| // GetCrostiniMountDirectory() are translated to be under the user's home |
| // directory (e.g. /home/user) otherwise these paths map to |
| // |vm_mount|/LinuxFiles. This function is the reverse of |
| // ConvertPathInsideVMToFileSystemURL(). Returns true iff path can be converted. |
| bool ConvertFileSystemURLToPathInsideVM( |
| Profile* profile, |
| const storage::FileSystemURL& file_system_url, |
| const base::FilePath& vm_mount, |
| bool map_crostini_home, |
| base::FilePath* inside); |
| |
| // Convert a cracked url to a path inside the Crostini VM. |
| bool ConvertFileSystemURLToPathInsideCrostini( |
| Profile* profile, |
| const storage::FileSystemURL& file_system_url, |
| base::FilePath* inside); |
| |
| // Convert a Fusebox Moniker path to a path inside VM mounted at `vm_mount`. |
| // `inside` is modified only when the return value is true (success). |
| bool ConvertFuseboxMonikerPathToPathInsideVM(const base::FilePath& path, |
| const base::FilePath& vm_mount, |
| base::FilePath* inside); |
| |
| // Convert a path inside a VM mounted at |vm_mount| (e.g. /mnt/chromeos) to a |
| // FileSystemURL. If |map_crostini_home| is set, paths |
| // under the user's home directory (e.g. /home/user) are translated to be under |
| // GetCrostiniMountDirectory(). This function is the reverse of |
| // ConvertFileSystemURLToPathInsideVM(). Returns true iff path can be converted. |
| bool ConvertPathInsideVMToFileSystemURL( |
| Profile* profile, |
| const base::FilePath& inside, |
| const base::FilePath& vm_mount, |
| bool map_crostini_home, |
| storage::FileSystemURL* file_system_url); |
| |
| // DEPRECATED. Use |ConvertToContentUrls| instead. |
| // While this function can convert paths under Downloads, /media/removable |
| // and /special/drive, this CANNOT convert paths under ARC media directories |
| // (/special/arc-documents-provider). |
| // TODO(crbug.com/811679): Migrate all callers and remove this. |
| // |*requires_sharing_out| will be set to true if |path| needs to be made |
| // available to ARCVM by sharing via Seneschal. |
| // Precondition: arc_url_out != nullptr |
| // Precondition: requires_sharing_out != nullptr |
| bool ConvertPathToArcUrl(const base::FilePath& path, |
| GURL* arc_url_out, |
| bool* requires_sharing_out); |
| |
| // |paths_to_share| is a list of paths to be made available to ARCVM by sharing |
| // them via Seneschal. |
| using ConvertToContentUrlsCallback = |
| base::OnceCallback<void(const std::vector<GURL>& content_urls, |
| const std::vector<base::FilePath>& paths_to_share)>; |
| |
| // Converts the given FileSystemURL to a file path which can be passed to |
| // ConvertPathToArcUrl(). |
| base::FilePath ConvertFileSystemURLToPathForSharingWithArc( |
| const storage::FileSystemURL& file_system_url); |
| |
| // Asynchronously converts Chrome OS file system URLs to content:// URLs. |
| // Always returns a vector of the same size as |file_system_urls|. |
| // Empty GURLs are filled in the vector if conversion fails. |
| void ConvertToContentUrls( |
| Profile* profile, |
| const std::vector<storage::FileSystemURL>& file_system_urls, |
| ConvertToContentUrlsCallback callback); |
| |
| // Replace `prefix` with `replacement` at the beginning of `*s`. |
| bool ReplacePrefix(std::string* s, |
| std::string_view prefix, |
| std::string_view replacement); |
| |
| // Convert path into a string suitable for display in settings. |
| // Replacement examples: |
| // * /home/chronos/user/MyFiles => My files |
| // * /home/chronos/u-<hash>/MyFiles => My files |
| // * /media/fuse/drivefs-<hash>/root => Google Drive › My Drive |
| // * /media/fuse/drivefs-<hash>/team_drives => Google Drive › Team Drives |
| // * /media/fuse/drivefs-<hash>/Computers => Google Drive › Computers |
| // * /run/arc/sdcard/write/emulated/0 => Play files |
| // * /media/fuse/crostini_<hash>_termina_penguin => Linux files |
| // * /media/archive/<id> => <id> |
| // * /media/removable/<id> => <id> |
| // * '/' with ' › ' (angled quote sign) for display purposes. |
| std::string GetPathDisplayTextForSettings(Profile* profile, |
| std::string_view path); |
| |
| // Extracts |mount_name|, |file_system_name|, and |full_path| from given |
| // |absolute_path|. |
| bool ExtractMountNameFileSystemNameFullPath(const base::FilePath& absolute_path, |
| std::string* mount_name, |
| std::string* file_system_name, |
| std::string* full_path); |
| |
| // Extracts the file/directory name from the URL and unescape to convert %20 to |
| // space. |
| std::string GetDisplayableFileName(GURL file_url); |
| std::string GetDisplayableFileName(storage::FileSystemURL file_url); |
| std::u16string GetDisplayableFileName16(GURL file_url); |
| std::u16string GetDisplayableFileName16(storage::FileSystemURL file_url); |
| |
| // Turns an absolute path into one suitable for display. Returns nullopt if the |
| // given path is invalid or not on a mounted volume. |
| std::optional<base::FilePath> GetDisplayablePath(Profile* profile, |
| base::FilePath path); |
| std::optional<base::FilePath> GetDisplayablePath( |
| Profile* profile, |
| storage::FileSystemURL file_url); |
| |
| // Reads pickle for FilesApp fs/sources with newline-separated filesystem |
| // URLs. Validates that |source| is FilesApp. |
| std::vector<ui::FileInfo> ParseFileSystemSources( |
| const ui::DataTransferEndpoint* source, |
| const base::Pickle& pickle); |
| |
| } // namespace file_manager::util |
| |
| #endif // CHROME_BROWSER_ASH_FILE_MANAGER_PATH_UTIL_H_ |