1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "chrome/browser/chromeos/file_manager/mounted_disk_monitor.h"
8 #include "chromeos/dbus/power_manager_client.h"
9 #include "content/public/browser/browser_thread.h"
11 using chromeos::disks::DiskMountManager;
13 namespace file_manager {
16 // Time span of the resuming process. All unmount events sent during this
17 // time are considered as being part of remounting process, since remounting
18 // is done just after resuming.
19 const base::TimeDelta kResumingTimeSpan = base::TimeDelta::FromSeconds(5);
23 MountedDiskMonitor::MountedDiskMonitor(
24 chromeos::PowerManagerClient* power_manager_client,
25 chromeos::disks::DiskMountManager* disk_mount_manager)
26 : power_manager_client_(power_manager_client),
27 disk_mount_manager_(disk_mount_manager),
29 resuming_time_span_(kResumingTimeSpan),
31 DCHECK(power_manager_client_);
32 DCHECK(disk_mount_manager_);
33 power_manager_client_->AddObserver(this);
34 disk_mount_manager_->AddObserver(this);
35 disk_mount_manager_->RequestMountInfoRefresh();
38 MountedDiskMonitor::~MountedDiskMonitor() {
39 disk_mount_manager_->RemoveObserver(this);
40 power_manager_client_->RemoveObserver(this);
43 void MountedDiskMonitor::SuspendImminent() {
45 weak_factory_.InvalidateWeakPtrs();
48 void MountedDiskMonitor::SystemResumed(
49 const base::TimeDelta& sleep_duration) {
51 // Undo any previous resets.
52 weak_factory_.InvalidateWeakPtrs();
53 base::MessageLoopProxy::current()->PostDelayedTask(
55 base::Bind(&MountedDiskMonitor::Reset,
56 weak_factory_.GetWeakPtr()),
60 bool MountedDiskMonitor::DiskIsRemounting(
61 const DiskMountManager::Disk& disk) const {
62 return unmounted_while_resuming_.count(disk.fs_uuid()) > 0;
65 void MountedDiskMonitor::OnMountEvent(
66 chromeos::disks::DiskMountManager::MountEvent event,
67 chromeos::MountError error_code,
68 const chromeos::disks::DiskMountManager::MountPointInfo& mount_info) {
69 if (mount_info.mount_type != chromeos::MOUNT_TYPE_DEVICE)
73 case DiskMountManager::MOUNTING: {
74 const DiskMountManager::Disk* disk =
75 disk_mount_manager_->FindDiskBySourcePath(mount_info.source_path);
76 if (!disk || error_code != chromeos::MOUNT_ERROR_NONE)
78 mounted_disks_[mount_info.source_path] = disk->fs_uuid();
82 case DiskMountManager::UNMOUNTING: {
83 DiskMap::iterator it = mounted_disks_.find(mount_info.source_path);
84 if (it == mounted_disks_.end())
86 const std::string& fs_uuid = it->second;
88 unmounted_while_resuming_.insert(fs_uuid);
89 mounted_disks_.erase(it);
95 void MountedDiskMonitor::OnDiskEvent(
96 chromeos::disks::DiskMountManager::DiskEvent event,
97 const chromeos::disks::DiskMountManager::Disk* disk) {
100 void MountedDiskMonitor::OnDeviceEvent(
101 chromeos::disks::DiskMountManager::DeviceEvent event,
102 const std::string& device_path) {
105 void MountedDiskMonitor::OnFormatEvent(
106 chromeos::disks::DiskMountManager::FormatEvent event,
107 chromeos::FormatError error_code,
108 const std::string& device_path) {
111 void MountedDiskMonitor::Reset() {
112 unmounted_while_resuming_.clear();
113 is_resuming_ = false;
116 } // namespace file_manager