mpd/src/lib/dbus/Message.hxx
Max Kellermann dc111bbec2 odbus: import dbus-1 OO wrapper library
From a7cef404c1

To be used by upcoming code.
2018-06-02 19:15:56 +02:00

157 lines
3.9 KiB
C++

/*
* Copyright 2007-2017 Content Management AG
* All rights reserved.
*
* author: Max Kellermann <mk@cm4all.com>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the
* distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef ODBUS_MESSAGE_HXX
#define ODBUS_MESSAGE_HXX
#include <dbus/dbus.h>
#include <algorithm>
#include <stdexcept>
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);
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 */
#endif