diff options
-rw-r--r-- | base/system_monitor.cc | 174 | ||||
-rw-r--r-- | base/system_monitor.h | 248 |
2 files changed, 219 insertions, 203 deletions
diff --git a/base/system_monitor.cc b/base/system_monitor.cc index 1d44e3c..dd5aa60 100644 --- a/base/system_monitor.cc +++ b/base/system_monitor.cc @@ -1,85 +1,89 @@ -// Copyright (c) 2008 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/system_monitor.h"
-#include "base/logging.h"
-#include "base/message_loop.h"
-
-namespace base {
-
-// The amount of time (in ms) to wait before running the initial
-// battery check.
-static int kDelayedBatteryCheckMs = 10 * 1000;
-
-SystemMonitor::SystemMonitor()
- : battery_in_use_(false),
- suspended_(false) {
- observer_list_ = new ObserverListThreadSafe<PowerObserver>();
-}
-
-void SystemMonitor::ProcessPowerMessage(PowerEvent event_id) {
- // Suppress duplicate notifications. Some platforms may
- // send multiple notifications of the same event.
- switch (event_id) {
- case POWER_STATE_EVENT:
- {
- bool on_battery = IsBatteryPower();
- if (on_battery != battery_in_use_) {
- battery_in_use_ = on_battery;
- NotifyPowerStateChange();
- }
- }
- break;
- case RESUME_EVENT:
- if (suspended_) {
- suspended_ = false;
- NotifyResume();
- }
- break;
- case SUSPEND_EVENT:
- if (!suspended_) {
- suspended_ = true;
- NotifySuspend();
- }
- break;
- }
-}
-
-void SystemMonitor::AddObserver(PowerObserver* obs) {
- observer_list_->AddObserver(obs);
-}
-
-void SystemMonitor::RemoveObserver(PowerObserver* obs) {
- observer_list_->RemoveObserver(obs);
-}
-
-void SystemMonitor::NotifyPowerStateChange() {
- LOG(INFO) << L"PowerStateChange: "
- << (BatteryPower() ? L"On" : L"Off") << L" battery";
- observer_list_->Notify(&PowerObserver::OnPowerStateChange, this);
-}
-
-void SystemMonitor::NotifySuspend() {
- LOG(INFO) << L"Power Suspending";
- observer_list_->Notify(&PowerObserver::OnSuspend, this);
-}
-
-void SystemMonitor::NotifyResume() {
- LOG(INFO) << L"Power Resuming";
- observer_list_->Notify(&PowerObserver::OnResume, this);
-}
-
-void SystemMonitor::Start() {
- DCHECK(MessageLoop::current()); // Can't call start too early.
- SystemMonitor* monitor = Get();
- monitor->delayed_battery_check_.Start(
- TimeDelta::FromMilliseconds(kDelayedBatteryCheckMs), monitor,
- &SystemMonitor::BatteryCheck);
-}
-
-void SystemMonitor::BatteryCheck() {
- ProcessPowerMessage(SystemMonitor::POWER_STATE_EVENT);
-}
-
-} // namespace base
+// Copyright (c) 2008 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/system_monitor.h" +#include "base/logging.h" +#include "base/message_loop.h" + +namespace base { + +#if defined(ENABLE_BATTERY_MONITORING) +// The amount of time (in ms) to wait before running the initial +// battery check. +static int kDelayedBatteryCheckMs = 10 * 1000; +#endif // defined(ENABLE_BATTERY_MONITORING) + +SystemMonitor::SystemMonitor() + : battery_in_use_(false), + suspended_(false) { + observer_list_ = new ObserverListThreadSafe<PowerObserver>(); +} + +void SystemMonitor::ProcessPowerMessage(PowerEvent event_id) { + // Suppress duplicate notifications. Some platforms may + // send multiple notifications of the same event. + switch (event_id) { + case POWER_STATE_EVENT: + { + bool on_battery = IsBatteryPower(); + if (on_battery != battery_in_use_) { + battery_in_use_ = on_battery; + NotifyPowerStateChange(); + } + } + break; + case RESUME_EVENT: + if (suspended_) { + suspended_ = false; + NotifyResume(); + } + break; + case SUSPEND_EVENT: + if (!suspended_) { + suspended_ = true; + NotifySuspend(); + } + break; + } +} + +void SystemMonitor::AddObserver(PowerObserver* obs) { + observer_list_->AddObserver(obs); +} + +void SystemMonitor::RemoveObserver(PowerObserver* obs) { + observer_list_->RemoveObserver(obs); +} + +void SystemMonitor::NotifyPowerStateChange() { + LOG(INFO) << L"PowerStateChange: " + << (BatteryPower() ? L"On" : L"Off") << L" battery"; + observer_list_->Notify(&PowerObserver::OnPowerStateChange, this); +} + +void SystemMonitor::NotifySuspend() { + LOG(INFO) << L"Power Suspending"; + observer_list_->Notify(&PowerObserver::OnSuspend, this); +} + +void SystemMonitor::NotifyResume() { + LOG(INFO) << L"Power Resuming"; + observer_list_->Notify(&PowerObserver::OnResume, this); +} + +void SystemMonitor::Start() { +#if defined(ENABLE_BATTERY_MONITORING) + DCHECK(MessageLoop::current()); // Can't call start too early. + SystemMonitor* monitor = Get(); + monitor->delayed_battery_check_.Start( + TimeDelta::FromMilliseconds(kDelayedBatteryCheckMs), monitor, + &SystemMonitor::BatteryCheck); +#endif // defined(ENABLE_BATTERY_MONITORING) +} + +void SystemMonitor::BatteryCheck() { + ProcessPowerMessage(SystemMonitor::POWER_STATE_EVENT); +} + +} // namespace base diff --git a/base/system_monitor.h b/base/system_monitor.h index cfcb08a..e248751 100644 --- a/base/system_monitor.h +++ b/base/system_monitor.h @@ -1,118 +1,130 @@ -// Copyright (c) 2008 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_H_
-#define BASE_SYSTEM_MONITOR_H_
-
-#include "base/observer_list_threadsafe.h"
-#include "base/singleton.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 SystemMonitor {
- public:
- // Access to the Singleton
- static SystemMonitor* Get() {
- // Uses the LeakySingletonTrait because cleanup is optional.
- return
- Singleton<SystemMonitor, LeakySingletonTraits<SystemMonitor> >::get();
- }
-
- // Start the System Monitor within a process. This method
- // is provided so that the battery check can be deferred.
- // The MessageLoop must be started before calling this
- // method.
- static void Start();
-
- //
- // Power-related APIs
- //
-
- // Is the computer currently on battery power.
- // Can be called on any thread.
- bool BatteryPower() {
- // Using a lock here is not necessary for just a bool.
- return battery_in_use_;
- }
-
- // Normalized list of power events.
- enum PowerEvent {
- POWER_STATE_EVENT, // The Power status of the system has changed.
- SUSPEND_EVENT, // The system is being suspended.
- RESUME_EVENT // The system is being resumed.
- };
-
- // Callbacks will be called on the thread which creates the SystemMonitor.
- // During the callback, Add/RemoveObserver will block until the callbacks
- // are finished. Observers should implement quick callback functions; if
- // lengthy operations are needed, the observer should take care to invoke
- // the operation on an appropriate thread.
- class PowerObserver {
- public:
- // Notification of a change in power status of the computer, such
- // as from switching between battery and A/C power.
- virtual void OnPowerStateChange(SystemMonitor*) = 0;
-
- // Notification that the system is suspending.
- virtual void OnSuspend(SystemMonitor*) = 0;
-
- // Notification that the system is resuming.
- virtual void OnResume(SystemMonitor*) = 0;
- };
-
- // Add a new observer.
- // Can be called from any thread.
- // Must not be called from within a notification callback.
- void AddObserver(PowerObserver* obs);
-
- // Remove an existing observer.
- // Can be called from any thread.
- // Must not be called from within a notification callback.
- void RemoveObserver(PowerObserver* obs);
-
-#if defined(OS_WIN)
- // Windows-specific handling of a WM_POWERBROADCAST message.
- // Embedders of this API should hook their top-level window
- // message loop and forward WM_POWERBROADCAST through this call.
- void ProcessWmPowerBroadcastMessage(int event_id);
-#endif
-
- // Cross-platform handling of a power event.
- void ProcessPowerMessage(PowerEvent event_id);
-
- // Constructor.
- // Don't use this; access SystemMonitor via the Singleton.
- SystemMonitor();
-
- private:
- // Platform-specific method to check whether the system is currently
- // running on battery power. Returns true if running on batteries,
- // false otherwise.
- bool IsBatteryPower();
-
- // Checks the battery status and notifies observers if the battery
- // status has changed.
- void BatteryCheck();
-
- // Functions to trigger notifications.
- void NotifyPowerStateChange();
- void NotifySuspend();
- void NotifyResume();
-
- scoped_refptr<ObserverListThreadSafe<PowerObserver> > observer_list_;
- bool battery_in_use_;
- bool suspended_;
-
- base::OneShotTimer<SystemMonitor> delayed_battery_check_;
-
- DISALLOW_COPY_AND_ASSIGN(SystemMonitor);
-};
-
-}
-
-#endif // BASE_SYSTEM_MONITOR_H_
-
+// Copyright (c) 2008 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_H_ +#define BASE_SYSTEM_MONITOR_H_ + +#include "base/observer_list_threadsafe.h" +#include "base/singleton.h" + +// Windows HiRes timers drain the battery faster so we need to know the battery +// status. This isn't true for other platforms. +#if defined(OS_WIN) +#define ENABLE_BATTERY_MONITORING 1 +#else +#undef ENABLE_BATTERY_MONITORING +#endif // !OS_WIN + +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 SystemMonitor { + public: + // Access to the Singleton + static SystemMonitor* Get() { + // Uses the LeakySingletonTrait because cleanup is optional. + return + Singleton<SystemMonitor, LeakySingletonTraits<SystemMonitor> >::get(); + } + + // Start the System Monitor within a process. This method + // is provided so that the battery check can be deferred. + // The MessageLoop must be started before calling this + // method. + // This is a no-op on platforms for which ENABLE_BATTERY_MONITORING is + // disabled. + static void Start(); + + // + // Power-related APIs + // + + // Is the computer currently on battery power. + // Can be called on any thread. + bool BatteryPower() { + // Using a lock here is not necessary for just a bool. + return battery_in_use_; + } + + // Normalized list of power events. + enum PowerEvent { + POWER_STATE_EVENT, // The Power status of the system has changed. + SUSPEND_EVENT, // The system is being suspended. + RESUME_EVENT // The system is being resumed. + }; + + // Callbacks will be called on the thread which creates the SystemMonitor. + // During the callback, Add/RemoveObserver will block until the callbacks + // are finished. Observers should implement quick callback functions; if + // lengthy operations are needed, the observer should take care to invoke + // the operation on an appropriate thread. + class PowerObserver { + public: + // Notification of a change in power status of the computer, such + // as from switching between battery and A/C power. + virtual void OnPowerStateChange(SystemMonitor*) = 0; + + // Notification that the system is suspending. + virtual void OnSuspend(SystemMonitor*) = 0; + + // Notification that the system is resuming. + virtual void OnResume(SystemMonitor*) = 0; + }; + + // Add a new observer. + // Can be called from any thread. + // Must not be called from within a notification callback. + void AddObserver(PowerObserver* obs); + + // Remove an existing observer. + // Can be called from any thread. + // Must not be called from within a notification callback. + void RemoveObserver(PowerObserver* obs); + +#if defined(OS_WIN) + // Windows-specific handling of a WM_POWERBROADCAST message. + // Embedders of this API should hook their top-level window + // message loop and forward WM_POWERBROADCAST through this call. + void ProcessWmPowerBroadcastMessage(int event_id); +#endif + + // Cross-platform handling of a power event. + void ProcessPowerMessage(PowerEvent event_id); + + // Constructor. + // Don't use this; access SystemMonitor via the Singleton. + SystemMonitor(); + + private: + // Platform-specific method to check whether the system is currently + // running on battery power. Returns true if running on batteries, + // false otherwise. + bool IsBatteryPower(); + + // Checks the battery status and notifies observers if the battery + // status has changed. + void BatteryCheck(); + + // Functions to trigger notifications. + void NotifyPowerStateChange(); + void NotifySuspend(); + void NotifyResume(); + + scoped_refptr<ObserverListThreadSafe<PowerObserver> > observer_list_; + bool battery_in_use_; + bool suspended_; + +#if defined(ENABLE_BATTERY_MONITORING) + base::OneShotTimer<SystemMonitor> delayed_battery_check_; +#endif + + DISALLOW_COPY_AND_ASSIGN(SystemMonitor); +}; + +} + +#endif // BASE_SYSTEM_MONITOR_H_ + |