blob: 42db214caff47212c8df974ef0683f461dcde960 [file] [log] [blame]
// 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.
//
// This file provides File API related utilities.
#ifndef CHROME_BROWSER_ASH_FILE_MANAGER_FILEAPI_UTIL_H_
#define CHROME_BROWSER_ASH_FILE_MANAGER_FILEAPI_UTIL_H_
#include <memory>
#include <string>
#include <vector>
#include "base/files/file.h"
#include "base/files/file_error_or.h"
#include "base/files/file_path.h"
#include "base/functional/callback_forward.h"
#include "base/values.h"
#include "storage/browser/file_system/file_system_operation_runner.h"
#include "storage/browser/file_system/isolated_context.h"
#include "third_party/blink/public/mojom/choosers/file_chooser.mojom-forward.h"
#include "url/gurl.h"
#include "url/origin.h"
namespace content {
class BrowserContext;
class RenderFrameHost;
} // namespace content
namespace storage {
class FileSystemContext;
}
namespace ui {
struct SelectedFileInfo;
}
namespace file_manager {
namespace util {
// Structure information necessary to create a EntryDefinition, and therefore
// an Entry object on the JavaScript side.
struct FileDefinition {
base::FilePath virtual_path;
base::FilePath absolute_path;
bool is_directory = false;
};
// Contains all information needed to create an Entry object in custom bindings.
struct EntryDefinition {
EntryDefinition();
EntryDefinition(const EntryDefinition& other);
~EntryDefinition();
std::string file_system_root_url; // Used to create DOMFileSystem.
std::string file_system_name; // Value of DOMFileSystem.name.
base::FilePath full_path; // Value of Entry.fullPath.
// Whether to create FileEntry or DirectoryEntry when the corresponding entry
// is not found.
bool is_directory = false;
base::File::Error error = base::File::FILE_ERROR_FAILED;
};
typedef std::vector<FileDefinition> FileDefinitionList;
typedef std::vector<EntryDefinition> EntryDefinitionList;
typedef std::vector<ui::SelectedFileInfo> SelectedFileInfoList;
typedef std::vector<blink::mojom::FileChooserFileInfoPtr>
FileChooserFileInfoList;
// The callback used by ConvertFileDefinitionToEntryDefinition. Returns the
// result of the conversion.
typedef base::OnceCallback<void(const EntryDefinition& entry_definition)>
EntryDefinitionCallback;
// The callback used by ConvertFileDefinitionListToEntryDefinitionList. Returns
// the result of the conversion as a list.
typedef base::OnceCallback<void(
std::unique_ptr<EntryDefinitionList> entry_definition_list)>
EntryDefinitionListCallback;
// The callback used by
// ConvertFileSelectedInfoListToFileChooserFileInfoList. Returns the result of
// the conversion as a list.
typedef base::OnceCallback<void(FileChooserFileInfoList)>
FileChooserFileInfoListCallback;
// Returns the URL of the system File Manager. If you think you need to use File
// Manager ID or URL, use this function instead. This function guarantees that
// the correct and current URL is returned. If you need to access just the ID
// of the system File Manager, call host() method on the returned URL.
// TODO(crbug.com/40752851): Replace with dynamic listener URL.
const GURL GetFileManagerURL();
// Returns whether the given URL identifies the File Manager as a source. This
// can be used to see if a private API calls come from the File Manager or not.
bool IsFileManagerURL(const GURL& source_url);
// Returns the default file system context for Files app. This is a convenience
// method that should be used only if you are ABSOLUTELY CERTAIN that you are
// performing some functions on the behalf of the Files app yet your code does
// not readily have access to the system File Manager ID or URL.
storage::FileSystemContext* GetFileManagerFileSystemContext(
content::BrowserContext* browser_context);
// Returns a file system context associated with the given browser_context and
// the source URL. The source URL is the URL that identifies the application,
// such as chrome-extension://<extension-id>/ or chrome://<app-id>/. In private
// APIs it is available as source_url(). You can also use GetFileManagerURL
// with this call.
storage::FileSystemContext* GetFileSystemContextForSourceURL(
content::BrowserContext* browser_context,
const GURL& source_url);
// Returns a file system context associated with the given browser_context and
// the render view host.
storage::FileSystemContext* GetFileSystemContextForRenderFrameHost(
content::BrowserContext* browser_context,
content::RenderFrameHost* render_frame_host);
// Converts AbsolutePath (e.g., "/media/removable/foo" or
// "/home/chronos/u-xxx/Downloads") into filesystem URL. Returns false
// if |absolute_path| is not managed by the external filesystem provider.
bool ConvertAbsoluteFilePathToFileSystemUrl(
content::BrowserContext* browser_context,
const base::FilePath& absolute_path,
const GURL& source_url,
GURL* url);
// Converts AbsolutePath into RelativeFileSystemPath (e.g.,
// "/media/removable/foo/bar" => "removable/foo/bar".) Returns false if
// |absolute_path| is not managed by the external filesystem provider.
bool ConvertAbsoluteFilePathToRelativeFileSystemPath(
content::BrowserContext* browser_context,
const GURL& source_url,
const base::FilePath& absolute_path,
base::FilePath* relative_path);
// Converts a file definition to a entry definition and returns the result
// via a callback. Must be called on UI thread.
void ConvertFileDefinitionToEntryDefinition(
scoped_refptr<storage::FileSystemContext> file_system_context,
const url::Origin& origin,
const FileDefinition& file_definition,
EntryDefinitionCallback callback);
// Converts a list of file definitions into a list of entry definitions and
// returns it via |callback|. The method is safe, |file_definition_list| is
// copied internally. The output list has the same order of items and size as
// the input vector. Must be called on UI thread.
void ConvertFileDefinitionListToEntryDefinitionList(
scoped_refptr<storage::FileSystemContext> file_system_context,
const url::Origin& origin,
const FileDefinitionList& file_definition_list,
EntryDefinitionListCallback callback);
// Converts SelectedFileInfoList into FileChooserFileInfoList.
void ConvertSelectedFileInfoListToFileChooserFileInfoList(
storage::FileSystemContext* context,
const url::Origin& origin,
const SelectedFileInfoList& selected_info_list,
FileChooserFileInfoListCallback callback);
// Converts EntryDefinition to something File API stack can understand.
base::Value::Dict ConvertEntryDefinitionToValue(
const EntryDefinition& entry_definition);
base::Value::List ConvertEntryDefinitionListToListValue(
const EntryDefinitionList& entry_definition_list);
// Checks if a directory exists at |directory_path| absolute path.
void CheckIfDirectoryExists(
scoped_refptr<storage::FileSystemContext> file_system_context,
const base::FilePath& directory_path,
storage::FileSystemOperationRunner::StatusCallback callback);
// Get metadata for an entry at |entry_path| absolute path.
void GetMetadataForPath(
scoped_refptr<storage::FileSystemContext> file_system_context,
const base::FilePath& entry_path,
storage::FileSystemOperationRunner::GetMetadataFieldSet fields,
storage::FileSystemOperationRunner::GetMetadataCallback callback);
// Groups a FileSystemURL and a related ScopedFSHandle.
//
// The URL is guaranteed to be valid as long as the handle is valid.
struct FileSystemURLAndHandle {
storage::FileSystemURL url;
storage::IsolatedContext::ScopedFSHandle handle;
};
// Obtains isolated file system URL from |virtual_path| pointing a file in the
// external file system.
FileSystemURLAndHandle CreateIsolatedURLFromVirtualPath(
const storage::FileSystemContext& context,
const url::Origin& origin,
const base::FilePath& virtual_path);
// Given a |destination_folder| and a |filename|, returns a suitable path inside
// folder that does not already exist. First it checks whether |filename| exists
// inside |destination_folder|. If it does, it adds a parenthesised number (e.g.
// " (1)" before the extension to deduplicate the filename.
void GenerateUnusedFilename(
storage::FileSystemURL destination_folder,
base::FilePath filename,
scoped_refptr<storage::FileSystemContext> file_system_context,
base::OnceCallback<void(base::FileErrorOr<storage::FileSystemURL>)>
callback);
} // namespace util
} // namespace file_manager
#endif // CHROME_BROWSER_ASH_FILE_MANAGER_FILEAPI_UTIL_H_