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());
168 q_dbus_message_set_destination(msg, data(d_ptr->service.toUtf8()));
177 QDBusMarshaller marshaller(capabilities);
178 q_dbus_message_iter_init_append(msg, &marshaller.iterator);
179 if (!d_ptr->message.isEmpty())
181 marshaller.append(d_ptr->message);
182 for (
const QVariant &argument : std::as_const(d_ptr->arguments))
183 marshaller.appendVariantInternal(argument);
190 q_dbus_message_unref(msg);
191 *error = QDBusError(QDBusError::Failed,
"Marshalling failed: "_L1 + marshaller.errorString);
220QDBusMessage
QDBusMessagePrivate::fromDBusMessage(DBusMessage *dmsg, QDBusConnection::ConnectionCapabilities capabilities)
222 QDBusMessage message;
226 message.d_ptr->type = QDBusMessage::MessageType(q_dbus_message_get_type(dmsg));
227 message.d_ptr->serial = q_dbus_message_get_serial(dmsg);
228 message.d_ptr->path = QString::fromUtf8(q_dbus_message_get_path(dmsg));
229 message.d_ptr->interface = QString::fromUtf8(q_dbus_message_get_interface(dmsg));
231 QString::fromUtf8(q_dbus_message_get_error_name(dmsg)) :
232 QString::fromUtf8(q_dbus_message_get_member(dmsg));
233 message.d_ptr->service = QString::fromUtf8(q_dbus_message_get_sender(dmsg));
234 message.d_ptr->signature = QString::fromUtf8(q_dbus_message_get_signature(dmsg));
235 message.d_ptr->interactiveAuthorizationAllowed = q_dbus_message_get_allow_interactive_authorization(dmsg);
236 message.d_ptr->isReplyRequired = !q_dbus_message_get_no_reply(dmsg);
239 demarshaller.message = q_dbus_message_ref(dmsg);
240 if (q_dbus_message_iter_init(demarshaller.message, &demarshaller.iterator))
242 message << demarshaller.toVariantInternal();
252 const QDBusMessage &asSent)
260 QString computedSignature;
261 for (
const QVariant &argument : std::as_const(asSent.d_ptr->arguments)) {
262 QMetaType id = argument.metaType();
263 const char *signature = QDBusMetaType::typeToSignature(id);
264 if ((id.id() != QMetaType::QStringList && id.id() != QMetaType::QByteArray &&
265 qstrlen(signature) != 1) || id == QMetaType::fromType<QDBusVariant>()) {
270 DBusMessage *message = toDBusMessage(asSent, conn.connectionCapabilities(), &error);
273 return QDBusMessage::createError(error);
276 q_dbus_message_set_sender(message, conn.baseService.toUtf8());
278 QDBusMessage retval = fromDBusMessage(message, conn.connectionCapabilities());
279 retval.d_ptr->localMessage =
true;
280 q_dbus_message_unref(message);
281 if (retval.d_ptr->service.isEmpty())
282 retval.d_ptr->service = conn.baseService;
285 computedSignature += QLatin1StringView(signature);
293 d->arguments = asSent.d_ptr->arguments;
294 d->path = asSent.d_ptr->path;
295 d->interface = asSent.d_ptr->interface;
296 d->name = asSent.d_ptr->name;
297 d->message = asSent.d_ptr->message;
298 d->type = asSent.d_ptr->type;
300 d->service = conn.baseService;
301 d->signature = computedSignature;
385QDBusMessage QDBusMessage::createTargetedSignal(
const QString &service,
const QString &path,
386 const QString &interface,
const QString &name)
388 QDBusMessage message;
389 message.d_ptr->type = SignalMessage;
390 message.d_ptr->service = service;
391 message.d_ptr->path = path;
392 message.d_ptr->interface = interface;
393 message.d_ptr->name = name;
417QDBusMessage QDBusMessage::createMethodCall(
const QString &service,
const QString &path,
418 const QString &interface,
const QString &method)
420 QDBusMessage message;
421 message.d_ptr->type = MethodCallMessage;
422 message.d_ptr->service = service;
423 message.d_ptr->path = path;
424 message.d_ptr->interface = interface;
425 message.d_ptr->name = method;
426 message.d_ptr->isReplyRequired =
true;