95DBusMessage *
QDBusMessagePrivate::toDBusMessage(
const QDBusMessage &message, QDBusConnection::ConnectionCapabilities capabilities,
99 *error = QDBusError(QDBusError::Failed,
"Could not open lidbus-1 library"_L1);
103 DBusMessage *msg =
nullptr;
106 switch (d_ptr->type) {
107 case QDBusMessage::InvalidMessage:
110 case QDBusMessage::MethodCallMessage:
114 AllowEmptyFlag serviceCheckMode = capabilities & QDBusConnectionPrivate::ConnectionIsBus
115 ? EmptyNotAllowed : EmptyAllowed;
116 if (!checkBusName(d_ptr->service, serviceCheckMode, error))
126 msg = q_dbus_message_new_method_call(data(d_ptr->service.toUtf8()), d_ptr->path.toUtf8(),
127 data(d_ptr->interface.toUtf8()), d_ptr->name.toUtf8());
132 case QDBusMessage::ReplyMessage:
135 q_dbus_message_set_destination(msg, data(d_ptr->service.toUtf8()));
136 q_dbus_message_set_reply_serial(msg, d_ptr->serial);
139 case QDBusMessage::ErrorMessage:
146 q_dbus_message_set_error_name(msg, d_ptr->name.toUtf8());
148 q_dbus_message_set_destination(msg, data(d_ptr->service.toUtf8()));
149 q_dbus_message_set_reply_serial(msg, d_ptr->serial);
152 case QDBusMessage::SignalMessage:
165 msg = q_dbus_message_new_signal(d_ptr->path.toUtf8(), d_ptr->interface.toUtf8(),
166 d_ptr->name.toUtf8());
167 q_dbus_message_set_destination(msg, data(d_ptr->service.toUtf8()));
176 QDBusMarshaller marshaller(capabilities);
177 q_dbus_message_iter_init_append(msg, &marshaller.iterator);
178 if (!d_ptr->message.isEmpty())
180 marshaller.append(d_ptr->message);
181 for (
const QVariant &argument : std::as_const(d_ptr->arguments))
182 marshaller.appendVariantInternal(argument);
189 q_dbus_message_unref(msg);
190 *error = QDBusError(QDBusError::Failed,
"Marshalling failed: "_L1 + marshaller.errorString);
219QDBusMessage
QDBusMessagePrivate::fromDBusMessage(DBusMessage *dmsg, QDBusConnection::ConnectionCapabilities capabilities)
221 QDBusMessage message;
225 message.d_ptr->type = QDBusMessage::MessageType(q_dbus_message_get_type(dmsg));
226 message.d_ptr->serial = q_dbus_message_get_serial(dmsg);
227 message.d_ptr->path = QString::fromUtf8(q_dbus_message_get_path(dmsg));
228 message.d_ptr->interface = QString::fromUtf8(q_dbus_message_get_interface(dmsg));
230 QString::fromUtf8(q_dbus_message_get_error_name(dmsg)) :
231 QString::fromUtf8(q_dbus_message_get_member(dmsg));
232 message.d_ptr->service = QString::fromUtf8(q_dbus_message_get_sender(dmsg));
233 message.d_ptr->signature = QString::fromUtf8(q_dbus_message_get_signature(dmsg));
234 message.d_ptr->interactiveAuthorizationAllowed = q_dbus_message_get_allow_interactive_authorization(dmsg);
235 message.d_ptr->isReplyRequired = !q_dbus_message_get_no_reply(dmsg);
238 demarshaller.message = q_dbus_message_ref(dmsg);
239 if (q_dbus_message_iter_init(demarshaller.message, &demarshaller.iterator))
241 message << demarshaller.toVariantInternal();
251 const QDBusMessage &asSent)
259 QString computedSignature;
260 for (
const QVariant &argument : std::as_const(asSent.d_ptr->arguments)) {
261 QMetaType id = argument.metaType();
262 const char *signature = QDBusMetaType::typeToSignature(id);
263 if ((id.id() != QMetaType::QStringList && id.id() != QMetaType::QByteArray &&
264 qstrlen(signature) != 1) || id == QMetaType::fromType<QDBusVariant>()) {
269 DBusMessage *message = toDBusMessage(asSent, conn.connectionCapabilities(), &error);
272 return QDBusMessage::createError(error);
275 q_dbus_message_set_sender(message, conn.baseService.toUtf8());
277 QDBusMessage retval = fromDBusMessage(message, conn.connectionCapabilities());
278 retval.d_ptr->localMessage =
true;
279 q_dbus_message_unref(message);
280 if (retval.d_ptr->service.isEmpty())
281 retval.d_ptr->service = conn.baseService;
284 computedSignature += QLatin1StringView(signature);
292 d->arguments = asSent.d_ptr->arguments;
293 d->path = asSent.d_ptr->path;
294 d->interface = asSent.d_ptr->interface;
295 d->name = asSent.d_ptr->name;
296 d->message = asSent.d_ptr->message;
297 d->type = asSent.d_ptr->type;
299 d->service = conn.baseService;
300 d->signature = computedSignature;
384QDBusMessage QDBusMessage::createTargetedSignal(
const QString &service,
const QString &path,
385 const QString &interface,
const QString &name)
387 QDBusMessage message;
388 message.d_ptr->type = SignalMessage;
389 message.d_ptr->service = service;
390 message.d_ptr->path = path;
391 message.d_ptr->interface = interface;
392 message.d_ptr->name = name;
416QDBusMessage QDBusMessage::createMethodCall(
const QString &service,
const QString &path,
417 const QString &interface,
const QString &method)
419 QDBusMessage message;
420 message.d_ptr->type = MethodCallMessage;
421 message.d_ptr->service = service;
422 message.d_ptr->path = path;
423 message.d_ptr->interface = interface;
424 message.d_ptr->name = method;
425 message.d_ptr->isReplyRequired =
true;