4 #include "dbusmessage.h"
13 m_message = dbus_message_ref(other.m_message);
14 m_serial = other.m_serial;
19 m_message = dbus_message_ref(message);
28 m_message = dbus_message_ref(other.m_message);
34 return dbus_message_get_type(m_message) == DBUS_MESSAGE_TYPE_METHOD_CALL;
41 const char *sender = dbus_message_get_sender(m_message);
42 return sender ? std::string(sender) : std::string();
57 dbus_bool_t
boolean = value ? 1 : 0;
58 dbus_message_iter_append_basic(&m_messageIterator, DBUS_TYPE_BOOLEAN, &
boolean);
63 dbus_message_iter_append_basic(&m_messageIterator, DBUS_TYPE_STRING, &value);
68 const char *ptr = value.c_str();
69 dbus_message_iter_append_basic(&m_messageIterator, DBUS_TYPE_STRING, &ptr);
74 dbus_int32_t i = value;
75 dbus_message_iter_append_basic(&m_messageIterator, DBUS_TYPE_INT32, &i);
80 dbus_message_iter_append_basic(&m_messageIterator, DBUS_TYPE_DOUBLE, &value);
92 DBusMessageIter arrayIterator;
93 dbus_message_iter_open_container(&m_messageIterator, DBUS_TYPE_ARRAY, DBUS_TYPE_BOOLEAN_AS_STRING,
96 const std::vector<unsigned> ints(array.begin(), array.end());
97 const unsigned *ptr = ints.data();
98 dbus_message_iter_append_fixed_array(&arrayIterator, DBUS_TYPE_BOOLEAN, &ptr,
static_cast<int>(array.size()));
99 dbus_message_iter_close_container(&m_messageIterator, &arrayIterator);
104 DBusMessageIter arrayIterator;
105 dbus_message_iter_open_container(&m_messageIterator, DBUS_TYPE_ARRAY, DBUS_TYPE_DOUBLE_AS_STRING,
107 const double *ptr = array.data();
108 dbus_message_iter_append_fixed_array(&arrayIterator, DBUS_TYPE_DOUBLE, &ptr,
static_cast<int>(array.size()));
109 dbus_message_iter_close_container(&m_messageIterator, &arrayIterator);
114 DBusMessageIter arrayIterator;
115 dbus_message_iter_open_container(&m_messageIterator, DBUS_TYPE_ARRAY, DBUS_TYPE_STRING_AS_STRING,
117 for (
const auto &i : array)
119 const char *ptr = i.c_str();
120 dbus_message_iter_append_basic(&arrayIterator, DBUS_TYPE_STRING, &ptr);
122 dbus_message_iter_close_container(&m_messageIterator, &arrayIterator);
129 if (dbus_message_iter_get_arg_type(&m_messageIterator) != DBUS_TYPE_INT32) {
return; }
131 dbus_message_iter_get_basic(&m_messageIterator, &i);
133 dbus_message_iter_next(&m_messageIterator);
138 if (dbus_message_iter_get_arg_type(&m_messageIterator) != DBUS_TYPE_BOOLEAN) {
return; }
140 dbus_message_iter_get_basic(&m_messageIterator, &v);
141 if (v == TRUE) { value =
true; }
142 else { value =
false; }
143 dbus_message_iter_next(&m_messageIterator);
148 if (dbus_message_iter_get_arg_type(&m_messageIterator) != DBUS_TYPE_DOUBLE) {
return; }
149 dbus_message_iter_get_basic(&m_messageIterator, &value);
150 dbus_message_iter_next(&m_messageIterator);
155 const char *str =
nullptr;
156 if (dbus_message_iter_get_arg_type(&m_messageIterator) != DBUS_TYPE_STRING) {
return; }
157 dbus_message_iter_get_basic(&m_messageIterator, &str);
158 dbus_message_iter_next(&m_messageIterator);
159 value = std::string(str);
164 DBusMessageIter arrayIterator;
165 dbus_message_iter_recurse(&m_messageIterator, &arrayIterator);
167 if (dbus_message_iter_get_arg_type(&arrayIterator) != DBUS_TYPE_INT32) {
return; }
169 dbus_message_iter_get_basic(&arrayIterator, &i);
172 while (dbus_message_iter_next(&arrayIterator));
173 dbus_message_iter_next(&m_messageIterator);
178 if (dbus_message_iter_get_arg_type(&m_messageIterator) != DBUS_TYPE_ARRAY) {
return; }
179 DBusMessageIter arrayIterator;
180 dbus_message_iter_recurse(&m_messageIterator, &arrayIterator);
182 if (dbus_message_iter_get_arg_type(&arrayIterator) != DBUS_TYPE_BOOLEAN) {
return; }
184 dbus_message_iter_get_basic(&arrayIterator, &b);
185 if (b == TRUE) { value.push_back(
true); }
186 else { value.push_back(
false); }
188 while (dbus_message_iter_next(&arrayIterator));
189 dbus_message_iter_next(&m_messageIterator);
194 DBusMessageIter arrayIterator;
195 dbus_message_iter_recurse(&m_messageIterator, &arrayIterator);
197 if (dbus_message_iter_get_arg_type(&arrayIterator) != DBUS_TYPE_DOUBLE) {
return; }
199 dbus_message_iter_get_basic(&arrayIterator, &d);
202 while (dbus_message_iter_next(&arrayIterator));
203 dbus_message_iter_next(&m_messageIterator);
208 DBusMessageIter arrayIterator;
209 dbus_message_iter_recurse(&m_messageIterator, &arrayIterator);
211 if (dbus_message_iter_get_arg_type(&arrayIterator) != DBUS_TYPE_STRING) {
return; }
212 const char *str =
nullptr;
213 dbus_message_iter_get_basic(&arrayIterator, &str);
214 value.push_back(std::string(str));
216 while (dbus_message_iter_next(&arrayIterator));
217 dbus_message_iter_next(&m_messageIterator);
221 const std::string &signalName)
223 DBusMessage *signal = dbus_message_new_signal(path.c_str(), interfaceName.c_str(), signalName.c_str());
229 DBusMessage *reply = dbus_message_new(DBUS_MESSAGE_TYPE_METHOD_RETURN);
230 dbus_message_set_no_reply(reply, TRUE);
231 if (!destination.empty()) { dbus_message_set_destination(reply, destination.c_str()); }
232 dbus_message_set_reply_serial(reply, serial);
234 dbus_message_unref(reply);
CDBusMessage & operator=(CDBusMessage other)
Assignment operator.
bool wantsReply() const
Does this message want a reply?
bool isMethodCall() const
Is this message a method call?
void appendArgument(bool value)
Append argument. Make sure to call.
void getArgument(int &value)
Read single argument. Make sure to call.
std::string getSender() const
Get the message sender.
std::string_view getObjectPath() const
Get the called object path.
std::string_view getMethodName() const
Get the called method name.
dbus_uint32_t getSerial() const
Get the message serial. This is usally required for reply message.
std::string_view getInterfaceName() const
Get the called interface name.
CDBusMessage(DBusMessage *message)
Constructor.
void beginArgumentRead()
Begin reading arguments.
void beginArgumentWrite()
Begin writing argument.
static CDBusMessage createReply(const std::string &destination, dbus_uint32_t serial)
Creates a DBus message containing a DBus reply.
static CDBusMessage createSignal(const std::string &path, const std::string &interfaceName, const std::string &signalName)
Creates a DBus message containing a DBus signal.
~CDBusMessage()
Destructor.
Plugin loaded by X-Plane which publishes a DBus service.
void swap(Optional< T > &a, Optional< T > &b) noexcept(std::is_nothrow_swappable_v< T >)
Efficient swap for two Optional objects.