1d012387afef0ba02185ebe27bc6bb15551912e92Havoc Pennington/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
2305a8d4d988a1011982e284e358165d3368067ccHavoc Pennington/* dbus-marshal-recursive.h  Marshalling routines for recursive types
3305a8d4d988a1011982e284e358165d3368067ccHavoc Pennington *
49c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Copyright (C) 2004, 2005 Red Hat, Inc.
5305a8d4d988a1011982e284e358165d3368067ccHavoc Pennington *
6305a8d4d988a1011982e284e358165d3368067ccHavoc Pennington * Licensed under the Academic Free License version 2.1
710f0f04980108f92931fd59915939f5f75972639Havoc Pennington *
8305a8d4d988a1011982e284e358165d3368067ccHavoc Pennington * This program is free software; you can redistribute it and/or modify
9305a8d4d988a1011982e284e358165d3368067ccHavoc Pennington * it under the terms of the GNU General Public License as published by
10305a8d4d988a1011982e284e358165d3368067ccHavoc Pennington * the Free Software Foundation; either version 2 of the License, or
11305a8d4d988a1011982e284e358165d3368067ccHavoc Pennington * (at your option) any later version.
12305a8d4d988a1011982e284e358165d3368067ccHavoc Pennington *
13305a8d4d988a1011982e284e358165d3368067ccHavoc Pennington * This program is distributed in the hope that it will be useful,
14305a8d4d988a1011982e284e358165d3368067ccHavoc Pennington * but WITHOUT ANY WARRANTY; without even the implied warranty of
15305a8d4d988a1011982e284e358165d3368067ccHavoc Pennington * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16305a8d4d988a1011982e284e358165d3368067ccHavoc Pennington * GNU General Public License for more details.
1710f0f04980108f92931fd59915939f5f75972639Havoc Pennington *
18305a8d4d988a1011982e284e358165d3368067ccHavoc Pennington * You should have received a copy of the GNU General Public License
19305a8d4d988a1011982e284e358165d3368067ccHavoc 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
21305a8d4d988a1011982e284e358165d3368067ccHavoc Pennington *
22305a8d4d988a1011982e284e358165d3368067ccHavoc Pennington */
23305a8d4d988a1011982e284e358165d3368067ccHavoc Pennington
24305a8d4d988a1011982e284e358165d3368067ccHavoc Pennington#ifndef DBUS_MARSHAL_RECURSIVE_H
25305a8d4d988a1011982e284e358165d3368067ccHavoc Pennington#define DBUS_MARSHAL_RECURSIVE_H
26305a8d4d988a1011982e284e358165d3368067ccHavoc Pennington
27441907e73affff202c75564f4c4b968ff37f094bHavoc Pennington#include <dbus/dbus-protocol.h>
28ec8e14cfd591aa020b199161bacb01d90c6fa158Havoc Pennington#include <dbus/dbus-list.h>
29305a8d4d988a1011982e284e358165d3368067ccHavoc Pennington
309b0fc4e482d6d7d9d6105d876fbbd2182e7b6dd3Havoc Penningtontypedef struct DBusTypeReader      DBusTypeReader;
319b0fc4e482d6d7d9d6105d876fbbd2182e7b6dd3Havoc Penningtontypedef struct DBusTypeWriter      DBusTypeWriter;
329b0fc4e482d6d7d9d6105d876fbbd2182e7b6dd3Havoc Penningtontypedef struct DBusTypeReaderClass DBusTypeReaderClass;
33ec8e14cfd591aa020b199161bacb01d90c6fa158Havoc Penningtontypedef struct DBusArrayLenFixup   DBusArrayLenFixup;
34305a8d4d988a1011982e284e358165d3368067ccHavoc Pennington
3531988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington/**
3631988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington * The type reader is an iterator for reading values from a block of
3731988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington * values.
3831988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington */
39305a8d4d988a1011982e284e358165d3368067ccHavoc Penningtonstruct DBusTypeReader
40305a8d4d988a1011982e284e358165d3368067ccHavoc Pennington{
4131988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington  dbus_uint32_t byte_order : 8; /**< byte order of the block */
424f2318345b8207382926b2c13122a40a4f1eea0fHavoc Pennington
4331988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington  dbus_uint32_t finished : 1;   /**< marks we're at end iterator for cases
444f2318345b8207382926b2c13122a40a4f1eea0fHavoc Pennington                                 * where we don't have another way to tell
454f2318345b8207382926b2c13122a40a4f1eea0fHavoc Pennington                                 */
4631988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington  dbus_uint32_t array_len_offset : 3; /**< bytes back from start_pos that len ends */
4731988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington  const DBusString *type_str;   /**< string containing signature of block */
4831988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington  int type_pos;                 /**< current position in signature */
4931988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington  const DBusString *value_str;  /**< string containing values of block */
5031988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington  int value_pos;                /**< current position in values */
517debfd9ff56c5c2208372142e494c3e4a2defb23Havoc Pennington
5231988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington  const DBusTypeReaderClass *klass; /**< the vtable for the reader */
537debfd9ff56c5c2208372142e494c3e4a2defb23Havoc Pennington  union
547debfd9ff56c5c2208372142e494c3e4a2defb23Havoc Pennington  {
557debfd9ff56c5c2208372142e494c3e4a2defb23Havoc Pennington    struct {
5631988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington      int start_pos;                /**< for array readers, the start of the array values */
577debfd9ff56c5c2208372142e494c3e4a2defb23Havoc Pennington    } array;
5831988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington  } u; /**< class-specific data */
59305a8d4d988a1011982e284e358165d3368067ccHavoc Pennington};
60305a8d4d988a1011982e284e358165d3368067ccHavoc Pennington
6131988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington/**
6231988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington * The type writer is an iterator for writing to a block of values.
6331988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington */
64305a8d4d988a1011982e284e358165d3368067ccHavoc Penningtonstruct DBusTypeWriter
65305a8d4d988a1011982e284e358165d3368067ccHavoc Pennington{
6631988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington  dbus_uint32_t byte_order : 8;            /**< byte order to write values with */
6700999397cef16fa989d055f52a3974f5897ca3b1Havoc Pennington
6831988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington  dbus_uint32_t container_type : 8;        /**< what are we inside? (e.g. struct, variant, array) */
6900999397cef16fa989d055f52a3974f5897ca3b1Havoc Pennington
7031988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington  dbus_uint32_t type_pos_is_expectation : 1; /**< type_pos can be either an insertion point for or an expected next type */
717308a238b236f8c1050fd11035b21b9d50c237c8Havoc Pennington
7231988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington  dbus_uint32_t enabled : 1; /**< whether to write values */
73ec8e14cfd591aa020b199161bacb01d90c6fa158Havoc Pennington
7431988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington  DBusString *type_str; /**< where to write typecodes (or read type expectations) */
7531988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington  int type_pos;         /**< current pos in type_str */
7631988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington  DBusString *value_str; /**< where to write values */
7731988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington  int value_pos;         /**< next position to write */
787debfd9ff56c5c2208372142e494c3e4a2defb23Havoc Pennington
797debfd9ff56c5c2208372142e494c3e4a2defb23Havoc Pennington  union
807debfd9ff56c5c2208372142e494c3e4a2defb23Havoc Pennington  {
817debfd9ff56c5c2208372142e494c3e4a2defb23Havoc Pennington    struct {
8231988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington      int start_pos; /**< position of first element in the array */
8331988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington      int len_pos;   /**< position of length of the array */
8431988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington      int element_type_pos; /**< position of array element type in type_str */
857debfd9ff56c5c2208372142e494c3e4a2defb23Havoc Pennington    } array;
8631988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington  } u; /**< class-specific data */
87305a8d4d988a1011982e284e358165d3368067ccHavoc Pennington};
88305a8d4d988a1011982e284e358165d3368067ccHavoc Pennington
8931988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington/**
9031988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington * When modifying an existing block of values, array lengths may need
9131988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington * to be adjusted; those adjustments are described by this struct.
9231988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington */
93ec8e14cfd591aa020b199161bacb01d90c6fa158Havoc Penningtonstruct DBusArrayLenFixup
94ec8e14cfd591aa020b199161bacb01d90c6fa158Havoc Pennington{
9531988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington  int len_pos_in_reader; /**< where the length was in the original block */
9631988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington  int new_len;           /**< the new value of the length in the written-out block */
97ec8e14cfd591aa020b199161bacb01d90c6fa158Havoc Pennington};
98ec8e14cfd591aa020b199161bacb01d90c6fa158Havoc Pennington
99721e6c7abcfa2f3d7a320d612539a501e8d485afHavoc Penningtonvoid        _dbus_type_reader_init                      (DBusTypeReader        *reader,
100721e6c7abcfa2f3d7a320d612539a501e8d485afHavoc Pennington                                                         int                    byte_order,
101721e6c7abcfa2f3d7a320d612539a501e8d485afHavoc Pennington                                                         const DBusString      *type_str,
102721e6c7abcfa2f3d7a320d612539a501e8d485afHavoc Pennington                                                         int                    type_pos,
103721e6c7abcfa2f3d7a320d612539a501e8d485afHavoc Pennington                                                         const DBusString      *value_str,
104721e6c7abcfa2f3d7a320d612539a501e8d485afHavoc Pennington                                                         int                    value_pos);
105721e6c7abcfa2f3d7a320d612539a501e8d485afHavoc Penningtonvoid        _dbus_type_reader_init_types_only           (DBusTypeReader        *reader,
106721e6c7abcfa2f3d7a320d612539a501e8d485afHavoc Pennington                                                         const DBusString      *type_str,
107721e6c7abcfa2f3d7a320d612539a501e8d485afHavoc Pennington                                                         int                    type_pos);
108721e6c7abcfa2f3d7a320d612539a501e8d485afHavoc Penningtonint         _dbus_type_reader_get_current_type          (const DBusTypeReader  *reader);
10931988af4089f3793940417535f8eabaae1ac26c8Havoc Penningtonint         _dbus_type_reader_get_element_type          (const DBusTypeReader  *reader);
1109c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonint         _dbus_type_reader_get_value_pos             (const DBusTypeReader  *reader);
111721e6c7abcfa2f3d7a320d612539a501e8d485afHavoc Penningtonvoid        _dbus_type_reader_read_basic                (const DBusTypeReader  *reader,
112721e6c7abcfa2f3d7a320d612539a501e8d485afHavoc Pennington                                                         void                  *value);
11361411a061c09def43687153e6c734ff27b7fd556Colin Waltersint         _dbus_type_reader_get_array_length          (const DBusTypeReader  *reader);
1149c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonvoid        _dbus_type_reader_read_fixed_multi          (const DBusTypeReader  *reader,
115c7e05f9ca4ff7ab0c8499b2059004dd38d2c8784Havoc Pennington                                                         void                  *value,
116c7e05f9ca4ff7ab0c8499b2059004dd38d2c8784Havoc Pennington                                                         int                   *n_elements);
1179c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonvoid        _dbus_type_reader_read_raw                  (const DBusTypeReader  *reader,
1189c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                                                         const unsigned char  **value_location);
119721e6c7abcfa2f3d7a320d612539a501e8d485afHavoc Penningtonvoid        _dbus_type_reader_recurse                   (DBusTypeReader        *reader,
120721e6c7abcfa2f3d7a320d612539a501e8d485afHavoc Pennington                                                         DBusTypeReader        *subreader);
121721e6c7abcfa2f3d7a320d612539a501e8d485afHavoc Penningtondbus_bool_t _dbus_type_reader_next                      (DBusTypeReader        *reader);
122721e6c7abcfa2f3d7a320d612539a501e8d485afHavoc Penningtondbus_bool_t _dbus_type_reader_has_next                  (const DBusTypeReader  *reader);
123ffd960fc3e59679c9da9a10e5d8521a1c297eb02Havoc Penningtonvoid        _dbus_type_reader_get_signature             (const DBusTypeReader  *reader,
124ffd960fc3e59679c9da9a10e5d8521a1c297eb02Havoc Pennington                                                         const DBusString     **str_p,
125ffd960fc3e59679c9da9a10e5d8521a1c297eb02Havoc Pennington                                                         int                   *start_p,
126ffd960fc3e59679c9da9a10e5d8521a1c297eb02Havoc Pennington                                                         int                   *len_p);
127fed88a4b843d8bb11cc486a36ba51441a65c506eHavoc Penningtondbus_bool_t _dbus_type_reader_set_basic                 (DBusTypeReader        *reader,
128401aaa225b02ef687fd92266915b4705539d0002Havoc Pennington                                                         const void            *value,
129401aaa225b02ef687fd92266915b4705539d0002Havoc Pennington                                                         const DBusTypeReader  *realign_root);
130c7e05f9ca4ff7ab0c8499b2059004dd38d2c8784Havoc Penningtondbus_bool_t _dbus_type_reader_delete                    (DBusTypeReader        *reader,
131c7e05f9ca4ff7ab0c8499b2059004dd38d2c8784Havoc Pennington                                                         const DBusTypeReader  *realign_root);
1327308a238b236f8c1050fd11035b21b9d50c237c8Havoc Penningtondbus_bool_t _dbus_type_reader_greater_than              (const DBusTypeReader  *lhs,
1337308a238b236f8c1050fd11035b21b9d50c237c8Havoc Pennington                                                         const DBusTypeReader  *rhs);
1347308a238b236f8c1050fd11035b21b9d50c237c8Havoc Pennington
135fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Penningtondbus_bool_t _dbus_type_reader_equal_values              (const DBusTypeReader *lhs,
136fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington                                                         const DBusTypeReader *rhs);
137fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington
13854a2e9f7961b4b8afff94bb0c5b756f986965be6Colin Waltersvoid        _dbus_type_signature_next                   (const char            *signature,
13954a2e9f7961b4b8afff94bb0c5b756f986965be6Colin Walters							 int                   *type_pos);
14054a2e9f7961b4b8afff94bb0c5b756f986965be6Colin Walters
141ec8e14cfd591aa020b199161bacb01d90c6fa158Havoc Penningtonvoid        _dbus_type_writer_init                 (DBusTypeWriter        *writer,
142ec8e14cfd591aa020b199161bacb01d90c6fa158Havoc Pennington                                                    int                    byte_order,
143ec8e14cfd591aa020b199161bacb01d90c6fa158Havoc Pennington                                                    DBusString            *type_str,
144ec8e14cfd591aa020b199161bacb01d90c6fa158Havoc Pennington                                                    int                    type_pos,
145ec8e14cfd591aa020b199161bacb01d90c6fa158Havoc Pennington                                                    DBusString            *value_str,
146ec8e14cfd591aa020b199161bacb01d90c6fa158Havoc Pennington                                                    int                    value_pos);
1479c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonvoid        _dbus_type_writer_init_types_delayed   (DBusTypeWriter        *writer,
1489c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                                                    int                    byte_order,
1499c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                                                    DBusString            *value_str,
1509c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                                                    int                    value_pos);
1519c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonvoid        _dbus_type_writer_add_types            (DBusTypeWriter        *writer,
1529c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                                                    DBusString            *type_str,
1539c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                                                    int                    type_pos);
1549c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonvoid        _dbus_type_writer_remove_types         (DBusTypeWriter        *writer);
155ec8e14cfd591aa020b199161bacb01d90c6fa158Havoc Penningtonvoid        _dbus_type_writer_init_values_only     (DBusTypeWriter        *writer,
156ec8e14cfd591aa020b199161bacb01d90c6fa158Havoc Pennington                                                    int                    byte_order,
157ec8e14cfd591aa020b199161bacb01d90c6fa158Havoc Pennington                                                    const DBusString      *type_str,
158ec8e14cfd591aa020b199161bacb01d90c6fa158Havoc Pennington                                                    int                    type_pos,
159ec8e14cfd591aa020b199161bacb01d90c6fa158Havoc Pennington                                                    DBusString            *value_str,
160ec8e14cfd591aa020b199161bacb01d90c6fa158Havoc Pennington                                                    int                    value_pos);
161ec8e14cfd591aa020b199161bacb01d90c6fa158Havoc Penningtondbus_bool_t _dbus_type_writer_write_basic          (DBusTypeWriter        *writer,
162ec8e14cfd591aa020b199161bacb01d90c6fa158Havoc Pennington                                                    int                    type,
163ec8e14cfd591aa020b199161bacb01d90c6fa158Havoc Pennington                                                    const void            *value);
1649c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_bool_t _dbus_type_writer_write_fixed_multi    (DBusTypeWriter        *writer,
165c7e05f9ca4ff7ab0c8499b2059004dd38d2c8784Havoc Pennington                                                    int                    element_type,
166c7e05f9ca4ff7ab0c8499b2059004dd38d2c8784Havoc Pennington                                                    const void            *value,
167c7e05f9ca4ff7ab0c8499b2059004dd38d2c8784Havoc Pennington                                                    int                    n_elements);
168ec8e14cfd591aa020b199161bacb01d90c6fa158Havoc Penningtondbus_bool_t _dbus_type_writer_recurse              (DBusTypeWriter        *writer,
169ec8e14cfd591aa020b199161bacb01d90c6fa158Havoc Pennington                                                    int                    container_type,
170ec8e14cfd591aa020b199161bacb01d90c6fa158Havoc Pennington                                                    const DBusString      *contained_type,
171ec8e14cfd591aa020b199161bacb01d90c6fa158Havoc Pennington                                                    int                    contained_type_start,
172ec8e14cfd591aa020b199161bacb01d90c6fa158Havoc Pennington                                                    DBusTypeWriter        *sub);
173ec8e14cfd591aa020b199161bacb01d90c6fa158Havoc Penningtondbus_bool_t _dbus_type_writer_unrecurse            (DBusTypeWriter        *writer,
174ec8e14cfd591aa020b199161bacb01d90c6fa158Havoc Pennington                                                    DBusTypeWriter        *sub);
1759c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_bool_t _dbus_type_writer_append_array         (DBusTypeWriter        *writer,
1769c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                                                    const DBusString      *contained_type,
1779c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                                                    int                    contained_type_start,
1789c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                                                    DBusTypeWriter        *sub);
179ec8e14cfd591aa020b199161bacb01d90c6fa158Havoc Penningtondbus_bool_t _dbus_type_writer_write_reader         (DBusTypeWriter        *writer,
180ec8e14cfd591aa020b199161bacb01d90c6fa158Havoc Pennington                                                    DBusTypeReader        *reader);
181ec8e14cfd591aa020b199161bacb01d90c6fa158Havoc Penningtondbus_bool_t _dbus_type_writer_write_reader_partial (DBusTypeWriter        *writer,
182ec8e14cfd591aa020b199161bacb01d90c6fa158Havoc Pennington                                                    DBusTypeReader        *reader,
183ec8e14cfd591aa020b199161bacb01d90c6fa158Havoc Pennington                                                    const DBusTypeReader  *start_after,
184ec8e14cfd591aa020b199161bacb01d90c6fa158Havoc Pennington                                                    int                    start_after_new_pos,
185ec8e14cfd591aa020b199161bacb01d90c6fa158Havoc Pennington                                                    int                    start_after_new_len,
186ec8e14cfd591aa020b199161bacb01d90c6fa158Havoc Pennington                                                    DBusList             **fixups);
187ec8e14cfd591aa020b199161bacb01d90c6fa158Havoc Penningtonvoid        _dbus_type_writer_set_enabled          (DBusTypeWriter        *writer,
188ec8e14cfd591aa020b199161bacb01d90c6fa158Havoc Pennington                                                    dbus_bool_t            enabled);
189ec8e14cfd591aa020b199161bacb01d90c6fa158Havoc Pennington
1902ba05eff37a57d75a0056eecdd2c7d0f5b9556f8Havoc Pennington
191305a8d4d988a1011982e284e358165d3368067ccHavoc Pennington#endif /* DBUS_MARSHAL_RECURSIVE_H */
192