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