diff options
Diffstat (limited to 'dbus')
-rw-r--r-- | dbus/dbus-connection.c | 7 | ||||
-rw-r--r-- | dbus/dbus-marshal.c | 11 | ||||
-rw-r--r-- | dbus/dbus-message-internal.h | 3 | ||||
-rw-r--r-- | dbus/dbus-message.c | 141 | ||||
-rw-r--r-- | dbus/dbus-message.h | 45 |
5 files changed, 158 insertions, 49 deletions
diff --git a/dbus/dbus-connection.c b/dbus/dbus-connection.c index e8ff5b6a..9fcabb9c 100644 --- a/dbus/dbus-connection.c +++ b/dbus/dbus-connection.c @@ -644,6 +644,9 @@ dbus_connection_send_message (DBusConnection *connection, _dbus_verbose ("Message %p added to outgoing queue, %d pending to send\n", message, connection->n_outgoing); + /* Unlock the message, resetting its header. */ + _dbus_message_unlock (message); + serial = _dbus_connection_get_next_client_serial (connection); _dbus_message_set_client_serial (message, serial); @@ -728,9 +731,6 @@ dbus_connection_send_message_with_reply (DBusConnection *connection, * time. I think there probably has to be a loop: "while (!timeout_elapsed) * { check_for_reply_in_queue(); iterate_with_remaining_timeout(); }" * - * @todo need to remove the reply from the message queue, or someone - * else might process it again later. - * * @param connection the connection * @param message the message to send * @param timeout_milliseconds timeout in milliseconds or -1 for default @@ -771,6 +771,7 @@ dbus_connection_send_message_with_reply_and_block (DBusConnection *connectio if (_dbus_message_get_reply_serial (reply) == client_serial) { + _dbus_list_remove (&connection->incoming_messages, link); dbus_message_ref (message); if (result) diff --git a/dbus/dbus-marshal.c b/dbus/dbus-marshal.c index 148ce08e..9b9e9e62 100644 --- a/dbus/dbus-marshal.c +++ b/dbus/dbus-marshal.c @@ -718,9 +718,9 @@ _dbus_demarshal_string_array (DBusString *str, { int len, i, j; char **retval; - + len = _dbus_demarshal_uint32 (str, byte_order, pos, &pos); - + retval = dbus_new (char *, len); if (!retval) @@ -734,6 +734,12 @@ _dbus_demarshal_string_array (DBusString *str, goto error; } + if (new_pos) + *new_pos = pos; + + if (array_len) + *array_len = len; + return retval; error: @@ -1033,7 +1039,6 @@ _dbus_marshal_test (void) /* Marshal signed integer arrays */ if (!_dbus_marshal_int32_array (&str, DBUS_BIG_ENDIAN, array1, 3)) _dbus_assert_not_reached ("could not marshal integer array"); - _dbus_verbose_bytes_of_string (&str, 0, _dbus_string_get_length (&str)); array2 = _dbus_demarshal_int32_array (&str, DBUS_BIG_ENDIAN, pos, &pos, &len); printf ("length is: %d\n", len); if (len != 3) diff --git a/dbus/dbus-message-internal.h b/dbus/dbus-message-internal.h index 9507a0a4..8059ecdc 100644 --- a/dbus/dbus-message-internal.h +++ b/dbus/dbus-message-internal.h @@ -35,10 +35,9 @@ void _dbus_message_get_network_data (DBusMessage *message, const DBusString **body); void _dbus_message_lock (DBusMessage *message); +void _dbus_message_unlock (DBusMessage *message); void _dbus_message_set_client_serial (DBusMessage *message, dbus_int32_t client_serial); -void _dbus_message_set_sender (DBusMessage *message, - const char *sender); dbus_int32_t _dbus_message_get_reply_serial (DBusMessage *message); void _dbus_message_add_size_counter (DBusMessage *message, DBusCounter *counter); diff --git a/dbus/dbus-message.c b/dbus/dbus-message.c index e491a7db..d5b1fb86 100644 --- a/dbus/dbus-message.c +++ b/dbus/dbus-message.c @@ -134,23 +134,7 @@ _dbus_message_set_client_serial (DBusMessage *message, dbus_int32_t _dbus_message_get_reply_serial (DBusMessage *message) { - return message->client_serial; -} - -/** - * Sets the message sender. This can only - * be done once on a message. - * - * @param message the message - * @param sender the sender - */ -void -_dbus_message_set_sender (DBusMessage *message, - const char *sender) -{ - _dbus_assert (message->sender == NULL); - - message->sender = _dbus_strdup (sender); + return message->reply_serial; } /** @@ -255,6 +239,25 @@ dbus_message_write_header (DBusMessage *message) } /** + * Unlocks a message so that it can be re-sent to another client. + * + * @see _dbus_message_lock + * @param message the message to unlock. + */ +void +_dbus_message_unlock (DBusMessage *message) +{ + if (!message->locked) + return; + + /* Restore header */ + _dbus_string_set_length (&message->header, 0); + + message->client_serial = -1; + message->locked = FALSE; +} + +/** * Locks a message. Allows checking that applications don't keep a * reference to a message in the outgoing queue and change it * underneath us. Messages are locked when they enter the outgoing @@ -522,6 +525,19 @@ dbus_message_append_fields_valist (DBusMessage *message, goto enomem; } break; + case DBUS_TYPE_STRING_ARRAY: + { + int len; + const char **data; + + data = va_arg (var_args, const char **); + len = va_arg (var_args, int); + + if (!dbus_message_append_string_array (message, data, len)) + goto enomem; + } + break; + default: _dbus_warn ("Unknown field type %d\n", type); } @@ -654,6 +670,31 @@ dbus_message_append_byte_array (DBusMessage *message, } /** + * Appends a string array to the message. + * + * @param message the message + * @param value the array + * @param len the length of the array + * @returns #TRUE on success + */ +dbus_bool_t +dbus_message_append_string_array (DBusMessage *message, + const char **value, + int len) +{ + _dbus_assert (!message->locked); + + if (!_dbus_string_append_byte (&message->body, DBUS_TYPE_STRING_ARRAY)) + { + _dbus_string_shorten (&message->body, 1); + return FALSE; + } + + return _dbus_marshal_string_array (&message->body, + DBUS_COMPILER_BYTE_ORDER, value, len); +} + +/** * Gets fields from a message given a variable argument list. * The variable argument list should contain the type of the * field followed by a pointer to where the value should be @@ -672,6 +713,8 @@ dbus_message_get_fields (DBusMessage *message, DBusResultCode retval; va_list var_args; + _dbus_verbose_bytes_of_string (&message->header, 0, + _dbus_string_get_length (&message->header)); va_start (var_args, first_field_type); retval = dbus_message_get_fields_valist (message, first_field_type, var_args); va_end (var_args); @@ -708,7 +751,7 @@ dbus_message_get_fields_valist (DBusMessage *message, iter = dbus_message_get_fields_iter (message); if (iter == NULL) - return FALSE; + return DBUS_RESULT_NO_MEMORY; spec_type = first_field_type; i = 0; @@ -775,10 +818,10 @@ dbus_message_get_fields_valist (DBusMessage *message, case DBUS_TYPE_BYTE_ARRAY: { - char **ptr; + unsigned char **ptr; int *len; - ptr = va_arg (var_args, char **); + ptr = va_arg (var_args, unsigned char **); len = va_arg (var_args, int *); *ptr = dbus_message_iter_get_byte_array (iter, len); @@ -788,6 +831,21 @@ dbus_message_get_fields_valist (DBusMessage *message, break; } + case DBUS_TYPE_STRING_ARRAY: + { + char ***ptr; + int *len; + + ptr = va_arg (var_args, char ***); + len = va_arg (var_args, int *); + + *ptr = dbus_message_iter_get_string_array (iter, len); + + if (!*ptr) + return DBUS_RESULT_NO_MEMORY; + + break; + } default: _dbus_warn ("Unknown field type %d\n", spec_type); } @@ -933,7 +991,7 @@ dbus_message_iter_get_field_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) + if (*data > DBUS_TYPE_INVALID && *data <= DBUS_TYPE_STRING_ARRAY) return *data; return DBUS_TYPE_INVALID; @@ -1027,6 +1085,43 @@ dbus_message_iter_get_byte_array (DBusMessageIter *iter, iter->pos + 1, NULL, len); } +/** + * Returns the string array that the iterator may point to. + * Note that you need to check that the iterator points + * to a byte array prior to using this function. + * + * @todo this function should probably take "char **" as + * an out param argument, and return boolean or result code. + * + * @param iter the iterator + * @param len return location for length of byte array + * @returns the byte array + */ +char ** +dbus_message_iter_get_string_array (DBusMessageIter *iter, + int *len) +{ + _dbus_assert (dbus_message_iter_get_field_type (iter) == DBUS_TYPE_STRING_ARRAY); + + return _dbus_demarshal_string_array (&iter->message->body, iter->message->byte_order, + iter->pos + 1, NULL, len); +} + +/** + * Sets the message sender. + * + * @param message the message + * @param sender the sender + */ +void +dbus_message_set_sender (DBusMessage *message, + const char *sender) +{ + _dbus_assert (!message->locked); + + message->sender = _dbus_strdup (sender); +} + /** @} */ /** @@ -1224,6 +1319,7 @@ decode_header_data (DBusString *data, /* First demarshal the client serial */ *client_serial = _dbus_demarshal_int32 (data, byte_order, 12, &pos); + *reply_serial = -1; *service = NULL; *name = NULL; *sender = NULL; @@ -1376,11 +1472,10 @@ _dbus_message_loader_return_buffer (DBusMessageLoader *loader, return; } - message = dbus_message_new (service, name); message->reply_serial = reply_serial; message->client_serial = client_serial; - _dbus_message_set_sender (message, sender); + dbus_message_set_sender (message, sender); dbus_free (service); dbus_free (name); diff --git a/dbus/dbus-message.h b/dbus/dbus-message.h index 7d5ea21b..f5ef9159 100644 --- a/dbus/dbus-message.h +++ b/dbus/dbus-message.h @@ -44,26 +44,33 @@ DBusMessage* dbus_message_new_reply (const char *name, void dbus_message_ref (DBusMessage *message); void dbus_message_unref (DBusMessage *message); -const char* dbus_message_get_name (DBusMessage *message); -const char* dbus_message_get_service (DBusMessage *message); +const char* dbus_message_get_name (DBusMessage *message); +const char* dbus_message_get_service (DBusMessage *message); +void dbus_message_set_sender (DBusMessage *message, + const char *sender); -dbus_bool_t dbus_message_append_fields (DBusMessage *message, - int first_field_type, + +dbus_bool_t dbus_message_append_fields (DBusMessage *message, + int first_field_type, ...); -dbus_bool_t dbus_message_append_fields_valist (DBusMessage *message, - int first_field_type, - va_list var_args); -dbus_bool_t dbus_message_append_int32 (DBusMessage *message, - dbus_int32_t value); -dbus_bool_t dbus_message_append_uint32 (DBusMessage *message, - dbus_uint32_t value); -dbus_bool_t dbus_message_append_double (DBusMessage *message, - double value); -dbus_bool_t dbus_message_append_string (DBusMessage *message, - const char *value); -dbus_bool_t dbus_message_append_byte_array (DBusMessage *message, - unsigned const char *value, - int len); +dbus_bool_t dbus_message_append_fields_valist (DBusMessage *message, + int first_field_type, + va_list var_args); +dbus_bool_t dbus_message_append_int32 (DBusMessage *message, + dbus_int32_t value); +dbus_bool_t dbus_message_append_uint32 (DBusMessage *message, + dbus_uint32_t value); +dbus_bool_t dbus_message_append_double (DBusMessage *message, + double value); +dbus_bool_t dbus_message_append_string (DBusMessage *message, + const char *value); +dbus_bool_t dbus_message_append_byte_array (DBusMessage *message, + unsigned const char *value, + int len); +dbus_bool_t dbus_message_append_string_array (DBusMessage *message, + const char **value, + int len); + DBusMessageIter *dbus_message_get_fields_iter (DBusMessage *message); @@ -86,6 +93,8 @@ double dbus_message_iter_get_double (DBusMessageIter *iter); char * dbus_message_iter_get_string (DBusMessageIter *iter); unsigned char * dbus_message_iter_get_byte_array (DBusMessageIter *iter, int *len); +char ** dbus_message_iter_get_string_array (DBusMessageIter *iter, + int *len) |