blob: 83d5e1b8d2f1e8eb5c2270382ea4cb558d55ac51 [file] [log] [blame]
// 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_