blob: 7b86b3becb990090c57ab48c9c43fdb718af5557 [file] [log] [blame]
// Copyright 2019 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef VM_TOOLS_CONCIERGE_POWER_MANAGER_CLIENT_H_
#define VM_TOOLS_CONCIERGE_POWER_MANAGER_CLIENT_H_
#include <stdint.h>
#include <string>
#include <base/callback.h>
#include <base/macros.h>
#include <base/memory/ref_counted.h>
#include <base/memory/weak_ptr.h>
#include <dbus/bus.h>
#include <dbus/message.h>
#include <dbus/object_proxy.h>
#include <gtest/gtest_prod.h>
namespace vm_tools {
namespace concierge {
// Provides a proxy connection to the power manager dbus service.
class PowerManagerClient final {
public:
explicit PowerManagerClient(scoped_refptr<dbus::Bus> bus);
PowerManagerClient(const PowerManagerClient&) = delete;
PowerManagerClient& operator=(const PowerManagerClient&) = delete;
~PowerManagerClient();
// Registers a suspend delay with the power manager. Calls
// |suspend_imminent_cb| whenever the device is about to suspend and
// |suspend_done_cb| when the device resumes.
void RegisterSuspendDelay(base::Closure suspend_imminent_cb,
base::Closure suspend_done_cb);
private:
void HandleSuspendImminent(dbus::Signal* signal);
void HandleSuspendDone(dbus::Signal* signal);
void HandleNameOwnerChanged(const std::string& old_owner,
const std::string& new_owner);
void HandleSignalConnected(const std::string& interface_name,
const std::string& signal_name,
bool success);
scoped_refptr<dbus::Bus> bus_;
dbus::ObjectProxy* power_manager_proxy_; // owned by |bus_|
int32_t delay_id_;
int32_t current_suspend_id_;
base::Closure suspend_imminent_cb_;
base::Closure suspend_done_cb_;
base::WeakPtrFactory<PowerManagerClient> weak_factory_{this};
FRIEND_TEST(PowerManagerClientTest, SuspendReadiness);
FRIEND_TEST(PowerManagerClientTest, SuspendImminent);
FRIEND_TEST(PowerManagerClientTest, SuspendDone);
FRIEND_TEST(PowerManagerClientTest, WrongSuspendId);
FRIEND_TEST(PowerManagerClientTest, MultipleSuspendImminents);
FRIEND_TEST(PowerManagerClientTest, NameOwnerChanged);
};
} // namespace concierge
} // namespace vm_tools
#endif // VM_TOOLS_CONCIERGE_POWER_MANAGER_CLIENT_H_