| Index: base/system_monitor/system_monitor.cc
|
| diff --git a/base/system_monitor/system_monitor.cc b/base/system_monitor/system_monitor.cc
|
| index 2616275dfbc64db88abaa6abb0fa85e8cf561a7d..c71d70eec889c9a72052a3a436d8c2021305b780 100644
|
| --- a/base/system_monitor/system_monitor.cc
|
| +++ b/base/system_monitor/system_monitor.cc
|
| @@ -34,12 +34,13 @@ SystemMonitor::RemovableStorageInfo::RemovableStorageInfo(
|
| location(device_location) {
|
| }
|
|
|
| -SystemMonitor::SystemMonitor()
|
| +SystemMonitor::SystemMonitor(StorageFreeSpaceDelegate* delegate)
|
| : power_observer_list_(new ObserverListThreadSafe<PowerObserver>()),
|
| devices_changed_observer_list_(
|
| new ObserverListThreadSafe<DevicesChangedObserver>()),
|
| battery_in_use_(false),
|
| - suspended_(false) {
|
| + suspended_(false),
|
| + free_space_delegate_(delegate) {
|
| DCHECK(!g_system_monitor);
|
| g_system_monitor = this;
|
|
|
| @@ -127,6 +128,40 @@ void SystemMonitor::ProcessRemovableStorageDetached(const std::string& id) {
|
| NotifyRemovableStorageDetached(id);
|
| }
|
|
|
| +void SystemMonitor::ProcessStorageFreeSpaceChanged(const FilePath& path,
|
| + int64 available_capacity) {
|
| + DVLOG(1) << "Free Space Change: " << path.value() << " "
|
| + << available_capacity << " bytes";
|
| + scoped_refptr<StorageFreeSpaceObserverList> observers;
|
| + {
|
| + base::AutoLock lock(free_space_observers_lock_);
|
| + StorageFreeSpaceObserverListMap::iterator it =
|
| + free_space_observer_list_map_.find(path);
|
| + if (it == free_space_observer_list_map_.end())
|
| + return;
|
| + observers = it->second.observer_list;
|
| + }
|
| + if (observers.get())
|
| + observers->Notify(&StorageFreeSpaceObserver::OnFreeSpaceChanged,
|
| + path, available_capacity);
|
| +}
|
| +
|
| +void SystemMonitor::ProcessStorageFreeSpaceChangeError(const FilePath& path) {
|
| + DVLOG(1) << "Failed to watch free space change for " << path.value();
|
| + scoped_refptr<StorageFreeSpaceObserverList> observers;
|
| + {
|
| + base::AutoLock lock(free_space_observers_lock_);
|
| + StorageFreeSpaceObserverListMap::iterator it =
|
| + free_space_observer_list_map_.find(path);
|
| + if (it == free_space_observer_list_map_.end())
|
| + return;
|
| + observers = it->second.observer_list;
|
| + }
|
| + if (observers.get())
|
| + observers->Notify(&StorageFreeSpaceObserver::OnFreeSpaceChangeError,
|
| + path);
|
| +}
|
| +
|
| std::vector<SystemMonitor::RemovableStorageInfo>
|
| SystemMonitor::GetAttachedRemovableStorage() const {
|
| std::vector<RemovableStorageInfo> results;
|
| @@ -156,6 +191,65 @@ void SystemMonitor::RemoveDevicesChangedObserver(DevicesChangedObserver* obs) {
|
| devices_changed_observer_list_->RemoveObserver(obs);
|
| }
|
|
|
| +void SystemMonitor::AddStorageFreeSpaceObserver(const FilePath& path,
|
| + StorageFreeSpaceObserver* obs) {
|
| + DCHECK(free_space_delegate_ != NULL);
|
| + if (!free_space_delegate_)
|
| + return;
|
| + scoped_refptr<StorageFreeSpaceObserverList> observers;
|
| + {
|
| + base::AutoLock lock(free_space_observers_lock_);
|
| + // Try to start watching the given storage |path| if the first observer
|
| + // will be added.
|
| + StorageFreeSpaceObserverListMap::iterator iter =
|
| + free_space_observer_list_map_.find(path);
|
| + if (iter == free_space_observer_list_map_.end()) {
|
| + PathObserverPair pair;
|
| + pair.observer_list = observers = new StorageFreeSpaceObserverList;
|
| + pair.observer_set.insert(obs);
|
| + free_space_observer_list_map_.insert(std::make_pair(path, pair));
|
| + free_space_delegate_->StartWatchingStorage(path);
|
| + } else {
|
| + observers = iter->second.observer_list;
|
| + iter->second.observer_set.insert(obs);
|
| + }
|
| + }
|
| + observers->AddObserver(obs);
|
| +}
|
| +
|
| +void SystemMonitor::RemoveStorageFreeSpaceObserver(
|
| + const FilePath& path,
|
| + StorageFreeSpaceObserver* obs) {
|
| + DCHECK(free_space_delegate_ != NULL);
|
| + if (!free_space_delegate_)
|
| + return;
|
| + scoped_refptr<StorageFreeSpaceObserverList> observers;
|
| + {
|
| + base::AutoLock lock(free_space_observers_lock_);
|
| + StorageFreeSpaceObserverListMap::iterator iter =
|
| + free_space_observer_list_map_.find(path);
|
| + // In case of no observer is interested in the given storage |path|.
|
| + if (iter == free_space_observer_list_map_.end()) {
|
| + return;
|
| + }
|
| +
|
| + StorageFreeSpaceObserverSet::iterator sit
|
| + = iter->second.observer_set.find(obs);
|
| + // No the given observer is found.
|
| + if (sit == iter->second.observer_set.end())
|
| + return;
|
| + iter->second.observer_set.erase(sit);
|
| + // Try to stop watching in case of the last observer is removed.
|
| + if (iter->second.observer_set.size() == 0) {
|
| + free_space_delegate_->StopWatchingStorage(path);
|
| + free_space_observer_list_map_.erase(path);
|
| + return;
|
| + }
|
| + observers = iter->second.observer_list;
|
| + }
|
| + observers->RemoveObserver(obs);
|
| +}
|
| +
|
| void SystemMonitor::NotifyDevicesChanged(DeviceType device_type) {
|
| DVLOG(1) << "DevicesChanged with device type " << device_type;
|
| devices_changed_observer_list_->Notify(
|
|
|