blob: a7dea9c028baab066f99458de65b2f7c8f669b31 [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/logging.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/isolated_context.h"
using base::Bind;
using fileapi::IsolatedContext;
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();
}
std::string ImportedMediaGalleryRegistry::RegisterPicasaFilesystemOnUIThread(
const base::FilePath& database_path) {
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
DCHECK(!database_path.empty());
std::string fsid;
#if defined(OS_WIN) || defined(OS_MACOSX)
fsid = IsolatedContext::GetInstance()->RegisterFileSystemForVirtualPath(
fileapi::kFileSystemTypePicasa,
extension_misc::kMediaFileSystemPathPart,
base::FilePath());
if (fsid.empty())
return fsid;
picasa_fsids_.insert(fsid);
if (picasa_fsids_.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 fsid;
}
std::string ImportedMediaGalleryRegistry::RegisterITunesFilesystemOnUIThread(
const base::FilePath& library_xml_path) {
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
DCHECK(!library_xml_path.empty());
std::string fsid;
#if defined(OS_WIN) || defined(OS_MACOSX)
fsid = IsolatedContext::GetInstance()->RegisterFileSystemForVirtualPath(
fileapi::kFileSystemTypeItunes,
extension_misc::kMediaFileSystemPathPart,
base::FilePath());
if (fsid.empty())
return fsid;
itunes_fsids_.insert(fsid);
if (itunes_fsids_.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 fsid;
}
bool ImportedMediaGalleryRegistry::RevokeImportedFilesystemOnUIThread(
const std::string& fsid) {
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
#if defined(OS_WIN) || defined(OS_MACOSX)
if (picasa_fsids_.erase(fsid)) {
if (picasa_fsids_.empty()) {
MediaFileSystemBackend::MediaTaskRunner()->PostTask(
FROM_HERE,
Bind(&ImportedMediaGalleryRegistry::RevokePicasaFileSystem,
base::Unretained(this)));
}
return IsolatedContext::GetInstance()->RevokeFileSystem(fsid);
}
if (itunes_fsids_.erase(fsid)) {
if (itunes_fsids_.empty()) {
MediaFileSystemBackend::MediaTaskRunner()->PostTask(
FROM_HERE,
Bind(&ImportedMediaGalleryRegistry::RevokeITunesFileSystem,
base::Unretained(this)));
}
return IsolatedContext::GetInstance()->RevokeFileSystem(fsid);
}
#endif // defined(OS_WIN) || defined(OS_MACOSX)
return false;
}
#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)
ImportedMediaGalleryRegistry::ImportedMediaGalleryRegistry() {}
ImportedMediaGalleryRegistry::~ImportedMediaGalleryRegistry() {
#if defined(OS_WIN) || defined(OS_MACOSX)
DCHECK_EQ(0U, picasa_fsids_.size());
DCHECK_EQ(0U, itunes_fsids_.size());
#endif // defined(OS_WIN) || 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)