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 Red Hat, Inc.
6 * Licensed under the Academic Free License version 1.2
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.
46 int start; /**< Calculate length since here */
47 int length; /**< length to write */
48 int offset; /**< where to write it into the data */
49 int endian; /**< endianness to write with */
53 free_saved_length (void *data)
55 SavedLength *sl = data;
58 return; /* all hash free functions have to accept NULL */
60 _dbus_string_free (&sl->name);
65 ensure_saved_length (DBusHashTable *hash,
66 const DBusString *name)
71 s = _dbus_string_get_const_data (name);
73 sl = _dbus_hash_table_lookup_string (hash, s);
77 sl = dbus_new0 (SavedLength, 1);
79 if (!_dbus_string_init (&sl->name))
85 if (!_dbus_string_copy (name, 0, &sl->name, 0))
88 s = _dbus_string_get_const_data (&sl->name);
90 if (!_dbus_hash_table_insert_string (hash, (char*)s, sl))
101 free_saved_length (sl);
106 save_start (DBusHashTable *hash,
107 const DBusString *name,
112 sl = ensure_saved_length (hash, name);
116 else if (sl->start >= 0)
118 _dbus_warn ("Same START_LENGTH given twice\n");
128 save_length (DBusHashTable *hash,
129 const DBusString *name,
134 sl = ensure_saved_length (hash, name);
138 else if (sl->length >= 0)
140 _dbus_warn ("Same END_LENGTH given twice\n");
150 save_offset (DBusHashTable *hash,
151 const DBusString *name,
157 sl = ensure_saved_length (hash, name);
161 else if (sl->offset >= 0)
163 _dbus_warn ("Same LENGTH given twice\n");
175 /** Saves the segment to delete in order to unalign the next item */
176 #define SAVE_FOR_UNALIGN(str, boundary) \
177 int align_pad_start = _dbus_string_get_length (str); \
178 int align_pad_end = _DBUS_ALIGN_VALUE (align_pad_start, (boundary))
180 /** Deletes the alignment padding */
181 #define PERFORM_UNALIGN(str) \
184 _dbus_string_delete ((str), align_pad_start, \
185 align_pad_end - align_pad_start); \
191 append_quoted_string (DBusString *dest,
192 const DBusString *quoted,
196 dbus_bool_t in_quotes = FALSE;
199 /* FIXME: We might want to add escaping in case we want to put '
200 * characters in our strings.
204 while (i < _dbus_string_get_length (quoted))
208 b = _dbus_string_get_byte (quoted, i);
216 if (!_dbus_string_append_byte (dest, b))
224 else if (b == ' ' || b == '\n' || b == '\t')
225 break; /* end on whitespace if not quoted */
228 if (!_dbus_string_append_byte (dest, b))
239 if (!_dbus_string_append_byte (dest, '\0'))
245 append_saved_length (DBusString *dest,
246 DBusHashTable *length_hash,
247 const DBusString *name,
251 if (!save_offset (length_hash, name,
254 _dbus_warn ("failed to save offset to LENGTH\n");
258 if (!_dbus_marshal_uint32 (dest, endian,
261 _dbus_warn ("failed to append a length\n");
269 message_type_from_string (const DBusString *str,
274 s = _dbus_string_get_const_data_len (str, start,
275 _dbus_string_get_length (str) - start);
277 if (strncmp (s, "method_call", strlen ("method_call")) == 0)
278 return DBUS_MESSAGE_TYPE_METHOD_CALL;
279 else if (strncmp (s, "method_return", strlen ("method_return")) == 0)
280 return DBUS_MESSAGE_TYPE_METHOD_RETURN;
281 else if (strncmp (s, "signal", strlen ("signal")) == 0)
282 return DBUS_MESSAGE_TYPE_SIGNAL;
283 else if (strncmp (s, "error", strlen ("error")) == 0)
284 return DBUS_MESSAGE_TYPE_ERROR;
285 else if (strncmp (s, "invalid", strlen ("invalid")) == 0)
286 return DBUS_MESSAGE_TYPE_INVALID;
292 append_string_field (DBusString *dest,
294 const char *field_name,
300 if (!_dbus_string_align_length (dest, 4))
302 _dbus_warn ("could not align field name\n");
306 if (!_dbus_string_append (dest, field_name))
308 _dbus_warn ("couldn't append field name\n");
312 if (!_dbus_string_append_byte (dest, type))
314 _dbus_warn ("could not append typecode byte\n");
318 len = strlen (value);
320 if (!_dbus_marshal_uint32 (dest, endian, len))
322 _dbus_warn ("couldn't append string length\n");
326 if (!_dbus_string_append (dest, value))
328 _dbus_warn ("couldn't append field value\n");
332 if (!_dbus_string_append_byte (dest, 0))
334 _dbus_warn ("couldn't append string nul term\n");
342 * Reads the given filename, which should be in "message description
343 * language" (look at some examples), and builds up the message data
344 * from it. The message data may be invalid, or valid.
346 * The parser isn't very strict, it's just a hack for test programs.
348 * The file format is:
350 * VALID_HEADER <type> normal header; byte order, type, padding, header len, body len, serial
351 * REQUIRED_FIELDS add required fields with placeholder values
352 * BIG_ENDIAN switch to big endian
353 * LITTLE_ENDIAN switch to little endian
354 * OPPOSITE_ENDIAN switch to opposite endian
355 * ALIGN <N> aligns to the given value
356 * UNALIGN skips alignment for the next marshal
357 * BYTE <N> inserts the given integer in [0,255] or char in 'a' format
358 * START_LENGTH <name> marks the start of a length to measure
359 * END_LENGTH <name> records the length since START_LENGTH under the given name
360 * (or if no START_LENGTH, absolute length)
361 * LENGTH <name> inserts the saved length of the same name
362 * CHOP <N> chops last N bytes off the data
363 * FIELD_NAME <abcd> inserts 4-byte field name
364 * TYPE <typename> inserts a typecode byte
367 * Following commands insert aligned data unless
368 * preceded by "UNALIGN":
370 * INT32 <N> marshals an INT32
371 * UINT32 <N> marshals a UINT32
372 * INT64 <N> marshals an INT64
373 * UINT64 <N> marshals a UINT64
374 * DOUBLE <N> marshals a double
375 * STRING 'Foo' marshals a string
376 * OBJECT_PATH '/foo/bar' marshals an object path
377 * BYTE_ARRAY { 'a', 3, 4, 5, 6} marshals a BYTE array
378 * BOOLEAN_ARRAY { false, true, false} marshals a BOOLEAN array
379 * INT32_ARRAY { 3, 4, 5, 6} marshals an INT32 array
380 * UINT32_ARRAY { 3, 4, 5, 6} marshals an UINT32 array
381 * DOUBLE_ARRAY { 1.0, 2.0, 3.0, 4.0} marshals a DOUBLE array
382 * STRING_ARRAY { "foo", "bar", "gazonk"} marshals a STRING array
385 * @todo add support for array types INT32_ARRAY { 3, 4, 5, 6 }
388 * @param dest the string to append the message data to
389 * @param filename the filename to load
390 * @returns #TRUE on success
393 _dbus_message_data_load (DBusString *dest,
394 const DBusString *filename)
402 DBusHashTable *length_hash;
409 if (!_dbus_string_init (&file))
412 if (!_dbus_string_init (&line))
414 _dbus_string_free (&file);
418 _dbus_verbose ("Loading %s\n", _dbus_string_get_const_data (filename));
420 dbus_error_init (&error);
421 if (!_dbus_file_get_contents (&file, filename, &error))
423 _dbus_warn ("Getting contents of %s failed: %s\n",
424 _dbus_string_get_const_data (filename), error.message);
425 dbus_error_free (&error);
429 length_hash = _dbus_hash_table_new (DBUS_HASH_STRING,
432 if (length_hash == NULL)
435 endian = DBUS_COMPILER_BYTE_ORDER;
439 while (_dbus_string_pop_line (&file, &line))
441 dbus_bool_t just_set_unalign;
443 just_set_unalign = FALSE;
446 _dbus_string_delete_leading_blanks (&line);
448 if (_dbus_string_get_length (&line) == 0)
453 else if (_dbus_string_starts_with_c_str (&line,
456 /* Ignore this comment */
459 else if (_dbus_string_starts_with_c_str (&line,
466 if (_dbus_string_get_length (&line) < (int) strlen ("VALID_HEADER "))
468 _dbus_warn ("no args to VALID_HEADER\n");
472 if (!_dbus_string_append_byte (dest, endian))
474 _dbus_warn ("could not append endianness\n");
478 message_type = message_type_from_string (&line,
479 strlen ("VALID_HEADER "));
480 if (message_type < 0)
482 _dbus_warn ("VALID_HEADER not followed by space then known message type\n");
486 if (!_dbus_string_append_byte (dest, message_type))
488 _dbus_warn ("could not append message type\n");
495 if (!_dbus_string_append_byte (dest, '\0'))
497 _dbus_warn ("could not append nul pad\n");
503 _dbus_string_init_const (&name, "Header");
504 if (!append_saved_length (dest, length_hash,
505 &name, _dbus_string_get_length (dest),
509 _dbus_string_init_const (&name, "Body");
510 if (!append_saved_length (dest, length_hash,
511 &name, _dbus_string_get_length (dest),
516 if (!_dbus_marshal_int32 (dest, endian, 1))
518 _dbus_warn ("couldn't append client serial\n");
522 else if (_dbus_string_starts_with_c_str (&line,
525 if (!append_string_field (dest, endian,
526 DBUS_HEADER_FIELD_INTERFACE,
528 "org.freedesktop.BlahBlahInterface"))
530 if (!append_string_field (dest, endian,
531 DBUS_HEADER_FIELD_MEMBER,
535 if (!append_string_field (dest, endian,
536 DBUS_HEADER_FIELD_PATH,
537 DBUS_TYPE_OBJECT_PATH,
541 else if (_dbus_string_starts_with_c_str (&line,
544 endian = DBUS_BIG_ENDIAN;
546 else if (_dbus_string_starts_with_c_str (&line,
549 endian = DBUS_LITTLE_ENDIAN;
551 else if (_dbus_string_starts_with_c_str (&line,
554 if (endian == DBUS_BIG_ENDIAN)
555 endian = DBUS_LITTLE_ENDIAN;
557 endian = DBUS_BIG_ENDIAN;
559 else if (_dbus_string_starts_with_c_str (&line,
566 _dbus_string_delete_first_word (&line);
568 if (!_dbus_string_parse_int (&line, 0, &val, &end))
570 _dbus_warn ("Failed to parse integer\n");
576 _dbus_warn ("Aligning to %ld boundary is crack\n",
581 orig_len = _dbus_string_get_length (dest);
583 if (!_dbus_string_align_length (dest, val))
586 if (_dbus_string_parse_int (&line, end, &val, NULL))
588 /* If there's an optional second int argument,
589 * fill in align padding with that value
591 if (val < 0 || val > 255)
593 _dbus_warn ("can't fill align padding with %ld, must be a byte value\n", val);
598 while (end < _dbus_string_get_length (dest))
600 _dbus_string_set_byte (dest, end, val);
605 else if (_dbus_string_starts_with_c_str (&line, "UNALIGN"))
608 just_set_unalign = TRUE;
610 else if (_dbus_string_starts_with_c_str (&line, "CHOP"))
614 /* FIXME if you CHOP the offset for a LENGTH
615 * command, we segfault.
618 _dbus_string_delete_first_word (&line);
620 if (!_dbus_string_parse_int (&line, 0, &val, NULL))
622 _dbus_warn ("Failed to parse integer to chop\n");
626 if (val > _dbus_string_get_length (dest))
628 _dbus_warn ("Trying to chop %ld bytes but we only have %d\n",
630 _dbus_string_get_length (dest));
634 _dbus_string_shorten (dest, val);
636 else if (_dbus_string_starts_with_c_str (&line,
639 _dbus_string_delete_first_word (&line);
641 if (!save_start (length_hash, &line,
642 _dbus_string_get_length (dest)))
644 _dbus_warn ("failed to save length start\n");
648 else if (_dbus_string_starts_with_c_str (&line,
651 _dbus_string_delete_first_word (&line);
653 if (!save_length (length_hash, &line,
654 _dbus_string_get_length (dest)))
656 _dbus_warn ("failed to save length end\n");
660 else if (_dbus_string_starts_with_c_str (&line,
663 SAVE_FOR_UNALIGN (dest, 4);
665 _dbus_string_delete_first_word (&line);
667 if (!append_saved_length (dest, length_hash,
669 unalign ? align_pad_start : align_pad_end,
672 _dbus_warn ("failed to add LENGTH\n");
676 PERFORM_UNALIGN (dest);
678 else if (_dbus_string_starts_with_c_str (&line,
681 _dbus_string_delete_first_word (&line);
683 if (_dbus_string_get_length (&line) != 4)
685 _dbus_warn ("Field name must be four characters not \"%s\"\n",
686 _dbus_string_get_const_data (&line));
693 _dbus_string_align_length (dest, 4);
695 if (!_dbus_string_copy (&line, 0, dest,
696 _dbus_string_get_length (dest)))
699 else if (_dbus_string_starts_with_c_str (&line,
704 _dbus_string_delete_first_word (&line);
706 if (_dbus_string_starts_with_c_str (&line, "INVALID"))
707 code = DBUS_TYPE_INVALID;
708 else if (_dbus_string_starts_with_c_str (&line, "NIL"))
709 code = DBUS_TYPE_NIL;
710 else if (_dbus_string_starts_with_c_str (&line, "BYTE"))
711 code = DBUS_TYPE_BYTE;
712 else if (_dbus_string_starts_with_c_str (&line, "BOOLEAN"))
713 code = DBUS_TYPE_BOOLEAN;
714 else if (_dbus_string_starts_with_c_str (&line, "INT32"))
715 code = DBUS_TYPE_INT32;
716 else if (_dbus_string_starts_with_c_str (&line, "UINT32"))
717 code = DBUS_TYPE_UINT32;
718 else if (_dbus_string_starts_with_c_str (&line, "DOUBLE"))
719 code = DBUS_TYPE_DOUBLE;
720 else if (_dbus_string_starts_with_c_str (&line, "STRING"))
721 code = DBUS_TYPE_STRING;
722 else if (_dbus_string_starts_with_c_str (&line, "OBJECT_PATH"))
723 code = DBUS_TYPE_OBJECT_PATH;
724 else if (_dbus_string_starts_with_c_str (&line, "NAMED"))
725 code = DBUS_TYPE_NAMED;
726 else if (_dbus_string_starts_with_c_str (&line, "ARRAY"))
727 code = DBUS_TYPE_ARRAY;
728 else if (_dbus_string_starts_with_c_str (&line, "DICT"))
729 code = DBUS_TYPE_DICT;
732 _dbus_warn ("%s is not a valid type name\n", _dbus_string_get_const_data (&line));
736 if (!_dbus_string_append_byte (dest, code))
738 _dbus_warn ("could not append typecode byte\n");
742 else if (_dbus_string_starts_with_c_str (&line,
745 SAVE_FOR_UNALIGN (dest, 4);
746 int i, len, allocated;
747 unsigned char *values;
752 values = dbus_new (unsigned char, allocated);
755 _dbus_warn ("could not allocate memory for BYTE_ARRAY\n");
761 _dbus_string_delete_first_word (&line);
762 _dbus_string_skip_blank (&line, 0, &i);
763 b = _dbus_string_get_byte (&line, i++);
768 while (i < _dbus_string_get_length (&line))
770 _dbus_string_skip_blank (&line, i, &i);
772 if (_dbus_string_get_byte (&line, i) == '\'' &&
773 _dbus_string_get_length (&line) >= i + 4 &&
774 _dbus_string_get_byte (&line, i + 1) == '\\' &&
775 _dbus_string_get_byte (&line, i + 2) == '\'' &&
776 _dbus_string_get_byte (&line, i + 3) == '\'')
781 else if (_dbus_string_get_byte (&line, i) == '\'' &&
782 _dbus_string_get_length (&line) >= i + 3 &&
783 _dbus_string_get_byte (&line, i + 2) == '\'')
785 val = _dbus_string_get_byte (&line, i + 1);
790 if (!_dbus_string_parse_int (&line, i, &val, &i))
792 _dbus_warn ("Failed to parse integer for BYTE_ARRAY\n");
796 if (val < 0 || val > 255)
798 _dbus_warn ("A byte must be in range 0-255 not %ld\n",
805 if (len == allocated)
808 values = dbus_realloc (values, allocated * sizeof (unsigned char));
811 _dbus_warn ("could not allocate memory for BYTE_ARRAY\n");
816 _dbus_string_skip_blank (&line, i, &i);
818 b = _dbus_string_get_byte (&line, i++);
826 if (!_dbus_marshal_int32 (dest, endian, len) ||
827 !_dbus_string_append_len (dest, values, len))
829 _dbus_warn ("failed to append BYTE_ARRAY\n");
834 PERFORM_UNALIGN (dest);
836 else if (_dbus_string_starts_with_c_str (&line,
839 SAVE_FOR_UNALIGN (dest, 4);
840 int i, len, allocated;
841 unsigned char *values;
842 unsigned char b, val;
845 values = dbus_new (unsigned char, allocated);
848 _dbus_warn ("could not allocate memory for BOOLEAN_ARRAY\n");
854 _dbus_string_delete_first_word (&line);
855 _dbus_string_skip_blank (&line, 0, &i);
856 b = _dbus_string_get_byte (&line, i++);
861 while (i < _dbus_string_get_length (&line))
863 _dbus_string_skip_blank (&line, i, &i);
865 if (_dbus_string_find_to (&line, i, i + 5,
871 else if (_dbus_string_find_to (&line, i, i + 4,
879 _dbus_warn ("could not parse BOOLEAN_ARRAY\n");
884 if (len == allocated)
887 values = dbus_realloc (values, allocated * sizeof (unsigned char));
890 _dbus_warn ("could not allocate memory for BOOLEAN_ARRAY\n");
895 _dbus_string_skip_blank (&line, i, &i);
897 b = _dbus_string_get_byte (&line, i++);
905 if (!_dbus_marshal_int32 (dest, endian, len) ||
906 !_dbus_string_append_len (dest, values, len))
908 _dbus_warn ("failed to append BOOLEAN_ARRAY\n");
913 PERFORM_UNALIGN (dest);
915 else if (_dbus_string_starts_with_c_str (&line,
918 SAVE_FOR_UNALIGN (dest, 4);
919 int i, len, allocated;
920 dbus_int32_t *values;
925 values = dbus_new (dbus_int32_t, allocated);
928 _dbus_warn ("could not allocate memory for INT32_ARRAY\n");
934 _dbus_string_delete_first_word (&line);
935 _dbus_string_skip_blank (&line, 0, &i);
936 b = _dbus_string_get_byte (&line, i++);
941 while (i < _dbus_string_get_length (&line))
943 _dbus_string_skip_blank (&line, i, &i);
945 if (!_dbus_string_parse_int (&line, i, &val, &i))
947 _dbus_warn ("could not parse integer for INT32_ARRAY\n");
952 if (len == allocated)
955 values = dbus_realloc (values, allocated * sizeof (dbus_int32_t));
958 _dbus_warn ("could not allocate memory for INT32_ARRAY\n");
963 _dbus_string_skip_blank (&line, i, &i);
965 b = _dbus_string_get_byte (&line, i++);
973 if (!_dbus_marshal_int32_array (dest, endian, values, len))
975 _dbus_warn ("failed to append INT32_ARRAY\n");
980 PERFORM_UNALIGN (dest);
982 else if (_dbus_string_starts_with_c_str (&line,
985 SAVE_FOR_UNALIGN (dest, 4);
986 int i, len, allocated;
987 dbus_uint32_t *values;
992 values = dbus_new (dbus_uint32_t, allocated);
995 _dbus_warn ("could not allocate memory for UINT32_ARRAY\n");
1001 _dbus_string_delete_first_word (&line);
1002 _dbus_string_skip_blank (&line, 0, &i);
1003 b = _dbus_string_get_byte (&line, i++);
1008 while (i < _dbus_string_get_length (&line))
1010 _dbus_string_skip_blank (&line, i, &i);
1012 if (!_dbus_string_parse_int (&line, i, &val, &i))
1014 _dbus_warn ("could not parse integer for UINT32_ARRAY\n");
1018 values[len++] = val;
1019 if (len == allocated)
1022 values = dbus_realloc (values, allocated * sizeof (dbus_uint32_t));
1025 _dbus_warn ("could not allocate memory for UINT32_ARRAY\n");
1030 _dbus_string_skip_blank (&line, i, &i);
1032 b = _dbus_string_get_byte (&line, i++);
1040 if (!_dbus_marshal_uint32_array (dest, endian, values, len))
1042 _dbus_warn ("failed to append UINT32_ARRAY\n");
1047 PERFORM_UNALIGN (dest);
1049 else if (_dbus_string_starts_with_c_str (&line,
1052 SAVE_FOR_UNALIGN (dest, 8);
1053 int i, len, allocated;
1059 values = dbus_new (double, allocated);
1062 _dbus_warn ("could not allocate memory for DOUBLE_ARRAY\n");
1068 _dbus_string_delete_first_word (&line);
1069 _dbus_string_skip_blank (&line, 0, &i);
1070 b = _dbus_string_get_byte (&line, i++);
1075 while (i < _dbus_string_get_length (&line))
1077 _dbus_string_skip_blank (&line, i, &i);
1079 if (!_dbus_string_parse_double (&line, i, &val, &i))
1081 _dbus_warn ("could not parse double for DOUBLE_ARRAY\n");
1085 values[len++] = val;
1086 if (len == allocated)
1089 values = dbus_realloc (values, allocated * sizeof (double));
1092 _dbus_warn ("could not allocate memory for DOUBLE_ARRAY\n");
1097 _dbus_string_skip_blank (&line, i, &i);
1099 b = _dbus_string_get_byte (&line, i++);
1107 if (!_dbus_marshal_double_array (dest, endian, values, len))
1109 _dbus_warn ("failed to append DOUBLE_ARRAY\n");
1114 PERFORM_UNALIGN (dest);
1116 else if (_dbus_string_starts_with_c_str (&line,
1119 SAVE_FOR_UNALIGN (dest, 4);
1120 int i, len, allocated;
1127 values = dbus_new (char *, allocated);
1130 _dbus_warn ("could not allocate memory for STRING_ARRAY\n");
1136 _dbus_string_delete_first_word (&line);
1137 _dbus_string_skip_blank (&line, 0, &i);
1138 b = _dbus_string_get_byte (&line, i++);
1143 _dbus_string_init (&val_str);
1144 while (i < _dbus_string_get_length (&line))
1146 _dbus_string_skip_blank (&line, i, &i);
1148 if (!append_quoted_string (&val_str, &line, i, &i))
1150 _dbus_warn ("could not parse quoted string for STRING_ARRAY\n");
1155 if (!_dbus_string_steal_data (&val_str, &val))
1157 _dbus_warn ("could not allocate memory for STRING_ARRAY string\n");
1161 values[len++] = val;
1162 if (len == allocated)
1165 values = dbus_realloc (values, allocated * sizeof (char *));
1168 _dbus_warn ("could not allocate memory for STRING_ARRAY\n");
1173 _dbus_string_skip_blank (&line, i, &i);
1175 b = _dbus_string_get_byte (&line, i++);
1181 _dbus_warn ("missing comma when parsing STRING_ARRAY\n");
1185 _dbus_string_free (&val_str);
1187 if (!_dbus_marshal_string_array (dest, endian, (const char **)values, len))
1189 _dbus_warn ("failed to append STRING_ARRAY\n");
1194 dbus_free_string_array (values);
1196 PERFORM_UNALIGN (dest);
1198 else if (_dbus_string_starts_with_c_str (&line, "BYTE"))
1200 unsigned char the_byte;
1202 _dbus_string_delete_first_word (&line);
1204 if (_dbus_string_equal_c_str (&line, "'\\''"))
1206 else if (_dbus_string_get_byte (&line, 0) == '\'' &&
1207 _dbus_string_get_length (&line) >= 3 &&
1208 _dbus_string_get_byte (&line, 2) == '\'')
1209 the_byte = _dbus_string_get_byte (&line, 1);
1213 if (!_dbus_string_parse_int (&line, 0, &val, NULL))
1215 _dbus_warn ("Failed to parse integer for BYTE\n");
1221 _dbus_warn ("A byte must be in range 0-255 not %ld\n",
1225 the_byte = (unsigned char) val;
1228 _dbus_string_append_byte (dest, the_byte);
1230 else if (_dbus_string_starts_with_c_str (&line,
1235 _dbus_string_delete_first_word (&line);
1237 if (_dbus_string_starts_with_c_str (&line, "true"))
1239 else if (_dbus_string_starts_with_c_str (&line, "false"))
1243 _dbus_warn ("could not parse BOOLEAN\n");
1246 if (!_dbus_string_append_byte (dest, val))
1248 _dbus_warn ("failed to append BOOLEAN\n");
1253 else if (_dbus_string_starts_with_c_str (&line,
1256 SAVE_FOR_UNALIGN (dest, 4);
1259 _dbus_string_delete_first_word (&line);
1261 if (!_dbus_string_parse_int (&line, 0, &val, NULL))
1263 _dbus_warn ("could not parse integer for INT32\n");
1267 if (!_dbus_marshal_int32 (dest, endian,
1270 _dbus_warn ("failed to append INT32\n");
1274 PERFORM_UNALIGN (dest);
1276 else if (_dbus_string_starts_with_c_str (&line,
1279 SAVE_FOR_UNALIGN (dest, 4);
1282 _dbus_string_delete_first_word (&line);
1284 if (!_dbus_string_parse_uint (&line, 0, &val, NULL))
1287 if (!_dbus_marshal_uint32 (dest, endian,
1290 _dbus_warn ("failed to append UINT32\n");
1294 PERFORM_UNALIGN (dest);
1296 else if (_dbus_string_starts_with_c_str (&line,
1299 SAVE_FOR_UNALIGN (dest, 8);
1302 _dbus_string_delete_first_word (&line);
1304 if (!_dbus_string_parse_double (&line, 0, &val, NULL))
1307 if (!_dbus_marshal_double (dest, endian,
1310 _dbus_warn ("failed to append DOUBLE\n");
1314 PERFORM_UNALIGN (dest);
1316 else if (_dbus_string_starts_with_c_str (&line,
1319 SAVE_FOR_UNALIGN (dest, 4);
1323 _dbus_string_delete_first_word (&line);
1325 size_offset = _dbus_string_get_length (dest);
1326 size_offset = _DBUS_ALIGN_VALUE (size_offset, 4);
1327 if (!_dbus_marshal_uint32 (dest, endian, 0))
1329 _dbus_warn ("Failed to append string size\n");
1333 old_len = _dbus_string_get_length (dest);
1334 if (!append_quoted_string (dest, &line, 0, NULL))
1336 _dbus_warn ("Failed to append quoted string\n");
1340 _dbus_marshal_set_uint32 (dest, endian, size_offset,
1341 /* subtract 1 for nul */
1342 _dbus_string_get_length (dest) - old_len - 1);
1344 PERFORM_UNALIGN (dest);
1346 else if (_dbus_string_starts_with_c_str (&line,
1349 SAVE_FOR_UNALIGN (dest, 4);
1353 _dbus_string_delete_first_word (&line);
1355 size_offset = _dbus_string_get_length (dest);
1356 size_offset = _DBUS_ALIGN_VALUE (size_offset, 4);
1357 if (!_dbus_marshal_uint32 (dest, endian, 0))
1359 _dbus_warn ("Failed to append string size\n");
1363 old_len = _dbus_string_get_length (dest);
1364 if (!append_quoted_string (dest, &line, 0, NULL))
1366 _dbus_warn ("Failed to append quoted string\n");
1370 _dbus_marshal_set_uint32 (dest, endian, size_offset,
1371 /* subtract 1 for nul */
1372 _dbus_string_get_length (dest) - old_len - 1);
1374 PERFORM_UNALIGN (dest);
1379 if (!just_set_unalign && unalign)
1381 _dbus_warn ("UNALIGN prior to something that isn't aligned\n");
1385 goto next_iteration; /* skip parse_failed */
1389 _dbus_warn ("couldn't process line %d \"%s\"\n",
1390 line_no, _dbus_string_get_const_data (&line));
1395 _dbus_hash_iter_init (length_hash, &iter);
1396 while (_dbus_hash_iter_next (&iter))
1398 SavedLength *sl = _dbus_hash_iter_get_value (&iter);
1401 s = _dbus_string_get_const_data (&sl->name);
1405 _dbus_warn ("Used LENGTH %s but never did END_LENGTH\n",
1409 else if (sl->offset < 0)
1411 _dbus_warn ("Did END_LENGTH %s but never used LENGTH\n",
1420 _dbus_verbose ("Filling in length %s endian = %d offset = %d start = %d length = %d\n",
1421 s, sl->endian, sl->offset, sl->start, sl->length);
1422 _dbus_marshal_set_int32 (dest,
1425 sl->length - sl->start);
1428 _dbus_hash_iter_remove_entry (&iter);
1433 _dbus_verbose_bytes_of_string (dest, 0, _dbus_string_get_length (dest));
1436 if (length_hash != NULL)
1437 _dbus_hash_table_unref (length_hash);
1439 _dbus_string_free (&file);
1440 _dbus_string_free (&line);
1445 #endif /* DBUS_BUILD_TESTS */