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

Unified Diff: chrome/browser/chromeos/extensions/file_manager/device_event_router.cc

Issue 472603004: Add DeviceEventRouter class. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Remove PostDelayedTask viertual function Created 6 years, 4 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/extensions/file_manager/device_event_router.cc
diff --git a/chrome/browser/chromeos/extensions/file_manager/device_event_router.cc b/chrome/browser/chromeos/extensions/file_manager/device_event_router.cc
new file mode 100644
index 0000000000000000000000000000000000000000..c299ac9dc73dd29086f1a3b1aa73becbbad12646
--- /dev/null
+++ b/chrome/browser/chromeos/extensions/file_manager/device_event_router.cc
@@ -0,0 +1,189 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/bind.h"
+#include "chrome/browser/chromeos/extensions/file_manager/device_event_router.h"
+#include "chrome/browser/chromeos/file_manager/volume_manager.h"
+#include "content/public/browser/browser_thread.h"
+
+namespace file_manager {
+namespace {
+namespace file_browser_private = extensions::api::file_browser_private;
+using content::BrowserThread;
+const base::TimeDelta kStartupTimeSpan = base::TimeDelta::FromSeconds(10);
+const base::TimeDelta kScanReportTimeSpan = base::TimeDelta::FromSeconds(5);
+const base::TimeDelta kResumingTimeSpan = base::TimeDelta::FromSeconds(5);
+} // namespace
+
+DeviceEventRouter::DeviceEventRouter(bool zero_time_delta)
+ : zero_time_delta_(zero_time_delta),
+ is_starting_up_(false),
+ is_resuming_(false),
+ weak_factory_(this) {
+}
+
+DeviceEventRouter::~DeviceEventRouter() {
+}
+
+void DeviceEventRouter::Startup() {
+ is_starting_up_ = true;
+ PostDelayedTask(base::Bind(&DeviceEventRouter::StartupDelayed,
mtomasz 2014/08/21 08:32:46 Is this PostDelayedTask method needed?
hirono 2014/08/21 08:48:32 This is a helper method to call MessageLoop::PostD
mtomasz 2014/08/22 04:50:10 Do we really need it? All it does is to determine
hirono 2014/08/22 05:32:17 Does not have strong idea. It looks 1 helper metho
+ weak_factory_.GetWeakPtr()),
+ kStartupTimeSpan);
+}
+
+void DeviceEventRouter::StartupDelayed() {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
+ is_starting_up_ = false;
+}
+
+void DeviceEventRouter::OnDeviceAdded(const std::string& device_path) {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
+
+ if (is_starting_up_ || is_resuming_) {
+ SetDeviceState(device_path, DEVICE_STATE_USUAL);
+ return;
+ }
+
+ if (IsExternalStorageDisabled()) {
+ OnDeviceEvent(file_browser_private::DEVICE_EVENT_TYPE_DISABLED,
+ device_path);
+ SetDeviceState(device_path, DEVICE_STATE_USUAL);
+ return;
+ }
+
+ SetDeviceState(device_path, DEVICE_SCANNED);
+ PostDelayedTask(base::Bind(&DeviceEventRouter::OnDeviceAddedDelayed,
+ weak_factory_.GetWeakPtr(),
+ device_path),
+ kScanReportTimeSpan);
+}
+
+void DeviceEventRouter::OnDeviceAddedDelayed(const std::string& device_path) {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
+
+ if (GetDeviceState(device_path) == DEVICE_SCANNED) {
+ // TODO(hirono): Rename DEVICE_EVENT_TYPE_ADDED with
+ // DEVICE_EVENT_TYPE_SCAN_STARTED.
+ OnDeviceEvent(file_browser_private::DEVICE_EVENT_TYPE_ADDED, device_path);
+ SetDeviceState(device_path, DEVICE_SCANNED_AND_REPORTED);
+ }
+}
+
+void DeviceEventRouter::OnDeviceRemoved(const std::string& device_path) {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
+ SetDeviceState(device_path, DEVICE_STATE_USUAL);
+ OnDeviceEvent(file_browser_private::DEVICE_EVENT_TYPE_REMOVED, device_path);
+}
+
+void DeviceEventRouter::OnDiskAdded(
+ const chromeos::disks::DiskMountManager::Disk& disk,
+ bool mounting) {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
+
+ if (!mounting) {
+ // If the disk is not being mounted, mark the device scan cancelled.
+ const std::string& device_path = disk.system_path_prefix();
+ if (GetDeviceState(device_path) == DEVICE_SCANNED_AND_REPORTED) {
+ OnDeviceEvent(file_browser_private::DEVICE_EVENT_TYPE_SCAN_CANCELED,
+ device_path);
+ }
+ SetDeviceState(device_path, DEVICE_STATE_USUAL);
+ }
+}
+
+void DeviceEventRouter::OnDiskRemoved(
+ const chromeos::disks::DiskMountManager::Disk& disk) {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
+ if (is_resuming_ || is_starting_up_)
+ return;
+
+ const std::string& device_path = disk.system_path_prefix();
+ if (!disk.mount_path().empty() &&
+ GetDeviceState(device_path) != DEVICE_HARD_UNPLUGGED_AND_REPORTED) {
+ OnDeviceEvent(file_browser_private::DEVICE_EVENT_TYPE_HARD_UNPLUGGED,
+ device_path);
+ SetDeviceState(device_path, DEVICE_HARD_UNPLUGGED_AND_REPORTED);
+ }
+}
+
+void DeviceEventRouter::OnVolumeMounted(chromeos::MountError error_code,
+ const VolumeInfo& volume_info,
+ bool is_remounting) {
+ const std::string& device_path =
+ volume_info.system_path_prefix.AsUTF8Unsafe();
+ SetDeviceState(device_path, DEVICE_STATE_USUAL);
+}
+
+void DeviceEventRouter::OnVolumeUnmounted(chromeos::MountError error_code,
+ const VolumeInfo& volume_info) {
+ // Do nothing.
+}
+
+void DeviceEventRouter::OnFormatStarted(const std::string& device_path,
+ bool success) {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
+
+ if (success) {
+ OnDeviceEvent(file_browser_private::DEVICE_EVENT_TYPE_FORMAT_START,
+ device_path);
+ } else {
+ OnDeviceEvent(file_browser_private::DEVICE_EVENT_TYPE_FORMAT_FAIL,
+ device_path);
+ }
+}
+
+void DeviceEventRouter::OnFormatCompleted(const std::string& device_path,
+ bool success) {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
+ OnDeviceEvent(success ? file_browser_private::DEVICE_EVENT_TYPE_FORMAT_SUCCESS
+ : file_browser_private::DEVICE_EVENT_TYPE_FORMAT_FAIL,
+ device_path);
+}
+
+void DeviceEventRouter::OnHardUnplugged(const std::string& device_path) {
+}
+
+void DeviceEventRouter::SuspendImminent() {
+ is_resuming_ = true;
+}
+
+void DeviceEventRouter::SuspendDone(const base::TimeDelta& sleep_duration) {
+ base::MessageLoopProxy::current()->PostDelayedTask(
mtomasz 2014/08/21 08:32:46 MessageLoopProxy is deprecated. Please use ThreadT
hirono 2014/08/21 08:48:32 Done.
+ FROM_HERE,
+ base::Bind(&DeviceEventRouter::SuspendDoneDelayed,
+ weak_factory_.GetWeakPtr()),
+ kResumingTimeSpan);
+}
+
+void DeviceEventRouter::SuspendDoneDelayed() {
+ is_resuming_ = false;
+}
+
+void DeviceEventRouter::PostDelayedTask(const base::Closure& closure,
+ base::TimeDelta time_delta) {
+ base::MessageLoopProxy::current()->PostDelayedTask(
+ FROM_HERE,
+ closure,
+ zero_time_delta_ ? base::TimeDelta::FromSeconds(0) : time_delta);
+}
+
+DeviceState DeviceEventRouter::GetDeviceState(const std::string& device_path) {
+ return device_states_.count(device_path) > 0 ? device_states_[device_path]
+ : DEVICE_STATE_USUAL;
+}
+
+void DeviceEventRouter::SetDeviceState(const std::string& device_path,
+ DeviceState state) {
+ if (state != DEVICE_STATE_USUAL) {
+ device_states_[device_path] = state;
+ } else {
+ const std::map<std::string, DeviceState>::iterator it =
+ device_states_.find(device_path);
+ if (it != device_states_.end())
+ device_states_.erase(it);
+ }
+}
+
+} // namespace file_manager

Powered by Google App Engine
This is Rietveld 408576698