media_file_system_backend.cc revision 3551c9c881056c480085172ff9840cab31610854
1// 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
5#include "chrome/browser/media_galleries/fileapi/media_file_system_backend.h"
6
7#include <string>
8
9#include "base/bind.h"
10#include "base/files/file_path.h"
11#include "base/logging.h"
12#include "base/message_loop/message_loop_proxy.h"
13#include "base/platform_file.h"
14#include "base/sequenced_task_runner.h"
15#include "base/threading/sequenced_worker_pool.h"
16#include "chrome/browser/media_galleries/fileapi/device_media_async_file_util.h"
17#include "chrome/browser/media_galleries/fileapi/media_file_validator_factory.h"
18#include "chrome/browser/media_galleries/fileapi/media_path_filter.h"
19#include "chrome/browser/media_galleries/fileapi/native_media_file_util.h"
20#include "content/public/browser/browser_thread.h"
21#include "webkit/browser/blob/local_file_stream_reader.h"
22#include "webkit/browser/fileapi/copy_or_move_file_validator.h"
23#include "webkit/browser/fileapi/file_system_context.h"
24#include "webkit/browser/fileapi/file_system_file_stream_reader.h"
25#include "webkit/browser/fileapi/file_system_operation_context.h"
26#include "webkit/browser/fileapi/file_system_operation_impl.h"
27#include "webkit/browser/fileapi/isolated_context.h"
28#include "webkit/browser/fileapi/isolated_file_util.h"
29#include "webkit/browser/fileapi/local_file_stream_writer.h"
30#include "webkit/browser/fileapi/native_file_util.h"
31#include "webkit/common/fileapi/file_system_types.h"
32#include "webkit/common/fileapi/file_system_util.h"
33
34#if defined(OS_WIN) || defined(OS_MACOSX)
35#include "chrome/browser/media_galleries/fileapi/itunes_file_util.h"
36#include "chrome/browser/media_galleries/fileapi/picasa/picasa_file_util.h"
37#endif  // defined(OS_WIN) || defined(OS_MACOSX)
38
39using fileapi::FileSystemContext;
40using fileapi::FileSystemURL;
41
42namespace chrome {
43
44const char MediaFileSystemBackend::kMediaTaskRunnerName[] =
45    "media-task-runner";
46
47MediaFileSystemBackend::MediaFileSystemBackend(
48    const base::FilePath& profile_path,
49    base::SequencedTaskRunner* media_task_runner)
50    : profile_path_(profile_path),
51      media_task_runner_(media_task_runner),
52      media_path_filter_(new MediaPathFilter),
53      media_copy_or_move_file_validator_factory_(new MediaFileValidatorFactory),
54      native_media_file_util_(
55          new NativeMediaFileUtil(media_path_filter_.get())),
56      device_media_async_file_util_(
57          DeviceMediaAsyncFileUtil::Create(profile_path_))
58#if defined(OS_WIN) || defined(OS_MACOSX)
59      ,
60      picasa_file_util_(new picasa::PicasaFileUtil(media_path_filter_.get())),
61      itunes_file_util_(new itunes::ITunesFileUtil(media_path_filter_.get()))
62#endif  // defined(OS_WIN) || defined(OS_MACOSX)
63{
64}
65
66MediaFileSystemBackend::~MediaFileSystemBackend() {
67}
68
69// static
70bool MediaFileSystemBackend::CurrentlyOnMediaTaskRunnerThread() {
71  base::SequencedWorkerPool* pool = content::BrowserThread::GetBlockingPool();
72  base::SequencedWorkerPool::SequenceToken media_sequence_token =
73      pool->GetNamedSequenceToken(kMediaTaskRunnerName);
74  return pool->IsRunningSequenceOnCurrentThread(media_sequence_token);
75}
76
77// static
78scoped_refptr<base::SequencedTaskRunner>
79MediaFileSystemBackend::MediaTaskRunner() {
80  base::SequencedWorkerPool* pool = content::BrowserThread::GetBlockingPool();
81  base::SequencedWorkerPool::SequenceToken media_sequence_token =
82      pool->GetNamedSequenceToken(kMediaTaskRunnerName);
83  return pool->GetSequencedTaskRunner(media_sequence_token);
84}
85
86bool MediaFileSystemBackend::CanHandleType(
87    fileapi::FileSystemType type) const {
88  switch (type) {
89    case fileapi::kFileSystemTypeNativeMedia:
90    case fileapi::kFileSystemTypeDeviceMedia:
91#if defined(OS_WIN) || defined(OS_MACOSX)
92    case fileapi::kFileSystemTypePicasa:
93    case fileapi::kFileSystemTypeItunes:
94#endif  // defined(OS_WIN) || defined(OS_MACOSX)
95      return true;
96    default:
97      return false;
98  }
99}
100
101void MediaFileSystemBackend::Initialize(fileapi::FileSystemContext* context) {
102}
103
104void MediaFileSystemBackend::OpenFileSystem(
105    const GURL& origin_url,
106    fileapi::FileSystemType type,
107    fileapi::OpenFileSystemMode mode,
108    const OpenFileSystemCallback& callback) {
109  // We never allow opening a new isolated FileSystem via usual OpenFileSystem.
110  base::MessageLoopProxy::current()->PostTask(
111      FROM_HERE,
112      base::Bind(callback,
113                 GetFileSystemRootURI(origin_url, type),
114                 GetFileSystemName(origin_url, type),
115                 base::PLATFORM_FILE_ERROR_SECURITY));
116}
117
118fileapi::FileSystemFileUtil* MediaFileSystemBackend::GetFileUtil(
119    fileapi::FileSystemType type) {
120  NOTREACHED();
121  return NULL;
122}
123
124fileapi::AsyncFileUtil* MediaFileSystemBackend::GetAsyncFileUtil(
125    fileapi::FileSystemType type) {
126  switch (type) {
127    case fileapi::kFileSystemTypeNativeMedia:
128      return native_media_file_util_.get();
129    case fileapi::kFileSystemTypeDeviceMedia:
130      return device_media_async_file_util_.get();
131#if defined(OS_WIN) || defined(OS_MACOSX)
132    case fileapi::kFileSystemTypeItunes:
133      return itunes_file_util_.get();
134    case fileapi::kFileSystemTypePicasa:
135      return picasa_file_util_.get();
136#endif  // defined(OS_WIN) || defined(OS_MACOSX)
137    default:
138      NOTREACHED();
139  }
140  return NULL;
141}
142
143fileapi::CopyOrMoveFileValidatorFactory*
144MediaFileSystemBackend::GetCopyOrMoveFileValidatorFactory(
145    fileapi::FileSystemType type, base::PlatformFileError* error_code) {
146  DCHECK(error_code);
147  *error_code = base::PLATFORM_FILE_OK;
148  switch (type) {
149    case fileapi::kFileSystemTypeNativeMedia:
150    case fileapi::kFileSystemTypeDeviceMedia:
151    case fileapi::kFileSystemTypeItunes:
152      if (!media_copy_or_move_file_validator_factory_) {
153        *error_code = base::PLATFORM_FILE_ERROR_SECURITY;
154        return NULL;
155      }
156      return media_copy_or_move_file_validator_factory_.get();
157    default:
158      NOTREACHED();
159  }
160  return NULL;
161}
162
163fileapi::FileSystemOperation*
164MediaFileSystemBackend::CreateFileSystemOperation(
165    const FileSystemURL& url,
166    FileSystemContext* context,
167    base::PlatformFileError* error_code) const {
168  scoped_ptr<fileapi::FileSystemOperationContext> operation_context(
169      new fileapi::FileSystemOperationContext(
170          context, media_task_runner_.get()));
171  return new fileapi::FileSystemOperationImpl(url, context,
172                                              operation_context.Pass());
173}
174
175scoped_ptr<webkit_blob::FileStreamReader>
176MediaFileSystemBackend::CreateFileStreamReader(
177    const FileSystemURL& url,
178    int64 offset,
179    const base::Time& expected_modification_time,
180    FileSystemContext* context) const {
181  return scoped_ptr<webkit_blob::FileStreamReader>(
182      new webkit_blob::LocalFileStreamReader(
183          context->default_file_task_runner(),
184          url.path(), offset, expected_modification_time));
185}
186
187scoped_ptr<fileapi::FileStreamWriter>
188MediaFileSystemBackend::CreateFileStreamWriter(
189    const FileSystemURL& url,
190    int64 offset,
191    FileSystemContext* context) const {
192  return scoped_ptr<fileapi::FileStreamWriter>(
193      new fileapi::LocalFileStreamWriter(
194          context->default_file_task_runner(),
195          url.path(), offset));
196}
197
198fileapi::FileSystemQuotaUtil*
199MediaFileSystemBackend::GetQuotaUtil() {
200  // No quota support.
201  return NULL;
202}
203
204}  // namespace chrome
205