You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
125 lines
2.6 KiB
C++
125 lines
2.6 KiB
C++
// SPDX-License-Identifier: BSD-2-Clause
|
|
// Copyright CM4all GmbH
|
|
// author: Max Kellermann <mk@cm4all.com>
|
|
|
|
#pragma once
|
|
|
|
#include <dbus/dbus.h>
|
|
|
|
#include <utility>
|
|
|
|
namespace ODBus {
|
|
|
|
class Message {
|
|
DBusMessage *msg = nullptr;
|
|
|
|
explicit Message(DBusMessage *_msg) noexcept
|
|
:msg(_msg) {}
|
|
|
|
public:
|
|
Message() noexcept = default;
|
|
|
|
Message(Message &&src) noexcept
|
|
:msg(std::exchange(src.msg, nullptr)) {}
|
|
|
|
~Message() noexcept {
|
|
if (msg != nullptr)
|
|
dbus_message_unref(msg);
|
|
}
|
|
|
|
DBusMessage *Get() noexcept {
|
|
return msg;
|
|
}
|
|
|
|
Message &operator=(Message &&src) noexcept {
|
|
std::swap(msg, src.msg);
|
|
return *this;
|
|
}
|
|
|
|
static Message NewMethodCall(const char *destination,
|
|
const char *path,
|
|
const char *iface,
|
|
const char *method);
|
|
|
|
static Message StealReply(DBusPendingCall &pending);
|
|
|
|
static Message Pop(DBusConnection &connection) noexcept;
|
|
|
|
bool IsDefined() const noexcept {
|
|
return msg != nullptr;
|
|
}
|
|
|
|
int GetType() noexcept {
|
|
return dbus_message_get_type(msg);
|
|
}
|
|
|
|
const char *GetPath() noexcept {
|
|
return dbus_message_get_path(msg);
|
|
}
|
|
|
|
bool HasPath(const char *object_path) noexcept {
|
|
return dbus_message_has_path(msg, object_path);
|
|
}
|
|
|
|
const char *GetInterface() noexcept {
|
|
return dbus_message_get_interface(msg);
|
|
}
|
|
|
|
bool HasInterface(const char *iface) noexcept {
|
|
return dbus_message_has_interface(msg, iface);
|
|
}
|
|
|
|
const char *GetMember() noexcept {
|
|
return dbus_message_get_member(msg);
|
|
}
|
|
|
|
bool HasMember(const char *member) noexcept {
|
|
return dbus_message_has_member(msg, member);
|
|
}
|
|
|
|
bool IsError(const char *error_name) const noexcept {
|
|
return dbus_message_is_error(msg, error_name);
|
|
}
|
|
|
|
const char *GetErrorName() const noexcept {
|
|
return dbus_message_get_error_name(msg);
|
|
}
|
|
|
|
const char *GetDestination() const noexcept {
|
|
return dbus_message_get_destination(msg);
|
|
}
|
|
|
|
const char *GetSender() const noexcept {
|
|
return dbus_message_get_sender(msg);
|
|
}
|
|
|
|
const char *GetSignature() const noexcept {
|
|
return dbus_message_get_signature(msg);
|
|
}
|
|
|
|
bool GetNoReply() const noexcept {
|
|
return dbus_message_get_no_reply(msg);
|
|
}
|
|
|
|
bool IsMethodCall(const char *iface,
|
|
const char *method) const noexcept {
|
|
return dbus_message_is_method_call(msg, iface, method);
|
|
}
|
|
|
|
bool IsSignal(const char *iface,
|
|
const char *signal_name) const noexcept {
|
|
return dbus_message_is_signal(msg, iface, signal_name);
|
|
}
|
|
|
|
void CheckThrowError();
|
|
|
|
template<typename... Args>
|
|
bool GetArgs(DBusError &error, Args... args) noexcept {
|
|
return dbus_message_get_args(msg, &error,
|
|
std::forward<Args>(args)...,
|
|
DBUS_TYPE_INVALID);
|
|
}
|
|
};
|
|
|
|
} /* namespace ODBus */
|