void QDBusMarshaller::open(QDBusMarshaller &sub, int code, const char *signature) { sub.parent = this; sub.ba = ba; sub.ok = true; if (ba) switch (code) { case DBUS_TYPE_ARRAY: *ba += char(code); *ba += signature; // fall through case DBUS_TYPE_DICT_ENTRY: sub.closeCode = 0; break; case DBUS_TYPE_STRUCT: *ba += DBUS_STRUCT_BEGIN_CHAR; sub.closeCode = DBUS_STRUCT_END_CHAR; break; } else q_dbus_message_iter_open_container(&iterator, code, signature, &sub.iterator); }
void QDBusMarshaller::open(QDBusMarshaller &sub, int code, const char *signature) { sub.parent = this; sub.ba = ba; sub.ok = true; sub.capabilities = capabilities; sub.skipSignature = skipSignature; if (ba) { if (!skipSignature) { switch (code) { case DBUS_TYPE_ARRAY: *ba += char(code); *ba += signature; Q_FALLTHROUGH(); case DBUS_TYPE_DICT_ENTRY: sub.closeCode = 0; sub.skipSignature = true; break; case DBUS_TYPE_STRUCT: *ba += DBUS_STRUCT_BEGIN_CHAR; sub.closeCode = DBUS_STRUCT_END_CHAR; break; } } } else { q_dbus_message_iter_open_container(&iterator, code, signature, &sub.iterator); } }
bool QDBusMarshaller::appendCrossMarshalling(QDBusDemarshaller *demarshaller) { int code = q_dbus_message_iter_get_arg_type(&demarshaller->iterator); if (QDBusUtil::isValidBasicType(code)) { // easy: just append // do exactly like the D-BUS docs suggest // (see apidocs for q_dbus_message_iter_get_basic) qlonglong value; q_dbus_message_iter_get_basic(&demarshaller->iterator, &value); q_dbus_message_iter_next(&demarshaller->iterator); q_dbus_message_iter_append_basic(&iterator, code, &value); return true; } if (code == DBUS_TYPE_ARRAY) { int element = q_dbus_message_iter_get_element_type(&demarshaller->iterator); if (QDBusUtil::isValidFixedType(element) && element != DBUS_TYPE_UNIX_FD) { // another optimization: fixed size arrays // code is exactly like QDBusDemarshaller::toByteArray DBusMessageIter sub; q_dbus_message_iter_recurse(&demarshaller->iterator, &sub); q_dbus_message_iter_next(&demarshaller->iterator); int len; void* data; q_dbus_message_iter_get_fixed_array(&sub,&data,&len); char signature[2] = { char(element), 0 }; q_dbus_message_iter_open_container(&iterator, DBUS_TYPE_ARRAY, signature, &sub); q_dbus_message_iter_append_fixed_array(&sub, element, &data, len); q_dbus_message_iter_close_container(&iterator, &sub); return true; } } // We have to recurse QDBusDemarshaller *drecursed = demarshaller->beginCommon(); QDBusMarshaller mrecursed(capabilities); // create on the stack makes it autoclose QByteArray subSignature; const char *sig = 0; if (code == DBUS_TYPE_VARIANT || code == DBUS_TYPE_ARRAY) { subSignature = drecursed->currentSignature().toLatin1(); if (!subSignature.isEmpty()) sig = subSignature.constData(); } open(mrecursed, code, sig); while (!drecursed->atEnd()) { if (!mrecursed.appendCrossMarshalling(drecursed)) { delete drecursed; return false; } } delete drecursed; return true; }
inline void QDBusMarshaller::append(const QByteArray &arg) { if (ba) { *ba += DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_BYTE_AS_STRING; return; } const char* cdata = arg.constData(); DBusMessageIter subiterator; q_dbus_message_iter_open_container(&iterator, DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE_AS_STRING, &subiterator); q_dbus_message_iter_append_fixed_array(&subiterator, DBUS_TYPE_BYTE, &cdata, arg.length()); q_dbus_message_iter_close_container(&iterator, &subiterator); }