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