blob: 0a148443366fe86e86e3ed43df74ed55731fcb75 [file] [log] [blame]
// Copyright (c) 2013 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.
#include "chrome/browser/media_galleries/fileapi/media_file_system_backend.h"
#include <string>
#include "base/bind.h"
#include "base/files/file_path.h"
#include "base/logging.h"
#include "base/message_loop/message_loop_proxy.h"
#include "base/platform_file.h"
#include "base/sequenced_task_runner.h"
#include "base/threading/sequenced_worker_pool.h"
#include "chrome/browser/media_galleries/fileapi/device_media_async_file_util.h"
#include "chrome/browser/media_galleries/fileapi/media_file_validator_factory.h"
#include "chrome/browser/media_galleries/fileapi/media_path_filter.h"
#include "chrome/browser/media_galleries/fileapi/native_media_file_util.h"
#include "content/public/browser/browser_thread.h"
#include "webkit/browser/blob/local_file_stream_reader.h"
#include "webkit/browser/fileapi/copy_or_move_file_validator.h"
#include "webkit/browser/fileapi/file_system_context.h"
#include "webkit/browser/fileapi/file_system_file_stream_reader.h"
#include "webkit/browser/fileapi/file_system_operation.h"
#include "webkit/browser/fileapi/file_system_operation_context.h"
#include "webkit/browser/fileapi/isolated_context.h"
#include "webkit/browser/fileapi/isolated_file_util.h"
#include "webkit/browser/fileapi/local_file_stream_writer.h"
#include "webkit/browser/fileapi/native_file_util.h"
#include "webkit/common/fileapi/file_system_types.h"
#include "webkit/common/fileapi/file_system_util.h"
#if defined(OS_WIN) || defined(OS_MACOSX)
#include "chrome/browser/media_galleries/fileapi/itunes_file_util.h"
#include "chrome/browser/media_galleries/fileapi/picasa_file_util.h"
#endif // defined(OS_WIN) || defined(OS_MACOSX)
using fileapi::FileSystemContext;
using fileapi::FileSystemURL;
namespace chrome {
const char MediaFileSystemBackend::kMediaTaskRunnerName[] =
"media-task-runner";
MediaFileSystemBackend::MediaFileSystemBackend(
const base::FilePath& profile_path,
base::SequencedTaskRunner* media_task_runner)
: profile_path_(profile_path),
media_task_runner_(media_task_runner),
media_path_filter_(new MediaPathFilter),
media_copy_or_move_file_validator_factory_(new MediaFileValidatorFactory),
native_media_file_util_(
new NativeMediaFileUtil(media_path_filter_.get())),
device_media_async_file_util_(
DeviceMediaAsyncFileUtil::Create(profile_path_))
#if defined(OS_WIN) || defined(OS_MACOSX)
,
picasa_file_util_(new picasa::PicasaFileUtil(media_path_filter_.get())),
itunes_file_util_(new itunes::ITunesFileUtil(media_path_filter_.get()))
#endif // defined(OS_WIN) || defined(OS_MACOSX)
{
}
MediaFileSystemBackend::~MediaFileSystemBackend() {
}
// static
bool MediaFileSystemBackend::CurrentlyOnMediaTaskRunnerThread() {
base::SequencedWorkerPool* pool = content::BrowserThread::GetBlockingPool();
base::SequencedWorkerPool::SequenceToken media_sequence_token =
pool->GetNamedSequenceToken(kMediaTaskRunnerName);
return pool->IsRunningSequenceOnCurrentThread(media_sequence_token);
}
// static
scoped_refptr<base::SequencedTaskRunner>
MediaFileSystemBackend::MediaTaskRunner() {
base::SequencedWorkerPool* pool = content::BrowserThread::GetBlockingPool();
base::SequencedWorkerPool::SequenceToken media_sequence_token =
pool->GetNamedSequenceToken(kMediaTaskRunnerName);
return pool->GetSequencedTaskRunner(media_sequence_token);
}
bool MediaFileSystemBackend::CanHandleType(
fileapi::FileSystemType type) const {
switch (type) {
case fileapi::kFileSystemTypeNativeMedia:
case fileapi::kFileSystemTypeDeviceMedia:
#if defined(OS_WIN) || defined(OS_MACOSX)
case fileapi::kFileSystemTypePicasa:
case fileapi::kFileSystemTypeItunes:
#endif // defined(OS_WIN) || defined(OS_MACOSX)
return true;
default:
return false;
}
}
void MediaFileSystemBackend::Initialize(fileapi::FileSystemContext* context) {
}
void MediaFileSystemBackend::OpenFileSystem(
const GURL& origin_url,
fileapi::FileSystemType type,
fileapi::OpenFileSystemMode mode,
const OpenFileSystemCallback& callback) {
// We never allow opening a new isolated FileSystem via usual OpenFileSystem.
base::MessageLoopProxy::current()->PostTask(
FROM_HERE,
base::Bind(callback,
GetFileSystemRootURI(origin_url, type),
GetFileSystemName(origin_url, type),
base::PLATFORM_FILE_ERROR_SECURITY));
}
fileapi::AsyncFileUtil* MediaFileSystemBackend::GetAsyncFileUtil(
fileapi::FileSystemType type) {
switch (type) {
case fileapi::kFileSystemTypeNativeMedia:
return native_media_file_util_.get();
case fileapi::kFileSystemTypeDeviceMedia:
return device_media_async_file_util_.get();
#if defined(OS_WIN) || defined(OS_MACOSX)
case fileapi::kFileSystemTypeItunes:
return itunes_file_util_.get();
case fileapi::kFileSystemTypePicasa:
return picasa_file_util_.get();
#endif // defined(OS_WIN) || defined(OS_MACOSX)
default:
NOTREACHED();
}
return NULL;
}
fileapi::CopyOrMoveFileValidatorFactory*
MediaFileSystemBackend::GetCopyOrMoveFileValidatorFactory(
fileapi::FileSystemType type, base::PlatformFileError* error_code) {
DCHECK(error_code);
*error_code = base::PLATFORM_FILE_OK;
switch (type) {
case fileapi::kFileSystemTypeNativeMedia:
case fileapi::kFileSystemTypeDeviceMedia:
case fileapi::kFileSystemTypeItunes:
if (!media_copy_or_move_file_validator_factory_) {
*error_code = base::PLATFORM_FILE_ERROR_SECURITY;
return NULL;
}
return media_copy_or_move_file_validator_factory_.get();
default:
NOTREACHED();
}
return NULL;
}
fileapi::FileSystemOperation*
MediaFileSystemBackend::CreateFileSystemOperation(
const FileSystemURL& url,
FileSystemContext* context,
base::PlatformFileError* error_code) const {
scoped_ptr<fileapi::FileSystemOperationContext> operation_context(
new fileapi::FileSystemOperationContext(
context, media_task_runner_.get()));
return fileapi::FileSystemOperation::Create(
url, context, operation_context.Pass());
}
scoped_ptr<webkit_blob::FileStreamReader>
MediaFileSystemBackend::CreateFileStreamReader(
const FileSystemURL& url,
int64 offset,
const base::Time& expected_modification_time,
FileSystemContext* context) const {
return scoped_ptr<webkit_blob::FileStreamReader>(
new webkit_blob::LocalFileStreamReader(
context->default_file_task_runner(),
url.path(), offset, expected_modification_time));
}
scoped_ptr<fileapi::FileStreamWriter>
MediaFileSystemBackend::CreateFileStreamWriter(
const FileSystemURL& url,
int64 offset,
FileSystemContext* context) const {
return scoped_ptr<fileapi::FileStreamWriter>(
new fileapi::LocalFileStreamWriter(
context->default_file_task_runner(),
url.path(), offset));
}
fileapi::FileSystemQuotaUtil*
MediaFileSystemBackend::GetQuotaUtil() {
// No quota support.
return NULL;
}
} // namespace chrome