#include "chrome/browser/chromeos/file_system_provider/observer.h"
#include "chrome/browser/chromeos/file_system_provider/provided_file_system.h"
#include "chrome/browser/chromeos/file_system_provider/provided_file_system_info.h"
-#include "chrome/browser/chromeos/file_system_provider/provided_file_system_interface.h"
+#include "chrome/browser/chromeos/file_system_provider/registry.h"
+#include "chrome/browser/chromeos/file_system_provider/registry_interface.h"
#include "chrome/browser/chromeos/file_system_provider/service_factory.h"
-#include "chrome/common/pref_names.h"
-#include "components/pref_registry/pref_registry_syncable.h"
#include "extensions/browser/extension_registry.h"
#include "extensions/browser/extension_system.h"
#include "storage/browser/fileapi/external_mount_points.h"
} // namespace
-const char kPrefKeyFileSystemId[] = "file-system-id";
-const char kPrefKeyDisplayName[] = "display-name";
-const char kPrefKeyWritable[] = "writable";
-
-void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry) {
- registry->RegisterDictionaryPref(
- prefs::kFileSystemProviderMounted,
- user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
-}
-
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)),
+ registry_(new Registry(profile)),
weak_ptr_factory_(this) {
extension_registry_->AddObserver(this);
}
file_system_factory_ = factory_callback;
}
+void Service::SetRegistryForTesting(scoped_ptr<RegistryInterface> registry) {
+ DCHECK(registry);
+ registry_.reset(registry.release());
+}
+
bool Service::MountFileSystem(const std::string& extension_id,
- const std::string& file_system_id,
- const std::string& display_name,
- bool writable) {
+ const MountOptions& options) {
DCHECK(thread_checker_.CalledOnValidThread());
// If already exists a file system provided by the same extension with this
// id, then abort.
- if (GetProvidedFileSystem(extension_id, file_system_id)) {
+ if (GetProvidedFileSystem(extension_id, options.file_system_id)) {
FOR_EACH_OBSERVER(Observer,
observers_,
OnProvidedFileSystemMount(ProvidedFileSystemInfo(),
// 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, file_system_id);
+ util::GetMountPath(profile_, extension_id, options.file_system_id);
const std::string mount_point_name = mount_path.BaseName().AsUTF8Unsafe();
if (!mount_points->RegisterFileSystem(mount_point_name,
// file_system_id = hello_world
// mount_point_name = b33f1337-hello_world-5aa5
// writable = false
+ // supports_notify_tag = false
// mount_path = /provided/b33f1337-hello_world-5aa5
- ProvidedFileSystemInfo file_system_info(
- extension_id, file_system_id, display_name, writable, mount_path);
+ ProvidedFileSystemInfo file_system_info(extension_id, options, mount_path);
ProvidedFileSystemInterface* file_system =
file_system_factory_.Run(profile_, file_system_info);
DCHECK(file_system);
- file_system_map_[FileSystemKey(extension_id, file_system_id)] = file_system;
+ file_system_map_[FileSystemKey(extension_id, options.file_system_id)] =
+ file_system;
mount_point_name_to_key_map_[mount_point_name] =
- FileSystemKey(extension_id, file_system_id);
- RememberFileSystem(file_system_info);
+ FileSystemKey(extension_id, options.file_system_id);
+ registry_->RememberFileSystem(file_system_info, *file_system->GetWatchers());
FOR_EACH_OBSERVER(
Observer,
mount_point_name_to_key_map_.erase(mount_point_name);
if (reason == UNMOUNT_REASON_USER) {
- ForgetFileSystem(file_system_info.extension_id(),
- file_system_info.file_system_id());
+ registry_->ForgetFileSystem(file_system_info.extension_id(),
+ file_system_info.file_system_id());
}
delete file_system_it->second;
void Service::OnExtensionLoaded(content::BrowserContext* browser_context,
const extensions::Extension* extension) {
- RestoreFileSystems(extension->id());
+ scoped_ptr<RegistryInterface::RestoredFileSystems> restored_file_systems =
+ registry_->RestoreFileSystems(extension->id());
+
+ for (const auto& restored_file_system : *restored_file_systems) {
+ const bool result = MountFileSystem(restored_file_system.extension_id,
+ restored_file_system.options);
+ if (!result) {
+ LOG(ERROR) << "Failed to restore a provided file system from "
+ << "registry: " << restored_file_system.extension_id << ", "
+ << restored_file_system.options.file_system_id << ", "
+ << restored_file_system.options.display_name << ".";
+ // Since remounting of the file system failed, then remove it from
+ // preferences to avoid remounting it over and over again with a failure.
+ registry_->ForgetFileSystem(restored_file_system.extension_id,
+ restored_file_system.options.file_system_id);
+ continue;
+ }
+
+ ProvidedFileSystemInterface* const file_system =
+ GetProvidedFileSystem(restored_file_system.extension_id,
+ restored_file_system.options.file_system_id);
+ DCHECK(file_system);
+ file_system->GetWatchers()->insert(restored_file_system.watchers.begin(),
+ restored_file_system.watchers.end());
+ }
}
ProvidedFileSystemInterface* Service::GetProvidedFileSystem(
}
}
-void Service::RememberFileSystem(
- const ProvidedFileSystemInfo& file_system_info) {
- base::DictionaryValue* file_system = new base::DictionaryValue();
- file_system->SetStringWithoutPathExpansion(kPrefKeyFileSystemId,
- file_system_info.file_system_id());
- file_system->SetStringWithoutPathExpansion(kPrefKeyDisplayName,
- file_system_info.display_name());
- file_system->SetBooleanWithoutPathExpansion(kPrefKeyWritable,
- file_system_info.writable());
-
- PrefService* const pref_service = profile_->GetPrefs();
- DCHECK(pref_service);
-
- DictionaryPrefUpdate dict_update(pref_service,
- prefs::kFileSystemProviderMounted);
-
- base::DictionaryValue* file_systems_per_extension = NULL;
- if (!dict_update->GetDictionaryWithoutPathExpansion(
- file_system_info.extension_id(), &file_systems_per_extension)) {
- file_systems_per_extension = new base::DictionaryValue();
- dict_update->SetWithoutPathExpansion(file_system_info.extension_id(),
- file_systems_per_extension);
- }
-
- file_systems_per_extension->SetWithoutPathExpansion(
- file_system_info.file_system_id(), file_system);
+void Service::OnWatcherChanged(const ProvidedFileSystemInfo& file_system_info,
+ const Watcher& watcher,
+ storage::WatcherManager::ChangeType change_type,
+ const Changes& changes,
+ const base::Closure& callback) {
+ callback.Run();
}
-void Service::ForgetFileSystem(const std::string& extension_id,
- const std::string& file_system_id) {
+void Service::OnWatcherTagUpdated(
+ const ProvidedFileSystemInfo& file_system_info,
+ const Watcher& watcher) {
PrefService* const pref_service = profile_->GetPrefs();
DCHECK(pref_service);
- DictionaryPrefUpdate dict_update(pref_service,
- prefs::kFileSystemProviderMounted);
-
- base::DictionaryValue* file_systems_per_extension = NULL;
- if (!dict_update->GetDictionaryWithoutPathExpansion(
- extension_id, &file_systems_per_extension))
- return; // Nothing to forget.
-
- file_systems_per_extension->RemoveWithoutPathExpansion(file_system_id, NULL);
- if (!file_systems_per_extension->size())
- dict_update->Remove(extension_id, NULL);
+ registry_->UpdateWatcherTag(file_system_info, watcher);
}
-void Service::RestoreFileSystems(const std::string& extension_id) {
- PrefService* const pref_service = profile_->GetPrefs();
- DCHECK(pref_service);
-
- const base::DictionaryValue* const file_systems =
- pref_service->GetDictionary(prefs::kFileSystemProviderMounted);
- DCHECK(file_systems);
-
- const base::DictionaryValue* file_systems_per_extension = NULL;
- if (!file_systems->GetDictionaryWithoutPathExpansion(
- extension_id, &file_systems_per_extension))
- return; // Nothing to restore.
-
- // Use a copy of the dictionary, since the original one may be modified while
- // iterating over it.
- scoped_ptr<const base::DictionaryValue> file_systems_per_extension_copy(
- file_systems_per_extension->DeepCopy());
-
- for (base::DictionaryValue::Iterator it(*file_systems_per_extension_copy);
- !it.IsAtEnd();
- it.Advance()) {
- const base::Value* file_system_value = NULL;
- const base::DictionaryValue* file_system = NULL;
- file_systems_per_extension_copy->GetWithoutPathExpansion(
- it.key(), &file_system_value);
- DCHECK(file_system_value);
-
- std::string file_system_id;
- std::string display_name;
- bool writable;
-
- if (!file_system_value->GetAsDictionary(&file_system) ||
- !file_system->GetStringWithoutPathExpansion(kPrefKeyFileSystemId,
- &file_system_id) ||
- !file_system->GetStringWithoutPathExpansion(kPrefKeyDisplayName,
- &display_name) ||
- !file_system->GetBooleanWithoutPathExpansion(kPrefKeyWritable,
- &writable) ||
- file_system_id.empty() || display_name.empty()) {
- LOG(ERROR)
- << "Malformed provided file system information in preferences.";
- continue;
- }
-
- const bool result =
- MountFileSystem(extension_id, file_system_id, display_name, writable);
- if (!result) {
- LOG(ERROR) << "Failed to restore a provided file system from "
- << "preferences: " << extension_id << ", " << file_system_id
- << ", " << display_name << ".";
- // Since remounting of the file system failed, then remove it from
- // preferences to avoid remounting it over and over again with a failure.
- ForgetFileSystem(extension_id, file_system_id);
- }
- }
+void Service::OnWatcherListChanged(
+ const ProvidedFileSystemInfo& file_system_info,
+ const Watchers& watchers) {
+ registry_->RememberFileSystem(file_system_info, watchers);
}
} // namespace file_system_provider