// Copyright 2018 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 SHILL_DBUS_CHROMEOS_POWER_MANAGER_PROXY_H_
#define SHILL_DBUS_CHROMEOS_POWER_MANAGER_PROXY_H_

// An implementation of PowerManagerProxyInterface.  It connects to the dbus and
// listens for events from the power manager.  When they occur, the delegate's
// member functions are called.

#include <stdint.h>

#include <memory>
#include <string>
#include <vector>

#include <base/compiler_specific.h>
#include <power_manager/dbus-proxies.h>

#include "shill/power_manager_proxy_interface.h"

namespace shill {

class EventDispatcher;

class ChromeosPowerManagerProxy : public PowerManagerProxyInterface {
 public:
  // Constructs a PowerManager DBus object proxy with signals dispatched to
  // |delegate|.
  ChromeosPowerManagerProxy(
      EventDispatcher* dispatcher,
      const scoped_refptr<dbus::Bus>& bus,
      PowerManagerProxyDelegate* delegate,
      const base::Closure& service_appeared_callback,
      const base::Closure& service_vanished_callback);
  ~ChromeosPowerManagerProxy() override;

  // Inherited from PowerManagerProxyInterface.
  bool RegisterSuspendDelay(base::TimeDelta timeout,
                            const std::string& description,
                            int* delay_id_out) override;
  bool UnregisterSuspendDelay(int delay_id) override;
  bool ReportSuspendReadiness(int delay_id, int suspend_id) override;
  bool RegisterDarkSuspendDelay(base::TimeDelta timeout,
                                const std::string& description,
                                int* delay_id_out) override;
  bool UnregisterDarkSuspendDelay(int delay_id) override;
  bool ReportDarkSuspendReadiness(int delay_id, int suspend_id) override;
  bool RecordDarkResumeWakeReason(const std::string& wake_reason) override;

 private:
  // Signal handlers.
  void SuspendImminent(const std::vector<uint8_t>& serialized_proto);
  void SuspendDone(const std::vector<uint8_t>& serialized_proto);
  void DarkSuspendImminent(
      const std::vector<uint8_t>& serialized_proto);

  bool RegisterSuspendDelayInternal(bool is_dark,
                                    base::TimeDelta timeout,
                                    const std::string& description,
                                    int* delay_id_out);
  bool UnregisterSuspendDelayInternal(bool is_dark, int delay_id);
  bool ReportSuspendReadinessInternal(bool is_dark,
                                      int delay_id,
                                      int suspend_id);

  // Called when service appeared or vanished.
  void OnServiceAvailable(bool available);

  // Service name owner changed handler.
  void OnServiceOwnerChanged(const std::string& old_owner,
                             const std::string& new_owner);

  // Called when signal is connected to the ObjectProxy.
  void OnSignalConnected(const std::string& interface_name,
                         const std::string& signal_name,
                         bool success);

  // Invoke |service_appeared_callback_| if it is set.
  void OnServiceAppeared();

  // Invoke |service_vanished_callback_| if it is set.
  void OnServiceVanished();

  std::unique_ptr<org::chromium::PowerManagerProxy> proxy_;
  EventDispatcher* dispatcher_;
  PowerManagerProxyDelegate* delegate_;
  base::Closure service_appeared_callback_;
  base::Closure service_vanished_callback_;
  bool service_available_;

  base::WeakPtrFactory<ChromeosPowerManagerProxy> weak_factory_{this};
  DISALLOW_COPY_AND_ASSIGN(ChromeosPowerManagerProxy);
};

}  // namespace shill

#endif  // SHILL_DBUS_CHROMEOS_POWER_MANAGER_PROXY_H_
