94DBusMessage *
QDBusMessagePrivate::toDBusMessage(
const QDBusMessage &message, QDBusConnection::ConnectionCapabilities capabilities,
98 *error = QDBusError(QDBusError::Failed,
"Could not open lidbus-1 library"_L1);
102 DBusMessage *msg =
nullptr;
105 switch (d_ptr->type) {
106 case QDBusMessage::InvalidMessage:
109 case QDBusMessage::MethodCallMessage:
113 AllowEmptyFlag serviceCheckMode = capabilities & QDBusConnectionPrivate::ConnectionIsBus
114 ? EmptyNotAllowed : EmptyAllowed;
115 if (!checkBusName(d_ptr->service, serviceCheckMode, error))
125 msg = q_dbus_message_new_method_call(data(d_ptr->service.toUtf8()), d_ptr->path.toUtf8(),
126 data(d_ptr->interface.toUtf8()), d_ptr->name.toUtf8());
131 case QDBusMessage::ReplyMessage:
134 q_dbus_message_set_destination(msg, data(d_ptr->service.toUtf8()));
135 q_dbus_message_set_reply_serial(msg, d_ptr->serial);
138 case QDBusMessage::ErrorMessage:
145 q_dbus_message_set_error_name(msg, d_ptr->name.toUtf8());
147 q_dbus_message_set_destination(msg, data(d_ptr->service.toUtf8()));
148 q_dbus_message_set_reply_serial(msg, d_ptr->serial);
151 case QDBusMessage::SignalMessage:
164 msg = q_dbus_message_new_signal(d_ptr->path.toUtf8(), d_ptr->interface.toUtf8(),
165 d_ptr->name.toUtf8());
166 q_dbus_message_set_destination(msg, data(d_ptr->service.toUtf8()));
175 QDBusMarshaller marshaller(capabilities);
176 q_dbus_message_iter_init_append(msg, &marshaller.iterator);
177 if (!d_ptr->message.isEmpty())
179 marshaller.append(d_ptr->message);
180 for (
const QVariant &argument : std::as_const(d_ptr->arguments))
181 marshaller.appendVariantInternal(argument);
188 q_dbus_message_unref(msg);
189 *error = QDBusError(QDBusError::Failed,
"Marshalling failed: "_L1 + marshaller.errorString);
218QDBusMessage
QDBusMessagePrivate::fromDBusMessage(DBusMessage *dmsg, QDBusConnection::ConnectionCapabilities capabilities)
220 QDBusMessage message;
224 message.d_ptr->type = QDBusMessage::MessageType(q_dbus_message_get_type(dmsg));
225 message.d_ptr->serial = q_dbus_message_get_serial(dmsg);
226 message.d_ptr->path = QString::fromUtf8(q_dbus_message_get_path(dmsg));
227 message.d_ptr->interface = QString::fromUtf8(q_dbus_message_get_interface(dmsg));
229 QString::fromUtf8(q_dbus_message_get_error_name(dmsg)) :
230 QString::fromUtf8(q_dbus_message_get_member(dmsg));
231 message.d_ptr->service = QString::fromUtf8(q_dbus_message_get_sender(dmsg));
232 message.d_ptr->signature = QString::fromUtf8(q_dbus_message_get_signature(dmsg));
233 message.d_ptr->interactiveAuthorizationAllowed = q_dbus_message_get_allow_interactive_authorization(dmsg);
234 message.d_ptr->isReplyRequired = !q_dbus_message_get_no_reply(dmsg);
237 demarshaller.message = q_dbus_message_ref(dmsg);
238 if (q_dbus_message_iter_init(demarshaller.message, &demarshaller.iterator))
240 message << demarshaller.toVariantInternal();
250 const QDBusMessage &asSent)
258 QString computedSignature;
259 for (
const QVariant &argument : std::as_const(asSent.d_ptr->arguments)) {
260 QMetaType id = argument.metaType();
261 const char *signature = QDBusMetaType::typeToSignature(id);
262 if ((id.id() != QMetaType::QStringList && id.id() != QMetaType::QByteArray &&
263 qstrlen(signature) != 1) || id == QMetaType::fromType<QDBusVariant>()) {
268 DBusMessage *message = toDBusMessage(asSent, conn.connectionCapabilities(), &error);
271 return QDBusMessage::createError(error);
274 q_dbus_message_set_sender(message, conn.baseService.toUtf8());
276 QDBusMessage retval = fromDBusMessage(message, conn.connectionCapabilities());
277 retval.d_ptr->localMessage =
true;
278 q_dbus_message_unref(message);
279 if (retval.d_ptr->service.isEmpty())
280 retval.d_ptr->service = conn.baseService;
283 computedSignature += QLatin1StringView(signature);
291 d->arguments = asSent.d_ptr->arguments;
292 d->path = asSent.d_ptr->path;
293 d->interface = asSent.d_ptr->interface;
294 d->name = asSent.d_ptr->name;
295 d->message = asSent.d_ptr->message;
296 d->type = asSent.d_ptr->type;
298 d->service = conn.baseService;
299 d->signature = computedSignature;
383QDBusMessage QDBusMessage::createTargetedSignal(
const QString &service,
const QString &path,
384 const QString &interface,
const QString &name)
386 QDBusMessage message;
387 message.d_ptr->type = SignalMessage;
388 message.d_ptr->service = service;
389 message.d_ptr->path = path;
390 message.d_ptr->interface = interface;
391 message.d_ptr->name = name;
415QDBusMessage QDBusMessage::createMethodCall(
const QString &service,
const QString &path,
416 const QString &interface,
const QString &method)
418 QDBusMessage message;
419 message.d_ptr->type = MethodCallMessage;
420 message.d_ptr->service = service;
421 message.d_ptr->path = path;
422 message.d_ptr->interface = interface;
423 message.d_ptr->name = method;
424 message.d_ptr->isReplyRequired =
true;