File: device_event_router.h

package info (click to toggle)
chromium 139.0.7258.127-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 6,122,068 kB
  • sloc: cpp: 35,100,771; ansic: 7,163,530; javascript: 4,103,002; python: 1,436,920; asm: 946,517; xml: 746,709; pascal: 187,653; perl: 88,691; sh: 88,436; objc: 79,953; sql: 51,488; cs: 44,583; fortran: 24,137; makefile: 22,147; tcl: 15,277; php: 13,980; yacc: 8,984; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (132 lines) | stat: -rw-r--r-- 5,163 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
// Copyright 2014 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CHROME_BROWSER_ASH_EXTENSIONS_FILE_MANAGER_DEVICE_EVENT_ROUTER_H_
#define CHROME_BROWSER_ASH_EXTENSIONS_FILE_MANAGER_DEVICE_EVENT_ROUTER_H_

#include <map>
#include <string>

#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/threading/thread_checker.h"
#include "base/time/time.h"
#include "chrome/browser/ash/extensions/file_manager/system_notification_manager.h"
#include "chrome/browser/ash/file_manager/volume_manager_observer.h"
#include "chrome/common/extensions/api/file_manager_private.h"
#include "chromeos/dbus/power/power_manager_client.h"

namespace file_manager {

enum DeviceState {
  // Device is not being hard unplugged.
  DEVICE_STATE_USUAL,
  // Device is hard unplugged.
  DEVICE_HARD_UNPLUGGED,
  // Device is hard unplugged and reported to the JavaScript side.
  DEVICE_HARD_UNPLUGGED_AND_REPORTED
};

// Event router for device events.
class DeviceEventRouter : public VolumeManagerObserver,
                          public chromeos::PowerManagerClient::Observer {
 public:
  explicit DeviceEventRouter(SystemNotificationManager* notification_manager);

  // |overriding_time_delta| overrides time delta of delayed tasks for testing
  // |so that the tasks are executed by RunLoop::RunUntilIdle.
  DeviceEventRouter(SystemNotificationManager* notificaton_manager,
                    base::TimeDelta overriding_time_delta);

  DeviceEventRouter(const DeviceEventRouter&) = delete;
  DeviceEventRouter& operator=(const DeviceEventRouter&) = delete;

  ~DeviceEventRouter() override;

  // Turns the startup flag on, and then turns it off after few seconds.
  void Startup();

  // VolumeManagerObserver overrides.
  void OnDiskAdded(const ash::disks::Disk& disk, bool mounting) override;
  void OnDiskAddBlockedByPolicy(const std::string& device_path) override;
  void OnDiskRemoved(const ash::disks::Disk& disk) override;
  void OnDeviceAdded(const std::string& device_path) override;
  void OnDeviceRemoved(const std::string& device_path) override;
  void OnVolumeMounted(ash::MountError error_code,
                       const Volume& volume) override;
  void OnVolumeUnmounted(ash::MountError error_code,
                         const Volume& volume) override;
  void OnFormatStarted(const std::string& device_path,
                       const std::string& device_label,
                       bool success) override;
  void OnFormatCompleted(const std::string& device_path,
                         const std::string& device_label,
                         bool success) override;
  void OnPartitionStarted(const std::string& device_path,
                          const std::string& device_label,
                          bool success) override;
  void OnPartitionCompleted(const std::string& device_path,
                            const std::string& device_label,
                            bool success) override;
  void OnRenameStarted(const std::string& device_path,
                       const std::string& device_label,
                       bool success) override;
  void OnRenameCompleted(const std::string& device_path,
                         const std::string& device_label,
                         bool success) override;

  // PowerManagerClient::Observer overrides.
  void SuspendImminent(power_manager::SuspendImminent::Reason reason) override;
  void SuspendDone(base::TimeDelta sleep_duration) override;

  bool is_resuming() const { return is_resuming_; }
  bool is_starting_up() const { return is_starting_up_; }

 protected:
  // Handles a device event containing |type| and |device_path|.
  virtual void OnDeviceEvent(
      extensions::api::file_manager_private::DeviceEventType type,
      const std::string& device_path,
      const std::string& device_label) = 0;

  SystemNotificationManager* system_notification_manager() {
    return notification_manager_;
  }

 private:
  void StartupDelayed();
  void SuspendDoneDelayed();

  // Obtains device state of the device having |device_path|.
  DeviceState GetDeviceState(const std::string& device_path) const;

  // Sets device state to the device having |device_path|.
  void SetDeviceState(const std::string& device_path, DeviceState state);

  raw_ptr<SystemNotificationManager> notification_manager_;

  // Whether to use zero time delta for testing or not.
  const base::TimeDelta resume_time_delta_;
  const base::TimeDelta startup_time_delta_;

  // Whether the profile is starting up or not.
  bool is_starting_up_;

  // Whether the system is resuming or not.
  bool is_resuming_;

  // Map of device path and device state.
  std::map<std::string, DeviceState> device_states_;

  // Thread checker.
  THREAD_CHECKER(thread_checker_);

  // Note: This should remain the last member so it'll be destroyed and
  // invalidate the weak pointers before any other members are destroyed.
  base::WeakPtrFactory<DeviceEventRouter> weak_factory_{this};
};

}  // namespace file_manager

#endif  // CHROME_BROWSER_ASH_EXTENSIONS_FILE_MANAGER_DEVICE_EVENT_ROUTER_H_