| Current File : //usr/share/doc/dbus/api/dbus-marshal-recursive_8c_source.html |
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<title>D-Bus: dbus-marshal-recursive.c Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td style="padding-left: 0.5em;">
<div id="projectname">D-Bus
 <span id="projectnumber">1.8.20</span>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- Generated by Doxygen 1.7.6.1 -->
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main Page</span></a></li>
<li><a href="pages.html"><span>Related Pages</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li><a href="annotated.html"><span>Data Structures</span></a></li>
<li class="current"><a href="files.html"><span>Files</span></a></li>
</ul>
</div>
<div id="navrow2" class="tabs2">
<ul class="tablist">
<li><a href="files.html"><span>File List</span></a></li>
</ul>
</div>
</div>
<div class="header">
<div class="headertitle">
<div class="title">dbus-marshal-recursive.c</div> </div>
</div><!--header-->
<div class="contents">
<div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */</span>
<a name="l00002"></a>00002 <span class="comment">/* dbus-marshal-recursive.c Marshalling routines for recursive types</span>
<a name="l00003"></a>00003 <span class="comment"> *</span>
<a name="l00004"></a>00004 <span class="comment"> * Copyright (C) 2004, 2005 Red Hat, Inc.</span>
<a name="l00005"></a>00005 <span class="comment"> *</span>
<a name="l00006"></a>00006 <span class="comment"> * Licensed under the Academic Free License version 2.1</span>
<a name="l00007"></a>00007 <span class="comment"> *</span>
<a name="l00008"></a>00008 <span class="comment"> * This program is free software; you can redistribute it and/or modify</span>
<a name="l00009"></a>00009 <span class="comment"> * it under the terms of the GNU General Public License as published by</span>
<a name="l00010"></a>00010 <span class="comment"> * the Free Software Foundation; either version 2 of the License, or</span>
<a name="l00011"></a>00011 <span class="comment"> * (at your option) any later version.</span>
<a name="l00012"></a>00012 <span class="comment"> *</span>
<a name="l00013"></a>00013 <span class="comment"> * This program is distributed in the hope that it will be useful,</span>
<a name="l00014"></a>00014 <span class="comment"> * but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
<a name="l00015"></a>00015 <span class="comment"> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span>
<a name="l00016"></a>00016 <span class="comment"> * GNU General Public License for more details.</span>
<a name="l00017"></a>00017 <span class="comment"> *</span>
<a name="l00018"></a>00018 <span class="comment"> * You should have received a copy of the GNU General Public License</span>
<a name="l00019"></a>00019 <span class="comment"> * along with this program; if not, write to the Free Software</span>
<a name="l00020"></a>00020 <span class="comment"> * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA</span>
<a name="l00021"></a>00021 <span class="comment"> *</span>
<a name="l00022"></a>00022 <span class="comment"> */</span>
<a name="l00023"></a>00023
<a name="l00024"></a>00024 <span class="preprocessor">#include <config.h></span>
<a name="l00025"></a>00025 <span class="preprocessor">#include "dbus-marshal-recursive.h"</span>
<a name="l00026"></a>00026 <span class="preprocessor">#include "dbus-marshal-basic.h"</span>
<a name="l00027"></a>00027 <span class="preprocessor">#include "dbus-signature.h"</span>
<a name="l00028"></a>00028 <span class="preprocessor">#include "dbus-internals.h"</span>
<a name="l00029"></a>00029
<a name="l00035"></a>00035 <span class="keyword">static</span> <a class="code" href="group__DBusTypes.html#ga39c9cb0f3a2a8ad6f55cc4855d035349" title="A boolean, valid values are TRUE and FALSE.">dbus_bool_t</a> _dbus_type_reader_greater_than (<span class="keyword">const</span> <a class="code" href="structDBusTypeReader.html" title="The type reader is an iterator for reading values from a block of values.">DBusTypeReader</a> *lhs,
<a name="l00036"></a>00036 <span class="keyword">const</span> <a class="code" href="structDBusTypeReader.html" title="The type reader is an iterator for reading values from a block of values.">DBusTypeReader</a> *rhs);
<a name="l00037"></a>00037
<a name="l00038"></a>00038 <span class="keyword">static</span> <span class="keywordtype">void</span> _dbus_type_writer_set_enabled (<a class="code" href="structDBusTypeWriter.html" title="The type writer is an iterator for writing to a block of values.">DBusTypeWriter</a> *writer,
<a name="l00039"></a>00039 <a class="code" href="group__DBusTypes.html#ga39c9cb0f3a2a8ad6f55cc4855d035349" title="A boolean, valid values are TRUE and FALSE.">dbus_bool_t</a> enabled);
<a name="l00040"></a>00040 <span class="keyword">static</span> <a class="code" href="group__DBusTypes.html#ga39c9cb0f3a2a8ad6f55cc4855d035349" title="A boolean, valid values are TRUE and FALSE.">dbus_bool_t</a> _dbus_type_writer_write_reader_partial (<a class="code" href="structDBusTypeWriter.html" title="The type writer is an iterator for writing to a block of values.">DBusTypeWriter</a> *writer,
<a name="l00041"></a>00041 <a class="code" href="structDBusTypeReader.html" title="The type reader is an iterator for reading values from a block of values.">DBusTypeReader</a> *reader,
<a name="l00042"></a>00042 <span class="keyword">const</span> <a class="code" href="structDBusTypeReader.html" title="The type reader is an iterator for reading values from a block of values.">DBusTypeReader</a> *start_after,
<a name="l00043"></a>00043 <span class="keywordtype">int</span> start_after_new_pos,
<a name="l00044"></a>00044 <span class="keywordtype">int</span> start_after_new_len,
<a name="l00045"></a>00045 <a class="code" href="structDBusList.html" title="A node in a linked list.">DBusList</a> **fixups);
<a name="l00046"></a>00046
<a name="l00048"></a><a class="code" href="group__DBusMarshal.html#ga2055dc20f1e0c13064cebf1fb65b8ce8">00048</a> <span class="preprocessor">#define RECURSIVE_MARSHAL_READ_TRACE 0</span>
<a name="l00049"></a>00049 <span class="preprocessor"></span>
<a name="l00051"></a><a class="code" href="group__DBusMarshal.html#ga428a18f23d9a4c59560f03fd2088fe7f">00051</a> <span class="preprocessor">#define RECURSIVE_MARSHAL_WRITE_TRACE 0</span>
<a name="l00052"></a>00052 <span class="preprocessor"></span>
<a name="l00053"></a>00053 <span class="keyword">static</span> <span class="keywordtype">void</span>
<a name="l00054"></a>00054 free_fixups (<a class="code" href="structDBusList.html" title="A node in a linked list.">DBusList</a> **fixups)
<a name="l00055"></a>00055 {
<a name="l00056"></a>00056 <a class="code" href="structDBusList.html" title="A node in a linked list.">DBusList</a> *link;
<a name="l00057"></a>00057
<a name="l00058"></a>00058 link = <a class="code" href="group__DBusList.html#ga1e26ce4fb4acb50593bd5ed2f4eeb3ae" title="Gets the first link in the list.">_dbus_list_get_first_link</a> (fixups);
<a name="l00059"></a>00059 <span class="keywordflow">while</span> (link != <a class="code" href="group__DBusMacros.html#ga070d2ce7b6bb7e5c05602aa8c308d0c4" title="A null pointer, defined appropriately for C or C++.">NULL</a>)
<a name="l00060"></a>00060 {
<a name="l00061"></a>00061 <a class="code" href="structDBusList.html" title="A node in a linked list.">DBusList</a> *next;
<a name="l00062"></a>00062
<a name="l00063"></a>00063 next = <a class="code" href="group__DBusList.html#gaede4ace46d5ee497d75074bfec4490a2" title="Gets the next link in the list, or NULL if there are no more links.">_dbus_list_get_next_link</a> (fixups, link);
<a name="l00064"></a>00064
<a name="l00065"></a>00065 <a class="code" href="group__DBusMemory.html#ga34e666b19b015035a9a31e53da84b39a" title="Frees a block of memory previously allocated by dbus_malloc() or dbus_malloc0().">dbus_free</a> (link-><a class="code" href="structDBusList.html#a29ab457bcf9092252bb0c4282c727055" title="Data stored at this element.">data</a>);
<a name="l00066"></a>00066 <a class="code" href="group__DBusList.html#ga6e824f717125ce40c549d5402e32610f" title="Frees a linked list node allocated with _dbus_list_alloc_link.">_dbus_list_free_link</a> (link);
<a name="l00067"></a>00067
<a name="l00068"></a>00068 link = next;
<a name="l00069"></a>00069 }
<a name="l00070"></a>00070
<a name="l00071"></a>00071 *fixups = <a class="code" href="group__DBusMacros.html#ga070d2ce7b6bb7e5c05602aa8c308d0c4" title="A null pointer, defined appropriately for C or C++.">NULL</a>;
<a name="l00072"></a>00072 }
<a name="l00073"></a>00073
<a name="l00074"></a>00074 <span class="keyword">static</span> <span class="keywordtype">void</span>
<a name="l00075"></a>00075 apply_and_free_fixups (<a class="code" href="structDBusList.html" title="A node in a linked list.">DBusList</a> **fixups,
<a name="l00076"></a>00076 <a class="code" href="structDBusTypeReader.html" title="The type reader is an iterator for reading values from a block of values.">DBusTypeReader</a> *reader)
<a name="l00077"></a>00077 {
<a name="l00078"></a>00078 <a class="code" href="structDBusList.html" title="A node in a linked list.">DBusList</a> *link;
<a name="l00079"></a>00079
<a name="l00080"></a>00080 <span class="preprocessor">#if RECURSIVE_MARSHAL_WRITE_TRACE</span>
<a name="l00081"></a>00081 <span class="preprocessor"></span> <span class="keywordflow">if</span> (*fixups)
<a name="l00082"></a>00082 _dbus_verbose (<span class="stringliteral">" %d FIXUPS to apply\n"</span>,
<a name="l00083"></a>00083 <a class="code" href="group__DBusList.html#gaa2144a5489bb35b16b2b671488ad597c" title="Gets the length of a list.">_dbus_list_get_length</a> (fixups));
<a name="l00084"></a>00084 <span class="preprocessor">#endif</span>
<a name="l00085"></a>00085 <span class="preprocessor"></span>
<a name="l00086"></a>00086 link = <a class="code" href="group__DBusList.html#ga1e26ce4fb4acb50593bd5ed2f4eeb3ae" title="Gets the first link in the list.">_dbus_list_get_first_link</a> (fixups);
<a name="l00087"></a>00087 <span class="keywordflow">while</span> (link != <a class="code" href="group__DBusMacros.html#ga070d2ce7b6bb7e5c05602aa8c308d0c4" title="A null pointer, defined appropriately for C or C++.">NULL</a>)
<a name="l00088"></a>00088 {
<a name="l00089"></a>00089 <a class="code" href="structDBusList.html" title="A node in a linked list.">DBusList</a> *next;
<a name="l00090"></a>00090
<a name="l00091"></a>00091 next = <a class="code" href="group__DBusList.html#gaede4ace46d5ee497d75074bfec4490a2" title="Gets the next link in the list, or NULL if there are no more links.">_dbus_list_get_next_link</a> (fixups, link);
<a name="l00092"></a>00092
<a name="l00093"></a>00093 <span class="keywordflow">if</span> (reader)
<a name="l00094"></a>00094 {
<a name="l00095"></a>00095 <a class="code" href="structDBusArrayLenFixup.html" title="When modifying an existing block of values, array lengths may need to be adjusted; those adjustments ...">DBusArrayLenFixup</a> *f;
<a name="l00096"></a>00096
<a name="l00097"></a>00097 f = link-><a class="code" href="structDBusList.html#a29ab457bcf9092252bb0c4282c727055" title="Data stored at this element.">data</a>;
<a name="l00098"></a>00098
<a name="l00099"></a>00099 <span class="preprocessor">#if RECURSIVE_MARSHAL_WRITE_TRACE</span>
<a name="l00100"></a>00100 <span class="preprocessor"></span> _dbus_verbose (<span class="stringliteral">" applying FIXUP to reader %p at pos %d new_len = %d old len %d\n"</span>,
<a name="l00101"></a>00101 reader, f-><a class="code" href="structDBusArrayLenFixup.html#aad03f6087695c9e9b409817ac34c6e2b" title="where the length was in the original block">len_pos_in_reader</a>, f-><a class="code" href="structDBusArrayLenFixup.html#a97cccea61d89992e6ad3a19bd569dd2f" title="the new value of the length in the written-out block">new_len</a>,
<a name="l00102"></a>00102 <a class="code" href="group__DBusMarshal.html#ga6dd82a202c19758cbf76dbed2946615d" title="Convenience function to demarshal a 32 bit unsigned integer.">_dbus_marshal_read_uint32</a> (reader-><a class="code" href="structDBusTypeReader.html#a4065d7775758beb044ee23a71875571f" title="string containing values of block">value_str</a>,
<a name="l00103"></a>00103 f-><a class="code" href="structDBusArrayLenFixup.html#aad03f6087695c9e9b409817ac34c6e2b" title="where the length was in the original block">len_pos_in_reader</a>,
<a name="l00104"></a>00104 reader-><a class="code" href="structDBusTypeReader.html#aeb0846d954066f420e1df98b81148702" title="byte order of the block">byte_order</a>, <a class="code" href="group__DBusMacros.html#ga070d2ce7b6bb7e5c05602aa8c308d0c4" title="A null pointer, defined appropriately for C or C++.">NULL</a>));
<a name="l00105"></a>00105 <span class="preprocessor">#endif</span>
<a name="l00106"></a>00106 <span class="preprocessor"></span>
<a name="l00107"></a>00107 <a class="code" href="group__DBusMarshal.html#ga4bcfb6a664c7e46c7ffc31f96d532a02" title="Sets the 4 bytes at the given offset to a marshaled unsigned integer, replacing anything found there ...">_dbus_marshal_set_uint32</a> ((<a class="code" href="structDBusString.html">DBusString</a>*) reader-><a class="code" href="structDBusTypeReader.html#a4065d7775758beb044ee23a71875571f" title="string containing values of block">value_str</a>,
<a name="l00108"></a>00108 f-><a class="code" href="structDBusArrayLenFixup.html#aad03f6087695c9e9b409817ac34c6e2b" title="where the length was in the original block">len_pos_in_reader</a>,
<a name="l00109"></a>00109 f-><a class="code" href="structDBusArrayLenFixup.html#a97cccea61d89992e6ad3a19bd569dd2f" title="the new value of the length in the written-out block">new_len</a>,
<a name="l00110"></a>00110 reader-><a class="code" href="structDBusTypeReader.html#aeb0846d954066f420e1df98b81148702" title="byte order of the block">byte_order</a>);
<a name="l00111"></a>00111 }
<a name="l00112"></a>00112
<a name="l00113"></a>00113 <a class="code" href="group__DBusMemory.html#ga34e666b19b015035a9a31e53da84b39a" title="Frees a block of memory previously allocated by dbus_malloc() or dbus_malloc0().">dbus_free</a> (link-><a class="code" href="structDBusList.html#a29ab457bcf9092252bb0c4282c727055" title="Data stored at this element.">data</a>);
<a name="l00114"></a>00114 <a class="code" href="group__DBusList.html#ga6e824f717125ce40c549d5402e32610f" title="Frees a linked list node allocated with _dbus_list_alloc_link.">_dbus_list_free_link</a> (link);
<a name="l00115"></a>00115
<a name="l00116"></a>00116 link = next;
<a name="l00117"></a>00117 }
<a name="l00118"></a>00118
<a name="l00119"></a>00119 *fixups = <a class="code" href="group__DBusMacros.html#ga070d2ce7b6bb7e5c05602aa8c308d0c4" title="A null pointer, defined appropriately for C or C++.">NULL</a>;
<a name="l00120"></a>00120 }
<a name="l00121"></a>00121
<a name="l00125"></a><a class="code" href="structDBusTypeReaderClass.html">00125</a> <span class="keyword">struct </span><a class="code" href="structDBusTypeReaderClass.html" title="Virtual table for a type reader.">DBusTypeReaderClass</a>
<a name="l00126"></a>00126 {
<a name="l00127"></a><a class="code" href="structDBusTypeReaderClass.html#afd813c32ff4b8b96266efe392dc25a89">00127</a> <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="structDBusTypeReaderClass.html#afd813c32ff4b8b96266efe392dc25a89" title="name for debugging">name</a>;
<a name="l00128"></a><a class="code" href="structDBusTypeReaderClass.html#a7cd297c0e03c5204bc41bf305c7688c9">00128</a> <span class="keywordtype">int</span> <a class="code" href="structDBusTypeReaderClass.html#a7cd297c0e03c5204bc41bf305c7688c9" title="index in all_reader_classes">id</a>;
<a name="l00129"></a><a class="code" href="structDBusTypeReaderClass.html#ad886037cd736e6f5cdbefb834b0bd5e7">00129</a> <a class="code" href="group__DBusTypes.html#ga39c9cb0f3a2a8ad6f55cc4855d035349" title="A boolean, valid values are TRUE and FALSE.">dbus_bool_t</a> <a class="code" href="structDBusTypeReaderClass.html#ad886037cd736e6f5cdbefb834b0bd5e7" title="only iterates over types, not values">types_only</a>;
<a name="l00130"></a><a class="code" href="structDBusTypeReaderClass.html#abe8f7f4433f8c8eaf0c5f8d445101391">00130</a> void (* <a class="code" href="structDBusTypeReaderClass.html#abe8f7f4433f8c8eaf0c5f8d445101391" title="recurse with this reader as sub">recurse</a>) (<a class="code" href="structDBusTypeReader.html" title="The type reader is an iterator for reading values from a block of values.">DBusTypeReader</a> *sub,
<a name="l00131"></a>00131 <a class="code" href="structDBusTypeReader.html" title="The type reader is an iterator for reading values from a block of values.">DBusTypeReader</a> *parent);
<a name="l00132"></a><a class="code" href="structDBusTypeReaderClass.html#a023bc5274f7bf1f45f29822aebae96a1">00132</a> <a class="code" href="group__DBusTypes.html#ga39c9cb0f3a2a8ad6f55cc4855d035349" title="A boolean, valid values are TRUE and FALSE.">dbus_bool_t</a> (* <a class="code" href="structDBusTypeReaderClass.html#a023bc5274f7bf1f45f29822aebae96a1" title="check whether reader is at the end">check_finished</a>) (<span class="keyword">const</span> <a class="code" href="structDBusTypeReader.html" title="The type reader is an iterator for reading values from a block of values.">DBusTypeReader</a> *reader);
<a name="l00133"></a><a class="code" href="structDBusTypeReaderClass.html#a1b4a87e6f61339456f2e8d0ce873f379">00133</a> void (* next) (<a class="code" href="structDBusTypeReader.html" title="The type reader is an iterator for reading values from a block of values.">DBusTypeReader</a> *reader,
<a name="l00134"></a>00134 <span class="keywordtype">int</span> current_type);
<a name="l00135"></a>00135 };
<a name="l00136"></a>00136
<a name="l00137"></a>00137 <span class="keyword">static</span> <span class="keywordtype">int</span>
<a name="l00138"></a>00138 element_type_get_alignment (<span class="keyword">const</span> <a class="code" href="structDBusString.html">DBusString</a> *str,
<a name="l00139"></a>00139 <span class="keywordtype">int</span> pos)
<a name="l00140"></a>00140 {
<a name="l00141"></a>00141 <span class="keywordflow">return</span> <a class="code" href="group__DBusMarshal.html#ga2ba80f227880e442c140bc67653b0abd" title="Gets the alignment requirement for the given type; will be 1, 4, or 8.">_dbus_type_get_alignment</a> (<a class="code" href="group__DBusMarshal.html#ga5866a0fd058aed3396402d0456144fd2" title="Get the first type in the signature.">_dbus_first_type_in_signature</a> (str, pos));
<a name="l00142"></a>00142 }
<a name="l00143"></a>00143
<a name="l00144"></a>00144 <span class="keyword">static</span> <span class="keywordtype">void</span>
<a name="l00145"></a>00145 reader_init (<a class="code" href="structDBusTypeReader.html" title="The type reader is an iterator for reading values from a block of values.">DBusTypeReader</a> *reader,
<a name="l00146"></a>00146 <span class="keywordtype">int</span> byte_order,
<a name="l00147"></a>00147 <span class="keyword">const</span> <a class="code" href="structDBusString.html">DBusString</a> *type_str,
<a name="l00148"></a>00148 <span class="keywordtype">int</span> type_pos,
<a name="l00149"></a>00149 <span class="keyword">const</span> <a class="code" href="structDBusString.html">DBusString</a> *value_str,
<a name="l00150"></a>00150 <span class="keywordtype">int</span> value_pos)
<a name="l00151"></a>00151 {
<a name="l00152"></a>00152 _DBUS_ZERO (*reader);
<a name="l00153"></a>00153 reader-><a class="code" href="structDBusTypeReader.html#aeb0846d954066f420e1df98b81148702" title="byte order of the block">byte_order</a> = byte_order;
<a name="l00154"></a>00154 reader-><a class="code" href="structDBusTypeReader.html#a551e64ee83df38ebda8c3677a91afe1b" title="marks we're at end iterator for cases where we don't have another way to tell">finished</a> = <a class="code" href="group__DBusMacros.html#gaa93f0eb578d23995850d61f7d61c55c1" title="Expands to "0".">FALSE</a>;
<a name="l00155"></a>00155 reader-><a class="code" href="structDBusTypeReader.html#af52e270ededd0aabb642c6130a3e9e40" title="string containing signature of block">type_str</a> = type_str;
<a name="l00156"></a>00156 reader-><a class="code" href="structDBusTypeReader.html#a160a55f9869e297572c5aa5b6ce7bc71" title="current position in signature">type_pos</a> = type_pos;
<a name="l00157"></a>00157 reader-><a class="code" href="structDBusTypeReader.html#a4065d7775758beb044ee23a71875571f" title="string containing values of block">value_str</a> = value_str;
<a name="l00158"></a>00158 reader-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a> = value_pos;
<a name="l00159"></a>00159 }
<a name="l00160"></a>00160
<a name="l00161"></a>00161 <span class="keyword">static</span> <span class="keywordtype">void</span>
<a name="l00162"></a>00162 base_reader_recurse (<a class="code" href="structDBusTypeReader.html" title="The type reader is an iterator for reading values from a block of values.">DBusTypeReader</a> *sub,
<a name="l00163"></a>00163 <a class="code" href="structDBusTypeReader.html" title="The type reader is an iterator for reading values from a block of values.">DBusTypeReader</a> *parent)
<a name="l00164"></a>00164 {
<a name="l00165"></a>00165 <span class="comment">/* point subreader at the same place as parent */</span>
<a name="l00166"></a>00166 reader_init (sub,
<a name="l00167"></a>00167 parent-><a class="code" href="structDBusTypeReader.html#aeb0846d954066f420e1df98b81148702" title="byte order of the block">byte_order</a>,
<a name="l00168"></a>00168 parent-><a class="code" href="structDBusTypeReader.html#af52e270ededd0aabb642c6130a3e9e40" title="string containing signature of block">type_str</a>,
<a name="l00169"></a>00169 parent-><a class="code" href="structDBusTypeReader.html#a160a55f9869e297572c5aa5b6ce7bc71" title="current position in signature">type_pos</a>,
<a name="l00170"></a>00170 parent-><a class="code" href="structDBusTypeReader.html#a4065d7775758beb044ee23a71875571f" title="string containing values of block">value_str</a>,
<a name="l00171"></a>00171 parent-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a>);
<a name="l00172"></a>00172 }
<a name="l00173"></a>00173
<a name="l00174"></a>00174 <span class="keyword">static</span> <span class="keywordtype">void</span>
<a name="l00175"></a>00175 struct_or_dict_entry_types_only_reader_recurse (<a class="code" href="structDBusTypeReader.html" title="The type reader is an iterator for reading values from a block of values.">DBusTypeReader</a> *sub,
<a name="l00176"></a>00176 <a class="code" href="structDBusTypeReader.html" title="The type reader is an iterator for reading values from a block of values.">DBusTypeReader</a> *parent)
<a name="l00177"></a>00177 {
<a name="l00178"></a>00178 base_reader_recurse (sub, parent);
<a name="l00179"></a>00179
<a name="l00180"></a>00180 _dbus_assert (<a class="code" href="group__DBusString.html#gac1cb7b207eac3c6527a5d42fbc5449b1" title="Gets the byte at the given position.">_dbus_string_get_byte</a> (sub-><a class="code" href="structDBusTypeReader.html#af52e270ededd0aabb642c6130a3e9e40" title="string containing signature of block">type_str</a>,
<a name="l00181"></a>00181 sub-><a class="code" href="structDBusTypeReader.html#a160a55f9869e297572c5aa5b6ce7bc71" title="current position in signature">type_pos</a>) == <a class="code" href="group__DBusProtocol.html#ga725657eca93175475e0694b858f51fd6" title="Code marking the start of a struct type in a type signature.">DBUS_STRUCT_BEGIN_CHAR</a> ||
<a name="l00182"></a>00182 <a class="code" href="group__DBusString.html#gac1cb7b207eac3c6527a5d42fbc5449b1" title="Gets the byte at the given position.">_dbus_string_get_byte</a> (sub-><a class="code" href="structDBusTypeReader.html#af52e270ededd0aabb642c6130a3e9e40" title="string containing signature of block">type_str</a>,
<a name="l00183"></a>00183 sub-><a class="code" href="structDBusTypeReader.html#a160a55f9869e297572c5aa5b6ce7bc71" title="current position in signature">type_pos</a>) == <a class="code" href="group__DBusProtocol.html#gad51b5f7a2e6d927295479dd371f6b353" title="Code marking the start of a dict entry type in a type signature.">DBUS_DICT_ENTRY_BEGIN_CHAR</a>);
<a name="l00184"></a>00184
<a name="l00185"></a>00185 sub-><a class="code" href="structDBusTypeReader.html#a160a55f9869e297572c5aa5b6ce7bc71" title="current position in signature">type_pos</a> += 1;
<a name="l00186"></a>00186 }
<a name="l00187"></a>00187
<a name="l00188"></a>00188 <span class="keyword">static</span> <span class="keywordtype">void</span>
<a name="l00189"></a>00189 struct_or_dict_entry_reader_recurse (<a class="code" href="structDBusTypeReader.html" title="The type reader is an iterator for reading values from a block of values.">DBusTypeReader</a> *sub,
<a name="l00190"></a>00190 <a class="code" href="structDBusTypeReader.html" title="The type reader is an iterator for reading values from a block of values.">DBusTypeReader</a> *parent)
<a name="l00191"></a>00191 {
<a name="l00192"></a>00192 struct_or_dict_entry_types_only_reader_recurse (sub, parent);
<a name="l00193"></a>00193
<a name="l00194"></a>00194 <span class="comment">/* struct and dict entry have 8 byte alignment */</span>
<a name="l00195"></a>00195 sub-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a> = _DBUS_ALIGN_VALUE (sub-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a>, 8);
<a name="l00196"></a>00196 }
<a name="l00197"></a>00197
<a name="l00198"></a>00198 <span class="keyword">static</span> <span class="keywordtype">void</span>
<a name="l00199"></a>00199 array_types_only_reader_recurse (<a class="code" href="structDBusTypeReader.html" title="The type reader is an iterator for reading values from a block of values.">DBusTypeReader</a> *sub,
<a name="l00200"></a>00200 <a class="code" href="structDBusTypeReader.html" title="The type reader is an iterator for reading values from a block of values.">DBusTypeReader</a> *parent)
<a name="l00201"></a>00201 {
<a name="l00202"></a>00202 base_reader_recurse (sub, parent);
<a name="l00203"></a>00203
<a name="l00204"></a>00204 <span class="comment">/* point type_pos at the array element type */</span>
<a name="l00205"></a>00205 sub-><a class="code" href="structDBusTypeReader.html#a160a55f9869e297572c5aa5b6ce7bc71" title="current position in signature">type_pos</a> += 1;
<a name="l00206"></a>00206
<a name="l00207"></a>00207 <span class="comment">/* Init with values likely to crash things if misused */</span>
<a name="l00208"></a>00208 sub-><a class="code" href="structDBusTypeReader.html#ada12bed6758840dc19b1fcb271fb01be" title="class-specific data">u</a>.array.start_pos = _DBUS_INT_MAX;
<a name="l00209"></a>00209 sub-><a class="code" href="structDBusTypeReader.html#a930fb8d6c82f269b0a151cfb33df86b3" title="bytes back from start_pos that len ends">array_len_offset</a> = 7;
<a name="l00210"></a>00210 }
<a name="l00211"></a>00211
<a name="l00214"></a><a class="code" href="group__DBusMarshal.html#gacca774d24b7d7e790b169f23d3362497">00214</a> <span class="preprocessor">#define ARRAY_READER_LEN_POS(reader) \</span>
<a name="l00215"></a>00215 <span class="preprocessor"> ((reader)->u.array.start_pos - ((int)(reader)->array_len_offset) - 4)</span>
<a name="l00216"></a>00216 <span class="preprocessor"></span>
<a name="l00217"></a>00217 <span class="keyword">static</span> <span class="keywordtype">int</span>
<a name="l00218"></a>00218 array_reader_get_array_len (<span class="keyword">const</span> <a class="code" href="structDBusTypeReader.html" title="The type reader is an iterator for reading values from a block of values.">DBusTypeReader</a> *reader)
<a name="l00219"></a>00219 {
<a name="l00220"></a>00220 <a class="code" href="group__DBusTypes.html#gaf513803b030613a669cc7ef199f90a8b" title="A 32-bit unsigned integer on all platforms.">dbus_uint32_t</a> array_len;
<a name="l00221"></a>00221 <span class="keywordtype">int</span> len_pos;
<a name="l00222"></a>00222
<a name="l00223"></a>00223 len_pos = <a class="code" href="group__DBusMarshal.html#gacca774d24b7d7e790b169f23d3362497" title="compute position of array length given array_len_offset, which is the offset back from start_pos to e...">ARRAY_READER_LEN_POS</a> (reader);
<a name="l00224"></a>00224
<a name="l00225"></a>00225 _dbus_assert (_DBUS_ALIGN_VALUE (len_pos, 4) == (<span class="keywordtype">unsigned</span>) len_pos);
<a name="l00226"></a>00226 array_len = <a class="code" href="group__DBusMarshal.html#ga50a9187b315cfcd6b311ed1b36488c05" title="Unpacks a 32 bit unsigned integer from a data pointer.">_dbus_unpack_uint32</a> (reader-><a class="code" href="structDBusTypeReader.html#aeb0846d954066f420e1df98b81148702" title="byte order of the block">byte_order</a>,
<a name="l00227"></a>00227 <a class="code" href="group__DBusString.html#ga8c202a65e938f9bdb859fc6705a4f1bb" title="const version of _dbus_string_get_data_len().">_dbus_string_get_const_data_len</a> (reader-><a class="code" href="structDBusTypeReader.html#a4065d7775758beb044ee23a71875571f" title="string containing values of block">value_str</a>, len_pos, 4));
<a name="l00228"></a>00228
<a name="l00229"></a>00229 <span class="preprocessor">#if RECURSIVE_MARSHAL_READ_TRACE</span>
<a name="l00230"></a>00230 <span class="preprocessor"></span> _dbus_verbose (<span class="stringliteral">" reader %p len_pos %d array len %u len_offset %d\n"</span>,
<a name="l00231"></a>00231 reader, len_pos, array_len, reader-><a class="code" href="structDBusTypeReader.html#a930fb8d6c82f269b0a151cfb33df86b3" title="bytes back from start_pos that len ends">array_len_offset</a>);
<a name="l00232"></a>00232 <span class="preprocessor">#endif</span>
<a name="l00233"></a>00233 <span class="preprocessor"></span>
<a name="l00234"></a>00234 _dbus_assert (reader-><a class="code" href="structDBusTypeReader.html#ada12bed6758840dc19b1fcb271fb01be" title="class-specific data">u</a>.array.start_pos - len_pos - 4 < 8);
<a name="l00235"></a>00235
<a name="l00236"></a>00236 <span class="keywordflow">return</span> array_len;
<a name="l00237"></a>00237 }
<a name="l00238"></a>00238
<a name="l00239"></a>00239 <span class="keyword">static</span> <span class="keywordtype">void</span>
<a name="l00240"></a>00240 array_reader_recurse (<a class="code" href="structDBusTypeReader.html" title="The type reader is an iterator for reading values from a block of values.">DBusTypeReader</a> *sub,
<a name="l00241"></a>00241 <a class="code" href="structDBusTypeReader.html" title="The type reader is an iterator for reading values from a block of values.">DBusTypeReader</a> *parent)
<a name="l00242"></a>00242 {
<a name="l00243"></a>00243 <span class="keywordtype">int</span> alignment;
<a name="l00244"></a>00244 <span class="keywordtype">int</span> len_pos;
<a name="l00245"></a>00245
<a name="l00246"></a>00246 array_types_only_reader_recurse (sub, parent);
<a name="l00247"></a>00247
<a name="l00248"></a>00248 sub-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a> = _DBUS_ALIGN_VALUE (sub-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a>, 4);
<a name="l00249"></a>00249
<a name="l00250"></a>00250 len_pos = sub-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a>;
<a name="l00251"></a>00251
<a name="l00252"></a>00252 sub-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a> += 4; <span class="comment">/* for the length */</span>
<a name="l00253"></a>00253
<a name="l00254"></a>00254 alignment = element_type_get_alignment (sub-><a class="code" href="structDBusTypeReader.html#af52e270ededd0aabb642c6130a3e9e40" title="string containing signature of block">type_str</a>,
<a name="l00255"></a>00255 sub-><a class="code" href="structDBusTypeReader.html#a160a55f9869e297572c5aa5b6ce7bc71" title="current position in signature">type_pos</a>);
<a name="l00256"></a>00256
<a name="l00257"></a>00257 sub-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a> = _DBUS_ALIGN_VALUE (sub-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a>, alignment);
<a name="l00258"></a>00258
<a name="l00259"></a>00259 sub-><a class="code" href="structDBusTypeReader.html#ada12bed6758840dc19b1fcb271fb01be" title="class-specific data">u</a>.array.start_pos = sub-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a>;
<a name="l00260"></a>00260 _dbus_assert ((sub-><a class="code" href="structDBusTypeReader.html#ada12bed6758840dc19b1fcb271fb01be" title="class-specific data">u</a>.array.start_pos - (len_pos + 4)) < 8); <span class="comment">/* only 3 bits in array_len_offset */</span>
<a name="l00261"></a>00261 sub-><a class="code" href="structDBusTypeReader.html#a930fb8d6c82f269b0a151cfb33df86b3" title="bytes back from start_pos that len ends">array_len_offset</a> = sub-><a class="code" href="structDBusTypeReader.html#ada12bed6758840dc19b1fcb271fb01be" title="class-specific data">u</a>.array.start_pos - (len_pos + 4);
<a name="l00262"></a>00262
<a name="l00263"></a>00263 <span class="preprocessor">#if RECURSIVE_MARSHAL_READ_TRACE</span>
<a name="l00264"></a>00264 <span class="preprocessor"></span> _dbus_verbose (<span class="stringliteral">" type reader %p array start = %d len_offset = %d array len = %d array element type = %s\n"</span>,
<a name="l00265"></a>00265 sub,
<a name="l00266"></a>00266 sub-><a class="code" href="structDBusTypeReader.html#ada12bed6758840dc19b1fcb271fb01be" title="class-specific data">u</a>.array.start_pos,
<a name="l00267"></a>00267 sub-><a class="code" href="structDBusTypeReader.html#a930fb8d6c82f269b0a151cfb33df86b3" title="bytes back from start_pos that len ends">array_len_offset</a>,
<a name="l00268"></a>00268 array_reader_get_array_len (sub),
<a name="l00269"></a>00269 <a class="code" href="group__DBusMarshal.html#ga48a595c2b26dce6e9c25ce040e5247e5" title="Returns a string describing the given type.">_dbus_type_to_string</a> (<a class="code" href="group__DBusMarshal.html#ga5866a0fd058aed3396402d0456144fd2" title="Get the first type in the signature.">_dbus_first_type_in_signature</a> (sub-><a class="code" href="structDBusTypeReader.html#af52e270ededd0aabb642c6130a3e9e40" title="string containing signature of block">type_str</a>,
<a name="l00270"></a>00270 sub-><a class="code" href="structDBusTypeReader.html#a160a55f9869e297572c5aa5b6ce7bc71" title="current position in signature">type_pos</a>)));
<a name="l00271"></a>00271 <span class="preprocessor">#endif</span>
<a name="l00272"></a>00272 <span class="preprocessor"></span>}
<a name="l00273"></a>00273
<a name="l00274"></a>00274 <span class="keyword">static</span> <span class="keywordtype">void</span>
<a name="l00275"></a>00275 variant_reader_recurse (<a class="code" href="structDBusTypeReader.html" title="The type reader is an iterator for reading values from a block of values.">DBusTypeReader</a> *sub,
<a name="l00276"></a>00276 <a class="code" href="structDBusTypeReader.html" title="The type reader is an iterator for reading values from a block of values.">DBusTypeReader</a> *parent)
<a name="l00277"></a>00277 {
<a name="l00278"></a>00278 <span class="keywordtype">int</span> sig_len;
<a name="l00279"></a>00279 <span class="keywordtype">int</span> contained_alignment;
<a name="l00280"></a>00280
<a name="l00281"></a>00281 base_reader_recurse (sub, parent);
<a name="l00282"></a>00282
<a name="l00283"></a>00283 <span class="comment">/* Variant is 1 byte sig length (without nul), signature with nul,</span>
<a name="l00284"></a>00284 <span class="comment"> * padding to 8-boundary, then values</span>
<a name="l00285"></a>00285 <span class="comment"> */</span>
<a name="l00286"></a>00286
<a name="l00287"></a>00287 sig_len = <a class="code" href="group__DBusString.html#gac1cb7b207eac3c6527a5d42fbc5449b1" title="Gets the byte at the given position.">_dbus_string_get_byte</a> (sub-><a class="code" href="structDBusTypeReader.html#a4065d7775758beb044ee23a71875571f" title="string containing values of block">value_str</a>, sub-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a>);
<a name="l00288"></a>00288
<a name="l00289"></a>00289 sub-><a class="code" href="structDBusTypeReader.html#af52e270ededd0aabb642c6130a3e9e40" title="string containing signature of block">type_str</a> = sub-><a class="code" href="structDBusTypeReader.html#a4065d7775758beb044ee23a71875571f" title="string containing values of block">value_str</a>;
<a name="l00290"></a>00290 sub-><a class="code" href="structDBusTypeReader.html#a160a55f9869e297572c5aa5b6ce7bc71" title="current position in signature">type_pos</a> = sub-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a> + 1;
<a name="l00291"></a>00291
<a name="l00292"></a>00292 sub-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a> = sub-><a class="code" href="structDBusTypeReader.html#a160a55f9869e297572c5aa5b6ce7bc71" title="current position in signature">type_pos</a> + sig_len + 1;
<a name="l00293"></a>00293
<a name="l00294"></a>00294 contained_alignment = <a class="code" href="group__DBusMarshal.html#ga2ba80f227880e442c140bc67653b0abd" title="Gets the alignment requirement for the given type; will be 1, 4, or 8.">_dbus_type_get_alignment</a> (<a class="code" href="group__DBusMarshal.html#ga5866a0fd058aed3396402d0456144fd2" title="Get the first type in the signature.">_dbus_first_type_in_signature</a> (sub-><a class="code" href="structDBusTypeReader.html#af52e270ededd0aabb642c6130a3e9e40" title="string containing signature of block">type_str</a>,
<a name="l00295"></a>00295 sub-><a class="code" href="structDBusTypeReader.html#a160a55f9869e297572c5aa5b6ce7bc71" title="current position in signature">type_pos</a>));
<a name="l00296"></a>00296
<a name="l00297"></a>00297 sub-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a> = _DBUS_ALIGN_VALUE (sub-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a>, contained_alignment);
<a name="l00298"></a>00298
<a name="l00299"></a>00299 <span class="preprocessor">#if RECURSIVE_MARSHAL_READ_TRACE</span>
<a name="l00300"></a>00300 <span class="preprocessor"></span> _dbus_verbose (<span class="stringliteral">" type reader %p variant containing '%s'\n"</span>,
<a name="l00301"></a>00301 sub,
<a name="l00302"></a>00302 <a class="code" href="group__DBusString.html#ga8c202a65e938f9bdb859fc6705a4f1bb" title="const version of _dbus_string_get_data_len().">_dbus_string_get_const_data_len</a> (sub-><a class="code" href="structDBusTypeReader.html#af52e270ededd0aabb642c6130a3e9e40" title="string containing signature of block">type_str</a>,
<a name="l00303"></a>00303 sub-><a class="code" href="structDBusTypeReader.html#a160a55f9869e297572c5aa5b6ce7bc71" title="current position in signature">type_pos</a>, 0));
<a name="l00304"></a>00304 <span class="preprocessor">#endif</span>
<a name="l00305"></a>00305 <span class="preprocessor"></span>}
<a name="l00306"></a>00306
<a name="l00307"></a>00307 <span class="keyword">static</span> <a class="code" href="group__DBusTypes.html#ga39c9cb0f3a2a8ad6f55cc4855d035349" title="A boolean, valid values are TRUE and FALSE.">dbus_bool_t</a>
<a name="l00308"></a>00308 array_reader_check_finished (<span class="keyword">const</span> <a class="code" href="structDBusTypeReader.html" title="The type reader is an iterator for reading values from a block of values.">DBusTypeReader</a> *reader)
<a name="l00309"></a>00309 {
<a name="l00310"></a>00310 <span class="keywordtype">int</span> end_pos;
<a name="l00311"></a>00311
<a name="l00312"></a>00312 <span class="comment">/* return the array element type if elements remain, and</span>
<a name="l00313"></a>00313 <span class="comment"> * TYPE_INVALID otherwise</span>
<a name="l00314"></a>00314 <span class="comment"> */</span>
<a name="l00315"></a>00315
<a name="l00316"></a>00316 end_pos = reader-><a class="code" href="structDBusTypeReader.html#ada12bed6758840dc19b1fcb271fb01be" title="class-specific data">u</a>.array.start_pos + array_reader_get_array_len (reader);
<a name="l00317"></a>00317
<a name="l00318"></a>00318 _dbus_assert (reader-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a> <= end_pos);
<a name="l00319"></a>00319 _dbus_assert (reader-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a> >= reader-><a class="code" href="structDBusTypeReader.html#ada12bed6758840dc19b1fcb271fb01be" title="class-specific data">u</a>.array.start_pos);
<a name="l00320"></a>00320
<a name="l00321"></a>00321 <span class="keywordflow">return</span> reader-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a> == end_pos;
<a name="l00322"></a>00322 }
<a name="l00323"></a>00323
<a name="l00324"></a>00324 <span class="keyword">static</span> <span class="keywordtype">void</span>
<a name="l00325"></a>00325 skip_one_complete_type (<span class="keyword">const</span> <a class="code" href="structDBusString.html">DBusString</a> *type_str,
<a name="l00326"></a>00326 <span class="keywordtype">int</span> *type_pos)
<a name="l00327"></a>00327 {
<a name="l00328"></a>00328 <a class="code" href="group__DBusMarshal.html#gaf2f5b2f027fa7d24f6179c6dbdf71a83" title="Skips to the next "complete" type inside a type signature.">_dbus_type_signature_next</a> (<a class="code" href="group__DBusString.html#ga33e20241ae7d784624f97d89b1a0539e" title="Gets the raw character buffer from a const string.">_dbus_string_get_const_data</a> (type_str),
<a name="l00329"></a>00329 type_pos);
<a name="l00330"></a>00330 }
<a name="l00331"></a>00331
<a name="l00340"></a>00340 <span class="keywordtype">void</span>
<a name="l00341"></a><a class="code" href="group__DBusMarshal.html#gaf2f5b2f027fa7d24f6179c6dbdf71a83">00341</a> <a class="code" href="group__DBusMarshal.html#gaf2f5b2f027fa7d24f6179c6dbdf71a83" title="Skips to the next "complete" type inside a type signature.">_dbus_type_signature_next</a> (<span class="keyword">const</span> <span class="keywordtype">char</span> *type_str,
<a name="l00342"></a>00342 <span class="keywordtype">int</span> *type_pos)
<a name="l00343"></a>00343 {
<a name="l00344"></a>00344 <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *p;
<a name="l00345"></a>00345 <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *start;
<a name="l00346"></a>00346
<a name="l00347"></a>00347 _dbus_assert (type_str != <a class="code" href="group__DBusMacros.html#ga070d2ce7b6bb7e5c05602aa8c308d0c4" title="A null pointer, defined appropriately for C or C++.">NULL</a>);
<a name="l00348"></a>00348 _dbus_assert (type_pos != <a class="code" href="group__DBusMacros.html#ga070d2ce7b6bb7e5c05602aa8c308d0c4" title="A null pointer, defined appropriately for C or C++.">NULL</a>);
<a name="l00349"></a>00349
<a name="l00350"></a>00350 start = type_str;
<a name="l00351"></a>00351 p = start + *type_pos;
<a name="l00352"></a>00352
<a name="l00353"></a>00353 _dbus_assert (*p != <a class="code" href="group__DBusProtocol.html#gaeab5ea0def3f587a0ed548b77d5c5cea" title="Code marking the end of a struct type in a type signature.">DBUS_STRUCT_END_CHAR</a>);
<a name="l00354"></a>00354 _dbus_assert (*p != <a class="code" href="group__DBusProtocol.html#ga29ad22c7342ead042ae9e55ae20b49f1" title="Code marking the end of a dict entry type in a type signature.">DBUS_DICT_ENTRY_END_CHAR</a>);
<a name="l00355"></a>00355
<a name="l00356"></a>00356 <span class="keywordflow">while</span> (*p == <a class="code" href="group__DBusProtocol.html#ga8912f600f81a773066ca03d9163613a9" title="Type code marking a D-Bus array type.">DBUS_TYPE_ARRAY</a>)
<a name="l00357"></a>00357 ++p;
<a name="l00358"></a>00358
<a name="l00359"></a>00359 _dbus_assert (*p != <a class="code" href="group__DBusProtocol.html#gaeab5ea0def3f587a0ed548b77d5c5cea" title="Code marking the end of a struct type in a type signature.">DBUS_STRUCT_END_CHAR</a>);
<a name="l00360"></a>00360 _dbus_assert (*p != <a class="code" href="group__DBusProtocol.html#ga29ad22c7342ead042ae9e55ae20b49f1" title="Code marking the end of a dict entry type in a type signature.">DBUS_DICT_ENTRY_END_CHAR</a>);
<a name="l00361"></a>00361
<a name="l00362"></a>00362 <span class="keywordflow">if</span> (*p == <a class="code" href="group__DBusProtocol.html#ga725657eca93175475e0694b858f51fd6" title="Code marking the start of a struct type in a type signature.">DBUS_STRUCT_BEGIN_CHAR</a>)
<a name="l00363"></a>00363 {
<a name="l00364"></a>00364 <span class="keywordtype">int</span> depth;
<a name="l00365"></a>00365
<a name="l00366"></a>00366 depth = 1;
<a name="l00367"></a>00367
<a name="l00368"></a>00368 <span class="keywordflow">while</span> (<a class="code" href="group__DBusMacros.html#gaa8cecfc5c5c054d2875c03e77b7be15d" title="Expands to "1".">TRUE</a>)
<a name="l00369"></a>00369 {
<a name="l00370"></a>00370 _dbus_assert (*p != <a class="code" href="group__DBusProtocol.html#gaa9588da889743b2119dc6664712ae51e" title="Type code that is never equal to a legitimate type code.">DBUS_TYPE_INVALID</a>);
<a name="l00371"></a>00371
<a name="l00372"></a>00372 ++p;
<a name="l00373"></a>00373
<a name="l00374"></a>00374 _dbus_assert (*p != <a class="code" href="group__DBusProtocol.html#gaa9588da889743b2119dc6664712ae51e" title="Type code that is never equal to a legitimate type code.">DBUS_TYPE_INVALID</a>);
<a name="l00375"></a>00375
<a name="l00376"></a>00376 <span class="keywordflow">if</span> (*p == <a class="code" href="group__DBusProtocol.html#ga725657eca93175475e0694b858f51fd6" title="Code marking the start of a struct type in a type signature.">DBUS_STRUCT_BEGIN_CHAR</a>)
<a name="l00377"></a>00377 depth += 1;
<a name="l00378"></a>00378 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (*p == <a class="code" href="group__DBusProtocol.html#gaeab5ea0def3f587a0ed548b77d5c5cea" title="Code marking the end of a struct type in a type signature.">DBUS_STRUCT_END_CHAR</a>)
<a name="l00379"></a>00379 {
<a name="l00380"></a>00380 depth -= 1;
<a name="l00381"></a>00381 <span class="keywordflow">if</span> (depth == 0)
<a name="l00382"></a>00382 {
<a name="l00383"></a>00383 ++p;
<a name="l00384"></a>00384 <span class="keywordflow">break</span>;
<a name="l00385"></a>00385 }
<a name="l00386"></a>00386 }
<a name="l00387"></a>00387 }
<a name="l00388"></a>00388 }
<a name="l00389"></a>00389 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (*p == <a class="code" href="group__DBusProtocol.html#gad51b5f7a2e6d927295479dd371f6b353" title="Code marking the start of a dict entry type in a type signature.">DBUS_DICT_ENTRY_BEGIN_CHAR</a>)
<a name="l00390"></a>00390 {
<a name="l00391"></a>00391 <span class="keywordtype">int</span> depth;
<a name="l00392"></a>00392
<a name="l00393"></a>00393 depth = 1;
<a name="l00394"></a>00394
<a name="l00395"></a>00395 <span class="keywordflow">while</span> (<a class="code" href="group__DBusMacros.html#gaa8cecfc5c5c054d2875c03e77b7be15d" title="Expands to "1".">TRUE</a>)
<a name="l00396"></a>00396 {
<a name="l00397"></a>00397 _dbus_assert (*p != <a class="code" href="group__DBusProtocol.html#gaa9588da889743b2119dc6664712ae51e" title="Type code that is never equal to a legitimate type code.">DBUS_TYPE_INVALID</a>);
<a name="l00398"></a>00398
<a name="l00399"></a>00399 ++p;
<a name="l00400"></a>00400
<a name="l00401"></a>00401 _dbus_assert (*p != <a class="code" href="group__DBusProtocol.html#gaa9588da889743b2119dc6664712ae51e" title="Type code that is never equal to a legitimate type code.">DBUS_TYPE_INVALID</a>);
<a name="l00402"></a>00402
<a name="l00403"></a>00403 <span class="keywordflow">if</span> (*p == <a class="code" href="group__DBusProtocol.html#gad51b5f7a2e6d927295479dd371f6b353" title="Code marking the start of a dict entry type in a type signature.">DBUS_DICT_ENTRY_BEGIN_CHAR</a>)
<a name="l00404"></a>00404 depth += 1;
<a name="l00405"></a>00405 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (*p == <a class="code" href="group__DBusProtocol.html#ga29ad22c7342ead042ae9e55ae20b49f1" title="Code marking the end of a dict entry type in a type signature.">DBUS_DICT_ENTRY_END_CHAR</a>)
<a name="l00406"></a>00406 {
<a name="l00407"></a>00407 depth -= 1;
<a name="l00408"></a>00408 <span class="keywordflow">if</span> (depth == 0)
<a name="l00409"></a>00409 {
<a name="l00410"></a>00410 ++p;
<a name="l00411"></a>00411 <span class="keywordflow">break</span>;
<a name="l00412"></a>00412 }
<a name="l00413"></a>00413 }
<a name="l00414"></a>00414 }
<a name="l00415"></a>00415 }
<a name="l00416"></a>00416 <span class="keywordflow">else</span>
<a name="l00417"></a>00417 {
<a name="l00418"></a>00418 ++p;
<a name="l00419"></a>00419 }
<a name="l00420"></a>00420
<a name="l00421"></a>00421 *type_pos = (int) (p - start);
<a name="l00422"></a>00422 }
<a name="l00423"></a>00423
<a name="l00424"></a>00424 <span class="keyword">static</span> <span class="keywordtype">int</span>
<a name="l00425"></a>00425 find_len_of_complete_type (<span class="keyword">const</span> <a class="code" href="structDBusString.html">DBusString</a> *type_str,
<a name="l00426"></a>00426 <span class="keywordtype">int</span> type_pos)
<a name="l00427"></a>00427 {
<a name="l00428"></a>00428 <span class="keywordtype">int</span> end;
<a name="l00429"></a>00429
<a name="l00430"></a>00430 end = type_pos;
<a name="l00431"></a>00431
<a name="l00432"></a>00432 skip_one_complete_type (type_str, &end);
<a name="l00433"></a>00433
<a name="l00434"></a>00434 <span class="keywordflow">return</span> end - type_pos;
<a name="l00435"></a>00435 }
<a name="l00436"></a>00436
<a name="l00437"></a>00437 <span class="keyword">static</span> <span class="keywordtype">void</span>
<a name="l00438"></a>00438 base_reader_next (<a class="code" href="structDBusTypeReader.html" title="The type reader is an iterator for reading values from a block of values.">DBusTypeReader</a> *reader,
<a name="l00439"></a>00439 <span class="keywordtype">int</span> current_type)
<a name="l00440"></a>00440 {
<a name="l00441"></a>00441 <span class="keywordflow">switch</span> (current_type)
<a name="l00442"></a>00442 {
<a name="l00443"></a>00443 <span class="keywordflow">case</span> <a class="code" href="group__DBusProtocol.html#gad2fc8e6c50e0ad927f4249fb9e53ca97" title="Type code used to represent a dict entry; however, this type code does not appear in type signatures...">DBUS_TYPE_DICT_ENTRY</a>:
<a name="l00444"></a>00444 <span class="keywordflow">case</span> <a class="code" href="group__DBusProtocol.html#gae4b22a74b9edb0ec0ff6e0294794d3f9" title="STRUCT and DICT_ENTRY are sort of special since their codes can't appear in a type string...">DBUS_TYPE_STRUCT</a>:
<a name="l00445"></a>00445 <span class="keywordflow">case</span> <a class="code" href="group__DBusProtocol.html#ga4aa7a463ad2bce4e9aa95e3e397ddcf1" title="Type code marking a D-Bus variant type.">DBUS_TYPE_VARIANT</a>:
<a name="l00446"></a>00446 <span class="comment">/* Scan forward over the entire container contents */</span>
<a name="l00447"></a>00447 {
<a name="l00448"></a>00448 <a class="code" href="structDBusTypeReader.html" title="The type reader is an iterator for reading values from a block of values.">DBusTypeReader</a> sub;
<a name="l00449"></a>00449
<a name="l00450"></a>00450 <span class="keywordflow">if</span> (reader-><a class="code" href="structDBusTypeReader.html#a238bd0d5a30d8f59fd9b71c95af25563" title="the vtable for the reader">klass</a>-><a class="code" href="structDBusTypeReaderClass.html#ad886037cd736e6f5cdbefb834b0bd5e7" title="only iterates over types, not values">types_only</a> && current_type == <a class="code" href="group__DBusProtocol.html#ga4aa7a463ad2bce4e9aa95e3e397ddcf1" title="Type code marking a D-Bus variant type.">DBUS_TYPE_VARIANT</a>)
<a name="l00451"></a>00451 ;
<a name="l00452"></a>00452 <span class="keywordflow">else</span>
<a name="l00453"></a>00453 {
<a name="l00454"></a>00454 <span class="comment">/* Recurse into the struct or variant */</span>
<a name="l00455"></a>00455 <a class="code" href="group__DBusMarshal.html#ga082b410820c74b2a6ca816a8e0c91803" title="Initialize a new reader pointing to the first type and corresponding value that's a child of the curr...">_dbus_type_reader_recurse</a> (reader, &sub);
<a name="l00456"></a>00456
<a name="l00457"></a>00457 <span class="comment">/* Skip everything in this subreader */</span>
<a name="l00458"></a>00458 <span class="keywordflow">while</span> (<a class="code" href="group__DBusMarshal.html#ga746c09512d4905f2d2fac7ed4c3c63c2" title="Skip to the next value on this "level".">_dbus_type_reader_next</a> (&sub))
<a name="l00459"></a>00459 {
<a name="l00460"></a>00460 <span class="comment">/* nothing */</span>;
<a name="l00461"></a>00461 }
<a name="l00462"></a>00462 }
<a name="l00463"></a>00463 <span class="keywordflow">if</span> (!reader-><a class="code" href="structDBusTypeReader.html#a238bd0d5a30d8f59fd9b71c95af25563" title="the vtable for the reader">klass</a>-><a class="code" href="structDBusTypeReaderClass.html#ad886037cd736e6f5cdbefb834b0bd5e7" title="only iterates over types, not values">types_only</a>)
<a name="l00464"></a>00464 reader-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a> = sub.<a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a>;
<a name="l00465"></a>00465
<a name="l00466"></a>00466 <span class="comment">/* Now we are at the end of this container; for variants, the</span>
<a name="l00467"></a>00467 <span class="comment"> * subreader's type_pos is totally inapplicable (it's in the</span>
<a name="l00468"></a>00468 <span class="comment"> * value string) but we know that we increment by one past the</span>
<a name="l00469"></a>00469 <span class="comment"> * DBUS_TYPE_VARIANT</span>
<a name="l00470"></a>00470 <span class="comment"> */</span>
<a name="l00471"></a>00471 <span class="keywordflow">if</span> (current_type == <a class="code" href="group__DBusProtocol.html#ga4aa7a463ad2bce4e9aa95e3e397ddcf1" title="Type code marking a D-Bus variant type.">DBUS_TYPE_VARIANT</a>)
<a name="l00472"></a>00472 reader-><a class="code" href="structDBusTypeReader.html#a160a55f9869e297572c5aa5b6ce7bc71" title="current position in signature">type_pos</a> += 1;
<a name="l00473"></a>00473 <span class="keywordflow">else</span>
<a name="l00474"></a>00474 reader-><a class="code" href="structDBusTypeReader.html#a160a55f9869e297572c5aa5b6ce7bc71" title="current position in signature">type_pos</a> = sub.<a class="code" href="structDBusTypeReader.html#a160a55f9869e297572c5aa5b6ce7bc71" title="current position in signature">type_pos</a>;
<a name="l00475"></a>00475 }
<a name="l00476"></a>00476 <span class="keywordflow">break</span>;
<a name="l00477"></a>00477
<a name="l00478"></a>00478 <span class="keywordflow">case</span> <a class="code" href="group__DBusProtocol.html#ga8912f600f81a773066ca03d9163613a9" title="Type code marking a D-Bus array type.">DBUS_TYPE_ARRAY</a>:
<a name="l00479"></a>00479 {
<a name="l00480"></a>00480 <span class="keywordflow">if</span> (!reader-><a class="code" href="structDBusTypeReader.html#a238bd0d5a30d8f59fd9b71c95af25563" title="the vtable for the reader">klass</a>-><a class="code" href="structDBusTypeReaderClass.html#ad886037cd736e6f5cdbefb834b0bd5e7" title="only iterates over types, not values">types_only</a>)
<a name="l00481"></a>00481 <a class="code" href="group__DBusMarshal.html#ga8d9c5bcc039d9099df197a125a7259b8" title="Skips an array, returning the next position.">_dbus_marshal_skip_array</a> (reader-><a class="code" href="structDBusTypeReader.html#a4065d7775758beb044ee23a71875571f" title="string containing values of block">value_str</a>,
<a name="l00482"></a>00482 <a class="code" href="group__DBusMarshal.html#ga5866a0fd058aed3396402d0456144fd2" title="Get the first type in the signature.">_dbus_first_type_in_signature</a> (reader-><a class="code" href="structDBusTypeReader.html#af52e270ededd0aabb642c6130a3e9e40" title="string containing signature of block">type_str</a>,
<a name="l00483"></a>00483 reader-><a class="code" href="structDBusTypeReader.html#a160a55f9869e297572c5aa5b6ce7bc71" title="current position in signature">type_pos</a> + 1),
<a name="l00484"></a>00484 reader-><a class="code" href="structDBusTypeReader.html#aeb0846d954066f420e1df98b81148702" title="byte order of the block">byte_order</a>,
<a name="l00485"></a>00485 &reader-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a>);
<a name="l00486"></a>00486
<a name="l00487"></a>00487 skip_one_complete_type (reader-><a class="code" href="structDBusTypeReader.html#af52e270ededd0aabb642c6130a3e9e40" title="string containing signature of block">type_str</a>, &reader-><a class="code" href="structDBusTypeReader.html#a160a55f9869e297572c5aa5b6ce7bc71" title="current position in signature">type_pos</a>);
<a name="l00488"></a>00488 }
<a name="l00489"></a>00489 <span class="keywordflow">break</span>;
<a name="l00490"></a>00490
<a name="l00491"></a>00491 <span class="keywordflow">default</span>:
<a name="l00492"></a>00492 <span class="keywordflow">if</span> (!reader-><a class="code" href="structDBusTypeReader.html#a238bd0d5a30d8f59fd9b71c95af25563" title="the vtable for the reader">klass</a>-><a class="code" href="structDBusTypeReaderClass.html#ad886037cd736e6f5cdbefb834b0bd5e7" title="only iterates over types, not values">types_only</a>)
<a name="l00493"></a>00493 <a class="code" href="group__DBusMarshal.html#gafd1ab7e9bd8e74cc41f03c76f4dce2dd" title="Skips over a basic-typed value, reporting the following position.">_dbus_marshal_skip_basic</a> (reader-><a class="code" href="structDBusTypeReader.html#a4065d7775758beb044ee23a71875571f" title="string containing values of block">value_str</a>,
<a name="l00494"></a>00494 current_type, reader-><a class="code" href="structDBusTypeReader.html#aeb0846d954066f420e1df98b81148702" title="byte order of the block">byte_order</a>,
<a name="l00495"></a>00495 &reader-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a>);
<a name="l00496"></a>00496
<a name="l00497"></a>00497 reader-><a class="code" href="structDBusTypeReader.html#a160a55f9869e297572c5aa5b6ce7bc71" title="current position in signature">type_pos</a> += 1;
<a name="l00498"></a>00498 <span class="keywordflow">break</span>;
<a name="l00499"></a>00499 }
<a name="l00500"></a>00500 }
<a name="l00501"></a>00501
<a name="l00502"></a>00502 <span class="keyword">static</span> <span class="keywordtype">void</span>
<a name="l00503"></a>00503 struct_reader_next (<a class="code" href="structDBusTypeReader.html" title="The type reader is an iterator for reading values from a block of values.">DBusTypeReader</a> *reader,
<a name="l00504"></a>00504 <span class="keywordtype">int</span> current_type)
<a name="l00505"></a>00505 {
<a name="l00506"></a>00506 <span class="keywordtype">int</span> t;
<a name="l00507"></a>00507
<a name="l00508"></a>00508 base_reader_next (reader, current_type);
<a name="l00509"></a>00509
<a name="l00510"></a>00510 <span class="comment">/* for STRUCT containers we return FALSE at the end of the struct,</span>
<a name="l00511"></a>00511 <span class="comment"> * for INVALID we return FALSE at the end of the signature.</span>
<a name="l00512"></a>00512 <span class="comment"> * In both cases we arrange for get_current_type() to return INVALID</span>
<a name="l00513"></a>00513 <span class="comment"> * which is defined to happen iff we're at the end (no more next())</span>
<a name="l00514"></a>00514 <span class="comment"> */</span>
<a name="l00515"></a>00515 t = <a class="code" href="group__DBusString.html#gac1cb7b207eac3c6527a5d42fbc5449b1" title="Gets the byte at the given position.">_dbus_string_get_byte</a> (reader-><a class="code" href="structDBusTypeReader.html#af52e270ededd0aabb642c6130a3e9e40" title="string containing signature of block">type_str</a>, reader-><a class="code" href="structDBusTypeReader.html#a160a55f9869e297572c5aa5b6ce7bc71" title="current position in signature">type_pos</a>);
<a name="l00516"></a>00516 <span class="keywordflow">if</span> (t == <a class="code" href="group__DBusProtocol.html#gaeab5ea0def3f587a0ed548b77d5c5cea" title="Code marking the end of a struct type in a type signature.">DBUS_STRUCT_END_CHAR</a>)
<a name="l00517"></a>00517 {
<a name="l00518"></a>00518 reader-><a class="code" href="structDBusTypeReader.html#a160a55f9869e297572c5aa5b6ce7bc71" title="current position in signature">type_pos</a> += 1;
<a name="l00519"></a>00519 reader-><a class="code" href="structDBusTypeReader.html#a551e64ee83df38ebda8c3677a91afe1b" title="marks we're at end iterator for cases where we don't have another way to tell">finished</a> = <a class="code" href="group__DBusMacros.html#gaa8cecfc5c5c054d2875c03e77b7be15d" title="Expands to "1".">TRUE</a>;
<a name="l00520"></a>00520 }
<a name="l00521"></a>00521 }
<a name="l00522"></a>00522
<a name="l00523"></a>00523 <span class="keyword">static</span> <span class="keywordtype">void</span>
<a name="l00524"></a>00524 dict_entry_reader_next (<a class="code" href="structDBusTypeReader.html" title="The type reader is an iterator for reading values from a block of values.">DBusTypeReader</a> *reader,
<a name="l00525"></a>00525 <span class="keywordtype">int</span> current_type)
<a name="l00526"></a>00526 {
<a name="l00527"></a>00527 <span class="keywordtype">int</span> t;
<a name="l00528"></a>00528
<a name="l00529"></a>00529 base_reader_next (reader, current_type);
<a name="l00530"></a>00530
<a name="l00531"></a>00531 <span class="comment">/* for STRUCT containers we return FALSE at the end of the struct,</span>
<a name="l00532"></a>00532 <span class="comment"> * for INVALID we return FALSE at the end of the signature.</span>
<a name="l00533"></a>00533 <span class="comment"> * In both cases we arrange for get_current_type() to return INVALID</span>
<a name="l00534"></a>00534 <span class="comment"> * which is defined to happen iff we're at the end (no more next())</span>
<a name="l00535"></a>00535 <span class="comment"> */</span>
<a name="l00536"></a>00536 t = <a class="code" href="group__DBusString.html#gac1cb7b207eac3c6527a5d42fbc5449b1" title="Gets the byte at the given position.">_dbus_string_get_byte</a> (reader-><a class="code" href="structDBusTypeReader.html#af52e270ededd0aabb642c6130a3e9e40" title="string containing signature of block">type_str</a>, reader-><a class="code" href="structDBusTypeReader.html#a160a55f9869e297572c5aa5b6ce7bc71" title="current position in signature">type_pos</a>);
<a name="l00537"></a>00537 <span class="keywordflow">if</span> (t == <a class="code" href="group__DBusProtocol.html#ga29ad22c7342ead042ae9e55ae20b49f1" title="Code marking the end of a dict entry type in a type signature.">DBUS_DICT_ENTRY_END_CHAR</a>)
<a name="l00538"></a>00538 {
<a name="l00539"></a>00539 reader-><a class="code" href="structDBusTypeReader.html#a160a55f9869e297572c5aa5b6ce7bc71" title="current position in signature">type_pos</a> += 1;
<a name="l00540"></a>00540 reader-><a class="code" href="structDBusTypeReader.html#a551e64ee83df38ebda8c3677a91afe1b" title="marks we're at end iterator for cases where we don't have another way to tell">finished</a> = <a class="code" href="group__DBusMacros.html#gaa8cecfc5c5c054d2875c03e77b7be15d" title="Expands to "1".">TRUE</a>;
<a name="l00541"></a>00541 }
<a name="l00542"></a>00542 }
<a name="l00543"></a>00543
<a name="l00544"></a>00544 <span class="keyword">static</span> <span class="keywordtype">void</span>
<a name="l00545"></a>00545 array_types_only_reader_next (<a class="code" href="structDBusTypeReader.html" title="The type reader is an iterator for reading values from a block of values.">DBusTypeReader</a> *reader,
<a name="l00546"></a>00546 <span class="keywordtype">int</span> current_type)
<a name="l00547"></a>00547 {
<a name="l00548"></a>00548 <span class="comment">/* We have one "element" to be iterated over</span>
<a name="l00549"></a>00549 <span class="comment"> * in each array, which is its element type.</span>
<a name="l00550"></a>00550 <span class="comment"> * So the finished flag indicates whether we've</span>
<a name="l00551"></a>00551 <span class="comment"> * iterated over it yet or not.</span>
<a name="l00552"></a>00552 <span class="comment"> */</span>
<a name="l00553"></a>00553 reader-><a class="code" href="structDBusTypeReader.html#a551e64ee83df38ebda8c3677a91afe1b" title="marks we're at end iterator for cases where we don't have another way to tell">finished</a> = <a class="code" href="group__DBusMacros.html#gaa8cecfc5c5c054d2875c03e77b7be15d" title="Expands to "1".">TRUE</a>;
<a name="l00554"></a>00554 }
<a name="l00555"></a>00555
<a name="l00556"></a>00556 <span class="keyword">static</span> <span class="keywordtype">void</span>
<a name="l00557"></a>00557 array_reader_next (<a class="code" href="structDBusTypeReader.html" title="The type reader is an iterator for reading values from a block of values.">DBusTypeReader</a> *reader,
<a name="l00558"></a>00558 <span class="keywordtype">int</span> current_type)
<a name="l00559"></a>00559 {
<a name="l00560"></a>00560 <span class="comment">/* Skip one array element */</span>
<a name="l00561"></a>00561 <span class="keywordtype">int</span> end_pos;
<a name="l00562"></a>00562
<a name="l00563"></a>00563 end_pos = reader-><a class="code" href="structDBusTypeReader.html#ada12bed6758840dc19b1fcb271fb01be" title="class-specific data">u</a>.array.start_pos + array_reader_get_array_len (reader);
<a name="l00564"></a>00564
<a name="l00565"></a>00565 <span class="preprocessor">#if RECURSIVE_MARSHAL_READ_TRACE</span>
<a name="l00566"></a>00566 <span class="preprocessor"></span> _dbus_verbose (<span class="stringliteral">" reader %p array next START start_pos = %d end_pos = %d value_pos = %d current_type = %s\n"</span>,
<a name="l00567"></a>00567 reader,
<a name="l00568"></a>00568 reader-><a class="code" href="structDBusTypeReader.html#ada12bed6758840dc19b1fcb271fb01be" title="class-specific data">u</a>.array.start_pos,
<a name="l00569"></a>00569 end_pos, reader-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a>,
<a name="l00570"></a>00570 <a class="code" href="group__DBusMarshal.html#ga48a595c2b26dce6e9c25ce040e5247e5" title="Returns a string describing the given type.">_dbus_type_to_string</a> (current_type));
<a name="l00571"></a>00571 <span class="preprocessor">#endif</span>
<a name="l00572"></a>00572 <span class="preprocessor"></span>
<a name="l00573"></a>00573 _dbus_assert (reader-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a> < end_pos);
<a name="l00574"></a>00574 _dbus_assert (reader-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a> >= reader-><a class="code" href="structDBusTypeReader.html#ada12bed6758840dc19b1fcb271fb01be" title="class-specific data">u</a>.array.start_pos);
<a name="l00575"></a>00575
<a name="l00576"></a>00576 <span class="keywordflow">switch</span> (<a class="code" href="group__DBusMarshal.html#ga5866a0fd058aed3396402d0456144fd2" title="Get the first type in the signature.">_dbus_first_type_in_signature</a> (reader-><a class="code" href="structDBusTypeReader.html#af52e270ededd0aabb642c6130a3e9e40" title="string containing signature of block">type_str</a>,
<a name="l00577"></a>00577 reader-><a class="code" href="structDBusTypeReader.html#a160a55f9869e297572c5aa5b6ce7bc71" title="current position in signature">type_pos</a>))
<a name="l00578"></a>00578 {
<a name="l00579"></a>00579 <span class="keywordflow">case</span> <a class="code" href="group__DBusProtocol.html#gad2fc8e6c50e0ad927f4249fb9e53ca97" title="Type code used to represent a dict entry; however, this type code does not appear in type signatures...">DBUS_TYPE_DICT_ENTRY</a>:
<a name="l00580"></a>00580 <span class="keywordflow">case</span> <a class="code" href="group__DBusProtocol.html#gae4b22a74b9edb0ec0ff6e0294794d3f9" title="STRUCT and DICT_ENTRY are sort of special since their codes can't appear in a type string...">DBUS_TYPE_STRUCT</a>:
<a name="l00581"></a>00581 <span class="keywordflow">case</span> <a class="code" href="group__DBusProtocol.html#ga4aa7a463ad2bce4e9aa95e3e397ddcf1" title="Type code marking a D-Bus variant type.">DBUS_TYPE_VARIANT</a>:
<a name="l00582"></a>00582 {
<a name="l00583"></a>00583 <a class="code" href="structDBusTypeReader.html" title="The type reader is an iterator for reading values from a block of values.">DBusTypeReader</a> sub;
<a name="l00584"></a>00584
<a name="l00585"></a>00585 <span class="comment">/* Recurse into the struct or variant */</span>
<a name="l00586"></a>00586 <a class="code" href="group__DBusMarshal.html#ga082b410820c74b2a6ca816a8e0c91803" title="Initialize a new reader pointing to the first type and corresponding value that's a child of the curr...">_dbus_type_reader_recurse</a> (reader, &sub);
<a name="l00587"></a>00587
<a name="l00588"></a>00588 <span class="comment">/* Skip everything in this element */</span>
<a name="l00589"></a>00589 <span class="keywordflow">while</span> (<a class="code" href="group__DBusMarshal.html#ga746c09512d4905f2d2fac7ed4c3c63c2" title="Skip to the next value on this "level".">_dbus_type_reader_next</a> (&sub))
<a name="l00590"></a>00590 {
<a name="l00591"></a>00591 <span class="comment">/* nothing */</span>;
<a name="l00592"></a>00592 }
<a name="l00593"></a>00593
<a name="l00594"></a>00594 <span class="comment">/* Now we are at the end of this element */</span>
<a name="l00595"></a>00595 reader-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a> = sub.<a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a>;
<a name="l00596"></a>00596 }
<a name="l00597"></a>00597 <span class="keywordflow">break</span>;
<a name="l00598"></a>00598
<a name="l00599"></a>00599 <span class="keywordflow">case</span> <a class="code" href="group__DBusProtocol.html#ga8912f600f81a773066ca03d9163613a9" title="Type code marking a D-Bus array type.">DBUS_TYPE_ARRAY</a>:
<a name="l00600"></a>00600 {
<a name="l00601"></a>00601 <a class="code" href="group__DBusMarshal.html#ga8d9c5bcc039d9099df197a125a7259b8" title="Skips an array, returning the next position.">_dbus_marshal_skip_array</a> (reader-><a class="code" href="structDBusTypeReader.html#a4065d7775758beb044ee23a71875571f" title="string containing values of block">value_str</a>,
<a name="l00602"></a>00602 <a class="code" href="group__DBusMarshal.html#ga5866a0fd058aed3396402d0456144fd2" title="Get the first type in the signature.">_dbus_first_type_in_signature</a> (reader-><a class="code" href="structDBusTypeReader.html#af52e270ededd0aabb642c6130a3e9e40" title="string containing signature of block">type_str</a>,
<a name="l00603"></a>00603 reader-><a class="code" href="structDBusTypeReader.html#a160a55f9869e297572c5aa5b6ce7bc71" title="current position in signature">type_pos</a> + 1),
<a name="l00604"></a>00604 reader-><a class="code" href="structDBusTypeReader.html#aeb0846d954066f420e1df98b81148702" title="byte order of the block">byte_order</a>,
<a name="l00605"></a>00605 &reader-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a>);
<a name="l00606"></a>00606 }
<a name="l00607"></a>00607 <span class="keywordflow">break</span>;
<a name="l00608"></a>00608
<a name="l00609"></a>00609 <span class="keywordflow">default</span>:
<a name="l00610"></a>00610 {
<a name="l00611"></a>00611 <a class="code" href="group__DBusMarshal.html#gafd1ab7e9bd8e74cc41f03c76f4dce2dd" title="Skips over a basic-typed value, reporting the following position.">_dbus_marshal_skip_basic</a> (reader-><a class="code" href="structDBusTypeReader.html#a4065d7775758beb044ee23a71875571f" title="string containing values of block">value_str</a>,
<a name="l00612"></a>00612 current_type, reader-><a class="code" href="structDBusTypeReader.html#aeb0846d954066f420e1df98b81148702" title="byte order of the block">byte_order</a>,
<a name="l00613"></a>00613 &reader-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a>);
<a name="l00614"></a>00614 }
<a name="l00615"></a>00615 <span class="keywordflow">break</span>;
<a name="l00616"></a>00616 }
<a name="l00617"></a>00617
<a name="l00618"></a>00618 <span class="preprocessor">#if RECURSIVE_MARSHAL_READ_TRACE</span>
<a name="l00619"></a>00619 <span class="preprocessor"></span> _dbus_verbose (<span class="stringliteral">" reader %p array next END start_pos = %d end_pos = %d value_pos = %d current_type = %s\n"</span>,
<a name="l00620"></a>00620 reader,
<a name="l00621"></a>00621 reader-><a class="code" href="structDBusTypeReader.html#ada12bed6758840dc19b1fcb271fb01be" title="class-specific data">u</a>.array.start_pos,
<a name="l00622"></a>00622 end_pos, reader-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a>,
<a name="l00623"></a>00623 <a class="code" href="group__DBusMarshal.html#ga48a595c2b26dce6e9c25ce040e5247e5" title="Returns a string describing the given type.">_dbus_type_to_string</a> (current_type));
<a name="l00624"></a>00624 <span class="preprocessor">#endif</span>
<a name="l00625"></a>00625 <span class="preprocessor"></span>
<a name="l00626"></a>00626 _dbus_assert (reader-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a> <= end_pos);
<a name="l00627"></a>00627
<a name="l00628"></a>00628 <span class="keywordflow">if</span> (reader-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a> == end_pos)
<a name="l00629"></a>00629 {
<a name="l00630"></a>00630 skip_one_complete_type (reader-><a class="code" href="structDBusTypeReader.html#af52e270ededd0aabb642c6130a3e9e40" title="string containing signature of block">type_str</a>,
<a name="l00631"></a>00631 &reader-><a class="code" href="structDBusTypeReader.html#a160a55f9869e297572c5aa5b6ce7bc71" title="current position in signature">type_pos</a>);
<a name="l00632"></a>00632 }
<a name="l00633"></a>00633 }
<a name="l00634"></a>00634
<a name="l00635"></a>00635 <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="structDBusTypeReaderClass.html" title="Virtual table for a type reader.">DBusTypeReaderClass</a> body_reader_class = {
<a name="l00636"></a>00636 <span class="stringliteral">"body"</span>, 0,
<a name="l00637"></a>00637 <a class="code" href="group__DBusMacros.html#gaa93f0eb578d23995850d61f7d61c55c1" title="Expands to "0".">FALSE</a>,
<a name="l00638"></a>00638 <a class="code" href="group__DBusMacros.html#ga070d2ce7b6bb7e5c05602aa8c308d0c4" title="A null pointer, defined appropriately for C or C++.">NULL</a>, <span class="comment">/* body is always toplevel, so doesn't get recursed into */</span>
<a name="l00639"></a>00639 <a class="code" href="group__DBusMacros.html#ga070d2ce7b6bb7e5c05602aa8c308d0c4" title="A null pointer, defined appropriately for C or C++.">NULL</a>,
<a name="l00640"></a>00640 base_reader_next
<a name="l00641"></a>00641 };
<a name="l00642"></a>00642
<a name="l00643"></a>00643 <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="structDBusTypeReaderClass.html" title="Virtual table for a type reader.">DBusTypeReaderClass</a> body_types_only_reader_class = {
<a name="l00644"></a>00644 <span class="stringliteral">"body types"</span>, 1,
<a name="l00645"></a>00645 <a class="code" href="group__DBusMacros.html#gaa8cecfc5c5c054d2875c03e77b7be15d" title="Expands to "1".">TRUE</a>,
<a name="l00646"></a>00646 <a class="code" href="group__DBusMacros.html#ga070d2ce7b6bb7e5c05602aa8c308d0c4" title="A null pointer, defined appropriately for C or C++.">NULL</a>, <span class="comment">/* body is always toplevel, so doesn't get recursed into */</span>
<a name="l00647"></a>00647 <a class="code" href="group__DBusMacros.html#ga070d2ce7b6bb7e5c05602aa8c308d0c4" title="A null pointer, defined appropriately for C or C++.">NULL</a>,
<a name="l00648"></a>00648 base_reader_next
<a name="l00649"></a>00649 };
<a name="l00650"></a>00650
<a name="l00651"></a>00651 <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="structDBusTypeReaderClass.html" title="Virtual table for a type reader.">DBusTypeReaderClass</a> struct_reader_class = {
<a name="l00652"></a>00652 <span class="stringliteral">"struct"</span>, 2,
<a name="l00653"></a>00653 <a class="code" href="group__DBusMacros.html#gaa93f0eb578d23995850d61f7d61c55c1" title="Expands to "0".">FALSE</a>,
<a name="l00654"></a>00654 struct_or_dict_entry_reader_recurse,
<a name="l00655"></a>00655 <a class="code" href="group__DBusMacros.html#ga070d2ce7b6bb7e5c05602aa8c308d0c4" title="A null pointer, defined appropriately for C or C++.">NULL</a>,
<a name="l00656"></a>00656 struct_reader_next
<a name="l00657"></a>00657 };
<a name="l00658"></a>00658
<a name="l00659"></a>00659 <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="structDBusTypeReaderClass.html" title="Virtual table for a type reader.">DBusTypeReaderClass</a> struct_types_only_reader_class = {
<a name="l00660"></a>00660 <span class="stringliteral">"struct types"</span>, 3,
<a name="l00661"></a>00661 <a class="code" href="group__DBusMacros.html#gaa8cecfc5c5c054d2875c03e77b7be15d" title="Expands to "1".">TRUE</a>,
<a name="l00662"></a>00662 struct_or_dict_entry_types_only_reader_recurse,
<a name="l00663"></a>00663 <a class="code" href="group__DBusMacros.html#ga070d2ce7b6bb7e5c05602aa8c308d0c4" title="A null pointer, defined appropriately for C or C++.">NULL</a>,
<a name="l00664"></a>00664 struct_reader_next
<a name="l00665"></a>00665 };
<a name="l00666"></a>00666
<a name="l00667"></a>00667 <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="structDBusTypeReaderClass.html" title="Virtual table for a type reader.">DBusTypeReaderClass</a> dict_entry_reader_class = {
<a name="l00668"></a>00668 <span class="stringliteral">"dict_entry"</span>, 4,
<a name="l00669"></a>00669 <a class="code" href="group__DBusMacros.html#gaa93f0eb578d23995850d61f7d61c55c1" title="Expands to "0".">FALSE</a>,
<a name="l00670"></a>00670 struct_or_dict_entry_reader_recurse,
<a name="l00671"></a>00671 <a class="code" href="group__DBusMacros.html#ga070d2ce7b6bb7e5c05602aa8c308d0c4" title="A null pointer, defined appropriately for C or C++.">NULL</a>,
<a name="l00672"></a>00672 dict_entry_reader_next
<a name="l00673"></a>00673 };
<a name="l00674"></a>00674
<a name="l00675"></a>00675 <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="structDBusTypeReaderClass.html" title="Virtual table for a type reader.">DBusTypeReaderClass</a> dict_entry_types_only_reader_class = {
<a name="l00676"></a>00676 <span class="stringliteral">"dict_entry types"</span>, 5,
<a name="l00677"></a>00677 <a class="code" href="group__DBusMacros.html#gaa8cecfc5c5c054d2875c03e77b7be15d" title="Expands to "1".">TRUE</a>,
<a name="l00678"></a>00678 struct_or_dict_entry_types_only_reader_recurse,
<a name="l00679"></a>00679 <a class="code" href="group__DBusMacros.html#ga070d2ce7b6bb7e5c05602aa8c308d0c4" title="A null pointer, defined appropriately for C or C++.">NULL</a>,
<a name="l00680"></a>00680 dict_entry_reader_next
<a name="l00681"></a>00681 };
<a name="l00682"></a>00682
<a name="l00683"></a>00683 <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="structDBusTypeReaderClass.html" title="Virtual table for a type reader.">DBusTypeReaderClass</a> array_reader_class = {
<a name="l00684"></a>00684 <span class="stringliteral">"array"</span>, 6,
<a name="l00685"></a>00685 <a class="code" href="group__DBusMacros.html#gaa93f0eb578d23995850d61f7d61c55c1" title="Expands to "0".">FALSE</a>,
<a name="l00686"></a>00686 array_reader_recurse,
<a name="l00687"></a>00687 array_reader_check_finished,
<a name="l00688"></a>00688 array_reader_next
<a name="l00689"></a>00689 };
<a name="l00690"></a>00690
<a name="l00691"></a>00691 <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="structDBusTypeReaderClass.html" title="Virtual table for a type reader.">DBusTypeReaderClass</a> array_types_only_reader_class = {
<a name="l00692"></a>00692 <span class="stringliteral">"array types"</span>, 7,
<a name="l00693"></a>00693 <a class="code" href="group__DBusMacros.html#gaa8cecfc5c5c054d2875c03e77b7be15d" title="Expands to "1".">TRUE</a>,
<a name="l00694"></a>00694 array_types_only_reader_recurse,
<a name="l00695"></a>00695 <a class="code" href="group__DBusMacros.html#ga070d2ce7b6bb7e5c05602aa8c308d0c4" title="A null pointer, defined appropriately for C or C++.">NULL</a>,
<a name="l00696"></a>00696 array_types_only_reader_next
<a name="l00697"></a>00697 };
<a name="l00698"></a>00698
<a name="l00699"></a>00699 <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="structDBusTypeReaderClass.html" title="Virtual table for a type reader.">DBusTypeReaderClass</a> variant_reader_class = {
<a name="l00700"></a>00700 <span class="stringliteral">"variant"</span>, 8,
<a name="l00701"></a>00701 <a class="code" href="group__DBusMacros.html#gaa93f0eb578d23995850d61f7d61c55c1" title="Expands to "0".">FALSE</a>,
<a name="l00702"></a>00702 variant_reader_recurse,
<a name="l00703"></a>00703 <a class="code" href="group__DBusMacros.html#ga070d2ce7b6bb7e5c05602aa8c308d0c4" title="A null pointer, defined appropriately for C or C++.">NULL</a>,
<a name="l00704"></a>00704 base_reader_next
<a name="l00705"></a>00705 };
<a name="l00706"></a>00706
<a name="l00707"></a>00707 <span class="preprocessor">#ifndef DBUS_DISABLE_ASSERT</span>
<a name="l00708"></a>00708 <span class="preprocessor"></span><span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="structDBusTypeReaderClass.html" title="Virtual table for a type reader.">DBusTypeReaderClass</a> * <span class="keyword">const</span>
<a name="l00709"></a>00709 all_reader_classes[] = {
<a name="l00710"></a>00710 &body_reader_class,
<a name="l00711"></a>00711 &body_types_only_reader_class,
<a name="l00712"></a>00712 &struct_reader_class,
<a name="l00713"></a>00713 &struct_types_only_reader_class,
<a name="l00714"></a>00714 &dict_entry_reader_class,
<a name="l00715"></a>00715 &dict_entry_types_only_reader_class,
<a name="l00716"></a>00716 &array_reader_class,
<a name="l00717"></a>00717 &array_types_only_reader_class,
<a name="l00718"></a>00718 &variant_reader_class
<a name="l00719"></a>00719 };
<a name="l00720"></a>00720 <span class="preprocessor">#endif</span>
<a name="l00721"></a>00721 <span class="preprocessor"></span>
<a name="l00732"></a>00732 <span class="keywordtype">void</span>
<a name="l00733"></a><a class="code" href="group__DBusMarshal.html#ga35d70cf69b1196518367e3e68e9b2dd2">00733</a> <a class="code" href="group__DBusMarshal.html#ga35d70cf69b1196518367e3e68e9b2dd2" title="Initializes a type reader.">_dbus_type_reader_init</a> (<a class="code" href="structDBusTypeReader.html" title="The type reader is an iterator for reading values from a block of values.">DBusTypeReader</a> *reader,
<a name="l00734"></a>00734 <span class="keywordtype">int</span> byte_order,
<a name="l00735"></a>00735 <span class="keyword">const</span> <a class="code" href="structDBusString.html">DBusString</a> *type_str,
<a name="l00736"></a>00736 <span class="keywordtype">int</span> type_pos,
<a name="l00737"></a>00737 <span class="keyword">const</span> <a class="code" href="structDBusString.html">DBusString</a> *value_str,
<a name="l00738"></a>00738 <span class="keywordtype">int</span> value_pos)
<a name="l00739"></a>00739 {
<a name="l00740"></a>00740 reader_init (reader, byte_order, type_str, type_pos,
<a name="l00741"></a>00741 value_str, value_pos);
<a name="l00742"></a>00742
<a name="l00743"></a>00743 reader-><a class="code" href="structDBusTypeReader.html#a238bd0d5a30d8f59fd9b71c95af25563" title="the vtable for the reader">klass</a> = &body_reader_class;
<a name="l00744"></a>00744
<a name="l00745"></a>00745 <span class="preprocessor">#if RECURSIVE_MARSHAL_READ_TRACE</span>
<a name="l00746"></a>00746 <span class="preprocessor"></span> _dbus_verbose (<span class="stringliteral">" type reader %p init type_pos = %d value_pos = %d remaining sig '%s'\n"</span>,
<a name="l00747"></a>00747 reader, reader-><a class="code" href="structDBusTypeReader.html#a160a55f9869e297572c5aa5b6ce7bc71" title="current position in signature">type_pos</a>, reader-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a>,
<a name="l00748"></a>00748 <a class="code" href="group__DBusString.html#ga8c202a65e938f9bdb859fc6705a4f1bb" title="const version of _dbus_string_get_data_len().">_dbus_string_get_const_data_len</a> (reader-><a class="code" href="structDBusTypeReader.html#af52e270ededd0aabb642c6130a3e9e40" title="string containing signature of block">type_str</a>, reader-><a class="code" href="structDBusTypeReader.html#a160a55f9869e297572c5aa5b6ce7bc71" title="current position in signature">type_pos</a>, 0));
<a name="l00749"></a>00749 <span class="preprocessor">#endif</span>
<a name="l00750"></a>00750 <span class="preprocessor"></span>}
<a name="l00751"></a>00751
<a name="l00760"></a>00760 <span class="keywordtype">void</span>
<a name="l00761"></a><a class="code" href="group__DBusMarshal.html#ga3a5845f555f11c33ebaa71a75abff661">00761</a> <a class="code" href="group__DBusMarshal.html#ga3a5845f555f11c33ebaa71a75abff661" title="Like _dbus_type_reader_init() but the iteration is over the signature, not over values.">_dbus_type_reader_init_types_only</a> (<a class="code" href="structDBusTypeReader.html" title="The type reader is an iterator for reading values from a block of values.">DBusTypeReader</a> *reader,
<a name="l00762"></a>00762 <span class="keyword">const</span> <a class="code" href="structDBusString.html">DBusString</a> *type_str,
<a name="l00763"></a>00763 <span class="keywordtype">int</span> type_pos)
<a name="l00764"></a>00764 {
<a name="l00765"></a>00765 reader_init (reader, DBUS_COMPILER_BYTE_ORDER <span class="comment">/* irrelevant */</span>,
<a name="l00766"></a>00766 type_str, type_pos, <a class="code" href="group__DBusMacros.html#ga070d2ce7b6bb7e5c05602aa8c308d0c4" title="A null pointer, defined appropriately for C or C++.">NULL</a>, _DBUS_INT_MAX <span class="comment">/* crashes if we screw up */</span>);
<a name="l00767"></a>00767
<a name="l00768"></a>00768 reader-><a class="code" href="structDBusTypeReader.html#a238bd0d5a30d8f59fd9b71c95af25563" title="the vtable for the reader">klass</a> = &body_types_only_reader_class;
<a name="l00769"></a>00769
<a name="l00770"></a>00770 <span class="preprocessor">#if RECURSIVE_MARSHAL_READ_TRACE</span>
<a name="l00771"></a>00771 <span class="preprocessor"></span> _dbus_verbose (<span class="stringliteral">" type reader %p init types only type_pos = %d remaining sig '%s'\n"</span>,
<a name="l00772"></a>00772 reader, reader-><a class="code" href="structDBusTypeReader.html#a160a55f9869e297572c5aa5b6ce7bc71" title="current position in signature">type_pos</a>,
<a name="l00773"></a>00773 <a class="code" href="group__DBusString.html#ga8c202a65e938f9bdb859fc6705a4f1bb" title="const version of _dbus_string_get_data_len().">_dbus_string_get_const_data_len</a> (reader-><a class="code" href="structDBusTypeReader.html#af52e270ededd0aabb642c6130a3e9e40" title="string containing signature of block">type_str</a>, reader-><a class="code" href="structDBusTypeReader.html#a160a55f9869e297572c5aa5b6ce7bc71" title="current position in signature">type_pos</a>, 0));
<a name="l00774"></a>00774 <span class="preprocessor">#endif</span>
<a name="l00775"></a>00775 <span class="preprocessor"></span>}
<a name="l00776"></a>00776
<a name="l00785"></a>00785 <span class="keywordtype">int</span>
<a name="l00786"></a><a class="code" href="group__DBusMarshal.html#gab8e39cb8084247d54d7f272c51622a73">00786</a> <a class="code" href="group__DBusMarshal.html#gab8e39cb8084247d54d7f272c51622a73" title="Gets the type of the value the reader is currently pointing to; or for a types-only reader gets the t...">_dbus_type_reader_get_current_type</a> (<span class="keyword">const</span> <a class="code" href="structDBusTypeReader.html" title="The type reader is an iterator for reading values from a block of values.">DBusTypeReader</a> *reader)
<a name="l00787"></a>00787 {
<a name="l00788"></a>00788 <span class="keywordtype">int</span> t;
<a name="l00789"></a>00789
<a name="l00790"></a>00790 <span class="keywordflow">if</span> (reader-><a class="code" href="structDBusTypeReader.html#a551e64ee83df38ebda8c3677a91afe1b" title="marks we're at end iterator for cases where we don't have another way to tell">finished</a> ||
<a name="l00791"></a>00791 (reader-><a class="code" href="structDBusTypeReader.html#a238bd0d5a30d8f59fd9b71c95af25563" title="the vtable for the reader">klass</a>-><a class="code" href="structDBusTypeReaderClass.html#a023bc5274f7bf1f45f29822aebae96a1" title="check whether reader is at the end">check_finished</a> &&
<a name="l00792"></a>00792 (* reader-><a class="code" href="structDBusTypeReader.html#a238bd0d5a30d8f59fd9b71c95af25563" title="the vtable for the reader">klass</a>-><a class="code" href="structDBusTypeReaderClass.html#a023bc5274f7bf1f45f29822aebae96a1" title="check whether reader is at the end">check_finished</a>) (reader)))
<a name="l00793"></a>00793 t = <a class="code" href="group__DBusProtocol.html#gaa9588da889743b2119dc6664712ae51e" title="Type code that is never equal to a legitimate type code.">DBUS_TYPE_INVALID</a>;
<a name="l00794"></a>00794 <span class="keywordflow">else</span>
<a name="l00795"></a>00795 t = <a class="code" href="group__DBusMarshal.html#ga5866a0fd058aed3396402d0456144fd2" title="Get the first type in the signature.">_dbus_first_type_in_signature</a> (reader-><a class="code" href="structDBusTypeReader.html#af52e270ededd0aabb642c6130a3e9e40" title="string containing signature of block">type_str</a>,
<a name="l00796"></a>00796 reader-><a class="code" href="structDBusTypeReader.html#a160a55f9869e297572c5aa5b6ce7bc71" title="current position in signature">type_pos</a>);
<a name="l00797"></a>00797
<a name="l00798"></a>00798 _dbus_assert (t != <a class="code" href="group__DBusProtocol.html#gaeab5ea0def3f587a0ed548b77d5c5cea" title="Code marking the end of a struct type in a type signature.">DBUS_STRUCT_END_CHAR</a>);
<a name="l00799"></a>00799 _dbus_assert (t != <a class="code" href="group__DBusProtocol.html#ga725657eca93175475e0694b858f51fd6" title="Code marking the start of a struct type in a type signature.">DBUS_STRUCT_BEGIN_CHAR</a>);
<a name="l00800"></a>00800 _dbus_assert (t != <a class="code" href="group__DBusProtocol.html#ga29ad22c7342ead042ae9e55ae20b49f1" title="Code marking the end of a dict entry type in a type signature.">DBUS_DICT_ENTRY_END_CHAR</a>);
<a name="l00801"></a>00801 _dbus_assert (t != <a class="code" href="group__DBusProtocol.html#gad51b5f7a2e6d927295479dd371f6b353" title="Code marking the start of a dict entry type in a type signature.">DBUS_DICT_ENTRY_BEGIN_CHAR</a>);
<a name="l00802"></a>00802
<a name="l00803"></a>00803 <span class="preprocessor">#if 0</span>
<a name="l00804"></a>00804 <span class="preprocessor"></span> _dbus_verbose (<span class="stringliteral">" type reader %p current type_pos = %d type = %s\n"</span>,
<a name="l00805"></a>00805 reader, reader-><a class="code" href="structDBusTypeReader.html#a160a55f9869e297572c5aa5b6ce7bc71" title="current position in signature">type_pos</a>,
<a name="l00806"></a>00806 <a class="code" href="group__DBusMarshal.html#ga48a595c2b26dce6e9c25ce040e5247e5" title="Returns a string describing the given type.">_dbus_type_to_string</a> (t));
<a name="l00807"></a>00807 <span class="preprocessor">#endif</span>
<a name="l00808"></a>00808 <span class="preprocessor"></span>
<a name="l00809"></a>00809 <span class="keywordflow">return</span> t;
<a name="l00810"></a>00810 }
<a name="l00811"></a>00811
<a name="l00820"></a>00820 <span class="keywordtype">int</span>
<a name="l00821"></a><a class="code" href="group__DBusMarshal.html#ga6e5439f7ca5ee8a1ce943ddab7611d0d">00821</a> <a class="code" href="group__DBusMarshal.html#ga6e5439f7ca5ee8a1ce943ddab7611d0d" title="Gets the type of an element of the array the reader is currently pointing to.">_dbus_type_reader_get_element_type</a> (<span class="keyword">const</span> <a class="code" href="structDBusTypeReader.html" title="The type reader is an iterator for reading values from a block of values.">DBusTypeReader</a> *reader)
<a name="l00822"></a>00822 {
<a name="l00823"></a>00823 <span class="keywordtype">int</span> element_type;
<a name="l00824"></a>00824
<a name="l00825"></a>00825 _dbus_assert (<a class="code" href="group__DBusMarshal.html#gab8e39cb8084247d54d7f272c51622a73" title="Gets the type of the value the reader is currently pointing to; or for a types-only reader gets the t...">_dbus_type_reader_get_current_type</a> (reader) == <a class="code" href="group__DBusProtocol.html#ga8912f600f81a773066ca03d9163613a9" title="Type code marking a D-Bus array type.">DBUS_TYPE_ARRAY</a>);
<a name="l00826"></a>00826
<a name="l00827"></a>00827 element_type = <a class="code" href="group__DBusMarshal.html#ga5866a0fd058aed3396402d0456144fd2" title="Get the first type in the signature.">_dbus_first_type_in_signature</a> (reader-><a class="code" href="structDBusTypeReader.html#af52e270ededd0aabb642c6130a3e9e40" title="string containing signature of block">type_str</a>,
<a name="l00828"></a>00828 reader-><a class="code" href="structDBusTypeReader.html#a160a55f9869e297572c5aa5b6ce7bc71" title="current position in signature">type_pos</a> + 1);
<a name="l00829"></a>00829
<a name="l00830"></a>00830 <span class="keywordflow">return</span> element_type;
<a name="l00831"></a>00831 }
<a name="l00832"></a>00832
<a name="l00837"></a>00837 <span class="keywordtype">int</span>
<a name="l00838"></a><a class="code" href="group__DBusMarshal.html#ga2a8ab1152821950b1fe29e000954981c">00838</a> <a class="code" href="group__DBusMarshal.html#ga2a8ab1152821950b1fe29e000954981c" title="Gets the current position in the value block.">_dbus_type_reader_get_value_pos</a> (<span class="keyword">const</span> <a class="code" href="structDBusTypeReader.html" title="The type reader is an iterator for reading values from a block of values.">DBusTypeReader</a> *reader)
<a name="l00839"></a>00839 {
<a name="l00840"></a>00840 <span class="keywordflow">return</span> reader-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a>;
<a name="l00841"></a>00841 }
<a name="l00842"></a>00842
<a name="l00852"></a>00852 <span class="keywordtype">void</span>
<a name="l00853"></a><a class="code" href="group__DBusMarshal.html#gac87315d74386314ec3b148ef737626d2">00853</a> <a class="code" href="group__DBusMarshal.html#gac87315d74386314ec3b148ef737626d2" title="Get the address of the marshaled value in the data being read.">_dbus_type_reader_read_raw</a> (<span class="keyword">const</span> <a class="code" href="structDBusTypeReader.html" title="The type reader is an iterator for reading values from a block of values.">DBusTypeReader</a> *reader,
<a name="l00854"></a>00854 <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> **value_location)
<a name="l00855"></a>00855 {
<a name="l00856"></a>00856 _dbus_assert (!reader-><a class="code" href="structDBusTypeReader.html#a238bd0d5a30d8f59fd9b71c95af25563" title="the vtable for the reader">klass</a>-><a class="code" href="structDBusTypeReaderClass.html#ad886037cd736e6f5cdbefb834b0bd5e7" title="only iterates over types, not values">types_only</a>);
<a name="l00857"></a>00857
<a name="l00858"></a>00858 *value_location = <a class="code" href="group__DBusString.html#ga8c202a65e938f9bdb859fc6705a4f1bb" title="const version of _dbus_string_get_data_len().">_dbus_string_get_const_data_len</a> (reader-><a class="code" href="structDBusTypeReader.html#a4065d7775758beb044ee23a71875571f" title="string containing values of block">value_str</a>,
<a name="l00859"></a>00859 reader-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a>,
<a name="l00860"></a>00860 0);
<a name="l00861"></a>00861 }
<a name="l00862"></a>00862
<a name="l00869"></a>00869 <span class="keywordtype">void</span>
<a name="l00870"></a><a class="code" href="group__DBusMarshal.html#gaa54355ee98d6721d7a29b5ae7d92eb9a">00870</a> <a class="code" href="group__DBusMarshal.html#gaa54355ee98d6721d7a29b5ae7d92eb9a" title="Reads a basic-typed value, as with _dbus_marshal_read_basic().">_dbus_type_reader_read_basic</a> (<span class="keyword">const</span> <a class="code" href="structDBusTypeReader.html" title="The type reader is an iterator for reading values from a block of values.">DBusTypeReader</a> *reader,
<a name="l00871"></a>00871 <span class="keywordtype">void</span> *value)
<a name="l00872"></a>00872 {
<a name="l00873"></a>00873 <span class="keywordtype">int</span> t;
<a name="l00874"></a>00874
<a name="l00875"></a>00875 _dbus_assert (!reader-><a class="code" href="structDBusTypeReader.html#a238bd0d5a30d8f59fd9b71c95af25563" title="the vtable for the reader">klass</a>-><a class="code" href="structDBusTypeReaderClass.html#ad886037cd736e6f5cdbefb834b0bd5e7" title="only iterates over types, not values">types_only</a>);
<a name="l00876"></a>00876
<a name="l00877"></a>00877 t = <a class="code" href="group__DBusMarshal.html#gab8e39cb8084247d54d7f272c51622a73" title="Gets the type of the value the reader is currently pointing to; or for a types-only reader gets the t...">_dbus_type_reader_get_current_type</a> (reader);
<a name="l00878"></a>00878
<a name="l00879"></a>00879 <a class="code" href="group__DBusMarshal.html#gab331e099fa8cf3d94cf33ad7b20c81ae" title="Demarshals a basic-typed value.">_dbus_marshal_read_basic</a> (reader-><a class="code" href="structDBusTypeReader.html#a4065d7775758beb044ee23a71875571f" title="string containing values of block">value_str</a>,
<a name="l00880"></a>00880 reader-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a>,
<a name="l00881"></a>00881 t, value,
<a name="l00882"></a>00882 reader-><a class="code" href="structDBusTypeReader.html#aeb0846d954066f420e1df98b81148702" title="byte order of the block">byte_order</a>,
<a name="l00883"></a>00883 <a class="code" href="group__DBusMacros.html#ga070d2ce7b6bb7e5c05602aa8c308d0c4" title="A null pointer, defined appropriately for C or C++.">NULL</a>);
<a name="l00884"></a>00884
<a name="l00885"></a>00885
<a name="l00886"></a>00886 <span class="preprocessor">#if RECURSIVE_MARSHAL_READ_TRACE</span>
<a name="l00887"></a>00887 <span class="preprocessor"></span> _dbus_verbose (<span class="stringliteral">" type reader %p read basic type_pos = %d value_pos = %d remaining sig '%s'\n"</span>,
<a name="l00888"></a>00888 reader, reader-><a class="code" href="structDBusTypeReader.html#a160a55f9869e297572c5aa5b6ce7bc71" title="current position in signature">type_pos</a>, reader-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a>,
<a name="l00889"></a>00889 <a class="code" href="group__DBusString.html#ga8c202a65e938f9bdb859fc6705a4f1bb" title="const version of _dbus_string_get_data_len().">_dbus_string_get_const_data_len</a> (reader-><a class="code" href="structDBusTypeReader.html#af52e270ededd0aabb642c6130a3e9e40" title="string containing signature of block">type_str</a>, reader-><a class="code" href="structDBusTypeReader.html#a160a55f9869e297572c5aa5b6ce7bc71" title="current position in signature">type_pos</a>, 0));
<a name="l00890"></a>00890 <span class="preprocessor">#endif</span>
<a name="l00891"></a>00891 <span class="preprocessor"></span>}
<a name="l00892"></a>00892
<a name="l00899"></a>00899 <span class="keywordtype">int</span>
<a name="l00900"></a><a class="code" href="group__DBusMarshal.html#ga7def93d676d528c261aa274cea41c29d">00900</a> <a class="code" href="group__DBusMarshal.html#ga7def93d676d528c261aa274cea41c29d" title="Returns the number of bytes in the array.">_dbus_type_reader_get_array_length</a> (<span class="keyword">const</span> <a class="code" href="structDBusTypeReader.html" title="The type reader is an iterator for reading values from a block of values.">DBusTypeReader</a> *reader)
<a name="l00901"></a>00901 {
<a name="l00902"></a>00902 _dbus_assert (!reader-><a class="code" href="structDBusTypeReader.html#a238bd0d5a30d8f59fd9b71c95af25563" title="the vtable for the reader">klass</a>-><a class="code" href="structDBusTypeReaderClass.html#ad886037cd736e6f5cdbefb834b0bd5e7" title="only iterates over types, not values">types_only</a>);
<a name="l00903"></a>00903 _dbus_assert (reader-><a class="code" href="structDBusTypeReader.html#a238bd0d5a30d8f59fd9b71c95af25563" title="the vtable for the reader">klass</a> == &array_reader_class);
<a name="l00904"></a>00904
<a name="l00905"></a>00905 <span class="keywordflow">return</span> array_reader_get_array_len (reader);
<a name="l00906"></a>00906 }
<a name="l00907"></a>00907
<a name="l00923"></a>00923 <span class="keywordtype">void</span>
<a name="l00924"></a><a class="code" href="group__DBusMarshal.html#gae9a65c05e58ace9c83352f65af2fe745">00924</a> <a class="code" href="group__DBusMarshal.html#gae9a65c05e58ace9c83352f65af2fe745" title="Reads a block of fixed-length basic values, from the current point in an array to the end of the arra...">_dbus_type_reader_read_fixed_multi</a> (<span class="keyword">const</span> <a class="code" href="structDBusTypeReader.html" title="The type reader is an iterator for reading values from a block of values.">DBusTypeReader</a> *reader,
<a name="l00925"></a>00925 <span class="keywordtype">void</span> *value,
<a name="l00926"></a>00926 <span class="keywordtype">int</span> *n_elements)
<a name="l00927"></a>00927 {
<a name="l00928"></a>00928 <span class="keywordtype">int</span> element_type;
<a name="l00929"></a>00929 <span class="keywordtype">int</span> end_pos;
<a name="l00930"></a>00930 <span class="keywordtype">int</span> remaining_len;
<a name="l00931"></a>00931 <span class="keywordtype">int</span> alignment;
<a name="l00932"></a>00932 <span class="keywordtype">int</span> total_len;
<a name="l00933"></a>00933
<a name="l00934"></a>00934 _dbus_assert (!reader-><a class="code" href="structDBusTypeReader.html#a238bd0d5a30d8f59fd9b71c95af25563" title="the vtable for the reader">klass</a>-><a class="code" href="structDBusTypeReaderClass.html#ad886037cd736e6f5cdbefb834b0bd5e7" title="only iterates over types, not values">types_only</a>);
<a name="l00935"></a>00935 _dbus_assert (reader-><a class="code" href="structDBusTypeReader.html#a238bd0d5a30d8f59fd9b71c95af25563" title="the vtable for the reader">klass</a> == &array_reader_class);
<a name="l00936"></a>00936
<a name="l00937"></a>00937 element_type = <a class="code" href="group__DBusMarshal.html#ga5866a0fd058aed3396402d0456144fd2" title="Get the first type in the signature.">_dbus_first_type_in_signature</a> (reader-><a class="code" href="structDBusTypeReader.html#af52e270ededd0aabb642c6130a3e9e40" title="string containing signature of block">type_str</a>,
<a name="l00938"></a>00938 reader-><a class="code" href="structDBusTypeReader.html#a160a55f9869e297572c5aa5b6ce7bc71" title="current position in signature">type_pos</a>);
<a name="l00939"></a>00939
<a name="l00940"></a>00940 _dbus_assert (element_type != <a class="code" href="group__DBusProtocol.html#gaa9588da889743b2119dc6664712ae51e" title="Type code that is never equal to a legitimate type code.">DBUS_TYPE_INVALID</a>); <span class="comment">/* why we don't use get_current_type() */</span>
<a name="l00941"></a>00941 _dbus_assert (<a class="code" href="group__DBusSignature.html#ga2f89962cbd33e4ad843824157bae2093" title="Tells you whether values of this type can change length if you set them to some other value...">dbus_type_is_fixed</a> (element_type));
<a name="l00942"></a>00942
<a name="l00943"></a>00943 alignment = <a class="code" href="group__DBusMarshal.html#ga2ba80f227880e442c140bc67653b0abd" title="Gets the alignment requirement for the given type; will be 1, 4, or 8.">_dbus_type_get_alignment</a> (element_type);
<a name="l00944"></a>00944
<a name="l00945"></a>00945 _dbus_assert (reader-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a> >= reader-><a class="code" href="structDBusTypeReader.html#ada12bed6758840dc19b1fcb271fb01be" title="class-specific data">u</a>.array.start_pos);
<a name="l00946"></a>00946
<a name="l00947"></a>00947 total_len = array_reader_get_array_len (reader);
<a name="l00948"></a>00948 end_pos = reader-><a class="code" href="structDBusTypeReader.html#ada12bed6758840dc19b1fcb271fb01be" title="class-specific data">u</a>.array.start_pos + total_len;
<a name="l00949"></a>00949 remaining_len = end_pos - reader-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a>;
<a name="l00950"></a>00950
<a name="l00951"></a>00951 <span class="preprocessor">#if RECURSIVE_MARSHAL_READ_TRACE</span>
<a name="l00952"></a>00952 <span class="preprocessor"></span> _dbus_verbose (<span class="stringliteral">"end_pos %d total_len %d remaining_len %d value_pos %d\n"</span>,
<a name="l00953"></a>00953 end_pos, total_len, remaining_len, reader-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a>);
<a name="l00954"></a>00954 <span class="preprocessor">#endif</span>
<a name="l00955"></a>00955 <span class="preprocessor"></span>
<a name="l00956"></a>00956 _dbus_assert (remaining_len <= total_len);
<a name="l00957"></a>00957
<a name="l00958"></a>00958 <span class="keywordflow">if</span> (remaining_len == 0)
<a name="l00959"></a>00959 *(<span class="keyword">const</span> <a class="code" href="unionDBusBasicValue.html" title="A simple value union that lets you access bytes as if they were various types; useful when dealing wi...">DBusBasicValue</a>**) value = <a class="code" href="group__DBusMacros.html#ga070d2ce7b6bb7e5c05602aa8c308d0c4" title="A null pointer, defined appropriately for C or C++.">NULL</a>;
<a name="l00960"></a>00960 <span class="keywordflow">else</span>
<a name="l00961"></a>00961 *(<span class="keyword">const</span> <a class="code" href="unionDBusBasicValue.html" title="A simple value union that lets you access bytes as if they were various types; useful when dealing wi...">DBusBasicValue</a>**) value =
<a name="l00962"></a>00962 (<span class="keywordtype">void</span>*) <a class="code" href="group__DBusString.html#ga8c202a65e938f9bdb859fc6705a4f1bb" title="const version of _dbus_string_get_data_len().">_dbus_string_get_const_data_len</a> (reader-><a class="code" href="structDBusTypeReader.html#a4065d7775758beb044ee23a71875571f" title="string containing values of block">value_str</a>,
<a name="l00963"></a>00963 reader-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a>,
<a name="l00964"></a>00964 remaining_len);
<a name="l00965"></a>00965
<a name="l00966"></a>00966 *n_elements = remaining_len / alignment;
<a name="l00967"></a>00967 _dbus_assert ((remaining_len % alignment) == 0);
<a name="l00968"></a>00968
<a name="l00969"></a>00969 <span class="preprocessor">#if RECURSIVE_MARSHAL_READ_TRACE</span>
<a name="l00970"></a>00970 <span class="preprocessor"></span> _dbus_verbose (<span class="stringliteral">" type reader %p read fixed array type_pos = %d value_pos = %d remaining sig '%s'\n"</span>,
<a name="l00971"></a>00971 reader, reader-><a class="code" href="structDBusTypeReader.html#a160a55f9869e297572c5aa5b6ce7bc71" title="current position in signature">type_pos</a>, reader-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a>,
<a name="l00972"></a>00972 <a class="code" href="group__DBusString.html#ga8c202a65e938f9bdb859fc6705a4f1bb" title="const version of _dbus_string_get_data_len().">_dbus_string_get_const_data_len</a> (reader-><a class="code" href="structDBusTypeReader.html#af52e270ededd0aabb642c6130a3e9e40" title="string containing signature of block">type_str</a>, reader-><a class="code" href="structDBusTypeReader.html#a160a55f9869e297572c5aa5b6ce7bc71" title="current position in signature">type_pos</a>, 0));
<a name="l00973"></a>00973 <span class="preprocessor">#endif</span>
<a name="l00974"></a>00974 <span class="preprocessor"></span>}
<a name="l00975"></a>00975
<a name="l00988"></a>00988 <span class="keywordtype">void</span>
<a name="l00989"></a><a class="code" href="group__DBusMarshal.html#ga082b410820c74b2a6ca816a8e0c91803">00989</a> <a class="code" href="group__DBusMarshal.html#ga082b410820c74b2a6ca816a8e0c91803" title="Initialize a new reader pointing to the first type and corresponding value that's a child of the curr...">_dbus_type_reader_recurse</a> (<a class="code" href="structDBusTypeReader.html" title="The type reader is an iterator for reading values from a block of values.">DBusTypeReader</a> *reader,
<a name="l00990"></a>00990 <a class="code" href="structDBusTypeReader.html" title="The type reader is an iterator for reading values from a block of values.">DBusTypeReader</a> *sub)
<a name="l00991"></a>00991 {
<a name="l00992"></a>00992 <span class="keyword">const</span> <a class="code" href="structDBusTypeReaderClass.html" title="Virtual table for a type reader.">DBusTypeReaderClass</a> *klass;
<a name="l00993"></a>00993 <span class="keywordtype">int</span> t;
<a name="l00994"></a>00994
<a name="l00995"></a>00995 t = <a class="code" href="group__DBusMarshal.html#ga5866a0fd058aed3396402d0456144fd2" title="Get the first type in the signature.">_dbus_first_type_in_signature</a> (reader-><a class="code" href="structDBusTypeReader.html#af52e270ededd0aabb642c6130a3e9e40" title="string containing signature of block">type_str</a>, reader-><a class="code" href="structDBusTypeReader.html#a160a55f9869e297572c5aa5b6ce7bc71" title="current position in signature">type_pos</a>);
<a name="l00996"></a>00996
<a name="l00997"></a>00997 <span class="keywordflow">switch</span> (t)
<a name="l00998"></a>00998 {
<a name="l00999"></a>00999 <span class="keywordflow">case</span> <a class="code" href="group__DBusProtocol.html#gae4b22a74b9edb0ec0ff6e0294794d3f9" title="STRUCT and DICT_ENTRY are sort of special since their codes can't appear in a type string...">DBUS_TYPE_STRUCT</a>:
<a name="l01000"></a>01000 <span class="keywordflow">if</span> (reader-><a class="code" href="structDBusTypeReader.html#a238bd0d5a30d8f59fd9b71c95af25563" title="the vtable for the reader">klass</a>-><a class="code" href="structDBusTypeReaderClass.html#ad886037cd736e6f5cdbefb834b0bd5e7" title="only iterates over types, not values">types_only</a>)
<a name="l01001"></a>01001 klass = &struct_types_only_reader_class;
<a name="l01002"></a>01002 <span class="keywordflow">else</span>
<a name="l01003"></a>01003 klass = &struct_reader_class;
<a name="l01004"></a>01004 <span class="keywordflow">break</span>;
<a name="l01005"></a>01005 <span class="keywordflow">case</span> <a class="code" href="group__DBusProtocol.html#gad2fc8e6c50e0ad927f4249fb9e53ca97" title="Type code used to represent a dict entry; however, this type code does not appear in type signatures...">DBUS_TYPE_DICT_ENTRY</a>:
<a name="l01006"></a>01006 <span class="keywordflow">if</span> (reader-><a class="code" href="structDBusTypeReader.html#a238bd0d5a30d8f59fd9b71c95af25563" title="the vtable for the reader">klass</a>-><a class="code" href="structDBusTypeReaderClass.html#ad886037cd736e6f5cdbefb834b0bd5e7" title="only iterates over types, not values">types_only</a>)
<a name="l01007"></a>01007 klass = &dict_entry_types_only_reader_class;
<a name="l01008"></a>01008 <span class="keywordflow">else</span>
<a name="l01009"></a>01009 klass = &dict_entry_reader_class;
<a name="l01010"></a>01010 <span class="keywordflow">break</span>;
<a name="l01011"></a>01011 <span class="keywordflow">case</span> <a class="code" href="group__DBusProtocol.html#ga8912f600f81a773066ca03d9163613a9" title="Type code marking a D-Bus array type.">DBUS_TYPE_ARRAY</a>:
<a name="l01012"></a>01012 <span class="keywordflow">if</span> (reader-><a class="code" href="structDBusTypeReader.html#a238bd0d5a30d8f59fd9b71c95af25563" title="the vtable for the reader">klass</a>-><a class="code" href="structDBusTypeReaderClass.html#ad886037cd736e6f5cdbefb834b0bd5e7" title="only iterates over types, not values">types_only</a>)
<a name="l01013"></a>01013 klass = &array_types_only_reader_class;
<a name="l01014"></a>01014 <span class="keywordflow">else</span>
<a name="l01015"></a>01015 klass = &array_reader_class;
<a name="l01016"></a>01016 <span class="keywordflow">break</span>;
<a name="l01017"></a>01017 <span class="keywordflow">case</span> <a class="code" href="group__DBusProtocol.html#ga4aa7a463ad2bce4e9aa95e3e397ddcf1" title="Type code marking a D-Bus variant type.">DBUS_TYPE_VARIANT</a>:
<a name="l01018"></a>01018 <span class="keywordflow">if</span> (reader-><a class="code" href="structDBusTypeReader.html#a238bd0d5a30d8f59fd9b71c95af25563" title="the vtable for the reader">klass</a>-><a class="code" href="structDBusTypeReaderClass.html#ad886037cd736e6f5cdbefb834b0bd5e7" title="only iterates over types, not values">types_only</a>)
<a name="l01019"></a>01019 _dbus_assert_not_reached (<span class="stringliteral">"can't recurse into variant typecode"</span>);
<a name="l01020"></a>01020 <span class="keywordflow">else</span>
<a name="l01021"></a>01021 klass = &variant_reader_class;
<a name="l01022"></a>01022 <span class="keywordflow">break</span>;
<a name="l01023"></a>01023 <span class="keywordflow">default</span>:
<a name="l01024"></a>01024 _dbus_verbose (<span class="stringliteral">"recursing into type %s\n"</span>, <a class="code" href="group__DBusMarshal.html#ga48a595c2b26dce6e9c25ce040e5247e5" title="Returns a string describing the given type.">_dbus_type_to_string</a> (t));
<a name="l01025"></a>01025 <span class="preprocessor">#ifndef DBUS_DISABLE_CHECKS</span>
<a name="l01026"></a>01026 <span class="preprocessor"></span> <span class="keywordflow">if</span> (t == <a class="code" href="group__DBusProtocol.html#gaa9588da889743b2119dc6664712ae51e" title="Type code that is never equal to a legitimate type code.">DBUS_TYPE_INVALID</a>)
<a name="l01027"></a>01027 <a class="code" href="group__DBusInternalsUtils.html#ga63f2f8a068454b781f214ba596e313b4" title="Prints a "critical" warning to stderr when an assertion fails; differs from _dbus_warn primarily in t...">_dbus_warn_check_failed</a> (<span class="stringliteral">"You can't recurse into an empty array or off the end of a message body\n"</span>);
<a name="l01028"></a>01028 <span class="preprocessor">#endif </span><span class="comment">/* DBUS_DISABLE_CHECKS */</span>
<a name="l01029"></a>01029
<a name="l01030"></a>01030 _dbus_assert_not_reached (<span class="stringliteral">"don't yet handle recursing into this type"</span>);
<a name="l01031"></a>01031 }
<a name="l01032"></a>01032
<a name="l01033"></a>01033 _dbus_assert (klass == all_reader_classes[klass-><a class="code" href="structDBusTypeReaderClass.html#a7cd297c0e03c5204bc41bf305c7688c9" title="index in all_reader_classes">id</a>]);
<a name="l01034"></a>01034
<a name="l01035"></a>01035 (* klass-><a class="code" href="structDBusTypeReaderClass.html#abe8f7f4433f8c8eaf0c5f8d445101391" title="recurse with this reader as sub">recurse</a>) (sub, reader);
<a name="l01036"></a>01036 sub-><a class="code" href="structDBusTypeReader.html#a238bd0d5a30d8f59fd9b71c95af25563" title="the vtable for the reader">klass</a> = klass;
<a name="l01037"></a>01037
<a name="l01038"></a>01038 <span class="preprocessor">#if RECURSIVE_MARSHAL_READ_TRACE</span>
<a name="l01039"></a>01039 <span class="preprocessor"></span> _dbus_verbose (<span class="stringliteral">" type reader %p RECURSED type_pos = %d value_pos = %d remaining sig '%s'\n"</span>,
<a name="l01040"></a>01040 sub, sub-><a class="code" href="structDBusTypeReader.html#a160a55f9869e297572c5aa5b6ce7bc71" title="current position in signature">type_pos</a>, sub-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a>,
<a name="l01041"></a>01041 <a class="code" href="group__DBusString.html#ga8c202a65e938f9bdb859fc6705a4f1bb" title="const version of _dbus_string_get_data_len().">_dbus_string_get_const_data_len</a> (sub-><a class="code" href="structDBusTypeReader.html#af52e270ededd0aabb642c6130a3e9e40" title="string containing signature of block">type_str</a>, sub-><a class="code" href="structDBusTypeReader.html#a160a55f9869e297572c5aa5b6ce7bc71" title="current position in signature">type_pos</a>, 0));
<a name="l01042"></a>01042 <span class="preprocessor">#endif</span>
<a name="l01043"></a>01043 <span class="preprocessor"></span>}
<a name="l01044"></a>01044
<a name="l01053"></a>01053 <a class="code" href="group__DBusTypes.html#ga39c9cb0f3a2a8ad6f55cc4855d035349" title="A boolean, valid values are TRUE and FALSE.">dbus_bool_t</a>
<a name="l01054"></a><a class="code" href="group__DBusMarshal.html#ga746c09512d4905f2d2fac7ed4c3c63c2">01054</a> <a class="code" href="group__DBusMarshal.html#ga746c09512d4905f2d2fac7ed4c3c63c2" title="Skip to the next value on this "level".">_dbus_type_reader_next</a> (<a class="code" href="structDBusTypeReader.html" title="The type reader is an iterator for reading values from a block of values.">DBusTypeReader</a> *reader)
<a name="l01055"></a>01055 {
<a name="l01056"></a>01056 <span class="keywordtype">int</span> t;
<a name="l01057"></a>01057
<a name="l01058"></a>01058 t = <a class="code" href="group__DBusMarshal.html#gab8e39cb8084247d54d7f272c51622a73" title="Gets the type of the value the reader is currently pointing to; or for a types-only reader gets the t...">_dbus_type_reader_get_current_type</a> (reader);
<a name="l01059"></a>01059
<a name="l01060"></a>01060 <span class="preprocessor">#if RECURSIVE_MARSHAL_READ_TRACE</span>
<a name="l01061"></a>01061 <span class="preprocessor"></span> _dbus_verbose (<span class="stringliteral">" type reader %p START next() { type_pos = %d value_pos = %d remaining sig '%s' current_type = %s\n"</span>,
<a name="l01062"></a>01062 reader, reader-><a class="code" href="structDBusTypeReader.html#a160a55f9869e297572c5aa5b6ce7bc71" title="current position in signature">type_pos</a>, reader-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a>,
<a name="l01063"></a>01063 <a class="code" href="group__DBusString.html#ga8c202a65e938f9bdb859fc6705a4f1bb" title="const version of _dbus_string_get_data_len().">_dbus_string_get_const_data_len</a> (reader-><a class="code" href="structDBusTypeReader.html#af52e270ededd0aabb642c6130a3e9e40" title="string containing signature of block">type_str</a>, reader-><a class="code" href="structDBusTypeReader.html#a160a55f9869e297572c5aa5b6ce7bc71" title="current position in signature">type_pos</a>, 0),
<a name="l01064"></a>01064 <a class="code" href="group__DBusMarshal.html#ga48a595c2b26dce6e9c25ce040e5247e5" title="Returns a string describing the given type.">_dbus_type_to_string</a> (t));
<a name="l01065"></a>01065 <span class="preprocessor">#endif</span>
<a name="l01066"></a>01066 <span class="preprocessor"></span>
<a name="l01067"></a>01067 <span class="keywordflow">if</span> (t == <a class="code" href="group__DBusProtocol.html#gaa9588da889743b2119dc6664712ae51e" title="Type code that is never equal to a legitimate type code.">DBUS_TYPE_INVALID</a>)
<a name="l01068"></a>01068 <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#gaa93f0eb578d23995850d61f7d61c55c1" title="Expands to "0".">FALSE</a>;
<a name="l01069"></a>01069
<a name="l01070"></a>01070 (* reader-><a class="code" href="structDBusTypeReader.html#a238bd0d5a30d8f59fd9b71c95af25563" title="the vtable for the reader">klass</a>-><a class="code" href="structDBusTypeReaderClass.html#a1b4a87e6f61339456f2e8d0ce873f379" title="go to the next value">next</a>) (reader, t);
<a name="l01071"></a>01071
<a name="l01072"></a>01072 <span class="preprocessor">#if RECURSIVE_MARSHAL_READ_TRACE</span>
<a name="l01073"></a>01073 <span class="preprocessor"></span> _dbus_verbose (<span class="stringliteral">" type reader %p END next() type_pos = %d value_pos = %d remaining sig '%s' current_type = %s\n"</span>,
<a name="l01074"></a>01074 reader, reader-><a class="code" href="structDBusTypeReader.html#a160a55f9869e297572c5aa5b6ce7bc71" title="current position in signature">type_pos</a>, reader-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a>,
<a name="l01075"></a>01075 <a class="code" href="group__DBusString.html#ga8c202a65e938f9bdb859fc6705a4f1bb" title="const version of _dbus_string_get_data_len().">_dbus_string_get_const_data_len</a> (reader-><a class="code" href="structDBusTypeReader.html#af52e270ededd0aabb642c6130a3e9e40" title="string containing signature of block">type_str</a>, reader-><a class="code" href="structDBusTypeReader.html#a160a55f9869e297572c5aa5b6ce7bc71" title="current position in signature">type_pos</a>, 0),
<a name="l01076"></a>01076 <a class="code" href="group__DBusMarshal.html#ga48a595c2b26dce6e9c25ce040e5247e5" title="Returns a string describing the given type.">_dbus_type_to_string</a> (<a class="code" href="group__DBusMarshal.html#gab8e39cb8084247d54d7f272c51622a73" title="Gets the type of the value the reader is currently pointing to; or for a types-only reader gets the t...">_dbus_type_reader_get_current_type</a> (reader)));
<a name="l01077"></a>01077 <span class="preprocessor">#endif</span>
<a name="l01078"></a>01078 <span class="preprocessor"></span>
<a name="l01079"></a>01079 <span class="keywordflow">return</span> <a class="code" href="group__DBusMarshal.html#gab8e39cb8084247d54d7f272c51622a73" title="Gets the type of the value the reader is currently pointing to; or for a types-only reader gets the t...">_dbus_type_reader_get_current_type</a> (reader) != <a class="code" href="group__DBusProtocol.html#gaa9588da889743b2119dc6664712ae51e" title="Type code that is never equal to a legitimate type code.">DBUS_TYPE_INVALID</a>;
<a name="l01080"></a>01080 }
<a name="l01081"></a>01081
<a name="l01093"></a>01093 <a class="code" href="group__DBusTypes.html#ga39c9cb0f3a2a8ad6f55cc4855d035349" title="A boolean, valid values are TRUE and FALSE.">dbus_bool_t</a>
<a name="l01094"></a><a class="code" href="group__DBusMarshal.html#ga97a59dbd1597ef1b267457e809f095de">01094</a> <a class="code" href="group__DBusMarshal.html#ga97a59dbd1597ef1b267457e809f095de" title="Check whether there's another value on this "level".">_dbus_type_reader_has_next</a> (<span class="keyword">const</span> <a class="code" href="structDBusTypeReader.html" title="The type reader is an iterator for reading values from a block of values.">DBusTypeReader</a> *reader)
<a name="l01095"></a>01095 {
<a name="l01096"></a>01096 <span class="comment">/* Not efficient but works for now. */</span>
<a name="l01097"></a>01097 <a class="code" href="structDBusTypeReader.html" title="The type reader is an iterator for reading values from a block of values.">DBusTypeReader</a> copy;
<a name="l01098"></a>01098
<a name="l01099"></a>01099 copy = *reader;
<a name="l01100"></a>01100 <span class="keywordflow">return</span> <a class="code" href="group__DBusMarshal.html#ga746c09512d4905f2d2fac7ed4c3c63c2" title="Skip to the next value on this "level".">_dbus_type_reader_next</a> (&copy);
<a name="l01101"></a>01101 }
<a name="l01102"></a>01102
<a name="l01124"></a>01124 <span class="keywordtype">void</span>
<a name="l01125"></a><a class="code" href="group__DBusMarshal.html#ga4578cc623c8b0978ca780ce0ab950fdb">01125</a> <a class="code" href="group__DBusMarshal.html#ga4578cc623c8b0978ca780ce0ab950fdb" title="Gets the string and range of said string containing the signature of the current value.">_dbus_type_reader_get_signature</a> (<span class="keyword">const</span> <a class="code" href="structDBusTypeReader.html" title="The type reader is an iterator for reading values from a block of values.">DBusTypeReader</a> *reader,
<a name="l01126"></a>01126 <span class="keyword">const</span> <a class="code" href="structDBusString.html">DBusString</a> **str_p,
<a name="l01127"></a>01127 <span class="keywordtype">int</span> *start_p,
<a name="l01128"></a>01128 <span class="keywordtype">int</span> *len_p)
<a name="l01129"></a>01129 {
<a name="l01130"></a>01130 *str_p = reader-><a class="code" href="structDBusTypeReader.html#af52e270ededd0aabb642c6130a3e9e40" title="string containing signature of block">type_str</a>;
<a name="l01131"></a>01131 *start_p = reader-><a class="code" href="structDBusTypeReader.html#a160a55f9869e297572c5aa5b6ce7bc71" title="current position in signature">type_pos</a>;
<a name="l01132"></a>01132 *len_p = find_len_of_complete_type (reader-><a class="code" href="structDBusTypeReader.html#af52e270ededd0aabb642c6130a3e9e40" title="string containing signature of block">type_str</a>, reader-><a class="code" href="structDBusTypeReader.html#a160a55f9869e297572c5aa5b6ce7bc71" title="current position in signature">type_pos</a>);
<a name="l01133"></a>01133 }
<a name="l01134"></a>01134
<a name="l01135"></a><a class="code" href="structReplacementBlock.html">01135</a> <span class="keyword">typedef</span> <span class="keyword">struct</span>
<a name="l01136"></a>01136 {
<a name="l01137"></a><a class="code" href="structReplacementBlock.html#a562018cd2a0870abe3897b289bdd8488">01137</a> <a class="code" href="structDBusString.html">DBusString</a> <a class="code" href="structReplacementBlock.html#a562018cd2a0870abe3897b289bdd8488" title="Marshaled value including alignment padding.">replacement</a>;
<a name="l01138"></a><a class="code" href="structReplacementBlock.html#a2aa3220ac139545f4fa2ddec2c36d5de">01138</a> <span class="keywordtype">int</span> <a class="code" href="structReplacementBlock.html#a2aa3220ac139545f4fa2ddec2c36d5de" title="How much of the replacement block is padding.">padding</a>;
<a name="l01139"></a>01139 } <a class="code" href="structReplacementBlock.html">ReplacementBlock</a>;
<a name="l01140"></a>01140
<a name="l01141"></a>01141 <span class="keyword">static</span> <a class="code" href="group__DBusTypes.html#ga39c9cb0f3a2a8ad6f55cc4855d035349" title="A boolean, valid values are TRUE and FALSE.">dbus_bool_t</a>
<a name="l01142"></a>01142 replacement_block_init (<a class="code" href="structReplacementBlock.html">ReplacementBlock</a> *block,
<a name="l01143"></a>01143 <a class="code" href="structDBusTypeReader.html" title="The type reader is an iterator for reading values from a block of values.">DBusTypeReader</a> *reader)
<a name="l01144"></a>01144 {
<a name="l01145"></a>01145 <span class="keywordflow">if</span> (!<a class="code" href="group__DBusString.html#ga348252317f7bb8ac43529972945830ae" title="Initializes a string.">_dbus_string_init</a> (&block-><a class="code" href="structReplacementBlock.html#a562018cd2a0870abe3897b289bdd8488" title="Marshaled value including alignment padding.">replacement</a>))
<a name="l01146"></a>01146 <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#gaa93f0eb578d23995850d61f7d61c55c1" title="Expands to "0".">FALSE</a>;
<a name="l01147"></a>01147
<a name="l01148"></a>01148 <span class="comment">/* % 8 is the padding to have the same align properties in</span>
<a name="l01149"></a>01149 <span class="comment"> * our replacement string as we do at the position being replaced</span>
<a name="l01150"></a>01150 <span class="comment"> */</span>
<a name="l01151"></a>01151 block-><a class="code" href="structReplacementBlock.html#a2aa3220ac139545f4fa2ddec2c36d5de" title="How much of the replacement block is padding.">padding</a> = reader-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a> % 8;
<a name="l01152"></a>01152
<a name="l01153"></a>01153 <span class="keywordflow">if</span> (!<a class="code" href="group__DBusString.html#ga8f13997d90ceed2f437706e6b7804d9b" title="Makes a string longer by the given number of bytes.">_dbus_string_lengthen</a> (&block-><a class="code" href="structReplacementBlock.html#a562018cd2a0870abe3897b289bdd8488" title="Marshaled value including alignment padding.">replacement</a>, block-><a class="code" href="structReplacementBlock.html#a2aa3220ac139545f4fa2ddec2c36d5de" title="How much of the replacement block is padding.">padding</a>))
<a name="l01154"></a>01154 <span class="keywordflow">goto</span> oom;
<a name="l01155"></a>01155
<a name="l01156"></a>01156 <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#gaa8cecfc5c5c054d2875c03e77b7be15d" title="Expands to "1".">TRUE</a>;
<a name="l01157"></a>01157
<a name="l01158"></a>01158 oom:
<a name="l01159"></a>01159 <a class="code" href="group__DBusString.html#ga781ca91acda49a834dce7d0ed0eef212" title="Frees a string created by _dbus_string_init().">_dbus_string_free</a> (&block-><a class="code" href="structReplacementBlock.html#a562018cd2a0870abe3897b289bdd8488" title="Marshaled value including alignment padding.">replacement</a>);
<a name="l01160"></a>01160 <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#gaa93f0eb578d23995850d61f7d61c55c1" title="Expands to "0".">FALSE</a>;
<a name="l01161"></a>01161 }
<a name="l01162"></a>01162
<a name="l01163"></a>01163 <span class="keyword">static</span> <a class="code" href="group__DBusTypes.html#ga39c9cb0f3a2a8ad6f55cc4855d035349" title="A boolean, valid values are TRUE and FALSE.">dbus_bool_t</a>
<a name="l01164"></a>01164 replacement_block_replace (<a class="code" href="structReplacementBlock.html">ReplacementBlock</a> *block,
<a name="l01165"></a>01165 <a class="code" href="structDBusTypeReader.html" title="The type reader is an iterator for reading values from a block of values.">DBusTypeReader</a> *reader,
<a name="l01166"></a>01166 <span class="keyword">const</span> <a class="code" href="structDBusTypeReader.html" title="The type reader is an iterator for reading values from a block of values.">DBusTypeReader</a> *realign_root)
<a name="l01167"></a>01167 {
<a name="l01168"></a>01168 <a class="code" href="structDBusTypeWriter.html" title="The type writer is an iterator for writing to a block of values.">DBusTypeWriter</a> writer;
<a name="l01169"></a>01169 <a class="code" href="structDBusTypeReader.html" title="The type reader is an iterator for reading values from a block of values.">DBusTypeReader</a> realign_reader;
<a name="l01170"></a>01170 <a class="code" href="structDBusList.html" title="A node in a linked list.">DBusList</a> *fixups;
<a name="l01171"></a>01171 <span class="keywordtype">int</span> orig_len;
<a name="l01172"></a>01172
<a name="l01173"></a>01173 _dbus_assert (realign_root != <a class="code" href="group__DBusMacros.html#ga070d2ce7b6bb7e5c05602aa8c308d0c4" title="A null pointer, defined appropriately for C or C++.">NULL</a>);
<a name="l01174"></a>01174
<a name="l01175"></a>01175 orig_len = <a class="code" href="group__DBusString.html#gaa5136e6fd2c5188f4b88de7863369c6d" title="Gets the length of a string (not including nul termination).">_dbus_string_get_length</a> (&block-><a class="code" href="structReplacementBlock.html#a562018cd2a0870abe3897b289bdd8488" title="Marshaled value including alignment padding.">replacement</a>);
<a name="l01176"></a>01176
<a name="l01177"></a>01177 realign_reader = *realign_root;
<a name="l01178"></a>01178
<a name="l01179"></a>01179 <span class="preprocessor">#if RECURSIVE_MARSHAL_WRITE_TRACE</span>
<a name="l01180"></a>01180 <span class="preprocessor"></span> _dbus_verbose (<span class="stringliteral">"INITIALIZING replacement block writer %p at value_pos %d\n"</span>,
<a name="l01181"></a>01181 &writer, <a class="code" href="group__DBusString.html#gaa5136e6fd2c5188f4b88de7863369c6d" title="Gets the length of a string (not including nul termination).">_dbus_string_get_length</a> (&block-><a class="code" href="structReplacementBlock.html#a562018cd2a0870abe3897b289bdd8488" title="Marshaled value including alignment padding.">replacement</a>));
<a name="l01182"></a>01182 <span class="preprocessor">#endif</span>
<a name="l01183"></a>01183 <span class="preprocessor"></span> <a class="code" href="group__DBusMarshal.html#ga1f101175ce6f33221fcb59f0b46349bd" title="Like _dbus_type_writer_init(), except the type string passed in should correspond to an existing sign...">_dbus_type_writer_init_values_only</a> (&writer,
<a name="l01184"></a>01184 realign_reader.<a class="code" href="structDBusTypeReader.html#aeb0846d954066f420e1df98b81148702" title="byte order of the block">byte_order</a>,
<a name="l01185"></a>01185 realign_reader.<a class="code" href="structDBusTypeReader.html#af52e270ededd0aabb642c6130a3e9e40" title="string containing signature of block">type_str</a>,
<a name="l01186"></a>01186 realign_reader.<a class="code" href="structDBusTypeReader.html#a160a55f9869e297572c5aa5b6ce7bc71" title="current position in signature">type_pos</a>,
<a name="l01187"></a>01187 &block-><a class="code" href="structReplacementBlock.html#a562018cd2a0870abe3897b289bdd8488" title="Marshaled value including alignment padding.">replacement</a>,
<a name="l01188"></a>01188 <a class="code" href="group__DBusString.html#gaa5136e6fd2c5188f4b88de7863369c6d" title="Gets the length of a string (not including nul termination).">_dbus_string_get_length</a> (&block-><a class="code" href="structReplacementBlock.html#a562018cd2a0870abe3897b289bdd8488" title="Marshaled value including alignment padding.">replacement</a>));
<a name="l01189"></a>01189
<a name="l01190"></a>01190 _dbus_assert (realign_reader.<a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a> <= reader-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a>);
<a name="l01191"></a>01191
<a name="l01192"></a>01192 <span class="preprocessor">#if RECURSIVE_MARSHAL_WRITE_TRACE</span>
<a name="l01193"></a>01193 <span class="preprocessor"></span> _dbus_verbose (<span class="stringliteral">"COPYING from reader at value_pos %d to writer %p starting after value_pos %d\n"</span>,
<a name="l01194"></a>01194 realign_reader.<a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a>, &writer, reader-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a>);
<a name="l01195"></a>01195 <span class="preprocessor">#endif</span>
<a name="l01196"></a>01196 <span class="preprocessor"></span> fixups = <a class="code" href="group__DBusMacros.html#ga070d2ce7b6bb7e5c05602aa8c308d0c4" title="A null pointer, defined appropriately for C or C++.">NULL</a>;
<a name="l01197"></a>01197 <span class="keywordflow">if</span> (!_dbus_type_writer_write_reader_partial (&writer,
<a name="l01198"></a>01198 &realign_reader,
<a name="l01199"></a>01199 reader,
<a name="l01200"></a>01200 block-><a class="code" href="structReplacementBlock.html#a2aa3220ac139545f4fa2ddec2c36d5de" title="How much of the replacement block is padding.">padding</a>,
<a name="l01201"></a>01201 <a class="code" href="group__DBusString.html#gaa5136e6fd2c5188f4b88de7863369c6d" title="Gets the length of a string (not including nul termination).">_dbus_string_get_length</a> (&block-><a class="code" href="structReplacementBlock.html#a562018cd2a0870abe3897b289bdd8488" title="Marshaled value including alignment padding.">replacement</a>) - block-><a class="code" href="structReplacementBlock.html#a2aa3220ac139545f4fa2ddec2c36d5de" title="How much of the replacement block is padding.">padding</a>,
<a name="l01202"></a>01202 &fixups))
<a name="l01203"></a>01203 <span class="keywordflow">goto</span> oom;
<a name="l01204"></a>01204
<a name="l01205"></a>01205 <span class="preprocessor">#if RECURSIVE_MARSHAL_WRITE_TRACE</span>
<a name="l01206"></a>01206 <span class="preprocessor"></span> _dbus_verbose (<span class="stringliteral">"REPLACEMENT at padding %d len %d\n"</span>, block-><a class="code" href="structReplacementBlock.html#a2aa3220ac139545f4fa2ddec2c36d5de" title="How much of the replacement block is padding.">padding</a>,
<a name="l01207"></a>01207 <a class="code" href="group__DBusString.html#gaa5136e6fd2c5188f4b88de7863369c6d" title="Gets the length of a string (not including nul termination).">_dbus_string_get_length</a> (&block-><a class="code" href="structReplacementBlock.html#a562018cd2a0870abe3897b289bdd8488" title="Marshaled value including alignment padding.">replacement</a>) - block-><a class="code" href="structReplacementBlock.html#a2aa3220ac139545f4fa2ddec2c36d5de" title="How much of the replacement block is padding.">padding</a>);
<a name="l01208"></a>01208 <a class="code" href="group__DBusMarshal.html#ga3926bb35edf78d114cf0c341fe3258e0" title="Dump the given part of the string to verbose log.">_dbus_verbose_bytes_of_string</a> (&block-><a class="code" href="structReplacementBlock.html#a562018cd2a0870abe3897b289bdd8488" title="Marshaled value including alignment padding.">replacement</a>, block-><a class="code" href="structReplacementBlock.html#a2aa3220ac139545f4fa2ddec2c36d5de" title="How much of the replacement block is padding.">padding</a>,
<a name="l01209"></a>01209 <a class="code" href="group__DBusString.html#gaa5136e6fd2c5188f4b88de7863369c6d" title="Gets the length of a string (not including nul termination).">_dbus_string_get_length</a> (&block-><a class="code" href="structReplacementBlock.html#a562018cd2a0870abe3897b289bdd8488" title="Marshaled value including alignment padding.">replacement</a>) - block-><a class="code" href="structReplacementBlock.html#a2aa3220ac139545f4fa2ddec2c36d5de" title="How much of the replacement block is padding.">padding</a>);
<a name="l01210"></a>01210 _dbus_verbose (<span class="stringliteral">"TO BE REPLACED at value_pos = %d (align pad %d) len %d realign_reader.value_pos %d\n"</span>,
<a name="l01211"></a>01211 reader-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a>, reader-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a> % 8,
<a name="l01212"></a>01212 realign_reader.<a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a> - reader-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a>,
<a name="l01213"></a>01213 realign_reader.<a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a>);
<a name="l01214"></a>01214 <a class="code" href="group__DBusMarshal.html#ga3926bb35edf78d114cf0c341fe3258e0" title="Dump the given part of the string to verbose log.">_dbus_verbose_bytes_of_string</a> (reader-><a class="code" href="structDBusTypeReader.html#a4065d7775758beb044ee23a71875571f" title="string containing values of block">value_str</a>,
<a name="l01215"></a>01215 reader-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a>,
<a name="l01216"></a>01216 realign_reader.<a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a> - reader-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a>);
<a name="l01217"></a>01217 <span class="preprocessor">#endif</span>
<a name="l01218"></a>01218 <span class="preprocessor"></span>
<a name="l01219"></a>01219 <span class="comment">/* Move the replacement into position</span>
<a name="l01220"></a>01220 <span class="comment"> * (realign_reader should now be at the end of the block to be replaced)</span>
<a name="l01221"></a>01221 <span class="comment"> */</span>
<a name="l01222"></a>01222 <span class="keywordflow">if</span> (!<a class="code" href="group__DBusString.html#gafe7921a92467cdefaa0a7829d6cf260b" title="Replaces a segment of dest string with a segment of source string.">_dbus_string_replace_len</a> (&block-><a class="code" href="structReplacementBlock.html#a562018cd2a0870abe3897b289bdd8488" title="Marshaled value including alignment padding.">replacement</a>, block-><a class="code" href="structReplacementBlock.html#a2aa3220ac139545f4fa2ddec2c36d5de" title="How much of the replacement block is padding.">padding</a>,
<a name="l01223"></a>01223 <a class="code" href="group__DBusString.html#gaa5136e6fd2c5188f4b88de7863369c6d" title="Gets the length of a string (not including nul termination).">_dbus_string_get_length</a> (&block-><a class="code" href="structReplacementBlock.html#a562018cd2a0870abe3897b289bdd8488" title="Marshaled value including alignment padding.">replacement</a>) - block-><a class="code" href="structReplacementBlock.html#a2aa3220ac139545f4fa2ddec2c36d5de" title="How much of the replacement block is padding.">padding</a>,
<a name="l01224"></a>01224 (<a class="code" href="structDBusString.html">DBusString</a>*) reader-><a class="code" href="structDBusTypeReader.html#a4065d7775758beb044ee23a71875571f" title="string containing values of block">value_str</a>,
<a name="l01225"></a>01225 reader-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a>,
<a name="l01226"></a>01226 realign_reader.<a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a> - reader-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a>))
<a name="l01227"></a>01227 <span class="keywordflow">goto</span> oom;
<a name="l01228"></a>01228
<a name="l01229"></a>01229 <span class="comment">/* Process our fixups now that we can't have an OOM error */</span>
<a name="l01230"></a>01230 apply_and_free_fixups (&fixups, reader);
<a name="l01231"></a>01231
<a name="l01232"></a>01232 <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#gaa8cecfc5c5c054d2875c03e77b7be15d" title="Expands to "1".">TRUE</a>;
<a name="l01233"></a>01233
<a name="l01234"></a>01234 oom:
<a name="l01235"></a>01235 <a class="code" href="group__DBusString.html#ga08c423b93c28dd746dcb93e0461ab95c" title="Sets the length of a string.">_dbus_string_set_length</a> (&block-><a class="code" href="structReplacementBlock.html#a562018cd2a0870abe3897b289bdd8488" title="Marshaled value including alignment padding.">replacement</a>, orig_len);
<a name="l01236"></a>01236 free_fixups (&fixups);
<a name="l01237"></a>01237 <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#gaa93f0eb578d23995850d61f7d61c55c1" title="Expands to "0".">FALSE</a>;
<a name="l01238"></a>01238 }
<a name="l01239"></a>01239
<a name="l01240"></a>01240 <span class="keyword">static</span> <span class="keywordtype">void</span>
<a name="l01241"></a>01241 replacement_block_free (<a class="code" href="structReplacementBlock.html">ReplacementBlock</a> *block)
<a name="l01242"></a>01242 {
<a name="l01243"></a>01243 <a class="code" href="group__DBusString.html#ga781ca91acda49a834dce7d0ed0eef212" title="Frees a string created by _dbus_string_init().">_dbus_string_free</a> (&block-><a class="code" href="structReplacementBlock.html#a562018cd2a0870abe3897b289bdd8488" title="Marshaled value including alignment padding.">replacement</a>);
<a name="l01244"></a>01244 }
<a name="l01245"></a>01245
<a name="l01246"></a>01246 <span class="comment">/* In the variable-length case, we have to fix alignment after we insert.</span>
<a name="l01247"></a>01247 <span class="comment"> * The strategy is as follows:</span>
<a name="l01248"></a>01248 <span class="comment"> *</span>
<a name="l01249"></a>01249 <span class="comment"> * - pad a new string to have the same alignment as the</span>
<a name="l01250"></a>01250 <span class="comment"> * start of the current basic value</span>
<a name="l01251"></a>01251 <span class="comment"> * - write the new basic value</span>
<a name="l01252"></a>01252 <span class="comment"> * - copy from the original reader to the new string,</span>
<a name="l01253"></a>01253 <span class="comment"> * which will fix the alignment of types following</span>
<a name="l01254"></a>01254 <span class="comment"> * the new value</span>
<a name="l01255"></a>01255 <span class="comment"> * - this copy has to start at realign_root,</span>
<a name="l01256"></a>01256 <span class="comment"> * but not really write anything until it</span>
<a name="l01257"></a>01257 <span class="comment"> * passes the value being set</span>
<a name="l01258"></a>01258 <span class="comment"> * - as an optimization, we can stop copying</span>
<a name="l01259"></a>01259 <span class="comment"> * when the source and dest values are both</span>
<a name="l01260"></a>01260 <span class="comment"> * on an 8-boundary, since we know all following</span>
<a name="l01261"></a>01261 <span class="comment"> * padding and alignment will be identical</span>
<a name="l01262"></a>01262 <span class="comment"> * - copy the new string back to the original</span>
<a name="l01263"></a>01263 <span class="comment"> * string, replacing the relevant part of the</span>
<a name="l01264"></a>01264 <span class="comment"> * original string</span>
<a name="l01265"></a>01265 <span class="comment"> * - now any arrays in the original string that</span>
<a name="l01266"></a>01266 <span class="comment"> * contained the replaced string may have the</span>
<a name="l01267"></a>01267 <span class="comment"> * wrong length; so we have to fix that</span>
<a name="l01268"></a>01268 <span class="comment"> */</span>
<a name="l01269"></a>01269 <span class="keyword">static</span> <a class="code" href="group__DBusTypes.html#ga39c9cb0f3a2a8ad6f55cc4855d035349" title="A boolean, valid values are TRUE and FALSE.">dbus_bool_t</a>
<a name="l01270"></a>01270 reader_set_basic_variable_length (<a class="code" href="structDBusTypeReader.html" title="The type reader is an iterator for reading values from a block of values.">DBusTypeReader</a> *reader,
<a name="l01271"></a>01271 <span class="keywordtype">int</span> current_type,
<a name="l01272"></a>01272 <span class="keyword">const</span> <span class="keywordtype">void</span> *value,
<a name="l01273"></a>01273 <span class="keyword">const</span> <a class="code" href="structDBusTypeReader.html" title="The type reader is an iterator for reading values from a block of values.">DBusTypeReader</a> *realign_root)
<a name="l01274"></a>01274 {
<a name="l01275"></a>01275 <a class="code" href="group__DBusTypes.html#ga39c9cb0f3a2a8ad6f55cc4855d035349" title="A boolean, valid values are TRUE and FALSE.">dbus_bool_t</a> retval;
<a name="l01276"></a>01276 <a class="code" href="structReplacementBlock.html">ReplacementBlock</a> block;
<a name="l01277"></a>01277 <a class="code" href="structDBusTypeWriter.html" title="The type writer is an iterator for writing to a block of values.">DBusTypeWriter</a> writer;
<a name="l01278"></a>01278
<a name="l01279"></a>01279 _dbus_assert (realign_root != <a class="code" href="group__DBusMacros.html#ga070d2ce7b6bb7e5c05602aa8c308d0c4" title="A null pointer, defined appropriately for C or C++.">NULL</a>);
<a name="l01280"></a>01280
<a name="l01281"></a>01281 retval = <a class="code" href="group__DBusMacros.html#gaa93f0eb578d23995850d61f7d61c55c1" title="Expands to "0".">FALSE</a>;
<a name="l01282"></a>01282
<a name="l01283"></a>01283 <span class="keywordflow">if</span> (!replacement_block_init (&block, reader))
<a name="l01284"></a>01284 <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#gaa93f0eb578d23995850d61f7d61c55c1" title="Expands to "0".">FALSE</a>;
<a name="l01285"></a>01285
<a name="l01286"></a>01286 <span class="comment">/* Write the new basic value */</span>
<a name="l01287"></a>01287 <span class="preprocessor">#if RECURSIVE_MARSHAL_WRITE_TRACE</span>
<a name="l01288"></a>01288 <span class="preprocessor"></span> _dbus_verbose (<span class="stringliteral">"INITIALIZING writer %p to write basic value at value_pos %d of replacement string\n"</span>,
<a name="l01289"></a>01289 &writer, <a class="code" href="group__DBusString.html#gaa5136e6fd2c5188f4b88de7863369c6d" title="Gets the length of a string (not including nul termination).">_dbus_string_get_length</a> (&block.<a class="code" href="structReplacementBlock.html#a562018cd2a0870abe3897b289bdd8488" title="Marshaled value including alignment padding.">replacement</a>));
<a name="l01290"></a>01290 <span class="preprocessor">#endif</span>
<a name="l01291"></a>01291 <span class="preprocessor"></span> <a class="code" href="group__DBusMarshal.html#ga1f101175ce6f33221fcb59f0b46349bd" title="Like _dbus_type_writer_init(), except the type string passed in should correspond to an existing sign...">_dbus_type_writer_init_values_only</a> (&writer,
<a name="l01292"></a>01292 reader-><a class="code" href="structDBusTypeReader.html#aeb0846d954066f420e1df98b81148702" title="byte order of the block">byte_order</a>,
<a name="l01293"></a>01293 reader-><a class="code" href="structDBusTypeReader.html#af52e270ededd0aabb642c6130a3e9e40" title="string containing signature of block">type_str</a>,
<a name="l01294"></a>01294 reader-><a class="code" href="structDBusTypeReader.html#a160a55f9869e297572c5aa5b6ce7bc71" title="current position in signature">type_pos</a>,
<a name="l01295"></a>01295 &block.<a class="code" href="structReplacementBlock.html#a562018cd2a0870abe3897b289bdd8488" title="Marshaled value including alignment padding.">replacement</a>,
<a name="l01296"></a>01296 <a class="code" href="group__DBusString.html#gaa5136e6fd2c5188f4b88de7863369c6d" title="Gets the length of a string (not including nul termination).">_dbus_string_get_length</a> (&block.<a class="code" href="structReplacementBlock.html#a562018cd2a0870abe3897b289bdd8488" title="Marshaled value including alignment padding.">replacement</a>));
<a name="l01297"></a>01297 <span class="preprocessor">#if RECURSIVE_MARSHAL_WRITE_TRACE</span>
<a name="l01298"></a>01298 <span class="preprocessor"></span> _dbus_verbose (<span class="stringliteral">"WRITING basic value to writer %p (replacement string)\n"</span>, &writer);
<a name="l01299"></a>01299 <span class="preprocessor">#endif</span>
<a name="l01300"></a>01300 <span class="preprocessor"></span> <span class="keywordflow">if</span> (!<a class="code" href="group__DBusMarshal.html#ga0103b0214766b0ff1ca05bcc7f1e631b" title="Writes out a basic type.">_dbus_type_writer_write_basic</a> (&writer, current_type, value))
<a name="l01301"></a>01301 <span class="keywordflow">goto</span> out;
<a name="l01302"></a>01302
<a name="l01303"></a>01303 <span class="keywordflow">if</span> (!replacement_block_replace (&block,
<a name="l01304"></a>01304 reader,
<a name="l01305"></a>01305 realign_root))
<a name="l01306"></a>01306 <span class="keywordflow">goto</span> out;
<a name="l01307"></a>01307
<a name="l01308"></a>01308 retval = <a class="code" href="group__DBusMacros.html#gaa8cecfc5c5c054d2875c03e77b7be15d" title="Expands to "1".">TRUE</a>;
<a name="l01309"></a>01309
<a name="l01310"></a>01310 out:
<a name="l01311"></a>01311 replacement_block_free (&block);
<a name="l01312"></a>01312 <span class="keywordflow">return</span> retval;
<a name="l01313"></a>01313 }
<a name="l01314"></a>01314
<a name="l01315"></a>01315 <span class="keyword">static</span> <span class="keywordtype">void</span>
<a name="l01316"></a>01316 reader_set_basic_fixed_length (<a class="code" href="structDBusTypeReader.html" title="The type reader is an iterator for reading values from a block of values.">DBusTypeReader</a> *reader,
<a name="l01317"></a>01317 <span class="keywordtype">int</span> current_type,
<a name="l01318"></a>01318 <span class="keyword">const</span> <span class="keywordtype">void</span> *value)
<a name="l01319"></a>01319 {
<a name="l01320"></a>01320 <a class="code" href="group__DBusMarshal.html#ga854526bdf221a5e82b2e14581ac17d8f" title="Sets an existing basic type value to a new value.">_dbus_marshal_set_basic</a> ((<a class="code" href="structDBusString.html">DBusString</a>*) reader-><a class="code" href="structDBusTypeReader.html#a4065d7775758beb044ee23a71875571f" title="string containing values of block">value_str</a>,
<a name="l01321"></a>01321 reader-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a>,
<a name="l01322"></a>01322 current_type,
<a name="l01323"></a>01323 value,
<a name="l01324"></a>01324 reader-><a class="code" href="structDBusTypeReader.html#aeb0846d954066f420e1df98b81148702" title="byte order of the block">byte_order</a>,
<a name="l01325"></a>01325 <a class="code" href="group__DBusMacros.html#ga070d2ce7b6bb7e5c05602aa8c308d0c4" title="A null pointer, defined appropriately for C or C++.">NULL</a>, <a class="code" href="group__DBusMacros.html#ga070d2ce7b6bb7e5c05602aa8c308d0c4" title="A null pointer, defined appropriately for C or C++.">NULL</a>);
<a name="l01326"></a>01326 }
<a name="l01327"></a>01327
<a name="l01362"></a>01362 <a class="code" href="group__DBusTypes.html#ga39c9cb0f3a2a8ad6f55cc4855d035349" title="A boolean, valid values are TRUE and FALSE.">dbus_bool_t</a>
<a name="l01363"></a><a class="code" href="group__DBusMarshal.html#gaaf11ca429434c2c280f5fad34ed95204">01363</a> <a class="code" href="group__DBusMarshal.html#gaaf11ca429434c2c280f5fad34ed95204" title="Sets a new value for the basic type value pointed to by the reader, leaving the reader valid to conti...">_dbus_type_reader_set_basic</a> (<a class="code" href="structDBusTypeReader.html" title="The type reader is an iterator for reading values from a block of values.">DBusTypeReader</a> *reader,
<a name="l01364"></a>01364 <span class="keyword">const</span> <span class="keywordtype">void</span> *value,
<a name="l01365"></a>01365 <span class="keyword">const</span> <a class="code" href="structDBusTypeReader.html" title="The type reader is an iterator for reading values from a block of values.">DBusTypeReader</a> *realign_root)
<a name="l01366"></a>01366 {
<a name="l01367"></a>01367 <span class="keywordtype">int</span> current_type;
<a name="l01368"></a>01368
<a name="l01369"></a>01369 _dbus_assert (!reader-><a class="code" href="structDBusTypeReader.html#a238bd0d5a30d8f59fd9b71c95af25563" title="the vtable for the reader">klass</a>-><a class="code" href="structDBusTypeReaderClass.html#ad886037cd736e6f5cdbefb834b0bd5e7" title="only iterates over types, not values">types_only</a>);
<a name="l01370"></a>01370 _dbus_assert (reader-><a class="code" href="structDBusTypeReader.html#a4065d7775758beb044ee23a71875571f" title="string containing values of block">value_str</a> == realign_root-><a class="code" href="structDBusTypeReader.html#a4065d7775758beb044ee23a71875571f" title="string containing values of block">value_str</a>);
<a name="l01371"></a>01371 _dbus_assert (reader-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a> >= realign_root-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a>);
<a name="l01372"></a>01372
<a name="l01373"></a>01373 current_type = <a class="code" href="group__DBusMarshal.html#gab8e39cb8084247d54d7f272c51622a73" title="Gets the type of the value the reader is currently pointing to; or for a types-only reader gets the t...">_dbus_type_reader_get_current_type</a> (reader);
<a name="l01374"></a>01374
<a name="l01375"></a>01375 <span class="preprocessor">#if RECURSIVE_MARSHAL_WRITE_TRACE</span>
<a name="l01376"></a>01376 <span class="preprocessor"></span> _dbus_verbose (<span class="stringliteral">" SET BASIC type reader %p type_pos = %d value_pos = %d remaining sig '%s' realign_root = %p with value_pos %d current_type = %s\n"</span>,
<a name="l01377"></a>01377 reader, reader-><a class="code" href="structDBusTypeReader.html#a160a55f9869e297572c5aa5b6ce7bc71" title="current position in signature">type_pos</a>, reader-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a>,
<a name="l01378"></a>01378 <a class="code" href="group__DBusString.html#ga8c202a65e938f9bdb859fc6705a4f1bb" title="const version of _dbus_string_get_data_len().">_dbus_string_get_const_data_len</a> (reader-><a class="code" href="structDBusTypeReader.html#af52e270ededd0aabb642c6130a3e9e40" title="string containing signature of block">type_str</a>, reader-><a class="code" href="structDBusTypeReader.html#a160a55f9869e297572c5aa5b6ce7bc71" title="current position in signature">type_pos</a>, 0),
<a name="l01379"></a>01379 realign_root,
<a name="l01380"></a>01380 realign_root ? realign_root-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a> : -1,
<a name="l01381"></a>01381 <a class="code" href="group__DBusMarshal.html#ga48a595c2b26dce6e9c25ce040e5247e5" title="Returns a string describing the given type.">_dbus_type_to_string</a> (current_type));
<a name="l01382"></a>01382 <a class="code" href="group__DBusMarshal.html#ga3926bb35edf78d114cf0c341fe3258e0" title="Dump the given part of the string to verbose log.">_dbus_verbose_bytes_of_string</a> (realign_root-><a class="code" href="structDBusTypeReader.html#a4065d7775758beb044ee23a71875571f" title="string containing values of block">value_str</a>, realign_root-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a>,
<a name="l01383"></a>01383 <a class="code" href="group__DBusString.html#gaa5136e6fd2c5188f4b88de7863369c6d" title="Gets the length of a string (not including nul termination).">_dbus_string_get_length</a> (realign_root-><a class="code" href="structDBusTypeReader.html#a4065d7775758beb044ee23a71875571f" title="string containing values of block">value_str</a>) -
<a name="l01384"></a>01384 realign_root-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a>);
<a name="l01385"></a>01385 <span class="preprocessor">#endif</span>
<a name="l01386"></a>01386 <span class="preprocessor"></span>
<a name="l01387"></a>01387 _dbus_assert (<a class="code" href="group__DBusSignature.html#ga2d8afef7d754cf15d6b9733f00654c0e" title="A "basic type" is a somewhat arbitrary concept, but the intent is to include those types that are ful...">dbus_type_is_basic</a> (current_type));
<a name="l01388"></a>01388
<a name="l01389"></a>01389 <span class="keywordflow">if</span> (<a class="code" href="group__DBusSignature.html#ga2f89962cbd33e4ad843824157bae2093" title="Tells you whether values of this type can change length if you set them to some other value...">dbus_type_is_fixed</a> (current_type))
<a name="l01390"></a>01390 {
<a name="l01391"></a>01391 reader_set_basic_fixed_length (reader, current_type, value);
<a name="l01392"></a>01392 <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#gaa8cecfc5c5c054d2875c03e77b7be15d" title="Expands to "1".">TRUE</a>;
<a name="l01393"></a>01393 }
<a name="l01394"></a>01394 <span class="keywordflow">else</span>
<a name="l01395"></a>01395 {
<a name="l01396"></a>01396 _dbus_assert (realign_root != <a class="code" href="group__DBusMacros.html#ga070d2ce7b6bb7e5c05602aa8c308d0c4" title="A null pointer, defined appropriately for C or C++.">NULL</a>);
<a name="l01397"></a>01397 <span class="keywordflow">return</span> reader_set_basic_variable_length (reader, current_type,
<a name="l01398"></a>01398 value, realign_root);
<a name="l01399"></a>01399 }
<a name="l01400"></a>01400 }
<a name="l01401"></a>01401
<a name="l01419"></a>01419 <a class="code" href="group__DBusTypes.html#ga39c9cb0f3a2a8ad6f55cc4855d035349" title="A boolean, valid values are TRUE and FALSE.">dbus_bool_t</a>
<a name="l01420"></a><a class="code" href="group__DBusMarshal.html#gaa4057610b3d9e81fed212c17f6599516">01420</a> <a class="code" href="group__DBusMarshal.html#gaa4057610b3d9e81fed212c17f6599516" title="Recursively deletes any value pointed to by the reader, leaving the reader valid to continue reading...">_dbus_type_reader_delete</a> (<a class="code" href="structDBusTypeReader.html" title="The type reader is an iterator for reading values from a block of values.">DBusTypeReader</a> *reader,
<a name="l01421"></a>01421 <span class="keyword">const</span> <a class="code" href="structDBusTypeReader.html" title="The type reader is an iterator for reading values from a block of values.">DBusTypeReader</a> *realign_root)
<a name="l01422"></a>01422 {
<a name="l01423"></a>01423 <a class="code" href="group__DBusTypes.html#ga39c9cb0f3a2a8ad6f55cc4855d035349" title="A boolean, valid values are TRUE and FALSE.">dbus_bool_t</a> retval;
<a name="l01424"></a>01424 <a class="code" href="structReplacementBlock.html">ReplacementBlock</a> block;
<a name="l01425"></a>01425
<a name="l01426"></a>01426 _dbus_assert (realign_root != <a class="code" href="group__DBusMacros.html#ga070d2ce7b6bb7e5c05602aa8c308d0c4" title="A null pointer, defined appropriately for C or C++.">NULL</a>);
<a name="l01427"></a>01427 _dbus_assert (reader-><a class="code" href="structDBusTypeReader.html#a238bd0d5a30d8f59fd9b71c95af25563" title="the vtable for the reader">klass</a> == &array_reader_class);
<a name="l01428"></a>01428
<a name="l01429"></a>01429 retval = <a class="code" href="group__DBusMacros.html#gaa93f0eb578d23995850d61f7d61c55c1" title="Expands to "0".">FALSE</a>;
<a name="l01430"></a>01430
<a name="l01431"></a>01431 <span class="keywordflow">if</span> (!replacement_block_init (&block, reader))
<a name="l01432"></a>01432 <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#gaa93f0eb578d23995850d61f7d61c55c1" title="Expands to "0".">FALSE</a>;
<a name="l01433"></a>01433
<a name="l01434"></a>01434 <span class="keywordflow">if</span> (!replacement_block_replace (&block,
<a name="l01435"></a>01435 reader,
<a name="l01436"></a>01436 realign_root))
<a name="l01437"></a>01437 <span class="keywordflow">goto</span> out;
<a name="l01438"></a>01438
<a name="l01439"></a>01439 retval = <a class="code" href="group__DBusMacros.html#gaa8cecfc5c5c054d2875c03e77b7be15d" title="Expands to "1".">TRUE</a>;
<a name="l01440"></a>01440
<a name="l01441"></a>01441 out:
<a name="l01442"></a>01442 replacement_block_free (&block);
<a name="l01443"></a>01443 <span class="keywordflow">return</span> retval;
<a name="l01444"></a>01444 }
<a name="l01445"></a>01445
<a name="l01446"></a>01446 <span class="comment">/*</span>
<a name="l01447"></a>01447 <span class="comment"> * Compares two readers, which must be iterating over the same value data.</span>
<a name="l01448"></a>01448 <span class="comment"> * Returns #TRUE if the first parameter is further along than the second parameter.</span>
<a name="l01449"></a>01449 <span class="comment"> *</span>
<a name="l01450"></a>01450 <span class="comment"> * @param lhs left-hand-side (first) parameter</span>
<a name="l01451"></a>01451 <span class="comment"> * @param rhs left-hand-side (first) parameter</span>
<a name="l01452"></a>01452 <span class="comment"> * @returns whether lhs is greater than rhs</span>
<a name="l01453"></a>01453 <span class="comment"> */</span>
<a name="l01454"></a>01454 <span class="keyword">static</span> <a class="code" href="group__DBusTypes.html#ga39c9cb0f3a2a8ad6f55cc4855d035349" title="A boolean, valid values are TRUE and FALSE.">dbus_bool_t</a>
<a name="l01455"></a>01455 _dbus_type_reader_greater_than (<span class="keyword">const</span> <a class="code" href="structDBusTypeReader.html" title="The type reader is an iterator for reading values from a block of values.">DBusTypeReader</a> *lhs,
<a name="l01456"></a>01456 <span class="keyword">const</span> <a class="code" href="structDBusTypeReader.html" title="The type reader is an iterator for reading values from a block of values.">DBusTypeReader</a> *rhs)
<a name="l01457"></a>01457 {
<a name="l01458"></a>01458 _dbus_assert (lhs-><a class="code" href="structDBusTypeReader.html#a4065d7775758beb044ee23a71875571f" title="string containing values of block">value_str</a> == rhs-><a class="code" href="structDBusTypeReader.html#a4065d7775758beb044ee23a71875571f" title="string containing values of block">value_str</a>);
<a name="l01459"></a>01459
<a name="l01460"></a>01460 <span class="keywordflow">return</span> lhs-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a> > rhs-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a>;
<a name="l01461"></a>01461 }
<a name="l01462"></a>01462
<a name="l01463"></a>01463 <span class="comment">/*</span>
<a name="l01464"></a>01464 <span class="comment"> *</span>
<a name="l01465"></a>01465 <span class="comment"> *</span>
<a name="l01466"></a>01466 <span class="comment"> * DBusTypeWriter</span>
<a name="l01467"></a>01467 <span class="comment"> *</span>
<a name="l01468"></a>01468 <span class="comment"> *</span>
<a name="l01469"></a>01469 <span class="comment"> *</span>
<a name="l01470"></a>01470 <span class="comment"> */</span>
<a name="l01471"></a>01471
<a name="l01492"></a>01492 <span class="keywordtype">void</span>
<a name="l01493"></a><a class="code" href="group__DBusMarshal.html#gadeb83962df31e074874e957d17a0d4d1">01493</a> <a class="code" href="group__DBusMarshal.html#gadeb83962df31e074874e957d17a0d4d1" title="Initialize a write iterator, which is used to write out values in serialized D-Bus format...">_dbus_type_writer_init</a> (<a class="code" href="structDBusTypeWriter.html" title="The type writer is an iterator for writing to a block of values.">DBusTypeWriter</a> *writer,
<a name="l01494"></a>01494 <span class="keywordtype">int</span> byte_order,
<a name="l01495"></a>01495 <a class="code" href="structDBusString.html">DBusString</a> *type_str,
<a name="l01496"></a>01496 <span class="keywordtype">int</span> type_pos,
<a name="l01497"></a>01497 <a class="code" href="structDBusString.html">DBusString</a> *value_str,
<a name="l01498"></a>01498 <span class="keywordtype">int</span> value_pos)
<a name="l01499"></a>01499 {
<a name="l01500"></a>01500 writer-><a class="code" href="structDBusTypeWriter.html#a6c4baf0b7148cf3f76924b654dada148" title="byte order to write values with">byte_order</a> = byte_order;
<a name="l01501"></a>01501 writer-><a class="code" href="structDBusTypeWriter.html#a95204ef3a9cf29ee31687032b142b836" title="where to write typecodes (or read type expectations)">type_str</a> = type_str;
<a name="l01502"></a>01502 writer-><a class="code" href="structDBusTypeWriter.html#a77c19debc0427372f368cfe7188951f8" title="current pos in type_str">type_pos</a> = type_pos;
<a name="l01503"></a>01503 writer-><a class="code" href="structDBusTypeWriter.html#aa4e4b3af31fd7a93d0e54d10882bcc07" title="where to write values">value_str</a> = value_str;
<a name="l01504"></a>01504 writer-><a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a> = value_pos;
<a name="l01505"></a>01505 writer-><a class="code" href="structDBusTypeWriter.html#ad0953035070c7c7d21b044b7b2f0f491" title="what are we inside? (e.g.">container_type</a> = <a class="code" href="group__DBusProtocol.html#gaa9588da889743b2119dc6664712ae51e" title="Type code that is never equal to a legitimate type code.">DBUS_TYPE_INVALID</a>;
<a name="l01506"></a>01506 writer-><a class="code" href="structDBusTypeWriter.html#ae6db89e9a3adcd52678dc089810cfb0b" title="type_pos can be either an insertion point for or an expected next type">type_pos_is_expectation</a> = <a class="code" href="group__DBusMacros.html#gaa93f0eb578d23995850d61f7d61c55c1" title="Expands to "0".">FALSE</a>;
<a name="l01507"></a>01507 writer-><a class="code" href="structDBusTypeWriter.html#a52c8617918c108d36b947cbdfc99c6ea" title="whether to write values">enabled</a> = <a class="code" href="group__DBusMacros.html#gaa8cecfc5c5c054d2875c03e77b7be15d" title="Expands to "1".">TRUE</a>;
<a name="l01508"></a>01508
<a name="l01509"></a>01509 <span class="preprocessor">#if RECURSIVE_MARSHAL_WRITE_TRACE</span>
<a name="l01510"></a>01510 <span class="preprocessor"></span> _dbus_verbose (<span class="stringliteral">"writer %p init remaining sig '%s'\n"</span>, writer,
<a name="l01511"></a>01511 writer-><a class="code" href="structDBusTypeWriter.html#a95204ef3a9cf29ee31687032b142b836" title="where to write typecodes (or read type expectations)">type_str</a> ?
<a name="l01512"></a>01512 <a class="code" href="group__DBusString.html#ga8c202a65e938f9bdb859fc6705a4f1bb" title="const version of _dbus_string_get_data_len().">_dbus_string_get_const_data_len</a> (writer-><a class="code" href="structDBusTypeWriter.html#a95204ef3a9cf29ee31687032b142b836" title="where to write typecodes (or read type expectations)">type_str</a>, writer-><a class="code" href="structDBusTypeWriter.html#a77c19debc0427372f368cfe7188951f8" title="current pos in type_str">type_pos</a>, 0) :
<a name="l01513"></a>01513 <span class="stringliteral">"unknown"</span>);
<a name="l01514"></a>01514 <span class="preprocessor">#endif</span>
<a name="l01515"></a>01515 <span class="preprocessor"></span>}
<a name="l01516"></a>01516
<a name="l01527"></a>01527 <span class="keywordtype">void</span>
<a name="l01528"></a><a class="code" href="group__DBusMarshal.html#gaa9ecf7e96d5323bc1da9cdf0c3f2c1e7">01528</a> <a class="code" href="group__DBusMarshal.html#gaa9ecf7e96d5323bc1da9cdf0c3f2c1e7" title="Initialize a write iterator, with the signature to be provided later.">_dbus_type_writer_init_types_delayed</a> (<a class="code" href="structDBusTypeWriter.html" title="The type writer is an iterator for writing to a block of values.">DBusTypeWriter</a> *writer,
<a name="l01529"></a>01529 <span class="keywordtype">int</span> byte_order,
<a name="l01530"></a>01530 <a class="code" href="structDBusString.html">DBusString</a> *value_str,
<a name="l01531"></a>01531 <span class="keywordtype">int</span> value_pos)
<a name="l01532"></a>01532 {
<a name="l01533"></a>01533 <a class="code" href="group__DBusMarshal.html#gadeb83962df31e074874e957d17a0d4d1" title="Initialize a write iterator, which is used to write out values in serialized D-Bus format...">_dbus_type_writer_init</a> (writer, byte_order,
<a name="l01534"></a>01534 <a class="code" href="group__DBusMacros.html#ga070d2ce7b6bb7e5c05602aa8c308d0c4" title="A null pointer, defined appropriately for C or C++.">NULL</a>, 0, value_str, value_pos);
<a name="l01535"></a>01535 }
<a name="l01536"></a>01536
<a name="l01545"></a>01545 <span class="keywordtype">void</span>
<a name="l01546"></a><a class="code" href="group__DBusMarshal.html#ga863b2f232a21582f9e6fe1951b09da91">01546</a> <a class="code" href="group__DBusMarshal.html#ga863b2f232a21582f9e6fe1951b09da91" title="Adds type string to the writer, if it had none.">_dbus_type_writer_add_types</a> (<a class="code" href="structDBusTypeWriter.html" title="The type writer is an iterator for writing to a block of values.">DBusTypeWriter</a> *writer,
<a name="l01547"></a>01547 <a class="code" href="structDBusString.html">DBusString</a> *type_str,
<a name="l01548"></a>01548 <span class="keywordtype">int</span> type_pos)
<a name="l01549"></a>01549 {
<a name="l01550"></a>01550 <span class="keywordflow">if</span> (writer-><a class="code" href="structDBusTypeWriter.html#a95204ef3a9cf29ee31687032b142b836" title="where to write typecodes (or read type expectations)">type_str</a> == <a class="code" href="group__DBusMacros.html#ga070d2ce7b6bb7e5c05602aa8c308d0c4" title="A null pointer, defined appropriately for C or C++.">NULL</a>) <span class="comment">/* keeps us from using this as setter */</span>
<a name="l01551"></a>01551 {
<a name="l01552"></a>01552 writer-><a class="code" href="structDBusTypeWriter.html#a95204ef3a9cf29ee31687032b142b836" title="where to write typecodes (or read type expectations)">type_str</a> = type_str;
<a name="l01553"></a>01553 writer-><a class="code" href="structDBusTypeWriter.html#a77c19debc0427372f368cfe7188951f8" title="current pos in type_str">type_pos</a> = type_pos;
<a name="l01554"></a>01554 }
<a name="l01555"></a>01555 }
<a name="l01556"></a>01556
<a name="l01562"></a>01562 <span class="keywordtype">void</span>
<a name="l01563"></a><a class="code" href="group__DBusMarshal.html#ga34d675b57c7e6569707d22ba76ae010c">01563</a> <a class="code" href="group__DBusMarshal.html#ga34d675b57c7e6569707d22ba76ae010c" title="Removes type string from the writer.">_dbus_type_writer_remove_types</a> (<a class="code" href="structDBusTypeWriter.html" title="The type writer is an iterator for writing to a block of values.">DBusTypeWriter</a> *writer)
<a name="l01564"></a>01564 {
<a name="l01565"></a>01565 writer-><a class="code" href="structDBusTypeWriter.html#a95204ef3a9cf29ee31687032b142b836" title="where to write typecodes (or read type expectations)">type_str</a> = <a class="code" href="group__DBusMacros.html#ga070d2ce7b6bb7e5c05602aa8c308d0c4" title="A null pointer, defined appropriately for C or C++.">NULL</a>;
<a name="l01566"></a>01566 writer-><a class="code" href="structDBusTypeWriter.html#a77c19debc0427372f368cfe7188951f8" title="current pos in type_str">type_pos</a> = -1;
<a name="l01567"></a>01567 }
<a name="l01568"></a>01568
<a name="l01583"></a>01583 <span class="keywordtype">void</span>
<a name="l01584"></a><a class="code" href="group__DBusMarshal.html#ga1f101175ce6f33221fcb59f0b46349bd">01584</a> <a class="code" href="group__DBusMarshal.html#ga1f101175ce6f33221fcb59f0b46349bd" title="Like _dbus_type_writer_init(), except the type string passed in should correspond to an existing sign...">_dbus_type_writer_init_values_only</a> (<a class="code" href="structDBusTypeWriter.html" title="The type writer is an iterator for writing to a block of values.">DBusTypeWriter</a> *writer,
<a name="l01585"></a>01585 <span class="keywordtype">int</span> byte_order,
<a name="l01586"></a>01586 <span class="keyword">const</span> <a class="code" href="structDBusString.html">DBusString</a> *type_str,
<a name="l01587"></a>01587 <span class="keywordtype">int</span> type_pos,
<a name="l01588"></a>01588 <a class="code" href="structDBusString.html">DBusString</a> *value_str,
<a name="l01589"></a>01589 <span class="keywordtype">int</span> value_pos)
<a name="l01590"></a>01590 {
<a name="l01591"></a>01591 <a class="code" href="group__DBusMarshal.html#gadeb83962df31e074874e957d17a0d4d1" title="Initialize a write iterator, which is used to write out values in serialized D-Bus format...">_dbus_type_writer_init</a> (writer, byte_order,
<a name="l01592"></a>01592 (<a class="code" href="structDBusString.html">DBusString</a>*)type_str, type_pos,
<a name="l01593"></a>01593 value_str, value_pos);
<a name="l01594"></a>01594
<a name="l01595"></a>01595 writer-><a class="code" href="structDBusTypeWriter.html#ae6db89e9a3adcd52678dc089810cfb0b" title="type_pos can be either an insertion point for or an expected next type">type_pos_is_expectation</a> = <a class="code" href="group__DBusMacros.html#gaa8cecfc5c5c054d2875c03e77b7be15d" title="Expands to "1".">TRUE</a>;
<a name="l01596"></a>01596 }
<a name="l01597"></a>01597
<a name="l01598"></a>01598 <span class="keyword">static</span> <a class="code" href="group__DBusTypes.html#ga39c9cb0f3a2a8ad6f55cc4855d035349" title="A boolean, valid values are TRUE and FALSE.">dbus_bool_t</a>
<a name="l01599"></a>01599 _dbus_type_writer_write_basic_no_typecode (<a class="code" href="structDBusTypeWriter.html" title="The type writer is an iterator for writing to a block of values.">DBusTypeWriter</a> *writer,
<a name="l01600"></a>01600 <span class="keywordtype">int</span> type,
<a name="l01601"></a>01601 <span class="keyword">const</span> <span class="keywordtype">void</span> *value)
<a name="l01602"></a>01602 {
<a name="l01603"></a>01603 <span class="keywordflow">if</span> (writer-><a class="code" href="structDBusTypeWriter.html#a52c8617918c108d36b947cbdfc99c6ea" title="whether to write values">enabled</a>)
<a name="l01604"></a>01604 <span class="keywordflow">return</span> <a class="code" href="group__DBusMarshal.html#ga54323d48921de8c5bd04ae01548312bb" title="Marshals a basic-typed value.">_dbus_marshal_write_basic</a> (writer-><a class="code" href="structDBusTypeWriter.html#aa4e4b3af31fd7a93d0e54d10882bcc07" title="where to write values">value_str</a>,
<a name="l01605"></a>01605 writer-><a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a>,
<a name="l01606"></a>01606 type,
<a name="l01607"></a>01607 value,
<a name="l01608"></a>01608 writer-><a class="code" href="structDBusTypeWriter.html#a6c4baf0b7148cf3f76924b654dada148" title="byte order to write values with">byte_order</a>,
<a name="l01609"></a>01609 &writer-><a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a>);
<a name="l01610"></a>01610 <span class="keywordflow">else</span>
<a name="l01611"></a>01611 <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#gaa8cecfc5c5c054d2875c03e77b7be15d" title="Expands to "1".">TRUE</a>;
<a name="l01612"></a>01612 }
<a name="l01613"></a>01613
<a name="l01614"></a>01614 <span class="comment">/* If our parent is an array, things are a little bit complicated.</span>
<a name="l01615"></a>01615 <span class="comment"> *</span>
<a name="l01616"></a>01616 <span class="comment"> * The parent must have a complete element type, such as</span>
<a name="l01617"></a>01617 <span class="comment"> * "i" or "aai" or "(ii)" or "a(ii)". There can't be</span>
<a name="l01618"></a>01618 <span class="comment"> * unclosed parens, or an "a" with no following type.</span>
<a name="l01619"></a>01619 <span class="comment"> *</span>
<a name="l01620"></a>01620 <span class="comment"> * To recurse, the only allowed operation is to recurse into the</span>
<a name="l01621"></a>01621 <span class="comment"> * first type in the element type. So for "i" you can't recurse, for</span>
<a name="l01622"></a>01622 <span class="comment"> * "ai" you can recurse into the array, for "(ii)" you can recurse</span>
<a name="l01623"></a>01623 <span class="comment"> * into the struct.</span>
<a name="l01624"></a>01624 <span class="comment"> *</span>
<a name="l01625"></a>01625 <span class="comment"> * If you recurse into the array for "ai", then you must specify</span>
<a name="l01626"></a>01626 <span class="comment"> * "i" for the element type of the array you recurse into.</span>
<a name="l01627"></a>01627 <span class="comment"> *</span>
<a name="l01628"></a>01628 <span class="comment"> * While inside an array at any level, we need to avoid writing to</span>
<a name="l01629"></a>01629 <span class="comment"> * type_str, since the type only appears once for the whole array,</span>
<a name="l01630"></a>01630 <span class="comment"> * it does not appear for each array element.</span>
<a name="l01631"></a>01631 <span class="comment"> *</span>
<a name="l01632"></a>01632 <span class="comment"> * While inside an array type_pos points to the expected next</span>
<a name="l01633"></a>01633 <span class="comment"> * typecode, rather than the next place we could write a typecode.</span>
<a name="l01634"></a>01634 <span class="comment"> */</span>
<a name="l01635"></a>01635 <span class="keyword">static</span> <span class="keywordtype">void</span>
<a name="l01636"></a>01636 writer_recurse_init_and_check (<a class="code" href="structDBusTypeWriter.html" title="The type writer is an iterator for writing to a block of values.">DBusTypeWriter</a> *writer,
<a name="l01637"></a>01637 <span class="keywordtype">int</span> container_type,
<a name="l01638"></a>01638 <a class="code" href="structDBusTypeWriter.html" title="The type writer is an iterator for writing to a block of values.">DBusTypeWriter</a> *sub)
<a name="l01639"></a>01639 {
<a name="l01640"></a>01640 <a class="code" href="group__DBusMarshal.html#gadeb83962df31e074874e957d17a0d4d1" title="Initialize a write iterator, which is used to write out values in serialized D-Bus format...">_dbus_type_writer_init</a> (sub,
<a name="l01641"></a>01641 writer-><a class="code" href="structDBusTypeWriter.html#a6c4baf0b7148cf3f76924b654dada148" title="byte order to write values with">byte_order</a>,
<a name="l01642"></a>01642 writer-><a class="code" href="structDBusTypeWriter.html#a95204ef3a9cf29ee31687032b142b836" title="where to write typecodes (or read type expectations)">type_str</a>,
<a name="l01643"></a>01643 writer-><a class="code" href="structDBusTypeWriter.html#a77c19debc0427372f368cfe7188951f8" title="current pos in type_str">type_pos</a>,
<a name="l01644"></a>01644 writer-><a class="code" href="structDBusTypeWriter.html#aa4e4b3af31fd7a93d0e54d10882bcc07" title="where to write values">value_str</a>,
<a name="l01645"></a>01645 writer-><a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a>);
<a name="l01646"></a>01646
<a name="l01647"></a>01647 sub-><a class="code" href="structDBusTypeWriter.html#ad0953035070c7c7d21b044b7b2f0f491" title="what are we inside? (e.g.">container_type</a> = container_type;
<a name="l01648"></a>01648
<a name="l01649"></a>01649 <span class="keywordflow">if</span> (writer-><a class="code" href="structDBusTypeWriter.html#ae6db89e9a3adcd52678dc089810cfb0b" title="type_pos can be either an insertion point for or an expected next type">type_pos_is_expectation</a> ||
<a name="l01650"></a>01650 (sub-><a class="code" href="structDBusTypeWriter.html#ad0953035070c7c7d21b044b7b2f0f491" title="what are we inside? (e.g.">container_type</a> == <a class="code" href="group__DBusProtocol.html#ga8912f600f81a773066ca03d9163613a9" title="Type code marking a D-Bus array type.">DBUS_TYPE_ARRAY</a> || sub-><a class="code" href="structDBusTypeWriter.html#ad0953035070c7c7d21b044b7b2f0f491" title="what are we inside? (e.g.">container_type</a> == <a class="code" href="group__DBusProtocol.html#ga4aa7a463ad2bce4e9aa95e3e397ddcf1" title="Type code marking a D-Bus variant type.">DBUS_TYPE_VARIANT</a>))
<a name="l01651"></a>01651 sub-><a class="code" href="structDBusTypeWriter.html#ae6db89e9a3adcd52678dc089810cfb0b" title="type_pos can be either an insertion point for or an expected next type">type_pos_is_expectation</a> = <a class="code" href="group__DBusMacros.html#gaa8cecfc5c5c054d2875c03e77b7be15d" title="Expands to "1".">TRUE</a>;
<a name="l01652"></a>01652 <span class="keywordflow">else</span>
<a name="l01653"></a>01653 sub-><a class="code" href="structDBusTypeWriter.html#ae6db89e9a3adcd52678dc089810cfb0b" title="type_pos can be either an insertion point for or an expected next type">type_pos_is_expectation</a> = <a class="code" href="group__DBusMacros.html#gaa93f0eb578d23995850d61f7d61c55c1" title="Expands to "0".">FALSE</a>;
<a name="l01654"></a>01654
<a name="l01655"></a>01655 sub-><a class="code" href="structDBusTypeWriter.html#a52c8617918c108d36b947cbdfc99c6ea" title="whether to write values">enabled</a> = writer-><a class="code" href="structDBusTypeWriter.html#a52c8617918c108d36b947cbdfc99c6ea" title="whether to write values">enabled</a>;
<a name="l01656"></a>01656
<a name="l01657"></a>01657 <span class="preprocessor">#ifndef DBUS_DISABLE_CHECKS</span>
<a name="l01658"></a>01658 <span class="preprocessor"></span> <span class="keywordflow">if</span> (writer-><a class="code" href="structDBusTypeWriter.html#ae6db89e9a3adcd52678dc089810cfb0b" title="type_pos can be either an insertion point for or an expected next type">type_pos_is_expectation</a> && writer-><a class="code" href="structDBusTypeWriter.html#a95204ef3a9cf29ee31687032b142b836" title="where to write typecodes (or read type expectations)">type_str</a>)
<a name="l01659"></a>01659 {
<a name="l01660"></a>01660 <span class="keywordtype">int</span> expected;
<a name="l01661"></a>01661
<a name="l01662"></a>01662 expected = <a class="code" href="group__DBusMarshal.html#ga5866a0fd058aed3396402d0456144fd2" title="Get the first type in the signature.">_dbus_first_type_in_signature</a> (writer-><a class="code" href="structDBusTypeWriter.html#a95204ef3a9cf29ee31687032b142b836" title="where to write typecodes (or read type expectations)">type_str</a>, writer-><a class="code" href="structDBusTypeWriter.html#a77c19debc0427372f368cfe7188951f8" title="current pos in type_str">type_pos</a>);
<a name="l01663"></a>01663
<a name="l01664"></a>01664 <span class="keywordflow">if</span> (expected != sub-><a class="code" href="structDBusTypeWriter.html#ad0953035070c7c7d21b044b7b2f0f491" title="what are we inside? (e.g.">container_type</a>)
<a name="l01665"></a>01665 {
<a name="l01666"></a>01666 <span class="keywordflow">if</span> (expected != <a class="code" href="group__DBusProtocol.html#gaa9588da889743b2119dc6664712ae51e" title="Type code that is never equal to a legitimate type code.">DBUS_TYPE_INVALID</a>)
<a name="l01667"></a>01667 <a class="code" href="group__DBusInternalsUtils.html#ga63f2f8a068454b781f214ba596e313b4" title="Prints a "critical" warning to stderr when an assertion fails; differs from _dbus_warn primarily in t...">_dbus_warn_check_failed</a> (<span class="stringliteral">"Writing an element of type %s, but the expected type here is %s\n"</span>
<a name="l01668"></a>01668 <span class="stringliteral">"The overall signature expected here was '%s' and we are on byte %d of that signature.\n"</span>,
<a name="l01669"></a>01669 <a class="code" href="group__DBusMarshal.html#ga48a595c2b26dce6e9c25ce040e5247e5" title="Returns a string describing the given type.">_dbus_type_to_string</a> (sub-><a class="code" href="structDBusTypeWriter.html#ad0953035070c7c7d21b044b7b2f0f491" title="what are we inside? (e.g.">container_type</a>),
<a name="l01670"></a>01670 <a class="code" href="group__DBusMarshal.html#ga48a595c2b26dce6e9c25ce040e5247e5" title="Returns a string describing the given type.">_dbus_type_to_string</a> (expected),
<a name="l01671"></a>01671 <a class="code" href="group__DBusString.html#ga33e20241ae7d784624f97d89b1a0539e" title="Gets the raw character buffer from a const string.">_dbus_string_get_const_data</a> (writer-><a class="code" href="structDBusTypeWriter.html#a95204ef3a9cf29ee31687032b142b836" title="where to write typecodes (or read type expectations)">type_str</a>), writer-><a class="code" href="structDBusTypeWriter.html#a77c19debc0427372f368cfe7188951f8" title="current pos in type_str">type_pos</a>);
<a name="l01672"></a>01672 <span class="keywordflow">else</span>
<a name="l01673"></a>01673 <a class="code" href="group__DBusInternalsUtils.html#ga63f2f8a068454b781f214ba596e313b4" title="Prints a "critical" warning to stderr when an assertion fails; differs from _dbus_warn primarily in t...">_dbus_warn_check_failed</a> (<span class="stringliteral">"Writing an element of type %s, but no value is expected here\n"</span>
<a name="l01674"></a>01674 <span class="stringliteral">"The overall signature expected here was '%s' and we are on byte %d of that signature.\n"</span>,
<a name="l01675"></a>01675 <a class="code" href="group__DBusMarshal.html#ga48a595c2b26dce6e9c25ce040e5247e5" title="Returns a string describing the given type.">_dbus_type_to_string</a> (sub-><a class="code" href="structDBusTypeWriter.html#ad0953035070c7c7d21b044b7b2f0f491" title="what are we inside? (e.g.">container_type</a>),
<a name="l01676"></a>01676 <a class="code" href="group__DBusString.html#ga33e20241ae7d784624f97d89b1a0539e" title="Gets the raw character buffer from a const string.">_dbus_string_get_const_data</a> (writer-><a class="code" href="structDBusTypeWriter.html#a95204ef3a9cf29ee31687032b142b836" title="where to write typecodes (or read type expectations)">type_str</a>), writer-><a class="code" href="structDBusTypeWriter.html#a77c19debc0427372f368cfe7188951f8" title="current pos in type_str">type_pos</a>);
<a name="l01677"></a>01677
<a name="l01678"></a>01678 _dbus_assert_not_reached (<span class="stringliteral">"bad array element or variant content written"</span>);
<a name="l01679"></a>01679 }
<a name="l01680"></a>01680 }
<a name="l01681"></a>01681 <span class="preprocessor">#endif </span><span class="comment">/* DBUS_DISABLE_CHECKS */</span>
<a name="l01682"></a>01682
<a name="l01683"></a>01683 <span class="preprocessor">#if RECURSIVE_MARSHAL_WRITE_TRACE</span>
<a name="l01684"></a>01684 <span class="preprocessor"></span> _dbus_verbose (<span class="stringliteral">" type writer %p recurse parent %s type_pos = %d value_pos = %d is_expectation = %d remaining sig '%s' enabled = %d\n"</span>,
<a name="l01685"></a>01685 writer,
<a name="l01686"></a>01686 <a class="code" href="group__DBusMarshal.html#ga48a595c2b26dce6e9c25ce040e5247e5" title="Returns a string describing the given type.">_dbus_type_to_string</a> (writer-><a class="code" href="structDBusTypeWriter.html#ad0953035070c7c7d21b044b7b2f0f491" title="what are we inside? (e.g.">container_type</a>),
<a name="l01687"></a>01687 writer-><a class="code" href="structDBusTypeWriter.html#a77c19debc0427372f368cfe7188951f8" title="current pos in type_str">type_pos</a>, writer-><a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a>, writer-><a class="code" href="structDBusTypeWriter.html#ae6db89e9a3adcd52678dc089810cfb0b" title="type_pos can be either an insertion point for or an expected next type">type_pos_is_expectation</a>,
<a name="l01688"></a>01688 writer-><a class="code" href="structDBusTypeWriter.html#a95204ef3a9cf29ee31687032b142b836" title="where to write typecodes (or read type expectations)">type_str</a> ?
<a name="l01689"></a>01689 <a class="code" href="group__DBusString.html#ga8c202a65e938f9bdb859fc6705a4f1bb" title="const version of _dbus_string_get_data_len().">_dbus_string_get_const_data_len</a> (writer-><a class="code" href="structDBusTypeWriter.html#a95204ef3a9cf29ee31687032b142b836" title="where to write typecodes (or read type expectations)">type_str</a>, writer-><a class="code" href="structDBusTypeWriter.html#a77c19debc0427372f368cfe7188951f8" title="current pos in type_str">type_pos</a>, 0) :
<a name="l01690"></a>01690 <span class="stringliteral">"unknown"</span>,
<a name="l01691"></a>01691 writer-><a class="code" href="structDBusTypeWriter.html#a52c8617918c108d36b947cbdfc99c6ea" title="whether to write values">enabled</a>);
<a name="l01692"></a>01692 _dbus_verbose (<span class="stringliteral">" type writer %p recurse sub %s type_pos = %d value_pos = %d is_expectation = %d enabled = %d\n"</span>,
<a name="l01693"></a>01693 sub,
<a name="l01694"></a>01694 <a class="code" href="group__DBusMarshal.html#ga48a595c2b26dce6e9c25ce040e5247e5" title="Returns a string describing the given type.">_dbus_type_to_string</a> (sub-><a class="code" href="structDBusTypeWriter.html#ad0953035070c7c7d21b044b7b2f0f491" title="what are we inside? (e.g.">container_type</a>),
<a name="l01695"></a>01695 sub-><a class="code" href="structDBusTypeWriter.html#a77c19debc0427372f368cfe7188951f8" title="current pos in type_str">type_pos</a>, sub-><a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a>,
<a name="l01696"></a>01696 sub-><a class="code" href="structDBusTypeWriter.html#ae6db89e9a3adcd52678dc089810cfb0b" title="type_pos can be either an insertion point for or an expected next type">type_pos_is_expectation</a>,
<a name="l01697"></a>01697 sub-><a class="code" href="structDBusTypeWriter.html#a52c8617918c108d36b947cbdfc99c6ea" title="whether to write values">enabled</a>);
<a name="l01698"></a>01698 <span class="preprocessor">#endif</span>
<a name="l01699"></a>01699 <span class="preprocessor"></span>}
<a name="l01700"></a>01700
<a name="l01701"></a>01701 <span class="keyword">static</span> <a class="code" href="group__DBusTypes.html#ga39c9cb0f3a2a8ad6f55cc4855d035349" title="A boolean, valid values are TRUE and FALSE.">dbus_bool_t</a>
<a name="l01702"></a>01702 write_or_verify_typecode (<a class="code" href="structDBusTypeWriter.html" title="The type writer is an iterator for writing to a block of values.">DBusTypeWriter</a> *writer,
<a name="l01703"></a>01703 <span class="keywordtype">int</span> typecode)
<a name="l01704"></a>01704 {
<a name="l01705"></a>01705 <span class="comment">/* A subwriter inside an array or variant will have type_pos</span>
<a name="l01706"></a>01706 <span class="comment"> * pointing to the expected typecode; a writer not inside an array</span>
<a name="l01707"></a>01707 <span class="comment"> * or variant has type_pos pointing to the next place to insert a</span>
<a name="l01708"></a>01708 <span class="comment"> * typecode.</span>
<a name="l01709"></a>01709 <span class="comment"> */</span>
<a name="l01710"></a>01710 <span class="preprocessor">#if RECURSIVE_MARSHAL_WRITE_TRACE</span>
<a name="l01711"></a>01711 <span class="preprocessor"></span> _dbus_verbose (<span class="stringliteral">" type writer %p write_or_verify start type_pos = %d remaining sig '%s' enabled = %d\n"</span>,
<a name="l01712"></a>01712 writer, writer-><a class="code" href="structDBusTypeWriter.html#a77c19debc0427372f368cfe7188951f8" title="current pos in type_str">type_pos</a>,
<a name="l01713"></a>01713 writer-><a class="code" href="structDBusTypeWriter.html#a95204ef3a9cf29ee31687032b142b836" title="where to write typecodes (or read type expectations)">type_str</a> ?
<a name="l01714"></a>01714 <a class="code" href="group__DBusString.html#ga8c202a65e938f9bdb859fc6705a4f1bb" title="const version of _dbus_string_get_data_len().">_dbus_string_get_const_data_len</a> (writer-><a class="code" href="structDBusTypeWriter.html#a95204ef3a9cf29ee31687032b142b836" title="where to write typecodes (or read type expectations)">type_str</a>, writer-><a class="code" href="structDBusTypeWriter.html#a77c19debc0427372f368cfe7188951f8" title="current pos in type_str">type_pos</a>, 0) :
<a name="l01715"></a>01715 <span class="stringliteral">"unknown"</span>,
<a name="l01716"></a>01716 writer-><a class="code" href="structDBusTypeWriter.html#a52c8617918c108d36b947cbdfc99c6ea" title="whether to write values">enabled</a>);
<a name="l01717"></a>01717 <span class="preprocessor">#endif</span>
<a name="l01718"></a>01718 <span class="preprocessor"></span>
<a name="l01719"></a>01719 <span class="keywordflow">if</span> (writer-><a class="code" href="structDBusTypeWriter.html#a95204ef3a9cf29ee31687032b142b836" title="where to write typecodes (or read type expectations)">type_str</a> == <a class="code" href="group__DBusMacros.html#ga070d2ce7b6bb7e5c05602aa8c308d0c4" title="A null pointer, defined appropriately for C or C++.">NULL</a>)
<a name="l01720"></a>01720 <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#gaa8cecfc5c5c054d2875c03e77b7be15d" title="Expands to "1".">TRUE</a>;
<a name="l01721"></a>01721
<a name="l01722"></a>01722 <span class="keywordflow">if</span> (writer-><a class="code" href="structDBusTypeWriter.html#ae6db89e9a3adcd52678dc089810cfb0b" title="type_pos can be either an insertion point for or an expected next type">type_pos_is_expectation</a>)
<a name="l01723"></a>01723 {
<a name="l01724"></a>01724 <span class="preprocessor">#ifndef DBUS_DISABLE_CHECKS</span>
<a name="l01725"></a>01725 <span class="preprocessor"></span> {
<a name="l01726"></a>01726 <span class="keywordtype">int</span> expected;
<a name="l01727"></a>01727
<a name="l01728"></a>01728 expected = <a class="code" href="group__DBusString.html#gac1cb7b207eac3c6527a5d42fbc5449b1" title="Gets the byte at the given position.">_dbus_string_get_byte</a> (writer-><a class="code" href="structDBusTypeWriter.html#a95204ef3a9cf29ee31687032b142b836" title="where to write typecodes (or read type expectations)">type_str</a>, writer-><a class="code" href="structDBusTypeWriter.html#a77c19debc0427372f368cfe7188951f8" title="current pos in type_str">type_pos</a>);
<a name="l01729"></a>01729
<a name="l01730"></a>01730 <span class="keywordflow">if</span> (expected != typecode)
<a name="l01731"></a>01731 {
<a name="l01732"></a>01732 <span class="keywordflow">if</span> (expected != <a class="code" href="group__DBusProtocol.html#gaa9588da889743b2119dc6664712ae51e" title="Type code that is never equal to a legitimate type code.">DBUS_TYPE_INVALID</a>)
<a name="l01733"></a>01733 <a class="code" href="group__DBusInternalsUtils.html#ga63f2f8a068454b781f214ba596e313b4" title="Prints a "critical" warning to stderr when an assertion fails; differs from _dbus_warn primarily in t...">_dbus_warn_check_failed</a> (<span class="stringliteral">"Array or variant type requires that type %s be written, but %s was written.\n"</span>
<a name="l01734"></a>01734 <span class="stringliteral">"The overall signature expected here was '%s' and we are on byte %d of that signature.\n"</span>,
<a name="l01735"></a>01735 <a class="code" href="group__DBusMarshal.html#ga48a595c2b26dce6e9c25ce040e5247e5" title="Returns a string describing the given type.">_dbus_type_to_string</a> (expected), <a class="code" href="group__DBusMarshal.html#ga48a595c2b26dce6e9c25ce040e5247e5" title="Returns a string describing the given type.">_dbus_type_to_string</a> (typecode),
<a name="l01736"></a>01736 <a class="code" href="group__DBusString.html#ga33e20241ae7d784624f97d89b1a0539e" title="Gets the raw character buffer from a const string.">_dbus_string_get_const_data</a> (writer-><a class="code" href="structDBusTypeWriter.html#a95204ef3a9cf29ee31687032b142b836" title="where to write typecodes (or read type expectations)">type_str</a>), writer-><a class="code" href="structDBusTypeWriter.html#a77c19debc0427372f368cfe7188951f8" title="current pos in type_str">type_pos</a>);
<a name="l01737"></a>01737 <span class="keywordflow">else</span>
<a name="l01738"></a>01738 <a class="code" href="group__DBusInternalsUtils.html#ga63f2f8a068454b781f214ba596e313b4" title="Prints a "critical" warning to stderr when an assertion fails; differs from _dbus_warn primarily in t...">_dbus_warn_check_failed</a> (<span class="stringliteral">"Array or variant type wasn't expecting any more values to be written into it, but a value %s was written.\n"</span>
<a name="l01739"></a>01739 <span class="stringliteral">"The overall signature expected here was '%s' and we are on byte %d of that signature.\n"</span>,
<a name="l01740"></a>01740 <a class="code" href="group__DBusMarshal.html#ga48a595c2b26dce6e9c25ce040e5247e5" title="Returns a string describing the given type.">_dbus_type_to_string</a> (typecode),
<a name="l01741"></a>01741 <a class="code" href="group__DBusString.html#ga33e20241ae7d784624f97d89b1a0539e" title="Gets the raw character buffer from a const string.">_dbus_string_get_const_data</a> (writer-><a class="code" href="structDBusTypeWriter.html#a95204ef3a9cf29ee31687032b142b836" title="where to write typecodes (or read type expectations)">type_str</a>), writer-><a class="code" href="structDBusTypeWriter.html#a77c19debc0427372f368cfe7188951f8" title="current pos in type_str">type_pos</a>);
<a name="l01742"></a>01742 _dbus_assert_not_reached (<span class="stringliteral">"bad type inserted somewhere inside an array or variant"</span>);
<a name="l01743"></a>01743 }
<a name="l01744"></a>01744 }
<a name="l01745"></a>01745 <span class="preprocessor">#endif </span><span class="comment">/* DBUS_DISABLE_CHECKS */</span>
<a name="l01746"></a>01746
<a name="l01747"></a>01747 <span class="comment">/* if immediately inside an array we'd always be appending an element,</span>
<a name="l01748"></a>01748 <span class="comment"> * so the expected type doesn't change; if inside a struct or something</span>
<a name="l01749"></a>01749 <span class="comment"> * below an array, we need to move through said struct or something.</span>
<a name="l01750"></a>01750 <span class="comment"> */</span>
<a name="l01751"></a>01751 <span class="keywordflow">if</span> (writer-><a class="code" href="structDBusTypeWriter.html#ad0953035070c7c7d21b044b7b2f0f491" title="what are we inside? (e.g.">container_type</a> != <a class="code" href="group__DBusProtocol.html#ga8912f600f81a773066ca03d9163613a9" title="Type code marking a D-Bus array type.">DBUS_TYPE_ARRAY</a>)
<a name="l01752"></a>01752 writer-><a class="code" href="structDBusTypeWriter.html#a77c19debc0427372f368cfe7188951f8" title="current pos in type_str">type_pos</a> += 1;
<a name="l01753"></a>01753 }
<a name="l01754"></a>01754 <span class="keywordflow">else</span>
<a name="l01755"></a>01755 {
<a name="l01756"></a>01756 <span class="keywordflow">if</span> (!<a class="code" href="group__DBusString.html#gab0770800dce6df97e5d246105a44e7b4" title="Inserts a single byte at the given position.">_dbus_string_insert_byte</a> (writer-><a class="code" href="structDBusTypeWriter.html#a95204ef3a9cf29ee31687032b142b836" title="where to write typecodes (or read type expectations)">type_str</a>,
<a name="l01757"></a>01757 writer-><a class="code" href="structDBusTypeWriter.html#a77c19debc0427372f368cfe7188951f8" title="current pos in type_str">type_pos</a>,
<a name="l01758"></a>01758 typecode))
<a name="l01759"></a>01759 <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#gaa93f0eb578d23995850d61f7d61c55c1" title="Expands to "0".">FALSE</a>;
<a name="l01760"></a>01760
<a name="l01761"></a>01761 writer-><a class="code" href="structDBusTypeWriter.html#a77c19debc0427372f368cfe7188951f8" title="current pos in type_str">type_pos</a> += 1;
<a name="l01762"></a>01762 }
<a name="l01763"></a>01763
<a name="l01764"></a>01764 <span class="preprocessor">#if RECURSIVE_MARSHAL_WRITE_TRACE</span>
<a name="l01765"></a>01765 <span class="preprocessor"></span> _dbus_verbose (<span class="stringliteral">" type writer %p write_or_verify end type_pos = %d remaining sig '%s'\n"</span>,
<a name="l01766"></a>01766 writer, writer-><a class="code" href="structDBusTypeWriter.html#a77c19debc0427372f368cfe7188951f8" title="current pos in type_str">type_pos</a>,
<a name="l01767"></a>01767 <a class="code" href="group__DBusString.html#ga8c202a65e938f9bdb859fc6705a4f1bb" title="const version of _dbus_string_get_data_len().">_dbus_string_get_const_data_len</a> (writer-><a class="code" href="structDBusTypeWriter.html#a95204ef3a9cf29ee31687032b142b836" title="where to write typecodes (or read type expectations)">type_str</a>, writer-><a class="code" href="structDBusTypeWriter.html#a77c19debc0427372f368cfe7188951f8" title="current pos in type_str">type_pos</a>, 0));
<a name="l01768"></a>01768 <span class="preprocessor">#endif</span>
<a name="l01769"></a>01769 <span class="preprocessor"></span>
<a name="l01770"></a>01770 <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#gaa8cecfc5c5c054d2875c03e77b7be15d" title="Expands to "1".">TRUE</a>;
<a name="l01771"></a>01771 }
<a name="l01772"></a>01772
<a name="l01773"></a>01773 <span class="keyword">static</span> <a class="code" href="group__DBusTypes.html#ga39c9cb0f3a2a8ad6f55cc4855d035349" title="A boolean, valid values are TRUE and FALSE.">dbus_bool_t</a>
<a name="l01774"></a>01774 writer_recurse_struct_or_dict_entry (<a class="code" href="structDBusTypeWriter.html" title="The type writer is an iterator for writing to a block of values.">DBusTypeWriter</a> *writer,
<a name="l01775"></a>01775 <span class="keywordtype">int</span> begin_char,
<a name="l01776"></a>01776 <span class="keyword">const</span> <a class="code" href="structDBusString.html">DBusString</a> *contained_type,
<a name="l01777"></a>01777 <span class="keywordtype">int</span> contained_type_start,
<a name="l01778"></a>01778 <span class="keywordtype">int</span> contained_type_len,
<a name="l01779"></a>01779 <a class="code" href="structDBusTypeWriter.html" title="The type writer is an iterator for writing to a block of values.">DBusTypeWriter</a> *sub)
<a name="l01780"></a>01780 {
<a name="l01781"></a>01781 <span class="comment">/* FIXME right now contained_type is ignored; we could probably</span>
<a name="l01782"></a>01782 <span class="comment"> * almost trivially fix the code so if it's present we</span>
<a name="l01783"></a>01783 <span class="comment"> * write it out and then set type_pos_is_expectation</span>
<a name="l01784"></a>01784 <span class="comment"> */</span>
<a name="l01785"></a>01785
<a name="l01786"></a>01786 <span class="comment">/* Ensure that we'll be able to add alignment padding and the typecode */</span>
<a name="l01787"></a>01787 <span class="keywordflow">if</span> (writer-><a class="code" href="structDBusTypeWriter.html#a52c8617918c108d36b947cbdfc99c6ea" title="whether to write values">enabled</a>)
<a name="l01788"></a>01788 {
<a name="l01789"></a>01789 <span class="keywordflow">if</span> (!<a class="code" href="group__DBusString.html#ga4764e75c464356408fc1a12df93177c1" title="Preallocate extra_bytes such that a future lengthening of the string by extra_bytes is guaranteed to ...">_dbus_string_alloc_space</a> (sub-><a class="code" href="structDBusTypeWriter.html#aa4e4b3af31fd7a93d0e54d10882bcc07" title="where to write values">value_str</a>, 8))
<a name="l01790"></a>01790 <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#gaa93f0eb578d23995850d61f7d61c55c1" title="Expands to "0".">FALSE</a>;
<a name="l01791"></a>01791 }
<a name="l01792"></a>01792
<a name="l01793"></a>01793 <span class="keywordflow">if</span> (!write_or_verify_typecode (sub, begin_char))
<a name="l01794"></a>01794 _dbus_assert_not_reached (<span class="stringliteral">"failed to insert struct typecode after prealloc"</span>);
<a name="l01795"></a>01795
<a name="l01796"></a>01796 <span class="keywordflow">if</span> (writer-><a class="code" href="structDBusTypeWriter.html#a52c8617918c108d36b947cbdfc99c6ea" title="whether to write values">enabled</a>)
<a name="l01797"></a>01797 {
<a name="l01798"></a>01798 <span class="keywordflow">if</span> (!<a class="code" href="group__DBusString.html#gaa0964d662ad17c58eb044c1b153017a6" title="Inserts a number of bytes of a given value at the given position.">_dbus_string_insert_bytes</a> (sub-><a class="code" href="structDBusTypeWriter.html#aa4e4b3af31fd7a93d0e54d10882bcc07" title="where to write values">value_str</a>,
<a name="l01799"></a>01799 sub-><a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a>,
<a name="l01800"></a>01800 _DBUS_ALIGN_VALUE (sub-><a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a>, 8) - sub-><a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a>,
<a name="l01801"></a>01801 <span class="charliteral">'\0'</span>))
<a name="l01802"></a>01802 _dbus_assert_not_reached (<span class="stringliteral">"should not have failed to insert alignment padding for struct"</span>);
<a name="l01803"></a>01803 sub-><a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a> = _DBUS_ALIGN_VALUE (sub-><a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a>, 8);
<a name="l01804"></a>01804 }
<a name="l01805"></a>01805
<a name="l01806"></a>01806 <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#gaa8cecfc5c5c054d2875c03e77b7be15d" title="Expands to "1".">TRUE</a>;
<a name="l01807"></a>01807 }
<a name="l01808"></a>01808
<a name="l01809"></a>01809
<a name="l01810"></a>01810 <span class="keyword">static</span> <a class="code" href="group__DBusTypes.html#ga39c9cb0f3a2a8ad6f55cc4855d035349" title="A boolean, valid values are TRUE and FALSE.">dbus_bool_t</a>
<a name="l01811"></a>01811 writer_recurse_array (<a class="code" href="structDBusTypeWriter.html" title="The type writer is an iterator for writing to a block of values.">DBusTypeWriter</a> *writer,
<a name="l01812"></a>01812 <span class="keyword">const</span> <a class="code" href="structDBusString.html">DBusString</a> *contained_type,
<a name="l01813"></a>01813 <span class="keywordtype">int</span> contained_type_start,
<a name="l01814"></a>01814 <span class="keywordtype">int</span> contained_type_len,
<a name="l01815"></a>01815 <a class="code" href="structDBusTypeWriter.html" title="The type writer is an iterator for writing to a block of values.">DBusTypeWriter</a> *sub,
<a name="l01816"></a>01816 <a class="code" href="group__DBusTypes.html#ga39c9cb0f3a2a8ad6f55cc4855d035349" title="A boolean, valid values are TRUE and FALSE.">dbus_bool_t</a> is_array_append)
<a name="l01817"></a>01817 {
<a name="l01818"></a>01818 <a class="code" href="group__DBusTypes.html#gaf513803b030613a669cc7ef199f90a8b" title="A 32-bit unsigned integer on all platforms.">dbus_uint32_t</a> value = 0;
<a name="l01819"></a>01819 <span class="keywordtype">int</span> alignment;
<a name="l01820"></a>01820 <span class="keywordtype">int</span> aligned;
<a name="l01821"></a>01821
<a name="l01822"></a>01822 <span class="preprocessor">#ifndef DBUS_DISABLE_CHECKS</span>
<a name="l01823"></a>01823 <span class="preprocessor"></span> <span class="keywordflow">if</span> (writer-><a class="code" href="structDBusTypeWriter.html#ad0953035070c7c7d21b044b7b2f0f491" title="what are we inside? (e.g.">container_type</a> == <a class="code" href="group__DBusProtocol.html#ga8912f600f81a773066ca03d9163613a9" title="Type code marking a D-Bus array type.">DBUS_TYPE_ARRAY</a> &&
<a name="l01824"></a>01824 writer-><a class="code" href="structDBusTypeWriter.html#a95204ef3a9cf29ee31687032b142b836" title="where to write typecodes (or read type expectations)">type_str</a>)
<a name="l01825"></a>01825 {
<a name="l01826"></a>01826 <span class="keywordflow">if</span> (!<a class="code" href="group__DBusString.html#ga2095c2a797ae245521a7588b32279110" title="Tests two sub-parts of two DBusString for equality.">_dbus_string_equal_substring</a> (contained_type,
<a name="l01827"></a>01827 contained_type_start,
<a name="l01828"></a>01828 contained_type_len,
<a name="l01829"></a>01829 writer-><a class="code" href="structDBusTypeWriter.html#a95204ef3a9cf29ee31687032b142b836" title="where to write typecodes (or read type expectations)">type_str</a>,
<a name="l01830"></a>01830 writer-><a class="code" href="structDBusTypeWriter.html#afe24080d2be45fb6033833a1a38d5d1a" title="class-specific data">u</a>.array.element_type_pos + 1))
<a name="l01831"></a>01831 {
<a name="l01832"></a>01832 <a class="code" href="group__DBusInternalsUtils.html#ga63f2f8a068454b781f214ba596e313b4" title="Prints a "critical" warning to stderr when an assertion fails; differs from _dbus_warn primarily in t...">_dbus_warn_check_failed</a> (<span class="stringliteral">"Writing an array of '%s' but this is incompatible with the expected type of elements in the parent array\n"</span>,
<a name="l01833"></a>01833 <a class="code" href="group__DBusString.html#ga8c202a65e938f9bdb859fc6705a4f1bb" title="const version of _dbus_string_get_data_len().">_dbus_string_get_const_data_len</a> (contained_type,
<a name="l01834"></a>01834 contained_type_start,
<a name="l01835"></a>01835 contained_type_len));
<a name="l01836"></a>01836 _dbus_assert_not_reached (<span class="stringliteral">"incompatible type for child array"</span>);
<a name="l01837"></a>01837 }
<a name="l01838"></a>01838 }
<a name="l01839"></a>01839 <span class="preprocessor">#endif </span><span class="comment">/* DBUS_DISABLE_CHECKS */</span>
<a name="l01840"></a>01840
<a name="l01841"></a>01841 <span class="keywordflow">if</span> (writer-><a class="code" href="structDBusTypeWriter.html#a52c8617918c108d36b947cbdfc99c6ea" title="whether to write values">enabled</a> && !is_array_append)
<a name="l01842"></a>01842 {
<a name="l01843"></a>01843 <span class="comment">/* 3 pad + 4 bytes for the array length, and 4 bytes possible padding</span>
<a name="l01844"></a>01844 <span class="comment"> * before array values</span>
<a name="l01845"></a>01845 <span class="comment"> */</span>
<a name="l01846"></a>01846 <span class="keywordflow">if</span> (!<a class="code" href="group__DBusString.html#ga4764e75c464356408fc1a12df93177c1" title="Preallocate extra_bytes such that a future lengthening of the string by extra_bytes is guaranteed to ...">_dbus_string_alloc_space</a> (sub-><a class="code" href="structDBusTypeWriter.html#aa4e4b3af31fd7a93d0e54d10882bcc07" title="where to write values">value_str</a>, 3 + 4 + 4))
<a name="l01847"></a>01847 <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#gaa93f0eb578d23995850d61f7d61c55c1" title="Expands to "0".">FALSE</a>;
<a name="l01848"></a>01848 }
<a name="l01849"></a>01849
<a name="l01850"></a>01850 <span class="keywordflow">if</span> (writer-><a class="code" href="structDBusTypeWriter.html#a95204ef3a9cf29ee31687032b142b836" title="where to write typecodes (or read type expectations)">type_str</a> != <a class="code" href="group__DBusMacros.html#ga070d2ce7b6bb7e5c05602aa8c308d0c4" title="A null pointer, defined appropriately for C or C++.">NULL</a>)
<a name="l01851"></a>01851 {
<a name="l01852"></a>01852 sub-><a class="code" href="structDBusTypeWriter.html#a77c19debc0427372f368cfe7188951f8" title="current pos in type_str">type_pos</a> += 1; <span class="comment">/* move to point to the element type, since type_pos</span>
<a name="l01853"></a>01853 <span class="comment"> * should be the expected type for further writes</span>
<a name="l01854"></a>01854 <span class="comment"> */</span>
<a name="l01855"></a>01855 sub-><a class="code" href="structDBusTypeWriter.html#afe24080d2be45fb6033833a1a38d5d1a" title="class-specific data">u</a>.array.element_type_pos = sub-><a class="code" href="structDBusTypeWriter.html#a77c19debc0427372f368cfe7188951f8" title="current pos in type_str">type_pos</a>;
<a name="l01856"></a>01856 }
<a name="l01857"></a>01857
<a name="l01858"></a>01858 <span class="keywordflow">if</span> (!writer-><a class="code" href="structDBusTypeWriter.html#ae6db89e9a3adcd52678dc089810cfb0b" title="type_pos can be either an insertion point for or an expected next type">type_pos_is_expectation</a>)
<a name="l01859"></a>01859 {
<a name="l01860"></a>01860 <span class="comment">/* sub is a toplevel/outermost array so we need to write the type data */</span>
<a name="l01861"></a>01861
<a name="l01862"></a>01862 <span class="comment">/* alloc space for array typecode, element signature */</span>
<a name="l01863"></a>01863 <span class="keywordflow">if</span> (!<a class="code" href="group__DBusString.html#ga4764e75c464356408fc1a12df93177c1" title="Preallocate extra_bytes such that a future lengthening of the string by extra_bytes is guaranteed to ...">_dbus_string_alloc_space</a> (writer-><a class="code" href="structDBusTypeWriter.html#a95204ef3a9cf29ee31687032b142b836" title="where to write typecodes (or read type expectations)">type_str</a>, 1 + contained_type_len))
<a name="l01864"></a>01864 <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#gaa93f0eb578d23995850d61f7d61c55c1" title="Expands to "0".">FALSE</a>;
<a name="l01865"></a>01865
<a name="l01866"></a>01866 <span class="keywordflow">if</span> (!<a class="code" href="group__DBusString.html#gab0770800dce6df97e5d246105a44e7b4" title="Inserts a single byte at the given position.">_dbus_string_insert_byte</a> (writer-><a class="code" href="structDBusTypeWriter.html#a95204ef3a9cf29ee31687032b142b836" title="where to write typecodes (or read type expectations)">type_str</a>,
<a name="l01867"></a>01867 writer-><a class="code" href="structDBusTypeWriter.html#a77c19debc0427372f368cfe7188951f8" title="current pos in type_str">type_pos</a>,
<a name="l01868"></a>01868 <a class="code" href="group__DBusProtocol.html#ga8912f600f81a773066ca03d9163613a9" title="Type code marking a D-Bus array type.">DBUS_TYPE_ARRAY</a>))
<a name="l01869"></a>01869 _dbus_assert_not_reached (<span class="stringliteral">"failed to insert array typecode after prealloc"</span>);
<a name="l01870"></a>01870
<a name="l01871"></a>01871 <span class="keywordflow">if</span> (!<a class="code" href="group__DBusString.html#gaf5f13bc7ac7a623516930d26ae2589bf" title="Like _dbus_string_copy(), but can copy a segment from the middle of the source string.">_dbus_string_copy_len</a> (contained_type,
<a name="l01872"></a>01872 contained_type_start, contained_type_len,
<a name="l01873"></a>01873 sub-><a class="code" href="structDBusTypeWriter.html#a95204ef3a9cf29ee31687032b142b836" title="where to write typecodes (or read type expectations)">type_str</a>,
<a name="l01874"></a>01874 sub-><a class="code" href="structDBusTypeWriter.html#afe24080d2be45fb6033833a1a38d5d1a" title="class-specific data">u</a>.array.element_type_pos))
<a name="l01875"></a>01875 _dbus_assert_not_reached (<span class="stringliteral">"should not have failed to insert array element typecodes"</span>);
<a name="l01876"></a>01876 }
<a name="l01877"></a>01877
<a name="l01878"></a>01878 <span class="keywordflow">if</span> (writer-><a class="code" href="structDBusTypeWriter.html#a95204ef3a9cf29ee31687032b142b836" title="where to write typecodes (or read type expectations)">type_str</a> != <a class="code" href="group__DBusMacros.html#ga070d2ce7b6bb7e5c05602aa8c308d0c4" title="A null pointer, defined appropriately for C or C++.">NULL</a>)
<a name="l01879"></a>01879 {
<a name="l01880"></a>01880 <span class="comment">/* If the parent is an array, we hold type_pos pointing at the array element type;</span>
<a name="l01881"></a>01881 <span class="comment"> * otherwise advance it to reflect the array value we just recursed into</span>
<a name="l01882"></a>01882 <span class="comment"> */</span>
<a name="l01883"></a>01883 <span class="keywordflow">if</span> (writer-><a class="code" href="structDBusTypeWriter.html#ad0953035070c7c7d21b044b7b2f0f491" title="what are we inside? (e.g.">container_type</a> != <a class="code" href="group__DBusProtocol.html#ga8912f600f81a773066ca03d9163613a9" title="Type code marking a D-Bus array type.">DBUS_TYPE_ARRAY</a>)
<a name="l01884"></a>01884 writer-><a class="code" href="structDBusTypeWriter.html#a77c19debc0427372f368cfe7188951f8" title="current pos in type_str">type_pos</a> += 1 + contained_type_len;
<a name="l01885"></a>01885 <span class="keywordflow">else</span>
<a name="l01886"></a>01886 _dbus_assert (writer-><a class="code" href="structDBusTypeWriter.html#ae6db89e9a3adcd52678dc089810cfb0b" title="type_pos can be either an insertion point for or an expected next type">type_pos_is_expectation</a>); <span class="comment">/* because it's an array */</span>
<a name="l01887"></a>01887 }
<a name="l01888"></a>01888
<a name="l01889"></a>01889 <span class="keywordflow">if</span> (writer-><a class="code" href="structDBusTypeWriter.html#a52c8617918c108d36b947cbdfc99c6ea" title="whether to write values">enabled</a>)
<a name="l01890"></a>01890 {
<a name="l01891"></a>01891 <span class="comment">/* Write (or jump over, if is_array_append) the length */</span>
<a name="l01892"></a>01892 sub-><a class="code" href="structDBusTypeWriter.html#afe24080d2be45fb6033833a1a38d5d1a" title="class-specific data">u</a>.array.len_pos = _DBUS_ALIGN_VALUE (sub-><a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a>, 4);
<a name="l01893"></a>01893
<a name="l01894"></a>01894 <span class="keywordflow">if</span> (is_array_append)
<a name="l01895"></a>01895 {
<a name="l01896"></a>01896 sub-><a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a> += 4;
<a name="l01897"></a>01897 }
<a name="l01898"></a>01898 <span class="keywordflow">else</span>
<a name="l01899"></a>01899 {
<a name="l01900"></a>01900 <span class="keywordflow">if</span> (!_dbus_type_writer_write_basic_no_typecode (sub, <a class="code" href="group__DBusProtocol.html#gaedb1740bd8a9174b98ac593eded25d49" title="Type code marking a 32-bit unsigned integer.">DBUS_TYPE_UINT32</a>,
<a name="l01901"></a>01901 &value))
<a name="l01902"></a>01902 _dbus_assert_not_reached (<span class="stringliteral">"should not have failed to insert array len"</span>);
<a name="l01903"></a>01903 }
<a name="l01904"></a>01904
<a name="l01905"></a>01905 _dbus_assert (sub-><a class="code" href="structDBusTypeWriter.html#afe24080d2be45fb6033833a1a38d5d1a" title="class-specific data">u</a>.array.len_pos == sub-><a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a> - 4);
<a name="l01906"></a>01906
<a name="l01907"></a>01907 <span class="comment">/* Write alignment padding for array elements</span>
<a name="l01908"></a>01908 <span class="comment"> * Note that we write the padding *even for empty arrays*</span>
<a name="l01909"></a>01909 <span class="comment"> * to avoid wonky special cases</span>
<a name="l01910"></a>01910 <span class="comment"> */</span>
<a name="l01911"></a>01911 alignment = element_type_get_alignment (contained_type, contained_type_start);
<a name="l01912"></a>01912
<a name="l01913"></a>01913 aligned = _DBUS_ALIGN_VALUE (sub-><a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a>, alignment);
<a name="l01914"></a>01914 <span class="keywordflow">if</span> (aligned != sub-><a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a>)
<a name="l01915"></a>01915 {
<a name="l01916"></a>01916 <span class="keywordflow">if</span> (!is_array_append)
<a name="l01917"></a>01917 {
<a name="l01918"></a>01918 <span class="keywordflow">if</span> (!<a class="code" href="group__DBusString.html#gaa0964d662ad17c58eb044c1b153017a6" title="Inserts a number of bytes of a given value at the given position.">_dbus_string_insert_bytes</a> (sub-><a class="code" href="structDBusTypeWriter.html#aa4e4b3af31fd7a93d0e54d10882bcc07" title="where to write values">value_str</a>,
<a name="l01919"></a>01919 sub-><a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a>,
<a name="l01920"></a>01920 aligned - sub-><a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a>,
<a name="l01921"></a>01921 <span class="charliteral">'\0'</span>))
<a name="l01922"></a>01922 _dbus_assert_not_reached (<span class="stringliteral">"should not have failed to insert alignment padding"</span>);
<a name="l01923"></a>01923 }
<a name="l01924"></a>01924
<a name="l01925"></a>01925 sub-><a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a> = aligned;
<a name="l01926"></a>01926 }
<a name="l01927"></a>01927
<a name="l01928"></a>01928 sub-><a class="code" href="structDBusTypeWriter.html#afe24080d2be45fb6033833a1a38d5d1a" title="class-specific data">u</a>.array.start_pos = sub-><a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a>;
<a name="l01929"></a>01929
<a name="l01930"></a>01930 <span class="keywordflow">if</span> (is_array_append)
<a name="l01931"></a>01931 {
<a name="l01932"></a>01932 <a class="code" href="group__DBusTypes.html#gaf513803b030613a669cc7ef199f90a8b" title="A 32-bit unsigned integer on all platforms.">dbus_uint32_t</a> len;
<a name="l01933"></a>01933
<a name="l01934"></a>01934 _dbus_assert (_DBUS_ALIGN_VALUE (sub-><a class="code" href="structDBusTypeWriter.html#afe24080d2be45fb6033833a1a38d5d1a" title="class-specific data">u</a>.array.len_pos, 4) ==
<a name="l01935"></a>01935 (<span class="keywordtype">unsigned</span>) sub-><a class="code" href="structDBusTypeWriter.html#afe24080d2be45fb6033833a1a38d5d1a" title="class-specific data">u</a>.array.len_pos);
<a name="l01936"></a>01936 len = <a class="code" href="group__DBusMarshal.html#ga50a9187b315cfcd6b311ed1b36488c05" title="Unpacks a 32 bit unsigned integer from a data pointer.">_dbus_unpack_uint32</a> (sub-><a class="code" href="structDBusTypeWriter.html#a6c4baf0b7148cf3f76924b654dada148" title="byte order to write values with">byte_order</a>,
<a name="l01937"></a>01937 <a class="code" href="group__DBusString.html#ga8c202a65e938f9bdb859fc6705a4f1bb" title="const version of _dbus_string_get_data_len().">_dbus_string_get_const_data_len</a> (sub-><a class="code" href="structDBusTypeWriter.html#aa4e4b3af31fd7a93d0e54d10882bcc07" title="where to write values">value_str</a>,
<a name="l01938"></a>01938 sub-><a class="code" href="structDBusTypeWriter.html#afe24080d2be45fb6033833a1a38d5d1a" title="class-specific data">u</a>.array.len_pos,
<a name="l01939"></a>01939 4));
<a name="l01940"></a>01940
<a name="l01941"></a>01941 sub-><a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a> += len;
<a name="l01942"></a>01942 }
<a name="l01943"></a>01943 }
<a name="l01944"></a>01944 <span class="keywordflow">else</span>
<a name="l01945"></a>01945 {
<a name="l01946"></a>01946 <span class="comment">/* not enabled, so we won't write the len_pos; set it to -1 to so indicate */</span>
<a name="l01947"></a>01947 sub-><a class="code" href="structDBusTypeWriter.html#afe24080d2be45fb6033833a1a38d5d1a" title="class-specific data">u</a>.array.len_pos = -1;
<a name="l01948"></a>01948 sub-><a class="code" href="structDBusTypeWriter.html#afe24080d2be45fb6033833a1a38d5d1a" title="class-specific data">u</a>.array.start_pos = sub-><a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a>;
<a name="l01949"></a>01949 }
<a name="l01950"></a>01950
<a name="l01951"></a>01951 _dbus_assert (sub-><a class="code" href="structDBusTypeWriter.html#afe24080d2be45fb6033833a1a38d5d1a" title="class-specific data">u</a>.array.len_pos < sub-><a class="code" href="structDBusTypeWriter.html#afe24080d2be45fb6033833a1a38d5d1a" title="class-specific data">u</a>.array.start_pos);
<a name="l01952"></a>01952 _dbus_assert (is_array_append || sub-><a class="code" href="structDBusTypeWriter.html#afe24080d2be45fb6033833a1a38d5d1a" title="class-specific data">u</a>.array.start_pos == sub-><a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a>);
<a name="l01953"></a>01953
<a name="l01954"></a>01954 <span class="preprocessor">#if RECURSIVE_MARSHAL_WRITE_TRACE</span>
<a name="l01955"></a>01955 <span class="preprocessor"></span> _dbus_verbose (<span class="stringliteral">" type writer %p recurse array done remaining sig '%s' array start_pos = %d len_pos = %d value_pos = %d\n"</span>, sub,
<a name="l01956"></a>01956 sub-><a class="code" href="structDBusTypeWriter.html#a95204ef3a9cf29ee31687032b142b836" title="where to write typecodes (or read type expectations)">type_str</a> ?
<a name="l01957"></a>01957 <a class="code" href="group__DBusString.html#ga8c202a65e938f9bdb859fc6705a4f1bb" title="const version of _dbus_string_get_data_len().">_dbus_string_get_const_data_len</a> (sub-><a class="code" href="structDBusTypeWriter.html#a95204ef3a9cf29ee31687032b142b836" title="where to write typecodes (or read type expectations)">type_str</a>, sub-><a class="code" href="structDBusTypeWriter.html#a77c19debc0427372f368cfe7188951f8" title="current pos in type_str">type_pos</a>, 0) :
<a name="l01958"></a>01958 <span class="stringliteral">"unknown"</span>,
<a name="l01959"></a>01959 sub-><a class="code" href="structDBusTypeWriter.html#afe24080d2be45fb6033833a1a38d5d1a" title="class-specific data">u</a>.array.start_pos, sub-><a class="code" href="structDBusTypeWriter.html#afe24080d2be45fb6033833a1a38d5d1a" title="class-specific data">u</a>.array.len_pos, sub-><a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a>);
<a name="l01960"></a>01960 <span class="preprocessor">#endif</span>
<a name="l01961"></a>01961 <span class="preprocessor"></span>
<a name="l01962"></a>01962 <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#gaa8cecfc5c5c054d2875c03e77b7be15d" title="Expands to "1".">TRUE</a>;
<a name="l01963"></a>01963 }
<a name="l01964"></a>01964
<a name="l01965"></a>01965 <span class="comment">/* Variant value will normally have:</span>
<a name="l01966"></a>01966 <span class="comment"> * 1 byte signature length not including nul</span>
<a name="l01967"></a>01967 <span class="comment"> * signature typecodes (nul terminated)</span>
<a name="l01968"></a>01968 <span class="comment"> * padding to alignment of contained type</span>
<a name="l01969"></a>01969 <span class="comment"> * body according to signature</span>
<a name="l01970"></a>01970 <span class="comment"> *</span>
<a name="l01971"></a>01971 <span class="comment"> * The signature string can only have a single type</span>
<a name="l01972"></a>01972 <span class="comment"> * in it but that type may be complex/recursive.</span>
<a name="l01973"></a>01973 <span class="comment"> *</span>
<a name="l01974"></a>01974 <span class="comment"> * So a typical variant type with the integer 3 will have these</span>
<a name="l01975"></a>01975 <span class="comment"> * octets:</span>
<a name="l01976"></a>01976 <span class="comment"> * 0x1 'i' '\0' [1 byte padding to alignment boundary] 0x0 0x0 0x0 0x3</span>
<a name="l01977"></a>01977 <span class="comment"> *</span>
<a name="l01978"></a>01978 <span class="comment"> * The main world of hurt for writing out a variant is that the type</span>
<a name="l01979"></a>01979 <span class="comment"> * string is the same string as the value string. Which means</span>
<a name="l01980"></a>01980 <span class="comment"> * inserting to the type string will move the value_pos; and it means</span>
<a name="l01981"></a>01981 <span class="comment"> * that inserting to the type string could break type alignment.</span>
<a name="l01982"></a>01982 <span class="comment"> */</span>
<a name="l01983"></a>01983 <span class="keyword">static</span> <a class="code" href="group__DBusTypes.html#ga39c9cb0f3a2a8ad6f55cc4855d035349" title="A boolean, valid values are TRUE and FALSE.">dbus_bool_t</a>
<a name="l01984"></a>01984 writer_recurse_variant (<a class="code" href="structDBusTypeWriter.html" title="The type writer is an iterator for writing to a block of values.">DBusTypeWriter</a> *writer,
<a name="l01985"></a>01985 <span class="keyword">const</span> <a class="code" href="structDBusString.html">DBusString</a> *contained_type,
<a name="l01986"></a>01986 <span class="keywordtype">int</span> contained_type_start,
<a name="l01987"></a>01987 <span class="keywordtype">int</span> contained_type_len,
<a name="l01988"></a>01988 <a class="code" href="structDBusTypeWriter.html" title="The type writer is an iterator for writing to a block of values.">DBusTypeWriter</a> *sub)
<a name="l01989"></a>01989 {
<a name="l01990"></a>01990 <span class="keywordtype">int</span> contained_alignment;
<a name="l01991"></a>01991
<a name="l01992"></a>01992 <span class="keywordflow">if</span> (writer-><a class="code" href="structDBusTypeWriter.html#a52c8617918c108d36b947cbdfc99c6ea" title="whether to write values">enabled</a>)
<a name="l01993"></a>01993 {
<a name="l01994"></a>01994 <span class="comment">/* Allocate space for the worst case, which is 1 byte sig</span>
<a name="l01995"></a>01995 <span class="comment"> * length, nul byte at end of sig, and 7 bytes padding to</span>
<a name="l01996"></a>01996 <span class="comment"> * 8-boundary.</span>
<a name="l01997"></a>01997 <span class="comment"> */</span>
<a name="l01998"></a>01998 <span class="keywordflow">if</span> (!<a class="code" href="group__DBusString.html#ga4764e75c464356408fc1a12df93177c1" title="Preallocate extra_bytes such that a future lengthening of the string by extra_bytes is guaranteed to ...">_dbus_string_alloc_space</a> (sub-><a class="code" href="structDBusTypeWriter.html#aa4e4b3af31fd7a93d0e54d10882bcc07" title="where to write values">value_str</a>, contained_type_len + 9))
<a name="l01999"></a>01999 <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#gaa93f0eb578d23995850d61f7d61c55c1" title="Expands to "0".">FALSE</a>;
<a name="l02000"></a>02000 }
<a name="l02001"></a>02001
<a name="l02002"></a>02002 <span class="comment">/* write VARIANT typecode to the parent's type string */</span>
<a name="l02003"></a>02003 <span class="keywordflow">if</span> (!write_or_verify_typecode (writer, <a class="code" href="group__DBusProtocol.html#ga4aa7a463ad2bce4e9aa95e3e397ddcf1" title="Type code marking a D-Bus variant type.">DBUS_TYPE_VARIANT</a>))
<a name="l02004"></a>02004 <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#gaa93f0eb578d23995850d61f7d61c55c1" title="Expands to "0".">FALSE</a>;
<a name="l02005"></a>02005
<a name="l02006"></a>02006 <span class="comment">/* If not enabled, mark that we have no type_str anymore ... */</span>
<a name="l02007"></a>02007
<a name="l02008"></a>02008 <span class="keywordflow">if</span> (!writer-><a class="code" href="structDBusTypeWriter.html#a52c8617918c108d36b947cbdfc99c6ea" title="whether to write values">enabled</a>)
<a name="l02009"></a>02009 {
<a name="l02010"></a>02010 sub-><a class="code" href="structDBusTypeWriter.html#a95204ef3a9cf29ee31687032b142b836" title="where to write typecodes (or read type expectations)">type_str</a> = <a class="code" href="group__DBusMacros.html#ga070d2ce7b6bb7e5c05602aa8c308d0c4" title="A null pointer, defined appropriately for C or C++.">NULL</a>;
<a name="l02011"></a>02011 sub-><a class="code" href="structDBusTypeWriter.html#a77c19debc0427372f368cfe7188951f8" title="current pos in type_str">type_pos</a> = -1;
<a name="l02012"></a>02012
<a name="l02013"></a>02013 <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#gaa8cecfc5c5c054d2875c03e77b7be15d" title="Expands to "1".">TRUE</a>;
<a name="l02014"></a>02014 }
<a name="l02015"></a>02015
<a name="l02016"></a>02016 <span class="comment">/* If we're enabled then continue ... */</span>
<a name="l02017"></a>02017
<a name="l02018"></a>02018 <span class="keywordflow">if</span> (!<a class="code" href="group__DBusString.html#gab0770800dce6df97e5d246105a44e7b4" title="Inserts a single byte at the given position.">_dbus_string_insert_byte</a> (sub-><a class="code" href="structDBusTypeWriter.html#aa4e4b3af31fd7a93d0e54d10882bcc07" title="where to write values">value_str</a>,
<a name="l02019"></a>02019 sub-><a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a>,
<a name="l02020"></a>02020 contained_type_len))
<a name="l02021"></a>02021 _dbus_assert_not_reached (<span class="stringliteral">"should not have failed to insert variant type sig len"</span>);
<a name="l02022"></a>02022
<a name="l02023"></a>02023 sub-><a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a> += 1;
<a name="l02024"></a>02024
<a name="l02025"></a>02025 <span class="comment">/* Here we switch over to the expected type sig we're about to write */</span>
<a name="l02026"></a>02026 sub-><a class="code" href="structDBusTypeWriter.html#a95204ef3a9cf29ee31687032b142b836" title="where to write typecodes (or read type expectations)">type_str</a> = sub-><a class="code" href="structDBusTypeWriter.html#aa4e4b3af31fd7a93d0e54d10882bcc07" title="where to write values">value_str</a>;
<a name="l02027"></a>02027 sub-><a class="code" href="structDBusTypeWriter.html#a77c19debc0427372f368cfe7188951f8" title="current pos in type_str">type_pos</a> = sub-><a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a>;
<a name="l02028"></a>02028
<a name="l02029"></a>02029 <span class="keywordflow">if</span> (!<a class="code" href="group__DBusString.html#gaf5f13bc7ac7a623516930d26ae2589bf" title="Like _dbus_string_copy(), but can copy a segment from the middle of the source string.">_dbus_string_copy_len</a> (contained_type, contained_type_start, contained_type_len,
<a name="l02030"></a>02030 sub-><a class="code" href="structDBusTypeWriter.html#aa4e4b3af31fd7a93d0e54d10882bcc07" title="where to write values">value_str</a>, sub-><a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a>))
<a name="l02031"></a>02031 _dbus_assert_not_reached (<span class="stringliteral">"should not have failed to insert variant type sig"</span>);
<a name="l02032"></a>02032
<a name="l02033"></a>02033 sub-><a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a> += contained_type_len;
<a name="l02034"></a>02034
<a name="l02035"></a>02035 <span class="keywordflow">if</span> (!<a class="code" href="group__DBusString.html#gab0770800dce6df97e5d246105a44e7b4" title="Inserts a single byte at the given position.">_dbus_string_insert_byte</a> (sub-><a class="code" href="structDBusTypeWriter.html#aa4e4b3af31fd7a93d0e54d10882bcc07" title="where to write values">value_str</a>,
<a name="l02036"></a>02036 sub-><a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a>,
<a name="l02037"></a>02037 <a class="code" href="group__DBusProtocol.html#gaa9588da889743b2119dc6664712ae51e" title="Type code that is never equal to a legitimate type code.">DBUS_TYPE_INVALID</a>))
<a name="l02038"></a>02038 _dbus_assert_not_reached (<span class="stringliteral">"should not have failed to insert variant type nul termination"</span>);
<a name="l02039"></a>02039
<a name="l02040"></a>02040 sub-><a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a> += 1;
<a name="l02041"></a>02041
<a name="l02042"></a>02042 contained_alignment = <a class="code" href="group__DBusMarshal.html#ga2ba80f227880e442c140bc67653b0abd" title="Gets the alignment requirement for the given type; will be 1, 4, or 8.">_dbus_type_get_alignment</a> (<a class="code" href="group__DBusMarshal.html#ga5866a0fd058aed3396402d0456144fd2" title="Get the first type in the signature.">_dbus_first_type_in_signature</a> (contained_type, contained_type_start));
<a name="l02043"></a>02043
<a name="l02044"></a>02044 <span class="keywordflow">if</span> (!<a class="code" href="group__DBusString.html#gaa0964d662ad17c58eb044c1b153017a6" title="Inserts a number of bytes of a given value at the given position.">_dbus_string_insert_bytes</a> (sub-><a class="code" href="structDBusTypeWriter.html#aa4e4b3af31fd7a93d0e54d10882bcc07" title="where to write values">value_str</a>,
<a name="l02045"></a>02045 sub-><a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a>,
<a name="l02046"></a>02046 _DBUS_ALIGN_VALUE (sub-><a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a>, contained_alignment) - sub-><a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a>,
<a name="l02047"></a>02047 <span class="charliteral">'\0'</span>))
<a name="l02048"></a>02048 _dbus_assert_not_reached (<span class="stringliteral">"should not have failed to insert alignment padding for variant body"</span>);
<a name="l02049"></a>02049 sub-><a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a> = _DBUS_ALIGN_VALUE (sub-><a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a>, contained_alignment);
<a name="l02050"></a>02050
<a name="l02051"></a>02051 <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#gaa8cecfc5c5c054d2875c03e77b7be15d" title="Expands to "1".">TRUE</a>;
<a name="l02052"></a>02052 }
<a name="l02053"></a>02053
<a name="l02054"></a>02054 <span class="keyword">static</span> <a class="code" href="group__DBusTypes.html#ga39c9cb0f3a2a8ad6f55cc4855d035349" title="A boolean, valid values are TRUE and FALSE.">dbus_bool_t</a>
<a name="l02055"></a>02055 _dbus_type_writer_recurse_contained_len (<a class="code" href="structDBusTypeWriter.html" title="The type writer is an iterator for writing to a block of values.">DBusTypeWriter</a> *writer,
<a name="l02056"></a>02056 <span class="keywordtype">int</span> container_type,
<a name="l02057"></a>02057 <span class="keyword">const</span> <a class="code" href="structDBusString.html">DBusString</a> *contained_type,
<a name="l02058"></a>02058 <span class="keywordtype">int</span> contained_type_start,
<a name="l02059"></a>02059 <span class="keywordtype">int</span> contained_type_len,
<a name="l02060"></a>02060 <a class="code" href="structDBusTypeWriter.html" title="The type writer is an iterator for writing to a block of values.">DBusTypeWriter</a> *sub,
<a name="l02061"></a>02061 <a class="code" href="group__DBusTypes.html#ga39c9cb0f3a2a8ad6f55cc4855d035349" title="A boolean, valid values are TRUE and FALSE.">dbus_bool_t</a> is_array_append)
<a name="l02062"></a>02062 {
<a name="l02063"></a>02063 writer_recurse_init_and_check (writer, container_type, sub);
<a name="l02064"></a>02064
<a name="l02065"></a>02065 <span class="keywordflow">switch</span> (container_type)
<a name="l02066"></a>02066 {
<a name="l02067"></a>02067 <span class="keywordflow">case</span> <a class="code" href="group__DBusProtocol.html#gae4b22a74b9edb0ec0ff6e0294794d3f9" title="STRUCT and DICT_ENTRY are sort of special since their codes can't appear in a type string...">DBUS_TYPE_STRUCT</a>:
<a name="l02068"></a>02068 <span class="keywordflow">return</span> writer_recurse_struct_or_dict_entry (writer,
<a name="l02069"></a>02069 <a class="code" href="group__DBusProtocol.html#ga725657eca93175475e0694b858f51fd6" title="Code marking the start of a struct type in a type signature.">DBUS_STRUCT_BEGIN_CHAR</a>,
<a name="l02070"></a>02070 contained_type,
<a name="l02071"></a>02071 contained_type_start, contained_type_len,
<a name="l02072"></a>02072 sub);
<a name="l02073"></a>02073 <span class="keywordflow">break</span>;
<a name="l02074"></a>02074 <span class="keywordflow">case</span> <a class="code" href="group__DBusProtocol.html#gad2fc8e6c50e0ad927f4249fb9e53ca97" title="Type code used to represent a dict entry; however, this type code does not appear in type signatures...">DBUS_TYPE_DICT_ENTRY</a>:
<a name="l02075"></a>02075 <span class="keywordflow">return</span> writer_recurse_struct_or_dict_entry (writer,
<a name="l02076"></a>02076 <a class="code" href="group__DBusProtocol.html#gad51b5f7a2e6d927295479dd371f6b353" title="Code marking the start of a dict entry type in a type signature.">DBUS_DICT_ENTRY_BEGIN_CHAR</a>,
<a name="l02077"></a>02077 contained_type,
<a name="l02078"></a>02078 contained_type_start, contained_type_len,
<a name="l02079"></a>02079 sub);
<a name="l02080"></a>02080 <span class="keywordflow">break</span>;
<a name="l02081"></a>02081 <span class="keywordflow">case</span> <a class="code" href="group__DBusProtocol.html#ga8912f600f81a773066ca03d9163613a9" title="Type code marking a D-Bus array type.">DBUS_TYPE_ARRAY</a>:
<a name="l02082"></a>02082 <span class="keywordflow">return</span> writer_recurse_array (writer,
<a name="l02083"></a>02083 contained_type, contained_type_start, contained_type_len,
<a name="l02084"></a>02084 sub, is_array_append);
<a name="l02085"></a>02085 <span class="keywordflow">break</span>;
<a name="l02086"></a>02086 <span class="keywordflow">case</span> <a class="code" href="group__DBusProtocol.html#ga4aa7a463ad2bce4e9aa95e3e397ddcf1" title="Type code marking a D-Bus variant type.">DBUS_TYPE_VARIANT</a>:
<a name="l02087"></a>02087 <span class="keywordflow">return</span> writer_recurse_variant (writer,
<a name="l02088"></a>02088 contained_type, contained_type_start, contained_type_len,
<a name="l02089"></a>02089 sub);
<a name="l02090"></a>02090 <span class="keywordflow">break</span>;
<a name="l02091"></a>02091 <span class="keywordflow">default</span>:
<a name="l02092"></a>02092 _dbus_assert_not_reached (<span class="stringliteral">"tried to recurse into type that doesn't support that"</span>);
<a name="l02093"></a>02093 <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#gaa93f0eb578d23995850d61f7d61c55c1" title="Expands to "0".">FALSE</a>;
<a name="l02094"></a>02094 <span class="keywordflow">break</span>;
<a name="l02095"></a>02095 }
<a name="l02096"></a>02096 }
<a name="l02097"></a>02097
<a name="l02108"></a>02108 <a class="code" href="group__DBusTypes.html#ga39c9cb0f3a2a8ad6f55cc4855d035349" title="A boolean, valid values are TRUE and FALSE.">dbus_bool_t</a>
<a name="l02109"></a><a class="code" href="group__DBusMarshal.html#ga4c0a1036e59dac270141052d951baff2">02109</a> <a class="code" href="group__DBusMarshal.html#ga4c0a1036e59dac270141052d951baff2" title="Opens a new container and writes out the initial information for that container.">_dbus_type_writer_recurse</a> (<a class="code" href="structDBusTypeWriter.html" title="The type writer is an iterator for writing to a block of values.">DBusTypeWriter</a> *writer,
<a name="l02110"></a>02110 <span class="keywordtype">int</span> container_type,
<a name="l02111"></a>02111 <span class="keyword">const</span> <a class="code" href="structDBusString.html">DBusString</a> *contained_type,
<a name="l02112"></a>02112 <span class="keywordtype">int</span> contained_type_start,
<a name="l02113"></a>02113 <a class="code" href="structDBusTypeWriter.html" title="The type writer is an iterator for writing to a block of values.">DBusTypeWriter</a> *sub)
<a name="l02114"></a>02114 {
<a name="l02115"></a>02115 <span class="keywordtype">int</span> contained_type_len;
<a name="l02116"></a>02116
<a name="l02117"></a>02117 <span class="keywordflow">if</span> (contained_type)
<a name="l02118"></a>02118 contained_type_len = find_len_of_complete_type (contained_type, contained_type_start);
<a name="l02119"></a>02119 <span class="keywordflow">else</span>
<a name="l02120"></a>02120 contained_type_len = 0;
<a name="l02121"></a>02121
<a name="l02122"></a>02122 <span class="keywordflow">return</span> _dbus_type_writer_recurse_contained_len (writer, container_type,
<a name="l02123"></a>02123 contained_type,
<a name="l02124"></a>02124 contained_type_start,
<a name="l02125"></a>02125 contained_type_len,
<a name="l02126"></a>02126 sub,
<a name="l02127"></a>02127 <a class="code" href="group__DBusMacros.html#gaa93f0eb578d23995850d61f7d61c55c1" title="Expands to "0".">FALSE</a>);
<a name="l02128"></a>02128 }
<a name="l02129"></a>02129
<a name="l02142"></a>02142 <a class="code" href="group__DBusTypes.html#ga39c9cb0f3a2a8ad6f55cc4855d035349" title="A boolean, valid values are TRUE and FALSE.">dbus_bool_t</a>
<a name="l02143"></a><a class="code" href="group__DBusMarshal.html#gacc2b4c348f93898f6269feb0bf055617">02143</a> <a class="code" href="group__DBusMarshal.html#gacc2b4c348f93898f6269feb0bf055617" title="Append to an existing array.">_dbus_type_writer_append_array</a> (<a class="code" href="structDBusTypeWriter.html" title="The type writer is an iterator for writing to a block of values.">DBusTypeWriter</a> *writer,
<a name="l02144"></a>02144 <span class="keyword">const</span> <a class="code" href="structDBusString.html">DBusString</a> *contained_type,
<a name="l02145"></a>02145 <span class="keywordtype">int</span> contained_type_start,
<a name="l02146"></a>02146 <a class="code" href="structDBusTypeWriter.html" title="The type writer is an iterator for writing to a block of values.">DBusTypeWriter</a> *sub)
<a name="l02147"></a>02147 {
<a name="l02148"></a>02148 <span class="keywordtype">int</span> contained_type_len;
<a name="l02149"></a>02149
<a name="l02150"></a>02150 <span class="keywordflow">if</span> (contained_type)
<a name="l02151"></a>02151 contained_type_len = find_len_of_complete_type (contained_type, contained_type_start);
<a name="l02152"></a>02152 <span class="keywordflow">else</span>
<a name="l02153"></a>02153 contained_type_len = 0;
<a name="l02154"></a>02154
<a name="l02155"></a>02155 <span class="keywordflow">return</span> _dbus_type_writer_recurse_contained_len (writer, <a class="code" href="group__DBusProtocol.html#ga8912f600f81a773066ca03d9163613a9" title="Type code marking a D-Bus array type.">DBUS_TYPE_ARRAY</a>,
<a name="l02156"></a>02156 contained_type,
<a name="l02157"></a>02157 contained_type_start,
<a name="l02158"></a>02158 contained_type_len,
<a name="l02159"></a>02159 sub,
<a name="l02160"></a>02160 <a class="code" href="group__DBusMacros.html#gaa8cecfc5c5c054d2875c03e77b7be15d" title="Expands to "1".">TRUE</a>);
<a name="l02161"></a>02161 }
<a name="l02162"></a>02162
<a name="l02163"></a>02163 <span class="keyword">static</span> <span class="keywordtype">int</span>
<a name="l02164"></a>02164 writer_get_array_len (<a class="code" href="structDBusTypeWriter.html" title="The type writer is an iterator for writing to a block of values.">DBusTypeWriter</a> *writer)
<a name="l02165"></a>02165 {
<a name="l02166"></a>02166 _dbus_assert (writer-><a class="code" href="structDBusTypeWriter.html#ad0953035070c7c7d21b044b7b2f0f491" title="what are we inside? (e.g.">container_type</a> == <a class="code" href="group__DBusProtocol.html#ga8912f600f81a773066ca03d9163613a9" title="Type code marking a D-Bus array type.">DBUS_TYPE_ARRAY</a>);
<a name="l02167"></a>02167 <span class="keywordflow">return</span> writer-><a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a> - writer-><a class="code" href="structDBusTypeWriter.html#afe24080d2be45fb6033833a1a38d5d1a" title="class-specific data">u</a>.array.start_pos;
<a name="l02168"></a>02168 }
<a name="l02169"></a>02169
<a name="l02178"></a>02178 <a class="code" href="group__DBusTypes.html#ga39c9cb0f3a2a8ad6f55cc4855d035349" title="A boolean, valid values are TRUE and FALSE.">dbus_bool_t</a>
<a name="l02179"></a><a class="code" href="group__DBusMarshal.html#gacbe7eddf4f9c19da91b742087fcc111a">02179</a> <a class="code" href="group__DBusMarshal.html#gacbe7eddf4f9c19da91b742087fcc111a" title="Closes a container created by _dbus_type_writer_recurse() and writes any additional information to th...">_dbus_type_writer_unrecurse</a> (<a class="code" href="structDBusTypeWriter.html" title="The type writer is an iterator for writing to a block of values.">DBusTypeWriter</a> *writer,
<a name="l02180"></a>02180 <a class="code" href="structDBusTypeWriter.html" title="The type writer is an iterator for writing to a block of values.">DBusTypeWriter</a> *sub)
<a name="l02181"></a>02181 {
<a name="l02182"></a>02182 <span class="comment">/* type_pos_is_expectation never gets unset once set, or we'd get all hosed */</span>
<a name="l02183"></a>02183 _dbus_assert (!writer-><a class="code" href="structDBusTypeWriter.html#ae6db89e9a3adcd52678dc089810cfb0b" title="type_pos can be either an insertion point for or an expected next type">type_pos_is_expectation</a> ||
<a name="l02184"></a>02184 (writer-><a class="code" href="structDBusTypeWriter.html#ae6db89e9a3adcd52678dc089810cfb0b" title="type_pos can be either an insertion point for or an expected next type">type_pos_is_expectation</a> && sub-><a class="code" href="structDBusTypeWriter.html#ae6db89e9a3adcd52678dc089810cfb0b" title="type_pos can be either an insertion point for or an expected next type">type_pos_is_expectation</a>));
<a name="l02185"></a>02185
<a name="l02186"></a>02186 <span class="preprocessor">#if RECURSIVE_MARSHAL_WRITE_TRACE</span>
<a name="l02187"></a>02187 <span class="preprocessor"></span> _dbus_verbose (<span class="stringliteral">" type writer %p unrecurse type_pos = %d value_pos = %d is_expectation = %d container_type = %s\n"</span>,
<a name="l02188"></a>02188 writer, writer-><a class="code" href="structDBusTypeWriter.html#a77c19debc0427372f368cfe7188951f8" title="current pos in type_str">type_pos</a>, writer-><a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a>, writer-><a class="code" href="structDBusTypeWriter.html#ae6db89e9a3adcd52678dc089810cfb0b" title="type_pos can be either an insertion point for or an expected next type">type_pos_is_expectation</a>,
<a name="l02189"></a>02189 <a class="code" href="group__DBusMarshal.html#ga48a595c2b26dce6e9c25ce040e5247e5" title="Returns a string describing the given type.">_dbus_type_to_string</a> (writer-><a class="code" href="structDBusTypeWriter.html#ad0953035070c7c7d21b044b7b2f0f491" title="what are we inside? (e.g.">container_type</a>));
<a name="l02190"></a>02190 _dbus_verbose (<span class="stringliteral">" type writer %p unrecurse sub type_pos = %d value_pos = %d is_expectation = %d container_type = %s\n"</span>,
<a name="l02191"></a>02191 sub, sub-><a class="code" href="structDBusTypeWriter.html#a77c19debc0427372f368cfe7188951f8" title="current pos in type_str">type_pos</a>, sub-><a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a>,
<a name="l02192"></a>02192 sub-><a class="code" href="structDBusTypeWriter.html#ae6db89e9a3adcd52678dc089810cfb0b" title="type_pos can be either an insertion point for or an expected next type">type_pos_is_expectation</a>,
<a name="l02193"></a>02193 <a class="code" href="group__DBusMarshal.html#ga48a595c2b26dce6e9c25ce040e5247e5" title="Returns a string describing the given type.">_dbus_type_to_string</a> (sub-><a class="code" href="structDBusTypeWriter.html#ad0953035070c7c7d21b044b7b2f0f491" title="what are we inside? (e.g.">container_type</a>));
<a name="l02194"></a>02194 <span class="preprocessor">#endif</span>
<a name="l02195"></a>02195 <span class="preprocessor"></span>
<a name="l02196"></a>02196 <span class="keywordflow">if</span> (sub-><a class="code" href="structDBusTypeWriter.html#ad0953035070c7c7d21b044b7b2f0f491" title="what are we inside? (e.g.">container_type</a> == <a class="code" href="group__DBusProtocol.html#gae4b22a74b9edb0ec0ff6e0294794d3f9" title="STRUCT and DICT_ENTRY are sort of special since their codes can't appear in a type string...">DBUS_TYPE_STRUCT</a>)
<a name="l02197"></a>02197 {
<a name="l02198"></a>02198 <span class="keywordflow">if</span> (!write_or_verify_typecode (sub, <a class="code" href="group__DBusProtocol.html#gaeab5ea0def3f587a0ed548b77d5c5cea" title="Code marking the end of a struct type in a type signature.">DBUS_STRUCT_END_CHAR</a>))
<a name="l02199"></a>02199 <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#gaa93f0eb578d23995850d61f7d61c55c1" title="Expands to "0".">FALSE</a>;
<a name="l02200"></a>02200 }
<a name="l02201"></a>02201 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (sub-><a class="code" href="structDBusTypeWriter.html#ad0953035070c7c7d21b044b7b2f0f491" title="what are we inside? (e.g.">container_type</a> == <a class="code" href="group__DBusProtocol.html#gad2fc8e6c50e0ad927f4249fb9e53ca97" title="Type code used to represent a dict entry; however, this type code does not appear in type signatures...">DBUS_TYPE_DICT_ENTRY</a>)
<a name="l02202"></a>02202 {
<a name="l02203"></a>02203 <span class="keywordflow">if</span> (!write_or_verify_typecode (sub, <a class="code" href="group__DBusProtocol.html#ga29ad22c7342ead042ae9e55ae20b49f1" title="Code marking the end of a dict entry type in a type signature.">DBUS_DICT_ENTRY_END_CHAR</a>))
<a name="l02204"></a>02204 <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#gaa93f0eb578d23995850d61f7d61c55c1" title="Expands to "0".">FALSE</a>;
<a name="l02205"></a>02205 }
<a name="l02206"></a>02206 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (sub-><a class="code" href="structDBusTypeWriter.html#ad0953035070c7c7d21b044b7b2f0f491" title="what are we inside? (e.g.">container_type</a> == <a class="code" href="group__DBusProtocol.html#ga8912f600f81a773066ca03d9163613a9" title="Type code marking a D-Bus array type.">DBUS_TYPE_ARRAY</a>)
<a name="l02207"></a>02207 {
<a name="l02208"></a>02208 <span class="keywordflow">if</span> (sub-><a class="code" href="structDBusTypeWriter.html#afe24080d2be45fb6033833a1a38d5d1a" title="class-specific data">u</a>.array.len_pos >= 0) <span class="comment">/* len_pos == -1 if we weren't enabled when we passed it */</span>
<a name="l02209"></a>02209 {
<a name="l02210"></a>02210 <a class="code" href="group__DBusTypes.html#gaf513803b030613a669cc7ef199f90a8b" title="A 32-bit unsigned integer on all platforms.">dbus_uint32_t</a> len;
<a name="l02211"></a>02211
<a name="l02212"></a>02212 <span class="comment">/* Set the array length */</span>
<a name="l02213"></a>02213 len = writer_get_array_len (sub);
<a name="l02214"></a>02214 <a class="code" href="group__DBusMarshal.html#ga4bcfb6a664c7e46c7ffc31f96d532a02" title="Sets the 4 bytes at the given offset to a marshaled unsigned integer, replacing anything found there ...">_dbus_marshal_set_uint32</a> (sub-><a class="code" href="structDBusTypeWriter.html#aa4e4b3af31fd7a93d0e54d10882bcc07" title="where to write values">value_str</a>,
<a name="l02215"></a>02215 sub-><a class="code" href="structDBusTypeWriter.html#afe24080d2be45fb6033833a1a38d5d1a" title="class-specific data">u</a>.array.len_pos,
<a name="l02216"></a>02216 len,
<a name="l02217"></a>02217 sub-><a class="code" href="structDBusTypeWriter.html#a6c4baf0b7148cf3f76924b654dada148" title="byte order to write values with">byte_order</a>);
<a name="l02218"></a>02218 <span class="preprocessor">#if RECURSIVE_MARSHAL_WRITE_TRACE</span>
<a name="l02219"></a>02219 <span class="preprocessor"></span> _dbus_verbose (<span class="stringliteral">" filled in sub array len to %u at len_pos %d\n"</span>,
<a name="l02220"></a>02220 len, sub-><a class="code" href="structDBusTypeWriter.html#afe24080d2be45fb6033833a1a38d5d1a" title="class-specific data">u</a>.array.len_pos);
<a name="l02221"></a>02221 <span class="preprocessor">#endif</span>
<a name="l02222"></a>02222 <span class="preprocessor"></span> }
<a name="l02223"></a>02223 <span class="preprocessor">#if RECURSIVE_MARSHAL_WRITE_TRACE</span>
<a name="l02224"></a>02224 <span class="preprocessor"></span> <span class="keywordflow">else</span>
<a name="l02225"></a>02225 {
<a name="l02226"></a>02226 _dbus_verbose (<span class="stringliteral">" not filling in sub array len because we were disabled when we passed the len\n"</span>);
<a name="l02227"></a>02227 }
<a name="l02228"></a>02228 <span class="preprocessor">#endif</span>
<a name="l02229"></a>02229 <span class="preprocessor"></span> }
<a name="l02230"></a>02230
<a name="l02231"></a>02231 <span class="comment">/* Now get type_pos right for the parent writer. Here are the cases:</span>
<a name="l02232"></a>02232 <span class="comment"> *</span>
<a name="l02233"></a>02233 <span class="comment"> * Cases !writer->type_pos_is_expectation:</span>
<a name="l02234"></a>02234 <span class="comment"> * (in these cases we want to update to the new insertion point)</span>
<a name="l02235"></a>02235 <span class="comment"> *</span>
<a name="l02236"></a>02236 <span class="comment"> * - if we recursed into a STRUCT then we didn't know in advance</span>
<a name="l02237"></a>02237 <span class="comment"> * what the types in the struct would be; so we have to fill in</span>
<a name="l02238"></a>02238 <span class="comment"> * that information now.</span>
<a name="l02239"></a>02239 <span class="comment"> * writer->type_pos = sub->type_pos</span>
<a name="l02240"></a>02240 <span class="comment"> *</span>
<a name="l02241"></a>02241 <span class="comment"> * - if we recursed into anything else, we knew the full array</span>
<a name="l02242"></a>02242 <span class="comment"> * type, or knew the single typecode marking VARIANT, so</span>
<a name="l02243"></a>02243 <span class="comment"> * writer->type_pos is already correct.</span>
<a name="l02244"></a>02244 <span class="comment"> * writer->type_pos should remain as-is</span>
<a name="l02245"></a>02245 <span class="comment"> *</span>
<a name="l02246"></a>02246 <span class="comment"> * - note that the parent is never an ARRAY or VARIANT, if it were</span>
<a name="l02247"></a>02247 <span class="comment"> * then type_pos_is_expectation would be TRUE. The parent</span>
<a name="l02248"></a>02248 <span class="comment"> * is thus known to be a toplevel or STRUCT.</span>
<a name="l02249"></a>02249 <span class="comment"> *</span>
<a name="l02250"></a>02250 <span class="comment"> * Cases where writer->type_pos_is_expectation:</span>
<a name="l02251"></a>02251 <span class="comment"> * (in these cases we want to update to next expected type to write)</span>
<a name="l02252"></a>02252 <span class="comment"> *</span>
<a name="l02253"></a>02253 <span class="comment"> * - we recursed from STRUCT into STRUCT and we didn't increment</span>
<a name="l02254"></a>02254 <span class="comment"> * type_pos in the parent just to stay consistent with the</span>
<a name="l02255"></a>02255 <span class="comment"> * !writer->type_pos_is_expectation case (though we could</span>
<a name="l02256"></a>02256 <span class="comment"> * special-case this in recurse_struct instead if we wanted)</span>
<a name="l02257"></a>02257 <span class="comment"> * writer->type_pos = sub->type_pos</span>
<a name="l02258"></a>02258 <span class="comment"> *</span>
<a name="l02259"></a>02259 <span class="comment"> * - we recursed from STRUCT into ARRAY or VARIANT and type_pos</span>
<a name="l02260"></a>02260 <span class="comment"> * for parent should have been incremented already</span>
<a name="l02261"></a>02261 <span class="comment"> * writer->type_pos should remain as-is</span>
<a name="l02262"></a>02262 <span class="comment"> *</span>
<a name="l02263"></a>02263 <span class="comment"> * - we recursed from ARRAY into a sub-element, so type_pos in the</span>
<a name="l02264"></a>02264 <span class="comment"> * parent is the element type and should remain the element type</span>
<a name="l02265"></a>02265 <span class="comment"> * for the benefit of the next child element</span>
<a name="l02266"></a>02266 <span class="comment"> * writer->type_pos should remain as-is</span>
<a name="l02267"></a>02267 <span class="comment"> *</span>
<a name="l02268"></a>02268 <span class="comment"> * - we recursed from VARIANT into its value, so type_pos in the</span>
<a name="l02269"></a>02269 <span class="comment"> * parent makes no difference since there's only one value</span>
<a name="l02270"></a>02270 <span class="comment"> * and we just finished writing it and won't use type_pos again</span>
<a name="l02271"></a>02271 <span class="comment"> * writer->type_pos should remain as-is</span>
<a name="l02272"></a>02272 <span class="comment"> *</span>
<a name="l02273"></a>02273 <span class="comment"> *</span>
<a name="l02274"></a>02274 <span class="comment"> * For all these, DICT_ENTRY is the same as STRUCT</span>
<a name="l02275"></a>02275 <span class="comment"> */</span>
<a name="l02276"></a>02276 <span class="keywordflow">if</span> (writer-><a class="code" href="structDBusTypeWriter.html#a95204ef3a9cf29ee31687032b142b836" title="where to write typecodes (or read type expectations)">type_str</a> != <a class="code" href="group__DBusMacros.html#ga070d2ce7b6bb7e5c05602aa8c308d0c4" title="A null pointer, defined appropriately for C or C++.">NULL</a>)
<a name="l02277"></a>02277 {
<a name="l02278"></a>02278 <span class="keywordflow">if</span> ((sub-><a class="code" href="structDBusTypeWriter.html#ad0953035070c7c7d21b044b7b2f0f491" title="what are we inside? (e.g.">container_type</a> == <a class="code" href="group__DBusProtocol.html#gae4b22a74b9edb0ec0ff6e0294794d3f9" title="STRUCT and DICT_ENTRY are sort of special since their codes can't appear in a type string...">DBUS_TYPE_STRUCT</a> ||
<a name="l02279"></a>02279 sub-><a class="code" href="structDBusTypeWriter.html#ad0953035070c7c7d21b044b7b2f0f491" title="what are we inside? (e.g.">container_type</a> == <a class="code" href="group__DBusProtocol.html#gad2fc8e6c50e0ad927f4249fb9e53ca97" title="Type code used to represent a dict entry; however, this type code does not appear in type signatures...">DBUS_TYPE_DICT_ENTRY</a>) &&
<a name="l02280"></a>02280 (writer-><a class="code" href="structDBusTypeWriter.html#ad0953035070c7c7d21b044b7b2f0f491" title="what are we inside? (e.g.">container_type</a> == <a class="code" href="group__DBusProtocol.html#gae4b22a74b9edb0ec0ff6e0294794d3f9" title="STRUCT and DICT_ENTRY are sort of special since their codes can't appear in a type string...">DBUS_TYPE_STRUCT</a> ||
<a name="l02281"></a>02281 writer-><a class="code" href="structDBusTypeWriter.html#ad0953035070c7c7d21b044b7b2f0f491" title="what are we inside? (e.g.">container_type</a> == <a class="code" href="group__DBusProtocol.html#gad2fc8e6c50e0ad927f4249fb9e53ca97" title="Type code used to represent a dict entry; however, this type code does not appear in type signatures...">DBUS_TYPE_DICT_ENTRY</a> ||
<a name="l02282"></a>02282 writer-><a class="code" href="structDBusTypeWriter.html#ad0953035070c7c7d21b044b7b2f0f491" title="what are we inside? (e.g.">container_type</a> == <a class="code" href="group__DBusProtocol.html#gaa9588da889743b2119dc6664712ae51e" title="Type code that is never equal to a legitimate type code.">DBUS_TYPE_INVALID</a>))
<a name="l02283"></a>02283 {
<a name="l02284"></a>02284 <span class="comment">/* Advance the parent to the next struct field */</span>
<a name="l02285"></a>02285 writer-><a class="code" href="structDBusTypeWriter.html#a77c19debc0427372f368cfe7188951f8" title="current pos in type_str">type_pos</a> = sub-><a class="code" href="structDBusTypeWriter.html#a77c19debc0427372f368cfe7188951f8" title="current pos in type_str">type_pos</a>;
<a name="l02286"></a>02286 }
<a name="l02287"></a>02287 }
<a name="l02288"></a>02288
<a name="l02289"></a>02289 writer-><a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a> = sub-><a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a>;
<a name="l02290"></a>02290
<a name="l02291"></a>02291 <span class="preprocessor">#if RECURSIVE_MARSHAL_WRITE_TRACE</span>
<a name="l02292"></a>02292 <span class="preprocessor"></span> _dbus_verbose (<span class="stringliteral">" type writer %p unrecursed type_pos = %d value_pos = %d remaining sig '%s'\n"</span>,
<a name="l02293"></a>02293 writer, writer-><a class="code" href="structDBusTypeWriter.html#a77c19debc0427372f368cfe7188951f8" title="current pos in type_str">type_pos</a>, writer-><a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a>,
<a name="l02294"></a>02294 writer-><a class="code" href="structDBusTypeWriter.html#a95204ef3a9cf29ee31687032b142b836" title="where to write typecodes (or read type expectations)">type_str</a> ?
<a name="l02295"></a>02295 <a class="code" href="group__DBusString.html#ga8c202a65e938f9bdb859fc6705a4f1bb" title="const version of _dbus_string_get_data_len().">_dbus_string_get_const_data_len</a> (writer-><a class="code" href="structDBusTypeWriter.html#a95204ef3a9cf29ee31687032b142b836" title="where to write typecodes (or read type expectations)">type_str</a>, writer-><a class="code" href="structDBusTypeWriter.html#a77c19debc0427372f368cfe7188951f8" title="current pos in type_str">type_pos</a>, 0) :
<a name="l02296"></a>02296 <span class="stringliteral">"unknown"</span>);
<a name="l02297"></a>02297 <span class="preprocessor">#endif</span>
<a name="l02298"></a>02298 <span class="preprocessor"></span>
<a name="l02299"></a>02299 <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#gaa8cecfc5c5c054d2875c03e77b7be15d" title="Expands to "1".">TRUE</a>;
<a name="l02300"></a>02300 }
<a name="l02301"></a>02301
<a name="l02310"></a>02310 <a class="code" href="group__DBusTypes.html#ga39c9cb0f3a2a8ad6f55cc4855d035349" title="A boolean, valid values are TRUE and FALSE.">dbus_bool_t</a>
<a name="l02311"></a><a class="code" href="group__DBusMarshal.html#ga0103b0214766b0ff1ca05bcc7f1e631b">02311</a> <a class="code" href="group__DBusMarshal.html#ga0103b0214766b0ff1ca05bcc7f1e631b" title="Writes out a basic type.">_dbus_type_writer_write_basic</a> (<a class="code" href="structDBusTypeWriter.html" title="The type writer is an iterator for writing to a block of values.">DBusTypeWriter</a> *writer,
<a name="l02312"></a>02312 <span class="keywordtype">int</span> type,
<a name="l02313"></a>02313 <span class="keyword">const</span> <span class="keywordtype">void</span> *value)
<a name="l02314"></a>02314 {
<a name="l02315"></a>02315 <a class="code" href="group__DBusTypes.html#ga39c9cb0f3a2a8ad6f55cc4855d035349" title="A boolean, valid values are TRUE and FALSE.">dbus_bool_t</a> retval;
<a name="l02316"></a>02316
<a name="l02317"></a>02317 <span class="comment">/* First ensure that our type realloc will succeed */</span>
<a name="l02318"></a>02318 <span class="keywordflow">if</span> (!writer-><a class="code" href="structDBusTypeWriter.html#ae6db89e9a3adcd52678dc089810cfb0b" title="type_pos can be either an insertion point for or an expected next type">type_pos_is_expectation</a> && writer-><a class="code" href="structDBusTypeWriter.html#a95204ef3a9cf29ee31687032b142b836" title="where to write typecodes (or read type expectations)">type_str</a> != <a class="code" href="group__DBusMacros.html#ga070d2ce7b6bb7e5c05602aa8c308d0c4" title="A null pointer, defined appropriately for C or C++.">NULL</a>)
<a name="l02319"></a>02319 {
<a name="l02320"></a>02320 <span class="keywordflow">if</span> (!<a class="code" href="group__DBusString.html#ga4764e75c464356408fc1a12df93177c1" title="Preallocate extra_bytes such that a future lengthening of the string by extra_bytes is guaranteed to ...">_dbus_string_alloc_space</a> (writer-><a class="code" href="structDBusTypeWriter.html#a95204ef3a9cf29ee31687032b142b836" title="where to write typecodes (or read type expectations)">type_str</a>, 1))
<a name="l02321"></a>02321 <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#gaa93f0eb578d23995850d61f7d61c55c1" title="Expands to "0".">FALSE</a>;
<a name="l02322"></a>02322 }
<a name="l02323"></a>02323
<a name="l02324"></a>02324 retval = <a class="code" href="group__DBusMacros.html#gaa93f0eb578d23995850d61f7d61c55c1" title="Expands to "0".">FALSE</a>;
<a name="l02325"></a>02325
<a name="l02326"></a>02326 <span class="keywordflow">if</span> (!_dbus_type_writer_write_basic_no_typecode (writer, type, value))
<a name="l02327"></a>02327 <span class="keywordflow">goto</span> out;
<a name="l02328"></a>02328
<a name="l02329"></a>02329 <span class="keywordflow">if</span> (!write_or_verify_typecode (writer, type))
<a name="l02330"></a>02330 _dbus_assert_not_reached (<span class="stringliteral">"failed to write typecode after prealloc"</span>);
<a name="l02331"></a>02331
<a name="l02332"></a>02332 retval = <a class="code" href="group__DBusMacros.html#gaa8cecfc5c5c054d2875c03e77b7be15d" title="Expands to "1".">TRUE</a>;
<a name="l02333"></a>02333
<a name="l02334"></a>02334 out:
<a name="l02335"></a>02335 <span class="preprocessor">#if RECURSIVE_MARSHAL_WRITE_TRACE</span>
<a name="l02336"></a>02336 <span class="preprocessor"></span> _dbus_verbose (<span class="stringliteral">" type writer %p basic type_pos = %d value_pos = %d is_expectation = %d enabled = %d\n"</span>,
<a name="l02337"></a>02337 writer, writer-><a class="code" href="structDBusTypeWriter.html#a77c19debc0427372f368cfe7188951f8" title="current pos in type_str">type_pos</a>, writer-><a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a>, writer-><a class="code" href="structDBusTypeWriter.html#ae6db89e9a3adcd52678dc089810cfb0b" title="type_pos can be either an insertion point for or an expected next type">type_pos_is_expectation</a>,
<a name="l02338"></a>02338 writer-><a class="code" href="structDBusTypeWriter.html#a52c8617918c108d36b947cbdfc99c6ea" title="whether to write values">enabled</a>);
<a name="l02339"></a>02339 <span class="preprocessor">#endif</span>
<a name="l02340"></a>02340 <span class="preprocessor"></span>
<a name="l02341"></a>02341 <span class="keywordflow">return</span> retval;
<a name="l02342"></a>02342 }
<a name="l02343"></a>02343
<a name="l02358"></a>02358 <a class="code" href="group__DBusTypes.html#ga39c9cb0f3a2a8ad6f55cc4855d035349" title="A boolean, valid values are TRUE and FALSE.">dbus_bool_t</a>
<a name="l02359"></a><a class="code" href="group__DBusMarshal.html#gacf99495cbed7462992b6a231563b4528">02359</a> <a class="code" href="group__DBusMarshal.html#gacf99495cbed7462992b6a231563b4528" title="Writes a block of fixed-length basic values, i.e.">_dbus_type_writer_write_fixed_multi</a> (<a class="code" href="structDBusTypeWriter.html" title="The type writer is an iterator for writing to a block of values.">DBusTypeWriter</a> *writer,
<a name="l02360"></a>02360 <span class="keywordtype">int</span> element_type,
<a name="l02361"></a>02361 <span class="keyword">const</span> <span class="keywordtype">void</span> *value,
<a name="l02362"></a>02362 <span class="keywordtype">int</span> n_elements)
<a name="l02363"></a>02363 {
<a name="l02364"></a>02364 _dbus_assert (writer-><a class="code" href="structDBusTypeWriter.html#ad0953035070c7c7d21b044b7b2f0f491" title="what are we inside? (e.g.">container_type</a> == <a class="code" href="group__DBusProtocol.html#ga8912f600f81a773066ca03d9163613a9" title="Type code marking a D-Bus array type.">DBUS_TYPE_ARRAY</a>);
<a name="l02365"></a>02365 _dbus_assert (<a class="code" href="group__DBusSignature.html#ga2f89962cbd33e4ad843824157bae2093" title="Tells you whether values of this type can change length if you set them to some other value...">dbus_type_is_fixed</a> (element_type));
<a name="l02366"></a>02366 _dbus_assert (writer-><a class="code" href="structDBusTypeWriter.html#ae6db89e9a3adcd52678dc089810cfb0b" title="type_pos can be either an insertion point for or an expected next type">type_pos_is_expectation</a>);
<a name="l02367"></a>02367 _dbus_assert (n_elements >= 0);
<a name="l02368"></a>02368
<a name="l02369"></a>02369 <span class="preprocessor">#if RECURSIVE_MARSHAL_WRITE_TRACE</span>
<a name="l02370"></a>02370 <span class="preprocessor"></span> _dbus_verbose (<span class="stringliteral">" type writer %p entering fixed multi type_pos = %d value_pos = %d n_elements %d\n"</span>,
<a name="l02371"></a>02371 writer, writer-><a class="code" href="structDBusTypeWriter.html#a77c19debc0427372f368cfe7188951f8" title="current pos in type_str">type_pos</a>, writer-><a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a>, n_elements);
<a name="l02372"></a>02372 <span class="preprocessor">#endif</span>
<a name="l02373"></a>02373 <span class="preprocessor"></span>
<a name="l02374"></a>02374 <span class="keywordflow">if</span> (!write_or_verify_typecode (writer, element_type))
<a name="l02375"></a>02375 _dbus_assert_not_reached (<span class="stringliteral">"OOM should not happen if only verifying typecode"</span>);
<a name="l02376"></a>02376
<a name="l02377"></a>02377 <span class="keywordflow">if</span> (writer-><a class="code" href="structDBusTypeWriter.html#a52c8617918c108d36b947cbdfc99c6ea" title="whether to write values">enabled</a>)
<a name="l02378"></a>02378 {
<a name="l02379"></a>02379 <span class="keywordflow">if</span> (!<a class="code" href="group__DBusMarshal.html#ga990da87b984d8917da26b89a6470fdf5" title="Marshals a block of values of fixed-length type all at once, as an optimization.">_dbus_marshal_write_fixed_multi</a> (writer-><a class="code" href="structDBusTypeWriter.html#aa4e4b3af31fd7a93d0e54d10882bcc07" title="where to write values">value_str</a>,
<a name="l02380"></a>02380 writer-><a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a>,
<a name="l02381"></a>02381 element_type,
<a name="l02382"></a>02382 value,
<a name="l02383"></a>02383 n_elements,
<a name="l02384"></a>02384 writer-><a class="code" href="structDBusTypeWriter.html#a6c4baf0b7148cf3f76924b654dada148" title="byte order to write values with">byte_order</a>,
<a name="l02385"></a>02385 &writer-><a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a>))
<a name="l02386"></a>02386 <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#gaa93f0eb578d23995850d61f7d61c55c1" title="Expands to "0".">FALSE</a>;
<a name="l02387"></a>02387 }
<a name="l02388"></a>02388
<a name="l02389"></a>02389 <span class="preprocessor">#if RECURSIVE_MARSHAL_WRITE_TRACE</span>
<a name="l02390"></a>02390 <span class="preprocessor"></span> _dbus_verbose (<span class="stringliteral">" type writer %p fixed multi written new type_pos = %d new value_pos = %d n_elements %d\n"</span>,
<a name="l02391"></a>02391 writer, writer-><a class="code" href="structDBusTypeWriter.html#a77c19debc0427372f368cfe7188951f8" title="current pos in type_str">type_pos</a>, writer-><a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a>, n_elements);
<a name="l02392"></a>02392 <span class="preprocessor">#endif</span>
<a name="l02393"></a>02393 <span class="preprocessor"></span>
<a name="l02394"></a>02394 <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#gaa8cecfc5c5c054d2875c03e77b7be15d" title="Expands to "1".">TRUE</a>;
<a name="l02395"></a>02395 }
<a name="l02396"></a>02396
<a name="l02397"></a>02397 <span class="keyword">static</span> <span class="keywordtype">void</span>
<a name="l02398"></a>02398 enable_if_after (<a class="code" href="structDBusTypeWriter.html" title="The type writer is an iterator for writing to a block of values.">DBusTypeWriter</a> *writer,
<a name="l02399"></a>02399 <a class="code" href="structDBusTypeReader.html" title="The type reader is an iterator for reading values from a block of values.">DBusTypeReader</a> *reader,
<a name="l02400"></a>02400 <span class="keyword">const</span> <a class="code" href="structDBusTypeReader.html" title="The type reader is an iterator for reading values from a block of values.">DBusTypeReader</a> *start_after)
<a name="l02401"></a>02401 {
<a name="l02402"></a>02402 <span class="keywordflow">if</span> (start_after)
<a name="l02403"></a>02403 {
<a name="l02404"></a>02404 <span class="keywordflow">if</span> (!writer-><a class="code" href="structDBusTypeWriter.html#a52c8617918c108d36b947cbdfc99c6ea" title="whether to write values">enabled</a> && _dbus_type_reader_greater_than (reader, start_after))
<a name="l02405"></a>02405 {
<a name="l02406"></a>02406 _dbus_type_writer_set_enabled (writer, <a class="code" href="group__DBusMacros.html#gaa8cecfc5c5c054d2875c03e77b7be15d" title="Expands to "1".">TRUE</a>);
<a name="l02407"></a>02407 <span class="preprocessor">#if RECURSIVE_MARSHAL_WRITE_TRACE</span>
<a name="l02408"></a>02408 <span class="preprocessor"></span> _dbus_verbose (<span class="stringliteral">"ENABLING writer %p at %d because reader at value_pos %d is after reader at value_pos %d\n"</span>,
<a name="l02409"></a>02409 writer, writer-><a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a>, reader-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a>, start_after-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a>);
<a name="l02410"></a>02410 <span class="preprocessor">#endif</span>
<a name="l02411"></a>02411 <span class="preprocessor"></span> }
<a name="l02412"></a>02412
<a name="l02413"></a>02413 _dbus_assert ((!writer-><a class="code" href="structDBusTypeWriter.html#a52c8617918c108d36b947cbdfc99c6ea" title="whether to write values">enabled</a> && !_dbus_type_reader_greater_than (reader, start_after)) ||
<a name="l02414"></a>02414 (writer-><a class="code" href="structDBusTypeWriter.html#a52c8617918c108d36b947cbdfc99c6ea" title="whether to write values">enabled</a> && _dbus_type_reader_greater_than (reader, start_after)));
<a name="l02415"></a>02415 }
<a name="l02416"></a>02416 }
<a name="l02417"></a>02417
<a name="l02418"></a>02418 <span class="keyword">static</span> <a class="code" href="group__DBusTypes.html#ga39c9cb0f3a2a8ad6f55cc4855d035349" title="A boolean, valid values are TRUE and FALSE.">dbus_bool_t</a>
<a name="l02419"></a>02419 append_fixup (<a class="code" href="structDBusList.html" title="A node in a linked list.">DBusList</a> **fixups,
<a name="l02420"></a>02420 <span class="keyword">const</span> <a class="code" href="structDBusArrayLenFixup.html" title="When modifying an existing block of values, array lengths may need to be adjusted; those adjustments ...">DBusArrayLenFixup</a> *fixup)
<a name="l02421"></a>02421 {
<a name="l02422"></a>02422 <a class="code" href="structDBusArrayLenFixup.html" title="When modifying an existing block of values, array lengths may need to be adjusted; those adjustments ...">DBusArrayLenFixup</a> *f;
<a name="l02423"></a>02423
<a name="l02424"></a>02424 f = <a class="code" href="group__DBusMemory.html#ga54ccb556e7964112a825a7f46c156ca0" title="Safe macro for using dbus_malloc().">dbus_new</a> (<a class="code" href="structDBusArrayLenFixup.html" title="When modifying an existing block of values, array lengths may need to be adjusted; those adjustments ...">DBusArrayLenFixup</a>, 1);
<a name="l02425"></a>02425 <span class="keywordflow">if</span> (f == <a class="code" href="group__DBusMacros.html#ga070d2ce7b6bb7e5c05602aa8c308d0c4" title="A null pointer, defined appropriately for C or C++.">NULL</a>)
<a name="l02426"></a>02426 <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#gaa93f0eb578d23995850d61f7d61c55c1" title="Expands to "0".">FALSE</a>;
<a name="l02427"></a>02427
<a name="l02428"></a>02428 *f = *fixup;
<a name="l02429"></a>02429
<a name="l02430"></a>02430 <span class="keywordflow">if</span> (!<a class="code" href="group__DBusList.html#gad99045e79db46159babe69718f343053" title="Appends a value to the list.">_dbus_list_append</a> (fixups, f))
<a name="l02431"></a>02431 {
<a name="l02432"></a>02432 <a class="code" href="group__DBusMemory.html#ga34e666b19b015035a9a31e53da84b39a" title="Frees a block of memory previously allocated by dbus_malloc() or dbus_malloc0().">dbus_free</a> (f);
<a name="l02433"></a>02433 <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#gaa93f0eb578d23995850d61f7d61c55c1" title="Expands to "0".">FALSE</a>;
<a name="l02434"></a>02434 }
<a name="l02435"></a>02435
<a name="l02436"></a>02436 _dbus_assert (f-><a class="code" href="structDBusArrayLenFixup.html#aad03f6087695c9e9b409817ac34c6e2b" title="where the length was in the original block">len_pos_in_reader</a> == fixup-><a class="code" href="structDBusArrayLenFixup.html#aad03f6087695c9e9b409817ac34c6e2b" title="where the length was in the original block">len_pos_in_reader</a>);
<a name="l02437"></a>02437 _dbus_assert (f-><a class="code" href="structDBusArrayLenFixup.html#a97cccea61d89992e6ad3a19bd569dd2f" title="the new value of the length in the written-out block">new_len</a> == fixup-><a class="code" href="structDBusArrayLenFixup.html#a97cccea61d89992e6ad3a19bd569dd2f" title="the new value of the length in the written-out block">new_len</a>);
<a name="l02438"></a>02438
<a name="l02439"></a>02439 <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#gaa8cecfc5c5c054d2875c03e77b7be15d" title="Expands to "1".">TRUE</a>;
<a name="l02440"></a>02440 }
<a name="l02441"></a>02441
<a name="l02442"></a>02442 <span class="comment">/* This loop is trivial if you ignore all the start_after nonsense,</span>
<a name="l02443"></a>02443 <span class="comment"> * so if you're trying to figure it out, start by ignoring that</span>
<a name="l02444"></a>02444 <span class="comment"> */</span>
<a name="l02445"></a>02445 <span class="keyword">static</span> <a class="code" href="group__DBusTypes.html#ga39c9cb0f3a2a8ad6f55cc4855d035349" title="A boolean, valid values are TRUE and FALSE.">dbus_bool_t</a>
<a name="l02446"></a>02446 writer_write_reader_helper (<a class="code" href="structDBusTypeWriter.html" title="The type writer is an iterator for writing to a block of values.">DBusTypeWriter</a> *writer,
<a name="l02447"></a>02447 <a class="code" href="structDBusTypeReader.html" title="The type reader is an iterator for reading values from a block of values.">DBusTypeReader</a> *reader,
<a name="l02448"></a>02448 <span class="keyword">const</span> <a class="code" href="structDBusTypeReader.html" title="The type reader is an iterator for reading values from a block of values.">DBusTypeReader</a> *start_after,
<a name="l02449"></a>02449 <span class="keywordtype">int</span> start_after_new_pos,
<a name="l02450"></a>02450 <span class="keywordtype">int</span> start_after_new_len,
<a name="l02451"></a>02451 <a class="code" href="structDBusList.html" title="A node in a linked list.">DBusList</a> **fixups,
<a name="l02452"></a>02452 <a class="code" href="group__DBusTypes.html#ga39c9cb0f3a2a8ad6f55cc4855d035349" title="A boolean, valid values are TRUE and FALSE.">dbus_bool_t</a> inside_start_after)
<a name="l02453"></a>02453 {
<a name="l02454"></a>02454 <span class="keywordtype">int</span> current_type;
<a name="l02455"></a>02455
<a name="l02456"></a>02456 <span class="keywordflow">while</span> ((current_type = <a class="code" href="group__DBusMarshal.html#gab8e39cb8084247d54d7f272c51622a73" title="Gets the type of the value the reader is currently pointing to; or for a types-only reader gets the t...">_dbus_type_reader_get_current_type</a> (reader)) != <a class="code" href="group__DBusProtocol.html#gaa9588da889743b2119dc6664712ae51e" title="Type code that is never equal to a legitimate type code.">DBUS_TYPE_INVALID</a>)
<a name="l02457"></a>02457 {
<a name="l02458"></a>02458 <span class="keywordflow">if</span> (<a class="code" href="group__DBusSignature.html#gaa0c4c8aa34fa266daa55bd37bdad39b8" title="A "container type" can contain basic types, or nested container types.">dbus_type_is_container</a> (current_type))
<a name="l02459"></a>02459 {
<a name="l02460"></a>02460 <a class="code" href="structDBusTypeReader.html" title="The type reader is an iterator for reading values from a block of values.">DBusTypeReader</a> subreader;
<a name="l02461"></a>02461 <a class="code" href="structDBusTypeWriter.html" title="The type writer is an iterator for writing to a block of values.">DBusTypeWriter</a> subwriter;
<a name="l02462"></a>02462 <span class="keyword">const</span> <a class="code" href="structDBusString.html">DBusString</a> *sig_str;
<a name="l02463"></a>02463 <span class="keywordtype">int</span> sig_start;
<a name="l02464"></a>02464 <span class="keywordtype">int</span> sig_len;
<a name="l02465"></a>02465 <a class="code" href="group__DBusTypes.html#ga39c9cb0f3a2a8ad6f55cc4855d035349" title="A boolean, valid values are TRUE and FALSE.">dbus_bool_t</a> enabled_at_recurse;
<a name="l02466"></a>02466 <a class="code" href="group__DBusTypes.html#ga39c9cb0f3a2a8ad6f55cc4855d035349" title="A boolean, valid values are TRUE and FALSE.">dbus_bool_t</a> past_start_after;
<a name="l02467"></a>02467 <span class="keywordtype">int</span> reader_array_len_pos;
<a name="l02468"></a>02468 <span class="keywordtype">int</span> reader_array_start_pos;
<a name="l02469"></a>02469 <a class="code" href="group__DBusTypes.html#ga39c9cb0f3a2a8ad6f55cc4855d035349" title="A boolean, valid values are TRUE and FALSE.">dbus_bool_t</a> this_is_start_after;
<a name="l02470"></a>02470
<a name="l02471"></a>02471 <span class="comment">/* type_pos is checked since e.g. in a struct the struct</span>
<a name="l02472"></a>02472 <span class="comment"> * and its first field have the same value_pos.</span>
<a name="l02473"></a>02473 <span class="comment"> * type_str will differ in reader/start_after for variants</span>
<a name="l02474"></a>02474 <span class="comment"> * where type_str is inside the value_str</span>
<a name="l02475"></a>02475 <span class="comment"> */</span>
<a name="l02476"></a>02476 <span class="keywordflow">if</span> (!inside_start_after && start_after &&
<a name="l02477"></a>02477 reader-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a> == start_after-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a> &&
<a name="l02478"></a>02478 reader-><a class="code" href="structDBusTypeReader.html#af52e270ededd0aabb642c6130a3e9e40" title="string containing signature of block">type_str</a> == start_after-><a class="code" href="structDBusTypeReader.html#af52e270ededd0aabb642c6130a3e9e40" title="string containing signature of block">type_str</a> &&
<a name="l02479"></a>02479 reader-><a class="code" href="structDBusTypeReader.html#a160a55f9869e297572c5aa5b6ce7bc71" title="current position in signature">type_pos</a> == start_after-><a class="code" href="structDBusTypeReader.html#a160a55f9869e297572c5aa5b6ce7bc71" title="current position in signature">type_pos</a>)
<a name="l02480"></a>02480 this_is_start_after = <a class="code" href="group__DBusMacros.html#gaa8cecfc5c5c054d2875c03e77b7be15d" title="Expands to "1".">TRUE</a>;
<a name="l02481"></a>02481 <span class="keywordflow">else</span>
<a name="l02482"></a>02482 this_is_start_after = <a class="code" href="group__DBusMacros.html#gaa93f0eb578d23995850d61f7d61c55c1" title="Expands to "0".">FALSE</a>;
<a name="l02483"></a>02483
<a name="l02484"></a>02484 <a class="code" href="group__DBusMarshal.html#ga082b410820c74b2a6ca816a8e0c91803" title="Initialize a new reader pointing to the first type and corresponding value that's a child of the curr...">_dbus_type_reader_recurse</a> (reader, &subreader);
<a name="l02485"></a>02485
<a name="l02486"></a>02486 <span class="keywordflow">if</span> (current_type == <a class="code" href="group__DBusProtocol.html#ga8912f600f81a773066ca03d9163613a9" title="Type code marking a D-Bus array type.">DBUS_TYPE_ARRAY</a>)
<a name="l02487"></a>02487 {
<a name="l02488"></a>02488 reader_array_len_pos = <a class="code" href="group__DBusMarshal.html#gacca774d24b7d7e790b169f23d3362497" title="compute position of array length given array_len_offset, which is the offset back from start_pos to e...">ARRAY_READER_LEN_POS</a> (&subreader);
<a name="l02489"></a>02489 reader_array_start_pos = subreader.<a class="code" href="structDBusTypeReader.html#ada12bed6758840dc19b1fcb271fb01be" title="class-specific data">u</a>.array.start_pos;
<a name="l02490"></a>02490 }
<a name="l02491"></a>02491 <span class="keywordflow">else</span>
<a name="l02492"></a>02492 {
<a name="l02493"></a>02493 <span class="comment">/* quiet gcc */</span>
<a name="l02494"></a>02494 reader_array_len_pos = -1;
<a name="l02495"></a>02495 reader_array_start_pos = -1;
<a name="l02496"></a>02496 }
<a name="l02497"></a>02497
<a name="l02498"></a>02498 <a class="code" href="group__DBusMarshal.html#ga4578cc623c8b0978ca780ce0ab950fdb" title="Gets the string and range of said string containing the signature of the current value.">_dbus_type_reader_get_signature</a> (&subreader, &sig_str,
<a name="l02499"></a>02499 &sig_start, &sig_len);
<a name="l02500"></a>02500
<a name="l02501"></a>02501 <span class="preprocessor">#if RECURSIVE_MARSHAL_WRITE_TRACE</span>
<a name="l02502"></a>02502 <span class="preprocessor"></span> _dbus_verbose (<span class="stringliteral">"about to recurse into %s reader at %d subreader at %d writer at %d start_after reader at %d write target len %d inside_start_after = %d this_is_start_after = %d\n"</span>,
<a name="l02503"></a>02503 <a class="code" href="group__DBusMarshal.html#ga48a595c2b26dce6e9c25ce040e5247e5" title="Returns a string describing the given type.">_dbus_type_to_string</a> (current_type),
<a name="l02504"></a>02504 reader-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a>,
<a name="l02505"></a>02505 subreader.<a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a>,
<a name="l02506"></a>02506 writer-><a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a>,
<a name="l02507"></a>02507 start_after ? start_after-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a> : -1,
<a name="l02508"></a>02508 <a class="code" href="group__DBusString.html#gaa5136e6fd2c5188f4b88de7863369c6d" title="Gets the length of a string (not including nul termination).">_dbus_string_get_length</a> (writer-><a class="code" href="structDBusTypeWriter.html#aa4e4b3af31fd7a93d0e54d10882bcc07" title="where to write values">value_str</a>),
<a name="l02509"></a>02509 inside_start_after, this_is_start_after);
<a name="l02510"></a>02510 <span class="preprocessor">#endif</span>
<a name="l02511"></a>02511 <span class="preprocessor"></span>
<a name="l02512"></a>02512 <span class="keywordflow">if</span> (!inside_start_after && !this_is_start_after)
<a name="l02513"></a>02513 enable_if_after (writer, &subreader, start_after);
<a name="l02514"></a>02514 enabled_at_recurse = writer-><a class="code" href="structDBusTypeWriter.html#a52c8617918c108d36b947cbdfc99c6ea" title="whether to write values">enabled</a>;
<a name="l02515"></a>02515 <span class="keywordflow">if</span> (!_dbus_type_writer_recurse_contained_len (writer, current_type,
<a name="l02516"></a>02516 sig_str, sig_start, sig_len,
<a name="l02517"></a>02517 &subwriter, <a class="code" href="group__DBusMacros.html#gaa93f0eb578d23995850d61f7d61c55c1" title="Expands to "0".">FALSE</a>))
<a name="l02518"></a>02518 <span class="keywordflow">goto</span> oom;
<a name="l02519"></a>02519
<a name="l02520"></a>02520 <span class="preprocessor">#if RECURSIVE_MARSHAL_WRITE_TRACE</span>
<a name="l02521"></a>02521 <span class="preprocessor"></span> _dbus_verbose (<span class="stringliteral">"recursed into subwriter at %d write target len %d\n"</span>,
<a name="l02522"></a>02522 subwriter.<a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a>,
<a name="l02523"></a>02523 <a class="code" href="group__DBusString.html#gaa5136e6fd2c5188f4b88de7863369c6d" title="Gets the length of a string (not including nul termination).">_dbus_string_get_length</a> (subwriter.<a class="code" href="structDBusTypeWriter.html#aa4e4b3af31fd7a93d0e54d10882bcc07" title="where to write values">value_str</a>));
<a name="l02524"></a>02524 <span class="preprocessor">#endif</span>
<a name="l02525"></a>02525 <span class="preprocessor"></span>
<a name="l02526"></a>02526 <span class="keywordflow">if</span> (!writer_write_reader_helper (&subwriter, &subreader, start_after,
<a name="l02527"></a>02527 start_after_new_pos, start_after_new_len,
<a name="l02528"></a>02528 fixups,
<a name="l02529"></a>02529 inside_start_after ||
<a name="l02530"></a>02530 this_is_start_after))
<a name="l02531"></a>02531 <span class="keywordflow">goto</span> oom;
<a name="l02532"></a>02532
<a name="l02533"></a>02533 <span class="preprocessor">#if RECURSIVE_MARSHAL_WRITE_TRACE</span>
<a name="l02534"></a>02534 <span class="preprocessor"></span> _dbus_verbose (<span class="stringliteral">"about to unrecurse from %s subreader at %d writer at %d subwriter at %d write target len %d\n"</span>,
<a name="l02535"></a>02535 <a class="code" href="group__DBusMarshal.html#ga48a595c2b26dce6e9c25ce040e5247e5" title="Returns a string describing the given type.">_dbus_type_to_string</a> (current_type),
<a name="l02536"></a>02536 subreader.<a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a>,
<a name="l02537"></a>02537 writer-><a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a>,
<a name="l02538"></a>02538 subwriter.<a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a>,
<a name="l02539"></a>02539 <a class="code" href="group__DBusString.html#gaa5136e6fd2c5188f4b88de7863369c6d" title="Gets the length of a string (not including nul termination).">_dbus_string_get_length</a> (writer-><a class="code" href="structDBusTypeWriter.html#aa4e4b3af31fd7a93d0e54d10882bcc07" title="where to write values">value_str</a>));
<a name="l02540"></a>02540 <span class="preprocessor">#endif</span>
<a name="l02541"></a>02541 <span class="preprocessor"></span>
<a name="l02542"></a>02542 <span class="keywordflow">if</span> (!inside_start_after && !this_is_start_after)
<a name="l02543"></a>02543 enable_if_after (writer, &subreader, start_after);
<a name="l02544"></a>02544 past_start_after = writer-><a class="code" href="structDBusTypeWriter.html#a52c8617918c108d36b947cbdfc99c6ea" title="whether to write values">enabled</a>;
<a name="l02545"></a>02545 <span class="keywordflow">if</span> (!<a class="code" href="group__DBusMarshal.html#gacbe7eddf4f9c19da91b742087fcc111a" title="Closes a container created by _dbus_type_writer_recurse() and writes any additional information to th...">_dbus_type_writer_unrecurse</a> (writer, &subwriter))
<a name="l02546"></a>02546 <span class="keywordflow">goto</span> oom;
<a name="l02547"></a>02547
<a name="l02548"></a>02548 <span class="comment">/* If we weren't enabled when we recursed, we didn't</span>
<a name="l02549"></a>02549 <span class="comment"> * write an array len; if we passed start_after</span>
<a name="l02550"></a>02550 <span class="comment"> * somewhere inside the array, then we need to generate</span>
<a name="l02551"></a>02551 <span class="comment"> * a fixup.</span>
<a name="l02552"></a>02552 <span class="comment"> */</span>
<a name="l02553"></a>02553 <span class="keywordflow">if</span> (start_after != <a class="code" href="group__DBusMacros.html#ga070d2ce7b6bb7e5c05602aa8c308d0c4" title="A null pointer, defined appropriately for C or C++.">NULL</a> &&
<a name="l02554"></a>02554 !enabled_at_recurse && past_start_after &&
<a name="l02555"></a>02555 current_type == <a class="code" href="group__DBusProtocol.html#ga8912f600f81a773066ca03d9163613a9" title="Type code marking a D-Bus array type.">DBUS_TYPE_ARRAY</a> &&
<a name="l02556"></a>02556 fixups != <a class="code" href="group__DBusMacros.html#ga070d2ce7b6bb7e5c05602aa8c308d0c4" title="A null pointer, defined appropriately for C or C++.">NULL</a>)
<a name="l02557"></a>02557 {
<a name="l02558"></a>02558 <a class="code" href="structDBusArrayLenFixup.html" title="When modifying an existing block of values, array lengths may need to be adjusted; those adjustments ...">DBusArrayLenFixup</a> fixup;
<a name="l02559"></a>02559 <span class="keywordtype">int</span> bytes_written_after_start_after;
<a name="l02560"></a>02560 <span class="keywordtype">int</span> bytes_before_start_after;
<a name="l02561"></a>02561 <span class="keywordtype">int</span> old_len;
<a name="l02562"></a>02562
<a name="l02563"></a>02563 <span class="comment">/* this subwriter access is moderately unkosher since we</span>
<a name="l02564"></a>02564 <span class="comment"> * already unrecursed, but it works as long as unrecurse</span>
<a name="l02565"></a>02565 <span class="comment"> * doesn't break us on purpose</span>
<a name="l02566"></a>02566 <span class="comment"> */</span>
<a name="l02567"></a>02567 bytes_written_after_start_after = writer_get_array_len (&subwriter);
<a name="l02568"></a>02568
<a name="l02569"></a>02569 bytes_before_start_after =
<a name="l02570"></a>02570 start_after-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a> - reader_array_start_pos;
<a name="l02571"></a>02571
<a name="l02572"></a>02572 fixup.<a class="code" href="structDBusArrayLenFixup.html#aad03f6087695c9e9b409817ac34c6e2b" title="where the length was in the original block">len_pos_in_reader</a> = reader_array_len_pos;
<a name="l02573"></a>02573 fixup.<a class="code" href="structDBusArrayLenFixup.html#a97cccea61d89992e6ad3a19bd569dd2f" title="the new value of the length in the written-out block">new_len</a> =
<a name="l02574"></a>02574 bytes_before_start_after +
<a name="l02575"></a>02575 start_after_new_len +
<a name="l02576"></a>02576 bytes_written_after_start_after;
<a name="l02577"></a>02577
<a name="l02578"></a>02578 _dbus_assert (_DBUS_ALIGN_VALUE (fixup.<a class="code" href="structDBusArrayLenFixup.html#aad03f6087695c9e9b409817ac34c6e2b" title="where the length was in the original block">len_pos_in_reader</a>, 4) ==
<a name="l02579"></a>02579 (<span class="keywordtype">unsigned</span>) fixup.<a class="code" href="structDBusArrayLenFixup.html#aad03f6087695c9e9b409817ac34c6e2b" title="where the length was in the original block">len_pos_in_reader</a>);
<a name="l02580"></a>02580
<a name="l02581"></a>02581 old_len = <a class="code" href="group__DBusMarshal.html#ga50a9187b315cfcd6b311ed1b36488c05" title="Unpacks a 32 bit unsigned integer from a data pointer.">_dbus_unpack_uint32</a> (reader-><a class="code" href="structDBusTypeReader.html#aeb0846d954066f420e1df98b81148702" title="byte order of the block">byte_order</a>,
<a name="l02582"></a>02582 <a class="code" href="group__DBusString.html#ga8c202a65e938f9bdb859fc6705a4f1bb" title="const version of _dbus_string_get_data_len().">_dbus_string_get_const_data_len</a> (reader-><a class="code" href="structDBusTypeReader.html#a4065d7775758beb044ee23a71875571f" title="string containing values of block">value_str</a>,
<a name="l02583"></a>02583 fixup.<a class="code" href="structDBusArrayLenFixup.html#aad03f6087695c9e9b409817ac34c6e2b" title="where the length was in the original block">len_pos_in_reader</a>, 4));
<a name="l02584"></a>02584
<a name="l02585"></a>02585 <span class="keywordflow">if</span> (old_len != fixup.<a class="code" href="structDBusArrayLenFixup.html#a97cccea61d89992e6ad3a19bd569dd2f" title="the new value of the length in the written-out block">new_len</a> && !append_fixup (fixups, &fixup))
<a name="l02586"></a>02586 <span class="keywordflow">goto</span> oom;
<a name="l02587"></a>02587
<a name="l02588"></a>02588 <span class="preprocessor">#if RECURSIVE_MARSHAL_WRITE_TRACE</span>
<a name="l02589"></a>02589 <span class="preprocessor"></span> _dbus_verbose (<span class="stringliteral">"Generated fixup len_pos_in_reader = %d new_len = %d reader_array_start_pos = %d start_after->value_pos = %d bytes_before_start_after = %d start_after_new_len = %d bytes_written_after_start_after = %d\n"</span>,
<a name="l02590"></a>02590 fixup.<a class="code" href="structDBusArrayLenFixup.html#aad03f6087695c9e9b409817ac34c6e2b" title="where the length was in the original block">len_pos_in_reader</a>,
<a name="l02591"></a>02591 fixup.<a class="code" href="structDBusArrayLenFixup.html#a97cccea61d89992e6ad3a19bd569dd2f" title="the new value of the length in the written-out block">new_len</a>,
<a name="l02592"></a>02592 reader_array_start_pos,
<a name="l02593"></a>02593 start_after-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a>,
<a name="l02594"></a>02594 bytes_before_start_after,
<a name="l02595"></a>02595 start_after_new_len,
<a name="l02596"></a>02596 bytes_written_after_start_after);
<a name="l02597"></a>02597 <span class="preprocessor">#endif</span>
<a name="l02598"></a>02598 <span class="preprocessor"></span> }
<a name="l02599"></a>02599 }
<a name="l02600"></a>02600 <span class="keywordflow">else</span>
<a name="l02601"></a>02601 {
<a name="l02602"></a>02602 <a class="code" href="unionDBusBasicValue.html" title="A simple value union that lets you access bytes as if they were various types; useful when dealing wi...">DBusBasicValue</a> val;
<a name="l02603"></a>02603
<a name="l02604"></a>02604 _dbus_assert (<a class="code" href="group__DBusSignature.html#ga2d8afef7d754cf15d6b9733f00654c0e" title="A "basic type" is a somewhat arbitrary concept, but the intent is to include those types that are ful...">dbus_type_is_basic</a> (current_type));
<a name="l02605"></a>02605
<a name="l02606"></a>02606 <span class="preprocessor">#if RECURSIVE_MARSHAL_WRITE_TRACE</span>
<a name="l02607"></a>02607 <span class="preprocessor"></span> _dbus_verbose (<span class="stringliteral">"Reading basic value %s at %d\n"</span>,
<a name="l02608"></a>02608 <a class="code" href="group__DBusMarshal.html#ga48a595c2b26dce6e9c25ce040e5247e5" title="Returns a string describing the given type.">_dbus_type_to_string</a> (current_type),
<a name="l02609"></a>02609 reader-><a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a>);
<a name="l02610"></a>02610 <span class="preprocessor">#endif</span>
<a name="l02611"></a>02611 <span class="preprocessor"></span>
<a name="l02612"></a>02612 <a class="code" href="group__DBusMarshal.html#gaa54355ee98d6721d7a29b5ae7d92eb9a" title="Reads a basic-typed value, as with _dbus_marshal_read_basic().">_dbus_type_reader_read_basic</a> (reader, &val);
<a name="l02613"></a>02613
<a name="l02614"></a>02614 <span class="preprocessor">#if RECURSIVE_MARSHAL_WRITE_TRACE</span>
<a name="l02615"></a>02615 <span class="preprocessor"></span> _dbus_verbose (<span class="stringliteral">"Writing basic value %s at %d write target len %d inside_start_after = %d\n"</span>,
<a name="l02616"></a>02616 <a class="code" href="group__DBusMarshal.html#ga48a595c2b26dce6e9c25ce040e5247e5" title="Returns a string describing the given type.">_dbus_type_to_string</a> (current_type),
<a name="l02617"></a>02617 writer-><a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a>,
<a name="l02618"></a>02618 <a class="code" href="group__DBusString.html#gaa5136e6fd2c5188f4b88de7863369c6d" title="Gets the length of a string (not including nul termination).">_dbus_string_get_length</a> (writer-><a class="code" href="structDBusTypeWriter.html#aa4e4b3af31fd7a93d0e54d10882bcc07" title="where to write values">value_str</a>),
<a name="l02619"></a>02619 inside_start_after);
<a name="l02620"></a>02620 <span class="preprocessor">#endif</span>
<a name="l02621"></a>02621 <span class="preprocessor"></span> <span class="keywordflow">if</span> (!inside_start_after)
<a name="l02622"></a>02622 enable_if_after (writer, reader, start_after);
<a name="l02623"></a>02623 <span class="keywordflow">if</span> (!<a class="code" href="group__DBusMarshal.html#ga0103b0214766b0ff1ca05bcc7f1e631b" title="Writes out a basic type.">_dbus_type_writer_write_basic</a> (writer, current_type, &val))
<a name="l02624"></a>02624 <span class="keywordflow">goto</span> oom;
<a name="l02625"></a>02625 <span class="preprocessor">#if RECURSIVE_MARSHAL_WRITE_TRACE</span>
<a name="l02626"></a>02626 <span class="preprocessor"></span> _dbus_verbose (<span class="stringliteral">"Wrote basic value %s, new value_pos %d write target len %d\n"</span>,
<a name="l02627"></a>02627 <a class="code" href="group__DBusMarshal.html#ga48a595c2b26dce6e9c25ce040e5247e5" title="Returns a string describing the given type.">_dbus_type_to_string</a> (current_type),
<a name="l02628"></a>02628 writer-><a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a>,
<a name="l02629"></a>02629 <a class="code" href="group__DBusString.html#gaa5136e6fd2c5188f4b88de7863369c6d" title="Gets the length of a string (not including nul termination).">_dbus_string_get_length</a> (writer-><a class="code" href="structDBusTypeWriter.html#aa4e4b3af31fd7a93d0e54d10882bcc07" title="where to write values">value_str</a>));
<a name="l02630"></a>02630 <span class="preprocessor">#endif</span>
<a name="l02631"></a>02631 <span class="preprocessor"></span> }
<a name="l02632"></a>02632
<a name="l02633"></a>02633 <a class="code" href="group__DBusMarshal.html#ga746c09512d4905f2d2fac7ed4c3c63c2" title="Skip to the next value on this "level".">_dbus_type_reader_next</a> (reader);
<a name="l02634"></a>02634 }
<a name="l02635"></a>02635
<a name="l02636"></a>02636 <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#gaa8cecfc5c5c054d2875c03e77b7be15d" title="Expands to "1".">TRUE</a>;
<a name="l02637"></a>02637
<a name="l02638"></a>02638 oom:
<a name="l02639"></a>02639 <span class="keywordflow">if</span> (fixups)
<a name="l02640"></a>02640 apply_and_free_fixups (fixups, <a class="code" href="group__DBusMacros.html#ga070d2ce7b6bb7e5c05602aa8c308d0c4" title="A null pointer, defined appropriately for C or C++.">NULL</a>); <span class="comment">/* NULL for reader to apply to */</span>
<a name="l02641"></a>02641
<a name="l02642"></a>02642 <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#gaa93f0eb578d23995850d61f7d61c55c1" title="Expands to "0".">FALSE</a>;
<a name="l02643"></a>02643 }
<a name="l02644"></a>02644
<a name="l02645"></a>02645 <span class="comment">/*</span>
<a name="l02646"></a>02646 <span class="comment"> * Iterate through all values in the given reader, writing a copy of</span>
<a name="l02647"></a>02647 <span class="comment"> * each value to the writer. The reader will be moved forward to its</span>
<a name="l02648"></a>02648 <span class="comment"> * end position.</span>
<a name="l02649"></a>02649 <span class="comment"> *</span>
<a name="l02650"></a>02650 <span class="comment"> * If a reader start_after is provided, it should be a reader for the</span>
<a name="l02651"></a>02651 <span class="comment"> * same data as the reader to be written. Only values occurring after</span>
<a name="l02652"></a>02652 <span class="comment"> * the value pointed to by start_after will be written to the writer.</span>
<a name="l02653"></a>02653 <span class="comment"> *</span>
<a name="l02654"></a>02654 <span class="comment"> * If start_after is provided, then the copy of the reader will be</span>
<a name="l02655"></a>02655 <span class="comment"> * partial. This means that array lengths will not have been copied.</span>
<a name="l02656"></a>02656 <span class="comment"> * The assumption is that you wrote a new version of the value at</span>
<a name="l02657"></a>02657 <span class="comment"> * start_after to the writer. You have to pass in the start position</span>
<a name="l02658"></a>02658 <span class="comment"> * and length of the new value. (If you are deleting the value</span>
<a name="l02659"></a>02659 <span class="comment"> * at start_after, pass in 0 for the length.)</span>
<a name="l02660"></a>02660 <span class="comment"> *</span>
<a name="l02661"></a>02661 <span class="comment"> * If the fixups parameter is non-#NULL, then any array length that</span>
<a name="l02662"></a>02662 <span class="comment"> * was read but not written due to start_after will be provided</span>
<a name="l02663"></a>02663 <span class="comment"> * as a #DBusArrayLenFixup. The fixup contains the position of the</span>
<a name="l02664"></a>02664 <span class="comment"> * array length in the source data, and the correct array length</span>
<a name="l02665"></a>02665 <span class="comment"> * assuming you combine the source data before start_after with</span>
<a name="l02666"></a>02666 <span class="comment"> * the written data at start_after and beyond.</span>
<a name="l02667"></a>02667 <span class="comment"> *</span>
<a name="l02668"></a>02668 <span class="comment"> * @param writer the writer to copy to</span>
<a name="l02669"></a>02669 <span class="comment"> * @param reader the reader to copy from</span>
<a name="l02670"></a>02670 <span class="comment"> * @param start_after #NULL or a reader showing where to start</span>
<a name="l02671"></a>02671 <span class="comment"> * @param start_after_new_pos the position of start_after equivalent in the target data</span>
<a name="l02672"></a>02672 <span class="comment"> * @param start_after_new_len the length of start_after equivalent in the target data</span>
<a name="l02673"></a>02673 <span class="comment"> * @param fixups list to append #DBusArrayLenFixup if the write was partial</span>
<a name="l02674"></a>02674 <span class="comment"> * @returns #FALSE if no memory</span>
<a name="l02675"></a>02675 <span class="comment"> */</span>
<a name="l02676"></a>02676 <span class="keyword">static</span> <a class="code" href="group__DBusTypes.html#ga39c9cb0f3a2a8ad6f55cc4855d035349" title="A boolean, valid values are TRUE and FALSE.">dbus_bool_t</a>
<a name="l02677"></a>02677 _dbus_type_writer_write_reader_partial (<a class="code" href="structDBusTypeWriter.html" title="The type writer is an iterator for writing to a block of values.">DBusTypeWriter</a> *writer,
<a name="l02678"></a>02678 <a class="code" href="structDBusTypeReader.html" title="The type reader is an iterator for reading values from a block of values.">DBusTypeReader</a> *reader,
<a name="l02679"></a>02679 <span class="keyword">const</span> <a class="code" href="structDBusTypeReader.html" title="The type reader is an iterator for reading values from a block of values.">DBusTypeReader</a> *start_after,
<a name="l02680"></a>02680 <span class="keywordtype">int</span> start_after_new_pos,
<a name="l02681"></a>02681 <span class="keywordtype">int</span> start_after_new_len,
<a name="l02682"></a>02682 <a class="code" href="structDBusList.html" title="A node in a linked list.">DBusList</a> **fixups)
<a name="l02683"></a>02683 {
<a name="l02684"></a>02684 <a class="code" href="structDBusTypeWriter.html" title="The type writer is an iterator for writing to a block of values.">DBusTypeWriter</a> orig;
<a name="l02685"></a>02685 <span class="keywordtype">int</span> orig_type_len;
<a name="l02686"></a>02686 <span class="keywordtype">int</span> orig_value_len;
<a name="l02687"></a>02687 <span class="keywordtype">int</span> new_bytes;
<a name="l02688"></a>02688 <span class="keywordtype">int</span> orig_enabled;
<a name="l02689"></a>02689
<a name="l02690"></a>02690 orig = *writer;
<a name="l02691"></a>02691 orig_type_len = <a class="code" href="group__DBusString.html#gaa5136e6fd2c5188f4b88de7863369c6d" title="Gets the length of a string (not including nul termination).">_dbus_string_get_length</a> (writer-><a class="code" href="structDBusTypeWriter.html#a95204ef3a9cf29ee31687032b142b836" title="where to write typecodes (or read type expectations)">type_str</a>);
<a name="l02692"></a>02692 orig_value_len = <a class="code" href="group__DBusString.html#gaa5136e6fd2c5188f4b88de7863369c6d" title="Gets the length of a string (not including nul termination).">_dbus_string_get_length</a> (writer-><a class="code" href="structDBusTypeWriter.html#aa4e4b3af31fd7a93d0e54d10882bcc07" title="where to write values">value_str</a>);
<a name="l02693"></a>02693 orig_enabled = writer-><a class="code" href="structDBusTypeWriter.html#a52c8617918c108d36b947cbdfc99c6ea" title="whether to write values">enabled</a>;
<a name="l02694"></a>02694
<a name="l02695"></a>02695 <span class="keywordflow">if</span> (start_after)
<a name="l02696"></a>02696 _dbus_type_writer_set_enabled (writer, <a class="code" href="group__DBusMacros.html#gaa93f0eb578d23995850d61f7d61c55c1" title="Expands to "0".">FALSE</a>);
<a name="l02697"></a>02697
<a name="l02698"></a>02698 <span class="keywordflow">if</span> (!writer_write_reader_helper (writer, reader, start_after,
<a name="l02699"></a>02699 start_after_new_pos,
<a name="l02700"></a>02700 start_after_new_len,
<a name="l02701"></a>02701 fixups, <a class="code" href="group__DBusMacros.html#gaa93f0eb578d23995850d61f7d61c55c1" title="Expands to "0".">FALSE</a>))
<a name="l02702"></a>02702 <span class="keywordflow">goto</span> oom;
<a name="l02703"></a>02703
<a name="l02704"></a>02704 _dbus_type_writer_set_enabled (writer, orig_enabled);
<a name="l02705"></a>02705 <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#gaa8cecfc5c5c054d2875c03e77b7be15d" title="Expands to "1".">TRUE</a>;
<a name="l02706"></a>02706
<a name="l02707"></a>02707 oom:
<a name="l02708"></a>02708 <span class="keywordflow">if</span> (!writer-><a class="code" href="structDBusTypeWriter.html#ae6db89e9a3adcd52678dc089810cfb0b" title="type_pos can be either an insertion point for or an expected next type">type_pos_is_expectation</a>)
<a name="l02709"></a>02709 {
<a name="l02710"></a>02710 new_bytes = <a class="code" href="group__DBusString.html#gaa5136e6fd2c5188f4b88de7863369c6d" title="Gets the length of a string (not including nul termination).">_dbus_string_get_length</a> (writer-><a class="code" href="structDBusTypeWriter.html#a95204ef3a9cf29ee31687032b142b836" title="where to write typecodes (or read type expectations)">type_str</a>) - orig_type_len;
<a name="l02711"></a>02711 <a class="code" href="group__DBusString.html#ga7e0e164ad5bb094e5ccad9edc7ae4235" title="Deletes a segment of a DBusString with length len starting at start.">_dbus_string_delete</a> (writer-><a class="code" href="structDBusTypeWriter.html#a95204ef3a9cf29ee31687032b142b836" title="where to write typecodes (or read type expectations)">type_str</a>, orig.<a class="code" href="structDBusTypeWriter.html#a77c19debc0427372f368cfe7188951f8" title="current pos in type_str">type_pos</a>, new_bytes);
<a name="l02712"></a>02712 }
<a name="l02713"></a>02713 new_bytes = <a class="code" href="group__DBusString.html#gaa5136e6fd2c5188f4b88de7863369c6d" title="Gets the length of a string (not including nul termination).">_dbus_string_get_length</a> (writer-><a class="code" href="structDBusTypeWriter.html#aa4e4b3af31fd7a93d0e54d10882bcc07" title="where to write values">value_str</a>) - orig_value_len;
<a name="l02714"></a>02714 <a class="code" href="group__DBusString.html#ga7e0e164ad5bb094e5ccad9edc7ae4235" title="Deletes a segment of a DBusString with length len starting at start.">_dbus_string_delete</a> (writer-><a class="code" href="structDBusTypeWriter.html#aa4e4b3af31fd7a93d0e54d10882bcc07" title="where to write values">value_str</a>, orig.<a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a>, new_bytes);
<a name="l02715"></a>02715
<a name="l02716"></a>02716 *writer = orig;
<a name="l02717"></a>02717
<a name="l02718"></a>02718 <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#gaa93f0eb578d23995850d61f7d61c55c1" title="Expands to "0".">FALSE</a>;
<a name="l02719"></a>02719 }
<a name="l02720"></a>02720
<a name="l02730"></a>02730 <a class="code" href="group__DBusTypes.html#ga39c9cb0f3a2a8ad6f55cc4855d035349" title="A boolean, valid values are TRUE and FALSE.">dbus_bool_t</a>
<a name="l02731"></a><a class="code" href="group__DBusMarshal.html#ga4905750705d220efe9dfc71f49bedc11">02731</a> <a class="code" href="group__DBusMarshal.html#ga4905750705d220efe9dfc71f49bedc11" title="Iterate through all values in the given reader, writing a copy of each value to the writer...">_dbus_type_writer_write_reader</a> (<a class="code" href="structDBusTypeWriter.html" title="The type writer is an iterator for writing to a block of values.">DBusTypeWriter</a> *writer,
<a name="l02732"></a>02732 <a class="code" href="structDBusTypeReader.html" title="The type reader is an iterator for reading values from a block of values.">DBusTypeReader</a> *reader)
<a name="l02733"></a>02733 {
<a name="l02734"></a>02734 <span class="keywordflow">return</span> _dbus_type_writer_write_reader_partial (writer, reader, <a class="code" href="group__DBusMacros.html#ga070d2ce7b6bb7e5c05602aa8c308d0c4" title="A null pointer, defined appropriately for C or C++.">NULL</a>, 0, 0, <a class="code" href="group__DBusMacros.html#ga070d2ce7b6bb7e5c05602aa8c308d0c4" title="A null pointer, defined appropriately for C or C++.">NULL</a>);
<a name="l02735"></a>02735 }
<a name="l02736"></a>02736
<a name="l02737"></a>02737 <span class="comment">/*</span>
<a name="l02738"></a>02738 <span class="comment"> * If disabled, a writer can still be iterated forward and recursed/unrecursed</span>
<a name="l02739"></a>02739 <span class="comment"> * but won't write any values. Types will still be written unless the</span>
<a name="l02740"></a>02740 <span class="comment"> * writer is a "values only" writer, because the writer needs access to</span>
<a name="l02741"></a>02741 <span class="comment"> * a valid signature to be able to iterate.</span>
<a name="l02742"></a>02742 <span class="comment"> *</span>
<a name="l02743"></a>02743 <span class="comment"> * @param writer the type writer</span>
<a name="l02744"></a>02744 <span class="comment"> * @param enabled #TRUE if values should be written</span>
<a name="l02745"></a>02745 <span class="comment"> */</span>
<a name="l02746"></a>02746 <span class="keyword">static</span> <span class="keywordtype">void</span>
<a name="l02747"></a>02747 _dbus_type_writer_set_enabled (<a class="code" href="structDBusTypeWriter.html" title="The type writer is an iterator for writing to a block of values.">DBusTypeWriter</a> *writer,
<a name="l02748"></a>02748 <a class="code" href="group__DBusTypes.html#ga39c9cb0f3a2a8ad6f55cc4855d035349" title="A boolean, valid values are TRUE and FALSE.">dbus_bool_t</a> enabled)
<a name="l02749"></a>02749 {
<a name="l02750"></a>02750 writer-><a class="code" href="structDBusTypeWriter.html#a52c8617918c108d36b947cbdfc99c6ea" title="whether to write values">enabled</a> = enabled != <a class="code" href="group__DBusMacros.html#gaa93f0eb578d23995850d61f7d61c55c1" title="Expands to "0".">FALSE</a>;
<a name="l02751"></a>02751 }
<a name="l02752"></a>02752 <span class="comment">/* end of DBusMarshal group */</span>
<a name="l02754"></a>02754
<a name="l02755"></a>02755 <span class="comment">/* tests in dbus-marshal-recursive-util.c */</span>
</pre></div></div><!-- contents -->
<hr class="footer"/><address class="footer"><small>
Generated on Thu Mar 3 2016 17:50:30 for D-Bus by  <a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.7.6.1
</small></address>
</body>
</html>