#ifndef COMPONENTS_DBUS_UTILS_CONNECT_TO_SIGNAL_H_
#define COMPONENTS_DBUS_UTILS_CONNECT_TO_SIGNAL_H_
#include <string>
#include <tuple>
#include <type_traits>
#include <utility>
#include "base/functional/bind.h"
#include "base/functional/callback.h"
#include "base/types/expected.h"
#include "components/dbus/utils/read_message.h"
#include "components/dbus/utils/read_value.h"
#include "components/dbus/utils/signature.h"
#include "components/dbus/utils/types.h"
#include "dbus/message.h"
#include "dbus/object_proxy.h"
namespace dbus_utils {
template <typename... Args>
using ConnectToSignalResult =
base::expected<std::tuple<Args...>, MessageFormatError>;
template <SignatureLiteral ArgsSignature>
using ConnectToSignalResultSig =
base::expected<internal::ParseDBusSignaturePack<ArgsSignature>,
MessageFormatError>;
namespace internal {
template <SignatureLiteral ArgsSignature>
void OnSignal(
base::RepeatingCallback<void(ConnectToSignalResultSig<ArgsSignature>)>
signal_callback,
dbus::Signal* signal) {
using ArgsTuple = internal::ParseDBusSignaturePack<ArgsSignature>;
signal_callback.Run(ReadMessage<ArgsTuple>(*signal));
}
}
template <SignatureLiteral ArgsSignature>
void ConnectToSignal(
dbus::ObjectProxy* proxy,
const std::string& interface,
const std::string& signal,
base::RepeatingCallback<void(ConnectToSignalResultSig<ArgsSignature>)>
signal_callback,
dbus::ObjectProxy::OnConnectedCallback on_connected_callback) {
proxy->ConnectToSignal(interface, signal,
base::BindRepeating(&internal::OnSignal<ArgsSignature>,
std::move(signal_callback)),
std::move(on_connected_callback));
}
}
#endif