1 /* -*- mode: C; c-file-style: "gnu" -*- */
2 /* dbus-message-builder.c Build messages from text files for testing (internal to D-BUS implementation)
4 * Copyright (C) 2003, 2004 Red Hat, Inc.
6 * Licensed under the Academic Free License version 2.1
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
25 #ifdef DBUS_BUILD_TESTS
27 #include "dbus-message-builder.h"
28 #include "dbus-hash.h"
29 #include "dbus-internals.h"
30 #include "dbus-marshal.h"
33 * @defgroup DBusMessageBuilder code for loading test message data
34 * @ingroup DBusInternals
35 * @brief code for loading up test data for unit tests
37 * The code in here is used for unit testing, it loads
38 * up message data from a description in a file.
48 DBusString name; /**< Name of the length */
49 int start; /**< Calculate length since here */
50 int length; /**< length to write */
51 int offset; /**< where to write it into the data */
52 int endian; /**< endianness to write with */
56 free_saved_length (void *data)
58 SavedLength *sl = data;
61 return; /* all hash free functions have to accept NULL */
63 _dbus_string_free (&sl->name);
68 ensure_saved_length (DBusHashTable *hash,
69 const DBusString *name)
74 s = _dbus_string_get_const_data (name);
76 sl = _dbus_hash_table_lookup_string (hash, s);
80 sl = dbus_new0 (SavedLength, 1);
82 if (!_dbus_string_init (&sl->name))
88 if (!_dbus_string_copy (name, 0, &sl->name, 0))
91 s = _dbus_string_get_const_data (&sl->name);
93 if (!_dbus_hash_table_insert_string (hash, (char*)s, sl))
104 free_saved_length (sl);
109 save_start (DBusHashTable *hash,
110 const DBusString *name,
115 sl = ensure_saved_length (hash, name);
119 else if (sl->start >= 0)
121 _dbus_warn ("Same START_LENGTH given twice\n");
131 save_length (DBusHashTable *hash,
132 const DBusString *name,
137 sl = ensure_saved_length (hash, name);
141 else if (sl->length >= 0)
143 _dbus_warn ("Same END_LENGTH given twice\n");
153 save_offset (DBusHashTable *hash,
154 const DBusString *name,
160 sl = ensure_saved_length (hash, name);
164 else if (sl->offset >= 0)
166 _dbus_warn ("Same LENGTH given twice\n");
178 /** Saves the segment to delete in order to unalign the next item */
179 #define SAVE_FOR_UNALIGN(str, boundary) \
180 int align_pad_start = _dbus_string_get_length (str); \
181 int align_pad_end = _DBUS_ALIGN_VALUE (align_pad_start, (boundary))
183 /** Deletes the alignment padding */
184 #define PERFORM_UNALIGN(str) \
187 _dbus_string_delete ((str), align_pad_start, \
188 align_pad_end - align_pad_start); \
194 append_quoted_string (DBusString *dest,
195 const DBusString *quoted,
199 dbus_bool_t in_quotes = FALSE;
202 /* FIXME: We might want to add escaping in case we want to put '
203 * characters in our strings.
207 while (i < _dbus_string_get_length (quoted))
211 b = _dbus_string_get_byte (quoted, i);
219 if (!_dbus_string_append_byte (dest, b))
227 else if (b == ' ' || b == '\n' || b == '\t')
228 break; /* end on whitespace if not quoted */
231 if (!_dbus_string_append_byte (dest, b))
242 if (!_dbus_string_append_byte (dest, '\0'))
248 append_saved_length (DBusString *dest,
249 DBusHashTable *length_hash,
250 const DBusString *name,
254 if (!save_offset (length_hash, name,
257 _dbus_warn ("failed to save offset to LENGTH\n");
261 if (!_dbus_marshal_uint32 (dest, endian,
264 _dbus_warn ("failed to append a length\n");
272 message_type_from_string (const DBusString *str,
277 s = _dbus_string_get_const_data_len (str, start,
278 _dbus_string_get_length (str) - start);
280 if (strncmp (s, "method_call", strlen ("method_call")) == 0)
281 return DBUS_MESSAGE_TYPE_METHOD_CALL;
282 else if (strncmp (s, "method_return", strlen ("method_return")) == 0)
283 return DBUS_MESSAGE_TYPE_METHOD_RETURN;
284 else if (strncmp (s, "signal", strlen ("signal")) == 0)
285 return DBUS_MESSAGE_TYPE_SIGNAL;
286 else if (strncmp (s, "error", strlen ("error")) == 0)
287 return DBUS_MESSAGE_TYPE_ERROR;
288 else if (strncmp (s, "invalid", strlen ("invalid")) == 0)
289 return DBUS_MESSAGE_TYPE_INVALID;
295 append_string_field (DBusString *dest,
303 if (!_dbus_string_append_byte (dest, field))
305 _dbus_warn ("couldn't append field name byte\n");
309 if (!_dbus_string_append_byte (dest, type))
311 _dbus_warn ("could not append typecode byte\n");
315 len = strlen (value);
317 if (!_dbus_marshal_uint32 (dest, endian, len))
319 _dbus_warn ("couldn't append string length\n");
323 if (!_dbus_string_append (dest, value))
325 _dbus_warn ("couldn't append field value\n");
329 if (!_dbus_string_append_byte (dest, 0))
331 _dbus_warn ("couldn't append string nul term\n");
339 parse_basic_type (DBusString *src, char type,
340 DBusString *dest, dbus_bool_t *unalign,
344 int align_pad_start, align_pad_end;
345 unsigned char data[16];
350 case DBUS_TYPE_BOOLEAN:
353 case DBUS_TYPE_UINT32:
354 case DBUS_TYPE_INT32:
357 case DBUS_TYPE_DOUBLE:
361 _dbus_assert_not_reached ("not a basic type");
365 align_pad_start = _dbus_string_get_length (dest);
366 align_pad_end = _DBUS_ALIGN_VALUE (align_pad_start, align);
368 _dbus_string_delete_first_word (src);
370 if (!_dbus_string_parse_basic_type (src, type, 0, data, NULL))
372 _dbus_verbose ("failed to parse type '%c'", type);
376 if (!_dbus_marshal_basic_type (dest, type, data, endian))
378 _dbus_verbose ("failed to marshal type '%c'", type);
384 _dbus_string_delete (dest, align_pad_start,
385 align_pad_end - align_pad_start);
393 parse_basic_array (DBusString *src, char type,
394 DBusString *dest, dbus_bool_t *unalign,
397 int array_align, elem_size;
398 int i, len, allocated;
399 unsigned char *values, b;
401 int align_pad_start, align_pad_end;
402 dbus_bool_t retval = FALSE;
404 array_align = 4; /* length */
408 case DBUS_TYPE_BOOLEAN:
411 case DBUS_TYPE_UINT32:
412 case DBUS_TYPE_INT32:
415 case DBUS_TYPE_DOUBLE:
420 _dbus_assert_not_reached ("not a basic type");
424 align_pad_start = _dbus_string_get_length (dest);
425 align_pad_end = _DBUS_ALIGN_VALUE (align_pad_start, array_align);
432 _dbus_string_delete_first_word (src);
433 _dbus_string_skip_blank (src, 0, &i);
434 b = _dbus_string_get_byte (src, i++);
439 while (i < _dbus_string_get_length (src))
441 _dbus_string_skip_blank (src, i, &i);
443 if (!values || len == allocated - 1)
446 values = dbus_realloc (values, allocated * elem_size);
449 _dbus_warn ("could not allocate memory for '%c' ARRAY\n", type);
454 if (!_dbus_string_parse_basic_type (src, type, i, values + values_offset, &i))
456 _dbus_warn ("could not parse integer element %d of '%c' ARRAY\n", len, type);
460 values_offset += elem_size;
463 _dbus_string_skip_blank (src, i, &i);
465 b = _dbus_string_get_byte (src, i++);
473 if (!_dbus_marshal_basic_type_array (dest, type, values, len, endian))
475 _dbus_warn ("failed to append '%c' ARRAY\n", type);
481 _dbus_string_delete (dest, align_pad_start,
482 align_pad_end - align_pad_start);
494 lookup_basic_type (const DBusString *str, dbus_bool_t *is_array)
497 char type = DBUS_TYPE_INVALID;
502 { "BYTE", DBUS_TYPE_BYTE },
503 { "BOOLEAN", DBUS_TYPE_BOOLEAN },
504 { "INT32", DBUS_TYPE_INT32 },
505 { "UINT32", DBUS_TYPE_UINT32 },
506 { "DOUBLE", DBUS_TYPE_DOUBLE }
509 for (i = 0; i < _DBUS_N_ELEMENTS(name_to_type); i++)
511 const char *name = name_to_type[i].name;
512 if (_dbus_string_starts_with_c_str (str, name))
514 int offset = strlen (name);
515 type = name_to_type[i].type;
517 *is_array = _dbus_string_find (str, offset, "_ARRAY", NULL);
526 * Reads the given filename, which should be in "message description
527 * language" (look at some examples), and builds up the message data
528 * from it. The message data may be invalid, or valid.
530 * The parser isn't very strict, it's just a hack for test programs.
532 * The file format is:
534 * VALID_HEADER <type> normal header; byte order, type, padding, header len, body len, serial
535 * REQUIRED_FIELDS add required fields with placeholder values
536 * BIG_ENDIAN switch to big endian
537 * LITTLE_ENDIAN switch to little endian
538 * OPPOSITE_ENDIAN switch to opposite endian
539 * ALIGN <N> aligns to the given value
540 * UNALIGN skips alignment for the next marshal
541 * BYTE <N> inserts the given integer in [0,255] or char in 'a' format
542 * START_LENGTH <name> marks the start of a length to measure
543 * END_LENGTH <name> records the length since START_LENGTH under the given name
544 * (or if no START_LENGTH, absolute length)
545 * LENGTH <name> inserts the saved length of the same name
546 * CHOP <N> chops last N bytes off the data
547 * HEADER_FIELD <fieldname> inserts a header field name byte
548 * TYPE <typename> inserts a typecode byte
551 * Following commands insert aligned data unless
552 * preceded by "UNALIGN":
554 * INT32 <N> marshals an INT32
555 * UINT32 <N> marshals a UINT32
556 * INT64 <N> marshals an INT64
557 * UINT64 <N> marshals a UINT64
558 * DOUBLE <N> marshals a double
559 * STRING 'Foo' marshals a string
560 * OBJECT_PATH '/foo/bar' marshals an object path
561 * BYTE_ARRAY { 'a', 3, 4, 5, 6} marshals a BYTE array
562 * BOOLEAN_ARRAY { false, true, false} marshals a BOOLEAN array
563 * INT32_ARRAY { 3, 4, 5, 6} marshals an INT32 array
564 * UINT32_ARRAY { 3, 4, 5, 6} marshals an UINT32 array
565 * DOUBLE_ARRAY { 1.0, 2.0, 3.0, 4.0} marshals a DOUBLE array
566 * STRING_ARRAY { "foo", "bar", "gazonk"} marshals a STRING array
569 * @todo add support for array types INT32_ARRAY { 3, 4, 5, 6 }
572 * @param dest the string to append the message data to
573 * @param filename the filename to load
574 * @returns #TRUE on success
577 _dbus_message_data_load (DBusString *dest,
578 const DBusString *filename)
586 DBusHashTable *length_hash;
590 dbus_bool_t is_array;
595 if (!_dbus_string_init (&file))
598 if (!_dbus_string_init (&line))
600 _dbus_string_free (&file);
604 _dbus_verbose ("Loading %s\n", _dbus_string_get_const_data (filename));
606 dbus_error_init (&error);
607 if (!_dbus_file_get_contents (&file, filename, &error))
609 _dbus_warn ("Getting contents of %s failed: %s\n",
610 _dbus_string_get_const_data (filename), error.message);
611 dbus_error_free (&error);
615 length_hash = _dbus_hash_table_new (DBUS_HASH_STRING,
618 if (length_hash == NULL)
621 endian = DBUS_COMPILER_BYTE_ORDER;
625 while (_dbus_string_pop_line (&file, &line))
627 dbus_bool_t just_set_unalign;
629 just_set_unalign = FALSE;
632 _dbus_string_delete_leading_blanks (&line);
634 if (_dbus_string_get_length (&line) == 0)
639 else if (_dbus_string_starts_with_c_str (&line,
642 /* Ignore this comment */
645 else if (_dbus_string_starts_with_c_str (&line,
652 if (_dbus_string_get_length (&line) < (int) strlen ("VALID_HEADER "))
654 _dbus_warn ("no args to VALID_HEADER\n");
658 if (!_dbus_string_append_byte (dest, endian))
660 _dbus_warn ("could not append endianness\n");
664 message_type = message_type_from_string (&line,
665 strlen ("VALID_HEADER "));
666 if (message_type < 0)
668 _dbus_warn ("VALID_HEADER not followed by space then known message type\n");
672 if (!_dbus_string_append_byte (dest, message_type))
674 _dbus_warn ("could not append message type\n");
681 if (!_dbus_string_append_byte (dest, '\0'))
683 _dbus_warn ("could not append nul pad\n");
689 _dbus_string_init_const (&name, "Header");
690 if (!append_saved_length (dest, length_hash,
691 &name, _dbus_string_get_length (dest),
695 _dbus_string_init_const (&name, "Body");
696 if (!append_saved_length (dest, length_hash,
697 &name, _dbus_string_get_length (dest),
702 if (!_dbus_marshal_uint32 (dest, endian, 1))
704 _dbus_warn ("couldn't append client serial\n");
708 else if (_dbus_string_starts_with_c_str (&line,
711 if (!append_string_field (dest, endian,
712 DBUS_HEADER_FIELD_INTERFACE,
714 "org.freedesktop.BlahBlahInterface"))
716 if (!append_string_field (dest, endian,
717 DBUS_HEADER_FIELD_MEMBER,
721 if (!append_string_field (dest, endian,
722 DBUS_HEADER_FIELD_PATH,
723 DBUS_TYPE_OBJECT_PATH,
727 /* FIXME later we'll validate this, and then it will break
728 * and the .message files will have to include the right thing
730 if (!append_string_field (dest, endian,
731 DBUS_HEADER_FIELD_SIGNATURE,
736 else if (_dbus_string_starts_with_c_str (&line,
739 endian = DBUS_BIG_ENDIAN;
741 else if (_dbus_string_starts_with_c_str (&line,
744 endian = DBUS_LITTLE_ENDIAN;
746 else if (_dbus_string_starts_with_c_str (&line,
749 if (endian == DBUS_BIG_ENDIAN)
750 endian = DBUS_LITTLE_ENDIAN;
752 endian = DBUS_BIG_ENDIAN;
754 else if (_dbus_string_starts_with_c_str (&line,
761 _dbus_string_delete_first_word (&line);
763 if (!_dbus_string_parse_int (&line, 0, &val, &end))
765 _dbus_warn ("Failed to parse integer\n");
771 _dbus_warn ("Aligning to %ld boundary is crack\n",
776 orig_len = _dbus_string_get_length (dest);
778 if (!_dbus_string_align_length (dest, val))
781 if (_dbus_string_parse_int (&line, end, &val, NULL))
783 /* If there's an optional second int argument,
784 * fill in align padding with that value
786 if (val < 0 || val > 255)
788 _dbus_warn ("can't fill align padding with %ld, must be a byte value\n", val);
793 while (end < _dbus_string_get_length (dest))
795 _dbus_string_set_byte (dest, end, val);
800 else if (_dbus_string_starts_with_c_str (&line, "UNALIGN"))
803 just_set_unalign = TRUE;
805 else if (_dbus_string_starts_with_c_str (&line, "CHOP"))
809 /* FIXME if you CHOP the offset for a LENGTH
810 * command, we segfault.
813 _dbus_string_delete_first_word (&line);
815 if (!_dbus_string_parse_int (&line, 0, &val, NULL))
817 _dbus_warn ("Failed to parse integer to chop\n");
821 if (val > _dbus_string_get_length (dest))
823 _dbus_warn ("Trying to chop %ld bytes but we only have %d\n",
825 _dbus_string_get_length (dest));
829 _dbus_string_shorten (dest, val);
831 else if (_dbus_string_starts_with_c_str (&line,
834 _dbus_string_delete_first_word (&line);
836 if (!save_start (length_hash, &line,
837 _dbus_string_get_length (dest)))
839 _dbus_warn ("failed to save length start\n");
843 else if (_dbus_string_starts_with_c_str (&line,
846 _dbus_string_delete_first_word (&line);
848 if (!save_length (length_hash, &line,
849 _dbus_string_get_length (dest)))
851 _dbus_warn ("failed to save length end\n");
855 else if (_dbus_string_starts_with_c_str (&line,
858 SAVE_FOR_UNALIGN (dest, 4);
860 _dbus_string_delete_first_word (&line);
862 if (!append_saved_length (dest, length_hash,
864 unalign ? align_pad_start : align_pad_end,
867 _dbus_warn ("failed to add LENGTH\n");
871 PERFORM_UNALIGN (dest);
873 else if (_dbus_string_starts_with_c_str (&line,
878 _dbus_string_delete_first_word (&line);
880 if (_dbus_string_starts_with_c_str (&line, "INVALID"))
881 field = DBUS_HEADER_FIELD_INVALID;
882 else if (_dbus_string_starts_with_c_str (&line, "PATH"))
883 field = DBUS_HEADER_FIELD_PATH;
884 else if (_dbus_string_starts_with_c_str (&line, "INTERFACE"))
885 field = DBUS_HEADER_FIELD_INTERFACE;
886 else if (_dbus_string_starts_with_c_str (&line, "MEMBER"))
887 field = DBUS_HEADER_FIELD_MEMBER;
888 else if (_dbus_string_starts_with_c_str (&line, "ERROR_NAME"))
889 field = DBUS_HEADER_FIELD_ERROR_NAME;
890 else if (_dbus_string_starts_with_c_str (&line, "REPLY_SERIAL"))
891 field = DBUS_HEADER_FIELD_REPLY_SERIAL;
892 else if (_dbus_string_starts_with_c_str (&line, "DESTINATION"))
893 field = DBUS_HEADER_FIELD_DESTINATION;
894 else if (_dbus_string_starts_with_c_str (&line, "SENDER"))
895 field = DBUS_HEADER_FIELD_SENDER;
896 else if (_dbus_string_starts_with_c_str (&line, "SIGNATURE"))
897 field = DBUS_HEADER_FIELD_SIGNATURE;
898 else if (_dbus_string_starts_with_c_str (&line, "UNKNOWN"))
899 field = 22; /* random unknown header field */
902 _dbus_warn ("%s is not a valid header field name\n",
903 _dbus_string_get_const_data (&line));
907 if (!_dbus_string_append_byte (dest, field))
909 _dbus_warn ("could not append header field name byte\n");
913 else if (_dbus_string_starts_with_c_str (&line,
918 _dbus_string_delete_first_word (&line);
920 if (_dbus_string_starts_with_c_str (&line, "INVALID"))
921 code = DBUS_TYPE_INVALID;
922 else if (_dbus_string_starts_with_c_str (&line, "NIL"))
923 code = DBUS_TYPE_NIL;
924 else if ((code = lookup_basic_type (&line, NULL)) != DBUS_TYPE_INVALID)
926 else if (_dbus_string_starts_with_c_str (&line, "STRING"))
927 code = DBUS_TYPE_STRING;
928 else if (_dbus_string_starts_with_c_str (&line, "OBJECT_PATH"))
929 code = DBUS_TYPE_OBJECT_PATH;
930 else if (_dbus_string_starts_with_c_str (&line, "CUSTOM"))
931 code = DBUS_TYPE_CUSTOM;
932 else if (_dbus_string_starts_with_c_str (&line, "ARRAY"))
933 code = DBUS_TYPE_ARRAY;
934 else if (_dbus_string_starts_with_c_str (&line, "DICT"))
935 code = DBUS_TYPE_DICT;
938 _dbus_warn ("%s is not a valid type name\n", _dbus_string_get_const_data (&line));
942 if (!_dbus_string_append_byte (dest, code))
944 _dbus_warn ("could not append typecode byte\n");
948 else if (_dbus_string_starts_with_c_str (&line,
951 SAVE_FOR_UNALIGN (dest, 4);
952 int i, len, allocated;
959 values = dbus_new (char *, allocated);
962 _dbus_warn ("could not allocate memory for STRING_ARRAY\n");
968 _dbus_string_delete_first_word (&line);
969 _dbus_string_skip_blank (&line, 0, &i);
970 b = _dbus_string_get_byte (&line, i++);
975 _dbus_string_init (&val_str);
976 while (i < _dbus_string_get_length (&line))
978 _dbus_string_skip_blank (&line, i, &i);
980 if (!append_quoted_string (&val_str, &line, i, &i))
982 _dbus_warn ("could not parse quoted string for STRING_ARRAY\n");
987 if (!_dbus_string_steal_data (&val_str, &val))
989 _dbus_warn ("could not allocate memory for STRING_ARRAY string\n");
994 if (len == allocated)
997 values = dbus_realloc (values, allocated * sizeof (char *));
1000 _dbus_warn ("could not allocate memory for STRING_ARRAY\n");
1005 _dbus_string_skip_blank (&line, i, &i);
1007 b = _dbus_string_get_byte (&line, i++);
1013 _dbus_warn ("missing comma when parsing STRING_ARRAY\n");
1017 _dbus_string_free (&val_str);
1019 if (!_dbus_marshal_string_array (dest, endian, (const char **)values, len))
1021 _dbus_warn ("failed to append STRING_ARRAY\n");
1026 dbus_free_string_array (values);
1028 PERFORM_UNALIGN (dest);
1030 else if (_dbus_string_starts_with_c_str (&line,
1033 SAVE_FOR_UNALIGN (dest, 4);
1037 _dbus_string_delete_first_word (&line);
1039 size_offset = _dbus_string_get_length (dest);
1040 size_offset = _DBUS_ALIGN_VALUE (size_offset, 4);
1041 if (!_dbus_marshal_uint32 (dest, endian, 0))
1043 _dbus_warn ("Failed to append string size\n");
1047 old_len = _dbus_string_get_length (dest);
1048 if (!append_quoted_string (dest, &line, 0, NULL))
1050 _dbus_warn ("Failed to append quoted string\n");
1054 _dbus_marshal_set_uint32 (dest, endian, size_offset,
1055 /* subtract 1 for nul */
1056 _dbus_string_get_length (dest) - old_len - 1);
1058 PERFORM_UNALIGN (dest);
1060 else if ((type = lookup_basic_type (&line, &is_array)) != DBUS_TYPE_INVALID)
1064 if (!parse_basic_array (&line, type, dest, &unalign, endian))
1069 if (!parse_basic_type (&line, type, dest, &unalign, endian))
1073 else if (_dbus_string_starts_with_c_str (&line,
1076 SAVE_FOR_UNALIGN (dest, 4);
1080 _dbus_string_delete_first_word (&line);
1082 size_offset = _dbus_string_get_length (dest);
1083 size_offset = _DBUS_ALIGN_VALUE (size_offset, 4);
1084 if (!_dbus_marshal_uint32 (dest, endian, 0))
1086 _dbus_warn ("Failed to append string size\n");
1090 old_len = _dbus_string_get_length (dest);
1091 if (!append_quoted_string (dest, &line, 0, NULL))
1093 _dbus_warn ("Failed to append quoted string\n");
1097 _dbus_marshal_set_uint32 (dest, endian, size_offset,
1098 /* subtract 1 for nul */
1099 _dbus_string_get_length (dest) - old_len - 1);
1101 PERFORM_UNALIGN (dest);
1106 if (!just_set_unalign && unalign)
1108 _dbus_warn ("UNALIGN prior to something that isn't aligned\n");
1112 goto next_iteration; /* skip parse_failed */
1116 _dbus_warn ("couldn't process line %d \"%s\"\n",
1117 line_no, _dbus_string_get_const_data (&line));
1122 _dbus_hash_iter_init (length_hash, &iter);
1123 while (_dbus_hash_iter_next (&iter))
1125 SavedLength *sl = _dbus_hash_iter_get_value (&iter);
1128 s = _dbus_string_get_const_data (&sl->name);
1132 _dbus_warn ("Used LENGTH %s but never did END_LENGTH\n",
1136 else if (sl->offset < 0)
1138 _dbus_warn ("Did END_LENGTH %s but never used LENGTH\n",
1147 _dbus_verbose ("Filling in length %s endian = %d offset = %d start = %d length = %d\n",
1148 s, sl->endian, sl->offset, sl->start, sl->length);
1149 _dbus_marshal_set_int32 (dest,
1152 sl->length - sl->start);
1155 _dbus_hash_iter_remove_entry (&iter);
1160 _dbus_verbose_bytes_of_string (dest, 0, _dbus_string_get_length (dest));
1163 if (length_hash != NULL)
1164 _dbus_hash_table_unref (length_hash);
1166 _dbus_string_free (&file);
1167 _dbus_string_free (&line);
1172 #endif /* DBUS_BUILD_TESTS */