Home | History | Annotate | Download | only in power_monitor
      1 // Copyright 2013 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_POWER_MONITOR_POWER_MONITOR_DEVICE_SOURCE_H_
      6 #define BASE_POWER_MONITOR_POWER_MONITOR_DEVICE_SOURCE_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 "base/power_monitor/power_monitor_source.h"
     13 #include "base/power_monitor/power_observer.h"
     14 
     15 #if defined(OS_WIN)
     16 #include <windows.h>
     17 
     18 // Windows HiRes timers drain the battery faster so we need to know the battery
     19 // status.  This isn't true for other platforms.
     20 #define ENABLE_BATTERY_MONITORING 1
     21 #else
     22 #undef ENABLE_BATTERY_MONITORING
     23 #endif  // !OS_WIN
     24 
     25 #if defined(ENABLE_BATTERY_MONITORING)
     26 #include "base/timer/timer.h"
     27 #endif  // defined(ENABLE_BATTERY_MONITORING)
     28 
     29 #if defined(OS_IOS)
     30 #include <objc/runtime.h>
     31 #endif  // OS_IOS
     32 
     33 namespace base {
     34 
     35 // A class used to monitor the power state change and notify the observers about
     36 // the change event.
     37 class BASE_EXPORT PowerMonitorDeviceSource : public PowerMonitorSource {
     38  public:
     39   PowerMonitorDeviceSource();
     40   virtual ~PowerMonitorDeviceSource();
     41 
     42 #if defined(OS_MACOSX)
     43   // Allocate system resources needed by the PowerMonitor class.
     44   //
     45   // This function must be called before instantiating an instance of the class
     46   // and before the Sandbox is initialized.
     47 #if !defined(OS_IOS)
     48   static void AllocateSystemIOPorts();
     49 #else
     50   static void AllocateSystemIOPorts() {}
     51 #endif  // OS_IOS
     52 #endif  // OS_MACOSX
     53 
     54  private:
     55 #if defined(OS_WIN)
     56   // Represents a message-only window for power message handling on Windows.
     57   // Only allow PowerMonitor to create it.
     58   class PowerMessageWindow {
     59    public:
     60     PowerMessageWindow();
     61     ~PowerMessageWindow();
     62 
     63    private:
     64     static LRESULT CALLBACK WndProcThunk(HWND hwnd,
     65                                          UINT message,
     66                                          WPARAM wparam,
     67                                          LPARAM lparam);
     68     // Instance of the module containing the window procedure.
     69     HMODULE instance_;
     70     // A hidden message-only window.
     71     HWND message_hwnd_;
     72   };
     73 #endif  // OS_WIN
     74 
     75 #if defined(OS_MACOSX)
     76   void PlatformInit();
     77   void PlatformDestroy();
     78 #endif
     79 
     80   // Platform-specific method to check whether the system is currently
     81   // running on battery power.  Returns true if running on batteries,
     82   // false otherwise.
     83   virtual bool IsOnBatteryPowerImpl() OVERRIDE;
     84 
     85   // Checks the battery status and notifies observers if the battery
     86   // status has changed.
     87   void BatteryCheck();
     88 
     89 #if defined(OS_IOS)
     90   // Holds pointers to system event notification observers.
     91   std::vector<id> notification_observers_;
     92 #endif
     93 
     94 #if defined(ENABLE_BATTERY_MONITORING)
     95   base::OneShotTimer<PowerMonitorDeviceSource> delayed_battery_check_;
     96 #endif
     97 
     98 #if defined(OS_WIN)
     99   PowerMessageWindow power_message_window_;
    100 #endif
    101 
    102   DISALLOW_COPY_AND_ASSIGN(PowerMonitorDeviceSource);
    103 };
    104 
    105 }  // namespace base
    106 
    107 #endif  // BASE_POWER_MONITOR_POWER_MONITOR_DEVICE_SOURCE_H_
    108