summaryrefslogtreecommitdiffstats
path: root/dbus/dbus-message.c
diff options
context:
space:
mode:
authorAnders Carlsson <andersca@codefactory.se>2003-03-10 00:13:55 +0000
committerAnders Carlsson <andersca@codefactory.se>2003-03-10 00:13:55 +0000
commit799a3ff443f5357ae7857ebe989a7f92f7bd84df (patch)
tree5217028097693381989fa0a1480e0ac863cba58a /dbus/dbus-message.c
parent1458fb145fdfe7e7ca11c88f8e2f117d90a906d8 (diff)
2003-03-10 Anders Carlsson <andersca@codefactory.se>
* dbus/dbus-marshal.c: (_dbus_marshal_set_string): Take a length argument so we can marshal the correct string length. (_dbus_marshal_dict), (_dbus_demarshal_dict), (_dbus_marshal_get_arg_end_pos), (_dbus_marshal_validate_arg), (_dbus_marshal_test): * dbus/dbus-marshal.h: Add support for marshalling and demarshalling dicts. * dbus/dbus-message-builder.c: (_dbus_message_data_load): Add support for TYPE DICT. * dbus/dbus-message.c: (set_string_field): Adjust header padding. (dbus_message_append_args_valist), (dbus_message_append_dict), (dbus_message_get_args_valist), (dbus_message_iter_get_arg_type), (dbus_message_iter_get_dict), (_dbus_message_loader_return_buffer), (check_message_handling), (check_have_valid_message): * dbus/dbus-message.h: Add functions for setting and getting dicts. * dbus/dbus-protocol.h: Add DBUS_TYPE_DICT. * dbus/dbus.h: Add dbus-dict.h * doc/dbus-specification.sgml: Add information about how dicts are marshalled. * test/data/invalid-messages/dict-with-nil-value.message: * test/data/invalid-messages/too-short-dict.message: * test/data/valid-messages/dict-simple.message: * test/data/valid-messages/dict.message: Add sample messages containing dicts.
Diffstat (limited to 'dbus/dbus-message.c')
-rw-r--r--dbus/dbus-message.c122
1 files changed, 110 insertions, 12 deletions
diff --git a/dbus/dbus-message.c b/dbus/dbus-message.c
index db1b94bf..a25480cb 100644
--- a/dbus/dbus-message.c
+++ b/dbus/dbus-message.c
@@ -493,15 +493,21 @@ set_string_field (DBusMessage *message,
DBusString v;
int old_len;
int new_len;
+ int len;
+
+ clear_header_padding (message);
old_len = _dbus_string_get_length (&message->header);
+ len = strlen (value);
+
_dbus_string_init_const_len (&v, value,
- strlen (value) + 1); /* include nul */
+ len + 1); /* include nul */
if (!_dbus_marshal_set_string (&message->header,
message->byte_order,
- offset, &v))
- return FALSE;
+ offset, &v,
+ len))
+ goto failed;
new_len = _dbus_string_get_length (&message->header);
@@ -509,7 +515,19 @@ set_string_field (DBusMessage *message,
offset,
new_len - old_len);
+ if (!append_header_padding (message))
+ goto failed;
+
return TRUE;
+
+ failed:
+ /* this must succeed because it was allocated on function entry and
+ * DBusString doesn't ever realloc smaller
+ */
+ if (!append_header_padding (message))
+ _dbus_assert_not_reached ("failed to reappend header padding");
+
+ return FALSE;
}
}
@@ -1162,7 +1180,15 @@ dbus_message_append_args_valist (DBusMessage *message,
goto enomem;
}
break;
-
+ case DBUS_TYPE_DICT:
+ {
+ DBusDict *dict;
+
+ dict = va_arg (var_args, DBusDict *);
+
+ if (!dbus_message_append_dict (message, dict))
+ goto enomem;
+ }
default:
_dbus_warn ("Unknown field type %d\n", type);
}
@@ -1485,6 +1511,31 @@ dbus_message_append_string_array (DBusMessage *message,
}
/**
+ * Appends a dict to the message.
+ *
+ * @param message the message
+ * @param dict the dict
+ * @returns #TRUE on success
+ */
+dbus_bool_t
+dbus_message_append_dict (DBusMessage *message,
+ DBusDict *dict)
+{
+ _dbus_assert (!message->locked);
+
+ if (!_dbus_string_append_byte (&message->body, DBUS_TYPE_DICT))
+ return FALSE;
+
+ if (!_dbus_marshal_dict (&message->body, message->byte_order, dict))
+ {
+ _dbus_string_shorten (&message->body, 1);
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+/**
* Gets arguments from a message given a variable argument list.
* The variable argument list should contain the type of the
* argumen followed by a pointer to where the value should be
@@ -1696,6 +1747,16 @@ dbus_message_get_args_valist (DBusMessage *message,
return DBUS_RESULT_NO_MEMORY;
break;
}
+ case DBUS_TYPE_DICT:
+ {
+ DBusDict **dict;
+
+ dict = va_arg (var_args, DBusDict **);
+
+ if (!dbus_message_iter_get_dict (iter, dict))
+ return DBUS_RESULT_NO_MEMORY;
+ break;
+ }
default:
_dbus_warn ("Unknown field type %d\n", spec_type);
}
@@ -1850,7 +1911,7 @@ dbus_message_iter_get_arg_type (DBusMessageIter *iter)
_dbus_string_get_const_data_len (&iter->message->body, &data, iter->pos, 1);
- if (*data > DBUS_TYPE_INVALID && *data <= DBUS_TYPE_STRING_ARRAY)
+ if (*data > DBUS_TYPE_INVALID && *data <= DBUS_TYPE_DICT)
return *data;
return DBUS_TYPE_INVALID;
@@ -2062,7 +2123,7 @@ dbus_message_iter_get_double_array (DBusMessageIter *iter,
* @param iter the iterator
* @param value return location for array values
* @param len return location for length of byte array
- * @returns the byte array
+ * @returns #TRUE on success
*/
dbus_bool_t
dbus_message_iter_get_byte_array (DBusMessageIter *iter,
@@ -2093,7 +2154,7 @@ dbus_message_iter_get_byte_array (DBusMessageIter *iter,
* @param iter the iterator
* @param value return location for string values
* @param len return location for length of byte array
- * @returns the byte array
+ * @returns #TRUE on success
*/
dbus_bool_t
dbus_message_iter_get_string_array (DBusMessageIter *iter,
@@ -2112,6 +2173,30 @@ dbus_message_iter_get_string_array (DBusMessageIter *iter,
}
/**
+ * Returns the dict that the iterator may point to.
+ * Note that you need to check that the iterator points
+ * to a dict prior to using this function.
+ *
+ * @param iter the iterator
+ * @param dict return location for dict
+ * @returns #TRUE on success
+ */
+dbus_bool_t
+dbus_message_iter_get_dict (DBusMessageIter *iter,
+ DBusDict **dict)
+{
+ _dbus_assert (dbus_message_iter_get_arg_type (iter) == DBUS_TYPE_DICT);
+
+ *dict = _dbus_demarshal_dict (&iter->message->body, iter->message->byte_order,
+ iter->pos + 1, NULL);
+
+ if (!*dict)
+ return FALSE;
+ else
+ return TRUE;
+}
+
+/**
* Sets the message sender.
*
* @param message the message
@@ -2630,9 +2715,10 @@ _dbus_message_loader_return_buffer (DBusMessageLoader *loader,
*/
header_len = header_len_unsigned;
body_len = body_len_unsigned;
-
+
if (_DBUS_ALIGN_VALUE (header_len, 8) != header_len_unsigned)
{
+
_dbus_verbose ("header length %d is not aligned to 8 bytes\n",
header_len);
loader->corrupted = TRUE;
@@ -2654,8 +2740,8 @@ _dbus_message_loader_return_buffer (DBusMessageLoader *loader,
int next_arg;
#if 0
- _dbus_verbose_bytes_of_string (&loader->data, 0, header_len);
-#endif
+ _dbus_verbose_bytes_of_string (&loader->data, 0, header_len + body_len);
+#endif
if (!decode_header_data (&loader->data, header_len, byte_order,
fields, &header_padding))
{
@@ -2899,7 +2985,7 @@ check_message_handling (DBusMessage *message)
/* If we implement message_set_arg (message, n, value)
* then we would want to test it here
*/
-
+
iter = dbus_message_get_args_iter (message);
while ((type = dbus_message_iter_get_arg_type (iter)) != DBUS_TYPE_INVALID)
{
@@ -2967,7 +3053,18 @@ check_message_handling (DBusMessage *message)
dbus_free_string_array (values);
}
break;
-
+
+ case DBUS_TYPE_DICT:
+ {
+ DBusDict *dict;
+
+ if (!dbus_message_iter_get_dict (iter, &dict))
+ return FALSE;
+
+ dbus_dict_unref (dict);
+ }
+ break;
+
default:
break;
}
@@ -3025,6 +3122,7 @@ check_have_valid_message (DBusMessageLoader *loader)
failed:
if (message)
dbus_message_unref (message);
+
return retval;
}