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