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                                   &current_sig, &current_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