blob: 5acc6b25b5d9da867edaa8a4fa2d280ed1f6d4d5 [file] [log] [blame]
// Copyright 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/imported_media_gallery_registry.h"
#include "base/bind.h"
#include "base/file_util.h"
#include "base/logging.h"
#include "chrome/browser/media_galleries/fileapi/iphoto_data_provider.h"
#include "chrome/browser/media_galleries/fileapi/itunes_data_provider.h"
#include "chrome/browser/media_galleries/fileapi/media_file_system_backend.h"
#include "chrome/browser/media_galleries/fileapi/picasa_data_provider.h"
#include "chrome/common/extensions/extension_constants.h"
#include "content/public/browser/browser_thread.h"
#include "webkit/browser/fileapi/external_mount_points.h"
#include "webkit/common/fileapi/file_system_mount_option.h"
using base::Bind;
using fileapi::ExternalMountPoints;
namespace {
static base::LazyInstance<ImportedMediaGalleryRegistry>::Leaky
g_imported_media_gallery_registry = LAZY_INSTANCE_INITIALIZER;
} // namespace
// static
ImportedMediaGalleryRegistry* ImportedMediaGalleryRegistry::GetInstance() {
return g_imported_media_gallery_registry.Pointer();
}
void ImportedMediaGalleryRegistry::Initialize() {
base::ThreadRestrictions::AssertIOAllowed();
if (imported_root_.empty()) {
if (!base::CreateTemporaryFile(&imported_root_))
imported_root_ = base::FilePath();
// TODO(vandebo) Setting the permissions of |imported_root_| in CPSP to
// zero would be an extra step to ensure permissions are correctly
// enforced.
}
}
bool ImportedMediaGalleryRegistry::RegisterPicasaFilesystemOnUIThread(
const std::string& fs_name, const base::FilePath& database_path) {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
DCHECK(!fs_name.empty());
DCHECK(!database_path.empty());
bool result = false;
#if defined(OS_WIN) || defined(OS_MACOSX)
base::FilePath root = ImportedRoot();
if (root.empty())
return false;
result = ExternalMountPoints::GetSystemInstance()->RegisterFileSystem(
fs_name, fileapi::kFileSystemTypePicasa, fileapi::FileSystemMountOption(),
root.AppendASCII("picasa"));
if (!result)
return result;
picasa_fs_names_.insert(fs_name);
if (picasa_fs_names_.size() == 1) {
MediaFileSystemBackend::MediaTaskRunner()->PostTask(
FROM_HERE,
Bind(&ImportedMediaGalleryRegistry::RegisterPicasaFileSystem,
base::Unretained(this), database_path));
#ifndef NDEBUG
picasa_database_path_ = database_path;
} else {
DCHECK_EQ(picasa_database_path_.value(), database_path.value());
#endif
}
#endif // defined(OS_WIN) || defined(OS_MACOSX)
return result;
}
bool ImportedMediaGalleryRegistry::RegisterITunesFilesystemOnUIThread(
const std::string& fs_name, const base::FilePath& library_xml_path) {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
DCHECK(!library_xml_path.empty());
bool result = false;
#if defined(OS_WIN) || defined(OS_MACOSX)
base::FilePath root = ImportedRoot();
if (root.empty())
return false;
result = ExternalMountPoints::GetSystemInstance()->RegisterFileSystem(
fs_name, fileapi::kFileSystemTypeItunes, fileapi::FileSystemMountOption(),
root.AppendASCII("itunes"));
if (!result)
return result;
itunes_fs_names_.insert(fs_name);
if (itunes_fs_names_.size() == 1) {
MediaFileSystemBackend::MediaTaskRunner()->PostTask(
FROM_HERE,
Bind(&ImportedMediaGalleryRegistry::RegisterITunesFileSystem,
base::Unretained(this), library_xml_path));
#ifndef NDEBUG
itunes_xml_library_path_ = library_xml_path;
} else {
DCHECK_EQ(itunes_xml_library_path_.value(), library_xml_path.value());
#endif
}
#endif // defined(OS_WIN) || defined(OS_MACOSX)
return result;
}
bool ImportedMediaGalleryRegistry::RegisterIPhotoFilesystemOnUIThread(
const std::string& fs_name, const base::FilePath& library_xml_path) {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
DCHECK(!library_xml_path.empty());
bool result = false;
// TODO(gbillock): Investigate how to refactor this to reduce duplicated
// code.
#if defined(OS_MACOSX)
base::FilePath root = ImportedRoot();
if (root.empty())
return false;
result = ExternalMountPoints::GetSystemInstance()->RegisterFileSystem(
fs_name, fileapi::kFileSystemTypeIphoto, fileapi::FileSystemMountOption(),
root.AppendASCII("iphoto"));
if (!result)
return result;
iphoto_fs_names_.insert(fs_name);
if (iphoto_fs_names_.size() == 1) {
MediaFileSystemBackend::MediaTaskRunner()->PostTask(
FROM_HERE,
Bind(&ImportedMediaGalleryRegistry::RegisterIPhotoFileSystem,
base::Unretained(this), library_xml_path));
#ifndef NDEBUG
iphoto_xml_library_path_ = library_xml_path;
} else {
DCHECK_EQ(iphoto_xml_library_path_.value(), library_xml_path.value());
#endif
}
#endif // defined(OS_MACOSX)
return result;
}
bool ImportedMediaGalleryRegistry::RevokeImportedFilesystemOnUIThread(
const std::string& fs_name) {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
#if defined(OS_WIN) || defined(OS_MACOSX)
if (picasa_fs_names_.erase(fs_name)) {
if (picasa_fs_names_.empty()) {
MediaFileSystemBackend::MediaTaskRunner()->PostTask(
FROM_HERE,
Bind(&ImportedMediaGalleryRegistry::RevokePicasaFileSystem,
base::Unretained(this)));
}
return ExternalMountPoints::GetSystemInstance()->RevokeFileSystem(fs_name);
}
if (itunes_fs_names_.erase(fs_name)) {
if (itunes_fs_names_.empty()) {
MediaFileSystemBackend::MediaTaskRunner()->PostTask(
FROM_HERE,
Bind(&ImportedMediaGalleryRegistry::RevokeITunesFileSystem,
base::Unretained(this)));
}
return ExternalMountPoints::GetSystemInstance()->RevokeFileSystem(fs_name);
}
#endif // defined(OS_WIN) || defined(OS_MACOSX)
#if defined(OS_MACOSX)
if (iphoto_fs_names_.erase(fs_name)) {
if (iphoto_fs_names_.empty()) {
MediaFileSystemBackend::MediaTaskRunner()->PostTask(
FROM_HERE,
Bind(&ImportedMediaGalleryRegistry::RevokeIPhotoFileSystem,
base::Unretained(this)));
}
return ExternalMountPoints::GetSystemInstance()->RevokeFileSystem(fs_name);
}
#endif // defined(OS_MACOSX)
return false;
}
base::FilePath ImportedMediaGalleryRegistry::ImportedRoot() {
DCHECK(!imported_root_.empty());
return imported_root_;
}
#if defined(OS_WIN) || defined(OS_MACOSX)
// static
picasa::PicasaDataProvider*
ImportedMediaGalleryRegistry::PicasaDataProvider() {
DCHECK(MediaFileSystemBackend::CurrentlyOnMediaTaskRunnerThread());
DCHECK(GetInstance()->picasa_data_provider_);
return GetInstance()->picasa_data_provider_.get();
}
// static
itunes::ITunesDataProvider*
ImportedMediaGalleryRegistry::ITunesDataProvider() {
DCHECK(MediaFileSystemBackend::CurrentlyOnMediaTaskRunnerThread());
DCHECK(GetInstance()->itunes_data_provider_);
return GetInstance()->itunes_data_provider_.get();
}
#endif // defined(OS_WIN) || defined(OS_MACOSX)
#if defined(OS_MACOSX)
// static
iphoto::IPhotoDataProvider*
ImportedMediaGalleryRegistry::IPhotoDataProvider() {
DCHECK(MediaFileSystemBackend::CurrentlyOnMediaTaskRunnerThread());
DCHECK(GetInstance()->iphoto_data_provider_);
return GetInstance()->iphoto_data_provider_.get();
}
#endif // defined(OS_MACOSX)
ImportedMediaGalleryRegistry::ImportedMediaGalleryRegistry() {}
ImportedMediaGalleryRegistry::~ImportedMediaGalleryRegistry() {
if (!imported_root_.empty())
base::DeleteFile(imported_root_, false);
#if defined(OS_WIN) || defined(OS_MACOSX)
DCHECK_EQ(0U, picasa_fs_names_.size());
DCHECK_EQ(0U, itunes_fs_names_.size());
#endif // defined(OS_WIN) || defined(OS_MACOSX)
#if defined(OS_MACOSX)
DCHECK_EQ(0U, iphoto_fs_names_.size());
#endif // defined(OS_MACOSX)
}
#if defined(OS_WIN) || defined(OS_MACOSX)
void ImportedMediaGalleryRegistry::RegisterPicasaFileSystem(
const base::FilePath& database_path) {
DCHECK(MediaFileSystemBackend::CurrentlyOnMediaTaskRunnerThread());
DCHECK(!picasa_data_provider_);
picasa_data_provider_.reset(new picasa::PicasaDataProvider(database_path));
}
void ImportedMediaGalleryRegistry::RevokePicasaFileSystem() {
DCHECK(MediaFileSystemBackend::CurrentlyOnMediaTaskRunnerThread());
DCHECK(picasa_data_provider_);
picasa_data_provider_.reset();
}
void ImportedMediaGalleryRegistry::RegisterITunesFileSystem(
const base::FilePath& xml_library_path) {
DCHECK(MediaFileSystemBackend::CurrentlyOnMediaTaskRunnerThread());
DCHECK(!itunes_data_provider_);
itunes_data_provider_.reset(new itunes::ITunesDataProvider(xml_library_path));
}
void ImportedMediaGalleryRegistry::RevokeITunesFileSystem() {
DCHECK(MediaFileSystemBackend::CurrentlyOnMediaTaskRunnerThread());
DCHECK(itunes_data_provider_);
itunes_data_provider_.reset();
}
#endif // defined(OS_WIN) || defined(OS_MACOSX)
#if defined(OS_MACOSX)
void ImportedMediaGalleryRegistry::RegisterIPhotoFileSystem(
const base::FilePath& xml_library_path) {
DCHECK(MediaFileSystemBackend::CurrentlyOnMediaTaskRunnerThread());
DCHECK(!iphoto_data_provider_);
iphoto_data_provider_.reset(new iphoto::IPhotoDataProvider(xml_library_path));
}
void ImportedMediaGalleryRegistry::RevokeIPhotoFileSystem() {
DCHECK(MediaFileSystemBackend::CurrentlyOnMediaTaskRunnerThread());
DCHECK(iphoto_data_provider_);
iphoto_data_provider_.reset();
}
#endif // defined(OS_MACOSX)