blob: cf0bc262a9cdbcbe5e6f51ee48e5cee70196b38c [file] [log] [blame]
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +01001// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Ben Murdoch7dbb3d52013-07-17 14:55:54 +01005#include "chrome/browser/media_galleries/fileapi/media_file_system_backend.h"
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +01006
7#include <string>
8
9#include "base/bind.h"
10#include "base/files/file_path.h"
11#include "base/logging.h"
Torne (Richard Coles)b2df76e2013-05-13 16:52:09 +010012#include "base/message_loop/message_loop_proxy.h"
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010013#include "base/platform_file.h"
14#include "base/sequenced_task_runner.h"
Torne (Richard Coles)7d4cd472013-06-19 11:58:07 +010015#include "base/threading/sequenced_worker_pool.h"
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +010016#include "chrome/browser/media_galleries/fileapi/device_media_async_file_util.h"
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010017#include "chrome/browser/media_galleries/fileapi/media_file_validator_factory.h"
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010018#include "chrome/browser/media_galleries/fileapi/media_path_filter.h"
19#include "chrome/browser/media_galleries/fileapi/native_media_file_util.h"
Torne (Richard Coles)7d4cd472013-06-19 11:58:07 +010020#include "content/public/browser/browser_thread.h"
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +010021#include "webkit/browser/blob/local_file_stream_reader.h"
22#include "webkit/browser/fileapi/async_file_util_adapter.h"
23#include "webkit/browser/fileapi/copy_or_move_file_validator.h"
24#include "webkit/browser/fileapi/file_system_context.h"
25#include "webkit/browser/fileapi/file_system_file_stream_reader.h"
26#include "webkit/browser/fileapi/file_system_operation_context.h"
Torne (Richard Coles)a36e5922013-08-05 13:57:33 +010027#include "webkit/browser/fileapi/file_system_operation_impl.h"
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +010028#include "webkit/browser/fileapi/isolated_context.h"
29#include "webkit/browser/fileapi/isolated_file_util.h"
30#include "webkit/browser/fileapi/local_file_stream_writer.h"
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +010031#include "webkit/browser/fileapi/native_file_util.h"
32#include "webkit/common/fileapi/file_system_types.h"
33#include "webkit/common/fileapi/file_system_util.h"
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010034
Ben Murdocheb525c52013-07-10 11:40:50 +010035#if defined(OS_WIN) || defined(OS_MACOSX)
36#include "chrome/browser/media_galleries/fileapi/itunes_file_util.h"
37#include "chrome/browser/media_galleries/fileapi/picasa/picasa_file_util.h"
38#endif // defined(OS_WIN) || defined(OS_MACOSX)
39
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010040using fileapi::FileSystemContext;
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010041using fileapi::FileSystemURL;
42
43namespace chrome {
44
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010045const char MediaFileSystemBackend::kMediaTaskRunnerName[] =
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010046 "media-task-runner";
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010047
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010048MediaFileSystemBackend::MediaFileSystemBackend(
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010049 const base::FilePath& profile_path,
50 base::SequencedTaskRunner* media_task_runner)
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010051 : profile_path_(profile_path),
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010052 media_task_runner_(media_task_runner),
53 media_path_filter_(new MediaPathFilter),
54 media_copy_or_move_file_validator_factory_(new MediaFileValidatorFactory),
Ben Murdochbb1529c2013-08-08 10:24:53 +010055 native_media_file_util_(
56 new NativeMediaFileUtil(media_path_filter_.get())),
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +010057 device_media_async_file_util_(
Ben Murdocheb525c52013-07-10 11:40:50 +010058 DeviceMediaAsyncFileUtil::Create(profile_path_))
59#if defined(OS_WIN) || defined(OS_MACOSX)
60 ,
Ben Murdochbb1529c2013-08-08 10:24:53 +010061 picasa_file_util_(new picasa::PicasaFileUtil(media_path_filter_.get())),
62 itunes_file_util_(new itunes::ItunesFileUtil(media_path_filter_.get()))
Ben Murdocheb525c52013-07-10 11:40:50 +010063#endif // defined(OS_WIN) || defined(OS_MACOSX)
64{
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010065}
66
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010067MediaFileSystemBackend::~MediaFileSystemBackend() {
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010068}
69
Torne (Richard Coles)7d4cd472013-06-19 11:58:07 +010070// static
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010071bool MediaFileSystemBackend::CurrentlyOnMediaTaskRunnerThread() {
Torne (Richard Coles)7d4cd472013-06-19 11:58:07 +010072 base::SequencedWorkerPool* pool = content::BrowserThread::GetBlockingPool();
73 base::SequencedWorkerPool::SequenceToken media_sequence_token =
74 pool->GetNamedSequenceToken(kMediaTaskRunnerName);
75 return pool->IsRunningSequenceOnCurrentThread(media_sequence_token);
76}
77
Ben Murdocheb525c52013-07-10 11:40:50 +010078// static
79scoped_refptr<base::SequencedTaskRunner>
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010080MediaFileSystemBackend::MediaTaskRunner() {
Ben Murdocheb525c52013-07-10 11:40:50 +010081 base::SequencedWorkerPool* pool = content::BrowserThread::GetBlockingPool();
82 base::SequencedWorkerPool::SequenceToken media_sequence_token =
83 pool->GetNamedSequenceToken(kMediaTaskRunnerName);
84 return pool->GetSequencedTaskRunner(media_sequence_token);
85}
86
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010087bool MediaFileSystemBackend::CanHandleType(
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +010088 fileapi::FileSystemType type) const {
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010089 switch (type) {
90 case fileapi::kFileSystemTypeNativeMedia:
91 case fileapi::kFileSystemTypeDeviceMedia:
Ben Murdocheb525c52013-07-10 11:40:50 +010092#if defined(OS_WIN) || defined(OS_MACOSX)
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +010093 case fileapi::kFileSystemTypePicasa:
Torne (Richard Coles)b2df76e2013-05-13 16:52:09 +010094 case fileapi::kFileSystemTypeItunes:
Ben Murdocheb525c52013-07-10 11:40:50 +010095#endif // defined(OS_WIN) || defined(OS_MACOSX)
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010096 return true;
97 default:
98 return false;
99 }
100}
101
Ben Murdochbbcdd452013-07-25 10:06:34 +0100102void MediaFileSystemBackend::Initialize(fileapi::FileSystemContext* context) {
103}
104
105void MediaFileSystemBackend::OpenFileSystem(
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100106 const GURL& origin_url,
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +0100107 fileapi::FileSystemType type,
108 fileapi::OpenFileSystemMode mode,
Ben Murdochbbcdd452013-07-25 10:06:34 +0100109 const OpenFileSystemCallback& callback) {
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100110 // We never allow opening a new isolated FileSystem via usual OpenFileSystem.
111 base::MessageLoopProxy::current()->PostTask(
112 FROM_HERE,
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100113 base::Bind(callback,
114 GetFileSystemRootURI(origin_url, type),
115 GetFileSystemName(origin_url, type),
116 base::PLATFORM_FILE_ERROR_SECURITY));
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100117}
118
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100119fileapi::FileSystemFileUtil* MediaFileSystemBackend::GetFileUtil(
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +0100120 fileapi::FileSystemType type) {
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +0100121 NOTREACHED();
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100122 return NULL;
123}
124
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100125fileapi::AsyncFileUtil* MediaFileSystemBackend::GetAsyncFileUtil(
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +0100126 fileapi::FileSystemType type) {
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100127 switch (type) {
128 case fileapi::kFileSystemTypeNativeMedia:
129 return native_media_file_util_.get();
130 case fileapi::kFileSystemTypeDeviceMedia:
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100131 return device_media_async_file_util_.get();
Ben Murdocheb525c52013-07-10 11:40:50 +0100132#if defined(OS_WIN) || defined(OS_MACOSX)
Torne (Richard Coles)b2df76e2013-05-13 16:52:09 +0100133 case fileapi::kFileSystemTypeItunes:
134 return itunes_file_util_.get();
Ben Murdocheb525c52013-07-10 11:40:50 +0100135 case fileapi::kFileSystemTypePicasa:
136 return picasa_file_util_.get();
137#endif // defined(OS_WIN) || defined(OS_MACOSX)
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100138 default:
139 NOTREACHED();
140 }
141 return NULL;
142}
143
144fileapi::CopyOrMoveFileValidatorFactory*
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100145MediaFileSystemBackend::GetCopyOrMoveFileValidatorFactory(
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +0100146 fileapi::FileSystemType type, base::PlatformFileError* error_code) {
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100147 DCHECK(error_code);
148 *error_code = base::PLATFORM_FILE_OK;
149 switch (type) {
150 case fileapi::kFileSystemTypeNativeMedia:
151 case fileapi::kFileSystemTypeDeviceMedia:
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +0100152 case fileapi::kFileSystemTypeItunes:
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100153 if (!media_copy_or_move_file_validator_factory_) {
154 *error_code = base::PLATFORM_FILE_ERROR_SECURITY;
155 return NULL;
156 }
157 return media_copy_or_move_file_validator_factory_.get();
158 default:
159 NOTREACHED();
160 }
161 return NULL;
162}
163
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100164fileapi::FileSystemOperation*
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100165MediaFileSystemBackend::CreateFileSystemOperation(
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100166 const FileSystemURL& url,
167 FileSystemContext* context,
168 base::PlatformFileError* error_code) const {
169 scoped_ptr<fileapi::FileSystemOperationContext> operation_context(
170 new fileapi::FileSystemOperationContext(
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +0100171 context, media_task_runner_.get()));
Torne (Richard Coles)a36e5922013-08-05 13:57:33 +0100172 return new fileapi::FileSystemOperationImpl(url, context,
173 operation_context.Pass());
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100174}
175
176scoped_ptr<webkit_blob::FileStreamReader>
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100177MediaFileSystemBackend::CreateFileStreamReader(
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100178 const FileSystemURL& url,
179 int64 offset,
180 const base::Time& expected_modification_time,
181 FileSystemContext* context) const {
182 return scoped_ptr<webkit_blob::FileStreamReader>(
183 new webkit_blob::LocalFileStreamReader(
Torne (Richard Coles)a36e5922013-08-05 13:57:33 +0100184 context->default_file_task_runner(),
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100185 url.path(), offset, expected_modification_time));
186}
187
188scoped_ptr<fileapi::FileStreamWriter>
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100189MediaFileSystemBackend::CreateFileStreamWriter(
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100190 const FileSystemURL& url,
191 int64 offset,
192 FileSystemContext* context) const {
193 return scoped_ptr<fileapi::FileStreamWriter>(
Ben Murdocheb525c52013-07-10 11:40:50 +0100194 new fileapi::LocalFileStreamWriter(
Torne (Richard Coles)a36e5922013-08-05 13:57:33 +0100195 context->default_file_task_runner(),
Ben Murdocheb525c52013-07-10 11:40:50 +0100196 url.path(), offset));
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100197}
198
199fileapi::FileSystemQuotaUtil*
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100200MediaFileSystemBackend::GetQuotaUtil() {
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100201 // No quota support.
202 return NULL;
203}
204
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100205} // namespace chrome