1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223
|
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_MEDIA_GALLERIES_FILEAPI_NATIVE_MEDIA_FILE_UTIL_H_
#define CHROME_BROWSER_MEDIA_GALLERIES_FILEAPI_NATIVE_MEDIA_FILE_UTIL_H_
#include "base/memory/scoped_ptr.h"
#include "base/memory/weak_ptr.h"
#include "storage/browser/fileapi/async_file_util.h"
namespace net {
class IOBuffer;
}
class MediaPathFilter;
// This class handles native file system operations with media type filtering.
// To support virtual file systems it implements the AsyncFileUtil interface
// from scratch and provides synchronous override points.
class NativeMediaFileUtil : public storage::AsyncFileUtil {
public:
explicit NativeMediaFileUtil(MediaPathFilter* media_path_filter);
~NativeMediaFileUtil() override;
// Uses the MIME sniffer code, which actually looks into the file,
// to determine if it is really a media file (to avoid exposing
// non-media files with a media file extension.)
static base::File::Error IsMediaFile(const base::FilePath& path);
static base::File::Error BufferIsMediaHeader(net::IOBuffer* buf,
size_t length);
// Methods to support CreateOrOpen. Public so they can be shared with
// DeviceMediaAsyncFileUtil.
static void CreatedSnapshotFileForCreateOrOpen(
base::SequencedTaskRunner* media_task_runner,
int file_flags,
const storage::AsyncFileUtil::CreateOrOpenCallback& callback,
base::File::Error result,
const base::File::Info& file_info,
const base::FilePath& platform_path,
const scoped_refptr<storage::ShareableFileReference>& file_ref);
// AsyncFileUtil overrides.
void CreateOrOpen(scoped_ptr<storage::FileSystemOperationContext> context,
const storage::FileSystemURL& url,
int file_flags,
const CreateOrOpenCallback& callback) override;
void EnsureFileExists(scoped_ptr<storage::FileSystemOperationContext> context,
const storage::FileSystemURL& url,
const EnsureFileExistsCallback& callback) override;
void CreateDirectory(scoped_ptr<storage::FileSystemOperationContext> context,
const storage::FileSystemURL& url,
bool exclusive,
bool recursive,
const StatusCallback& callback) override;
void GetFileInfo(scoped_ptr<storage::FileSystemOperationContext> context,
const storage::FileSystemURL& url,
const GetFileInfoCallback& callback) override;
void ReadDirectory(scoped_ptr<storage::FileSystemOperationContext> context,
const storage::FileSystemURL& url,
const ReadDirectoryCallback& callback) override;
void Touch(scoped_ptr<storage::FileSystemOperationContext> context,
const storage::FileSystemURL& url,
const base::Time& last_access_time,
const base::Time& last_modified_time,
const StatusCallback& callback) override;
void Truncate(scoped_ptr<storage::FileSystemOperationContext> context,
const storage::FileSystemURL& url,
int64 length,
const StatusCallback& callback) override;
void CopyFileLocal(scoped_ptr<storage::FileSystemOperationContext> context,
const storage::FileSystemURL& src_url,
const storage::FileSystemURL& dest_url,
CopyOrMoveOption option,
const CopyFileProgressCallback& progress_callback,
const StatusCallback& callback) override;
void MoveFileLocal(scoped_ptr<storage::FileSystemOperationContext> context,
const storage::FileSystemURL& src_url,
const storage::FileSystemURL& dest_url,
CopyOrMoveOption option,
const StatusCallback& callback) override;
void CopyInForeignFile(
scoped_ptr<storage::FileSystemOperationContext> context,
const base::FilePath& src_file_path,
const storage::FileSystemURL& dest_url,
const StatusCallback& callback) override;
void DeleteFile(scoped_ptr<storage::FileSystemOperationContext> context,
const storage::FileSystemURL& url,
const StatusCallback& callback) override;
void DeleteDirectory(scoped_ptr<storage::FileSystemOperationContext> context,
const storage::FileSystemURL& url,
const StatusCallback& callback) override;
void DeleteRecursively(
scoped_ptr<storage::FileSystemOperationContext> context,
const storage::FileSystemURL& url,
const StatusCallback& callback) override;
void CreateSnapshotFile(
scoped_ptr<storage::FileSystemOperationContext> context,
const storage::FileSystemURL& url,
const CreateSnapshotFileCallback& callback) override;
protected:
virtual void CreateDirectoryOnTaskRunnerThread(
scoped_ptr<storage::FileSystemOperationContext> context,
const storage::FileSystemURL& url,
bool exclusive,
bool recursive,
const StatusCallback& callback);
virtual void GetFileInfoOnTaskRunnerThread(
scoped_ptr<storage::FileSystemOperationContext> context,
const storage::FileSystemURL& url,
const GetFileInfoCallback& callback);
virtual void ReadDirectoryOnTaskRunnerThread(
scoped_ptr<storage::FileSystemOperationContext> context,
const storage::FileSystemURL& url,
const ReadDirectoryCallback& callback);
virtual void CopyOrMoveFileLocalOnTaskRunnerThread(
scoped_ptr<storage::FileSystemOperationContext> context,
const storage::FileSystemURL& src_url,
const storage::FileSystemURL& dest_url,
CopyOrMoveOption option,
bool copy,
const StatusCallback& callback);
virtual void CopyInForeignFileOnTaskRunnerThread(
scoped_ptr<storage::FileSystemOperationContext> context,
const base::FilePath& src_file_path,
const storage::FileSystemURL& dest_url,
const StatusCallback& callback);
virtual void DeleteFileOnTaskRunnerThread(
scoped_ptr<storage::FileSystemOperationContext> context,
const storage::FileSystemURL& url,
const StatusCallback& callback);
virtual void DeleteDirectoryOnTaskRunnerThread(
scoped_ptr<storage::FileSystemOperationContext> context,
const storage::FileSystemURL& url,
const StatusCallback& callback);
virtual void CreateSnapshotFileOnTaskRunnerThread(
scoped_ptr<storage::FileSystemOperationContext> context,
const storage::FileSystemURL& url,
const CreateSnapshotFileCallback& callback);
// The following methods should only be called on the task runner thread.
// Necessary for copy/move to succeed.
virtual base::File::Error CreateDirectorySync(
storage::FileSystemOperationContext* context,
const storage::FileSystemURL& url,
bool exclusive,
bool recursive);
virtual base::File::Error CopyOrMoveFileSync(
storage::FileSystemOperationContext* context,
const storage::FileSystemURL& src_url,
const storage::FileSystemURL& dest_url,
CopyOrMoveOption option,
bool copy);
virtual base::File::Error CopyInForeignFileSync(
storage::FileSystemOperationContext* context,
const base::FilePath& src_file_path,
const storage::FileSystemURL& dest_url);
virtual base::File::Error GetFileInfoSync(
storage::FileSystemOperationContext* context,
const storage::FileSystemURL& url,
base::File::Info* file_info,
base::FilePath* platform_path);
// Called by GetFileInfoSync. Meant to be overridden by subclasses that
// have special mappings from URLs to platform paths (virtual filesystems).
virtual base::File::Error GetLocalFilePath(
storage::FileSystemOperationContext* context,
const storage::FileSystemURL& file_system_url,
base::FilePath* local_file_path);
virtual base::File::Error ReadDirectorySync(
storage::FileSystemOperationContext* context,
const storage::FileSystemURL& url,
EntryList* file_list);
virtual base::File::Error DeleteFileSync(
storage::FileSystemOperationContext* context,
const storage::FileSystemURL& url);
// Necessary for move to succeed.
virtual base::File::Error DeleteDirectorySync(
storage::FileSystemOperationContext* context,
const storage::FileSystemURL& url);
virtual base::File::Error CreateSnapshotFileSync(
storage::FileSystemOperationContext* context,
const storage::FileSystemURL& url,
base::File::Info* file_info,
base::FilePath* platform_path,
scoped_refptr<storage::ShareableFileReference>* file_ref);
MediaPathFilter* media_path_filter() {
return media_path_filter_;
}
private:
// Like GetLocalFilePath(), but always take media_path_filter() into
// consideration. If the media_path_filter() check fails, return
// Fila::FILE_ERROR_SECURITY. |local_file_path| does not have to exist.
base::File::Error GetFilteredLocalFilePath(
storage::FileSystemOperationContext* context,
const storage::FileSystemURL& file_system_url,
base::FilePath* local_file_path);
// Like GetLocalFilePath(), but if the file does not exist, then return
// |failure_error|.
// If |local_file_path| is a file, then take media_path_filter() into
// consideration.
// If the media_path_filter() check fails, return |failure_error|.
// If |local_file_path| is a directory, return File::FILE_OK.
base::File::Error GetFilteredLocalFilePathForExistingFileOrDirectory(
storage::FileSystemOperationContext* context,
const storage::FileSystemURL& file_system_url,
base::File::Error failure_error,
base::FilePath* local_file_path);
// Not owned, owned by the backend which owns this.
MediaPathFilter* const media_path_filter_;
base::WeakPtrFactory<NativeMediaFileUtil> weak_factory_;
DISALLOW_COPY_AND_ASSIGN(NativeMediaFileUtil);
};
#endif // CHROME_BROWSER_MEDIA_GALLERIES_FILEAPI_NATIVE_MEDIA_FILE_UTIL_H_
|