33 #include <tqvariant.h>
34 #include <tqvaluelist.h>
36 #include <tqstringlist.h>
37 #include <tqvaluevector.h>
39 #include <dbus/dbus.h>
45 dbus_message_iter_get_basic(it, &t);
80 while (!signature.isEmpty())
85 signature = signature.mid(1);
88 Q_ASSERT(!signature.isEmpty() && signature[0] ==
')');
89 signature = signature.mid(1);
92 case ')':
return result;
143 tqWarning(
"TQT_DBusMarshall: unsupported map key type %s "
148 signature = signature.mid(3);
152 signature = signature.mid(2);
155 Q_ASSERT(valueContainer.count() == 1);
200 tqWarning(
"TQT_DBusMarshall: unsupported map key type %s "
206 Q_ASSERT(!signature.isEmpty() && signature[0] ==
'}');
207 signature = signature.mid(1);
210 case '}':
return result;
218 signature = signature.mid(2);
222 signature = signature.mid(1);
223 bool array = signature[0] !=
'{';
227 Q_ASSERT(elementContainer.count() == 1);
235 result << elementContainer[0];
292 tqWarning(
"TQT_DBusMarshall: unsupported element type %s "
297 signature = signature.mid(1);
301 signature = signature.mid(1);
314 DBusMessageIter itemIter;
315 dbus_message_iter_recurse(it, &itemIter);
316 Q_ASSERT(dbus_message_iter_has_next(&itemIter));
320 dbus_message_iter_next(&itemIter);
327 DBusMessageIter itemIter;
328 dbus_message_iter_recurse(it, &itemIter);
329 Q_ASSERT(dbus_message_iter_has_next(&itemIter));
333 dbus_message_iter_next(&itemIter);
340 DBusMessageIter itemIter;
341 dbus_message_iter_recurse(it, &itemIter);
342 Q_ASSERT(dbus_message_iter_has_next(&itemIter));
346 dbus_message_iter_next(&itemIter);
353 DBusMessageIter itemIter;
354 dbus_message_iter_recurse(it, &itemIter);
355 Q_ASSERT(dbus_message_iter_has_next(&itemIter));
359 dbus_message_iter_next(&itemIter);
366 DBusMessageIter itemIter;
367 dbus_message_iter_recurse(it, &itemIter);
368 Q_ASSERT(dbus_message_iter_has_next(&itemIter));
372 dbus_message_iter_next(&itemIter);
379 DBusMessageIter itemIter;
380 dbus_message_iter_recurse(it, &itemIter);
381 Q_ASSERT(dbus_message_iter_has_next(&itemIter));
385 dbus_message_iter_next(&itemIter);
392 DBusMessageIter itemIter;
393 dbus_message_iter_recurse(it, &itemIter);
394 Q_ASSERT(dbus_message_iter_has_next(&itemIter));
398 dbus_message_iter_next(&itemIter);
405 DBusMessageIter itemIter;
406 dbus_message_iter_recurse(it, &itemIter);
407 Q_ASSERT(dbus_message_iter_has_next(&itemIter));
411 dbus_message_iter_next(&itemIter);
418 DBusMessageIter itemIter;
419 dbus_message_iter_recurse(it, &itemIter);
420 Q_ASSERT(dbus_message_iter_has_next(&itemIter));
424 dbus_message_iter_next(&itemIter);
431 if (dbus_message_iter_get_arg_type(it) == DBUS_TYPE_INVALID)
434 DBusMessageIter itemIter;
435 dbus_message_iter_recurse(it, &itemIter);
436 if (dbus_message_iter_get_arg_type(&itemIter) == DBUS_TYPE_INVALID)
439 switch (dbus_message_iter_get_arg_type(&itemIter)) {
440 case DBUS_TYPE_BYTE: {
444 }
while (dbus_message_iter_next(it));
449 case DBUS_TYPE_INT16: {
453 }
while (dbus_message_iter_next(it));
458 case DBUS_TYPE_UINT16: {
462 }
while (dbus_message_iter_next(it));
467 case DBUS_TYPE_INT32: {
471 }
while (dbus_message_iter_next(it));
476 case DBUS_TYPE_UINT32: {
480 }
while (dbus_message_iter_next(it));
485 case DBUS_TYPE_INT64: {
489 }
while (dbus_message_iter_next(it));
494 case DBUS_TYPE_UINT64: {
498 }
while (dbus_message_iter_next(it));
503 case DBUS_TYPE_OBJECT_PATH: {
507 }
while (dbus_message_iter_next(it));
511 case DBUS_TYPE_STRING:
512 case DBUS_TYPE_SIGNATURE: {
516 }
while (dbus_message_iter_next(it));
530 switch (dbus_message_iter_get_arg_type(it)) {
531 case DBUS_TYPE_BOOLEAN:
535 case DBUS_TYPE_INT16:
537 case DBUS_TYPE_UINT16:
539 case DBUS_TYPE_INT32:
541 case DBUS_TYPE_UINT32:
543 case DBUS_TYPE_INT64:
545 case DBUS_TYPE_UINT64:
547 case DBUS_TYPE_DOUBLE:
549 case DBUS_TYPE_STRING:
550 case DBUS_TYPE_SIGNATURE:
552 case DBUS_TYPE_OBJECT_PATH:
554 case DBUS_TYPE_ARRAY: {
555 int arrayType = dbus_message_iter_get_element_type(it);
557 char* sig = dbus_message_iter_get_signature(it);
558 TQCString signature = sig;
563 if (arrayType == DBUS_TYPE_DICT_ENTRY) {
565 dbus_message_iter_recurse(it, &sub);
567 return qFetchMap(&sub, prototypeList[0]);
571 DBusMessageIter arrayIt;
572 dbus_message_iter_recurse(it, &arrayIt);
574 while (dbus_message_iter_get_arg_type(&arrayIt) != DBUS_TYPE_INVALID) {
577 dbus_message_iter_next(&arrayIt);
583 case DBUS_TYPE_VARIANT: {
586 dbus_message_iter_recurse(it, &sub);
588 char* signature = dbus_message_iter_get_signature(&sub);
589 dvariant.
signature = TQString::fromUtf8(signature);
590 dbus_free(signature);
596 case DBUS_TYPE_STRUCT: {
599 DBusMessageIter subIt;
600 dbus_message_iter_recurse(it, &subIt);
603 while (dbus_message_iter_get_arg_type(&subIt) != DBUS_TYPE_INVALID) {
606 dbus_message_iter_next(&subIt);
618 case DBUS_TYPE_INVALID:
624 tqWarning(
"TQT_DBusMarshall: Don't know how to de-marshall type %d '%c'",
625 dbus_message_iter_get_arg_type(it),
626 dbus_message_iter_get_arg_type(it));
637 if (!dbus_message_iter_init(message, &it))
return;
643 while (dbus_message_iter_next(&it));
648 TQByteArray ba = str.utf8();
649 const char *cdata = ba.data();
650 dbus_message_iter_append_basic(it, DBUS_TYPE_STRING, &cdata);
655 const char *cdata = path.ascii();
656 dbus_message_iter_append_basic(it, DBUS_TYPE_OBJECT_PATH, &cdata);
673 return DBUS_TYPE_BOOLEAN_AS_STRING;
676 return DBUS_TYPE_BYTE_AS_STRING;
679 return DBUS_TYPE_INT16_AS_STRING;
682 return DBUS_TYPE_UINT16_AS_STRING;
685 return DBUS_TYPE_INT32_AS_STRING;
688 return DBUS_TYPE_UINT32_AS_STRING;
691 return DBUS_TYPE_INT64_AS_STRING;
694 return DBUS_TYPE_UINT64_AS_STRING;
697 return DBUS_TYPE_DOUBLE_AS_STRING;
700 return DBUS_TYPE_STRING_AS_STRING;
703 return DBUS_TYPE_OBJECT_PATH_AS_STRING;
706 return DBUS_TYPE_ARRAY_AS_STRING;
709 return DBUS_TYPE_STRUCT_AS_STRING;
712 return DBUS_TYPE_VARIANT_AS_STRING;
715 return DBUS_TYPE_DICT_ENTRY_AS_STRING;
732 sig += DBUS_DICT_ENTRY_BEGIN_CHAR;
739 sig += DBUS_DICT_ENTRY_END_CHAR;
741 dbus_message_iter_open_container(it, DBUS_TYPE_ARRAY, sig.data(), &sub);
744 for (; mit != map.
end(); ++mit)
746 DBusMessageIter itemIterator;
747 dbus_message_iter_open_container(&sub, DBUS_TYPE_DICT_ENTRY,
750 dbus_message_iter_append_basic(it, DBUS_TYPE_BYTE, &(mit.key()));
753 dbus_message_iter_close_container(&sub, &itemIterator);
756 dbus_message_iter_close_container(it, &sub);
766 sig += DBUS_DICT_ENTRY_BEGIN_CHAR;
773 sig += DBUS_DICT_ENTRY_END_CHAR;
775 dbus_message_iter_open_container(it, DBUS_TYPE_ARRAY, sig.data(), &sub);
778 for (; mit != map.
end(); ++mit)
780 DBusMessageIter itemIterator;
781 dbus_message_iter_open_container(&sub, DBUS_TYPE_DICT_ENTRY,
784 dbus_message_iter_append_basic(it, DBUS_TYPE_INT16, &(mit.key()));
787 dbus_message_iter_close_container(&sub, &itemIterator);
790 dbus_message_iter_close_container(it, &sub);
800 sig += DBUS_DICT_ENTRY_BEGIN_CHAR;
807 sig += DBUS_DICT_ENTRY_END_CHAR;
809 dbus_message_iter_open_container(it, DBUS_TYPE_ARRAY, sig.data(), &sub);
812 for (; mit != map.
end(); ++mit)
814 DBusMessageIter itemIterator;
815 dbus_message_iter_open_container(&sub, DBUS_TYPE_DICT_ENTRY,
818 dbus_message_iter_append_basic(it, DBUS_TYPE_UINT16, &(mit.key()));
821 dbus_message_iter_close_container(&sub, &itemIterator);
824 dbus_message_iter_close_container(it, &sub);
834 sig += DBUS_DICT_ENTRY_BEGIN_CHAR;
841 sig += DBUS_DICT_ENTRY_END_CHAR;
843 dbus_message_iter_open_container(it, DBUS_TYPE_ARRAY, sig.data(), &sub);
846 for (; mit != map.
end(); ++mit)
848 DBusMessageIter itemIterator;
849 dbus_message_iter_open_container(&sub, DBUS_TYPE_DICT_ENTRY,
852 dbus_message_iter_append_basic(it, DBUS_TYPE_INT32, &(mit.key()));
855 dbus_message_iter_close_container(&sub, &itemIterator);
858 dbus_message_iter_close_container(it, &sub);
868 sig += DBUS_DICT_ENTRY_BEGIN_CHAR;
875 sig += DBUS_DICT_ENTRY_END_CHAR;
877 dbus_message_iter_open_container(it, DBUS_TYPE_ARRAY, sig.data(), &sub);
880 for (; mit != map.
end(); ++mit)
882 DBusMessageIter itemIterator;
883 dbus_message_iter_open_container(&sub, DBUS_TYPE_DICT_ENTRY,
886 dbus_message_iter_append_basic(it, DBUS_TYPE_UINT32, &(mit.key()));
889 dbus_message_iter_close_container(&sub, &itemIterator);
892 dbus_message_iter_close_container(it, &sub);
902 sig += DBUS_DICT_ENTRY_BEGIN_CHAR;
909 sig += DBUS_DICT_ENTRY_END_CHAR;
911 dbus_message_iter_open_container(it, DBUS_TYPE_ARRAY, sig.data(), &sub);
914 for (; mit != map.
end(); ++mit)
916 DBusMessageIter itemIterator;
917 dbus_message_iter_open_container(&sub, DBUS_TYPE_DICT_ENTRY,
920 dbus_message_iter_append_basic(it, DBUS_TYPE_INT64, &(mit.key()));
923 dbus_message_iter_close_container(&sub, &itemIterator);
926 dbus_message_iter_close_container(it, &sub);
936 sig += DBUS_DICT_ENTRY_BEGIN_CHAR;
943 sig += DBUS_DICT_ENTRY_END_CHAR;
945 dbus_message_iter_open_container(it, DBUS_TYPE_ARRAY, sig.data(), &sub);
948 for (; mit != map.
end(); ++mit)
950 DBusMessageIter itemIterator;
951 dbus_message_iter_open_container(&sub, DBUS_TYPE_DICT_ENTRY,
954 dbus_message_iter_append_basic(it, DBUS_TYPE_UINT64, &(mit.key()));
957 dbus_message_iter_close_container(&sub, &itemIterator);
960 dbus_message_iter_close_container(it, &sub);
970 sig += DBUS_DICT_ENTRY_BEGIN_CHAR;
977 sig += DBUS_DICT_ENTRY_END_CHAR;
979 dbus_message_iter_open_container(it, DBUS_TYPE_ARRAY, sig.data(), &sub);
982 for (; mit != map.
end(); ++mit)
984 DBusMessageIter itemIterator;
985 dbus_message_iter_open_container(&sub, DBUS_TYPE_DICT_ENTRY,
991 dbus_message_iter_close_container(&sub, &itemIterator);
994 dbus_message_iter_close_container(it, &sub);
1000 DBusMessageIter sub;
1005 sig += DBUS_DICT_ENTRY_BEGIN_CHAR;
1012 sig += DBUS_DICT_ENTRY_END_CHAR;
1014 dbus_message_iter_open_container(it, DBUS_TYPE_ARRAY, sig.data(), &sub);
1017 for (; mit != map.
end(); ++mit)
1019 DBusMessageIter itemIterator;
1020 dbus_message_iter_open_container(&sub, DBUS_TYPE_DICT_ENTRY,
1026 dbus_message_iter_close_container(&sub, &itemIterator);
1029 dbus_message_iter_close_container(it, &sub);
1034 DBusMessageIter sub;
1039 sig += DBUS_DICT_ENTRY_BEGIN_CHAR;
1046 sig += DBUS_DICT_ENTRY_END_CHAR;
1048 dbus_message_iter_open_container(it, DBUS_TYPE_ARRAY, sig.data(), &sub);
1051 for (; mit != map.
end(); ++mit)
1053 DBusMessageIter itemIterator;
1054 dbus_message_iter_open_container(&sub, DBUS_TYPE_DICT_ENTRY,
1060 dbus_message_iter_close_container(&sub, &itemIterator);
1063 dbus_message_iter_close_container(it, &sub);
1072 dbus_bool_t value = var.
toBool();
1073 dbus_message_iter_append_basic(it, DBUS_TYPE_BOOLEAN, &value);
1078 TQ_UINT8 value = var.
toByte();
1079 dbus_message_iter_append_basic(it, DBUS_TYPE_BYTE, &value);
1083 TQ_INT16 value = var.
toInt16();
1084 dbus_message_iter_append_basic(it, DBUS_TYPE_INT16, &value);
1089 dbus_message_iter_append_basic(it, DBUS_TYPE_UINT16, &value);
1093 TQ_INT32 value = var.
toInt32();
1094 dbus_message_iter_append_basic(it, DBUS_TYPE_INT32, &value);
1099 dbus_message_iter_append_basic(it, DBUS_TYPE_UINT32, &value);
1103 TQ_INT64 value = var.
toInt64();
1104 dbus_message_iter_append_basic(it, DBUS_TYPE_INT64, &value);
1109 dbus_message_iter_append_basic(it, DBUS_TYPE_UINT64, &value);
1114 dbus_message_iter_append_basic(it, DBUS_TYPE_DOUBLE, &value);
1130 TQCString signature = 0;
1136 DBusMessageIter sub;
1137 dbus_message_iter_open_container(it, DBUS_TYPE_ARRAY,
1138 signature.data(), &sub);
1143 for (; listIt != listEndIt; ++listIt)
1147 dbus_message_iter_close_container(it, &sub);
1183 tqWarning(
"TQT_DBusMarshall: unhandled map key type %s "
1194 DBusMessageIter sub;
1195 dbus_message_iter_open_container(it, DBUS_TYPE_VARIANT,
1200 dbus_message_iter_close_container(it, &sub);
1205 if (memberList.isEmpty())
break;
1207 DBusMessageIter sub;
1208 dbus_message_iter_open_container(it, DBUS_TYPE_STRUCT, NULL, &sub);
1212 for (; memberIt != memberEndIt; ++memberIt)
1217 dbus_message_iter_close_container(it, &sub);
1220 case TQVariant::ByteArray: {
1221 const TQByteArray array = var.toByteArray();
1222 const char* cdata = array.data();
1223 DBusMessageIter sub;
1224 dbus_message_iter_open_container(it, DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE_AS_STRING, &sub);
1225 dbus_message_iter_append_fixed_array(&sub, DBUS_TYPE_BYTE, &cdata, array.size());
1226 dbus_message_iter_close_container(it, &sub);
1238 if (list.isEmpty())
return;
1242 for (; listIt != listEndIt; ++listIt)
1252 dbus_message_iter_init_append(msg, &it);