Index: chromeos/dbus/power_policy_controller.cc |
diff --git a/chromeos/dbus/power_policy_controller.cc b/chromeos/dbus/power_policy_controller.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..fd478a252df747e7ec905812519c208c895a47be |
--- /dev/null |
+++ b/chromeos/dbus/power_policy_controller.cc |
@@ -0,0 +1,115 @@ |
+// Copyright (c) 2013 The Chromium Authors. All rights reserved. |
bartfab (slow)
2013/02/04 10:04:35
I won't repeat the comments about magic constants
|
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "chromeos/dbus/power_policy_controller.h" |
+ |
+#include "base/logging.h" |
+#include "chromeos/dbus/dbus_thread_manager.h" |
+#include "chromeos/dbus/power_manager/policy.pb.h" |
+#include "chromeos/dbus/power_manager_client.h" |
+ |
+namespace chromeos { |
+ |
+namespace { |
+ |
+// If |pref_field|, a member of |prefs_|, is a zero or positive delay, |
+// assigns it to |proto_field|, a millisecond-based delay in |proto|, a |
+// power_manager::PowerManagementPolicy::Delays message. Does nothing if |
+// the pref contains a negative delay. |
+#define SET_DELAY_FROM_PREFS(pref_field, proto_field, proto) \ |
+ if (prefs_.pref_field >= base::TimeDelta()) \ |
+ proto->set_##proto_field(prefs_.pref_field.InMilliseconds()); |
+ |
+// Returns the power_manager::PowerManagementPolicy_Action value |
+// corresponding to |action|. Cannot be called with ACTION_UNSET. |
+power_manager::PowerManagementPolicy_Action GetProtoAction( |
+ PowerPolicyController::OptionalAction action) { |
+ switch (action) { |
+ case PowerPolicyController::ACTION_SUSPEND: |
+ return power_manager::PowerManagementPolicy_Action_SUSPEND; |
+ case PowerPolicyController::ACTION_STOP_SESSION: |
+ return power_manager::PowerManagementPolicy_Action_STOP_SESSION; |
+ case PowerPolicyController::ACTION_SHUT_DOWN: |
+ return power_manager::PowerManagementPolicy_Action_SHUT_DOWN; |
+ case PowerPolicyController::ACTION_DO_NOTHING: |
+ return power_manager::PowerManagementPolicy_Action_DO_NOTHING; |
+ default: |
+ NOTREACHED() << "Unhandled action " << action; |
+ return power_manager::PowerManagementPolicy_Action_DO_NOTHING; |
+ } |
+} |
+ |
+} // namespace |
+ |
+const int PowerPolicyController::kUnsetDelayMs = -1; |
+const double PowerPolicyController::kUnsetPresentationIdleDelayFactor = 0.0; |
+ |
+PowerPolicyController::PolicyPrefs::PolicyPrefs() |
+ : ac_screen_dim_delay(base::TimeDelta::FromMilliseconds(kUnsetDelayMs)), |
+ ac_screen_off_delay(base::TimeDelta::FromMilliseconds(kUnsetDelayMs)), |
+ ac_screen_lock_delay(base::TimeDelta::FromMilliseconds(kUnsetDelayMs)), |
+ ac_idle_delay(base::TimeDelta::FromMilliseconds(kUnsetDelayMs)), |
+ battery_screen_dim_delay( |
+ base::TimeDelta::FromMilliseconds(kUnsetDelayMs)), |
+ battery_screen_off_delay( |
+ base::TimeDelta::FromMilliseconds(kUnsetDelayMs)), |
+ battery_screen_lock_delay( |
+ base::TimeDelta::FromMilliseconds(kUnsetDelayMs)), |
+ battery_idle_delay(base::TimeDelta::FromMilliseconds(kUnsetDelayMs)), |
+ idle_action(ACTION_UNSET), |
+ lid_closed_action(ACTION_UNSET), |
+ use_audio_activity(BOOL_UNSET), |
+ use_video_activity(BOOL_UNSET), |
+ presentation_idle_delay_factor(kUnsetPresentationIdleDelayFactor) { |
+} |
+ |
+PowerPolicyController::PowerPolicyController(PowerManagerClient* client) |
+ : client_(client) { |
+ ResetPolicy(); |
+} |
+ |
+PowerPolicyController::~PowerPolicyController() { |
+ ResetPolicy(); |
+ client_ = NULL; |
+} |
+ |
+void PowerPolicyController::UpdatePolicyFromPrefs(const PolicyPrefs& prefs) { |
+ prefs_ = prefs; |
+ SendPolicy(); |
+} |
+ |
+void PowerPolicyController::ResetPolicy() { |
+ prefs_ = PolicyPrefs(); |
+ SendPolicy(); |
+} |
+ |
+void PowerPolicyController::SendPolicy() { |
+ power_manager::PowerManagementPolicy policy; |
+ |
+ power_manager::PowerManagementPolicy::Delays* delays = |
+ policy.mutable_ac_delays(); |
+ SET_DELAY_FROM_PREFS(ac_screen_dim_delay, screen_dim_ms, delays); |
+ SET_DELAY_FROM_PREFS(ac_screen_off_delay, screen_off_ms, delays); |
+ SET_DELAY_FROM_PREFS(ac_screen_lock_delay, screen_lock_ms, delays); |
+ SET_DELAY_FROM_PREFS(ac_idle_delay, idle_ms, delays); |
+ |
+ delays = policy.mutable_battery_delays(); |
+ SET_DELAY_FROM_PREFS(battery_screen_dim_delay, screen_dim_ms, delays); |
+ SET_DELAY_FROM_PREFS(battery_screen_off_delay, screen_off_ms, delays); |
+ SET_DELAY_FROM_PREFS(battery_screen_lock_delay, screen_lock_ms, delays); |
+ SET_DELAY_FROM_PREFS(battery_idle_delay, idle_ms, delays); |
+ |
+ if (prefs_.idle_action != ACTION_UNSET) |
+ policy.set_idle_action(GetProtoAction(prefs_.idle_action)); |
+ if (prefs_.lid_closed_action != ACTION_UNSET) |
+ policy.set_lid_closed_action(GetProtoAction(prefs_.lid_closed_action)); |
+ if (prefs_.presentation_idle_delay_factor >= 1.0) { |
+ policy.set_presentation_idle_delay_factor( |
+ prefs_.presentation_idle_delay_factor); |
+ } |
+ |
+ client_->SetPolicy(policy); |
+} |
+ |
+} // namespace chromeos |