// Copyright 2017 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 DEBUGD_SRC_HELPERS_SYSTEM_SERVICE_PROXY_H_
#define DEBUGD_SRC_HELPERS_SYSTEM_SERVICE_PROXY_H_

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

#include <base/macros.h>
#include <base/memory/ref_counted.h>
#include <base/values.h>
#include <dbus/bus.h>
#include <dbus/message.h>
#include <dbus/object_proxy.h>

namespace debugd {

// Implements a D-Bus proxy to interact with a service on the system bus.
// The typical usage of this class looks like:
//
//    auto proxy = SystemServiceProxy::Create("org.chromium.Service1");
//
//    // To call a method:
//    dbus::MethodCall method("org.chromium.Service1.Interface1", "Method1");
//    auto response = proxy->CallMethodAndGetResponse(
//        dbus::ObjectPath("/org/chromium/Service1/Object1"), &method);
//
//    // To obtain properties:
//    auto properties = proxy->GetProperties(
//        "org.chromium.Service1.Interface2",
//        dbus::ObjectPath("/org/chromium/Service1/Object2"));
//
class SystemServiceProxy {
 public:
  // Creates a D-Bus proxy for the system service identified by |service_name|
  // and connects to the system bus. Returns an instance after it successfully
  // connects to the system bus, or nullptr on error.
  static std::unique_ptr<SystemServiceProxy> Create(
      const std::string& service_name);

  virtual ~SystemServiceProxy() = default;

  // Calls the specified D-Bus method |method_call| on a D-Bus object
  // identified by |object_path| and waits for the response until the default
  // timeout is reached. Returns the response represented as a base::Value or a
  // base::nullopt on error.
  base::Optional<base::Value> CallMethodAndGetResponse(
      const dbus::ObjectPath& object_path, dbus::MethodCall* method_call);

  // Gets the properties associated with the interface named |interface_name|
  // of a D-Bus object identified by |object_path|. The properties are expected
  // to be a dictionary. Returns base::nullopt on error. The implementation
  // provided by this class uses org.freedesktop.DBus.Properties.GetAll to
  // retrieve properties, but a derived class can override this method to use an
  // alternative means to retrieve properties.
  virtual base::Optional<base::Value> GetProperties(
      const std::string& interface_name, const dbus::ObjectPath& object_path);

  // Returns a map from object path to object properties with the interface
  // named |interface_name| for each object listed in |object_paths|.
  base::Value BuildObjectPropertiesMap(
      const std::string& interface_name,
      const std::vector<dbus::ObjectPath>& object_paths);

  // Gets a list of object paths from a property named |property_name| in the
  // provided property set |properties|. The property is expected to be a list
  // of object paths. Any non-string entry in the list is ignored. If the
  // property isn't found or isn't a list, returns an empty list.
  static std::vector<dbus::ObjectPath> GetObjectPaths(
      const base::Value& properties, const std::string& property_name);

 protected:
  SystemServiceProxy(scoped_refptr<dbus::Bus> bus,
                     const std::string& service_name);
  SystemServiceProxy(const SystemServiceProxy&) = delete;
  SystemServiceProxy& operator=(const SystemServiceProxy&) = delete;

  // Connects to the system bus. Returns the Bus instance after a successful
  // connection or nullptr on error.
  static scoped_refptr<dbus::Bus> ConnectToSystemBus();

 private:
  scoped_refptr<dbus::Bus> bus_;
  const std::string service_name_;
};

}  // namespace debugd

#endif  // DEBUGD_SRC_HELPERS_SYSTEM_SERVICE_PROXY_H_
