1// Copyright (c) 2012 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#ifndef BASE_SYSTEM_MONITOR_SYSTEM_MONITOR_H_
6#define BASE_SYSTEM_MONITOR_SYSTEM_MONITOR_H_
7
8#include "base/base_export.h"
9#include "base/basictypes.h"
10#include "base/memory/ref_counted.h"
11#include "base/observer_list_threadsafe.h"
12#include "build/build_config.h"
13
14namespace base {
15
16// Class for monitoring various system-related subsystems
17// such as power management, network status, etc.
18// TODO(mbelshe):  Add support beyond just power management.
19class BASE_EXPORT SystemMonitor {
20 public:
21  // Type of devices whose change need to be monitored, such as add/remove.
22  enum DeviceType {
23    DEVTYPE_AUDIO_CAPTURE,  // Audio capture device, e.g., microphone.
24    DEVTYPE_VIDEO_CAPTURE,  // Video capture device, e.g., webcam.
25    DEVTYPE_UNKNOWN,  // Other devices.
26  };
27
28  // Create SystemMonitor. Only one SystemMonitor instance per application
29  // is allowed.
30  SystemMonitor();
31  ~SystemMonitor();
32
33  // Get the application-wide SystemMonitor (if not present, returns NULL).
34  static SystemMonitor* Get();
35
36  class BASE_EXPORT DevicesChangedObserver {
37   public:
38    // Notification that the devices connected to the system have changed.
39    // This is only implemented on Windows currently.
40    virtual void OnDevicesChanged(DeviceType device_type) {}
41
42   protected:
43    virtual ~DevicesChangedObserver() {}
44  };
45
46  // Add a new observer.
47  // Can be called from any thread.
48  // Must not be called from within a notification callback.
49  void AddDevicesChangedObserver(DevicesChangedObserver* obs);
50
51  // Remove an existing observer.
52  // Can be called from any thread.
53  // Must not be called from within a notification callback.
54  void RemoveDevicesChangedObserver(DevicesChangedObserver* obs);
55
56  // The ProcessFoo() style methods are a broken pattern and should not
57  // be copied. Any significant addition to this class is blocked on
58  // refactoring to improve the state of affairs. See http://crbug.com/149059
59
60  // Cross-platform handling of a device change event.
61  void ProcessDevicesChanged(DeviceType device_type);
62
63 private:
64  // Functions to trigger notifications.
65  void NotifyDevicesChanged(DeviceType device_type);
66
67  scoped_refptr<ObserverListThreadSafe<DevicesChangedObserver> >
68      devices_changed_observer_list_;
69
70  DISALLOW_COPY_AND_ASSIGN(SystemMonitor);
71};
72
73}  // namespace base
74
75#endif  // BASE_SYSTEM_MONITOR_SYSTEM_MONITOR_H_
76