26 #include "dbus-internals.h"
27 #include "dbus-marshal-basic.h"
28 #include "dbus-signature.h"
80 #ifdef DBUS_HAVE_INT64
103 pack_4_octets (value, byte_order, data);
106 #ifndef DBUS_HAVE_INT64
109 swap_bytes (
unsigned char *data,
112 unsigned char *p1 = data;
113 unsigned char *p2 = data + len - 1;
117 unsigned char tmp = *p1;
131 if (byte_order != DBUS_COMPILER_BYTE_ORDER)
133 #ifdef DBUS_HAVE_INT64
134 value->
u64 = DBUS_UINT64_SWAP_LE_BE (value->
u64);
136 swap_bytes ((
unsigned char *)value, 8);
143 unpack_8_octets (
int byte_order,
144 const unsigned char *data)
151 #ifdef DBUS_HAVE_INT64
158 swap_8_octets (&r, byte_order);
165 #ifndef _dbus_unpack_uint16
175 const unsigned char *data)
186 #ifndef _dbus_unpack_uint32
196 const unsigned char *data)
220 pack_2_octets (value, byte_order, data);
236 pack_4_octets (value, byte_order, data);
252 pack_8_octets (value, byte_order, data);
271 set_4_octets (str, pos, value, byte_order);
301 int old_len, new_len;
306 _dbus_assert (_DBUS_ALIGN_VALUE (pos, 4) == (
unsigned) pos);
313 str, pos + 4, old_len))
319 *old_end_pos = pos + 4 + old_len + 1;
321 *new_end_pos = pos + 4 + new_len + 1;
347 int old_len, new_len;
356 str, pos + 1, old_len))
362 *old_end_pos = pos + 1 + old_len + 1;
364 *new_end_pos = pos + 1 + new_len + 1;
400 *old_end_pos = pos + 1;
402 *new_end_pos = pos + 1;
407 pos = _DBUS_ALIGN_VALUE (pos, 2);
408 set_2_octets (str, pos, vp->
u16, byte_order);
410 *old_end_pos = pos + 2;
412 *new_end_pos = pos + 2;
419 pos = _DBUS_ALIGN_VALUE (pos, 4);
420 set_4_octets (str, pos, vp->
u32, byte_order);
422 *old_end_pos = pos + 4;
424 *new_end_pos = pos + 4;
430 pos = _DBUS_ALIGN_VALUE (pos, 8);
431 set_8_octets (str, pos, *vp, byte_order);
433 *old_end_pos = pos + 8;
435 *new_end_pos = pos + 8;
440 pos = _DBUS_ALIGN_VALUE (pos, 4);
442 return set_string (str, pos, vp->
str, byte_order,
443 old_end_pos, new_end_pos);
447 return set_signature (str, pos, vp->
str, byte_order,
448 old_end_pos, new_end_pos);
472 pos = _DBUS_ALIGN_VALUE (pos, 4);
512 const char *str_data;
526 volatile unsigned char *vp = value;
535 pos = _DBUS_ALIGN_VALUE (pos, 2);
537 if (byte_order != DBUS_COMPILER_BYTE_ORDER)
538 *vp = DBUS_UINT16_SWAP_LE_BE (*vp);
548 pos = _DBUS_ALIGN_VALUE (pos, 4);
550 if (byte_order != DBUS_COMPILER_BYTE_ORDER)
551 *vp = DBUS_UINT32_SWAP_LE_BE (*vp);
560 pos = _DBUS_ALIGN_VALUE (pos, 8);
561 #ifdef DBUS_HAVE_INT64
562 if (byte_order != DBUS_COMPILER_BYTE_ORDER)
563 *vp = DBUS_UINT64_SWAP_LE_BE (*(
dbus_uint64_t*)(str_data + pos));
568 swap_8_octets (vp, byte_order);
577 volatile char **vp = value;
581 *vp = (
char*) str_data + pos;
589 volatile char **vp = value;
594 *vp = (
char*) str_data + pos;
622 if (byte_order != DBUS_COMPILER_BYTE_ORDER)
623 value = DBUS_UINT16_SWAP_LE_BE (value);
628 (
const unsigned char *)&value);
651 if (byte_order != DBUS_COMPILER_BYTE_ORDER)
652 value = DBUS_UINT32_SWAP_LE_BE (value);
657 (
const unsigned char *)&value);
680 swap_8_octets (&value, byte_order);
685 (
const unsigned char *)&value);
696 MARSHAL_AS_SIGNATURE,
697 MARSHAL_AS_BYTE_ARRAY
701 marshal_len_followed_by_bytes (
int marshal_as,
704 const unsigned char *value,
715 _dbus_warn (
"insert_at = %d string len = %d data_len = %d\n",
718 if (marshal_as == MARSHAL_AS_BYTE_ARRAY)
719 value_len = data_len;
721 value_len = data_len + 1;
727 if (marshal_as == MARSHAL_AS_SIGNATURE)
739 if (!marshal_4_octets (str, pos, data_len,
776 return marshal_len_followed_by_bytes (MARSHAL_AS_STRING,
777 str, insert_at, value,
779 byte_order, pos_after);
788 return marshal_len_followed_by_bytes (MARSHAL_AS_SIGNATURE,
789 str, insert_at, value,
791 DBUS_COMPILER_BYTE_ORDER,
831 *pos_after = insert_at + 1;
836 return marshal_2_octets (str, insert_at, vp->
u16,
837 byte_order, pos_after);
840 return marshal_4_octets (str, insert_at, vp->
u32 !=
FALSE,
841 byte_order, pos_after);
846 return marshal_4_octets (str, insert_at, vp->
u32,
847 byte_order, pos_after);
852 return marshal_8_octets (str, insert_at, *vp, byte_order, pos_after);
858 return marshal_string (str, insert_at, vp->
str, byte_order, pos_after);
862 return marshal_signature (str, insert_at, vp->
str, pos_after);
874 const unsigned char *value,
913 _dbus_assert (_DBUS_ALIGN_ADDRESS (data, alignment) == data);
919 end = d + (n_elements * alignment);
925 #ifdef DBUS_HAVE_INT64
933 else if (alignment == 4)
960 _dbus_assert (_DBUS_ALIGN_VALUE (array_start, alignment) == (
unsigned) array_start);
962 if (byte_order != DBUS_COMPILER_BYTE_ORDER)
968 n_elements, alignment);
990 len_in_bytes = n_elements * alignment;
991 array_start = insert_at;
1003 (
const unsigned char*) value,
1010 swap_array (str, array_start, n_elements, byte_order, alignment);
1013 *pos_after = array_start + len_in_bytes;
1056 _dbus_verbose (
"writing %d elements of %s\n",
1060 switch (element_type)
1063 return marshal_1_octets_array (str, insert_at, vp, n_elements, byte_order, pos_after);
1067 return marshal_fixed_multi (str, insert_at, vp, n_elements, byte_order, 2, pos_after);
1072 return marshal_fixed_multi (str, insert_at, vp, n_elements, byte_order, 4, pos_after);
1077 return marshal_fixed_multi (str, insert_at, vp, n_elements, byte_order, 8, pos_after);
1114 *pos = _DBUS_ALIGN_VALUE (*pos, 2);
1121 *pos = _DBUS_ALIGN_VALUE (*pos, 4);
1127 *pos = _DBUS_ALIGN_VALUE (*pos, 8);
1176 i = _DBUS_ALIGN_VALUE (*pos, 4);
1182 i = _DBUS_ALIGN_VALUE (i, alignment);
1184 *pos = i + array_len;
1306 return "object_path";
1312 return "dict_entry";
1318 return "begin_struct";
1320 return "end_struct";
1322 return "begin_dict_entry";
1324 return "end_dict_entry";
1345 const unsigned char *aligned;
1349 if (!_dbus_is_verbose())
1353 aligned = _DBUS_ALIGN_ADDRESS (data, 4);
1358 if (aligned != data)
1360 _dbus_verbose (
"%4ld\t%p: ", - (
long)(data - aligned), aligned);
1361 while (aligned != data)
1363 _dbus_verbose (
" ");
1372 if (_DBUS_ALIGN_ADDRESS (&data[i], 4) == &data[i])
1374 _dbus_verbose (
"%4d\t%p: ",
1375 offset + i, &data[i]);
1378 if (data[i] >= 32 &&
1380 _dbus_verbose (
" '%c' ", data[i]);
1382 _dbus_verbose (
"0x%s%x ",
1383 data[i] <= 0xf ?
"0" :
"", data[i]);
1387 if (_DBUS_ALIGN_ADDRESS (&data[i], 4) == &data[i])
1390 _dbus_verbose (
"BE: %d LE: %d",
1395 _DBUS_ALIGN_ADDRESS (&data[i], 8) == &data[i])
1397 #ifdef DBUS_INT64_PRINTF_MODIFIER
1398 _dbus_verbose (
" u64: 0x%" DBUS_INT64_PRINTF_MODIFIER
"x",
1401 _dbus_verbose (
" dbl: %g",
1402 *(
double*)&data[i-8]);
1405 _dbus_verbose (
"\n");
1409 _dbus_verbose (
"\n");
1431 if (start > real_len)
1433 _dbus_verbose (
" [%d,%d) is not inside string of length %d\n",
1434 start, len, real_len);
1438 if ((start + len) > real_len)
1440 _dbus_verbose (
" [%d,%d) extends outside string of length %d\n",
1441 start, len, real_len);
1442 len = real_len - start;
1451 map_type_char_to_type (
int t)
1494 return map_type_char_to_type (str[pos]);
1499 #ifdef DBUS_BUILD_TESTS
1500 #include "dbus-test.h"
1522 _dbus_marshal_read_fixed_multi (
const DBusString *str,
1537 _dbus_verbose (
"reading %d elements of %s\n",
1543 pos = _DBUS_ALIGN_VALUE (pos, alignment);
1545 array_len = n_elements * alignment;
1549 *new_pos = pos + array_len;
1553 swap_test_array (
void *array,
1564 swap_array (&t, 0, len_bytes / alignment, byte_order, alignment);
1567 #define MARSHAL_BASIC(typename, byte_order, literal) \
1569 v_##typename = literal; \
1570 if (!_dbus_marshal_write_basic (&str, pos, DBUS_TYPE_##typename, \
1572 byte_order, NULL)) \
1573 _dbus_assert_not_reached ("no memory"); \
1576 #define DEMARSHAL_BASIC(typename, byte_order) \
1578 _dbus_marshal_read_basic (&str, pos, DBUS_TYPE_##typename, &v_##typename, \
1579 byte_order, &pos); \
1582 #define DEMARSHAL_BASIC_AND_CHECK(typename, byte_order, literal) \
1584 DEMARSHAL_BASIC (typename, byte_order); \
1585 if (literal != v_##typename) \
1587 _dbus_verbose_bytes_of_string (&str, dump_pos, \
1588 _dbus_string_get_length (&str) - dump_pos); \
1589 _dbus_assert_not_reached ("demarshaled wrong value"); \
1593 #define MARSHAL_TEST(typename, byte_order, literal) \
1595 MARSHAL_BASIC (typename, byte_order, literal); \
1597 DEMARSHAL_BASIC_AND_CHECK (typename, byte_order, literal); \
1600 #define MARSHAL_TEST_STRCMP(typename, byte_order, literal) \
1602 MARSHAL_BASIC (typename, byte_order, literal); \
1604 DEMARSHAL_BASIC (typename, byte_order); \
1605 if (strcmp (literal, v_##typename) != 0) \
1607 _dbus_verbose_bytes_of_string (&str, dump_pos, \
1608 _dbus_string_get_length (&str) - dump_pos); \
1609 _dbus_warn ("literal '%s'\nvalue '%s'\n", literal, v_##typename); \
1610 _dbus_assert_not_reached ("demarshaled wrong value"); \
1614 #define MARSHAL_FIXED_ARRAY(typename, byte_order, literal) \
1617 v_UINT32 = sizeof(literal); \
1618 if (!_dbus_marshal_write_basic (&str, pos, DBUS_TYPE_UINT32, &v_UINT32, \
1619 byte_order, &next)) \
1620 _dbus_assert_not_reached ("no memory"); \
1621 v_ARRAY_##typename = literal; \
1622 if (!_dbus_marshal_write_fixed_multi (&str, next, DBUS_TYPE_##typename, \
1623 &v_ARRAY_##typename, _DBUS_N_ELEMENTS(literal), \
1624 byte_order, NULL)) \
1625 _dbus_assert_not_reached ("no memory"); \
1628 #define DEMARSHAL_FIXED_ARRAY(typename, byte_order) \
1631 alignment = _dbus_type_get_alignment (DBUS_TYPE_##typename); \
1632 v_UINT32 = _dbus_marshal_read_uint32 (&str, dump_pos, byte_order, &next); \
1633 _dbus_marshal_read_fixed_multi (&str, next, DBUS_TYPE_##typename, &v_ARRAY_##typename, \
1634 v_UINT32/alignment, \
1635 byte_order, NULL); \
1636 swap_test_array (v_ARRAY_##typename, v_UINT32, \
1637 byte_order, alignment); \
1640 #define DEMARSHAL_FIXED_ARRAY_AND_CHECK(typename, byte_order, literal) \
1642 DEMARSHAL_FIXED_ARRAY (typename, byte_order); \
1643 if (memcmp (literal, v_ARRAY_##typename, sizeof (literal) != 0)) \
1645 _dbus_verbose ("MARSHALED DATA\n"); \
1646 _dbus_verbose_bytes_of_string (&str, dump_pos, \
1647 _dbus_string_get_length (&str) - dump_pos); \
1648 _dbus_verbose ("LITERAL DATA\n"); \
1649 _dbus_verbose_bytes ((char*)literal, sizeof (literal), 0); \
1650 _dbus_verbose ("READ DATA\n"); \
1651 _dbus_verbose_bytes ((char*)v_ARRAY_##typename, sizeof (literal), 0); \
1652 _dbus_assert_not_reached ("demarshaled wrong fixed array value"); \
1656 #define MARSHAL_TEST_FIXED_ARRAY(typename, byte_order, literal) \
1658 MARSHAL_FIXED_ARRAY (typename, byte_order, literal); \
1660 DEMARSHAL_FIXED_ARRAY_AND_CHECK (typename, byte_order, literal); \
1664 _dbus_marshal_test (
void)
1669 unsigned char array1[5] = { 3, 4, 0, 1, 9 };
1672 #ifdef DBUS_HAVE_INT64
1678 unsigned char *v_ARRAY_BYTE;
1692 unsigned char v_BYTE;
1694 const char *v_STRING;
1695 const char *v_SIGNATURE;
1696 const char *v_OBJECT_PATH;
1733 #ifdef DBUS_HAVE_INT64
1756 MARSHAL_TEST_STRCMP (STRING,
DBUS_BIG_ENDIAN,
"This is the dbus test string");
1783 #ifdef DBUS_HAVE_INT64
1794 #ifdef DBUS_HAVE_INT64
1887 _dbus_pack_int32 (-0x123456,
1896 _dbus_pack_int32 (-0x123456,
1952 MARSHAL_TEST_STRCMP (STRING, byte_order,
"Hello world");
1959 &v_STRING, byte_order,
NULL,
NULL);
1962 &v_STRING, byte_order,
1964 _dbus_assert (strcmp (v_STRING,
"Hello world foo") == 0);
1971 &v_STRING, byte_order,
NULL,
NULL);
1973 &v_STRING, byte_order,