23 #include <core/dbus/macros.h> 24 #include <core/dbus/object.h> 28 namespace com {
namespace canonical {
33 static const std::string&
name()
35 static std::string s =
"com.canonical.Unity.Screen";
39 static const core::dbus::types::ObjectPath&
path()
41 static core::dbus::types::ObjectPath p{
"/com/canonical/Unity/Screen"};
45 DBUS_CPP_METHOD_DEF(keepDisplayOn,
Screen)
46 DBUS_CPP_METHOD_DEF(removeDisplayOnRequest,
Screen)
54 static std::string s =
"com.canonical.powerd";
58 static const core::dbus::types::ObjectPath&
path()
60 static core::dbus::types::ObjectPath p{
"/com/canonical/powerd"};
73 struct DisplayStateLock :
public media::power::StateController::Lock<media::power::DisplayState>,
74 public std::enable_shared_from_this<DisplayStateLock>
77 typedef std::shared_ptr<DisplayStateLock> Ptr;
80 static boost::posix_time::seconds timeout_for_release()
82 return boost::posix_time::seconds{4};
86 static constexpr
const std::int32_t the_invalid_cookie{-1};
88 DisplayStateLock(
const media::power::StateController::Ptr& parent,
89 boost::asio::io_service& io_service,
90 const core::dbus::Object::Ptr&
object)
94 cookie{the_invalid_cookie}
103 if (state == media::power::DisplayState::off)
106 std::weak_ptr<DisplayStateLock> wp{shared_from_this()};
108 object->invoke_method_asynchronously_with_callback<com::canonical::Unity::Screen::keepDisplayOn, std::int32_t>(
109 [wp, state](
const core::dbus::Result<std::int32_t>& result)
111 if (result.is_error())
113 MH_ERROR(
"%s", result.error().print());
117 if (
auto sp = wp.lock())
119 sp->cookie = result.value();
120 sp->signals.acquired(state);
127 if (state == media::power::DisplayState::off)
130 if (cookie == the_invalid_cookie)
135 auto sp = shared_from_this();
137 auto current_cookie(cookie);
139 timeout.expires_from_now(timeout_for_release());
140 timeout.async_wait([sp, state, current_cookie](
const boost::system::error_code& ec)
144 if (ec == boost::asio::error::operation_aborted)
147 sp->object->invoke_method_asynchronously_with_callback<com::canonical::Unity::Screen::removeDisplayOnRequest,
void>(
148 [sp, state, current_cookie](
const core::dbus::Result<void>& result)
150 if (result.is_error())
152 MH_ERROR(
"%s", result.error().print());
156 sp->signals.released(state);
161 if (sp->cookie == current_cookie)
162 sp->cookie = the_invalid_cookie;
169 const core::Signal<media::power::DisplayState>& acquired()
const override 171 return signals.acquired;
175 const core::Signal<media::power::DisplayState>& released()
const override 177 return signals.released;
180 media::power::StateController::Ptr parent;
181 boost::asio::deadline_timer timeout;
182 core::dbus::Object::Ptr object;
187 core::Signal<media::power::DisplayState> acquired;
188 core::Signal<media::power::DisplayState> released;
192 struct SystemStateLock :
public media::power::StateController::Lock<media::power::SystemState>,
193 public std::enable_shared_from_this<SystemStateLock>
195 static constexpr
const char* wake_lock_name
197 "media-hub-playback_lock" 200 SystemStateLock(
const media::power::StateController::Ptr& parent,
const core::dbus::Object::Ptr&
object)
212 if (state == media::power::SystemState::suspend)
218 std::unique_lock<std::mutex> ul{system_state_cookie_store_guard, std::try_to_lock};
221 if (system_state_cookie_store.count(state) > 0)
226 MH_WARNING(
"Failed to lock system_state_cookie_store_guard and check system lock state");
233 std::weak_ptr<SystemStateLock> wp{shared_from_this()};
235 object->invoke_method_asynchronously_with_callback<com::canonical::powerd::Interface::requestSysState, std::string>([wp, state,
this](
const core::dbus::Result<std::string>& result)
237 if (result.is_error())
239 MH_ERROR(
"%s", result.error().print());
243 if (
auto sp = wp.lock())
248 std::unique_lock<std::mutex> ul{system_state_cookie_store_guard, std::try_to_lock};
250 sp->system_state_cookie_store[state] = result.value();
252 MH_WARNING(
"Failed to lock system_state_cookie_store_guard and update system lock state");
255 sp->signals.acquired(state);
257 }, std::string{wake_lock_name},
static_cast<std::int32_t
>(state));
264 if (state == media::power::SystemState::suspend)
270 std::unique_lock<std::mutex> ul{system_state_cookie_store_guard, std::try_to_lock};
273 if (system_state_cookie_store.count(state) == 0)
278 MH_WARNING(
"Failed to lock system_state_cookie_store_guard and check system lock state");
285 std::weak_ptr<SystemStateLock> wp{shared_from_this()};
287 object->invoke_method_asynchronously_with_callback<com::canonical::powerd::Interface::clearSysState,
void>([
this, wp, state](
const core::dbus::Result<void>& result)
289 if (result.is_error())
290 MH_ERROR(
"%s", result.error().print());
292 if (
auto sp = wp.lock())
296 std::unique_lock<std::mutex> ul{system_state_cookie_store_guard, std::try_to_lock};
298 sp->system_state_cookie_store.erase(state);
300 MH_WARNING(
"Failed to lock system_state_cookie_store_guard and erase system lock state");
303 sp->signals.released(state);
305 }, system_state_cookie_store.at(state));
309 const core::Signal<media::power::SystemState>& acquired()
const override 311 return signals.acquired;
315 const core::Signal<media::power::SystemState>& released()
const override 317 return signals.released;
321 std::mutex system_state_cookie_store_guard;
325 std::map<media::power::SystemState, std::string> system_state_cookie_store;
326 media::power::StateController::Ptr parent;
327 core::dbus::Object::Ptr object;
330 core::Signal<media::power::SystemState> acquired;
331 core::Signal<media::power::SystemState> released;
335 struct StateController :
public media::power::StateController,
336 public std::enable_shared_from_this<impl::StateController>
338 StateController(media::helper::ExternalServices& es)
339 : external_services{es},
342 core::dbus::Service::use_service<com::canonical::powerd::Interface>(external_services.system)
347 core::dbus::Service::use_service<com::canonical::Unity::Screen>(external_services.system)
353 media::power::StateController::Lock<media::power::SystemState>::Ptr system_state_lock()
override 355 return std::make_shared<impl::SystemStateLock>(shared_from_this(), powerd);
358 media::power::StateController::Lock<media::power::DisplayState>::Ptr display_state_lock()
override 360 return std::make_shared<impl::DisplayStateLock>(shared_from_this(), external_services.io_service, unity_screen);
363 media::helper::ExternalServices& external_services;
364 core::dbus::Object::Ptr powerd;
365 core::dbus::Object::Ptr unity_screen;
372 return std::make_shared<::impl::StateController>(external_services);
380 case media::power::DisplayState::off:
381 return out <<
"DisplayState::off";
382 case media::power::DisplayState::on:
383 return out <<
"DisplayState::on";
394 case media::power::SystemState::active:
395 return out <<
"SystemState::active";
396 case media::power::SystemState::blank_on_proximity:
397 return out <<
"SystemState::blank_on_proximity";
398 case media::power::SystemState::suspend:
399 return out <<
"SystemState::suspend";
static const std::string & name()
static const core::dbus::types::ObjectPath & path()
static const core::dbus::types::ObjectPath & path()
static std::string & name()