SystemMonitor

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);

};

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);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值