26 #include "dbus-internals.h"
27 #include "dbus-marshal-basic.h"
28 #include "dbus-signature.h"
32 #if defined(__GNUC__) && (__GNUC__ >= 4)
33 # define _DBUS_ASSERT_ALIGNMENT(type, op, val) \
34 _DBUS_STATIC_ASSERT (__extension__ __alignof__ (type) op val)
38 # define _DBUS_ASSERT_ALIGNMENT(type, op, val) \
39 _DBUS_STATIC_ASSERT (TRUE)
43 _DBUS_STATIC_ASSERT (
sizeof (
char) == 1);
44 _DBUS_ASSERT_ALIGNMENT (
char, ==, 1);
58 _DBUS_STATIC_ASSERT (
sizeof (
double) == 8);
59 _DBUS_ASSERT_ALIGNMENT (
double, <=, 8);
61 #ifdef DBUS_HAVE_INT64
123 #ifdef DBUS_HAVE_INT64
146 pack_4_octets (value, byte_order, data);
149 #ifndef DBUS_HAVE_INT64
152 swap_bytes (
unsigned char *data,
155 unsigned char *p1 = data;
156 unsigned char *p2 = data + len - 1;
160 unsigned char tmp = *p1;
174 if (byte_order != DBUS_COMPILER_BYTE_ORDER)
176 #ifdef DBUS_HAVE_INT64
177 value->u64 = DBUS_UINT64_SWAP_LE_BE (value->u64);
179 swap_bytes (&value->
bytes, 8);
186 unpack_8_octets (
int byte_order,
187 const unsigned char *data)
194 #ifdef DBUS_HAVE_INT64
201 swap_8_octets (&r, byte_order);
208 #ifndef _dbus_unpack_uint16
218 const unsigned char *data)
229 #ifndef _dbus_unpack_uint32
239 const unsigned char *data)
263 pack_2_octets (value, byte_order, data);
279 pack_4_octets (value, byte_order, data);
295 pack_8_octets (value, byte_order, data);
314 set_4_octets (str, pos, value, byte_order);
344 int old_len, new_len;
349 _dbus_assert (_DBUS_ALIGN_VALUE (pos, 4) == (
unsigned) pos);
356 str, pos + 4, old_len))
362 *old_end_pos = pos + 4 + old_len + 1;
364 *new_end_pos = pos + 4 + new_len + 1;
390 int old_len, new_len;
399 str, pos + 1, old_len))
405 *old_end_pos = pos + 1 + old_len + 1;
407 *new_end_pos = pos + 1 + new_len + 1;
443 *old_end_pos = pos + 1;
445 *new_end_pos = pos + 1;
450 pos = _DBUS_ALIGN_VALUE (pos, 2);
451 set_2_octets (str, pos, vp->
u16, byte_order);
453 *old_end_pos = pos + 2;
455 *new_end_pos = pos + 2;
462 pos = _DBUS_ALIGN_VALUE (pos, 4);
463 set_4_octets (str, pos, vp->
u32, byte_order);
465 *old_end_pos = pos + 4;
467 *new_end_pos = pos + 4;
473 pos = _DBUS_ALIGN_VALUE (pos, 8);
474 set_8_octets (str, pos, *vp, byte_order);
476 *old_end_pos = pos + 8;
478 *new_end_pos = pos + 8;
483 pos = _DBUS_ALIGN_VALUE (pos, 4);
485 return set_string (str, pos, vp->
str, byte_order,
486 old_end_pos, new_end_pos);
490 return set_signature (str, pos, vp->
str, byte_order,
491 old_end_pos, new_end_pos);
515 pos = _DBUS_ALIGN_VALUE (pos, 4);
555 const char *str_data;
569 volatile unsigned char *vp = value;
578 pos = _DBUS_ALIGN_VALUE (pos, 2);
580 if (byte_order != DBUS_COMPILER_BYTE_ORDER)
581 *vp = DBUS_UINT16_SWAP_LE_BE (*vp);
591 pos = _DBUS_ALIGN_VALUE (pos, 4);
593 if (byte_order != DBUS_COMPILER_BYTE_ORDER)
594 *vp = DBUS_UINT32_SWAP_LE_BE (*vp);
603 pos = _DBUS_ALIGN_VALUE (pos, 8);
604 #ifdef DBUS_HAVE_INT64
605 if (byte_order != DBUS_COMPILER_BYTE_ORDER)
606 *vp = DBUS_UINT64_SWAP_LE_BE (*(
dbus_uint64_t*)(str_data + pos));
611 swap_8_octets (vp, byte_order);
620 volatile char **vp = value;
624 *vp = (
char*) str_data + pos;
632 volatile char **vp = value;
637 *vp = (
char*) str_data + pos;
665 if (byte_order != DBUS_COMPILER_BYTE_ORDER)
666 value = DBUS_UINT16_SWAP_LE_BE (value);
671 (
const unsigned char *)&value);
694 if (byte_order != DBUS_COMPILER_BYTE_ORDER)
695 value = DBUS_UINT32_SWAP_LE_BE (value);
700 (
const unsigned char *)&value);
723 swap_8_octets (&value, byte_order);
728 (
const unsigned char *)&value);
739 MARSHAL_AS_SIGNATURE,
740 MARSHAL_AS_BYTE_ARRAY
744 marshal_len_followed_by_bytes (
int marshal_as,
747 const unsigned char *value,
758 _dbus_warn (
"insert_at = %d string len = %d data_len = %d\n",
761 if (marshal_as == MARSHAL_AS_BYTE_ARRAY)
762 value_len = data_len;
764 value_len = data_len + 1;
770 if (marshal_as == MARSHAL_AS_SIGNATURE)
782 if (!marshal_4_octets (str, pos, data_len,
819 return marshal_len_followed_by_bytes (MARSHAL_AS_STRING,
820 str, insert_at, value,
822 byte_order, pos_after);
831 return marshal_len_followed_by_bytes (MARSHAL_AS_SIGNATURE,
832 str, insert_at, value,
834 DBUS_COMPILER_BYTE_ORDER,
874 *pos_after = insert_at + 1;
879 return marshal_2_octets (str, insert_at, vp->
u16,
880 byte_order, pos_after);
883 return marshal_4_octets (str, insert_at, vp->
u32 !=
FALSE,
884 byte_order, pos_after);
889 return marshal_4_octets (str, insert_at, vp->
u32,
890 byte_order, pos_after);
895 return marshal_8_octets (str, insert_at, *vp, byte_order, pos_after);
901 return marshal_string (str, insert_at, vp->
str, byte_order, pos_after);
905 return marshal_signature (str, insert_at, vp->
str, pos_after);
917 const unsigned char *value,
956 _dbus_assert (_DBUS_ALIGN_ADDRESS (data, alignment) == data);
962 end = d + (n_elements * alignment);
968 #ifdef DBUS_HAVE_INT64
976 else if (alignment == 4)
1003 _dbus_assert (_DBUS_ALIGN_VALUE (array_start, alignment) == (
unsigned) array_start);
1005 if (byte_order != DBUS_COMPILER_BYTE_ORDER)
1011 n_elements, alignment);
1033 len_in_bytes = n_elements * alignment;
1034 array_start = insert_at;
1046 (
const unsigned char*) value,
1053 swap_array (str, array_start, n_elements, byte_order, alignment);
1056 *pos_after = array_start + len_in_bytes;
1099 _dbus_verbose (
"writing %d elements of %s\n",
1103 switch (element_type)
1106 return marshal_1_octets_array (str, insert_at, vp, n_elements, byte_order, pos_after);
1110 return marshal_fixed_multi (str, insert_at, vp, n_elements, byte_order, 2, pos_after);
1115 return marshal_fixed_multi (str, insert_at, vp, n_elements, byte_order, 4, pos_after);
1120 return marshal_fixed_multi (str, insert_at, vp, n_elements, byte_order, 8, pos_after);
1157 *pos = _DBUS_ALIGN_VALUE (*pos, 2);
1164 *pos = _DBUS_ALIGN_VALUE (*pos, 4);
1170 *pos = _DBUS_ALIGN_VALUE (*pos, 8);
1219 i = _DBUS_ALIGN_VALUE (*pos, 4);
1225 i = _DBUS_ALIGN_VALUE (i, alignment);
1227 *pos = i + array_len;
1311 return "object_path";
1317 return "dict_entry";
1323 return "begin_struct";
1325 return "end_struct";
1327 return "begin_dict_entry";
1329 return "end_dict_entry";
1350 const unsigned char *aligned;
1354 if (!_dbus_is_verbose())
1358 aligned = _DBUS_ALIGN_ADDRESS (data, 4);
1363 if (aligned != data)
1365 _dbus_verbose (
"%4ld\t%p: ", - (
long)(data - aligned), aligned);
1366 while (aligned != data)
1368 _dbus_verbose (
" ");
1377 if (_DBUS_ALIGN_ADDRESS (&data[i], 4) == &data[i])
1379 _dbus_verbose (
"%4d\t%p: ",
1380 offset + i, &data[i]);
1383 if (data[i] >= 32 &&
1385 _dbus_verbose (
" '%c' ", data[i]);
1387 _dbus_verbose (
"0x%s%x ",
1388 data[i] <= 0xf ?
"0" :
"", data[i]);
1392 if (_DBUS_ALIGN_ADDRESS (&data[i], 4) == &data[i])
1395 _dbus_verbose (
"BE: %d LE: %d",
1400 _DBUS_ALIGN_ADDRESS (&data[i], 8) == &data[i])
1402 #ifdef DBUS_INT64_PRINTF_MODIFIER
1403 _dbus_verbose (
" u64: 0x%" DBUS_INT64_PRINTF_MODIFIER
"x",
1406 _dbus_verbose (
" dbl: %g",
1407 *(
double*)&data[i-8]);
1410 _dbus_verbose (
"\n");
1414 _dbus_verbose (
"\n");
1436 if (start > real_len)
1438 _dbus_verbose (
" [%d,%d) is not inside string of length %d\n",
1439 start, len, real_len);
1443 if ((start + len) > real_len)
1445 _dbus_verbose (
" [%d,%d) extends outside string of length %d\n",
1446 start, len, real_len);
1447 len = real_len - start;
1456 map_type_char_to_type (
int t)
1499 return map_type_char_to_type (str[pos]);
1504 #ifdef DBUS_BUILD_TESTS
1505 #include "dbus-test.h"
1527 _dbus_marshal_read_fixed_multi (
const DBusString *str,
1542 _dbus_verbose (
"reading %d elements of %s\n",
1548 pos = _DBUS_ALIGN_VALUE (pos, alignment);
1550 array_len = n_elements * alignment;
1554 *new_pos = pos + array_len;
1558 swap_test_array (
void *array,
1569 swap_array (&t, 0, len_bytes / alignment, byte_order, alignment);
1572 #define MARSHAL_BASIC(typename, byte_order, literal) \
1574 v_##typename = literal; \
1575 if (!_dbus_marshal_write_basic (&str, pos, DBUS_TYPE_##typename, \
1577 byte_order, NULL)) \
1578 _dbus_assert_not_reached ("no memory"); \
1581 #define DEMARSHAL_BASIC(typename, byte_order) \
1583 _dbus_marshal_read_basic (&str, pos, DBUS_TYPE_##typename, &v_##typename, \
1584 byte_order, &pos); \
1587 #define DEMARSHAL_BASIC_AND_CHECK(typename, byte_order, literal) \
1589 DEMARSHAL_BASIC (typename, byte_order); \
1590 if (literal != v_##typename) \
1592 _dbus_verbose_bytes_of_string (&str, dump_pos, \
1593 _dbus_string_get_length (&str) - dump_pos); \
1594 _dbus_assert_not_reached ("demarshaled wrong value"); \
1598 #define MARSHAL_TEST(typename, byte_order, literal) \
1600 MARSHAL_BASIC (typename, byte_order, literal); \
1602 DEMARSHAL_BASIC_AND_CHECK (typename, byte_order, literal); \
1605 #define MARSHAL_TEST_STRCMP(typename, byte_order, literal) \
1607 MARSHAL_BASIC (typename, byte_order, literal); \
1609 DEMARSHAL_BASIC (typename, byte_order); \
1610 if (strcmp (literal, v_##typename) != 0) \
1612 _dbus_verbose_bytes_of_string (&str, dump_pos, \
1613 _dbus_string_get_length (&str) - dump_pos); \
1614 _dbus_warn ("literal '%s'\nvalue '%s'\n", literal, v_##typename); \
1615 _dbus_assert_not_reached ("demarshaled wrong value"); \
1619 #define MARSHAL_FIXED_ARRAY(typename, byte_order, literal) \
1622 v_UINT32 = sizeof(literal); \
1623 if (!_dbus_marshal_write_basic (&str, pos, DBUS_TYPE_UINT32, &v_UINT32, \
1624 byte_order, &next)) \
1625 _dbus_assert_not_reached ("no memory"); \
1626 v_ARRAY_##typename = literal; \
1627 if (!_dbus_marshal_write_fixed_multi (&str, next, DBUS_TYPE_##typename, \
1628 &v_ARRAY_##typename, _DBUS_N_ELEMENTS(literal), \
1629 byte_order, NULL)) \
1630 _dbus_assert_not_reached ("no memory"); \
1633 #define DEMARSHAL_FIXED_ARRAY(typename, byte_order) \
1636 alignment = _dbus_type_get_alignment (DBUS_TYPE_##typename); \
1637 v_UINT32 = _dbus_marshal_read_uint32 (&str, dump_pos, byte_order, &next); \
1638 _dbus_marshal_read_fixed_multi (&str, next, DBUS_TYPE_##typename, &v_ARRAY_##typename, \
1639 v_UINT32/alignment, \
1640 byte_order, NULL); \
1641 swap_test_array (v_ARRAY_##typename, v_UINT32, \
1642 byte_order, alignment); \
1645 #define DEMARSHAL_FIXED_ARRAY_AND_CHECK(typename, byte_order, literal) \
1647 DEMARSHAL_FIXED_ARRAY (typename, byte_order); \
1648 if (memcmp (literal, v_ARRAY_##typename, sizeof (literal) != 0)) \
1650 _dbus_verbose ("MARSHALED DATA\n"); \
1651 _dbus_verbose_bytes_of_string (&str, dump_pos, \
1652 _dbus_string_get_length (&str) - dump_pos); \
1653 _dbus_verbose ("LITERAL DATA\n"); \
1654 _dbus_verbose_bytes ((char*)literal, sizeof (literal), 0); \
1655 _dbus_verbose ("READ DATA\n"); \
1656 _dbus_verbose_bytes ((char*)v_ARRAY_##typename, sizeof (literal), 0); \
1657 _dbus_assert_not_reached ("demarshaled wrong fixed array value"); \
1661 #define MARSHAL_TEST_FIXED_ARRAY(typename, byte_order, literal) \
1663 MARSHAL_FIXED_ARRAY (typename, byte_order, literal); \
1665 DEMARSHAL_FIXED_ARRAY_AND_CHECK (typename, byte_order, literal); \
1669 _dbus_marshal_test (
void)
1674 unsigned char array1[5] = { 3, 4, 0, 1, 9 };
1677 #ifdef DBUS_HAVE_INT64
1683 unsigned char *v_ARRAY_BYTE;
1697 unsigned char v_BYTE;
1699 const char *v_STRING;
1700 const char *v_SIGNATURE;
1701 const char *v_OBJECT_PATH;
1738 #ifdef DBUS_HAVE_INT64
1761 MARSHAL_TEST_STRCMP (STRING,
DBUS_BIG_ENDIAN,
"This is the dbus test string");
1788 #ifdef DBUS_HAVE_INT64
1799 #ifdef DBUS_HAVE_INT64
1892 _dbus_pack_int32 (-0x123456,
1901 _dbus_pack_int32 (-0x123456,
1957 MARSHAL_TEST_STRCMP (STRING, byte_order,
"Hello world");
1964 &v_STRING, byte_order,
NULL,
NULL);
1967 &v_STRING, byte_order,
1969 _dbus_assert (strcmp (v_STRING,
"Hello world foo") == 0);
1976 &v_STRING, byte_order,
NULL,
NULL);
1978 &v_STRING, byte_order,