- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / browser / chromeos / file_manager / mounted_disk_monitor.cc
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.
4
5 #include "chrome/browser/chromeos/file_manager/mounted_disk_monitor.h"
6
7 #include "base/bind.h"
8 #include "chromeos/dbus/power_manager_client.h"
9 #include "content/public/browser/browser_thread.h"
10
11 using chromeos::disks::DiskMountManager;
12
13 namespace file_manager {
14 namespace {
15
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);
20
21 }  // namespace
22
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),
28       is_resuming_(false),
29       resuming_time_span_(kResumingTimeSpan),
30       weak_factory_(this) {
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();
36 }
37
38 MountedDiskMonitor::~MountedDiskMonitor() {
39   disk_mount_manager_->RemoveObserver(this);
40   power_manager_client_->RemoveObserver(this);
41 }
42
43 void MountedDiskMonitor::SuspendImminent() {
44   is_resuming_ = false;
45   weak_factory_.InvalidateWeakPtrs();
46 }
47
48 void MountedDiskMonitor::SystemResumed(
49     const base::TimeDelta& sleep_duration) {
50   is_resuming_ = true;
51   // Undo any previous resets.
52   weak_factory_.InvalidateWeakPtrs();
53   base::MessageLoopProxy::current()->PostDelayedTask(
54       FROM_HERE,
55       base::Bind(&MountedDiskMonitor::Reset,
56                  weak_factory_.GetWeakPtr()),
57       resuming_time_span_);
58 }
59
60 bool MountedDiskMonitor::DiskIsRemounting(
61     const DiskMountManager::Disk& disk) const {
62   return unmounted_while_resuming_.count(disk.fs_uuid()) > 0;
63 }
64
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)
70     return;
71
72   switch (event) {
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)
77         return;
78       mounted_disks_[mount_info.source_path] = disk->fs_uuid();
79       break;
80     }
81
82     case DiskMountManager::UNMOUNTING: {
83       DiskMap::iterator it = mounted_disks_.find(mount_info.source_path);
84       if (it == mounted_disks_.end())
85         return;
86       const std::string& fs_uuid = it->second;
87       if (is_resuming_)
88         unmounted_while_resuming_.insert(fs_uuid);
89       mounted_disks_.erase(it);
90       break;
91     }
92   }
93 }
94
95 void MountedDiskMonitor::OnDiskEvent(
96     chromeos::disks::DiskMountManager::DiskEvent event,
97     const chromeos::disks::DiskMountManager::Disk* disk) {
98 }
99
100 void MountedDiskMonitor::OnDeviceEvent(
101     chromeos::disks::DiskMountManager::DeviceEvent event,
102     const std::string& device_path) {
103 }
104
105 void MountedDiskMonitor::OnFormatEvent(
106     chromeos::disks::DiskMountManager::FormatEvent event,
107     chromeos::FormatError error_code,
108     const std::string& device_path) {
109 }
110
111 void MountedDiskMonitor::Reset() {
112   unmounted_while_resuming_.clear();
113   is_resuming_ = false;
114 }
115
116 }  // namespace file_manager