| // Copyright (c) 2012 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. | 
 |  | 
 | #ifndef BASE_SYSTEM_MONITOR_SYSTEM_MONITOR_H_ | 
 | #define BASE_SYSTEM_MONITOR_SYSTEM_MONITOR_H_ | 
 |  | 
 | #include "base/base_export.h" | 
 | #include "base/macros.h" | 
 | #include "base/memory/ref_counted.h" | 
 | #include "base/observer_list_threadsafe.h" | 
 | #include "build/build_config.h" | 
 |  | 
 | namespace base { | 
 |  | 
 | // Class for monitoring various system-related subsystems | 
 | // such as power management, network status, etc. | 
 | // TODO(mbelshe):  Add support beyond just power management. | 
 | class BASE_EXPORT SystemMonitor { | 
 |  public: | 
 |   // Type of devices whose change need to be monitored, such as add/remove. | 
 |   enum DeviceType { | 
 |     DEVTYPE_AUDIO,          // Audio device, e.g., microphone. | 
 |     DEVTYPE_VIDEO_CAPTURE,  // Video capture device, e.g., webcam. | 
 |     DEVTYPE_UNKNOWN,        // Other devices. | 
 |   }; | 
 |  | 
 |   // Create SystemMonitor. Only one SystemMonitor instance per application | 
 |   // is allowed. | 
 |   SystemMonitor(); | 
 |   ~SystemMonitor(); | 
 |  | 
 |   // Get the application-wide SystemMonitor (if not present, returns NULL). | 
 |   static SystemMonitor* Get(); | 
 |  | 
 |   class BASE_EXPORT DevicesChangedObserver { | 
 |    public: | 
 |     // Notification that the devices connected to the system have changed. | 
 |     // This is only implemented on Windows currently. | 
 |     virtual void OnDevicesChanged(DeviceType device_type) {} | 
 |  | 
 |    protected: | 
 |     virtual ~DevicesChangedObserver() = default; | 
 |   }; | 
 |  | 
 |   // Add a new observer. | 
 |   // Can be called from any thread. | 
 |   // Must not be called from within a notification callback. | 
 |   void AddDevicesChangedObserver(DevicesChangedObserver* obs); | 
 |  | 
 |   // Remove an existing observer. | 
 |   // Can be called from any thread. | 
 |   // Must not be called from within a notification callback. | 
 |   void RemoveDevicesChangedObserver(DevicesChangedObserver* obs); | 
 |  | 
 |   // The ProcessFoo() style methods are a broken pattern and should not | 
 |   // be copied. Any significant addition to this class is blocked on | 
 |   // refactoring to improve the state of affairs. See http://crbug.com/149059 | 
 |  | 
 |   // Cross-platform handling of a device change event. | 
 |   void ProcessDevicesChanged(DeviceType device_type); | 
 |  | 
 |  private: | 
 |   // Functions to trigger notifications. | 
 |   void NotifyDevicesChanged(DeviceType device_type); | 
 |  | 
 |   scoped_refptr<ObserverListThreadSafe<DevicesChangedObserver> > | 
 |       devices_changed_observer_list_; | 
 |  | 
 |   DISALLOW_COPY_AND_ASSIGN(SystemMonitor); | 
 | }; | 
 |  | 
 | }  // namespace base | 
 |  | 
 | #endif  // BASE_SYSTEM_MONITOR_SYSTEM_MONITOR_H_ |