1d012387afef0ba02185ebe27bc6bb15551912e92Havoc Pennington/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
27bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington/* dbus-message-private.h header shared between dbus-message.c and dbus-message-util.c
37bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington *
47bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington * Copyright (C) 2005  Red Hat Inc.
57bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington *
67bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington * Licensed under the Academic Free License version 2.1
77bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington *
87bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington * This program is free software; you can redistribute it and/or modify
97bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington * it under the terms of the GNU General Public License as published by
107bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington * the Free Software Foundation; either version 2 of the License, or
117bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington * (at your option) any later version.
127bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington *
137bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington * This program is distributed in the hope that it will be useful,
147bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington * but WITHOUT ANY WARRANTY; without even the implied warranty of
157bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
167bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington * GNU General Public License for more details.
177bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington *
187bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington * You should have received a copy of the GNU General Public License
197bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington * along with this program; if not, write to the Free Software
205baf2f856a9c6625993234855b07680da1c8916fTobias Mueller * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
217bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington *
227bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington */
237bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington#ifndef DBUS_MESSAGE_PRIVATE_H
247bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington#define DBUS_MESSAGE_PRIVATE_H
257bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
267bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington#include <dbus/dbus-message.h>
277bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington#include <dbus/dbus-message-internal.h>
287bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington#include <dbus/dbus-string.h>
297bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington#include <dbus/dbus-dataslot.h>
307bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington#include <dbus/dbus-marshal-header.h>
317bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
327bf62e31a3c820852271768fafc04ba95c31a19fHavoc PenningtonDBUS_BEGIN_DECLS
337bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
347bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington/**
357bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington * @addtogroup DBusMessageInternals
367bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington * @{
377bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington */
387bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
397bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington/**
407bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington * @typedef DBusMessageLoader
417bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington *
427bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington * The DBusMessageLoader object encapsulates the process of converting
437bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington * a byte stream into a series of DBusMessage. It buffers the incoming
447bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington * bytes as efficiently as possible, and generates a queue of
457bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington * messages. DBusMessageLoader is typically used as part of a
467bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington * DBusTransport implementation. The DBusTransport then hands off
477bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington * the loaded messages to a DBusConnection, making the messages
487bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington * visible to the application.
497bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington *
507bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington * @todo write tests for break-loader that a) randomly delete header
517bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington * fields and b) set string fields to zero-length and other funky
527bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington * values.
537bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington *
547bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington */
557bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
567bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington/**
577bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington * Implementation details of DBusMessageLoader.
587bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington * All members are private.
597bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington */
607bf62e31a3c820852271768fafc04ba95c31a19fHavoc Penningtonstruct DBusMessageLoader
617bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington{
627bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  int refcount;        /**< Reference count. */
637bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
647bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  DBusString data;     /**< Buffered data */
657bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
667bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  DBusList *messages;  /**< Complete messages. */
677bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
687bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  long max_message_size; /**< Maximum size of a message */
69a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering  long max_message_unix_fds; /**< Maximum unix fds in a message */
707bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
71a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering  DBusValidity corruption_reason; /**< why we were corrupted */
727bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
737bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  unsigned int corrupted : 1; /**< We got broken data, and are no longer working */
749d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington
75a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering  unsigned int buffer_outstanding : 1; /**< Someone is using the buffer to read */
76a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering
77a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering#ifdef HAVE_UNIX_FD_PASSING
78a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering  unsigned int unix_fds_outstanding : 1; /**< Someone is using the unix fd array to read */
79a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering
80a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering  int *unix_fds; /**< File descriptors that have been read from the transport but not yet been handed to any message. Array will be allocated at first use. */
81a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering  unsigned n_unix_fds_allocated; /**< Number of file descriptors this array has space for */
82a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering  unsigned n_unix_fds; /**< Number of valid file descriptors in array */
83a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering#endif
847bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington};
857bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
867bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
877bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington/** How many bits are in the changed_stamp used to validate iterators */
887bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington#define CHANGED_STAMP_BITS 21
897bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
907bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington/**
917bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington * @brief Internals of DBusMessage
927bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington *
937bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington * Object representing a message received from or to be sent to
947bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington * another application. This is an opaque object, all members
957bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington * are private.
967bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington */
977bf62e31a3c820852271768fafc04ba95c31a19fHavoc Penningtonstruct DBusMessage
987bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington{
997bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  DBusAtomic refcount; /**< Reference count */
1007bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
1017bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  DBusHeader header; /**< Header network data and associated cache */
1027bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
1037bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  DBusString body;   /**< Body network data. */
1047bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
1057bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  char byte_order; /**< Message byte order. */
1067bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
1077bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  unsigned int locked : 1; /**< Message being sent, no modifications allowed. */
1087bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
10998ad8a8ec6626f7f5c78915b6bdf2be688b4839fHavoc Pennington#ifndef DBUS_DISABLE_CHECKS
11098ad8a8ec6626f7f5c78915b6bdf2be688b4839fHavoc Pennington  unsigned int in_cache : 1; /**< Has been "freed" since it's in the cache (this is a debug feature) */
11198ad8a8ec6626f7f5c78915b6bdf2be688b4839fHavoc Pennington#endif
112a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering
113bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering  DBusList *counters;   /**< 0-N DBusCounter used to track message size/unix fds. */
1147bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  long size_counter_delta;   /**< Size we incremented the size counters by.   */
1157bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
1167bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  dbus_uint32_t changed_stamp : CHANGED_STAMP_BITS; /**< Incremented when iterators are invalidated. */
1177bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
1187bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  DBusDataSlotList slot_list;   /**< Data stored by allocated integer ID */
1197bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
1207bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington#ifndef DBUS_DISABLE_CHECKS
1217bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  int generation; /**< _dbus_current_generation when message was created */
1227bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington#endif
123a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering
124a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering#ifdef HAVE_UNIX_FD_PASSING
125a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering  int *unix_fds;
126a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering  /**< Unix file descriptors associated with this message. These are
127a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering     closed when the message is destroyed, hence make sure to dup()
128a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering     them when adding or removing them here. */
129a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering  unsigned n_unix_fds; /**< Number of valid fds in the array */
130a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering  unsigned n_unix_fds_allocated; /**< Allocated size of the array */
131bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering
132bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering  long unix_fd_counter_delta; /**< Size we incremented the unix fd counter by */
133a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering#endif
1347bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington};
1357bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
1367bf62e31a3c820852271768fafc04ba95c31a19fHavoc Penningtondbus_bool_t _dbus_message_iter_get_args_valist (DBusMessageIter *iter,
1377bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington                                                DBusError       *error,
1387bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington                                                int              first_arg_type,
1397bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington                                                va_list          var_args);
1407bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
141a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering
142a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poetteringvoid _dbus_check_fdleaks(void);
143a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering
1447bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington/** @} */
1457bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
1467bf62e31a3c820852271768fafc04ba95c31a19fHavoc PenningtonDBUS_END_DECLS
1477bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
1487bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington#endif /* DBUS_MESSAGE_H */
149