Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(650)

Unified Diff: chrome/browser/chromeos/file_system_provider/service.cc

Issue 1093383002: [WIP] Provided file system from NACL. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Various cleanups Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/chromeos/file_system_provider/service.cc
diff --git a/chrome/browser/chromeos/file_system_provider/service.cc b/chrome/browser/chromeos/file_system_provider/service.cc
index b764523b2ff4bf2cd1d207d6e7a41dcee8866c12..c9f486dcc8a7b3ea65141839eefe950dfbf4c0dd 100644
--- a/chrome/browser/chromeos/file_system_provider/service.cc
+++ b/chrome/browser/chromeos/file_system_provider/service.cc
@@ -33,12 +33,13 @@ namespace {
const size_t kMaxFileSystems = 16;
// Default factory for provided file systems. |profile| must not be NULL.
+template <int source = Source_Type::extension>
ProvidedFileSystemInterface* CreateProvidedFileSystem(
Profile* profile,
const ProvidedFileSystemInfo& file_system_info) {
DCHECK(profile);
- return new ThrottledFileSystem(
- make_scoped_ptr(new ProvidedFileSystem(profile, file_system_info)));
+ return new ThrottledFileSystem(make_scoped_ptr(
+ new ProvidedFileSystem<source>(profile, file_system_info)));
}
} // namespace
@@ -54,7 +55,8 @@ Service::Service(Profile* profile,
extensions::ExtensionRegistry* extension_registry)
: profile_(profile),
extension_registry_(extension_registry),
- file_system_factory_(base::Bind(&CreateProvidedFileSystem)),
+ file_system_factory_(
+ base::Bind(&CreateProvidedFileSystem<Source_Type::extension>)),
registry_(new Registry(profile)),
weak_ptr_factory_(this) {
extension_registry_->AddObserver(this);
@@ -71,11 +73,11 @@ Service::~Service() {
while (it != file_system_map_.end()) {
const std::string file_system_id =
it->second->GetFileSystemInfo().file_system_id();
- const std::string extension_id =
- it->second->GetFileSystemInfo().extension_id();
+ const std::string source_id =
+ it->second->GetFileSystemInfo().source_id();
++it;
const base::File::Error unmount_result = UnmountFileSystem(
- extension_id, file_system_id, UNMOUNT_REASON_SHUTDOWN);
+ source_id, file_system_id, UNMOUNT_REASON_SHUTDOWN);
DCHECK_EQ(base::File::FILE_OK, unmount_result);
}
@@ -109,20 +111,28 @@ void Service::SetRegistryForTesting(scoped_ptr<RegistryInterface> registry) {
registry_.reset(registry.release());
}
-base::File::Error Service::MountFileSystem(const std::string& extension_id,
- const MountOptions& options) {
- return MountFileSystemInternal(extension_id, options, MOUNT_CONTEXT_USER);
+base::File::Error Service::MountFileSystem(const std::string& source_id,
+ const MountOptions& options,
+ Source_Type source_type) {
+ switch (source_type) {
+ case Source_Type::extension:
+ case Source_Type::plugin:
+ return MountFileSystemInternal(source_id, options, MOUNT_CONTEXT_USER,
+ source_type);
+ default:
+ return base::File::Error::FILE_ERROR_INVALID_OPERATION;
+ }
}
-base::File::Error Service::MountFileSystemInternal(
- const std::string& extension_id,
- const MountOptions& options,
- MountContext context) {
+base::File::Error Service::MountFileSystemInternal(const std::string& source_id,
+ const MountOptions& options,
+ MountContext context,
+ Source_Type source_type) {
DCHECK(thread_checker_.CalledOnValidThread());
- // If already exists a file system provided by the same extension with this
+ // If already exists a file system provided by the same source with this
// id, then abort.
- if (GetProvidedFileSystem(extension_id, options.file_system_id)) {
+ if (GetProvidedFileSystem(source_id, options.file_system_id)) {
FOR_EACH_OBSERVER(
Observer, observers_,
OnProvidedFileSystemMount(ProvidedFileSystemInfo(), context,
@@ -146,7 +156,7 @@ base::File::Error Service::MountFileSystemInternal(
// The mount point path and name are unique per system, since they are system
// wide. This is necessary for copying between profiles.
const base::FilePath& mount_path =
- util::GetMountPath(profile_, extension_id, options.file_system_id);
+ util::GetMountPath(profile_, source_id, options.file_system_id);
const std::string mount_point_name = mount_path.BaseName().AsUTF8Unsafe();
if (!mount_points->RegisterFileSystem(
@@ -169,16 +179,28 @@ base::File::Error Service::MountFileSystemInternal(
// writable = false
// supports_notify_tag = false
// mount_path = /provided/b33f1337-hello_world-5aa5
- ProvidedFileSystemInfo file_system_info(extension_id, options, mount_path);
-
- ProvidedFileSystemInterface* file_system =
- file_system_factory_.Run(profile_, file_system_info);
+ ProvidedFileSystemInfo file_system_info(source_id, options, mount_path,
+ source_type);
+
+ ProvidedFileSystemInterface* file_system = NULL;
+ switch (source_type) {
+ case Source_Type::extension: // file_system from extension
+ file_system = file_system_factory_.Run(profile_, file_system_info);
+ break;
+ case Source_Type::plugin: // file_system from plugin
+ file_system = CreateProvidedFileSystem<Source_Type::plugin>(
+ profile_, file_system_info);
+ break;
+ }
DCHECK(file_system);
- file_system_map_[FileSystemKey(extension_id, options.file_system_id)] =
+ file_system_map_[FileSystemKey(source_id, options.file_system_id)] =
file_system;
mount_point_name_to_key_map_[mount_point_name] =
- FileSystemKey(extension_id, options.file_system_id);
- registry_->RememberFileSystem(file_system_info, *file_system->GetWatchers());
+ FileSystemKey(source_id, options.file_system_id);
+
+ if (source_type == Source_Type::extension)
+ registry_->RememberFileSystem(file_system_info,
+ *file_system->GetWatchers());
FOR_EACH_OBSERVER(Observer, observers_,
OnProvidedFileSystemMount(file_system_info, context,
@@ -187,13 +209,13 @@ base::File::Error Service::MountFileSystemInternal(
return base::File::FILE_OK;
}
-base::File::Error Service::UnmountFileSystem(const std::string& extension_id,
+base::File::Error Service::UnmountFileSystem(const std::string& source_id,
const std::string& file_system_id,
UnmountReason reason) {
DCHECK(thread_checker_.CalledOnValidThread());
const ProvidedFileSystemMap::iterator file_system_it =
- file_system_map_.find(FileSystemKey(extension_id, file_system_id));
+ file_system_map_.find(FileSystemKey(source_id, file_system_id));
if (file_system_it == file_system_map_.end()) {
const ProvidedFileSystemInfo empty_file_system_info;
FOR_EACH_OBSERVER(
@@ -229,8 +251,9 @@ base::File::Error Service::UnmountFileSystem(const std::string& extension_id,
mount_point_name_to_key_map_.erase(mount_point_name);
- if (reason == UNMOUNT_REASON_USER) {
- registry_->ForgetFileSystem(file_system_info.extension_id(),
+ if (reason == UNMOUNT_REASON_USER &&
+ file_system_info.source_type()!=Source_Type::plugin) {
+ registry_->ForgetFileSystem(file_system_info.source_id(),
file_system_info.file_system_id());
}

Powered by Google App Engine
This is Rietveld 408576698