FlightGear next
dbusmessage.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: (C) 2019-2022 swift Project Community / Contributors (https://swift-project.org/)
3 * SPDX-FileCopyrightText: (C) 2019-2022 Lars Toenning <dev@ltoenning.de>
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
7#include "dbusmessage.h"
8
9namespace flightgear::swift {
10
11CDBusMessage::CDBusMessage(DBusMessage* message)
12{
13 m_message = dbus_message_ref(message);
14}
15
17{
18 m_message = dbus_message_ref(other.m_message);
19 m_serial = other.m_serial;
20}
21
22CDBusMessage::CDBusMessage(DBusMessage* message, dbus_uint32_t serial)
23{
24 m_message = dbus_message_ref(message);
25 m_serial = serial;
26}
27
29{
30 dbus_message_unref(m_message);
31}
32
34{
35 std::swap(m_serial, other.m_serial);
36 m_message = dbus_message_ref(other.m_message);
37 return *this;
38}
39
41{
42 return dbus_message_get_type(m_message) == DBUS_MESSAGE_TYPE_METHOD_CALL;
43}
44
46{
47 return !dbus_message_get_no_reply(m_message);
48}
49
50std::string CDBusMessage::getSender() const
51{
52 const char* sender = dbus_message_get_sender(m_message);
53 return sender ? std::string(sender) : std::string();
54}
55
56dbus_uint32_t CDBusMessage::getSerial() const
57{
58 return dbus_message_get_serial(m_message);
59}
60
62{
63 return dbus_message_get_interface(m_message);
64}
65
66std::string CDBusMessage::getObjectPath() const
67{
68 return dbus_message_get_path(m_message);
69}
70
71std::string CDBusMessage::getMethodName() const
72{
73 return dbus_message_get_member(m_message);
74}
75
77{
78 dbus_message_iter_init_append(m_message, &m_messageIterator);
79}
80
82{
83 dbus_bool_t boolean = value ? 1 : 0;
84 dbus_message_iter_append_basic(&m_messageIterator, DBUS_TYPE_BOOLEAN, &boolean);
85}
86
87void CDBusMessage::appendArgument(const char* value)
88{
89 dbus_message_iter_append_basic(&m_messageIterator, DBUS_TYPE_STRING, &value);
90}
91
92void CDBusMessage::appendArgument(const std::string& value)
93{
94 const char* ptr = value.c_str();
95 dbus_message_iter_append_basic(&m_messageIterator, DBUS_TYPE_STRING, &ptr);
96}
97
99{
100 dbus_int32_t i = value;
101 dbus_message_iter_append_basic(&m_messageIterator, DBUS_TYPE_INT32, &i);
102}
103
105{
106 dbus_message_iter_append_basic(&m_messageIterator, DBUS_TYPE_DOUBLE, &value);
107}
108
109void CDBusMessage::appendArgument(const std::vector<double>& array)
110{
111 DBusMessageIter arrayIterator;
112 dbus_message_iter_open_container(&m_messageIterator, DBUS_TYPE_ARRAY, DBUS_TYPE_DOUBLE_AS_STRING, &arrayIterator);
113 const double* ptr = array.data();
114 dbus_message_iter_append_fixed_array(&arrayIterator, DBUS_TYPE_DOUBLE, &ptr, static_cast<int>(array.size()));
115 dbus_message_iter_close_container(&m_messageIterator, &arrayIterator);
116}
117
118void CDBusMessage::appendArgument(const std::vector<std::string>& array)
119{
120 DBusMessageIter arrayIterator;
121 dbus_message_iter_open_container(&m_messageIterator, DBUS_TYPE_ARRAY, DBUS_TYPE_STRING_AS_STRING, &arrayIterator);
122 for (const auto& i : array) {
123 const char* ptr = i.c_str();
124 dbus_message_iter_append_basic(&arrayIterator, DBUS_TYPE_STRING, &ptr);
125 }
126 dbus_message_iter_close_container(&m_messageIterator, &arrayIterator);
127}
128
130{
131 dbus_message_iter_init(m_message, &m_messageIterator);
132}
133
135{
136 if (dbus_message_iter_get_arg_type(&m_messageIterator) != DBUS_TYPE_INT32) { return; }
137 dbus_int32_t i;
138 dbus_message_iter_get_basic(&m_messageIterator, &i);
139 value = i;
140 dbus_message_iter_next(&m_messageIterator);
141}
142
144{
145 if (dbus_message_iter_get_arg_type(&m_messageIterator) != DBUS_TYPE_BOOLEAN) { return; }
146 dbus_bool_t v;
147 dbus_message_iter_get_basic(&m_messageIterator, &v);
148 if (v == TRUE) {
149 value = true;
150 } else {
151 value = false;
152 }
153 dbus_message_iter_next(&m_messageIterator);
154}
155
156void CDBusMessage::getArgument(double& value)
157{
158 if (dbus_message_iter_get_arg_type(&m_messageIterator) != DBUS_TYPE_DOUBLE) { return; }
159 dbus_message_iter_get_basic(&m_messageIterator, &value);
160 dbus_message_iter_next(&m_messageIterator);
161}
162
163void CDBusMessage::getArgument(std::string& value)
164{
165 const char* str = nullptr;
166 if (dbus_message_iter_get_arg_type(&m_messageIterator) != DBUS_TYPE_STRING) { return; }
167 dbus_message_iter_get_basic(&m_messageIterator, &str);
168 dbus_message_iter_next(&m_messageIterator);
169 value = std::string(str);
170}
171
172void CDBusMessage::getArgument(std::vector<int>& value)
173{
174 DBusMessageIter arrayIterator;
175 dbus_message_iter_recurse(&m_messageIterator, &arrayIterator);
176 do {
177 if (dbus_message_iter_get_arg_type(&arrayIterator) != DBUS_TYPE_INT32) { return; }
178 dbus_int32_t i;
179 dbus_message_iter_get_basic(&arrayIterator, &i);
180 value.push_back(i);
181 } while (dbus_message_iter_next(&arrayIterator));
182 dbus_message_iter_next(&m_messageIterator);
183}
184
185void CDBusMessage::getArgument(std::vector<bool>& value)
186{
187 if (dbus_message_iter_get_arg_type(&m_messageIterator) != DBUS_TYPE_ARRAY) { return; }
188 DBusMessageIter arrayIterator;
189 dbus_message_iter_recurse(&m_messageIterator, &arrayIterator);
190 do {
191 if (dbus_message_iter_get_arg_type(&arrayIterator) != DBUS_TYPE_BOOLEAN) { return; }
192 dbus_bool_t b;
193 dbus_message_iter_get_basic(&arrayIterator, &b);
194 if (b == TRUE) {
195 value.push_back(true);
196 } else {
197 value.push_back(false);
198 }
199 } while (dbus_message_iter_next(&arrayIterator));
200 dbus_message_iter_next(&m_messageIterator);
201}
202
203void CDBusMessage::getArgument(std::vector<double>& value)
204{
205 DBusMessageIter arrayIterator;
206 dbus_message_iter_recurse(&m_messageIterator, &arrayIterator);
207 do {
208 if (dbus_message_iter_get_arg_type(&arrayIterator) != DBUS_TYPE_DOUBLE) { return; }
209 double d;
210 dbus_message_iter_get_basic(&arrayIterator, &d);
211 value.push_back(d);
212 } while (dbus_message_iter_next(&arrayIterator));
213 dbus_message_iter_next(&m_messageIterator);
214}
215
216void CDBusMessage::getArgument(std::vector<std::string>& value)
217{
218 DBusMessageIter arrayIterator;
219 dbus_message_iter_recurse(&m_messageIterator, &arrayIterator);
220 do {
221 if (dbus_message_iter_get_arg_type(&arrayIterator) != DBUS_TYPE_STRING) { return; }
222 const char* str = nullptr;
223 dbus_message_iter_get_basic(&arrayIterator, &str);
224 value.push_back(std::string(str));
225 } while (dbus_message_iter_next(&arrayIterator));
226 dbus_message_iter_next(&m_messageIterator);
227}
228
229CDBusMessage CDBusMessage::createSignal(const std::string& path, const std::string& interfaceName, const std::string& signalName)
230{
231 DBusMessage* signal = dbus_message_new_signal(path.c_str(), interfaceName.c_str(), signalName.c_str());
232 return CDBusMessage(signal);
233}
234
235CDBusMessage CDBusMessage::createReply(const std::string& destination, dbus_uint32_t serial)
236{
237 DBusMessage* reply = dbus_message_new(DBUS_MESSAGE_TYPE_METHOD_RETURN);
238 dbus_message_set_no_reply(reply, TRUE);
239 if (!destination.empty()) { dbus_message_set_destination(reply, destination.c_str()); }
240 dbus_message_set_reply_serial(reply, serial);
241 CDBusMessage msg(reply);
242 dbus_message_unref(reply);
243 return msg;
244}
245
246} // namespace flightgear::swift
#define i(x)
static CDBusMessage createSignal(const std::string &path, const std::string &interfaceName, const std::string &signalName)
Creates a DBus message containing a DBus signal.
void appendArgument(bool value)
Append argument.
bool isMethodCall() const
Is this message a method call?
static CDBusMessage createReply(const std::string &destination, dbus_uint32_t serial)
Creates a DBus message containing a DBus reply.
std::string getSender() const
Get the message sender.
std::string getObjectPath() const
Get the called object path.
dbus_uint32_t getSerial() const
Get the message serial. This is usally required for reply message.
std::string getMethodName() const
Get the called method name.
std::string getInterfaceName() const
Get the called interface name.
CDBusMessage(DBusMessage *message)
Constructor.
bool wantsReply() const
Does this message want a reply?
void getArgument(int &value)
Read single argument.
void beginArgumentRead()
Begin reading arguments.
void beginArgumentWrite()
Begin writing argument.
CDBusMessage & operator=(CDBusMessage other)
Assignment operator.