dbus-message.c revision 16e9289ca2c5143c3bcbfe89ebb77c40ca36ff92
1d012387afef0ba02185ebe27bc6bb15551912e92Havoc Pennington/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ 25a6adeee6e20252f8f2b01349b7e95ee6e99e4ffHavoc Pennington/* dbus-message.c DBusMessage object 35a6adeee6e20252f8f2b01349b7e95ee6e99e4ffHavoc Pennington * 49c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Copyright (C) 2002, 2003, 2004, 2005 Red Hat Inc. 51b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson * Copyright (C) 2002, 2003 CodeFactory AB 65a6adeee6e20252f8f2b01349b7e95ee6e99e4ffHavoc Pennington * 743605a6f4e78a8c28afb4b1e924dff0301e0e95cHavoc Pennington * Licensed under the Academic Free License version 2.1 89c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 95a6adeee6e20252f8f2b01349b7e95ee6e99e4ffHavoc Pennington * This program is free software; you can redistribute it and/or modify 105a6adeee6e20252f8f2b01349b7e95ee6e99e4ffHavoc Pennington * it under the terms of the GNU General Public License as published by 115a6adeee6e20252f8f2b01349b7e95ee6e99e4ffHavoc Pennington * the Free Software Foundation; either version 2 of the License, or 125a6adeee6e20252f8f2b01349b7e95ee6e99e4ffHavoc Pennington * (at your option) any later version. 135a6adeee6e20252f8f2b01349b7e95ee6e99e4ffHavoc Pennington * 145a6adeee6e20252f8f2b01349b7e95ee6e99e4ffHavoc Pennington * This program is distributed in the hope that it will be useful, 155a6adeee6e20252f8f2b01349b7e95ee6e99e4ffHavoc Pennington * but WITHOUT ANY WARRANTY; without even the implied warranty of 165a6adeee6e20252f8f2b01349b7e95ee6e99e4ffHavoc Pennington * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 175a6adeee6e20252f8f2b01349b7e95ee6e99e4ffHavoc Pennington * GNU General Public License for more details. 189c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 195a6adeee6e20252f8f2b01349b7e95ee6e99e4ffHavoc Pennington * You should have received a copy of the GNU General Public License 205a6adeee6e20252f8f2b01349b7e95ee6e99e4ffHavoc Pennington * along with this program; if not, write to the Free Software 215a6adeee6e20252f8f2b01349b7e95ee6e99e4ffHavoc Pennington * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 225a6adeee6e20252f8f2b01349b7e95ee6e99e4ffHavoc Pennington * 235a6adeee6e20252f8f2b01349b7e95ee6e99e4ffHavoc Pennington */ 245a6adeee6e20252f8f2b01349b7e95ee6e99e4ffHavoc Pennington 25041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington#include "dbus-internals.h" 269c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington#include "dbus-marshal-recursive.h" 279c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington#include "dbus-marshal-validate.h" 28fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington#include "dbus-marshal-byteswap.h" 299c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington#include "dbus-marshal-header.h" 3054a2e9f7961b4b8afff94bb0c5b756f986965be6Colin Walters#include "dbus-signature.h" 317bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington#include "dbus-message-private.h" 329c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington#include "dbus-object-tree.h" 33041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington#include "dbus-memory.h" 34041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington#include "dbus-list.h" 357ce7502e1ae23766ba40105327de787c2d1cef9dHavoc Pennington#include "dbus-threads-internal.h" 36041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington#include <string.h> 375a6adeee6e20252f8f2b01349b7e95ee6e99e4ffHavoc Pennington 38ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Penningtonstatic void dbus_message_finalize (DBusMessage *message); 39ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington 4093f222c1d8ed748994f74662671d003495b16d43Havoc Pennington/** 4155de3878c42f8254bac653b7c1998e79a1658ae2Havoc Pennington * @defgroup DBusMessageInternals DBusMessage implementation details 4255de3878c42f8254bac653b7c1998e79a1658ae2Havoc Pennington * @ingroup DBusInternals 4355de3878c42f8254bac653b7c1998e79a1658ae2Havoc Pennington * @brief DBusMessage private implementation details. 4493f222c1d8ed748994f74662671d003495b16d43Havoc Pennington * 4555de3878c42f8254bac653b7c1998e79a1658ae2Havoc Pennington * The guts of DBusMessage and its methods. 4693f222c1d8ed748994f74662671d003495b16d43Havoc Pennington * 4793f222c1d8ed748994f74662671d003495b16d43Havoc Pennington * @{ 4893f222c1d8ed748994f74662671d003495b16d43Havoc Pennington */ 4993f222c1d8ed748994f74662671d003495b16d43Havoc Pennington 509c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington/* Not thread locked, but strictly const/read-only so should be OK 5185ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington */ 5231988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington/** An static string representing an empty signature */ 539c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington_DBUS_STRING_DEFINE_STATIC(_dbus_empty_signature_str, ""); 54daf8d6579e1ae0ea748810b63180bd5eea2ab9c4Mark McLoughlin 559c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington/* these have wacky values to help trap uninitialized iterators; 569c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * but has to fit in 3 bits 579c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington */ 58c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larssonenum { 599c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_MESSAGE_ITER_TYPE_READER = 3, 609c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_MESSAGE_ITER_TYPE_WRITER = 7 61c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson}; 62c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson 633df260c07102745c5606c313af862558f105f83eHavoc Pennington/** typedef for internals of message iterator */ 64c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larssontypedef struct DBusMessageRealIter DBusMessageRealIter; 65c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson 66993be1059afcb0e9a5b67f5287fb1122d6c48ce6Havoc Pennington/** 67993be1059afcb0e9a5b67f5287fb1122d6c48ce6Havoc Pennington * @brief Internals of DBusMessageIter 689c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 69993be1059afcb0e9a5b67f5287fb1122d6c48ce6Havoc Pennington * Object representing a position in a message. All fields are internal. 70993be1059afcb0e9a5b67f5287fb1122d6c48ce6Havoc Pennington */ 71c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larssonstruct DBusMessageRealIter 721b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson{ 731b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson DBusMessage *message; /**< Message used */ 749c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_uint32_t changed_stamp : CHANGED_STAMP_BITS; /**< stamp to detect invalid iters */ 759c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_uint32_t iter_type : 3; /**< whether this is a reader or writer iter */ 769c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_uint32_t sig_refcount : 8; /**< depth of open_signature() */ 779c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington union 789c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington { 7931988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington DBusTypeWriter writer; /**< writer */ 8031988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington DBusTypeReader reader; /**< reader */ 8131988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington } u; /**< the type writer or reader that does all the work */ 821b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson}; 831b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson 84fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Penningtonstatic void 85fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Penningtonget_const_signature (DBusHeader *header, 86fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington const DBusString **type_str_p, 87fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington int *type_pos_p) 88fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington{ 89fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington if (_dbus_header_get_field_raw (header, 90fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington DBUS_HEADER_FIELD_SIGNATURE, 91fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington type_str_p, 92fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington type_pos_p)) 93fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington { 94fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington *type_pos_p += 1; /* skip the signature length which is 1 byte */ 95fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington } 96fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington else 97fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington { 98fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington *type_str_p = &_dbus_empty_signature_str; 99fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington *type_pos_p = 0; 100fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington } 101fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington} 102fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington 103fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington/** 104fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington * Swaps the message to compiler byte order if required 105fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington * 106fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington * @param message the message 107fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington */ 108fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Penningtonstatic void 109fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington_dbus_message_byteswap (DBusMessage *message) 110fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington{ 111fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington const DBusString *type_str; 112fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington int type_pos; 113fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington 114fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington if (message->byte_order == DBUS_COMPILER_BYTE_ORDER) 115fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington return; 116fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington 117fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington _dbus_verbose ("Swapping message into compiler byte order\n"); 118fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington 119fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington get_const_signature (&message->header, &type_str, &type_pos); 120fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington 121fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington _dbus_marshal_byteswap (type_str, type_pos, 122fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington message->byte_order, 123fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington DBUS_COMPILER_BYTE_ORDER, 124fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington &message->body, 0); 125fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington 126fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington message->byte_order = DBUS_COMPILER_BYTE_ORDER; 127fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington 128fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington _dbus_header_byteswap (&message->header, DBUS_COMPILER_BYTE_ORDER); 129fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington} 130fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington 13115ef0ef6fbba7827453b7973e62b6c1853576601Havoc Pennington/** byte-swap the message if it doesn't match our byte order. 13215ef0ef6fbba7827453b7973e62b6c1853576601Havoc Pennington * Called only when we need the message in our own byte order, 13315ef0ef6fbba7827453b7973e62b6c1853576601Havoc Pennington * normally when reading arrays of integers or doubles. 13415ef0ef6fbba7827453b7973e62b6c1853576601Havoc Pennington * Otherwise should not be called since it would do needless 13515ef0ef6fbba7827453b7973e62b6c1853576601Havoc Pennington * work. 13615ef0ef6fbba7827453b7973e62b6c1853576601Havoc Pennington */ 137fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington#define ensure_byte_order(message) \ 138fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington if (message->byte_order != DBUS_COMPILER_BYTE_ORDER) \ 139fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington _dbus_message_byteswap (message) 140fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington 141041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/** 142041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * Gets the data to be sent over the network for this message. 143041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * The header and then the body should be written out. 144041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * This function is guaranteed to always return the same 145041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * data once a message is locked (with _dbus_message_lock()). 146041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * 147041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @param message the message. 148041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @param header return location for message header data. 149041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @param body return location for message body data. 150041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */ 151041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Penningtonvoid 152041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington_dbus_message_get_network_data (DBusMessage *message, 153271fa7fc335f332bb2be3beeef735334546c4957Havoc Pennington const DBusString **header, 154271fa7fc335f332bb2be3beeef735334546c4957Havoc Pennington const DBusString **body) 155041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington{ 156041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington _dbus_assert (message->locked); 1579c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 1589c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington *header = &message->header.data; 159271fa7fc335f332bb2be3beeef735334546c4957Havoc Pennington *body = &message->body; 160041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington} 161041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington 1629c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington/** 1639c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Sets the serial number of a message. 1649c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * This can only be done once on a message. 1659c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 1669c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param message the message 1679c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param serial the serial 1689c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington */ 1699c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonvoid 1709c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington_dbus_message_set_serial (DBusMessage *message, 1719c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_uint32_t serial) 172fbae5baa06819fed71f62ddbba64a64675c2d333Havoc Pennington{ 173aad6fa897f85486386b030847151cb09943c97c0Havoc Pennington _dbus_assert (message != NULL); 174aad6fa897f85486386b030847151cb09943c97c0Havoc Pennington _dbus_assert (!message->locked); 175aad6fa897f85486386b030847151cb09943c97c0Havoc Pennington _dbus_assert (dbus_message_get_serial (message) == 0); 176fbae5baa06819fed71f62ddbba64a64675c2d333Havoc Pennington 1779c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_header_set_serial (&message->header, serial); 178fbae5baa06819fed71f62ddbba64a64675c2d333Havoc Pennington} 179fbae5baa06819fed71f62ddbba64a64675c2d333Havoc Pennington 1809c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington/** 1819c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Adds a counter to be incremented immediately with the 1829c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * size of this message, and decremented by the size 1839c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * of this message when this message if finalized. 1849c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * The link contains a counter with its refcount already 1859c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * incremented, but the counter itself not incremented. 1869c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Ownership of link and counter refcount is passed to 1879c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * the message. 1889c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 1899c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param message the message 1909c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param link link with counter as data 1919c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington */ 1929c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonvoid 1939c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington_dbus_message_add_size_counter_link (DBusMessage *message, 1949c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusList *link) 1957ba714ad7fe8256edfaad7d9a0f09aeb9611ca44Havoc Pennington{ 1969c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington /* right now we don't recompute the delta when message 1979c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * size changes, and that's OK for current purposes 1989c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * I think, but could be important to change later. 1999c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Do recompute it whenever there are no outstanding counters, 2009c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * since it's basically free. 2019c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington */ 2029c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (message->size_counters == NULL) 2039c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington { 2049c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington message->size_counter_delta = 2059c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_string_get_length (&message->header.data) + 2069c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_string_get_length (&message->body); 2077ba714ad7fe8256edfaad7d9a0f09aeb9611ca44Havoc Pennington 2089c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington#if 0 2099c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_verbose ("message has size %ld\n", 2109c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington message->size_counter_delta); 2119c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington#endif 2129c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington } 2137ba714ad7fe8256edfaad7d9a0f09aeb9611ca44Havoc Pennington 2149c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_list_append_link (&message->size_counters, link); 2157ba714ad7fe8256edfaad7d9a0f09aeb9611ca44Havoc Pennington 2169c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_counter_adjust (link->data, message->size_counter_delta); 217dac0a1f8933889fd94fed7fecdcc4ec6fb3a3fb0Havoc Pennington} 218dac0a1f8933889fd94fed7fecdcc4ec6fb3a3fb0Havoc Pennington 2199c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington/** 2209c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Adds a counter to be incremented immediately with the 2219c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * size of this message, and decremented by the size 2229c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * of this message when this message if finalized. 2239c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 2249c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param message the message 2259c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param counter the counter 2269c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns #FALSE if no memory 2279c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington */ 2289c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_bool_t 2299c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington_dbus_message_add_size_counter (DBusMessage *message, 2309c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusCounter *counter) 231dac0a1f8933889fd94fed7fecdcc4ec6fb3a3fb0Havoc Pennington{ 2329c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusList *link; 2339c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 2349c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington link = _dbus_list_alloc_link (counter); 2359c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (link == NULL) 2369c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return FALSE; 2379c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 2389c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_counter_ref (counter); 2399c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_message_add_size_counter_link (message, link); 2409c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 2419c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return TRUE; 242dac0a1f8933889fd94fed7fecdcc4ec6fb3a3fb0Havoc Pennington} 243dac0a1f8933889fd94fed7fecdcc4ec6fb3a3fb0Havoc Pennington 2449c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington/** 2459c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Removes a counter tracking the size of this message, and decrements 2469c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * the counter by the size of this message. 2479c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 2489c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param message the message 2499c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param link_return return the link used 2509c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param counter the counter 2519c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington */ 2529c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonvoid 2539c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington_dbus_message_remove_size_counter (DBusMessage *message, 2549c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusCounter *counter, 2559c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusList **link_return) 25650c25505f62786756519ef1e194883360eda82e0Havoc Pennington{ 2579c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusList *link; 2587265423411609c14ddb9e6643463b840afcaa09bHavoc Pennington 2599c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington link = _dbus_list_find_last (&message->size_counters, 2609c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington counter); 2619c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_assert (link != NULL); 2627265423411609c14ddb9e6643463b840afcaa09bHavoc Pennington 2639c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_list_unlink (&message->size_counters, 2649c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington link); 2659c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (link_return) 2669c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington *link_return = link; 2679c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington else 2689c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_list_free_link (link); 26950c25505f62786756519ef1e194883360eda82e0Havoc Pennington 2709c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_counter_adjust (counter, - message->size_counter_delta); 27150c25505f62786756519ef1e194883360eda82e0Havoc Pennington 2729c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_counter_unref (counter); 27350c25505f62786756519ef1e194883360eda82e0Havoc Pennington} 27450c25505f62786756519ef1e194883360eda82e0Havoc Pennington 2759c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington/** 2769c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Locks a message. Allows checking that applications don't keep a 2779c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * reference to a message in the outgoing queue and change it 2789c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * underneath us. Messages are locked when they enter the outgoing 2799c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * queue (dbus_connection_send_message()), and the library complains 2809c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * if the message is modified while locked. 2819c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 2829c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param message the message to lock. 2839c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington */ 2849c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonvoid 2859c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington_dbus_message_lock (DBusMessage *message) 2865fd1e389e1c1c12ad4a55c2af6abdc8e7a2f6d41Havoc Pennington{ 2879c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!message->locked) 2889c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington { 2899c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_header_update_lengths (&message->header, 2909c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_string_get_length (&message->body)); 2915fd1e389e1c1c12ad4a55c2af6abdc8e7a2f6d41Havoc Pennington 2929c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington /* must have a signature if you have a body */ 2939c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_assert (_dbus_string_get_length (&message->body) == 0 || 2949c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_message_get_signature (message) != NULL); 2955fd1e389e1c1c12ad4a55c2af6abdc8e7a2f6d41Havoc Pennington 2969c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington message->locked = TRUE; 2975fd1e389e1c1c12ad4a55c2af6abdc8e7a2f6d41Havoc Pennington } 2985fd1e389e1c1c12ad4a55c2af6abdc8e7a2f6d41Havoc Pennington} 2995fd1e389e1c1c12ad4a55c2af6abdc8e7a2f6d41Havoc Pennington 30050c25505f62786756519ef1e194883360eda82e0Havoc Penningtonstatic dbus_bool_t 3019c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonset_or_delete_string_field (DBusMessage *message, 3029c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington int field, 3039c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington int typecode, 3049c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *value) 30550c25505f62786756519ef1e194883360eda82e0Havoc Pennington{ 3069c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (value == NULL) 3079c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return _dbus_header_delete_field (&message->header, field); 3089c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington else 3099c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return _dbus_header_set_field_basic (&message->header, 3109c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington field, 3119c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington typecode, 3129c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington &value); 3139c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington} 3147ba714ad7fe8256edfaad7d9a0f09aeb9611ca44Havoc Pennington 3159c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington#if 0 3169c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington/* Probably we don't need to use this */ 3179c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington/** 3189c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Sets the signature of the message, i.e. the arguments in the 3199c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * message payload. The signature includes only "in" arguments for 3209c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * #DBUS_MESSAGE_TYPE_METHOD_CALL and only "out" arguments for 3219c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * #DBUS_MESSAGE_TYPE_METHOD_RETURN, so is slightly different from 3229c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * what you might expect (it does not include the signature of the 3239c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * entire C++-style method). 3249c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 3259c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * The signature is a string made up of type codes such as 3269c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * #DBUS_TYPE_INT32. The string is terminated with nul (nul is also 3279c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * the value of #DBUS_TYPE_INVALID). The macros such as 3289c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * #DBUS_TYPE_INT32 evaluate to integers; to assemble a signature you 3299c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * may find it useful to use the string forms, such as 3309c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * #DBUS_TYPE_INT32_AS_STRING. 3319c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 3329c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * An "unset" or #NULL signature is considered the same as an empty 3339c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * signature. In fact dbus_message_get_signature() will never return 3349c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * #NULL. 3359c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 3369c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param message the message 3379c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param signature the type signature or #NULL to unset 3389c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns #FALSE if no memory 3399c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington */ 340dac0a1f8933889fd94fed7fecdcc4ec6fb3a3fb0Havoc Penningtonstatic dbus_bool_t 3419c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington_dbus_message_set_signature (DBusMessage *message, 3429c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *signature) 343dac0a1f8933889fd94fed7fecdcc4ec6fb3a3fb0Havoc Pennington{ 3449c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (message != NULL, FALSE); 3459c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (!message->locked, FALSE); 3469c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (signature == NULL || 3479c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_check_is_valid_signature (signature)); 3489c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington /* can't delete the signature if you have a message body */ 3499c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (_dbus_string_get_length (&message->body) == 0 || 3509c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington signature != NULL); 351dac0a1f8933889fd94fed7fecdcc4ec6fb3a3fb0Havoc Pennington 3529c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return set_or_delete_string_field (message, 3539c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_HEADER_FIELD_SIGNATURE, 3549c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_TYPE_SIGNATURE, 3559c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington signature); 3569c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington} 3579c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington#endif 358dac0a1f8933889fd94fed7fecdcc4ec6fb3a3fb0Havoc Pennington 3599c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington/* Message Cache 3609c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 3619c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * We cache some DBusMessage to reduce the overhead of allocating 3629c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * them. In my profiling this consistently made about an 8% 3639c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * difference. It avoids the malloc for the message, the malloc for 3649c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * the slot list, the malloc for the header string and body string, 3659c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * and the associated free() calls. It does introduce another global 3669c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * lock which could be a performance issue in certain cases. 3679c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 3689c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * For the echo client/server the round trip time goes from around 3699c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * .000077 to .000069 with the message cache on my laptop. The sysprof 3709c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * change is as follows (numbers are cumulative percentage): 3719c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 3729c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * with message cache implemented as array as it is now (0.000069 per): 3739c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * new_empty_header 1.46 3749c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * mutex_lock 0.56 # i.e. _DBUS_LOCK(message_cache) 3759c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * mutex_unlock 0.25 3769c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * self 0.41 3779c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * unref 2.24 3789c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * self 0.68 3799c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * list_clear 0.43 3809c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * mutex_lock 0.33 # i.e. _DBUS_LOCK(message_cache) 3819c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * mutex_unlock 0.25 3829c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 3839c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * with message cache implemented as list (0.000070 per roundtrip): 3849c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * new_empty_header 2.72 3859c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * list_pop_first 1.88 3869c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * unref 3.3 3879c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * list_prepend 1.63 3889c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 3899c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * without cache (0.000077 per roundtrip): 3909c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * new_empty_header 6.7 3919c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * string_init_preallocated 3.43 3929c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * dbus_malloc 2.43 3939c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * dbus_malloc0 2.59 3949c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 3959c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * unref 4.02 3969c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * string_free 1.82 3979c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * dbus_free 1.63 3989c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * dbus_free 0.71 3999c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 4009c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * If you implement the message_cache with a list, the primary reason 4019c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * it's slower is that you add another thread lock (on the DBusList 4029c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * mempool). 4039c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington */ 4049c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 40531988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington/** Avoid caching huge messages */ 406c9c16dd08766d3ad25a362ae335e64f1ca907373Ross Burton#define MAX_MESSAGE_SIZE_TO_CACHE 10 * _DBUS_ONE_KILOBYTE 40731988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington 40831988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington/** Avoid caching too many messages */ 4099c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington#define MAX_MESSAGE_CACHE_SIZE 5 4109c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 4119c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington_DBUS_DEFINE_GLOBAL_LOCK (message_cache); 4129c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonstatic DBusMessage *message_cache[MAX_MESSAGE_CACHE_SIZE]; 4139c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonstatic int message_cache_count = 0; 4149c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonstatic dbus_bool_t message_cache_shutdown_registered = FALSE; 4159c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 416e11ae7246655e59f8e04d1ffcb3788176a6d98b8Havoc Penningtonstatic void 4179c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_cache_shutdown (void *data) 418e11ae7246655e59f8e04d1ffcb3788176a6d98b8Havoc Pennington{ 419e11ae7246655e59f8e04d1ffcb3788176a6d98b8Havoc Pennington int i; 4209c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 4219c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _DBUS_LOCK (message_cache); 4229c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 423e11ae7246655e59f8e04d1ffcb3788176a6d98b8Havoc Pennington i = 0; 4249c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington while (i < MAX_MESSAGE_CACHE_SIZE) 42546c072e1136ca101aefd5fdae35c457899d55bbbMark McLoughlin { 4269c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (message_cache[i]) 4279c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_message_finalize (message_cache[i]); 4289c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 429e11ae7246655e59f8e04d1ffcb3788176a6d98b8Havoc Pennington ++i; 43046c072e1136ca101aefd5fdae35c457899d55bbbMark McLoughlin } 4319c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 4329c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington message_cache_count = 0; 4339c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington message_cache_shutdown_registered = FALSE; 4349c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 4359c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _DBUS_UNLOCK (message_cache); 4368ca39d9925df6cce64688a2315a2a424beb7bd55Havoc Pennington} 4378ca39d9925df6cce64688a2315a2a424beb7bd55Havoc Pennington 4389c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington/** 4399c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Tries to get a message from the message cache. The retrieved 4409c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * message will have junk in it, so it still needs to be cleared out 4419c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * in dbus_message_new_empty_header() 4429c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 4439c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns the message, or #NULL if none cached 444e11ae7246655e59f8e04d1ffcb3788176a6d98b8Havoc Pennington */ 4459c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonstatic DBusMessage* 4469c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_get_cached (void) 4478ca39d9925df6cce64688a2315a2a424beb7bd55Havoc Pennington{ 4489c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusMessage *message; 4499c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington int i; 4509c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 4519c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington message = NULL; 4529c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 4539c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _DBUS_LOCK (message_cache); 4549c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 4559c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_assert (message_cache_count >= 0); 4568ca39d9925df6cce64688a2315a2a424beb7bd55Havoc Pennington 4579c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (message_cache_count == 0) 45846c072e1136ca101aefd5fdae35c457899d55bbbMark McLoughlin { 4599c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _DBUS_UNLOCK (message_cache); 4609c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return NULL; 46146c072e1136ca101aefd5fdae35c457899d55bbbMark McLoughlin } 4629c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 4639c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington /* This is not necessarily true unless count > 0, and 4649c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * message_cache is uninitialized until the shutdown is 4659c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * registered 466e11ae7246655e59f8e04d1ffcb3788176a6d98b8Havoc Pennington */ 4679c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_assert (message_cache_shutdown_registered); 46846c072e1136ca101aefd5fdae35c457899d55bbbMark McLoughlin 4699c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington i = 0; 4709c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington while (i < MAX_MESSAGE_CACHE_SIZE) 471e11ae7246655e59f8e04d1ffcb3788176a6d98b8Havoc Pennington { 4729c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (message_cache[i]) 473e11ae7246655e59f8e04d1ffcb3788176a6d98b8Havoc Pennington { 4749c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington message = message_cache[i]; 4759c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington message_cache[i] = NULL; 4769c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington message_cache_count -= 1; 4779c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington break; 478e11ae7246655e59f8e04d1ffcb3788176a6d98b8Havoc Pennington } 4799c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington ++i; 480e11ae7246655e59f8e04d1ffcb3788176a6d98b8Havoc Pennington } 4819c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_assert (message_cache_count >= 0); 4829c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_assert (i < MAX_MESSAGE_CACHE_SIZE); 4839c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_assert (message != NULL); 48446c072e1136ca101aefd5fdae35c457899d55bbbMark McLoughlin 4859c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_assert (message->refcount.value == 0); 4869c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_assert (message->size_counters == NULL); 4878d939deebdce20d5609446c8839de8b3a20e5247Havoc Pennington 4888d939deebdce20d5609446c8839de8b3a20e5247Havoc Pennington _DBUS_UNLOCK (message_cache); 4899c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 4909c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return message; 491e11ae7246655e59f8e04d1ffcb3788176a6d98b8Havoc Pennington} 49246c072e1136ca101aefd5fdae35c457899d55bbbMark McLoughlin 493ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Penningtonstatic void 494ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Penningtonfree_size_counter (void *element, 495ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington void *data) 496ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington{ 497ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington DBusCounter *counter = element; 498ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington DBusMessage *message = data; 499ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington 500ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington _dbus_counter_adjust (counter, - message->size_counter_delta); 501ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington 502ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington _dbus_counter_unref (counter); 503ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington} 504ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington 5059c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington/** 5069c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Tries to cache a message, otherwise finalize it. 5079c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 5089c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param message the message 5099c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington */ 5109c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonstatic void 5119c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_cache_or_finalize (DBusMessage *message) 512e11ae7246655e59f8e04d1ffcb3788176a6d98b8Havoc Pennington{ 5139c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_bool_t was_cached; 5149c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington int i; 5159d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington 5169c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_assert (message->refcount.value == 0); 517e11ae7246655e59f8e04d1ffcb3788176a6d98b8Havoc Pennington 5189c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington /* This calls application code and has to be done first thing 5199c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * without holding the lock 5209c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington */ 5219c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_data_slot_list_clear (&message->slot_list); 522e11ae7246655e59f8e04d1ffcb3788176a6d98b8Havoc Pennington 5239c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_list_foreach (&message->size_counters, 5249c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington free_size_counter, message); 5259c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_list_clear (&message->size_counters); 5269c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 5279c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington was_cached = FALSE; 5289c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 5299c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _DBUS_LOCK (message_cache); 5309c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 5319c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!message_cache_shutdown_registered) 532e11ae7246655e59f8e04d1ffcb3788176a6d98b8Havoc Pennington { 5339c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_assert (message_cache_count == 0); 5349c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 5359c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!_dbus_register_shutdown_func (dbus_message_cache_shutdown, NULL)) 5369c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington goto out; 5379c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 5389c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington i = 0; 5399c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington while (i < MAX_MESSAGE_CACHE_SIZE) 5409c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington { 5419c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington message_cache[i] = NULL; 5429c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington ++i; 5439c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington } 5449c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 5459c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington message_cache_shutdown_registered = TRUE; 546e11ae7246655e59f8e04d1ffcb3788176a6d98b8Havoc Pennington } 547e11ae7246655e59f8e04d1ffcb3788176a6d98b8Havoc Pennington 5489c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_assert (message_cache_count >= 0); 5499c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 5509c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if ((_dbus_string_get_length (&message->header.data) + 5519c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_string_get_length (&message->body)) > 5529c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington MAX_MESSAGE_SIZE_TO_CACHE) 5539c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington goto out; 5549c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 5559c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (message_cache_count >= MAX_MESSAGE_CACHE_SIZE) 5569c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington goto out; 5579c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 5589c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington /* Find empty slot */ 5599c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington i = 0; 5609c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington while (message_cache[i] != NULL) 5619c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington ++i; 5629c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 5639c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_assert (i < MAX_MESSAGE_CACHE_SIZE); 5649c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 5659c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_assert (message_cache[i] == NULL); 5669c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington message_cache[i] = message; 5679c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington message_cache_count += 1; 5689c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington was_cached = TRUE; 56998ad8a8ec6626f7f5c78915b6bdf2be688b4839fHavoc Pennington#ifndef DBUS_DISABLE_CHECKS 57098ad8a8ec6626f7f5c78915b6bdf2be688b4839fHavoc Pennington message->in_cache = TRUE; 57198ad8a8ec6626f7f5c78915b6bdf2be688b4839fHavoc Pennington#endif 5729c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 5739c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington out: 57498ad8a8ec6626f7f5c78915b6bdf2be688b4839fHavoc Pennington _dbus_assert (message->refcount.value == 0); 57598ad8a8ec6626f7f5c78915b6bdf2be688b4839fHavoc Pennington 5768d939deebdce20d5609446c8839de8b3a20e5247Havoc Pennington _DBUS_UNLOCK (message_cache); 5778d939deebdce20d5609446c8839de8b3a20e5247Havoc Pennington 5789c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!was_cached) 5799c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_message_finalize (message); 5808ca39d9925df6cce64688a2315a2a424beb7bd55Havoc Pennington} 5818ca39d9925df6cce64688a2315a2a424beb7bd55Havoc Pennington 582174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington#ifndef DBUS_DISABLE_CHECKS 583174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Penningtonstatic dbus_bool_t 584174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington_dbus_message_iter_check (DBusMessageRealIter *iter) 585174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington{ 586174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington if (iter == NULL) 587174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington { 588174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington _dbus_warn_check_failed ("dbus message iterator is NULL\n"); 589174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington return FALSE; 590174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington } 591174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington 592174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington if (iter->iter_type == DBUS_MESSAGE_ITER_TYPE_READER) 593174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington { 594174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington if (iter->u.reader.byte_order != iter->message->byte_order) 595174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington { 596174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington _dbus_warn_check_failed ("dbus message changed byte order since iterator was created\n"); 597174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington return FALSE; 598174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington } 599174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington /* because we swap the message into compiler order when you init an iter */ 600174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington _dbus_assert (iter->u.reader.byte_order == DBUS_COMPILER_BYTE_ORDER); 601174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington } 602174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington else if (iter->iter_type == DBUS_MESSAGE_ITER_TYPE_WRITER) 603174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington { 604174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington if (iter->u.writer.byte_order != iter->message->byte_order) 605174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington { 606174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington _dbus_warn_check_failed ("dbus message changed byte order since append iterator was created\n"); 607174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington return FALSE; 608174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington } 609174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington /* because we swap the message into compiler order when you init an iter */ 610174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington _dbus_assert (iter->u.writer.byte_order == DBUS_COMPILER_BYTE_ORDER); 611174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington } 612174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington else 613174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington { 614174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington _dbus_warn_check_failed ("dbus message iterator looks uninitialized or corrupted\n"); 615174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington return FALSE; 616174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington } 617174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington 618174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington if (iter->changed_stamp != iter->message->changed_stamp) 619174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington { 620174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington _dbus_warn_check_failed ("dbus message iterator invalid because the message has been modified (or perhaps the iterator is just uninitialized)\n"); 621174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington return FALSE; 622174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington } 623174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington 624174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington return TRUE; 625174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington} 626174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington#endif /* DBUS_DISABLE_CHECKS */ 627174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington 628afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington/** 629afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * Implementation of the varargs arg-getting functions. 630afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * dbus_message_get_args() is the place to go for complete 631afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * documentation. 632afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 633afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * @see dbus_message_get_args 634afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * @param iter the message iter 635afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * @param error error to be filled in 636afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * @param first_arg_type type of the first argument 637afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * @param var_args return location for first argument, followed by list of type/location pairs 638afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * @returns #FALSE if error was set 639afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington */ 640afa4ffbd852686633086569cd34942917c5c49afHavoc Penningtondbus_bool_t 641afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington_dbus_message_iter_get_args_valist (DBusMessageIter *iter, 642afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington DBusError *error, 643afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington int first_arg_type, 644afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington va_list var_args) 645afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington{ 646afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington DBusMessageRealIter *real = (DBusMessageRealIter *)iter; 647afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington int spec_type, msg_type, i; 648afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington dbus_bool_t retval; 649afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington 650afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington _dbus_assert (_dbus_message_iter_check (real)); 651afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington 652afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington retval = FALSE; 653afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington 654afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington spec_type = first_arg_type; 655afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington i = 0; 656afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington 657afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington while (spec_type != DBUS_TYPE_INVALID) 658afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington { 659afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington msg_type = dbus_message_iter_get_arg_type (iter); 660afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington 661afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington if (msg_type != spec_type) 662afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington { 663afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington dbus_set_error (error, DBUS_ERROR_INVALID_ARGS, 664afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington "Argument %d is specified to be of type \"%s\", but " 665afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington "is actually of type \"%s\"\n", i, 666afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington _dbus_type_to_string (spec_type), 667afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington _dbus_type_to_string (msg_type)); 668afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington 669afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington goto out; 670afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington } 671afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington 672afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington if (dbus_type_is_basic (spec_type)) 673afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington { 674afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington DBusBasicValue *ptr; 675afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington 676afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington ptr = va_arg (var_args, DBusBasicValue*); 677afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington 678afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington _dbus_assert (ptr != NULL); 679afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington 680afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington _dbus_type_reader_read_basic (&real->u.reader, 681afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington ptr); 682afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington } 683afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington else if (spec_type == DBUS_TYPE_ARRAY) 684afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington { 685afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington int element_type; 686afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington int spec_element_type; 687afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington const DBusBasicValue **ptr; 688afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington int *n_elements_p; 689afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington DBusTypeReader array; 690afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington 691afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington spec_element_type = va_arg (var_args, int); 692afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington element_type = _dbus_type_reader_get_element_type (&real->u.reader); 693afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington 694afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington if (spec_element_type != element_type) 695afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington { 696afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington dbus_set_error (error, DBUS_ERROR_INVALID_ARGS, 697afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington "Argument %d is specified to be an array of \"%s\", but " 698afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington "is actually an array of \"%s\"\n", 699afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington i, 700afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington _dbus_type_to_string (spec_element_type), 701afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington _dbus_type_to_string (element_type)); 702afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington 703afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington goto out; 704afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington } 705afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington 706afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington if (dbus_type_is_fixed (spec_element_type)) 707afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington { 708afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington ptr = va_arg (var_args, const DBusBasicValue**); 709afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington n_elements_p = va_arg (var_args, int*); 710afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington 711afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington _dbus_assert (ptr != NULL); 712afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington _dbus_assert (n_elements_p != NULL); 713afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington 714afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington _dbus_type_reader_recurse (&real->u.reader, &array); 715afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington 716afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington _dbus_type_reader_read_fixed_multi (&array, 717afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington ptr, n_elements_p); 718afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington } 719afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington else if (spec_element_type == DBUS_TYPE_STRING || 720afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington spec_element_type == DBUS_TYPE_SIGNATURE || 721afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington spec_element_type == DBUS_TYPE_OBJECT_PATH) 722afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington { 723afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington char ***str_array_p; 724afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington int n_elements; 725afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington char **str_array; 726afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington 727afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington str_array_p = va_arg (var_args, char***); 728afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington n_elements_p = va_arg (var_args, int*); 729afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington 730afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington _dbus_assert (str_array_p != NULL); 731afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington _dbus_assert (n_elements_p != NULL); 732afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington 733afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington /* Count elements in the array */ 734afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington _dbus_type_reader_recurse (&real->u.reader, &array); 735afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington 736afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington n_elements = 0; 737afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington while (_dbus_type_reader_get_current_type (&array) != DBUS_TYPE_INVALID) 738afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington { 739afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington ++n_elements; 740afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington _dbus_type_reader_next (&array); 741afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington } 742afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington 743afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington str_array = dbus_new0 (char*, n_elements + 1); 744afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington if (str_array == NULL) 745afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington { 746afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington _DBUS_SET_OOM (error); 747afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington goto out; 748afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington } 749afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington 750afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington /* Now go through and dup each string */ 751afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington _dbus_type_reader_recurse (&real->u.reader, &array); 752afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington 753afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington i = 0; 754afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington while (i < n_elements) 755afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington { 756afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington const char *s; 757afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington _dbus_type_reader_read_basic (&array, 758afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington &s); 759afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington 760afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington str_array[i] = _dbus_strdup (s); 761afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington if (str_array[i] == NULL) 762afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington { 763afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington dbus_free_string_array (str_array); 764afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington _DBUS_SET_OOM (error); 765afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington goto out; 766afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington } 767afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington 768afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington ++i; 769afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington 770afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington if (!_dbus_type_reader_next (&array)) 771afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington _dbus_assert (i == n_elements); 772afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington } 773afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington 774afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington _dbus_assert (_dbus_type_reader_get_current_type (&array) == DBUS_TYPE_INVALID); 775afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington _dbus_assert (i == n_elements); 776afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington _dbus_assert (str_array[i] == NULL); 777afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington 778afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington *str_array_p = str_array; 779afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington *n_elements_p = n_elements; 780afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington } 781afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington#ifndef DBUS_DISABLE_CHECKS 782afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington else 783afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington { 784afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington _dbus_warn ("you can't read arrays of container types (struct, variant, array) with %s for now\n", 785afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington _DBUS_FUNCTION_NAME); 786afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington goto out; 787afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington } 788afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington#endif 789afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington } 790afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington#ifndef DBUS_DISABLE_CHECKS 791afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington else 792afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington { 793afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington _dbus_warn ("you can only read arrays and basic types with %s for now\n", 794afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington _DBUS_FUNCTION_NAME); 795afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington goto out; 796afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington } 797afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington#endif 798afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington 799afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington spec_type = va_arg (var_args, int); 800afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington if (!_dbus_type_reader_next (&real->u.reader) && spec_type != DBUS_TYPE_INVALID) 801afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington { 802afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington dbus_set_error (error, DBUS_ERROR_INVALID_ARGS, 803afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington "Message has only %d arguments, but more were expected", i); 804afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington goto out; 805afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington } 806afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington 807afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington i++; 808afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington } 809afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington 810afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington retval = TRUE; 811afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington 812afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington out: 813afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington 814afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington return retval; 815afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington} 816afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington 817ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington/** @} */ 818ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington 819ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington/** 820ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington * @defgroup DBusMessage DBusMessage 821ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington * @ingroup DBus 822afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * @brief Message to be sent or received over a #DBusConnection. 823ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington * 824ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington * A DBusMessage is the most basic unit of communication over a 825ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington * DBusConnection. A DBusConnection represents a stream of messages 826ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington * received from a remote application, and a stream of messages 827ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington * sent to a remote application. 828ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington * 829afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * A message has a message type, returned from 830afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * dbus_message_get_type(). This indicates whether the message is a 831afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * method call, a reply to a method call, a signal, or an error reply. 832afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 833afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * A message has header fields such as the sender, destination, method 834afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * or signal name, and so forth. DBusMessage has accessor functions for 835afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * these, such as dbus_message_get_member(). 836afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 837afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * Convenience functions dbus_message_is_method_call(), dbus_message_is_signal(), 838afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * and dbus_message_is_error() check several header fields at once and are 839afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * slightly more efficient than checking the header fields with individual 840afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * accessor functions. 841afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 842afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * Finally, a message has arguments. The number and types of arguments 843afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * are in the message's signature header field (accessed with 844afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * dbus_message_get_signature()). Simple argument values are usually 845afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * retrieved with dbus_message_get_args() but more complex values such 846afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * as structs may require the use of #DBusMessageIter. 847afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 848afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * The D-Bus specification goes into some more detail about header fields and 849afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * message types. 850afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 851ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington * @{ 852ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington */ 853ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington 854ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington/** 855ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington * @typedef DBusMessage 856ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington * 857ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington * Opaque data type representing a message received from or to be 858ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington * sent to another application. 859ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington */ 860ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington 861ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington/** 862ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington * Returns the serial of a message or 0 if none has been specified. 863ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington * The message's serial number is provided by the application sending 864afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * the message and is used to identify replies to this message. 865afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 866afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * All messages received on a connection will have a serial provided 867afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * by the remote application. 868afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 869afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * For messages you're sending, dbus_connection_send() will assign a 870afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * serial and return it to you. 871ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington * 872ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington * @param message the message 873afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * @returns the serial 874ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington */ 875ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Penningtondbus_uint32_t 876ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Penningtondbus_message_get_serial (DBusMessage *message) 877ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington{ 878ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington _dbus_return_val_if_fail (message != NULL, 0); 879ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington 880ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington return _dbus_header_get_serial (&message->header); 881ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington} 882ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington 883ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington/** 884afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * Sets the reply serial of a message (the serial of the message this 885afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * is a reply to). 886ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington * 887ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington * @param message the message 888afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * @param reply_serial the serial we're replying to 889ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington * @returns #FALSE if not enough memory 890ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington */ 891ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Penningtondbus_bool_t 892ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Penningtondbus_message_set_reply_serial (DBusMessage *message, 893ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington dbus_uint32_t reply_serial) 894ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington{ 895ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington _dbus_return_val_if_fail (message != NULL, FALSE); 896ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington _dbus_return_val_if_fail (!message->locked, FALSE); 897ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington _dbus_return_val_if_fail (reply_serial != 0, FALSE); /* 0 is invalid */ 898ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington 899ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington return _dbus_header_set_field_basic (&message->header, 900ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington DBUS_HEADER_FIELD_REPLY_SERIAL, 901ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington DBUS_TYPE_UINT32, 902ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington &reply_serial); 903ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington} 904ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington 905ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington/** 906ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington * Returns the serial that the message is a reply to or 0 if none. 907ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington * 908ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington * @param message the message 909ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington * @returns the reply serial 910ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington */ 911ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Penningtondbus_uint32_t 912ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Penningtondbus_message_get_reply_serial (DBusMessage *message) 913ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington{ 914ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington dbus_uint32_t v_UINT32; 915ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington 916ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington _dbus_return_val_if_fail (message != NULL, 0); 917ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington 918ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington if (_dbus_header_get_field_basic (&message->header, 919ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington DBUS_HEADER_FIELD_REPLY_SERIAL, 920ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington DBUS_TYPE_UINT32, 921ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington &v_UINT32)) 922ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington return v_UINT32; 923ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington else 924ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington return 0; 925ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington} 926ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington 927ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Penningtonstatic void 928ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Penningtondbus_message_finalize (DBusMessage *message) 929ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington{ 930ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington _dbus_assert (message->refcount.value == 0); 931ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington 932ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington /* This calls application callbacks! */ 933ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington _dbus_data_slot_list_free (&message->slot_list); 934ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington 935ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington _dbus_list_foreach (&message->size_counters, 936ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington free_size_counter, message); 937ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington _dbus_list_clear (&message->size_counters); 938ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington 939ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington _dbus_header_free (&message->header); 940ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington _dbus_string_free (&message->body); 941ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington 942ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington _dbus_assert (message->refcount.value == 0); 943ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington 944ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington dbus_free (message); 945ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington} 946ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington 9479c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonstatic DBusMessage* 9489c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_new_empty_header (void) 94950c25505f62786756519ef1e194883360eda82e0Havoc Pennington{ 9509c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusMessage *message; 9519c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_bool_t from_cache; 95250c25505f62786756519ef1e194883360eda82e0Havoc Pennington 9539c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington message = dbus_message_get_cached (); 954dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington 9559c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (message != NULL) 95650c25505f62786756519ef1e194883360eda82e0Havoc Pennington { 9579c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington from_cache = TRUE; 95850c25505f62786756519ef1e194883360eda82e0Havoc Pennington } 95950c25505f62786756519ef1e194883360eda82e0Havoc Pennington else 96050c25505f62786756519ef1e194883360eda82e0Havoc Pennington { 9619c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington from_cache = FALSE; 9629c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington message = dbus_new (DBusMessage, 1); 9639c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (message == NULL) 9649c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return NULL; 9659c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington#ifndef DBUS_DISABLE_CHECKS 9669c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington message->generation = _dbus_current_generation; 967dac0a1f8933889fd94fed7fecdcc4ec6fb3a3fb0Havoc Pennington#endif 9689c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington } 9699d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington 9709c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington message->refcount.value = 1; 9719c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington message->byte_order = DBUS_COMPILER_BYTE_ORDER; 9729c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington message->locked = FALSE; 97398ad8a8ec6626f7f5c78915b6bdf2be688b4839fHavoc Pennington#ifndef DBUS_DISABLE_CHECKS 97498ad8a8ec6626f7f5c78915b6bdf2be688b4839fHavoc Pennington message->in_cache = FALSE; 97598ad8a8ec6626f7f5c78915b6bdf2be688b4839fHavoc Pennington#endif 9769c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington message->size_counters = NULL; 9779c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington message->size_counter_delta = 0; 9789c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington message->changed_stamp = 0; 979482dab2076282ef1195564fa60dd25c1ffb77682Havoc Pennington 9809c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!from_cache) 9819c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_data_slot_list_init (&message->slot_list); 982dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington 9839c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (from_cache) 984482dab2076282ef1195564fa60dd25c1ffb77682Havoc Pennington { 9859c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_header_reinit (&message->header, message->byte_order); 9869c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_string_set_length (&message->body, 0); 987482dab2076282ef1195564fa60dd25c1ffb77682Havoc Pennington } 988482dab2076282ef1195564fa60dd25c1ffb77682Havoc Pennington else 989482dab2076282ef1195564fa60dd25c1ffb77682Havoc Pennington { 9909c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!_dbus_header_init (&message->header, message->byte_order)) 9919c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington { 9929c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_free (message); 9939c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return NULL; 9949c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington } 995e84c3a03b3be9cfc351ca8e0b9b935cca455e672Alexander Larsson 9969c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!_dbus_string_init_preallocated (&message->body, 32)) 9979c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington { 9989c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_header_free (&message->header); 9999c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_free (message); 10009c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return NULL; 10019c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington } 1002fdb3ecc33366edc475e684baa8adb3c933563f0dAnders Carlsson } 1003c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson 10049c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return message; 10055175ad00e1d648a89efdf8d397b31bf84fd203c8Anders Carlsson} 10065175ad00e1d648a89efdf8d397b31bf84fd203c8Anders Carlsson 10071b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson/** 10089c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Constructs a new message of the given message type. 10099c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Types include #DBUS_MESSAGE_TYPE_METHOD_CALL, 10109c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * #DBUS_MESSAGE_TYPE_SIGNAL, and so forth. 1011dc6a61a15b2d9cdc6504753fa9eb0a718f99d6d8Anders Carlsson * 1012afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * Usually you want to use dbus_message_new_method_call(), 1013afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * dbus_message_new_method_return(), dbus_message_new_signal(), 1014afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * or dbus_message_new_error() instead. 1015afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 10169c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param message_type type of message 1017afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * @returns new message or #NULL if no memory 1018dc6a61a15b2d9cdc6504753fa9eb0a718f99d6d8Anders Carlsson */ 10199c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc PenningtonDBusMessage* 10209c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_new (int message_type) 1021dc6a61a15b2d9cdc6504753fa9eb0a718f99d6d8Anders Carlsson{ 10229c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusMessage *message; 1023babdabd40c98a1a5db93e5315bf0b2609e73f426Anders Carlsson 10249c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (message_type != DBUS_MESSAGE_TYPE_INVALID, NULL); 1025babdabd40c98a1a5db93e5315bf0b2609e73f426Anders Carlsson 10269c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington message = dbus_message_new_empty_header (); 10279c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (message == NULL) 10289c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return NULL; 1029dc6a61a15b2d9cdc6504753fa9eb0a718f99d6d8Anders Carlsson 10309c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!_dbus_header_create (&message->header, 10319c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington message_type, 10329c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington NULL, NULL, NULL, NULL, NULL)) 1033e84c3a03b3be9cfc351ca8e0b9b935cca455e672Alexander Larsson { 10349c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_message_unref (message); 10359c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return NULL; 1036e84c3a03b3be9cfc351ca8e0b9b935cca455e672Alexander Larsson } 1037e84c3a03b3be9cfc351ca8e0b9b935cca455e672Alexander Larsson 10389c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return message; 1039e84c3a03b3be9cfc351ca8e0b9b935cca455e672Alexander Larsson} 1040e84c3a03b3be9cfc351ca8e0b9b935cca455e672Alexander Larsson 1041dc6a61a15b2d9cdc6504753fa9eb0a718f99d6d8Anders Carlsson/** 10429c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Constructs a new message to invoke a method on a remote 10439c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * object. Returns #NULL if memory can't be allocated for the 10449c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * message. The destination may be #NULL in which case no destination 10457652304bff969afb3969603149bb385efe861fe8John (J * is set; this is appropriate when using D-Bus in a peer-to-peer 10469c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * context (no message bus). The interface may be #NULL, which means 10479c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * that if multiple methods with the given name exist it is undefined 10489c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * which one will be invoked. 1049afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 1050afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * The path and method names may not be #NULL. 1051afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 1052afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * Destination, path, interface, and method name can't contain 1053afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * any invalid characters (see the D-Bus specification). 1054afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 10558873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * @param destination name that the message should be sent to or #NULL 10569c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param path object path the message should be sent to 1057afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * @param interface interface to invoke method on, or #NULL 10589c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param method method to invoke 1059799a3ff443f5357ae7857ebe989a7f92f7bd84dfAnders Carlsson * 10609c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns a new DBusMessage, free with dbus_message_unref() 1061799a3ff443f5357ae7857ebe989a7f92f7bd84dfAnders Carlsson */ 10629c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc PenningtonDBusMessage* 10639c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_new_method_call (const char *destination, 10649c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *path, 10659c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *interface, 10669c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *method) 1067799a3ff443f5357ae7857ebe989a7f92f7bd84dfAnders Carlsson{ 10689c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusMessage *message; 1069799a3ff443f5357ae7857ebe989a7f92f7bd84dfAnders Carlsson 10709c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (path != NULL, NULL); 10719c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (method != NULL, NULL); 10729c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (destination == NULL || 10738873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington _dbus_check_is_valid_bus_name (destination), NULL); 10749c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (_dbus_check_is_valid_path (path), NULL); 10759c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (interface == NULL || 10769c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_check_is_valid_interface (interface), NULL); 10779c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (_dbus_check_is_valid_member (method), NULL); 1078799a3ff443f5357ae7857ebe989a7f92f7bd84dfAnders Carlsson 10799c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington message = dbus_message_new_empty_header (); 10809c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (message == NULL) 10819c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return NULL; 1082c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson 10839c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!_dbus_header_create (&message->header, 10849c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_MESSAGE_TYPE_METHOD_CALL, 10859c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington destination, path, interface, method, NULL)) 10869c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington { 10879c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_message_unref (message); 10889c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return NULL; 10899c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington } 1090c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson 10919c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return message; 1092799a3ff443f5357ae7857ebe989a7f92f7bd84dfAnders Carlsson} 1093799a3ff443f5357ae7857ebe989a7f92f7bd84dfAnders Carlsson 1094799a3ff443f5357ae7857ebe989a7f92f7bd84dfAnders Carlsson/** 10959c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Constructs a message that is a reply to a method call. Returns 10969c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * #NULL if memory can't be allocated for the message. 10971f23ea99b37bfc8197f1c6a376f9afe08037f0f6Anders Carlsson * 1098afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * @param method_call the message being replied to 10999c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns a new DBusMessage, free with dbus_message_unref() 11001f23ea99b37bfc8197f1c6a376f9afe08037f0f6Anders Carlsson */ 11019c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc PenningtonDBusMessage* 11029c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_new_method_return (DBusMessage *method_call) 11031f23ea99b37bfc8197f1c6a376f9afe08037f0f6Anders Carlsson{ 11049c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusMessage *message; 11059c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *sender; 11061f23ea99b37bfc8197f1c6a376f9afe08037f0f6Anders Carlsson 11079c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (method_call != NULL, NULL); 11081f23ea99b37bfc8197f1c6a376f9afe08037f0f6Anders Carlsson 11099c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington sender = dbus_message_get_sender (method_call); 11101f23ea99b37bfc8197f1c6a376f9afe08037f0f6Anders Carlsson 11119c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington /* sender is allowed to be null here in peer-to-peer case */ 11129c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 11139c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington message = dbus_message_new_empty_header (); 11149c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (message == NULL) 11159c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return NULL; 11169c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 11179c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!_dbus_header_create (&message->header, 11189c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_MESSAGE_TYPE_METHOD_RETURN, 11199c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington sender, NULL, NULL, NULL, NULL)) 11209c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington { 11219c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_message_unref (message); 11229c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return NULL; 11239c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington } 1124d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington 11259c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_message_set_no_reply (message, TRUE); 11260123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks 11279c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!dbus_message_set_reply_serial (message, 11289c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_message_get_serial (method_call))) 11299c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington { 11309c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_message_unref (message); 11319c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return NULL; 11329c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington } 11330123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks 11349c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return message; 11350123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks} 11360123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks 11370123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks/** 11389c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Constructs a new message representing a signal emission. Returns 11399c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * #NULL if memory can't be allocated for the message. A signal is 1140afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * identified by its originating object path, interface, and the name 1141afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * of the signal. 11420123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks * 1143afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * Path, interface, and signal name must all be valid (the D-Bus 1144afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * specification defines the syntax of these fields). 1145afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 11469c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param path the path to the object emitting the signal 11479c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param interface the interface the signal is emitted from 11489c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param name name of the signal 11499c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns a new DBusMessage, free with dbus_message_unref() 11500123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks */ 11519c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc PenningtonDBusMessage* 11529c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_new_signal (const char *path, 11539c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *interface, 11549c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *name) 11550123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks{ 11569c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusMessage *message; 11570123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks 11589c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (path != NULL, NULL); 11599c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (interface != NULL, NULL); 11609c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (name != NULL, NULL); 11619c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (_dbus_check_is_valid_path (path), NULL); 11629c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (_dbus_check_is_valid_interface (interface), NULL); 11639c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (_dbus_check_is_valid_member (name), NULL); 11640123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks 11659c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington message = dbus_message_new_empty_header (); 11669c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (message == NULL) 11679c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return NULL; 11680123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks 11699c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!_dbus_header_create (&message->header, 11709c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_MESSAGE_TYPE_SIGNAL, 11719c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington NULL, path, interface, name, NULL)) 11720123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks { 11739c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_message_unref (message); 11749c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return NULL; 11750123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks } 11760123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks 11779c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_message_set_no_reply (message, TRUE); 11780123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks 11799c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return message; 11800123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks} 11810123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks 11820123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks/** 1183afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * Creates a new message that is an error reply to another message. 1184afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * Error replies are most common in response to method calls, but 1185afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * can be returned in reply to any message. 11860123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks * 1187afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * The error name must be a valid error name according to the syntax 1188afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * given in the D-Bus specification. If you don't want to make 1189afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * up an error name just use #DBUS_ERROR_FAILED. 1190afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 1191afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * @param reply_to the message we're replying to 11929c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param error_name the error name 1193afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * @param error_message the error message string (or #NULL for none, but please give a message) 1194afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * @returns a new error message object, free with dbus_message_unref() 11950123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks */ 11969c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc PenningtonDBusMessage* 11979c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_new_error (DBusMessage *reply_to, 11989c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *error_name, 11999c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *error_message) 12000123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks{ 12019c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusMessage *message; 12029c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *sender; 12039c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusMessageIter iter; 12040123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks 12059c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (reply_to != NULL, NULL); 12069c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (error_name != NULL, NULL); 12079c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (_dbus_check_is_valid_error_name (error_name), NULL); 12080123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks 12099c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington sender = dbus_message_get_sender (reply_to); 12109c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 12119c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington /* sender may be NULL for non-message-bus case or 12129c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * when the message bus is dealing with an unregistered 12139c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * connection. 12149c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington */ 12159c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington message = dbus_message_new_empty_header (); 12169c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (message == NULL) 12179c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return NULL; 12189c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 12199c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!_dbus_header_create (&message->header, 12209c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_MESSAGE_TYPE_ERROR, 12219c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington sender, NULL, NULL, NULL, error_name)) 12220123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks { 12239c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_message_unref (message); 12249c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return NULL; 12259c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington } 12260123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks 12279c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_message_set_no_reply (message, TRUE); 12280123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks 12299c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!dbus_message_set_reply_serial (message, 12309c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_message_get_serial (reply_to))) 12319c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington { 12329c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_message_unref (message); 12339c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return NULL; 12349c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington } 12351f23ea99b37bfc8197f1c6a376f9afe08037f0f6Anders Carlsson 12369c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (error_message != NULL) 12379c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington { 123831988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington dbus_message_iter_init_append (message, &iter); 12399c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!dbus_message_iter_append_basic (&iter, 12409c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_TYPE_STRING, 12419c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington &error_message)) 12420123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks { 12439c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_message_unref (message); 12449c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return NULL; 12450123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks } 12460123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks } 12479c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 12489c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return message; 1249c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson} 125029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 1251c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson/** 1252afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * Creates a new message that is an error reply to another message, allowing 1253afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * you to use printf formatting. 1254afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 1255afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * See dbus_message_new_error() for details - this function is the same 1256afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * aside from the printf formatting. 1257c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson * 1258716059087dcf7caeb12313520eee8fc4b554ef54Havoc Pennington * @todo add _DBUS_GNUC_PRINTF to this (requires moving _DBUS_GNUC_PRINTF to 1259fb93e1faa875d6b1ca48b0e792a9b79aa7cbc517Ralf Habacker * public header, see DBUS_DEPRECATED for an example) 1260716059087dcf7caeb12313520eee8fc4b554ef54Havoc Pennington * 12619c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param reply_to the original message 12629c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param error_name the error name 12639c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param error_format the error message format as with printf 12649c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param ... format string arguments 12659c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns a new error message 1266c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson */ 12679c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc PenningtonDBusMessage* 12689c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_new_error_printf (DBusMessage *reply_to, 12699c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *error_name, 12709c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *error_format, 12719c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington ...) 1272c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson{ 12739c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington va_list args; 12749c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusString str; 12759c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusMessage *message; 1276c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson 12779c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (reply_to != NULL, NULL); 12789c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (error_name != NULL, NULL); 12799c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (_dbus_check_is_valid_error_name (error_name), NULL); 12801f23ea99b37bfc8197f1c6a376f9afe08037f0f6Anders Carlsson 12819c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!_dbus_string_init (&str)) 12829c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return NULL; 1283c8769e0b1dde3f1c4ad40cd10dd89c284ecc672bAnders Carlsson 12849c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington va_start (args, error_format); 12851f23ea99b37bfc8197f1c6a376f9afe08037f0f6Anders Carlsson 12869c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (_dbus_string_append_printf_valist (&str, error_format, args)) 12879c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington message = dbus_message_new_error (reply_to, error_name, 12889c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_string_get_const_data (&str)); 12899c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington else 12909c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington message = NULL; 12911f23ea99b37bfc8197f1c6a376f9afe08037f0f6Anders Carlsson 12929c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_string_free (&str); 12931f23ea99b37bfc8197f1c6a376f9afe08037f0f6Anders Carlsson 12949c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington va_end (args); 12951f23ea99b37bfc8197f1c6a376f9afe08037f0f6Anders Carlsson 12969c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return message; 1297c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson} 12981f23ea99b37bfc8197f1c6a376f9afe08037f0f6Anders Carlsson 12999c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 1300c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson/** 13019c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Creates a new message that is an exact replica of the message 13029c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * specified, except that its refcount is set to 1, its message serial 13039c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * is reset to 0, and if the original message was "locked" (in the 13049c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * outgoing message queue and thus not modifiable) the new message 13059c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * will not be locked. 1306c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson * 1307afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * @param message the message 1308afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * @returns the new message.or #NULL if not enough memory 1309c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson */ 13109c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc PenningtonDBusMessage * 13119c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_copy (const DBusMessage *message) 1312c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson{ 13139c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusMessage *retval; 13141f23ea99b37bfc8197f1c6a376f9afe08037f0f6Anders Carlsson 13159c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (message != NULL, NULL); 13161f23ea99b37bfc8197f1c6a376f9afe08037f0f6Anders Carlsson 13179c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington retval = dbus_new0 (DBusMessage, 1); 13189c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (retval == NULL) 13199c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return NULL; 13201f23ea99b37bfc8197f1c6a376f9afe08037f0f6Anders Carlsson 13219c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington retval->refcount.value = 1; 13229c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington retval->byte_order = message->byte_order; 13239c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington retval->locked = FALSE; 13249c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington#ifndef DBUS_DISABLE_CHECKS 13259c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington retval->generation = message->generation; 13269c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington#endif 1327b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington 13289c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!_dbus_header_copy (&message->header, &retval->header)) 13299c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington { 13309c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_free (retval); 13319c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return NULL; 13329c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington } 1333b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington 13349c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!_dbus_string_init_preallocated (&retval->body, 13359c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_string_get_length (&message->body))) 13369c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington { 13379c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_header_free (&retval->header); 13389c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_free (retval); 13399c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return NULL; 13409c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington } 1341b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington 13429c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!_dbus_string_copy (&message->body, 0, 13439c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington &retval->body, 0)) 13449c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington goto failed_copy; 1345b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington 13469c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return retval; 1347b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington 13489c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington failed_copy: 13499c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_header_free (&retval->header); 13509c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_string_free (&retval->body); 13519c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_free (retval); 1352b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington 13539c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return NULL; 1354b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington} 1355b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington 1356b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington 1357c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson/** 13589c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Increments the reference count of a DBusMessage. 1359c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson * 1360afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * @param message the message 13619c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns the message 13629c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @see dbus_message_unref 1363c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson */ 13649c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc PenningtonDBusMessage * 13659c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_ref (DBusMessage *message) 1366c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson{ 13679c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_int32_t old_refcount; 13681f23ea99b37bfc8197f1c6a376f9afe08037f0f6Anders Carlsson 13699c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (message != NULL, NULL); 13709c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (message->generation == _dbus_current_generation, NULL); 137198ad8a8ec6626f7f5c78915b6bdf2be688b4839fHavoc Pennington _dbus_return_val_if_fail (!message->in_cache, NULL); 137298ad8a8ec6626f7f5c78915b6bdf2be688b4839fHavoc Pennington 13739c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington old_refcount = _dbus_atomic_inc (&message->refcount); 13749c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_assert (old_refcount >= 1); 13751b9a4589f6836641ded324b7b5d003c5cbfb0b78Anders Carlsson 13769c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return message; 1377c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson} 1378babdabd40c98a1a5db93e5315bf0b2609e73f426Anders Carlsson 1379c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson/** 1380afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * Decrements the reference count of a DBusMessage, freeing the 1381afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * message if the count reaches 0. 1382c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson * 1383afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * @param message the message 13849c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @see dbus_message_ref 1385c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson */ 13869c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonvoid 13879c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_unref (DBusMessage *message) 13880123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks{ 13899c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_int32_t old_refcount; 13900123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks 13919c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_if_fail (message != NULL); 13929c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_if_fail (message->generation == _dbus_current_generation); 139398ad8a8ec6626f7f5c78915b6bdf2be688b4839fHavoc Pennington _dbus_return_if_fail (!message->in_cache); 13940123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks 13959c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington old_refcount = _dbus_atomic_dec (&message->refcount); 13960123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks 13979c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_assert (old_refcount >= 0); 13980123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks 13999c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (old_refcount == 1) 14009c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington { 14019c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington /* Calls application callbacks! */ 14029c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_message_cache_or_finalize (message); 14039c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington } 14040123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks} 14050123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks 1406c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson/** 14079c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Gets the type of a message. Types include 14089c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * #DBUS_MESSAGE_TYPE_METHOD_CALL, #DBUS_MESSAGE_TYPE_METHOD_RETURN, 14099c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * #DBUS_MESSAGE_TYPE_ERROR, #DBUS_MESSAGE_TYPE_SIGNAL, but other 14109c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * types are allowed and all code must silently ignore messages of 1411afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * unknown type. #DBUS_MESSAGE_TYPE_INVALID will never be returned. 1412c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson * 14139c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param message the message 14149c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns the type of the message 1415c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson */ 14169c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonint 14179c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_get_type (DBusMessage *message) 1418c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson{ 14199c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (message != NULL, DBUS_MESSAGE_TYPE_INVALID); 1420c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson 14219c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return _dbus_header_get_message_type (&message->header); 14221f23ea99b37bfc8197f1c6a376f9afe08037f0f6Anders Carlsson} 14231f23ea99b37bfc8197f1c6a376f9afe08037f0f6Anders Carlsson 14241f23ea99b37bfc8197f1c6a376f9afe08037f0f6Anders Carlsson/** 14259c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Appends fields to a message given a variable argument list. The 14269c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * variable argument list should contain the type of each argument 14279c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * followed by the value to append. Appendable types are basic types, 14289c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * and arrays of fixed-length basic types. To append variable-length 14299c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * basic types, or any more complex value, you have to use an iterator 14309c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * rather than this function. 1431c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson * 14329c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * To append a basic type, specify its type code followed by the 143364f3d8f67db09e0c84ed3ff009b86d0127fe82b4Havoc Pennington * address of the value. For example: 14349c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 14359c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @code 14369c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 143764f3d8f67db09e0c84ed3ff009b86d0127fe82b4Havoc Pennington * dbus_int32_t v_INT32 = 42; 143864f3d8f67db09e0c84ed3ff009b86d0127fe82b4Havoc Pennington * const char *v_STRING = "Hello World"; 1439afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * dbus_message_append_args (message, 1440afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * DBUS_TYPE_INT32, &v_INT32, 1441afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * DBUS_TYPE_STRING, &v_STRING, 1442afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * DBUS_TYPE_INVALID); 14439c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @endcode 14449c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 14459c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * To append an array of fixed-length basic types, pass in the 14469c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * DBUS_TYPE_ARRAY typecode, the element typecode, the address of 14479c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * the array pointer, and a 32-bit integer giving the number of 14489c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * elements in the array. So for example: 14499c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @code 14509c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * const dbus_int32_t array[] = { 1, 2, 3 }; 14519c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * const dbus_int32_t *v_ARRAY = array; 1452afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * dbus_message_append_args (message, 1453afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * DBUS_TYPE_ARRAY, DBUS_TYPE_INT32, &v_ARRAY, 3, 1454afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * DBUS_TYPE_INVALID); 14559c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @endcode 14569c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 14579c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @warning in C, given "int array[]", "&array == array" (the 14589c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * comp.lang.c FAQ says otherwise, but gcc and the FAQ don't agree). 14599c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * So if you're using an array instead of a pointer you have to create 14609c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * a pointer variable, assign the array to it, then take the address 14619c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * of the pointer variable. For strings it works to write 14629c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * const char *array = "Hello" and then use &array though. 14639c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 14649c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * The last argument to this function must be #DBUS_TYPE_INVALID, 1465afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * marking the end of the argument list. If you don't do this 1466afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * then libdbus won't know to stop and will read invalid memory. 14679c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 146883dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington * String/signature/path arrays should be passed in as "const char*** 146983dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington * address_of_array" and "int n_elements" 147083dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington * 14719c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @todo support DBUS_TYPE_STRUCT and DBUS_TYPE_VARIANT and complex arrays 14729c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 14739c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @todo If this fails due to lack of memory, the message is hosed and 14749c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * you have to start over building the whole message. 14759c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 14769c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param message the message 14779c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param first_arg_type type of the first argument 14789c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param ... value of first argument, list of additional type-value pairs 1479c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson * @returns #TRUE on success 1480c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson */ 1481c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larssondbus_bool_t 14829c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_append_args (DBusMessage *message, 14839c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington int first_arg_type, 14849c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington ...) 1485c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson{ 14869c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_bool_t retval; 14879c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington va_list var_args; 1488c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson 14899c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (message != NULL, FALSE); 1490b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington 14919c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington va_start (var_args, first_arg_type); 14929c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington retval = dbus_message_append_args_valist (message, 14939c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington first_arg_type, 14949c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington var_args); 14959c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington va_end (var_args); 14969c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 14979c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return retval; 1498b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington} 1499b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington 1500b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington/** 1501afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * Like dbus_message_append_args() but takes a va_list for use by language bindings. 1502b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington * 15039c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @todo for now, if this function fails due to OOM it will leave 15049c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * the message half-written and you have to discard the message 15059c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * and start over. 1506b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington * 15079c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @see dbus_message_append_args. 15089c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param message the message 15099c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param first_arg_type type of first argument 15109c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param var_args value of first argument, then list of type/value pairs 1511b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington * @returns #TRUE on success 1512b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington */ 1513b29d0c534a631b211f1f94168e7672c604c8f815Havoc Penningtondbus_bool_t 15149c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_append_args_valist (DBusMessage *message, 15159c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington int first_arg_type, 15169c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington va_list var_args) 1517b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington{ 15189c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington int type; 15199c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusMessageIter iter; 1520b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington 15219c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (message != NULL, FALSE); 1522b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington 15239c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington type = first_arg_type; 15249c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 152531988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington dbus_message_iter_init_append (message, &iter); 15269c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 15279c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington while (type != DBUS_TYPE_INVALID) 15289c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington { 152954a2e9f7961b4b8afff94bb0c5b756f986965be6Colin Walters if (dbus_type_is_basic (type)) 15309c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington { 15319c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const DBusBasicValue *value; 15329c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington value = va_arg (var_args, const DBusBasicValue*); 15339c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 15349c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!dbus_message_iter_append_basic (&iter, 15359c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington type, 15369c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington value)) 15379c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington goto failed; 15389c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington } 15399c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington else if (type == DBUS_TYPE_ARRAY) 15409c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington { 15419c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington int element_type; 15429c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusMessageIter array; 15439c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington char buf[2]; 15449c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 15459c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington element_type = va_arg (var_args, int); 154683dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington 15479c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington buf[0] = element_type; 15489c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington buf[1] = '\0'; 15499c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!dbus_message_iter_open_container (&iter, 15509c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_TYPE_ARRAY, 15519c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington buf, 15529c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington &array)) 15539c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington goto failed; 155483dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington 155574b1b35402f6b9bbc09999a6224dfc04bc48b2a9Colin Walters if (dbus_type_is_fixed (element_type)) 155683dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington { 155783dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington const DBusBasicValue **value; 155883dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington int n_elements; 155983dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington 156083dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington value = va_arg (var_args, const DBusBasicValue**); 156183dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington n_elements = va_arg (var_args, int); 156283dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington 156383dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington if (!dbus_message_iter_append_fixed_array (&array, 156483dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington element_type, 156583dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington value, 156683dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington n_elements)) 156783dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington goto failed; 156883dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington } 156983dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington else if (element_type == DBUS_TYPE_STRING || 157083dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington element_type == DBUS_TYPE_SIGNATURE || 157183dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington element_type == DBUS_TYPE_OBJECT_PATH) 157283dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington { 157383dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington const char ***value_p; 157483dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington const char **value; 157583dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington int n_elements; 157683dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington int i; 157783dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington 157883dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington value_p = va_arg (var_args, const char***); 157983dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington n_elements = va_arg (var_args, int); 158083dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington 158183dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington value = *value_p; 158283dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington 158383dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington i = 0; 158483dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington while (i < n_elements) 158583dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington { 158683dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington if (!dbus_message_iter_append_basic (&array, 158783dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington element_type, 158883dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington &value[i])) 158983dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington goto failed; 159083dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington ++i; 159183dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington } 159283dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington } 159383dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington else 159483dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington { 159583dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington _dbus_warn ("arrays of %s can't be appended with %s for now\n", 159683dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington _dbus_type_to_string (element_type), 159783dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington _DBUS_FUNCTION_NAME); 159883dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington goto failed; 159983dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington } 16009c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 16019c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!dbus_message_iter_close_container (&iter, &array)) 16029c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington goto failed; 16039c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington } 16049c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington#ifndef DBUS_DISABLE_CHECKS 16059c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington else 16069c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington { 16079c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_warn ("type %s isn't supported yet in %s\n", 16089c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_type_to_string (type), _DBUS_FUNCTION_NAME); 16099c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington goto failed; 16109c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington } 16119c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington#endif 16129c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 16139c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington type = va_arg (var_args, int); 16149c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington } 16159c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 16169c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return TRUE; 16179c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 16189c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington failed: 16199c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return FALSE; 1620c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson} 1621c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson 1622c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson/** 16239c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Gets arguments from a message given a variable argument list. The 16249c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * supported types include those supported by 16259c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * dbus_message_append_args(); that is, basic types and arrays of 16269c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * fixed-length basic types. The arguments are the same as they would 16279c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * be for dbus_message_iter_get_basic() or 16289c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * dbus_message_iter_get_fixed_array(). 1629993be1059afcb0e9a5b67f5287fb1122d6c48ce6Havoc Pennington * 16309c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * In addition to those types, arrays of string, object path, and 16319c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * signature are supported; but these are returned as allocated memory 16329c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * and must be freed with dbus_free_string_array(), while the other 163383dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington * types are returned as const references. To get a string array 163483dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington * pass in "char ***array_location" and "int *n_elements" 1635c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson * 16369c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * The variable argument list should contain the type of the argument 16379c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * followed by a pointer to where the value should be stored. The list 16389c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * is terminated with #DBUS_TYPE_INVALID. 16399c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 1640afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * Except for string arrays, the returned values are constant; do not 1641afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * free them. They point into the #DBusMessage. 16429c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 16439c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * If the requested arguments are not present, or do not have the 16449c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * requested types, then an error will be set. 16459c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 1646afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * If more arguments than requested are present, the requested 1647afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * arguments are returned and the extra arguments are ignored. 1648afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 16499c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @todo support DBUS_TYPE_STRUCT and DBUS_TYPE_VARIANT and complex arrays 16509c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 16519c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param message the message 16529c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param error error to be filled in on failure 16539c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param first_arg_type the first argument type 16549c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param ... location for first argument value, then list of type-location pairs 16559c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns #FALSE if the error was set 1656c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson */ 1657c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larssondbus_bool_t 16589c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_get_args (DBusMessage *message, 16599c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusError *error, 16609c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington int first_arg_type, 16619c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington ...) 1662c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson{ 16639c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_bool_t retval; 16649c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington va_list var_args; 1665c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson 16669c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (message != NULL, FALSE); 16679c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_error_is_set (error, FALSE); 1668c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson 16699c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington va_start (var_args, first_arg_type); 16709c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington retval = dbus_message_get_args_valist (message, error, first_arg_type, var_args); 16719c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington va_end (var_args); 1672c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson 16739c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return retval; 1674c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson} 1675c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson 1676d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington/** 1677afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * Like dbus_message_get_args but takes a va_list for use by language bindings. 1678d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington * 16799c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @see dbus_message_get_args 16809c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param message the message 16819c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param error error to be filled in 16829c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param first_arg_type type of the first argument 16839c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param var_args return location for first argument, followed by list of type/location pairs 16849c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns #FALSE if error was set 1685d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington */ 1686d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Penningtondbus_bool_t 16879c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_get_args_valist (DBusMessage *message, 16889c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusError *error, 16899c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington int first_arg_type, 16909c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington va_list var_args) 1691d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington{ 16929c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusMessageIter iter; 1693d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington 16949c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (message != NULL, FALSE); 16959c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_error_is_set (error, FALSE); 1696d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington 16979c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_message_iter_init (message, &iter); 16987bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington return _dbus_message_iter_get_args_valist (&iter, error, first_arg_type, var_args); 16999c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington} 1700c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson 17019c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonstatic void 17029c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington_dbus_message_iter_init_common (DBusMessage *message, 17039c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusMessageRealIter *real, 17049c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington int iter_type) 17059c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington{ 17069c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_assert (sizeof (DBusMessageRealIter) <= sizeof (DBusMessageIter)); 1707c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson 1708fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington /* Since the iterator will read or write who-knows-what from the 1709fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington * message, we need to get in the right byte order 1710fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington */ 1711fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington ensure_byte_order (message); 1712fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington 17139c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington real->message = message; 17149c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington real->changed_stamp = message->changed_stamp; 17159c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington real->iter_type = iter_type; 17169c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington real->sig_refcount = 0; 1717c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson} 1718c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson 1719c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson/** 17209c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Initializes a #DBusMessageIter for reading the arguments of the 17219c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * message passed in. 17227265423411609c14ddb9e6643463b840afcaa09bHavoc Pennington * 1723afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * When possible, dbus_message_get_args() is much more convenient. 1724afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * Some types of argument can only be read with #DBusMessageIter 1725afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * however. 1726afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 1727afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * The easiest way to iterate is like this: 1728afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * @code 172916e9289ca2c5143c3bcbfe89ebb77c40ca36ff92Xan Lopez * dbus_message_iter_init (message, &iter); 1730afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * while ((current_type = dbus_message_iter_get_arg_type (&iter)) != DBUS_TYPE_INVALID) 1731afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * dbus_message_iter_next (&iter); 1732afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * @endcode 1733afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 1734afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * #DBusMessageIter contains no allocated memory; it need not be 1735afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * freed, and can be copied by assignment or memcpy(). 1736afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 17371b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson * @param message the message 17383df260c07102745c5606c313af862558f105f83eHavoc Pennington * @param iter pointer to an iterator to initialize 17399c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns #FALSE if the message has no arguments 17401b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson */ 17419c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_bool_t 17429c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_iter_init (DBusMessage *message, 17439c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusMessageIter *iter) 17441b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson{ 1745c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson DBusMessageRealIter *real = (DBusMessageRealIter *)iter; 17469c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const DBusString *type_str; 17479c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington int type_pos; 1748c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington 17499c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (message != NULL, FALSE); 17509c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (iter != NULL, FALSE); 17519c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 17529c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington get_const_signature (&message->header, &type_str, &type_pos); 17539c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 17549c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_message_iter_init_common (message, real, 17559c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_MESSAGE_ITER_TYPE_READER); 17569c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 17579c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_type_reader_init (&real->u.reader, 17589c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington message->byte_order, 17599c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington type_str, type_pos, 17609c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington &message->body, 17619c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 0); 17629c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 1763737479031f51b00020b6020f8780137bb4a3de1bJoe Shaw return _dbus_type_reader_get_current_type (&real->u.reader) != DBUS_TYPE_INVALID; 1764c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson} 17651b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson 17661b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson/** 17679c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Checks if an iterator has any more fields. 17681b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson * 17699c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param iter the message iter 1770afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * @returns #TRUE if there are more fields following 17711b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson */ 1772c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larssondbus_bool_t 17739c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_iter_has_next (DBusMessageIter *iter) 17741b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson{ 1775c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson DBusMessageRealIter *real = (DBusMessageRealIter *)iter; 17761b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson 17779c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (_dbus_message_iter_check (real), FALSE); 17789c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (real->iter_type == DBUS_MESSAGE_ITER_TYPE_READER, FALSE); 1779c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson 17809c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return _dbus_type_reader_has_next (&real->u.reader); 17810123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks} 17820123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks 17830123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks/** 17849c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Moves the iterator to the next field, if any. If there's no next 17859c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * field, returns #FALSE. If the iterator moves forward, returns 17869c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * #TRUE. 17870123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks * 17889c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param iter the message iter 17899c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns #TRUE if the iterator was moved to the next field 17900123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks */ 17910123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeksdbus_bool_t 17929c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_iter_next (DBusMessageIter *iter) 17930123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks{ 17949c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusMessageRealIter *real = (DBusMessageRealIter *)iter; 17959c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 17969c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (_dbus_message_iter_check (real), FALSE); 17979c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (real->iter_type == DBUS_MESSAGE_ITER_TYPE_READER, FALSE); 17989c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 17999c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return _dbus_type_reader_next (&real->u.reader); 18001b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson} 18011b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson 18021b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson/** 18039c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Returns the argument type of the argument that the message iterator 18049c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * points to. If the iterator is at the end of the message, returns 18059c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * #DBUS_TYPE_INVALID. You can thus write a loop as follows: 18061b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson * 18079c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @code 18089c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * dbus_message_iter_init (&iter); 18099c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * while ((current_type = dbus_message_iter_get_arg_type (&iter)) != DBUS_TYPE_INVALID) 18109c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * dbus_message_iter_next (&iter); 18119c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @endcode 18129c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 18139c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param iter the message iter 18149c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns the argument type 18151b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson */ 18169c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonint 18179c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_iter_get_arg_type (DBusMessageIter *iter) 18181b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson{ 18199c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusMessageRealIter *real = (DBusMessageRealIter *)iter; 18209c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 18219c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (_dbus_message_iter_check (real), DBUS_TYPE_INVALID); 18229c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (real->iter_type == DBUS_MESSAGE_ITER_TYPE_READER, FALSE); 18239c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 18249c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return _dbus_type_reader_get_current_type (&real->u.reader); 18251b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson} 18261b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson 18271b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson/** 18289c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Returns the element type of the array that the message iterator 18299c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * points to. Note that you need to check that the iterator points to 18309c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * an array prior to using this function. 18311b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson * 18329c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param iter the message iter 18339c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns the array element type 18341b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson */ 18359c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonint 183631988af4089f3793940417535f8eabaae1ac26c8Havoc Penningtondbus_message_iter_get_element_type (DBusMessageIter *iter) 18371b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson{ 18389c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusMessageRealIter *real = (DBusMessageRealIter *)iter; 18399c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 18409c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (_dbus_message_iter_check (real), DBUS_TYPE_INVALID); 18419c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (real->iter_type == DBUS_MESSAGE_ITER_TYPE_READER, DBUS_TYPE_INVALID); 18429c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (dbus_message_iter_get_arg_type (iter) == DBUS_TYPE_ARRAY, DBUS_TYPE_INVALID); 18439c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 184431988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington return _dbus_type_reader_get_element_type (&real->u.reader); 18451b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson} 18461b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson 18471b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson/** 18489c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Recurses into a container value when reading values from a message, 18499c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * initializing a sub-iterator to use for traversing the child values 18509c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * of the container. 18511b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson * 18529c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Note that this recurses into a value, not a type, so you can only 18539c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * recurse if the value exists. The main implication of this is that 18549c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * if you have for example an empty array of array of int32, you can 18559c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * recurse into the outermost array, but it will have no values, so 18569c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * you won't be able to recurse further. There's no array of int32 to 18579c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * recurse into. 18589c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 1859b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * If a container is an array of fixed-length types, it is much more 1860b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * efficient to use dbus_message_iter_get_fixed_array() to get the 1861b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * whole array in one shot, rather than individually walking over the 1862b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * array elements. 1863b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * 1864b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * Be sure you have somehow checked that 1865b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * dbus_message_iter_get_arg_type() matches the type you are expecting 1866b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * to recurse into. Results of this function are undefined if there is 1867b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * no container to recurse into at the current iterator position. 1868b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * 18699c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param iter the message iterator 18709c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param sub the sub-iterator to initialize 18711b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson */ 18729c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonvoid 18739c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_iter_recurse (DBusMessageIter *iter, 18749c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusMessageIter *sub) 18751b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson{ 18769c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusMessageRealIter *real = (DBusMessageRealIter *)iter; 18779c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusMessageRealIter *real_sub = (DBusMessageRealIter *)sub; 18781b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson 18799c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_if_fail (_dbus_message_iter_check (real)); 18809c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_if_fail (sub != NULL); 18819c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 18829c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington *real_sub = *real; 18839c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_type_reader_recurse (&real->u.reader, &real_sub->u.reader); 18849c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington} 1885b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington 1886b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington/** 188761411a061c09def43687153e6c734ff27b7fd556Colin Walters * Returns the current signature of a message iterator. This 188861411a061c09def43687153e6c734ff27b7fd556Colin Walters * is useful primarily for dealing with variants; one can 188961411a061c09def43687153e6c734ff27b7fd556Colin Walters * recurse into a variant and determine the signature of 189061411a061c09def43687153e6c734ff27b7fd556Colin Walters * the variant's value. 189161411a061c09def43687153e6c734ff27b7fd556Colin Walters * 1892afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * The returned string must be freed with dbus_free(). 1893afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 189461411a061c09def43687153e6c734ff27b7fd556Colin Walters * @param iter the message iterator 189561411a061c09def43687153e6c734ff27b7fd556Colin Walters * @returns the contained signature, or NULL if out of memory 189661411a061c09def43687153e6c734ff27b7fd556Colin Walters */ 189761411a061c09def43687153e6c734ff27b7fd556Colin Walterschar * 189861411a061c09def43687153e6c734ff27b7fd556Colin Waltersdbus_message_iter_get_signature (DBusMessageIter *iter) 189961411a061c09def43687153e6c734ff27b7fd556Colin Walters{ 190061411a061c09def43687153e6c734ff27b7fd556Colin Walters const DBusString *sig; 190161411a061c09def43687153e6c734ff27b7fd556Colin Walters DBusString retstr; 190261411a061c09def43687153e6c734ff27b7fd556Colin Walters char *ret; 190361411a061c09def43687153e6c734ff27b7fd556Colin Walters int start, len; 190461411a061c09def43687153e6c734ff27b7fd556Colin Walters DBusMessageRealIter *real = (DBusMessageRealIter *)iter; 190561411a061c09def43687153e6c734ff27b7fd556Colin Walters 190661411a061c09def43687153e6c734ff27b7fd556Colin Walters _dbus_return_val_if_fail (_dbus_message_iter_check (real), NULL); 190761411a061c09def43687153e6c734ff27b7fd556Colin Walters 190861411a061c09def43687153e6c734ff27b7fd556Colin Walters if (!_dbus_string_init (&retstr)) 190961411a061c09def43687153e6c734ff27b7fd556Colin Walters return NULL; 191061411a061c09def43687153e6c734ff27b7fd556Colin Walters 191161411a061c09def43687153e6c734ff27b7fd556Colin Walters _dbus_type_reader_get_signature (&real->u.reader, &sig, 191261411a061c09def43687153e6c734ff27b7fd556Colin Walters &start, &len); 191361411a061c09def43687153e6c734ff27b7fd556Colin Walters if (!_dbus_string_append_len (&retstr, 191461411a061c09def43687153e6c734ff27b7fd556Colin Walters _dbus_string_get_const_data (sig) + start, 191561411a061c09def43687153e6c734ff27b7fd556Colin Walters len)) 191661411a061c09def43687153e6c734ff27b7fd556Colin Walters return NULL; 191761411a061c09def43687153e6c734ff27b7fd556Colin Walters if (!_dbus_string_steal_data (&retstr, &ret)) 191861411a061c09def43687153e6c734ff27b7fd556Colin Walters return NULL; 191961411a061c09def43687153e6c734ff27b7fd556Colin Walters _dbus_string_free (&retstr); 192061411a061c09def43687153e6c734ff27b7fd556Colin Walters return ret; 192161411a061c09def43687153e6c734ff27b7fd556Colin Walters} 192261411a061c09def43687153e6c734ff27b7fd556Colin Walters 192361411a061c09def43687153e6c734ff27b7fd556Colin Walters/** 19249c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Reads a basic-typed value from the message iterator. 19259c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Basic types are the non-containers such as integer and string. 1926b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington * 19279c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * The value argument should be the address of a location to store 19289c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * the returned value. So for int32 it should be a "dbus_int32_t*" 19299c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * and for string a "const char**". The returned value is 19309c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * by reference and should not be freed. 1931b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington * 1932b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * Be sure you have somehow checked that 1933b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * dbus_message_iter_get_arg_type() matches the type you are 1934b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * expecting, or you'll crash when you try to use an integer as a 1935b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * string or something. 1936b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * 1937b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * To read any container type (array, struct, dict) you will need 1938b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * to recurse into the container with dbus_message_iter_recurse(). 1939b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * If the container is an array of fixed-length values, you can 1940b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * get all the array elements at once with 1941b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * dbus_message_iter_get_fixed_array(). Otherwise, you have to 1942b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * iterate over the container's contents one value at a time. 1943b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * 1944b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * All basic-typed values are guaranteed to fit in 8 bytes. So you can 19459c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * write code like this: 19469c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 19479c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @code 19489c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * dbus_uint64_t value; 19499c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * int type; 19509c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * dbus_message_iter_get_basic (&read_iter, &value); 19519c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * type = dbus_message_iter_get_arg_type (&read_iter); 19529c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * dbus_message_iter_append_basic (&write_iter, type, &value); 19539c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @endcode 19549c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 1955b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * On some really obscure platforms dbus_uint64_t might not exist, if 1956b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * you need to worry about this you will know. dbus_uint64_t is just 1957afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * one example of a type that's large enough to hold any possible 1958b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * value, you could use a struct or char[8] instead if you like. 19599c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 19609c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param iter the iterator 19619c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param value location to store the value 1962b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington */ 19639c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonvoid 19649c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_iter_get_basic (DBusMessageIter *iter, 19659c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington void *value) 1966b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington{ 19679c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusMessageRealIter *real = (DBusMessageRealIter *)iter; 19689c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 19699c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_if_fail (_dbus_message_iter_check (real)); 19709c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_if_fail (value != NULL); 19719c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 19729c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_type_reader_read_basic (&real->u.reader, 19739c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington value); 1974b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington} 1975b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington 1976b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington/** 1977afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * Returns the number of bytes in the array as marshaled in the wire 1978afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * protocol. The iterator must currently be inside an array-typed 1979afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * value. 1980afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 1981afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * This function is deprecated on the grounds that it is stupid. Why 1982afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * would you want to know how many bytes are in the array as marshaled 1983afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * in the wire protocol? For now, use the n_elements returned from 1984afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * dbus_message_iter_get_fixed_array() instead, or iterate over the 1985afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * array values and count them. 198661411a061c09def43687153e6c734ff27b7fd556Colin Walters * 1987afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * @todo introduce a variant of this get_n_elements that returns 1988afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * the number of elements, though with a non-fixed array it will not 1989afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * be very efficient, so maybe it's not good. 1990afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 199161411a061c09def43687153e6c734ff27b7fd556Colin Walters * @param iter the iterator 1992afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * @returns the number of bytes in the array 199361411a061c09def43687153e6c734ff27b7fd556Colin Walters */ 199461411a061c09def43687153e6c734ff27b7fd556Colin Waltersint 199561411a061c09def43687153e6c734ff27b7fd556Colin Waltersdbus_message_iter_get_array_len (DBusMessageIter *iter) 199661411a061c09def43687153e6c734ff27b7fd556Colin Walters{ 199761411a061c09def43687153e6c734ff27b7fd556Colin Walters DBusMessageRealIter *real = (DBusMessageRealIter *)iter; 199861411a061c09def43687153e6c734ff27b7fd556Colin Walters 199961411a061c09def43687153e6c734ff27b7fd556Colin Walters _dbus_return_val_if_fail (_dbus_message_iter_check (real), 0); 200061411a061c09def43687153e6c734ff27b7fd556Colin Walters 200161411a061c09def43687153e6c734ff27b7fd556Colin Walters return _dbus_type_reader_get_array_length (&real->u.reader); 200261411a061c09def43687153e6c734ff27b7fd556Colin Walters} 200361411a061c09def43687153e6c734ff27b7fd556Colin Walters 200461411a061c09def43687153e6c734ff27b7fd556Colin Walters/** 20059c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Reads a block of fixed-length values from the message iterator. 20069c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Fixed-length values are those basic types that are not string-like, 2007b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * such as integers, bool, double. The returned block will be from the 20089c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * current position in the array until the end of the array. 2009b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington * 2010b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * The message iter should be "in" the array (that is, you recurse into the 2011b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * array, and then you call dbus_message_iter_get_fixed_array() on the 2012b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * "sub-iterator" created by dbus_message_iter_recurse()). 201374b1b35402f6b9bbc09999a6224dfc04bc48b2a9Colin Walters * 20149c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * The value argument should be the address of a location to store the 20159c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * returned array. So for int32 it should be a "const dbus_int32_t**" 20169c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * The returned value is by reference and should not be freed. 2017b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * 2018b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * This function should only be used if dbus_type_is_fixed() returns 2019b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * #TRUE for the element type. 2020b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington * 2021b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * If an array's elements are not fixed in size, you have to recurse 2022b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * into the array with dbus_message_iter_recurse() and read the 2023b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * elements one by one. 2024b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * 2025b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * Because the array is not copied, this function runs in constant 2026b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * time and is fast; it's much preferred over walking the entire array 2027b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * with an iterator. (However, you can always use 2028b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * dbus_message_iter_recurse(), even for fixed-length types; 2029b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * dbus_message_iter_get_fixed_array() is just an optimization.) 2030afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 20319c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param iter the iterator 20329c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param value location to store the block 20339c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param n_elements number of elements in the block 2034b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington */ 20359c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonvoid 20369c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_iter_get_fixed_array (DBusMessageIter *iter, 20379c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington void *value, 20389c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington int *n_elements) 2039b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington{ 20409c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusMessageRealIter *real = (DBusMessageRealIter *)iter; 20410d0642b31b9bac2546f9fa2c6bdc55b5ced0b7adRobert McQueen int subtype = _dbus_type_reader_get_current_type(&real->u.reader); 2042b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington 20439c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_if_fail (_dbus_message_iter_check (real)); 20449c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_if_fail (value != NULL); 20450d0642b31b9bac2546f9fa2c6bdc55b5ced0b7adRobert McQueen _dbus_return_if_fail ((subtype == DBUS_TYPE_INVALID) || 20460d0642b31b9bac2546f9fa2c6bdc55b5ced0b7adRobert McQueen dbus_type_is_fixed (subtype)); 2047b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington 20489c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_type_reader_read_fixed_multi (&real->u.reader, 20499c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington value, n_elements); 20501b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson} 20511b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson 20521b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson/** 20539c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Initializes a #DBusMessageIter for appending arguments to the end 20549c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * of a message. 2055632d54e0dbf5e405258be7afffbaa48942c06cbcOwen Fraser-Green * 20569c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @todo If appending any of the arguments fails due to lack of 2057afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * memory, the message is hosed and you have to start over building 2058afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * the whole message. 2059632d54e0dbf5e405258be7afffbaa48942c06cbcOwen Fraser-Green * 20609c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param message the message 20619c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param iter pointer to an iterator to initialize 2062632d54e0dbf5e405258be7afffbaa48942c06cbcOwen Fraser-Green */ 20639c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonvoid 206431988af4089f3793940417535f8eabaae1ac26c8Havoc Penningtondbus_message_iter_init_append (DBusMessage *message, 20659c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusMessageIter *iter) 2066632d54e0dbf5e405258be7afffbaa48942c06cbcOwen Fraser-Green{ 2067632d54e0dbf5e405258be7afffbaa48942c06cbcOwen Fraser-Green DBusMessageRealIter *real = (DBusMessageRealIter *)iter; 2068632d54e0dbf5e405258be7afffbaa48942c06cbcOwen Fraser-Green 20699c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_if_fail (message != NULL); 20709c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_if_fail (iter != NULL); 2071632d54e0dbf5e405258be7afffbaa48942c06cbcOwen Fraser-Green 20729c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_message_iter_init_common (message, real, 20739c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_MESSAGE_ITER_TYPE_WRITER); 20749c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 20759c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington /* We create the signature string and point iterators at it "on demand" 20769c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * when a value is actually appended. That means that init() never fails 20779c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * due to OOM. 20789c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington */ 20799c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_type_writer_init_types_delayed (&real->u.writer, 20809c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington message->byte_order, 20819c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington &message->body, 20829c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_string_get_length (&message->body)); 2083632d54e0dbf5e405258be7afffbaa48942c06cbcOwen Fraser-Green} 2084632d54e0dbf5e405258be7afffbaa48942c06cbcOwen Fraser-Green 2085632d54e0dbf5e405258be7afffbaa48942c06cbcOwen Fraser-Green/** 20869c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Creates a temporary signature string containing the current 20879c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * signature, stores it in the iterator, and points the iterator to 20889c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * the end of it. Used any time we write to the message. 20899c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 20909c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param real an iterator without a type_str 20919c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns #FALSE if no memory 20921b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson */ 20939c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonstatic dbus_bool_t 20949c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington_dbus_message_iter_open_signature (DBusMessageRealIter *real) 20951b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson{ 20969c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusString *str; 20979c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const DBusString *current_sig; 20989c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington int current_sig_pos; 20999c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 21009c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_assert (real->iter_type == DBUS_MESSAGE_ITER_TYPE_WRITER); 2101c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson 21029c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (real->u.writer.type_str != NULL) 21039c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington { 21049c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_assert (real->sig_refcount > 0); 21059c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington real->sig_refcount += 1; 21069c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return TRUE; 21079c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington } 2108c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson 21099c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington str = dbus_new (DBusString, 1); 21109c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (str == NULL) 2111c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson return FALSE; 21129c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 21139c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!_dbus_header_get_field_raw (&real->message->header, 21149c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_HEADER_FIELD_SIGNATURE, 21159c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington ¤t_sig, ¤t_sig_pos)) 21169c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington current_sig = NULL; 21179c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 21189c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (current_sig) 2119c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson { 21209c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington int current_len; 21219c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 21229c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington current_len = _dbus_string_get_byte (current_sig, current_sig_pos); 21239c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington current_sig_pos += 1; /* move on to sig data */ 21249c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 21259c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!_dbus_string_init_preallocated (str, current_len + 4)) 21269c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington { 21279c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_free (str); 21289c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return FALSE; 21299c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington } 21309c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 21319c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!_dbus_string_copy_len (current_sig, current_sig_pos, current_len, 21329c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington str, 0)) 21339c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington { 21349c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_string_free (str); 21359c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_free (str); 21369c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return FALSE; 21379c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington } 2138c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson } 21399c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington else 2140c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson { 21419c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!_dbus_string_init_preallocated (str, 4)) 21429c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington { 21439c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_free (str); 21449c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return FALSE; 21459c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington } 2146c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson } 2147c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson 21489c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington real->sig_refcount = 1; 21499c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 21509c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_type_writer_add_types (&real->u.writer, 21519c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington str, _dbus_string_get_length (str)); 2152c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson return TRUE; 21531b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson} 21541b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson 21551b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson/** 21569c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Sets the new signature as the message signature, frees the 21579c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * signature string, and marks the iterator as not having a type_str 21589c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * anymore. Frees the signature even if it fails, so you can't 21599c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * really recover from failure. Kinda busted. 21601b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson * 21619c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param real an iterator without a type_str 21629c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns #FALSE if no memory 21631b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson */ 21649c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonstatic dbus_bool_t 21659c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington_dbus_message_iter_close_signature (DBusMessageRealIter *real) 21661b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson{ 21679c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusString *str; 21689c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *v_STRING; 21699c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_bool_t retval; 2170c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson 21719c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_assert (real->iter_type == DBUS_MESSAGE_ITER_TYPE_WRITER); 21729c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_assert (real->u.writer.type_str != NULL); 21739c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_assert (real->sig_refcount > 0); 2174c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson 21759c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington real->sig_refcount -= 1; 21761b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson 21779c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (real->sig_refcount > 0) 2178e84c3a03b3be9cfc351ca8e0b9b935cca455e672Alexander Larsson return TRUE; 21799c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_assert (real->sig_refcount == 0); 2180e84c3a03b3be9cfc351ca8e0b9b935cca455e672Alexander Larsson 21819c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington retval = TRUE; 2182e84c3a03b3be9cfc351ca8e0b9b935cca455e672Alexander Larsson 21839c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington str = real->u.writer.type_str; 2184e84c3a03b3be9cfc351ca8e0b9b935cca455e672Alexander Larsson 21859c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington v_STRING = _dbus_string_get_const_data (str); 21869c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!_dbus_header_set_field_basic (&real->message->header, 21879c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_HEADER_FIELD_SIGNATURE, 21889c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_TYPE_SIGNATURE, 21899c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington &v_STRING)) 21909c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington retval = FALSE; 2191e84c3a03b3be9cfc351ca8e0b9b935cca455e672Alexander Larsson 21929c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_type_writer_remove_types (&real->u.writer); 21939c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_string_free (str); 21949c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_free (str); 21959c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 21969c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return retval; 2197e84c3a03b3be9cfc351ca8e0b9b935cca455e672Alexander Larsson} 2198e84c3a03b3be9cfc351ca8e0b9b935cca455e672Alexander Larsson 21999c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington#ifndef DBUS_DISABLE_CHECKS 2200e84c3a03b3be9cfc351ca8e0b9b935cca455e672Alexander Larssonstatic dbus_bool_t 22019c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington_dbus_message_iter_append_check (DBusMessageRealIter *iter) 2202e84c3a03b3be9cfc351ca8e0b9b935cca455e672Alexander Larsson{ 22039c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!_dbus_message_iter_check (iter)) 2204e84c3a03b3be9cfc351ca8e0b9b935cca455e672Alexander Larsson return FALSE; 220556cc4ae1a241d36b64dbe26de89714f7771f6e78Havoc Pennington 22069c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (iter->message->locked) 22079c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington { 2208afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington _dbus_warn_check_failed ("dbus append iterator can't be used: message is locked (has already been sent)\n"); 22099c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return FALSE; 2210e84c3a03b3be9cfc351ca8e0b9b935cca455e672Alexander Larsson } 2211e84c3a03b3be9cfc351ca8e0b9b935cca455e672Alexander Larsson 2212e84c3a03b3be9cfc351ca8e0b9b935cca455e672Alexander Larsson return TRUE; 2213e84c3a03b3be9cfc351ca8e0b9b935cca455e672Alexander Larsson} 22149c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington#endif /* DBUS_DISABLE_CHECKS */ 2215e84c3a03b3be9cfc351ca8e0b9b935cca455e672Alexander Larsson 22161b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson/** 22179c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Appends a basic-typed value to the message. The basic types are the 22189c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * non-container types such as integer and string. 22191b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson * 22209c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * The "value" argument should be the address of a basic-typed value. 22219c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * So for string, const char**. For integer, dbus_int32_t*. 22229c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 22239c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @todo If this fails due to lack of memory, the message is hosed and 22249c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * you have to start over building the whole message. 22259c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 22269c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param iter the append iterator 22279c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param type the type of the value 22289c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param value the address of the value 22299c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns #FALSE if not enough memory 22301b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson */ 2231c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larssondbus_bool_t 22329c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_iter_append_basic (DBusMessageIter *iter, 22339c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington int type, 22349c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const void *value) 22351b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson{ 2236c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson DBusMessageRealIter *real = (DBusMessageRealIter *)iter; 22379c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_bool_t ret; 2238c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson 22399c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (_dbus_message_iter_append_check (real), FALSE); 22409c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (real->iter_type == DBUS_MESSAGE_ITER_TYPE_WRITER, FALSE); 224154a2e9f7961b4b8afff94bb0c5b756f986965be6Colin Walters _dbus_return_val_if_fail (dbus_type_is_basic (type), FALSE); 22429c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (value != NULL, FALSE); 2243e84c3a03b3be9cfc351ca8e0b9b935cca455e672Alexander Larsson 22449c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!_dbus_message_iter_open_signature (real)) 2245e84c3a03b3be9cfc351ca8e0b9b935cca455e672Alexander Larsson return FALSE; 2246c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson 22479c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington ret = _dbus_type_writer_write_basic (&real->u.writer, type, value); 2248c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson 22499c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!_dbus_message_iter_close_signature (real)) 22509c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington ret = FALSE; 22519c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 22529c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return ret; 22531b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson} 22541b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson 2255502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington/** 22569c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Appends a block of fixed-length values to an array. The 22579c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * fixed-length types are all basic types that are not string-like. So 22589c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * int32, double, bool, etc. You must call 22599c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * dbus_message_iter_open_container() to open an array of values 22609c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * before calling this function. You may call this function multiple 22619c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * times (and intermixed with calls to 22629c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * dbus_message_iter_append_basic()) for the same array. 2263c8769e0b1dde3f1c4ad40cd10dd89c284ecc672bAnders Carlsson * 22649c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * The "value" argument should be the address of the array. So for 22659c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * integer, "dbus_int32_t**" is expected for example. 22669c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 22679c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @warning in C, given "int array[]", "&array == array" (the 22689c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * comp.lang.c FAQ says otherwise, but gcc and the FAQ don't agree). 22699c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * So if you're using an array instead of a pointer you have to create 22709c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * a pointer variable, assign the array to it, then take the address 22719c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * of the pointer variable. 22729c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @code 22739c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * const dbus_int32_t array[] = { 1, 2, 3 }; 22749c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * const dbus_int32_t *v_ARRAY = array; 22759c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * if (!dbus_message_iter_append_fixed_array (&iter, DBUS_TYPE_INT32, &v_ARRAY, 3)) 22769c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * fprintf (stderr, "No memory!\n"); 22779c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @endcode 22789c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * For strings it works to write const char *array = "Hello" and then 22799c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * use &array though. 22809c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 22819c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @todo If this fails due to lack of memory, the message is hosed and 22829c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * you have to start over building the whole message. 22839c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 22849c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param iter the append iterator 228531988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington * @param element_type the type of the array elements 22869c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param value the address of the array 22879c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param n_elements the number of elements to append 22889c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns #FALSE if not enough memory 2289c8769e0b1dde3f1c4ad40cd10dd89c284ecc672bAnders Carlsson */ 2290c8769e0b1dde3f1c4ad40cd10dd89c284ecc672bAnders Carlssondbus_bool_t 22919c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_iter_append_fixed_array (DBusMessageIter *iter, 22929c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington int element_type, 22939c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const void *value, 22949c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington int n_elements) 22950123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks{ 22960123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks DBusMessageRealIter *real = (DBusMessageRealIter *)iter; 22979c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_bool_t ret; 22989c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 22999c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (_dbus_message_iter_append_check (real), FALSE); 23009c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (real->iter_type == DBUS_MESSAGE_ITER_TYPE_WRITER, FALSE); 230174b1b35402f6b9bbc09999a6224dfc04bc48b2a9Colin Walters _dbus_return_val_if_fail (dbus_type_is_fixed (element_type), FALSE); 23029c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (real->u.writer.container_type == DBUS_TYPE_ARRAY, FALSE); 23039c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (value != NULL, FALSE); 23049c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (n_elements >= 0, FALSE); 23059c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (n_elements <= 23069c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_MAXIMUM_ARRAY_LENGTH / _dbus_type_get_alignment (element_type), 23079c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington FALSE); 23089c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 23099c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington ret = _dbus_type_writer_write_fixed_multi (&real->u.writer, element_type, value, n_elements); 23109c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 23119c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return ret; 23129c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington} 23139c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 23149c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington/** 23159c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Appends a container-typed value to the message; you are required to 23169c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * append the contents of the container using the returned 23179c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * sub-iterator, and then call 23189c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * dbus_message_iter_close_container(). Container types are for 23199c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * example struct, variant, and array. For variants, the 23209c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * contained_signature should be the type of the single value inside 2321c7816d45e82ba8dd7e1e969c2cb6c3a27577cf68Havoc Pennington * the variant. For structs and dict entries, contained_signature 2322c7816d45e82ba8dd7e1e969c2cb6c3a27577cf68Havoc Pennington * should be #NULL; it will be set to whatever types you write into 2323c7816d45e82ba8dd7e1e969c2cb6c3a27577cf68Havoc Pennington * the struct. For arrays, contained_signature should be the type of 2324c7816d45e82ba8dd7e1e969c2cb6c3a27577cf68Havoc Pennington * the array elements. 23259c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 23269c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @todo If this fails due to lack of memory, the message is hosed and 23279c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * you have to start over building the whole message. 23289c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 23299c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param iter the append iterator 23309c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param type the type of the value 23319c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param contained_signature the type of container contents 23329c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param sub sub-iterator to initialize 23339c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns #FALSE if not enough memory 23349c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington */ 23359c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_bool_t 23369c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_iter_open_container (DBusMessageIter *iter, 23379c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington int type, 23389c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *contained_signature, 23399c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusMessageIter *sub) 23400123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks{ 23410123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks DBusMessageRealIter *real = (DBusMessageRealIter *)iter; 23429c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusMessageRealIter *real_sub = (DBusMessageRealIter *)sub; 23439c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusString contained_str; 23449c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 23459c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (_dbus_message_iter_append_check (real), FALSE); 23469c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (real->iter_type == DBUS_MESSAGE_ITER_TYPE_WRITER, FALSE); 234754a2e9f7961b4b8afff94bb0c5b756f986965be6Colin Walters _dbus_return_val_if_fail (dbus_type_is_container (type), FALSE); 23489c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (sub != NULL, FALSE); 23499c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail ((type == DBUS_TYPE_STRUCT && 23509c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington contained_signature == NULL) || 2351c7816d45e82ba8dd7e1e969c2cb6c3a27577cf68Havoc Pennington (type == DBUS_TYPE_DICT_ENTRY && 2352c7816d45e82ba8dd7e1e969c2cb6c3a27577cf68Havoc Pennington contained_signature == NULL) || 235315a610bc4c87d389463112ef0ad4fde195af83caHavoc Pennington (type == DBUS_TYPE_VARIANT && 235415a610bc4c87d389463112ef0ad4fde195af83caHavoc Pennington contained_signature != NULL) || 235515a610bc4c87d389463112ef0ad4fde195af83caHavoc Pennington (type == DBUS_TYPE_ARRAY && 235615a610bc4c87d389463112ef0ad4fde195af83caHavoc Pennington contained_signature != NULL), FALSE); 2357c7816d45e82ba8dd7e1e969c2cb6c3a27577cf68Havoc Pennington 235815a610bc4c87d389463112ef0ad4fde195af83caHavoc Pennington /* this would fail if the contained_signature is a dict entry, since 235915a610bc4c87d389463112ef0ad4fde195af83caHavoc Pennington * dict entries are invalid signatures standalone (they must be in 2360c7816d45e82ba8dd7e1e969c2cb6c3a27577cf68Havoc Pennington * an array) 2361c7816d45e82ba8dd7e1e969c2cb6c3a27577cf68Havoc Pennington */ 236262f09b8bc6ca258a54a316b452d28f1c590d51c1Havoc Pennington _dbus_return_val_if_fail ((type == DBUS_TYPE_ARRAY && contained_signature && *contained_signature == DBUS_DICT_ENTRY_BEGIN_CHAR) || 236315a610bc4c87d389463112ef0ad4fde195af83caHavoc Pennington (contained_signature == NULL || 236415a610bc4c87d389463112ef0ad4fde195af83caHavoc Pennington _dbus_check_is_valid_signature (contained_signature)), 236515a610bc4c87d389463112ef0ad4fde195af83caHavoc Pennington FALSE); 23669c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 23679c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!_dbus_message_iter_open_signature (real)) 23680123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks return FALSE; 23690123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks 23709c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington *real_sub = *real; 23718fda602e991990d21f196e65d917a481c6ec1360John (J 23728fda602e991990d21f196e65d917a481c6ec1360John (J if (contained_signature != NULL) 23738fda602e991990d21f196e65d917a481c6ec1360John (J { 23748fda602e991990d21f196e65d917a481c6ec1360John (J _dbus_string_init_const (&contained_str, contained_signature); 23758fda602e991990d21f196e65d917a481c6ec1360John (J 23768fda602e991990d21f196e65d917a481c6ec1360John (J return _dbus_type_writer_recurse (&real->u.writer, 23778fda602e991990d21f196e65d917a481c6ec1360John (J type, 23788fda602e991990d21f196e65d917a481c6ec1360John (J &contained_str, 0, 23798fda602e991990d21f196e65d917a481c6ec1360John (J &real_sub->u.writer); 23808fda602e991990d21f196e65d917a481c6ec1360John (J } 23818fda602e991990d21f196e65d917a481c6ec1360John (J else 23828fda602e991990d21f196e65d917a481c6ec1360John (J { 23838fda602e991990d21f196e65d917a481c6ec1360John (J return _dbus_type_writer_recurse (&real->u.writer, 23848fda602e991990d21f196e65d917a481c6ec1360John (J type, 23858fda602e991990d21f196e65d917a481c6ec1360John (J NULL, 0, 23868fda602e991990d21f196e65d917a481c6ec1360John (J &real_sub->u.writer); 23878fda602e991990d21f196e65d917a481c6ec1360John (J } 23880123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks} 23890123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks 23900123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks 23910123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks/** 23929c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Closes a container-typed value appended to the message; may write 23939c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * out more information to the message known only after the entire 23949c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * container is written, and may free resources created by 23959c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * dbus_message_iter_open_container(). 23960123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks * 23979c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @todo If this fails due to lack of memory, the message is hosed and 23989c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * you have to start over building the whole message. 23999c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 24009c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param iter the append iterator 24019c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param sub sub-iterator to close 24029c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns #FALSE if not enough memory 24030123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks */ 24040123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeksdbus_bool_t 24059c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_iter_close_container (DBusMessageIter *iter, 24069c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusMessageIter *sub) 2407c8769e0b1dde3f1c4ad40cd10dd89c284ecc672bAnders Carlsson{ 24089c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusMessageRealIter *real = (DBusMessageRealIter *)iter; 24099c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusMessageRealIter *real_sub = (DBusMessageRealIter *)sub; 24109c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_bool_t ret; 2411c8769e0b1dde3f1c4ad40cd10dd89c284ecc672bAnders Carlsson 24129c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (_dbus_message_iter_append_check (real), FALSE); 24139c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (real->iter_type == DBUS_MESSAGE_ITER_TYPE_WRITER, FALSE); 24149c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (_dbus_message_iter_append_check (real_sub), FALSE); 24159c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (real_sub->iter_type == DBUS_MESSAGE_ITER_TYPE_WRITER, FALSE); 2416c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson 24179c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington ret = _dbus_type_writer_unrecurse (&real->u.writer, 24189c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington &real_sub->u.writer); 24190123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks 24209c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!_dbus_message_iter_close_signature (real)) 24219c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington ret = FALSE; 2422c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson 24239c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return ret; 24249c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington} 2425c8769e0b1dde3f1c4ad40cd10dd89c284ecc672bAnders Carlsson 24269c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington/** 24279c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Sets a flag indicating that the message does not want a reply; if 24289c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * this flag is set, the other end of the connection may (but is not 24299c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * required to) optimize by not sending method return or error 24309c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * replies. If this flag is set, there is no way to know whether the 24319c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * message successfully arrived at the remote end. Normally you know a 24329c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * message was received when you receive the reply to it. 24339c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 2434afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * The flag is #FALSE by default, that is by default the other end is 2435afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * required to reply. 2436afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 2437afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * On the protocol level this toggles #DBUS_HEADER_FLAG_NO_REPLY_EXPECTED 2438afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 24399c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param message the message 24409c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param no_reply #TRUE if no reply is desired 24419c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington */ 24429c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonvoid 24439c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_set_no_reply (DBusMessage *message, 24449c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_bool_t no_reply) 24459c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington{ 24469c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_if_fail (message != NULL); 24479c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_if_fail (!message->locked); 24489c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 24499c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_header_toggle_flag (&message->header, 24509c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_HEADER_FLAG_NO_REPLY_EXPECTED, 24519c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington no_reply); 24520123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks} 2453c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson 2454c8769e0b1dde3f1c4ad40cd10dd89c284ecc672bAnders Carlsson/** 24559c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Returns #TRUE if the message does not expect 24569c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * a reply. 2457babdabd40c98a1a5db93e5315bf0b2609e73f426Anders Carlsson * 24589c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param message the message 24599c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns #TRUE if the message sender isn't waiting for a reply 2460babdabd40c98a1a5db93e5315bf0b2609e73f426Anders Carlsson */ 2461babdabd40c98a1a5db93e5315bf0b2609e73f426Anders Carlssondbus_bool_t 24629c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_get_no_reply (DBusMessage *message) 2463babdabd40c98a1a5db93e5315bf0b2609e73f426Anders Carlsson{ 24649c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (message != NULL, FALSE); 24659c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 24669c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return _dbus_header_get_flag (&message->header, 24679c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_HEADER_FLAG_NO_REPLY_EXPECTED); 2468babdabd40c98a1a5db93e5315bf0b2609e73f426Anders Carlsson} 2469babdabd40c98a1a5db93e5315bf0b2609e73f426Anders Carlsson 2470babdabd40c98a1a5db93e5315bf0b2609e73f426Anders Carlsson/** 24718873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * Sets a flag indicating that an owner for the destination name will 24728873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * be automatically started before the message is delivered. When this 24738873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * flag is set, the message is held until a name owner finishes 24748873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * starting up, or fails to start up. In case of failure, the reply 24758873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * will be an error. 2476babdabd40c98a1a5db93e5315bf0b2609e73f426Anders Carlsson * 2477afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * The flag is set to #TRUE by default, i.e. auto starting is the default. 2478afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 2479afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * On the protocol level this toggles #DBUS_HEADER_FLAG_NO_AUTO_START 2480afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 24819c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param message the message 24828873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * @param auto_start #TRUE if auto-starting is desired 2483babdabd40c98a1a5db93e5315bf0b2609e73f426Anders Carlsson */ 24849c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonvoid 24858873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Penningtondbus_message_set_auto_start (DBusMessage *message, 24868873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington dbus_bool_t auto_start) 2487babdabd40c98a1a5db93e5315bf0b2609e73f426Anders Carlsson{ 24889c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_if_fail (message != NULL); 24899c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_if_fail (!message->locked); 24909c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 24919c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_header_toggle_flag (&message->header, 2492f5cf675641e63cefc36c8a9a7a5872cc8600abcdHavoc Pennington DBUS_HEADER_FLAG_NO_AUTO_START, 2493f5cf675641e63cefc36c8a9a7a5872cc8600abcdHavoc Pennington !auto_start); 2494babdabd40c98a1a5db93e5315bf0b2609e73f426Anders Carlsson} 2495babdabd40c98a1a5db93e5315bf0b2609e73f426Anders Carlsson 2496babdabd40c98a1a5db93e5315bf0b2609e73f426Anders Carlsson/** 24978873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * Returns #TRUE if the message will cause an owner for 24988873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * destination name to be auto-started. 2499babdabd40c98a1a5db93e5315bf0b2609e73f426Anders Carlsson * 25009c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param message the message 25018873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * @returns #TRUE if the message will use auto-start 2502babdabd40c98a1a5db93e5315bf0b2609e73f426Anders Carlsson */ 2503babdabd40c98a1a5db93e5315bf0b2609e73f426Anders Carlssondbus_bool_t 25048873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Penningtondbus_message_get_auto_start (DBusMessage *message) 2505babdabd40c98a1a5db93e5315bf0b2609e73f426Anders Carlsson{ 25069c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (message != NULL, FALSE); 25079c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 2508f5cf675641e63cefc36c8a9a7a5872cc8600abcdHavoc Pennington return !_dbus_header_get_flag (&message->header, 2509f5cf675641e63cefc36c8a9a7a5872cc8600abcdHavoc Pennington DBUS_HEADER_FLAG_NO_AUTO_START); 2510babdabd40c98a1a5db93e5315bf0b2609e73f426Anders Carlsson} 2511babdabd40c98a1a5db93e5315bf0b2609e73f426Anders Carlsson 2512b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington 2513b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington/** 25149c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Sets the object path this message is being sent to (for 25159c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * DBUS_MESSAGE_TYPE_METHOD_CALL) or the one a signal is being 25169c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * emitted from (for DBUS_MESSAGE_TYPE_SIGNAL). 2517b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington * 2518afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * The path must contain only valid characters as defined 2519afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * in the D-Bus specification. 2520afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 25219c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param message the message 25229c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param object_path the path or #NULL to unset 25239c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns #FALSE if not enough memory 2524b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington */ 2525b29d0c534a631b211f1f94168e7672c604c8f815Havoc Penningtondbus_bool_t 25269c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_set_path (DBusMessage *message, 25279c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *object_path) 2528b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington{ 25299c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (message != NULL, FALSE); 25309c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (!message->locked, FALSE); 25319c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (object_path == NULL || 25329c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_check_is_valid_path (object_path), 25339c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington FALSE); 25349c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 25359c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return set_or_delete_string_field (message, 25369c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_HEADER_FIELD_PATH, 25379c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_TYPE_OBJECT_PATH, 25389c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington object_path); 2539b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington} 2540b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington 2541b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington/** 25429c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Gets the object path this message is being sent to (for 25439c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * DBUS_MESSAGE_TYPE_METHOD_CALL) or being emitted from (for 25449c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * DBUS_MESSAGE_TYPE_SIGNAL). Returns #NULL if none. 2545b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington * 2546afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * See also dbus_message_get_path_decomposed(). 2547afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 2548afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * The returned string becomes invalid if the message is 2549afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * modified, since it points into the wire-marshaled message data. 2550afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 25519c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param message the message 25529c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns the path (should not be freed) or #NULL 2553b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington */ 25549c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonconst char* 25559c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_get_path (DBusMessage *message) 2556b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington{ 25579c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *v; 25589c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 25599c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (message != NULL, NULL); 25609c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 25619c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington v = NULL; /* in case field doesn't exist */ 25629c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_header_get_field_basic (&message->header, 25639c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_HEADER_FIELD_PATH, 25649c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_TYPE_OBJECT_PATH, 25659c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington &v); 25669c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return v; 2567b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington} 2568b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington 2569babdabd40c98a1a5db93e5315bf0b2609e73f426Anders Carlsson/** 2570afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * Checks if the message has a particular object path. The object 2571afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * path is the destination object for a method call or the emitting 2572afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * object for a signal. 2573a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J * 2574a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J * @param message the message 2575cb81ac7edeb97f9f97ace8c990c5fdcb3c991345Havoc Pennington * @param path the path name 2576a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J * @returns #TRUE if there is a path field in the header 2577a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J */ 2578a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (Jdbus_bool_t 2579a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (Jdbus_message_has_path (DBusMessage *message, 2580a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J const char *path) 2581a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J{ 2582a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J const char *msg_path; 2583a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J msg_path = dbus_message_get_path (message); 2584a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J 2585a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J if (msg_path == NULL) 2586a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J { 2587a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J if (path == NULL) 2588a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J return TRUE; 2589a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J else 2590a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J return FALSE; 2591a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J } 2592a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J 2593a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J if (path == NULL) 2594a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J return FALSE; 2595a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J 2596a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J if (strcmp (msg_path, path) == 0) 2597a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J return TRUE; 2598a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J 2599a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J return FALSE; 2600a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J} 2601a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J 2602a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J/** 26039c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Gets the object path this message is being sent to 26049c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * (for DBUS_MESSAGE_TYPE_METHOD_CALL) or being emitted 26059c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * from (for DBUS_MESSAGE_TYPE_SIGNAL) in a decomposed 26069c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * format (one array element per path component). 26079c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Free the returned array with dbus_free_string_array(). 2608502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington * 26099c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * An empty but non-NULL path array means the path "/". 26109c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * So the path "/foo/bar" becomes { "foo", "bar", NULL } 26119c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * and the path "/" becomes { NULL }. 26129c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 2613afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * See also dbus_message_get_path(). 2614afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 26159c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @todo this could be optimized by using the len from the message 26169c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * instead of calling strlen() again 26179c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 26189c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param message the message 26199c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param path place to store allocated array of path components; #NULL set here if no path field exists 26209c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns #FALSE if no memory to allocate the array 2621502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington */ 2622babdabd40c98a1a5db93e5315bf0b2609e73f426Anders Carlssondbus_bool_t 26239c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_get_path_decomposed (DBusMessage *message, 26249c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington char ***path) 2625000d29a283b06517f0cfb599516a390e3afbf25cAnders Carlsson{ 26269c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *v; 26279c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 26289c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (message != NULL, FALSE); 26299c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (path != NULL, FALSE); 26309c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 26319c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington *path = NULL; 26329c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 26339c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington v = dbus_message_get_path (message); 26349c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (v != NULL) 26359c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington { 26369c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!_dbus_decompose_path (v, strlen (v), 26379c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington path, NULL)) 26389c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return FALSE; 26399c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington } 26409c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return TRUE; 2641000d29a283b06517f0cfb599516a390e3afbf25cAnders Carlsson} 2642000d29a283b06517f0cfb599516a390e3afbf25cAnders Carlsson 2643dc6a61a15b2d9cdc6504753fa9eb0a718f99d6d8Anders Carlsson/** 26449c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Sets the interface this message is being sent to 26459c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * (for DBUS_MESSAGE_TYPE_METHOD_CALL) or 26469c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * the interface a signal is being emitted from 26479c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * (for DBUS_MESSAGE_TYPE_SIGNAL). 26486c07098c5ec68e78320a6f07e4c9e141a95729edHavoc Pennington * 2649afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * The interface name must contain only valid characters as defined 2650afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * in the D-Bus specification. 2651afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 26529c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param message the message 26539c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param interface the interface or #NULL to unset 26549c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns #FALSE if not enough memory 2655dc6a61a15b2d9cdc6504753fa9eb0a718f99d6d8Anders Carlsson */ 2656babdabd40c98a1a5db93e5315bf0b2609e73f426Anders Carlssondbus_bool_t 26579c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_set_interface (DBusMessage *message, 26589c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *interface) 2659dc6a61a15b2d9cdc6504753fa9eb0a718f99d6d8Anders Carlsson{ 26609c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (message != NULL, FALSE); 26619c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (!message->locked, FALSE); 26629c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (interface == NULL || 26639c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_check_is_valid_interface (interface), 26649c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington FALSE); 26659c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 26669c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return set_or_delete_string_field (message, 26679c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_HEADER_FIELD_INTERFACE, 26689c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_TYPE_STRING, 26699c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington interface); 2670dc6a61a15b2d9cdc6504753fa9eb0a718f99d6d8Anders Carlsson} 2671dc6a61a15b2d9cdc6504753fa9eb0a718f99d6d8Anders Carlsson 2672dc6a61a15b2d9cdc6504753fa9eb0a718f99d6d8Anders Carlsson/** 26739c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Gets the interface this message is being sent to 26749c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * (for DBUS_MESSAGE_TYPE_METHOD_CALL) or being emitted 26759c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * from (for DBUS_MESSAGE_TYPE_SIGNAL). 26769c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * The interface name is fully-qualified (namespaced). 26779c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Returns #NULL if none. 2678799a3ff443f5357ae7857ebe989a7f92f7bd84dfAnders Carlsson * 2679afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * The returned string becomes invalid if the message is 2680afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * modified, since it points into the wire-marshaled message data. 2681afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 26829c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param message the message 26839c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns the message interface (should not be freed) or #NULL 2684799a3ff443f5357ae7857ebe989a7f92f7bd84dfAnders Carlsson */ 26859c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonconst char* 26869c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_get_interface (DBusMessage *message) 2687799a3ff443f5357ae7857ebe989a7f92f7bd84dfAnders Carlsson{ 26889c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *v; 2689c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson 26909c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (message != NULL, NULL); 2691799a3ff443f5357ae7857ebe989a7f92f7bd84dfAnders Carlsson 26929c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington v = NULL; /* in case field doesn't exist */ 26939c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_header_get_field_basic (&message->header, 26949c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_HEADER_FIELD_INTERFACE, 26959c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_TYPE_STRING, 26969c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington &v); 26979c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return v; 26989c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington} 26999c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 27009c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington/** 2701a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J * Checks if the message has an interface 2702a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J * 2703a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J * @param message the message 2704cb81ac7edeb97f9f97ace8c990c5fdcb3c991345Havoc Pennington * @param interface the interface name 2705afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * @returns #TRUE if the interface field in the header matches 2706a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J */ 2707a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (Jdbus_bool_t 2708a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (Jdbus_message_has_interface (DBusMessage *message, 2709a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J const char *interface) 2710a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J{ 2711a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J const char *msg_interface; 2712a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J msg_interface = dbus_message_get_interface (message); 2713a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J 2714a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J if (msg_interface == NULL) 2715a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J { 2716a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J if (interface == NULL) 2717a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J return TRUE; 2718a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J else 2719a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J return FALSE; 2720a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J } 2721a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J 2722a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J if (interface == NULL) 2723a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J return FALSE; 2724a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J 2725a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J if (strcmp (msg_interface, interface) == 0) 2726a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J return TRUE; 2727a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J 2728a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J return FALSE; 2729a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J 2730a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J} 2731a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J 2732a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J/** 27339c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Sets the interface member being invoked 27349c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * (DBUS_MESSAGE_TYPE_METHOD_CALL) or emitted 27359c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * (DBUS_MESSAGE_TYPE_SIGNAL). 2736afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 2737afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * The member name must contain only valid characters as defined 2738afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * in the D-Bus specification. 27399c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 27409c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param message the message 27419c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param member the member or #NULL to unset 27429c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns #FALSE if not enough memory 27439c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington */ 27449c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_bool_t 27459c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_set_member (DBusMessage *message, 27469c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *member) 27479c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington{ 27489c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (message != NULL, FALSE); 27499c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (!message->locked, FALSE); 27509c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (member == NULL || 27519c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_check_is_valid_member (member), 27529c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington FALSE); 2753c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson 27549c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return set_or_delete_string_field (message, 27559c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_HEADER_FIELD_MEMBER, 27569c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_TYPE_STRING, 27579c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington member); 2758799a3ff443f5357ae7857ebe989a7f92f7bd84dfAnders Carlsson} 2759799a3ff443f5357ae7857ebe989a7f92f7bd84dfAnders Carlsson 2760799a3ff443f5357ae7857ebe989a7f92f7bd84dfAnders Carlsson/** 27619c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Gets the interface member being invoked 27629c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * (DBUS_MESSAGE_TYPE_METHOD_CALL) or emitted 27639c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * (DBUS_MESSAGE_TYPE_SIGNAL). Returns #NULL if none. 2764632d54e0dbf5e405258be7afffbaa48942c06cbcOwen Fraser-Green * 2765afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * The returned string becomes invalid if the message is 2766afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * modified, since it points into the wire-marshaled message data. 2767afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 27689c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param message the message 27699c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns the member name (should not be freed) or #NULL 2770632d54e0dbf5e405258be7afffbaa48942c06cbcOwen Fraser-Green */ 27719c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonconst char* 27729c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_get_member (DBusMessage *message) 2773632d54e0dbf5e405258be7afffbaa48942c06cbcOwen Fraser-Green{ 27749c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *v; 2775632d54e0dbf5e405258be7afffbaa48942c06cbcOwen Fraser-Green 27769c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (message != NULL, NULL); 2777632d54e0dbf5e405258be7afffbaa48942c06cbcOwen Fraser-Green 27789c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington v = NULL; /* in case field doesn't exist */ 27799c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_header_get_field_basic (&message->header, 27809c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_HEADER_FIELD_MEMBER, 27819c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_TYPE_STRING, 27829c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington &v); 27839c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return v; 2784632d54e0dbf5e405258be7afffbaa48942c06cbcOwen Fraser-Green} 2785632d54e0dbf5e405258be7afffbaa48942c06cbcOwen Fraser-Green 2786632d54e0dbf5e405258be7afffbaa48942c06cbcOwen Fraser-Green/** 2787a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J * Checks if the message has an interface member 2788a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J * 2789a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J * @param message the message 2790cb81ac7edeb97f9f97ace8c990c5fdcb3c991345Havoc Pennington * @param member the member name 2791a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J * @returns #TRUE if there is a member field in the header 2792a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J */ 2793a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (Jdbus_bool_t 2794a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (Jdbus_message_has_member (DBusMessage *message, 2795a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J const char *member) 2796a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J{ 2797a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J const char *msg_member; 2798a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J msg_member = dbus_message_get_member (message); 2799a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J 2800a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J if (msg_member == NULL) 2801a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J { 2802a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J if (member == NULL) 2803a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J return TRUE; 2804a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J else 2805a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J return FALSE; 2806a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J } 2807a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J 2808a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J if (member == NULL) 2809a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J return FALSE; 2810a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J 2811a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J if (strcmp (msg_member, member) == 0) 2812a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J return TRUE; 2813a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J 2814a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J return FALSE; 2815a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J 2816a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J} 2817a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J 2818a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J/** 28199c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Sets the name of the error (DBUS_MESSAGE_TYPE_ERROR). 28209c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * The name is fully-qualified (namespaced). 282150c25505f62786756519ef1e194883360eda82e0Havoc Pennington * 2822afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * The error name must contain only valid characters as defined 2823afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * in the D-Bus specification. 2824afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 2825dc6a61a15b2d9cdc6504753fa9eb0a718f99d6d8Anders Carlsson * @param message the message 28269c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param error_name the name or #NULL to unset 282750c25505f62786756519ef1e194883360eda82e0Havoc Pennington * @returns #FALSE if not enough memory 2828dc6a61a15b2d9cdc6504753fa9eb0a718f99d6d8Anders Carlsson */ 282950c25505f62786756519ef1e194883360eda82e0Havoc Penningtondbus_bool_t 28309c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_set_error_name (DBusMessage *message, 28319c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *error_name) 2832dc6a61a15b2d9cdc6504753fa9eb0a718f99d6d8Anders Carlsson{ 2833c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington _dbus_return_val_if_fail (message != NULL, FALSE); 2834c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington _dbus_return_val_if_fail (!message->locked, FALSE); 28359c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (error_name == NULL || 28369c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_check_is_valid_error_name (error_name), 28379c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington FALSE); 2838dc6a61a15b2d9cdc6504753fa9eb0a718f99d6d8Anders Carlsson 28399c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return set_or_delete_string_field (message, 28409c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_HEADER_FIELD_ERROR_NAME, 28419c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_TYPE_STRING, 28429c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington error_name); 2843dc6a61a15b2d9cdc6504753fa9eb0a718f99d6d8Anders Carlsson} 2844dc6a61a15b2d9cdc6504753fa9eb0a718f99d6d8Anders Carlsson 28450ff552a2c5c542a1be9a1c73597c298e6ece358fHavoc Pennington/** 28469c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Gets the error name (DBUS_MESSAGE_TYPE_ERROR only) 28479c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * or #NULL if none. 28480ff552a2c5c542a1be9a1c73597c298e6ece358fHavoc Pennington * 2849afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * The returned string becomes invalid if the message is 2850afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * modified, since it points into the wire-marshaled message data. 2851afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 28520ff552a2c5c542a1be9a1c73597c298e6ece358fHavoc Pennington * @param message the message 28539c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns the error name (should not be freed) or #NULL 28540ff552a2c5c542a1be9a1c73597c298e6ece358fHavoc Pennington */ 28559c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonconst char* 28569c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_get_error_name (DBusMessage *message) 28578ab042b9571dda44a5afcfe50e0d29dc9b58ecaeAnders Carlsson{ 28589c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *v; 2859c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington 28609c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (message != NULL, NULL); 28619c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 28629c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington v = NULL; /* in case field doesn't exist */ 28639c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_header_get_field_basic (&message->header, 28649c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_HEADER_FIELD_ERROR_NAME, 28659c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_TYPE_STRING, 28669c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington &v); 28679c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return v; 28688ab042b9571dda44a5afcfe50e0d29dc9b58ecaeAnders Carlsson} 28698ab042b9571dda44a5afcfe50e0d29dc9b58ecaeAnders Carlsson 28700ff552a2c5c542a1be9a1c73597c298e6ece358fHavoc Pennington/** 28718873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * Sets the message's destination. The destination is the name of 28728873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * another connection on the bus and may be either the unique name 28738873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * assigned by the bus to each connection, or a well-known name 28748873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * specified in advance. 28750ff552a2c5c542a1be9a1c73597c298e6ece358fHavoc Pennington * 2876afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * The destination name must contain only valid characters as defined 2877afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * in the D-Bus specification. 2878afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 28790ff552a2c5c542a1be9a1c73597c298e6ece358fHavoc Pennington * @param message the message 28808873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * @param destination the destination name or #NULL to unset 28819c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns #FALSE if not enough memory 28820ff552a2c5c542a1be9a1c73597c298e6ece358fHavoc Pennington */ 28838ab042b9571dda44a5afcfe50e0d29dc9b58ecaeAnders Carlssondbus_bool_t 28849c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_set_destination (DBusMessage *message, 28859c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *destination) 28868ab042b9571dda44a5afcfe50e0d29dc9b58ecaeAnders Carlsson{ 2887c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington _dbus_return_val_if_fail (message != NULL, FALSE); 28889c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (!message->locked, FALSE); 28899c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (destination == NULL || 28908873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington _dbus_check_is_valid_bus_name (destination), 28919c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington FALSE); 28928ab042b9571dda44a5afcfe50e0d29dc9b58ecaeAnders Carlsson 28939c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return set_or_delete_string_field (message, 28949c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_HEADER_FIELD_DESTINATION, 28959c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_TYPE_STRING, 28969c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington destination); 28978ab042b9571dda44a5afcfe50e0d29dc9b58ecaeAnders Carlsson} 28988ab042b9571dda44a5afcfe50e0d29dc9b58ecaeAnders Carlsson 289969bf27e5563cbad2d2c9a74ea43e89a8dcb83357Richard Hult/** 29008873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * Gets the destination of a message or #NULL if there is none set. 290169bf27e5563cbad2d2c9a74ea43e89a8dcb83357Richard Hult * 2902afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * The returned string becomes invalid if the message is 2903afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * modified, since it points into the wire-marshaled message data. 2904afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 290569bf27e5563cbad2d2c9a74ea43e89a8dcb83357Richard Hult * @param message the message 29068873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * @returns the message destination (should not be freed) or #NULL 290769bf27e5563cbad2d2c9a74ea43e89a8dcb83357Richard Hult */ 29089c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonconst char* 29099c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_get_destination (DBusMessage *message) 291093f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult{ 29119c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *v; 291293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult 29139c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (message != NULL, NULL); 29149c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 29159c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington v = NULL; /* in case field doesn't exist */ 29169c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_header_get_field_basic (&message->header, 29179c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_HEADER_FIELD_DESTINATION, 29189c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_TYPE_STRING, 29199c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington &v); 29209c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return v; 292193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult} 292293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult 292369bf27e5563cbad2d2c9a74ea43e89a8dcb83357Richard Hult/** 29249c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Sets the message sender. 292569bf27e5563cbad2d2c9a74ea43e89a8dcb83357Richard Hult * 2926afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * The sender must be a valid bus name as defined in the D-Bus 2927afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * specification. 2928afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 2929afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * Usually you don't want to call this. The message bus daemon will 2930afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * call it to set the origin of each message. If you aren't implementing 2931afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * a message bus daemon you shouldn't need to set the sender. 2932afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 293369bf27e5563cbad2d2c9a74ea43e89a8dcb83357Richard Hult * @param message the message 29349c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param sender the sender or #NULL to unset 29359c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns #FALSE if not enough memory 293669bf27e5563cbad2d2c9a74ea43e89a8dcb83357Richard Hult */ 293793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hultdbus_bool_t 29389c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_set_sender (DBusMessage *message, 29399c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *sender) 294093f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult{ 294193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult _dbus_return_val_if_fail (message != NULL, FALSE); 29429c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (!message->locked, FALSE); 29439c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (sender == NULL || 29448873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington _dbus_check_is_valid_bus_name (sender), 29459c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington FALSE); 294693f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult 29479c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return set_or_delete_string_field (message, 29489c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_HEADER_FIELD_SENDER, 29499c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_TYPE_STRING, 29509c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington sender); 295193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult} 295293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult 29532f440457d5fe45afb732820da64a147157e2e82dHavoc Pennington/** 29548873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * Gets the unique name of the connection which originated this 29558873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * message, or #NULL if unknown or inapplicable. The sender is filled 29568873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * in by the message bus. 29572f440457d5fe45afb732820da64a147157e2e82dHavoc Pennington * 2958afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * Note, the returned sender is always the unique bus name. 2959afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * Connections may own multiple other bus names, but those 2960afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * are not found in the sender field. 2961afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 2962afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * The returned string becomes invalid if the message is 2963afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * modified, since it points into the wire-marshaled message data. 2964afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 29652f440457d5fe45afb732820da64a147157e2e82dHavoc Pennington * @param message the message 29668873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * @returns the unique name of the sender or #NULL 29672f440457d5fe45afb732820da64a147157e2e82dHavoc Pennington */ 2968fdddf7246da9ea6ce841146e2befe843aede0466Anders Carlssonconst char* 2969fdddf7246da9ea6ce841146e2befe843aede0466Anders Carlssondbus_message_get_sender (DBusMessage *message) 2970fdddf7246da9ea6ce841146e2befe843aede0466Anders Carlsson{ 29719c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *v; 29729c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 2973c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington _dbus_return_val_if_fail (message != NULL, NULL); 29749c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 29759c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington v = NULL; /* in case field doesn't exist */ 29769c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_header_get_field_basic (&message->header, 29779c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_HEADER_FIELD_SENDER, 29789c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_TYPE_STRING, 29799c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington &v); 29809c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return v; 2981fdddf7246da9ea6ce841146e2befe843aede0466Anders Carlsson} 2982fdddf7246da9ea6ce841146e2befe843aede0466Anders Carlsson 298356cc4ae1a241d36b64dbe26de89714f7771f6e78Havoc Pennington/** 298456cc4ae1a241d36b64dbe26de89714f7771f6e78Havoc Pennington * Gets the type signature of the message, i.e. the arguments in the 298556cc4ae1a241d36b64dbe26de89714f7771f6e78Havoc Pennington * message payload. The signature includes only "in" arguments for 298656cc4ae1a241d36b64dbe26de89714f7771f6e78Havoc Pennington * #DBUS_MESSAGE_TYPE_METHOD_CALL and only "out" arguments for 298756cc4ae1a241d36b64dbe26de89714f7771f6e78Havoc Pennington * #DBUS_MESSAGE_TYPE_METHOD_RETURN, so is slightly different from 2988afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * what you might expect (that is, it does not include the signature of the 298956cc4ae1a241d36b64dbe26de89714f7771f6e78Havoc Pennington * entire C++-style method). 299056cc4ae1a241d36b64dbe26de89714f7771f6e78Havoc Pennington * 29919c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * The signature is a string made up of type codes such as 29929c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * #DBUS_TYPE_INT32. The string is terminated with nul (nul is also 29939c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * the value of #DBUS_TYPE_INVALID). 29949c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 2995afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * The returned string becomes invalid if the message is 2996afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * modified, since it points into the wire-marshaled message data. 2997afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 299856cc4ae1a241d36b64dbe26de89714f7771f6e78Havoc Pennington * @param message the message 299956cc4ae1a241d36b64dbe26de89714f7771f6e78Havoc Pennington * @returns the type signature 300056cc4ae1a241d36b64dbe26de89714f7771f6e78Havoc Pennington */ 300156cc4ae1a241d36b64dbe26de89714f7771f6e78Havoc Penningtonconst char* 300256cc4ae1a241d36b64dbe26de89714f7771f6e78Havoc Penningtondbus_message_get_signature (DBusMessage *message) 300356cc4ae1a241d36b64dbe26de89714f7771f6e78Havoc Pennington{ 30049c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const DBusString *type_str; 30059c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington int type_pos; 30069c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 300756cc4ae1a241d36b64dbe26de89714f7771f6e78Havoc Pennington _dbus_return_val_if_fail (message != NULL, NULL); 3008f7beca572b341c4cabf2f97a9f0d6d763e6acb40Havoc Pennington 30099c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington get_const_signature (&message->header, &type_str, &type_pos); 30109c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 30119c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return _dbus_string_get_const_data_len (type_str, type_pos, 0); 301256cc4ae1a241d36b64dbe26de89714f7771f6e78Havoc Pennington} 301356cc4ae1a241d36b64dbe26de89714f7771f6e78Havoc Pennington 301468a3c593b9e77b33614726363c7b6fd85d113021Havoc Penningtonstatic dbus_bool_t 301568a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington_dbus_message_has_type_interface_member (DBusMessage *message, 301668a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington int type, 301768a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington const char *interface, 30189c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *member) 301968a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington{ 302068a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington const char *n; 302168a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington 302268a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington _dbus_assert (message != NULL); 302368a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington _dbus_assert (interface != NULL); 30249c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_assert (member != NULL); 302568a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington 302668a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington if (dbus_message_get_type (message) != type) 302768a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington return FALSE; 302868a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington 30299c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington /* Optimize by checking the short member name first 303068a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington * instead of the longer interface name 30319c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington */ 303268a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington 303368a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington n = dbus_message_get_member (message); 303468a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington 30359c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (n && strcmp (n, member) == 0) 303668a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington { 303768a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington n = dbus_message_get_interface (message); 30389c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 30399c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (n == NULL || strcmp (n, interface) == 0) 304068a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington return TRUE; 304168a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington } 304268a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington 304368a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington return FALSE; 3044fdddf7246da9ea6ce841146e2befe843aede0466Anders Carlsson} 3045fdddf7246da9ea6ce841146e2befe843aede0466Anders Carlsson 3046c21511c01ab56d75f3aa4643761e9fd096a7f8beHavoc Pennington/** 304768a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington * Checks whether the message is a method call with the given 304868a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington * interface and member fields. If the message is not 30499c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * #DBUS_MESSAGE_TYPE_METHOD_CALL, or has a different interface or 30509c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * member field, returns #FALSE. If the interface field is missing, 30517652304bff969afb3969603149bb385efe861fe8John (J * then it will be assumed equal to the provided interface. The D-Bus 30529c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * protocol allows method callers to leave out the interface name. 3053c21511c01ab56d75f3aa4643761e9fd096a7f8beHavoc Pennington * 3054c21511c01ab56d75f3aa4643761e9fd096a7f8beHavoc Pennington * @param message the message 305595717a938b237d12211935f6a7467ef610288fe5Havoc Pennington * @param interface the name to check (must not be #NULL) 305668a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington * @param method the name to check (must not be #NULL) 30579c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 305868a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington * @returns #TRUE if the message is the specified method call 3059c21511c01ab56d75f3aa4643761e9fd096a7f8beHavoc Pennington */ 30606cf6f82faae928a9142d4aa465b5add381960e29Anders Carlssondbus_bool_t 306168a3c593b9e77b33614726363c7b6fd85d113021Havoc Penningtondbus_message_is_method_call (DBusMessage *message, 306268a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington const char *interface, 306368a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington const char *method) 30646cf6f82faae928a9142d4aa465b5add381960e29Anders Carlsson{ 306595717a938b237d12211935f6a7467ef610288fe5Havoc Pennington _dbus_return_val_if_fail (message != NULL, FALSE); 306695717a938b237d12211935f6a7467ef610288fe5Havoc Pennington _dbus_return_val_if_fail (interface != NULL, FALSE); 306768a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington _dbus_return_val_if_fail (method != NULL, FALSE); 30689c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington /* don't check that interface/method are valid since it would be 30699c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * expensive, and not catch many common errors 30709c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington */ 3071c21511c01ab56d75f3aa4643761e9fd096a7f8beHavoc Pennington 307268a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington return _dbus_message_has_type_interface_member (message, 307368a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington DBUS_MESSAGE_TYPE_METHOD_CALL, 307468a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington interface, method); 307595717a938b237d12211935f6a7467ef610288fe5Havoc Pennington} 307695717a938b237d12211935f6a7467ef610288fe5Havoc Pennington 307768a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington/** 30789c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Checks whether the message is a signal with the given interface and 30799c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * member fields. If the message is not #DBUS_MESSAGE_TYPE_SIGNAL, or 3080afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * has a different interface or member field, returns #FALSE. 308168a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington * 308268a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington * @param message the message 308368a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington * @param interface the name to check (must not be #NULL) 308468a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington * @param signal_name the name to check (must not be #NULL) 30859c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 308668a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington * @returns #TRUE if the message is the specified signal 308768a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington */ 308868a3c593b9e77b33614726363c7b6fd85d113021Havoc Penningtondbus_bool_t 308968a3c593b9e77b33614726363c7b6fd85d113021Havoc Penningtondbus_message_is_signal (DBusMessage *message, 309068a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington const char *interface, 309168a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington const char *signal_name) 309268a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington{ 3093c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington _dbus_return_val_if_fail (message != NULL, FALSE); 309468a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington _dbus_return_val_if_fail (interface != NULL, FALSE); 309568a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington _dbus_return_val_if_fail (signal_name != NULL, FALSE); 30969c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington /* don't check that interface/name are valid since it would be 30979c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * expensive, and not catch many common errors 30989c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington */ 309968a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington 310068a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington return _dbus_message_has_type_interface_member (message, 310168a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington DBUS_MESSAGE_TYPE_SIGNAL, 310268a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington interface, signal_name); 310368a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington} 310495717a938b237d12211935f6a7467ef610288fe5Havoc Pennington 310595717a938b237d12211935f6a7467ef610288fe5Havoc Pennington/** 310668a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington * Checks whether the message is an error reply with the given error 310768a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington * name. If the message is not #DBUS_MESSAGE_TYPE_ERROR, or has a 310868a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington * different name, returns #FALSE. 3109c21511c01ab56d75f3aa4643761e9fd096a7f8beHavoc Pennington * 3110c21511c01ab56d75f3aa4643761e9fd096a7f8beHavoc Pennington * @param message the message 311168a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington * @param error_name the name to check (must not be #NULL) 31129c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 311368a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington * @returns #TRUE if the message is the specified error 3114c21511c01ab56d75f3aa4643761e9fd096a7f8beHavoc Pennington */ 31156cf6f82faae928a9142d4aa465b5add381960e29Anders Carlssondbus_bool_t 311668a3c593b9e77b33614726363c7b6fd85d113021Havoc Penningtondbus_message_is_error (DBusMessage *message, 3117fbae5baa06819fed71f62ddbba64a64675c2d333Havoc Pennington const char *error_name) 31186cf6f82faae928a9142d4aa465b5add381960e29Anders Carlsson{ 3119c21511c01ab56d75f3aa4643761e9fd096a7f8beHavoc Pennington const char *n; 31209c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 312168a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington _dbus_return_val_if_fail (message != NULL, FALSE); 312268a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington _dbus_return_val_if_fail (error_name != NULL, FALSE); 31239c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington /* don't check that error_name is valid since it would be expensive, 31249c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * and not catch many common errors 31259c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington */ 31269c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 312768a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington if (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_ERROR) 312868a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington return FALSE; 312968a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington 3130d0c588575e3e2911eacb098fac26f02d1010cbfdHavoc Pennington n = dbus_message_get_error_name (message); 3131c21511c01ab56d75f3aa4643761e9fd096a7f8beHavoc Pennington 313268a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington if (n && strcmp (n, error_name) == 0) 31336cf6f82faae928a9142d4aa465b5add381960e29Anders Carlsson return TRUE; 31346cf6f82faae928a9142d4aa465b5add381960e29Anders Carlsson else 31356cf6f82faae928a9142d4aa465b5add381960e29Anders Carlsson return FALSE; 31366cf6f82faae928a9142d4aa465b5add381960e29Anders Carlsson} 31376cf6f82faae928a9142d4aa465b5add381960e29Anders Carlsson 3138056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington/** 31398873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * Checks whether the message was sent to the given name. If the 31408873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * message has no destination specified or has a different 31418873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * destination, returns #FALSE. 3142056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington * 3143056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington * @param message the message 31448873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * @param name the name to check (must not be #NULL) 31459c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 31468873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * @returns #TRUE if the message has the given destination name 3147056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington */ 3148056d76d809dc341b0dce160d3f79062604565c77Havoc Penningtondbus_bool_t 3149e8bf15b23a2a9c5b19ef25fb553006a41379bf7cHavoc Penningtondbus_message_has_destination (DBusMessage *message, 31508873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington const char *name) 3151056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington{ 3152056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington const char *s; 3153056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington 3154c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington _dbus_return_val_if_fail (message != NULL, FALSE); 31558873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington _dbus_return_val_if_fail (name != NULL, FALSE); 31568873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington /* don't check that name is valid since it would be expensive, and 31578873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * not catch many common errors 31589c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington */ 31599c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 3160e8bf15b23a2a9c5b19ef25fb553006a41379bf7cHavoc Pennington s = dbus_message_get_destination (message); 3161056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington 31628873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington if (s && strcmp (s, name) == 0) 3163056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington return TRUE; 3164056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington else 3165056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington return FALSE; 3166056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington} 3167056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington 3168056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington/** 31698873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * Checks whether the message has the given unique name as its sender. 31708873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * If the message has no sender specified or has a different sender, 31718873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * returns #FALSE. Note that a peer application will always have the 31728873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * unique name of the connection as the sender. So you can't use this 31738873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * function to see whether a sender owned a well-known name. 3174056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington * 3175248895207dc15914ac7970a6d1431308075dca1dColin Walters * Messages from the bus itself will have #DBUS_SERVICE_DBUS 31768873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * as the sender. 31779c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 3178056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington * @param message the message 31798873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * @param name the name to check (must not be #NULL) 31809c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 31818873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * @returns #TRUE if the message has the given sender 3182056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington */ 3183056d76d809dc341b0dce160d3f79062604565c77Havoc Penningtondbus_bool_t 3184e8bf15b23a2a9c5b19ef25fb553006a41379bf7cHavoc Penningtondbus_message_has_sender (DBusMessage *message, 31858873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington const char *name) 3186056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington{ 3187056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington const char *s; 3188056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington 318956cc4ae1a241d36b64dbe26de89714f7771f6e78Havoc Pennington _dbus_return_val_if_fail (message != NULL, FALSE); 31908873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington _dbus_return_val_if_fail (name != NULL, FALSE); 31918873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington /* don't check that name is valid since it would be expensive, and 31928873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * not catch many common errors 31939c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington */ 31949c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 3195056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington s = dbus_message_get_sender (message); 3196056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington 31978873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington if (s && strcmp (s, name) == 0) 3198056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington return TRUE; 3199056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington else 3200056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington return FALSE; 3201056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington} 3202056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington 3203f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington/** 32049c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Checks whether the message has the given signature; see 32059c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * dbus_message_get_signature() for more details on what the signature 32069c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * looks like. 320756cc4ae1a241d36b64dbe26de89714f7771f6e78Havoc Pennington * 320856cc4ae1a241d36b64dbe26de89714f7771f6e78Havoc Pennington * @param message the message 320956cc4ae1a241d36b64dbe26de89714f7771f6e78Havoc Pennington * @param signature typecode array 321056cc4ae1a241d36b64dbe26de89714f7771f6e78Havoc Pennington * @returns #TRUE if message has the given signature 321156cc4ae1a241d36b64dbe26de89714f7771f6e78Havoc Pennington*/ 321256cc4ae1a241d36b64dbe26de89714f7771f6e78Havoc Penningtondbus_bool_t 321356cc4ae1a241d36b64dbe26de89714f7771f6e78Havoc Penningtondbus_message_has_signature (DBusMessage *message, 321456cc4ae1a241d36b64dbe26de89714f7771f6e78Havoc Pennington const char *signature) 321556cc4ae1a241d36b64dbe26de89714f7771f6e78Havoc Pennington{ 3216f7beca572b341c4cabf2f97a9f0d6d763e6acb40Havoc Pennington const char *s; 3217f7beca572b341c4cabf2f97a9f0d6d763e6acb40Havoc Pennington 321856cc4ae1a241d36b64dbe26de89714f7771f6e78Havoc Pennington _dbus_return_val_if_fail (message != NULL, FALSE); 321956cc4ae1a241d36b64dbe26de89714f7771f6e78Havoc Pennington _dbus_return_val_if_fail (signature != NULL, FALSE); 32209c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington /* don't check that signature is valid since it would be expensive, 32219c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * and not catch many common errors 32229c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington */ 32239c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 3224f7beca572b341c4cabf2f97a9f0d6d763e6acb40Havoc Pennington s = dbus_message_get_signature (message); 322556cc4ae1a241d36b64dbe26de89714f7771f6e78Havoc Pennington 3226f7beca572b341c4cabf2f97a9f0d6d763e6acb40Havoc Pennington if (s && strcmp (s, signature) == 0) 3227f7beca572b341c4cabf2f97a9f0d6d763e6acb40Havoc Pennington return TRUE; 3228f7beca572b341c4cabf2f97a9f0d6d763e6acb40Havoc Pennington else 3229f7beca572b341c4cabf2f97a9f0d6d763e6acb40Havoc Pennington return FALSE; 323056cc4ae1a241d36b64dbe26de89714f7771f6e78Havoc Pennington} 323156cc4ae1a241d36b64dbe26de89714f7771f6e78Havoc Pennington 323256cc4ae1a241d36b64dbe26de89714f7771f6e78Havoc Pennington/** 3233f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington * Sets a #DBusError based on the contents of the given 3234f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington * message. The error is only set if the message 3235afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * is an error message, as in #DBUS_MESSAGE_TYPE_ERROR. 3236f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington * The name of the error is set to the name of the message, 3237f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington * and the error message is set to the first argument 3238f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington * if the argument exists and is a string. 3239f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington * 3240f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington * The return value indicates whether the error was set (the error is 32419c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * set if and only if the message is an error message). So you can 32429c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * check for an error reply and convert it to DBusError in one go: 32439c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @code 32449c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * if (dbus_set_error_from_message (error, reply)) 32459c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * return error; 32469c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * else 32479c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * process reply; 32489c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @endcode 3249f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington * 3250f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington * @param error the error to set 3251f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington * @param message the message to set it from 3252afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * @returns #TRUE if the message had type #DBUS_MESSAGE_TYPE_ERROR 3253f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington */ 3254f216e81432ddf04889202c33a6e68113f94d7611Havoc Penningtondbus_bool_t 3255f216e81432ddf04889202c33a6e68113f94d7611Havoc Penningtondbus_set_error_from_message (DBusError *error, 3256f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington DBusMessage *message) 3257f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington{ 32589c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *str; 3259c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington 3260c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington _dbus_return_val_if_fail (message != NULL, FALSE); 3261c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington _dbus_return_val_if_error_is_set (error, FALSE); 32629c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 3263ff8908f1e98eda82b0a77abb449ecff36abf14aaHavoc Pennington if (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_ERROR) 3264f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington return FALSE; 3265f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington 3266f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington str = NULL; 3267f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington dbus_message_get_args (message, NULL, 3268f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington DBUS_TYPE_STRING, &str, 3269f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington DBUS_TYPE_INVALID); 3270f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington 327195717a938b237d12211935f6a7467ef610288fe5Havoc Pennington dbus_set_error (error, dbus_message_get_error_name (message), 3272f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington str ? "%s" : NULL, str); 3273f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington 3274f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington return TRUE; 3275f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington} 3276f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington 3277041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/** @} */ 3278041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington 3279041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/** 3280041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @addtogroup DBusMessageInternals 3281041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * 3282041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @{ 3283041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */ 3284041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington 3285041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/** 3286041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * The initial buffer size of the message loader. 32879c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 3288041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @todo this should be based on min header size plus some average 3289041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * body size, or something. Or rather, the min header size only, if we 3290041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * want to try to read only the header, store that in a DBusMessage, 3291041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * then read only the body and store that, etc., depends on 3292041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * how we optimize _dbus_message_loader_get_buffer() and what 3293041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * the exact message format is. 3294041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */ 3295041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington#define INITIAL_LOADER_DATA_LEN 32 3296041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington 3297041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/** 3298041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * Creates a new message loader. Returns #NULL if memory can't 3299041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * be allocated. 3300041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * 3301041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @returns new loader, or #NULL. 3302041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */ 3303041b0767b284034aee09e9a0de2a3844b8cc546aHavoc PenningtonDBusMessageLoader* 3304041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington_dbus_message_loader_new (void) 3305041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington{ 3306041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington DBusMessageLoader *loader; 3307041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington 3308041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington loader = dbus_new0 (DBusMessageLoader, 1); 3309041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington if (loader == NULL) 3310041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington return NULL; 33119d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington 3312502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington loader->refcount = 1; 3313271fa7fc335f332bb2be3beeef735334546c4957Havoc Pennington 33149d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington loader->corrupted = FALSE; 33159d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington loader->corruption_reason = DBUS_VALID; 33168f04e1e01f51fa9bef564dbaf29be59694407d21Havoc Pennington 33178f04e1e01f51fa9bef564dbaf29be59694407d21Havoc Pennington /* this can be configured by the app, but defaults to the protocol max */ 33188f04e1e01f51fa9bef564dbaf29be59694407d21Havoc Pennington loader->max_message_size = DBUS_MAXIMUM_MESSAGE_LENGTH; 33199c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 3320fa05de9230d62e7c427b5313796fc6ccd4d0ff60Havoc Pennington if (!_dbus_string_init (&loader->data)) 3321271fa7fc335f332bb2be3beeef735334546c4957Havoc Pennington { 3322271fa7fc335f332bb2be3beeef735334546c4957Havoc Pennington dbus_free (loader); 3323271fa7fc335f332bb2be3beeef735334546c4957Havoc Pennington return NULL; 3324271fa7fc335f332bb2be3beeef735334546c4957Havoc Pennington } 3325271fa7fc335f332bb2be3beeef735334546c4957Havoc Pennington 3326271fa7fc335f332bb2be3beeef735334546c4957Havoc Pennington /* preallocate the buffer for speed, ignore failure */ 3327ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington _dbus_string_set_length (&loader->data, INITIAL_LOADER_DATA_LEN); 3328ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington _dbus_string_set_length (&loader->data, 0); 33299c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 3330041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington return loader; 3331041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington} 3332041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington 3333041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/** 3334041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * Increments the reference count of the loader. 3335041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * 3336041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @param loader the loader. 33379f1a60dbba69844c0a04b3dd86280352736187ceMikael Hallendal * @returns the loader 3338041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */ 33399f1a60dbba69844c0a04b3dd86280352736187ceMikael HallendalDBusMessageLoader * 3340041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington_dbus_message_loader_ref (DBusMessageLoader *loader) 3341041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington{ 3342041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington loader->refcount += 1; 33439f1a60dbba69844c0a04b3dd86280352736187ceMikael Hallendal 33449f1a60dbba69844c0a04b3dd86280352736187ceMikael Hallendal return loader; 3345041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington} 3346041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington 3347041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/** 3348041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * Decrements the reference count of the loader and finalizes the 3349041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * loader when the count reaches zero. 3350041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * 3351041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @param loader the loader. 3352041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */ 3353041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Penningtonvoid 3354041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington_dbus_message_loader_unref (DBusMessageLoader *loader) 3355041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington{ 3356041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington loader->refcount -= 1; 3357041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington if (loader->refcount == 0) 3358041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington { 3359041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington _dbus_list_foreach (&loader->messages, 3360041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington (DBusForeachFunction) dbus_message_unref, 3361041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington NULL); 3362041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington _dbus_list_clear (&loader->messages); 3363271fa7fc335f332bb2be3beeef735334546c4957Havoc Pennington _dbus_string_free (&loader->data); 3364041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington dbus_free (loader); 3365041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington } 3366041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington} 3367041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington 3368041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/** 3369041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * Gets the buffer to use for reading data from the network. Network 3370041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * data is read directly into an allocated buffer, which is then used 3371041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * in the DBusMessage, to avoid as many extra memcpy's as possible. 3372041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * The buffer must always be returned immediately using 3373041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * _dbus_message_loader_return_buffer(), even if no bytes are 3374041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * successfully read. 3375041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * 3376041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @todo this function can be a lot more clever. For example 3377041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * it can probably always return a buffer size to read exactly 3378041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * the body of the next message, thus avoiding any memory wastage 3379041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * or reallocs. 33807584a7bdccc6c7cf9f3d11c315f088794729b7e4Havoc Pennington * 33817584a7bdccc6c7cf9f3d11c315f088794729b7e4Havoc Pennington * @todo we need to enforce a max length on strings in header fields. 33829c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 3383041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @param loader the message loader. 3384271fa7fc335f332bb2be3beeef735334546c4957Havoc Pennington * @param buffer the buffer 3385041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */ 3386271fa7fc335f332bb2be3beeef735334546c4957Havoc Penningtonvoid 3387041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington_dbus_message_loader_get_buffer (DBusMessageLoader *loader, 3388271fa7fc335f332bb2be3beeef735334546c4957Havoc Pennington DBusString **buffer) 3389041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington{ 3390041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington _dbus_assert (!loader->buffer_outstanding); 3391041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington 3392271fa7fc335f332bb2be3beeef735334546c4957Havoc Pennington *buffer = &loader->data; 33939c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 3394041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington loader->buffer_outstanding = TRUE; 3395041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington} 3396041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington 3397041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/** 3398041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * Returns a buffer obtained from _dbus_message_loader_get_buffer(), 3399041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * indicating to the loader how many bytes of the buffer were filled 3400041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * in. This function must always be called, even if no bytes were 3401041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * successfully read. 3402041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * 3403041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @param loader the loader. 3404041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @param buffer the buffer. 3405041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @param bytes_read number of bytes that were read into the buffer. 3406041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */ 3407041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Penningtonvoid 3408041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington_dbus_message_loader_return_buffer (DBusMessageLoader *loader, 3409271fa7fc335f332bb2be3beeef735334546c4957Havoc Pennington DBusString *buffer, 3410041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington int bytes_read) 3411041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington{ 3412041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington _dbus_assert (loader->buffer_outstanding); 3413271fa7fc335f332bb2be3beeef735334546c4957Havoc Pennington _dbus_assert (buffer == &loader->data); 341493f222c1d8ed748994f74662671d003495b16d43Havoc Pennington 3415041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington loader->buffer_outstanding = FALSE; 3416ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington} 3417041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington 34189c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington/* 34199c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * FIXME when we move the header out of the buffer, that memmoves all 34209c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * buffered messages. Kind of crappy. 34219c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 34229c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Also we copy the header and body, which is kind of crappy. To 34239c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * avoid this, we have to allow header and body to be in a single 34249c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * memory block, which is good for messages we read and bad for 34259c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * messages we are creating. But we could move_len() the buffer into 34269c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * this single memory block, and move_len() will just swap the buffers 34279c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * if you're moving the entire buffer replacing the dest string. 34289c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 34299c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * We could also have the message loader tell the transport how many 34309c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * bytes to read; so it would first ask for some arbitrary number like 34319c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 256, then if the message was incomplete it would use the 34329c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * header/body len to ask for exactly the size of the message (or 34339c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * blocks the size of a typical kernel buffer for the socket). That 34349c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * way we don't get trailing bytes in the buffer that have to be 34359c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * memmoved. Though I suppose we also don't have a chance of reading a 34369c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * bunch of small messages at once, so the optimization may be stupid. 34379c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 34389c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Another approach would be to keep a "start" index into 34399c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * loader->data and only delete it occasionally, instead of after 34409c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * each message is loaded. 34419c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 34429d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington * load_message() returns FALSE if not enough memory OR the loader was corrupted 34439c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington */ 34443251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Penningtonstatic dbus_bool_t 34459c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonload_message (DBusMessageLoader *loader, 34469c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusMessage *message, 34479c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington int byte_order, 34489c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington int fields_array_len, 34499c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington int header_len, 34509c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington int body_len) 34513251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington{ 34523251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington dbus_bool_t oom; 34539c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusValidity validity; 34549c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const DBusString *type_str; 34559c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington int type_pos; 3456606eb2106b3d7f5cd36a4f1786d281b771bb1bf7Havoc Pennington DBusValidationMode mode; 34579c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 3458606eb2106b3d7f5cd36a4f1786d281b771bb1bf7Havoc Pennington mode = DBUS_VALIDATION_MODE_DATA_IS_UNTRUSTED; 3459606eb2106b3d7f5cd36a4f1786d281b771bb1bf7Havoc Pennington 34603251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington oom = FALSE; 34619c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 3462e11ae7246655e59f8e04d1ffcb3788176a6d98b8Havoc Pennington#if 0 3463eb9aa9da9564f2df788580394e67ae6105e517fbHavoc Pennington _dbus_verbose_bytes_of_string (&loader->data, 0, header_len /* + body_len */); 34649c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington#endif 34653251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington 34669c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington /* 1. VALIDATE AND COPY OVER HEADER */ 34679c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_assert (_dbus_string_get_length (&message->header.data) == 0); 34689c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_assert ((header_len + body_len) <= _dbus_string_get_length (&loader->data)); 34699c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 3470606eb2106b3d7f5cd36a4f1786d281b771bb1bf7Havoc Pennington if (!_dbus_header_load (&message->header, 3471606eb2106b3d7f5cd36a4f1786d281b771bb1bf7Havoc Pennington mode, 3472606eb2106b3d7f5cd36a4f1786d281b771bb1bf7Havoc Pennington &validity, 3473606eb2106b3d7f5cd36a4f1786d281b771bb1bf7Havoc Pennington byte_order, 3474606eb2106b3d7f5cd36a4f1786d281b771bb1bf7Havoc Pennington fields_array_len, 3475606eb2106b3d7f5cd36a4f1786d281b771bb1bf7Havoc Pennington header_len, 3476606eb2106b3d7f5cd36a4f1786d281b771bb1bf7Havoc Pennington body_len, 3477606eb2106b3d7f5cd36a4f1786d281b771bb1bf7Havoc Pennington &loader->data, 0, 3478606eb2106b3d7f5cd36a4f1786d281b771bb1bf7Havoc Pennington _dbus_string_get_length (&loader->data))) 34799c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington { 34809c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_verbose ("Failed to load header for new message code %d\n", validity); 34815e389fdf499c39926c61b47fcafb5e71291ce1a2John (J 34825e389fdf499c39926c61b47fcafb5e71291ce1a2John (J /* assert here so we can catch any code that still uses DBUS_VALID to indicate 34835e389fdf499c39926c61b47fcafb5e71291ce1a2John (J oom errors. They should use DBUS_VALIDITY_UNKNOWN_OOM_ERROR instead */ 34845e389fdf499c39926c61b47fcafb5e71291ce1a2John (J _dbus_assert (validity != DBUS_VALID); 34855e389fdf499c39926c61b47fcafb5e71291ce1a2John (J 34865e389fdf499c39926c61b47fcafb5e71291ce1a2John (J if (validity == DBUS_VALIDITY_UNKNOWN_OOM_ERROR) 34879c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington oom = TRUE; 34889d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington else 34899d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington { 34909d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington loader->corrupted = TRUE; 34919d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington loader->corruption_reason = validity; 34929d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington } 34933251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington goto failed; 34943251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington } 34953251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington 34969c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_assert (validity == DBUS_VALID); 34973251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington 34989c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington message->byte_order = byte_order; 34993251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington 35009c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington /* 2. VALIDATE BODY */ 3501606eb2106b3d7f5cd36a4f1786d281b771bb1bf7Havoc Pennington if (mode != DBUS_VALIDATION_MODE_WE_TRUST_THIS_DATA_ABSOLUTELY) 35029c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington { 3503606eb2106b3d7f5cd36a4f1786d281b771bb1bf7Havoc Pennington get_const_signature (&message->header, &type_str, &type_pos); 3504606eb2106b3d7f5cd36a4f1786d281b771bb1bf7Havoc Pennington 3505606eb2106b3d7f5cd36a4f1786d281b771bb1bf7Havoc Pennington /* Because the bytes_remaining arg is NULL, this validates that the 3506606eb2106b3d7f5cd36a4f1786d281b771bb1bf7Havoc Pennington * body is the right length 3507606eb2106b3d7f5cd36a4f1786d281b771bb1bf7Havoc Pennington */ 3508606eb2106b3d7f5cd36a4f1786d281b771bb1bf7Havoc Pennington validity = _dbus_validate_body_with_reason (type_str, 3509606eb2106b3d7f5cd36a4f1786d281b771bb1bf7Havoc Pennington type_pos, 3510606eb2106b3d7f5cd36a4f1786d281b771bb1bf7Havoc Pennington byte_order, 3511606eb2106b3d7f5cd36a4f1786d281b771bb1bf7Havoc Pennington NULL, 3512606eb2106b3d7f5cd36a4f1786d281b771bb1bf7Havoc Pennington &loader->data, 3513606eb2106b3d7f5cd36a4f1786d281b771bb1bf7Havoc Pennington header_len, 3514606eb2106b3d7f5cd36a4f1786d281b771bb1bf7Havoc Pennington body_len); 3515606eb2106b3d7f5cd36a4f1786d281b771bb1bf7Havoc Pennington if (validity != DBUS_VALID) 3516606eb2106b3d7f5cd36a4f1786d281b771bb1bf7Havoc Pennington { 3517606eb2106b3d7f5cd36a4f1786d281b771bb1bf7Havoc Pennington _dbus_verbose ("Failed to validate message body code %d\n", validity); 35189d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington 35199d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington loader->corrupted = TRUE; 35209d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington loader->corruption_reason = validity; 35219d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington 3522606eb2106b3d7f5cd36a4f1786d281b771bb1bf7Havoc Pennington goto failed; 3523606eb2106b3d7f5cd36a4f1786d281b771bb1bf7Havoc Pennington } 35243251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington } 35253251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington 35269c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington /* 3. COPY OVER BODY AND QUEUE MESSAGE */ 35279c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 35283251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington if (!_dbus_list_append (&loader->messages, message)) 35293251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington { 35303251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington _dbus_verbose ("Failed to append new message to loader queue\n"); 35313251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington oom = TRUE; 35323251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington goto failed; 35333251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington } 35343251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington 35353251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington _dbus_assert (_dbus_string_get_length (&message->body) == 0); 35363251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington _dbus_assert (_dbus_string_get_length (&loader->data) >= 35373251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington (header_len + body_len)); 35389c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 35399c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!_dbus_string_copy_len (&loader->data, header_len, body_len, &message->body, 0)) 35403251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington { 35413251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington _dbus_verbose ("Failed to move body into new message\n"); 35423251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington oom = TRUE; 35433251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington goto failed; 35443251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington } 35453251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington 35469c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_string_delete (&loader->data, 0, header_len + body_len); 35479c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 35488c6b0ab3f7e437362112eeaf83a566475b85d27cRyan Lortie /* don't waste more than 2k of memory */ 35498c6b0ab3f7e437362112eeaf83a566475b85d27cRyan Lortie _dbus_string_compact (&loader->data, 2048); 35508c6b0ab3f7e437362112eeaf83a566475b85d27cRyan Lortie 35519c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_assert (_dbus_string_get_length (&message->header.data) == header_len); 35523251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington _dbus_assert (_dbus_string_get_length (&message->body) == body_len); 35533251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington 35543251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington _dbus_verbose ("Loaded message %p\n", message); 35553251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington 35563251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington _dbus_assert (!oom); 35573251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington _dbus_assert (!loader->corrupted); 35589d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington _dbus_assert (loader->messages != NULL); 35599d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington _dbus_assert (_dbus_list_find_last (&loader->messages, message) != NULL); 35603251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington 35613251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington return TRUE; 35623251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington 35633251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington failed: 35649c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 35653251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington /* Clean up */ 35663251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington 35679c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington /* does nothing if the message isn't in the list */ 35689c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_list_remove_last (&loader->messages, message); 35699d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington 35709d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington if (oom) 35719d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington _dbus_assert (!loader->corrupted); 35729d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington else 35739d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington _dbus_assert (loader->corrupted); 35749c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 35759c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_verbose_bytes_of_string (&loader->data, 0, _dbus_string_get_length (&loader->data)); 35763251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington 35779d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington return FALSE; 35783251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington} 35793251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington 3580ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington/** 35819c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Converts buffered data into messages, if we have enough data. If 35829c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * we don't have enough data, does nothing. 3583ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington * 35849c5d01f0fe1ba855c0f7518c4f27d75a609b8faaHavoc Pennington * @todo we need to check that the proper named header fields exist 35859c5d01f0fe1ba855c0f7518c4f27d75a609b8faaHavoc Pennington * for each message type. 35869c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 35877c3693a53b4eba0db1aebe1edab5ded21eb7757fHavoc Pennington * @todo If a message has unknown type, we should probably eat it 35887c3693a53b4eba0db1aebe1edab5ded21eb7757fHavoc Pennington * right here rather than passing it out to applications. However 35897c3693a53b4eba0db1aebe1edab5ded21eb7757fHavoc Pennington * it's not an error to see messages of unknown type. 35909c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 3591ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington * @param loader the loader. 3592ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington * @returns #TRUE if we had enough memory to finish. 3593ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington */ 3594ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Penningtondbus_bool_t 3595ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington_dbus_message_loader_queue_messages (DBusMessageLoader *loader) 3596ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington{ 35979c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington while (!loader->corrupted && 35989c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_string_get_length (&loader->data) >= DBUS_MINIMUM_HEADER_SIZE) 3599041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington { 36009c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusValidity validity; 36019c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington int byte_order, fields_array_len, header_len, body_len; 3602993be1059afcb0e9a5b67f5287fb1122d6c48ce6Havoc Pennington 36039c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (_dbus_header_have_message_untrusted (loader->max_message_size, 36049c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington &validity, 36059c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington &byte_order, 36069c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington &fields_array_len, 36079c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington &header_len, 36089c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington &body_len, 36099c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington &loader->data, 0, 36109c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_string_get_length (&loader->data))) 36119c5d01f0fe1ba855c0f7518c4f27d75a609b8faaHavoc Pennington { 36129c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusMessage *message; 36137ba714ad7fe8256edfaad7d9a0f09aeb9611ca44Havoc Pennington 36149c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_assert (validity == DBUS_VALID); 3615482dab2076282ef1195564fa60dd25c1ffb77682Havoc Pennington 36169c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington message = dbus_message_new_empty_header (); 36179c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (message == NULL) 36189c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return FALSE; 3619799a3ff443f5357ae7857ebe989a7f92f7bd84dfAnders Carlsson 36209c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!load_message (loader, message, 36219c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington byte_order, fields_array_len, 36229c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington header_len, body_len)) 36239c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington { 36249c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_message_unref (message); 36259d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington /* load_message() returns false if corrupted or OOM; if 36269d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington * corrupted then return TRUE for not OOM 36279d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington */ 36289d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington return loader->corrupted; 36299c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington } 36309d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington 36319d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington _dbus_assert (loader->messages != NULL); 36329d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington _dbus_assert (_dbus_list_find_last (&loader->messages, message) != NULL); 36339c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington } 36349c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington else 36357ba714ad7fe8256edfaad7d9a0f09aeb9611ca44Havoc Pennington { 36369c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_verbose ("Initial peek at header says we don't have a whole message yet, or data broken with invalid code %d\n", 36379c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington validity); 36389c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (validity != DBUS_VALID) 36399d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington { 36409d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington loader->corrupted = TRUE; 36419d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington loader->corruption_reason = validity; 36429d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington } 3643ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington return TRUE; 36447ba714ad7fe8256edfaad7d9a0f09aeb9611ca44Havoc Pennington } 3645041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington } 3646ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington 3647ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington return TRUE; 3648ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington} 3649ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington 3650ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington/** 3651ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington * Peeks at first loaded message, returns #NULL if no messages have 3652ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington * been queued. 3653ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington * 3654ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington * @param loader the loader. 3655ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington * @returns the next message, or #NULL if none. 3656ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington */ 3657ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc PenningtonDBusMessage* 3658ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington_dbus_message_loader_peek_message (DBusMessageLoader *loader) 3659ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington{ 3660ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington if (loader->messages) 3661ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington return loader->messages->data; 3662ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington else 3663ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington return NULL; 3664041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington} 3665041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington 3666041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/** 3667041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * Pops a loaded message (passing ownership of the message 3668041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * to the caller). Returns #NULL if no messages have been 3669ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington * queued. 3670041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * 3671041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @param loader the loader. 3672041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @returns the next message, or #NULL if none. 3673041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */ 3674041b0767b284034aee09e9a0de2a3844b8cc546aHavoc PenningtonDBusMessage* 3675041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington_dbus_message_loader_pop_message (DBusMessageLoader *loader) 3676041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington{ 3677041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington return _dbus_list_pop_first (&loader->messages); 367893f222c1d8ed748994f74662671d003495b16d43Havoc Pennington} 367993f222c1d8ed748994f74662671d003495b16d43Havoc Pennington 36805c53fb2a36024c66b3aaa6d26e93a802393664b2Havoc Pennington/** 36815c53fb2a36024c66b3aaa6d26e93a802393664b2Havoc Pennington * Pops a loaded message inside a list link (passing ownership of the 36825c53fb2a36024c66b3aaa6d26e93a802393664b2Havoc Pennington * message and link to the caller). Returns #NULL if no messages have 36835c53fb2a36024c66b3aaa6d26e93a802393664b2Havoc Pennington * been loaded. 36845c53fb2a36024c66b3aaa6d26e93a802393664b2Havoc Pennington * 36855c53fb2a36024c66b3aaa6d26e93a802393664b2Havoc Pennington * @param loader the loader. 36865c53fb2a36024c66b3aaa6d26e93a802393664b2Havoc Pennington * @returns the next message link, or #NULL if none. 36875c53fb2a36024c66b3aaa6d26e93a802393664b2Havoc Pennington */ 36885c53fb2a36024c66b3aaa6d26e93a802393664b2Havoc PenningtonDBusList* 36895c53fb2a36024c66b3aaa6d26e93a802393664b2Havoc Pennington_dbus_message_loader_pop_message_link (DBusMessageLoader *loader) 36905c53fb2a36024c66b3aaa6d26e93a802393664b2Havoc Pennington{ 36915c53fb2a36024c66b3aaa6d26e93a802393664b2Havoc Pennington return _dbus_list_pop_first_link (&loader->messages); 36925c53fb2a36024c66b3aaa6d26e93a802393664b2Havoc Pennington} 3693ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington 3694ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington/** 36954b45f17965f3262eb9b3bb49c015af79781c6882Havoc Pennington * Returns a popped message link, used to undo a pop. 36964b45f17965f3262eb9b3bb49c015af79781c6882Havoc Pennington * 36974b45f17965f3262eb9b3bb49c015af79781c6882Havoc Pennington * @param loader the loader 36984b45f17965f3262eb9b3bb49c015af79781c6882Havoc Pennington * @param link the link with a message in it 36994b45f17965f3262eb9b3bb49c015af79781c6882Havoc Pennington */ 37004b45f17965f3262eb9b3bb49c015af79781c6882Havoc Penningtonvoid 37014b45f17965f3262eb9b3bb49c015af79781c6882Havoc Pennington_dbus_message_loader_putback_message_link (DBusMessageLoader *loader, 37024b45f17965f3262eb9b3bb49c015af79781c6882Havoc Pennington DBusList *link) 37034b45f17965f3262eb9b3bb49c015af79781c6882Havoc Pennington{ 37044b45f17965f3262eb9b3bb49c015af79781c6882Havoc Pennington _dbus_list_prepend_link (&loader->messages, link); 37054b45f17965f3262eb9b3bb49c015af79781c6882Havoc Pennington} 37064b45f17965f3262eb9b3bb49c015af79781c6882Havoc Pennington 37074b45f17965f3262eb9b3bb49c015af79781c6882Havoc Pennington/** 3708ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington * Checks whether the loader is confused due to bad data. 3709ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington * If messages are received that are invalid, the 3710ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington * loader gets confused and gives up permanently. 3711ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington * This state is called "corrupted." 3712ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington * 3713ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington * @param loader the loader 3714ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington * @returns #TRUE if the loader is hosed. 3715ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington */ 3716ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Penningtondbus_bool_t 3717ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington_dbus_message_loader_get_is_corrupted (DBusMessageLoader *loader) 3718ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington{ 37199d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington _dbus_assert ((loader->corrupted && loader->corruption_reason != DBUS_VALID) || 37209d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington (!loader->corrupted && loader->corruption_reason == DBUS_VALID)); 3721ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington return loader->corrupted; 3722ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington} 3723ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington 3724502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington/** 3725502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington * Sets the maximum size message we allow. 3726502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington * 3727502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington * @param loader the loader 3728502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington * @param size the max message size in bytes 3729502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington */ 3730502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Penningtonvoid 3731502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington_dbus_message_loader_set_max_message_size (DBusMessageLoader *loader, 3732502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington long size) 3733502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington{ 37349c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (size > DBUS_MAXIMUM_MESSAGE_LENGTH) 37357ba714ad7fe8256edfaad7d9a0f09aeb9611ca44Havoc Pennington { 37367ba714ad7fe8256edfaad7d9a0f09aeb9611ca44Havoc Pennington _dbus_verbose ("clamping requested max message size %ld to %d\n", 37379c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington size, DBUS_MAXIMUM_MESSAGE_LENGTH); 37389c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington size = DBUS_MAXIMUM_MESSAGE_LENGTH; 37397ba714ad7fe8256edfaad7d9a0f09aeb9611ca44Havoc Pennington } 3740502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington loader->max_message_size = size; 3741502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington} 3742502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington 3743502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington/** 3744502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington * Gets the maximum allowed message size in bytes. 3745502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington * 3746502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington * @param loader the loader 3747502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington * @returns max size in bytes 3748502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington */ 3749502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Penningtonlong 3750502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington_dbus_message_loader_get_max_message_size (DBusMessageLoader *loader) 3751502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington{ 3752502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington return loader->max_message_size; 3753502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington} 3754502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington 3755958805418359aca169cd363a4a3279f0fdab753cHavoc Penningtonstatic DBusDataSlotAllocator slot_allocator; 3756958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington_DBUS_DEFINE_GLOBAL_LOCK (message_slots); 3757958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington 3758958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington/** 3759958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * Allocates an integer ID to be used for storing application-specific 3760958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * data on any DBusMessage. The allocated ID may then be used 3761958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * with dbus_message_set_data() and dbus_message_get_data(). 3762958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * The passed-in slot must be initialized to -1, and is filled in 3763958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * with the slot ID. If the passed-in slot is not -1, it's assumed 3764958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * to be already allocated, and its refcount is incremented. 37659c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 3766958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * The allocated slot is global, i.e. all DBusMessage objects will 3767958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * have a slot with the given integer ID reserved. 3768958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * 3769958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * @param slot_p address of a global variable storing the slot 3770958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * @returns #FALSE on failure (no memory) 3771958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington */ 3772958805418359aca169cd363a4a3279f0fdab753cHavoc Penningtondbus_bool_t 3773958805418359aca169cd363a4a3279f0fdab753cHavoc Penningtondbus_message_allocate_data_slot (dbus_int32_t *slot_p) 3774958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington{ 3775958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington return _dbus_data_slot_allocator_alloc (&slot_allocator, 377614cc7d28a8308060428bbc9b3dd357eaea3a4749John (J &_DBUS_LOCK_NAME (message_slots), 3777958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington slot_p); 3778958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington} 3779958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington 3780958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington/** 3781958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * Deallocates a global ID for message data slots. 3782958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * dbus_message_get_data() and dbus_message_set_data() may no 3783958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * longer be used with this slot. Existing data stored on existing 3784958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * DBusMessage objects will be freed when the message is 3785958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * finalized, but may not be retrieved (and may only be replaced if 3786958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * someone else reallocates the slot). When the refcount on the 3787958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * passed-in slot reaches 0, it is set to -1. 3788958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * 3789958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * @param slot_p address storing the slot to deallocate 3790958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington */ 3791958805418359aca169cd363a4a3279f0fdab753cHavoc Penningtonvoid 3792958805418359aca169cd363a4a3279f0fdab753cHavoc Penningtondbus_message_free_data_slot (dbus_int32_t *slot_p) 3793958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington{ 3794958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington _dbus_return_if_fail (*slot_p >= 0); 37959c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 3796958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington _dbus_data_slot_allocator_free (&slot_allocator, slot_p); 3797958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington} 3798958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington 3799958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington/** 3800958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * Stores a pointer on a DBusMessage, along 3801958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * with an optional function to be used for freeing 3802958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * the data when the data is set again, or when 3803958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * the message is finalized. The slot number 3804958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * must have been allocated with dbus_message_allocate_data_slot(). 3805958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * 3806958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * @param message the message 3807958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * @param slot the slot number 3808958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * @param data the data to store 3809958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * @param free_data_func finalizer function for the data 3810958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * @returns #TRUE if there was enough memory to store the data 3811958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington */ 3812958805418359aca169cd363a4a3279f0fdab753cHavoc Penningtondbus_bool_t 3813958805418359aca169cd363a4a3279f0fdab753cHavoc Penningtondbus_message_set_data (DBusMessage *message, 3814958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington dbus_int32_t slot, 3815958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington void *data, 3816958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington DBusFreeFunction free_data_func) 3817958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington{ 3818958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington DBusFreeFunction old_free_func; 3819958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington void *old_data; 3820958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington dbus_bool_t retval; 3821958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington 3822958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington _dbus_return_val_if_fail (message != NULL, FALSE); 3823958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington _dbus_return_val_if_fail (slot >= 0, FALSE); 3824958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington 3825958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington retval = _dbus_data_slot_list_set (&slot_allocator, 3826958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington &message->slot_list, 3827958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington slot, data, free_data_func, 3828958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington &old_free_func, &old_data); 3829958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington 3830958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington if (retval) 3831958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington { 3832958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington /* Do the actual free outside the message lock */ 3833958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington if (old_free_func) 3834958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington (* old_free_func) (old_data); 3835958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington } 3836958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington 3837958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington return retval; 3838958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington} 3839958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington 3840958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington/** 3841958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * Retrieves data previously set with dbus_message_set_data(). 3842958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * The slot must still be allocated (must not have been freed). 3843958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * 3844958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * @param message the message 3845958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * @param slot the slot to get data from 3846958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * @returns the data, or #NULL if not found 3847958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington */ 3848958805418359aca169cd363a4a3279f0fdab753cHavoc Penningtonvoid* 3849958805418359aca169cd363a4a3279f0fdab753cHavoc Penningtondbus_message_get_data (DBusMessage *message, 3850958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington dbus_int32_t slot) 3851958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington{ 3852958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington void *res; 3853958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington 3854958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington _dbus_return_val_if_fail (message != NULL, NULL); 38559c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 3856958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington res = _dbus_data_slot_list_get (&slot_allocator, 3857958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington &message->slot_list, 3858958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington slot); 3859958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington 3860958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington return res; 3861958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington} 3862958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington 38636a65f4802e95ba442c520f8e225da837e0a9f73bHavoc Pennington/** 38649c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Utility function to convert a machine-readable (not translated) 38657652304bff969afb3969603149bb385efe861fe8John (J * string into a D-Bus message type. 38669c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 38679c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @code 38689c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * "method_call" -> DBUS_MESSAGE_TYPE_METHOD_CALL 38699c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * "method_return" -> DBUS_MESSAGE_TYPE_METHOD_RETURN 38709c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * "signal" -> DBUS_MESSAGE_TYPE_SIGNAL 38719c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * "error" -> DBUS_MESSAGE_TYPE_ERROR 38729c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * anything else -> DBUS_MESSAGE_TYPE_INVALID 38739c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @endcode 38749c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 38759c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington */ 38769c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonint 38779c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_type_from_string (const char *type_str) 38789c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington{ 38799c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (strcmp (type_str, "method_call") == 0) 38809c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return DBUS_MESSAGE_TYPE_METHOD_CALL; 38819c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (strcmp (type_str, "method_return") == 0) 38829c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return DBUS_MESSAGE_TYPE_METHOD_RETURN; 38839c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington else if (strcmp (type_str, "signal") == 0) 38849c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return DBUS_MESSAGE_TYPE_SIGNAL; 38859c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington else if (strcmp (type_str, "error") == 0) 38869c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return DBUS_MESSAGE_TYPE_ERROR; 38879c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington else 38889c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return DBUS_MESSAGE_TYPE_INVALID; 38891b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson} 38901b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson 38919c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington/** 38927652304bff969afb3969603149bb385efe861fe8John (J * Utility function to convert a D-Bus message type into a 38939c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * machine-readable string (not translated). 38949c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 38959c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @code 38969c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * DBUS_MESSAGE_TYPE_METHOD_CALL -> "method_call" 38979c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * DBUS_MESSAGE_TYPE_METHOD_RETURN -> "method_return" 38989c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * DBUS_MESSAGE_TYPE_SIGNAL -> "signal" 38999c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * DBUS_MESSAGE_TYPE_ERROR -> "error" 39009c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * DBUS_MESSAGE_TYPE_INVALID -> "invalid" 39019c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @endcode 39029c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 39039c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington */ 39049c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonconst char * 39059c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_type_to_string (int type) 3906c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson{ 3907c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson switch (type) 3908c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson { 39099c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington case DBUS_MESSAGE_TYPE_METHOD_CALL: 39109c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return "method_call"; 39119c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington case DBUS_MESSAGE_TYPE_METHOD_RETURN: 39129c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return "method_return"; 39139c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington case DBUS_MESSAGE_TYPE_SIGNAL: 39149c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return "signal"; 39159c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington case DBUS_MESSAGE_TYPE_ERROR: 39169c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return "error"; 3917c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson default: 39189c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return "invalid"; 3919c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson } 3920c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson} 3921799a3ff443f5357ae7857ebe989a7f92f7bd84dfAnders Carlsson 3922c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie/** 3923c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie * Turn a DBusMessage into the marshalled form as described in the D-Bus 3924c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie * specification. 3925c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie * 3926c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie * Generally, this function is only useful for encapsulating D-Bus messages in 3927c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie * a different protocol. 3928c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie * 3929c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie * @param msg the DBusMessage 3930c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie * @param marshalled_data_p the location to save the marshalled form to 3931c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie * @param len_p the location to save the length of the marshalled form to 3932c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie * @returns #FALSE if there was not enough memory 3933c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie */ 3934c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittiedbus_bool_t 3935c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittiedbus_message_marshal (DBusMessage *msg, 3936c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie char **marshalled_data_p, 3937c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie int *len_p) 3938c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie{ 3939c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie DBusString tmp; 3940c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie 3941c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie _dbus_return_val_if_fail (msg != NULL, FALSE); 3942c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie _dbus_return_val_if_fail (marshalled_data_p != NULL, FALSE); 3943c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie _dbus_return_val_if_fail (len_p != NULL, FALSE); 3944c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie 3945c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie if (!_dbus_string_init (&tmp)) 3946c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie return FALSE; 3947c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie 3948c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie if (!_dbus_string_copy (&(msg->header.data), 0, &tmp, 0)) 3949c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie goto fail; 3950c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie 3951c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie *len_p = _dbus_string_get_length (&tmp); 3952c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie 3953c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie if (!_dbus_string_copy (&(msg->body), 0, &tmp, *len_p)) 3954c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie goto fail; 3955c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie 3956c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie *len_p = _dbus_string_get_length (&tmp); 3957c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie 3958c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie if (!_dbus_string_steal_data (&tmp, marshalled_data_p)) 3959c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie goto fail; 3960c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie 3961c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie _dbus_string_free (&tmp); 3962c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie return TRUE; 3963c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie 3964c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie fail: 3965c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie _dbus_string_free (&tmp); 3966c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie return FALSE; 3967c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie} 3968c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie 3969c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie/** 3970c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie * Demarshal a D-Bus message from the format described in the D-Bus 3971c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie * specification. 3972c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie * 3973c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie * Generally, this function is only useful for encapsulating D-Bus messages in 3974c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie * a different protocol. 3975c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie * 3976c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie * @param str the marshalled DBusMessage 3977c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie * @param len the length of str 3978c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie * @param error the location to save errors to 3979c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie * @returns #NULL if there was an error 3980c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie */ 3981c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittieDBusMessage * 3982c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittiedbus_message_demarshal (const char *str, 3983c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie int len, 3984c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie DBusError *error) 3985c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie{ 3986c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie DBusMessageLoader *loader; 3987c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie DBusString *buffer; 3988c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie DBusMessage *msg; 3989c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie 3990c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie _dbus_return_val_if_fail (str != NULL, NULL); 3991c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie 3992c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie loader = _dbus_message_loader_new (); 3993c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie 3994c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie if (loader == NULL) 3995c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie return NULL; 3996c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie 3997c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie _dbus_message_loader_get_buffer (loader, &buffer); 3998c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie _dbus_string_append_len (buffer, str, len); 3999c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie _dbus_message_loader_return_buffer (loader, buffer, len); 4000c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie 4001c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie if (!_dbus_message_loader_queue_messages (loader)) 4002c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie goto fail_oom; 4003c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie 4004c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie if (_dbus_message_loader_get_is_corrupted (loader)) 4005c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie goto fail_corrupt; 4006c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie 4007c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie msg = _dbus_message_loader_pop_message (loader); 4008c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie 4009c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie if (!msg) 4010c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie goto fail_oom; 4011c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie 4012c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie _dbus_message_loader_unref (loader); 4013c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie return msg; 4014c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie 4015c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie fail_corrupt: 4016c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie dbus_set_error (error, DBUS_ERROR_INVALID_ARGS, "Message is corrupted"); 4017c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie _dbus_message_loader_unref (loader); 4018c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie return NULL; 4019c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie 4020c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie fail_oom: 4021c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie _DBUS_SET_OOM (error); 4022c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie _dbus_message_loader_unref (loader); 4023c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie return NULL; 4024c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie} 4025c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie 40269c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington/** @} */ 40271b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson 40287bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington/* tests in dbus-message-util.c */ 4029