#ifndef BASE_POWER_MONITOR_POWER_MONITOR_DEVICE_SOURCE_H_
#define BASE_POWER_MONITOR_POWER_MONITOR_DEVICE_SOURCE_H_
#include <memory>
#include <vector>
#include "base/base_export.h"
#include "base/power_monitor/power_monitor_source.h"
#include "base/power_monitor/power_observer.h"
#include "build/build_config.h"
#if BUILDFLAG(IS_WIN)
#include <windows.h>
#include "base/power_monitor/speed_limit_observer_win.h"
#include "base/threading/sequence_bound.h"
#endif
#if BUILDFLAG(IS_MAC)
#include <IOKit/IOTypes.h>
#include "base/apple/scoped_cftyperef.h"
#include "base/mac/scoped_ionotificationportref.h"
#include "base/power_monitor/battery_level_provider.h"
#include "base/power_monitor/iopm_power_source_sampling_event_source.h"
#include "base/power_monitor/thermal_state_observer_mac.h"
#endif
#if BUILDFLAG(IS_IOS)
#include <objc/runtime.h>
#endif
namespace base {
class BASE_EXPORT PowerMonitorDeviceSource : public PowerMonitorSource {
public:
PowerMonitorDeviceSource();
PowerMonitorDeviceSource(const PowerMonitorDeviceSource&) = delete;
PowerMonitorDeviceSource& operator=(const PowerMonitorDeviceSource&) = delete;
~PowerMonitorDeviceSource() override;
#if BUILDFLAG(IS_CHROMEOS)
static void SetPowerSource(
PowerStateObserver::BatteryPowerStatus battery_power_status);
static void HandleSystemSuspending();
static void HandleSystemResumed();
static void ThermalEventReceived(
PowerThermalObserver::DeviceThermalState state);
PowerThermalObserver::DeviceThermalState GetCurrentThermalState()
const override;
void SetCurrentThermalState(
PowerThermalObserver::DeviceThermalState state) override;
#endif
private:
friend class PowerMonitorDeviceSourceTest;
#if BUILDFLAG(IS_WIN)
class PowerMessageWindow {
public:
PowerMessageWindow();
~PowerMessageWindow();
private:
static LRESULT CALLBACK WndProcThunk(HWND hwnd,
UINT message,
WPARAM wparam,
LPARAM lparam);
HMODULE instance_ = nullptr;
HWND message_hwnd_ = nullptr;
HPOWERNOTIFY power_notify_handle_ = nullptr;
};
#endif
#if (BUILDFLAG(IS_APPLE) && !BUILDFLAG(IS_IOS_TVOS)) || BUILDFLAG(IS_WIN)
void PlatformInit();
void PlatformDestroy();
#endif
#if BUILDFLAG(IS_MAC)
static void SystemPowerEventCallback(void* refcon,
io_service_t service,
natural_t message_type,
void* message_argument);
#endif
PowerStateObserver::BatteryPowerStatus GetBatteryPowerStatus() const override;
#if BUILDFLAG(IS_ANDROID)
PowerThermalObserver::DeviceThermalState GetCurrentThermalState()
const override;
#endif
#if BUILDFLAG(IS_WIN)
int GetInitialSpeedLimit() const override;
#endif
#if BUILDFLAG(IS_MAC)
PowerThermalObserver::DeviceThermalState GetCurrentThermalState()
const override;
int GetInitialSpeedLimit() const override;
void GetBatteryState();
void OnBatteryStateReceived(
const std::optional<BatteryLevelProvider::BatteryState>& battery_state);
io_connect_t power_manager_port_ = IO_OBJECT_NULL;
mac::ScopedIONotificationPortRef notification_port_;
io_object_t notifier_ = IO_OBJECT_NULL;
IOPMPowerSourceSamplingEventSource power_source_event_source_;
std::unique_ptr<BatteryLevelProvider> battery_level_provider_;
std::unique_ptr<ThermalStateObserverMac> thermal_state_observer_;
PowerStateObserver::BatteryPowerStatus battery_power_status_ =
PowerStateObserver::BatteryPowerStatus::kUnknown;
#endif
#if BUILDFLAG(IS_IOS)
std::vector<id> notification_observers_;
#endif
#if BUILDFLAG(IS_WIN)
PowerMessageWindow power_message_window_;
std::unique_ptr<base::SequenceBound<SpeedLimitObserverWin>>
speed_limit_observer_;
#endif
#if BUILDFLAG(IS_CHROMEOS)
PowerThermalObserver::DeviceThermalState current_thermal_state_ =
PowerThermalObserver::DeviceThermalState::kUnknown;
#endif
};
}
#endif