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
   &#160;<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&#160;Page</span></a></li>
      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
      <li><a href="modules.html"><span>Modules</span></a></li>
      <li><a href="annotated.html"><span>Data&#160;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&#160;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: &quot;gnu&quot;; 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 &lt;config.h&gt;</span>
<a name="l00025"></a>00025 <span class="preprocessor">#include &quot;dbus-marshal-recursive.h&quot;</span>
<a name="l00026"></a>00026 <span class="preprocessor">#include &quot;dbus-marshal-basic.h&quot;</span>
<a name="l00027"></a>00027 <span class="preprocessor">#include &quot;dbus-signature.h&quot;</span>
<a name="l00028"></a>00028 <span class="preprocessor">#include &quot;dbus-internals.h&quot;</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-&gt;<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">&quot; %d FIXUPS to apply\n&quot;</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-&gt;<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">&quot; applying FIXUP to reader %p at pos %d new_len = %d old len %d\n&quot;</span>,
<a name="l00101"></a>00101                          reader, f-&gt;<a class="code" href="structDBusArrayLenFixup.html#aad03f6087695c9e9b409817ac34c6e2b" title="where the length was in the original block">len_pos_in_reader</a>, f-&gt;<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-&gt;<a class="code" href="structDBusTypeReader.html#a4065d7775758beb044ee23a71875571f" title="string containing values of block">value_str</a>,
<a name="l00103"></a>00103                                                     f-&gt;<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-&gt;<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-&gt;<a class="code" href="structDBusTypeReader.html#a4065d7775758beb044ee23a71875571f" title="string containing values of block">value_str</a>,
<a name="l00108"></a>00108                                     f-&gt;<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-&gt;<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-&gt;<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-&gt;<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-&gt;<a class="code" href="structDBusTypeReader.html#aeb0846d954066f420e1df98b81148702" title="byte order of the block">byte_order</a> = byte_order;
<a name="l00154"></a>00154   reader-&gt;<a class="code" href="structDBusTypeReader.html#a551e64ee83df38ebda8c3677a91afe1b" title="marks we&#39;re at end iterator for cases where we don&#39;t have another way to tell">finished</a> = <a class="code" href="group__DBusMacros.html#gaa93f0eb578d23995850d61f7d61c55c1" title="Expands to &quot;0&quot;.">FALSE</a>;
<a name="l00155"></a>00155   reader-&gt;<a class="code" href="structDBusTypeReader.html#af52e270ededd0aabb642c6130a3e9e40" title="string containing signature of block">type_str</a> = type_str;
<a name="l00156"></a>00156   reader-&gt;<a class="code" href="structDBusTypeReader.html#a160a55f9869e297572c5aa5b6ce7bc71" title="current position in signature">type_pos</a> = type_pos;
<a name="l00157"></a>00157   reader-&gt;<a class="code" href="structDBusTypeReader.html#a4065d7775758beb044ee23a71875571f" title="string containing values of block">value_str</a> = value_str;
<a name="l00158"></a>00158   reader-&gt;<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-&gt;<a class="code" href="structDBusTypeReader.html#aeb0846d954066f420e1df98b81148702" title="byte order of the block">byte_order</a>,
<a name="l00168"></a>00168                parent-&gt;<a class="code" href="structDBusTypeReader.html#af52e270ededd0aabb642c6130a3e9e40" title="string containing signature of block">type_str</a>,
<a name="l00169"></a>00169                parent-&gt;<a class="code" href="structDBusTypeReader.html#a160a55f9869e297572c5aa5b6ce7bc71" title="current position in signature">type_pos</a>,
<a name="l00170"></a>00170                parent-&gt;<a class="code" href="structDBusTypeReader.html#a4065d7775758beb044ee23a71875571f" title="string containing values of block">value_str</a>,
<a name="l00171"></a>00171                parent-&gt;<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-&gt;<a class="code" href="structDBusTypeReader.html#af52e270ededd0aabb642c6130a3e9e40" title="string containing signature of block">type_str</a>,
<a name="l00181"></a>00181                                        sub-&gt;<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-&gt;<a class="code" href="structDBusTypeReader.html#af52e270ededd0aabb642c6130a3e9e40" title="string containing signature of block">type_str</a>,
<a name="l00183"></a>00183                                        sub-&gt;<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-&gt;<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-&gt;<a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a> = _DBUS_ALIGN_VALUE (sub-&gt;<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-&gt;<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-&gt;<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-&gt;<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)-&gt;u.array.start_pos - ((int)(reader)-&gt;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-&gt;<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-&gt;<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">&quot;   reader %p len_pos %d array len %u len_offset %d\n&quot;</span>,
<a name="l00231"></a>00231                  reader, len_pos, array_len, reader-&gt;<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-&gt;<a class="code" href="structDBusTypeReader.html#ada12bed6758840dc19b1fcb271fb01be" title="class-specific data">u</a>.array.start_pos - len_pos - 4 &lt; 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-&gt;<a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a> = _DBUS_ALIGN_VALUE (sub-&gt;<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-&gt;<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-&gt;<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-&gt;<a class="code" href="structDBusTypeReader.html#af52e270ededd0aabb642c6130a3e9e40" title="string containing signature of block">type_str</a>,
<a name="l00255"></a>00255                                           sub-&gt;<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-&gt;<a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a> = _DBUS_ALIGN_VALUE (sub-&gt;<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-&gt;<a class="code" href="structDBusTypeReader.html#ada12bed6758840dc19b1fcb271fb01be" title="class-specific data">u</a>.array.start_pos = sub-&gt;<a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a>;
<a name="l00260"></a>00260   _dbus_assert ((sub-&gt;<a class="code" href="structDBusTypeReader.html#ada12bed6758840dc19b1fcb271fb01be" title="class-specific data">u</a>.array.start_pos - (len_pos + 4)) &lt; 8); <span class="comment">/* only 3 bits in array_len_offset */</span>
<a name="l00261"></a>00261   sub-&gt;<a class="code" href="structDBusTypeReader.html#a930fb8d6c82f269b0a151cfb33df86b3" title="bytes back from start_pos that len ends">array_len_offset</a> = sub-&gt;<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">&quot;    type reader %p array start = %d len_offset = %d array len = %d array element type = %s\n&quot;</span>,
<a name="l00265"></a>00265                  sub,
<a name="l00266"></a>00266                  sub-&gt;<a class="code" href="structDBusTypeReader.html#ada12bed6758840dc19b1fcb271fb01be" title="class-specific data">u</a>.array.start_pos,
<a name="l00267"></a>00267                  sub-&gt;<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-&gt;<a class="code" href="structDBusTypeReader.html#af52e270ededd0aabb642c6130a3e9e40" title="string containing signature of block">type_str</a>,
<a name="l00270"></a>00270                                                                 sub-&gt;<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-&gt;<a class="code" href="structDBusTypeReader.html#a4065d7775758beb044ee23a71875571f" title="string containing values of block">value_str</a>, sub-&gt;<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-&gt;<a class="code" href="structDBusTypeReader.html#af52e270ededd0aabb642c6130a3e9e40" title="string containing signature of block">type_str</a> = sub-&gt;<a class="code" href="structDBusTypeReader.html#a4065d7775758beb044ee23a71875571f" title="string containing values of block">value_str</a>;
<a name="l00290"></a>00290   sub-&gt;<a class="code" href="structDBusTypeReader.html#a160a55f9869e297572c5aa5b6ce7bc71" title="current position in signature">type_pos</a> = sub-&gt;<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-&gt;<a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a> = sub-&gt;<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-&gt;<a class="code" href="structDBusTypeReader.html#af52e270ededd0aabb642c6130a3e9e40" title="string containing signature of block">type_str</a>,
<a name="l00295"></a>00295                                                                            sub-&gt;<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-&gt;<a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a> = _DBUS_ALIGN_VALUE (sub-&gt;<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">&quot;    type reader %p variant containing &#39;%s&#39;\n&quot;</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-&gt;<a class="code" href="structDBusTypeReader.html#af52e270ededd0aabb642c6130a3e9e40" title="string containing signature of block">type_str</a>,
<a name="l00303"></a>00303                                                   sub-&gt;<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-&gt;<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-&gt;<a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a> &lt;= end_pos);
<a name="l00319"></a>00319   _dbus_assert (reader-&gt;<a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a> &gt;= reader-&gt;<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-&gt;<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 &quot;complete&quot; 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 &quot;complete&quot; 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 &quot;1&quot;.">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 &quot;1&quot;.">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, &amp;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&#39;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-&gt;<a class="code" href="structDBusTypeReader.html#a238bd0d5a30d8f59fd9b71c95af25563" title="the vtable for the reader">klass</a>-&gt;<a class="code" href="structDBusTypeReaderClass.html#ad886037cd736e6f5cdbefb834b0bd5e7" title="only iterates over types, not values">types_only</a> &amp;&amp; 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&#39;s a child of the curr...">_dbus_type_reader_recurse</a> (reader, &amp;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 &quot;level&quot;.">_dbus_type_reader_next</a> (&amp;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-&gt;<a class="code" href="structDBusTypeReader.html#a238bd0d5a30d8f59fd9b71c95af25563" title="the vtable for the reader">klass</a>-&gt;<a class="code" href="structDBusTypeReaderClass.html#ad886037cd736e6f5cdbefb834b0bd5e7" title="only iterates over types, not values">types_only</a>)
<a name="l00464"></a>00464           reader-&gt;<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&#39;s type_pos is totally inapplicable (it&#39;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-&gt;<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-&gt;<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-&gt;<a class="code" href="structDBusTypeReader.html#a238bd0d5a30d8f59fd9b71c95af25563" title="the vtable for the reader">klass</a>-&gt;<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-&gt;<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-&gt;<a class="code" href="structDBusTypeReader.html#af52e270ededd0aabb642c6130a3e9e40" title="string containing signature of block">type_str</a>,
<a name="l00483"></a>00483                                                                    reader-&gt;<a class="code" href="structDBusTypeReader.html#a160a55f9869e297572c5aa5b6ce7bc71" title="current position in signature">type_pos</a> + 1),
<a name="l00484"></a>00484                                     reader-&gt;<a class="code" href="structDBusTypeReader.html#aeb0846d954066f420e1df98b81148702" title="byte order of the block">byte_order</a>,
<a name="l00485"></a>00485                                     &amp;reader-&gt;<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-&gt;<a class="code" href="structDBusTypeReader.html#af52e270ededd0aabb642c6130a3e9e40" title="string containing signature of block">type_str</a>, &amp;reader-&gt;<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-&gt;<a class="code" href="structDBusTypeReader.html#a238bd0d5a30d8f59fd9b71c95af25563" title="the vtable for the reader">klass</a>-&gt;<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-&gt;<a class="code" href="structDBusTypeReader.html#a4065d7775758beb044ee23a71875571f" title="string containing values of block">value_str</a>,
<a name="l00494"></a>00494                                   current_type, reader-&gt;<a class="code" href="structDBusTypeReader.html#aeb0846d954066f420e1df98b81148702" title="byte order of the block">byte_order</a>,
<a name="l00495"></a>00495                                   &amp;reader-&gt;<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-&gt;<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&#39;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-&gt;<a class="code" href="structDBusTypeReader.html#af52e270ededd0aabb642c6130a3e9e40" title="string containing signature of block">type_str</a>, reader-&gt;<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-&gt;<a class="code" href="structDBusTypeReader.html#a160a55f9869e297572c5aa5b6ce7bc71" title="current position in signature">type_pos</a> += 1;
<a name="l00519"></a>00519       reader-&gt;<a class="code" href="structDBusTypeReader.html#a551e64ee83df38ebda8c3677a91afe1b" title="marks we&#39;re at end iterator for cases where we don&#39;t have another way to tell">finished</a> = <a class="code" href="group__DBusMacros.html#gaa8cecfc5c5c054d2875c03e77b7be15d" title="Expands to &quot;1&quot;.">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&#39;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-&gt;<a class="code" href="structDBusTypeReader.html#af52e270ededd0aabb642c6130a3e9e40" title="string containing signature of block">type_str</a>, reader-&gt;<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-&gt;<a class="code" href="structDBusTypeReader.html#a160a55f9869e297572c5aa5b6ce7bc71" title="current position in signature">type_pos</a> += 1;
<a name="l00540"></a>00540       reader-&gt;<a class="code" href="structDBusTypeReader.html#a551e64ee83df38ebda8c3677a91afe1b" title="marks we&#39;re at end iterator for cases where we don&#39;t have another way to tell">finished</a> = <a class="code" href="group__DBusMacros.html#gaa8cecfc5c5c054d2875c03e77b7be15d" title="Expands to &quot;1&quot;.">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 &quot;element&quot; 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&#39;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-&gt;<a class="code" href="structDBusTypeReader.html#a551e64ee83df38ebda8c3677a91afe1b" title="marks we&#39;re at end iterator for cases where we don&#39;t have another way to tell">finished</a> = <a class="code" href="group__DBusMacros.html#gaa8cecfc5c5c054d2875c03e77b7be15d" title="Expands to &quot;1&quot;.">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-&gt;<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">&quot;  reader %p array next START start_pos = %d end_pos = %d value_pos = %d current_type = %s\n&quot;</span>,
<a name="l00567"></a>00567                  reader,
<a name="l00568"></a>00568                  reader-&gt;<a class="code" href="structDBusTypeReader.html#ada12bed6758840dc19b1fcb271fb01be" title="class-specific data">u</a>.array.start_pos,
<a name="l00569"></a>00569                  end_pos, reader-&gt;<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-&gt;<a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a> &lt; end_pos);
<a name="l00574"></a>00574   _dbus_assert (reader-&gt;<a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a> &gt;= reader-&gt;<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-&gt;<a class="code" href="structDBusTypeReader.html#af52e270ededd0aabb642c6130a3e9e40" title="string containing signature of block">type_str</a>,
<a name="l00577"></a>00577                                          reader-&gt;<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&#39;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&#39;s a child of the curr...">_dbus_type_reader_recurse</a> (reader, &amp;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 &quot;level&quot;.">_dbus_type_reader_next</a> (&amp;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-&gt;<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-&gt;<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-&gt;<a class="code" href="structDBusTypeReader.html#af52e270ededd0aabb642c6130a3e9e40" title="string containing signature of block">type_str</a>,
<a name="l00603"></a>00603                                                            reader-&gt;<a class="code" href="structDBusTypeReader.html#a160a55f9869e297572c5aa5b6ce7bc71" title="current position in signature">type_pos</a> + 1),
<a name="l00604"></a>00604                                   reader-&gt;<a class="code" href="structDBusTypeReader.html#aeb0846d954066f420e1df98b81148702" title="byte order of the block">byte_order</a>,
<a name="l00605"></a>00605                                   &amp;reader-&gt;<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-&gt;<a class="code" href="structDBusTypeReader.html#a4065d7775758beb044ee23a71875571f" title="string containing values of block">value_str</a>,
<a name="l00612"></a>00612                                   current_type, reader-&gt;<a class="code" href="structDBusTypeReader.html#aeb0846d954066f420e1df98b81148702" title="byte order of the block">byte_order</a>,
<a name="l00613"></a>00613                                   &amp;reader-&gt;<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">&quot;  reader %p array next END start_pos = %d end_pos = %d value_pos = %d current_type = %s\n&quot;</span>,
<a name="l00620"></a>00620                  reader,
<a name="l00621"></a>00621                  reader-&gt;<a class="code" href="structDBusTypeReader.html#ada12bed6758840dc19b1fcb271fb01be" title="class-specific data">u</a>.array.start_pos,
<a name="l00622"></a>00622                  end_pos, reader-&gt;<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-&gt;<a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a> &lt;= end_pos);
<a name="l00627"></a>00627 
<a name="l00628"></a>00628   <span class="keywordflow">if</span> (reader-&gt;<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-&gt;<a class="code" href="structDBusTypeReader.html#af52e270ededd0aabb642c6130a3e9e40" title="string containing signature of block">type_str</a>,
<a name="l00631"></a>00631                               &amp;reader-&gt;<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">&quot;body&quot;</span>, 0,
<a name="l00637"></a>00637   <a class="code" href="group__DBusMacros.html#gaa93f0eb578d23995850d61f7d61c55c1" title="Expands to &quot;0&quot;.">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&#39;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">&quot;body types&quot;</span>, 1,
<a name="l00645"></a>00645   <a class="code" href="group__DBusMacros.html#gaa8cecfc5c5c054d2875c03e77b7be15d" title="Expands to &quot;1&quot;.">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&#39;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">&quot;struct&quot;</span>, 2,
<a name="l00653"></a>00653   <a class="code" href="group__DBusMacros.html#gaa93f0eb578d23995850d61f7d61c55c1" title="Expands to &quot;0&quot;.">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">&quot;struct types&quot;</span>, 3,
<a name="l00661"></a>00661   <a class="code" href="group__DBusMacros.html#gaa8cecfc5c5c054d2875c03e77b7be15d" title="Expands to &quot;1&quot;.">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">&quot;dict_entry&quot;</span>, 4,
<a name="l00669"></a>00669   <a class="code" href="group__DBusMacros.html#gaa93f0eb578d23995850d61f7d61c55c1" title="Expands to &quot;0&quot;.">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">&quot;dict_entry types&quot;</span>, 5,
<a name="l00677"></a>00677   <a class="code" href="group__DBusMacros.html#gaa8cecfc5c5c054d2875c03e77b7be15d" title="Expands to &quot;1&quot;.">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">&quot;array&quot;</span>, 6,
<a name="l00685"></a>00685   <a class="code" href="group__DBusMacros.html#gaa93f0eb578d23995850d61f7d61c55c1" title="Expands to &quot;0&quot;.">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">&quot;array types&quot;</span>, 7,
<a name="l00693"></a>00693   <a class="code" href="group__DBusMacros.html#gaa8cecfc5c5c054d2875c03e77b7be15d" title="Expands to &quot;1&quot;.">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">&quot;variant&quot;</span>, 8,
<a name="l00701"></a>00701   <a class="code" href="group__DBusMacros.html#gaa93f0eb578d23995850d61f7d61c55c1" title="Expands to &quot;0&quot;.">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   &amp;body_reader_class,
<a name="l00711"></a>00711   &amp;body_types_only_reader_class,
<a name="l00712"></a>00712   &amp;struct_reader_class,
<a name="l00713"></a>00713   &amp;struct_types_only_reader_class,
<a name="l00714"></a>00714   &amp;dict_entry_reader_class,
<a name="l00715"></a>00715   &amp;dict_entry_types_only_reader_class,
<a name="l00716"></a>00716   &amp;array_reader_class,
<a name="l00717"></a>00717   &amp;array_types_only_reader_class,
<a name="l00718"></a>00718   &amp;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-&gt;<a class="code" href="structDBusTypeReader.html#a238bd0d5a30d8f59fd9b71c95af25563" title="the vtable for the reader">klass</a> = &amp;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">&quot;  type reader %p init type_pos = %d value_pos = %d remaining sig &#39;%s&#39;\n&quot;</span>,
<a name="l00747"></a>00747                  reader, reader-&gt;<a class="code" href="structDBusTypeReader.html#a160a55f9869e297572c5aa5b6ce7bc71" title="current position in signature">type_pos</a>, reader-&gt;<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-&gt;<a class="code" href="structDBusTypeReader.html#af52e270ededd0aabb642c6130a3e9e40" title="string containing signature of block">type_str</a>, reader-&gt;<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-&gt;<a class="code" href="structDBusTypeReader.html#a238bd0d5a30d8f59fd9b71c95af25563" title="the vtable for the reader">klass</a> = &amp;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">&quot;  type reader %p init types only type_pos = %d remaining sig &#39;%s&#39;\n&quot;</span>,
<a name="l00772"></a>00772                  reader, reader-&gt;<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-&gt;<a class="code" href="structDBusTypeReader.html#af52e270ededd0aabb642c6130a3e9e40" title="string containing signature of block">type_str</a>, reader-&gt;<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-&gt;<a class="code" href="structDBusTypeReader.html#a551e64ee83df38ebda8c3677a91afe1b" title="marks we&#39;re at end iterator for cases where we don&#39;t have another way to tell">finished</a> ||
<a name="l00791"></a>00791       (reader-&gt;<a class="code" href="structDBusTypeReader.html#a238bd0d5a30d8f59fd9b71c95af25563" title="the vtable for the reader">klass</a>-&gt;<a class="code" href="structDBusTypeReaderClass.html#a023bc5274f7bf1f45f29822aebae96a1" title="check whether reader is at the end">check_finished</a> &amp;&amp;
<a name="l00792"></a>00792        (* reader-&gt;<a class="code" href="structDBusTypeReader.html#a238bd0d5a30d8f59fd9b71c95af25563" title="the vtable for the reader">klass</a>-&gt;<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-&gt;<a class="code" href="structDBusTypeReader.html#af52e270ededd0aabb642c6130a3e9e40" title="string containing signature of block">type_str</a>,
<a name="l00796"></a>00796                                        reader-&gt;<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">&quot;  type reader %p current type_pos = %d type = %s\n&quot;</span>,
<a name="l00805"></a>00805                  reader, reader-&gt;<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-&gt;<a class="code" href="structDBusTypeReader.html#af52e270ededd0aabb642c6130a3e9e40" title="string containing signature of block">type_str</a>,
<a name="l00828"></a>00828                                           reader-&gt;<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-&gt;<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-&gt;<a class="code" href="structDBusTypeReader.html#a238bd0d5a30d8f59fd9b71c95af25563" title="the vtable for the reader">klass</a>-&gt;<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-&gt;<a class="code" href="structDBusTypeReader.html#a4065d7775758beb044ee23a71875571f" title="string containing values of block">value_str</a>,
<a name="l00859"></a>00859                                                      reader-&gt;<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-&gt;<a class="code" href="structDBusTypeReader.html#a238bd0d5a30d8f59fd9b71c95af25563" title="the vtable for the reader">klass</a>-&gt;<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-&gt;<a class="code" href="structDBusTypeReader.html#a4065d7775758beb044ee23a71875571f" title="string containing values of block">value_str</a>,
<a name="l00880"></a>00880                             reader-&gt;<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-&gt;<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">&quot;  type reader %p read basic type_pos = %d value_pos = %d remaining sig &#39;%s&#39;\n&quot;</span>,
<a name="l00888"></a>00888                  reader, reader-&gt;<a class="code" href="structDBusTypeReader.html#a160a55f9869e297572c5aa5b6ce7bc71" title="current position in signature">type_pos</a>, reader-&gt;<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-&gt;<a class="code" href="structDBusTypeReader.html#af52e270ededd0aabb642c6130a3e9e40" title="string containing signature of block">type_str</a>, reader-&gt;<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-&gt;<a class="code" href="structDBusTypeReader.html#a238bd0d5a30d8f59fd9b71c95af25563" title="the vtable for the reader">klass</a>-&gt;<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-&gt;<a class="code" href="structDBusTypeReader.html#a238bd0d5a30d8f59fd9b71c95af25563" title="the vtable for the reader">klass</a> == &amp;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-&gt;<a class="code" href="structDBusTypeReader.html#a238bd0d5a30d8f59fd9b71c95af25563" title="the vtable for the reader">klass</a>-&gt;<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-&gt;<a class="code" href="structDBusTypeReader.html#a238bd0d5a30d8f59fd9b71c95af25563" title="the vtable for the reader">klass</a> == &amp;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-&gt;<a class="code" href="structDBusTypeReader.html#af52e270ededd0aabb642c6130a3e9e40" title="string containing signature of block">type_str</a>,
<a name="l00938"></a>00938                                                 reader-&gt;<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&#39;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-&gt;<a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a> &gt;= reader-&gt;<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-&gt;<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-&gt;<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">&quot;end_pos %d total_len %d remaining_len %d value_pos %d\n&quot;</span>,
<a name="l00953"></a>00953                  end_pos, total_len, remaining_len, reader-&gt;<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 &lt;= 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-&gt;<a class="code" href="structDBusTypeReader.html#a4065d7775758beb044ee23a71875571f" title="string containing values of block">value_str</a>,
<a name="l00963"></a>00963                                                reader-&gt;<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">&quot;  type reader %p read fixed array type_pos = %d value_pos = %d remaining sig &#39;%s&#39;\n&quot;</span>,
<a name="l00971"></a>00971                  reader, reader-&gt;<a class="code" href="structDBusTypeReader.html#a160a55f9869e297572c5aa5b6ce7bc71" title="current position in signature">type_pos</a>, reader-&gt;<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-&gt;<a class="code" href="structDBusTypeReader.html#af52e270ededd0aabb642c6130a3e9e40" title="string containing signature of block">type_str</a>, reader-&gt;<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&#39;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-&gt;<a class="code" href="structDBusTypeReader.html#af52e270ededd0aabb642c6130a3e9e40" title="string containing signature of block">type_str</a>, reader-&gt;<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&#39;t appear in a type string...">DBUS_TYPE_STRUCT</a>:
<a name="l01000"></a>01000       <span class="keywordflow">if</span> (reader-&gt;<a class="code" href="structDBusTypeReader.html#a238bd0d5a30d8f59fd9b71c95af25563" title="the vtable for the reader">klass</a>-&gt;<a class="code" href="structDBusTypeReaderClass.html#ad886037cd736e6f5cdbefb834b0bd5e7" title="only iterates over types, not values">types_only</a>)
<a name="l01001"></a>01001         klass = &amp;struct_types_only_reader_class;
<a name="l01002"></a>01002       <span class="keywordflow">else</span>
<a name="l01003"></a>01003         klass = &amp;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-&gt;<a class="code" href="structDBusTypeReader.html#a238bd0d5a30d8f59fd9b71c95af25563" title="the vtable for the reader">klass</a>-&gt;<a class="code" href="structDBusTypeReaderClass.html#ad886037cd736e6f5cdbefb834b0bd5e7" title="only iterates over types, not values">types_only</a>)
<a name="l01007"></a>01007         klass = &amp;dict_entry_types_only_reader_class;
<a name="l01008"></a>01008       <span class="keywordflow">else</span>
<a name="l01009"></a>01009         klass = &amp;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-&gt;<a class="code" href="structDBusTypeReader.html#a238bd0d5a30d8f59fd9b71c95af25563" title="the vtable for the reader">klass</a>-&gt;<a class="code" href="structDBusTypeReaderClass.html#ad886037cd736e6f5cdbefb834b0bd5e7" title="only iterates over types, not values">types_only</a>)
<a name="l01013"></a>01013         klass = &amp;array_types_only_reader_class;
<a name="l01014"></a>01014       <span class="keywordflow">else</span>
<a name="l01015"></a>01015         klass = &amp;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-&gt;<a class="code" href="structDBusTypeReader.html#a238bd0d5a30d8f59fd9b71c95af25563" title="the vtable for the reader">klass</a>-&gt;<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">&quot;can&#39;t recurse into variant typecode&quot;</span>);
<a name="l01020"></a>01020       <span class="keywordflow">else</span>
<a name="l01021"></a>01021         klass = &amp;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">&quot;recursing into type %s\n&quot;</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 &quot;critical&quot; warning to stderr when an assertion fails; differs from _dbus_warn primarily in t...">_dbus_warn_check_failed</a> (<span class="stringliteral">&quot;You can&#39;t recurse into an empty array or off the end of a message body\n&quot;</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">&quot;don&#39;t yet handle recursing into this type&quot;</span>);
<a name="l01031"></a>01031     }
<a name="l01032"></a>01032 
<a name="l01033"></a>01033   _dbus_assert (klass == all_reader_classes[klass-&gt;<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-&gt;<a class="code" href="structDBusTypeReaderClass.html#abe8f7f4433f8c8eaf0c5f8d445101391" title="recurse with this reader as sub">recurse</a>) (sub, reader);
<a name="l01036"></a>01036   sub-&gt;<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">&quot;  type reader %p RECURSED type_pos = %d value_pos = %d remaining sig &#39;%s&#39;\n&quot;</span>,
<a name="l01040"></a>01040                  sub, sub-&gt;<a class="code" href="structDBusTypeReader.html#a160a55f9869e297572c5aa5b6ce7bc71" title="current position in signature">type_pos</a>, sub-&gt;<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-&gt;<a class="code" href="structDBusTypeReader.html#af52e270ededd0aabb642c6130a3e9e40" title="string containing signature of block">type_str</a>, sub-&gt;<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 &quot;level&quot;.">_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">&quot;  type reader %p START next() { type_pos = %d value_pos = %d remaining sig &#39;%s&#39; current_type = %s\n&quot;</span>,
<a name="l01062"></a>01062                  reader, reader-&gt;<a class="code" href="structDBusTypeReader.html#a160a55f9869e297572c5aa5b6ce7bc71" title="current position in signature">type_pos</a>, reader-&gt;<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-&gt;<a class="code" href="structDBusTypeReader.html#af52e270ededd0aabb642c6130a3e9e40" title="string containing signature of block">type_str</a>, reader-&gt;<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 &quot;0&quot;.">FALSE</a>;
<a name="l01069"></a>01069 
<a name="l01070"></a>01070   (* reader-&gt;<a class="code" href="structDBusTypeReader.html#a238bd0d5a30d8f59fd9b71c95af25563" title="the vtable for the reader">klass</a>-&gt;<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">&quot;  type reader %p END next() type_pos = %d value_pos = %d remaining sig &#39;%s&#39; current_type = %s\n&quot;</span>,
<a name="l01074"></a>01074                  reader, reader-&gt;<a class="code" href="structDBusTypeReader.html#a160a55f9869e297572c5aa5b6ce7bc71" title="current position in signature">type_pos</a>, reader-&gt;<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-&gt;<a class="code" href="structDBusTypeReader.html#af52e270ededd0aabb642c6130a3e9e40" title="string containing signature of block">type_str</a>, reader-&gt;<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&#39;s another value on this &quot;level&quot;.">_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 &quot;level&quot;.">_dbus_type_reader_next</a> (&amp;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-&gt;<a class="code" href="structDBusTypeReader.html#af52e270ededd0aabb642c6130a3e9e40" title="string containing signature of block">type_str</a>;
<a name="l01131"></a>01131   *start_p = reader-&gt;<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-&gt;<a class="code" href="structDBusTypeReader.html#af52e270ededd0aabb642c6130a3e9e40" title="string containing signature of block">type_str</a>, reader-&gt;<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> (&amp;block-&gt;<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 &quot;0&quot;.">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-&gt;<a class="code" href="structReplacementBlock.html#a2aa3220ac139545f4fa2ddec2c36d5de" title="How much of the replacement block is padding.">padding</a> = reader-&gt;<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> (&amp;block-&gt;<a class="code" href="structReplacementBlock.html#a562018cd2a0870abe3897b289bdd8488" title="Marshaled value including alignment padding.">replacement</a>, block-&gt;<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 &quot;1&quot;.">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> (&amp;block-&gt;<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 &quot;0&quot;.">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> (&amp;block-&gt;<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">&quot;INITIALIZING replacement block writer %p at value_pos %d\n&quot;</span>,
<a name="l01181"></a>01181                  &amp;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> (&amp;block-&gt;<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> (&amp;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                                       &amp;block-&gt;<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> (&amp;block-&gt;<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> &lt;= reader-&gt;<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">&quot;COPYING from reader at value_pos %d to writer %p starting after value_pos %d\n&quot;</span>,
<a name="l01194"></a>01194                  realign_reader.<a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a>, &amp;writer, reader-&gt;<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 (&amp;writer,
<a name="l01198"></a>01198                                                &amp;realign_reader,
<a name="l01199"></a>01199                                                reader,
<a name="l01200"></a>01200                                                block-&gt;<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> (&amp;block-&gt;<a class="code" href="structReplacementBlock.html#a562018cd2a0870abe3897b289bdd8488" title="Marshaled value including alignment padding.">replacement</a>) - block-&gt;<a class="code" href="structReplacementBlock.html#a2aa3220ac139545f4fa2ddec2c36d5de" title="How much of the replacement block is padding.">padding</a>,
<a name="l01202"></a>01202                                                &amp;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">&quot;REPLACEMENT at padding %d len %d\n&quot;</span>, block-&gt;<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> (&amp;block-&gt;<a class="code" href="structReplacementBlock.html#a562018cd2a0870abe3897b289bdd8488" title="Marshaled value including alignment padding.">replacement</a>) - block-&gt;<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> (&amp;block-&gt;<a class="code" href="structReplacementBlock.html#a562018cd2a0870abe3897b289bdd8488" title="Marshaled value including alignment padding.">replacement</a>, block-&gt;<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> (&amp;block-&gt;<a class="code" href="structReplacementBlock.html#a562018cd2a0870abe3897b289bdd8488" title="Marshaled value including alignment padding.">replacement</a>) - block-&gt;<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">&quot;TO BE REPLACED at value_pos = %d (align pad %d) len %d realign_reader.value_pos %d\n&quot;</span>,
<a name="l01211"></a>01211                  reader-&gt;<a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a>, reader-&gt;<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-&gt;<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-&gt;<a class="code" href="structDBusTypeReader.html#a4065d7775758beb044ee23a71875571f" title="string containing values of block">value_str</a>,
<a name="l01215"></a>01215                                  reader-&gt;<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-&gt;<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> (&amp;block-&gt;<a class="code" href="structReplacementBlock.html#a562018cd2a0870abe3897b289bdd8488" title="Marshaled value including alignment padding.">replacement</a>, block-&gt;<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> (&amp;block-&gt;<a class="code" href="structReplacementBlock.html#a562018cd2a0870abe3897b289bdd8488" title="Marshaled value including alignment padding.">replacement</a>) - block-&gt;<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-&gt;<a class="code" href="structDBusTypeReader.html#a4065d7775758beb044ee23a71875571f" title="string containing values of block">value_str</a>,
<a name="l01225"></a>01225                                  reader-&gt;<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-&gt;<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&#39;t have an OOM error */</span>
<a name="l01230"></a>01230   apply_and_free_fixups (&amp;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 &quot;1&quot;.">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> (&amp;block-&gt;<a class="code" href="structReplacementBlock.html#a562018cd2a0870abe3897b289bdd8488" title="Marshaled value including alignment padding.">replacement</a>, orig_len);
<a name="l01236"></a>01236   free_fixups (&amp;fixups);
<a name="l01237"></a>01237   <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#gaa93f0eb578d23995850d61f7d61c55c1" title="Expands to &quot;0&quot;.">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> (&amp;block-&gt;<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 &quot;0&quot;.">FALSE</a>;
<a name="l01282"></a>01282 
<a name="l01283"></a>01283   <span class="keywordflow">if</span> (!replacement_block_init (&amp;block, reader))
<a name="l01284"></a>01284     <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#gaa93f0eb578d23995850d61f7d61c55c1" title="Expands to &quot;0&quot;.">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">&quot;INITIALIZING writer %p to write basic value at value_pos %d of replacement string\n&quot;</span>,
<a name="l01289"></a>01289                  &amp;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> (&amp;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> (&amp;writer,
<a name="l01292"></a>01292                                       reader-&gt;<a class="code" href="structDBusTypeReader.html#aeb0846d954066f420e1df98b81148702" title="byte order of the block">byte_order</a>,
<a name="l01293"></a>01293                                       reader-&gt;<a class="code" href="structDBusTypeReader.html#af52e270ededd0aabb642c6130a3e9e40" title="string containing signature of block">type_str</a>,
<a name="l01294"></a>01294                                       reader-&gt;<a class="code" href="structDBusTypeReader.html#a160a55f9869e297572c5aa5b6ce7bc71" title="current position in signature">type_pos</a>,
<a name="l01295"></a>01295                                       &amp;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> (&amp;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">&quot;WRITING basic value to writer %p (replacement string)\n&quot;</span>, &amp;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> (&amp;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 (&amp;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 &quot;1&quot;.">TRUE</a>;
<a name="l01309"></a>01309 
<a name="l01310"></a>01310  out:
<a name="l01311"></a>01311   replacement_block_free (&amp;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-&gt;<a class="code" href="structDBusTypeReader.html#a4065d7775758beb044ee23a71875571f" title="string containing values of block">value_str</a>,
<a name="l01321"></a>01321                            reader-&gt;<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-&gt;<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-&gt;<a class="code" href="structDBusTypeReader.html#a238bd0d5a30d8f59fd9b71c95af25563" title="the vtable for the reader">klass</a>-&gt;<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-&gt;<a class="code" href="structDBusTypeReader.html#a4065d7775758beb044ee23a71875571f" title="string containing values of block">value_str</a> == realign_root-&gt;<a class="code" href="structDBusTypeReader.html#a4065d7775758beb044ee23a71875571f" title="string containing values of block">value_str</a>);
<a name="l01371"></a>01371   _dbus_assert (reader-&gt;<a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a> &gt;= realign_root-&gt;<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">&quot;  SET BASIC type reader %p type_pos = %d value_pos = %d remaining sig &#39;%s&#39; realign_root = %p with value_pos %d current_type = %s\n&quot;</span>,
<a name="l01377"></a>01377                  reader, reader-&gt;<a class="code" href="structDBusTypeReader.html#a160a55f9869e297572c5aa5b6ce7bc71" title="current position in signature">type_pos</a>, reader-&gt;<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-&gt;<a class="code" href="structDBusTypeReader.html#af52e270ededd0aabb642c6130a3e9e40" title="string containing signature of block">type_str</a>, reader-&gt;<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-&gt;<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-&gt;<a class="code" href="structDBusTypeReader.html#a4065d7775758beb044ee23a71875571f" title="string containing values of block">value_str</a>, realign_root-&gt;<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-&gt;<a class="code" href="structDBusTypeReader.html#a4065d7775758beb044ee23a71875571f" title="string containing values of block">value_str</a>) -
<a name="l01384"></a>01384                                  realign_root-&gt;<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 &quot;basic type&quot; 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 &quot;1&quot;.">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-&gt;<a class="code" href="structDBusTypeReader.html#a238bd0d5a30d8f59fd9b71c95af25563" title="the vtable for the reader">klass</a> == &amp;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 &quot;0&quot;.">FALSE</a>;
<a name="l01430"></a>01430 
<a name="l01431"></a>01431   <span class="keywordflow">if</span> (!replacement_block_init (&amp;block, reader))
<a name="l01432"></a>01432     <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#gaa93f0eb578d23995850d61f7d61c55c1" title="Expands to &quot;0&quot;.">FALSE</a>;
<a name="l01433"></a>01433 
<a name="l01434"></a>01434   <span class="keywordflow">if</span> (!replacement_block_replace (&amp;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 &quot;1&quot;.">TRUE</a>;
<a name="l01440"></a>01440 
<a name="l01441"></a>01441  out:
<a name="l01442"></a>01442   replacement_block_free (&amp;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-&gt;<a class="code" href="structDBusTypeReader.html#a4065d7775758beb044ee23a71875571f" title="string containing values of block">value_str</a> == rhs-&gt;<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-&gt;<a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a> &gt; rhs-&gt;<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-&gt;<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-&gt;<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-&gt;<a class="code" href="structDBusTypeWriter.html#a77c19debc0427372f368cfe7188951f8" title="current pos in type_str">type_pos</a> = type_pos;
<a name="l01503"></a>01503   writer-&gt;<a class="code" href="structDBusTypeWriter.html#aa4e4b3af31fd7a93d0e54d10882bcc07" title="where to write values">value_str</a> = value_str;
<a name="l01504"></a>01504   writer-&gt;<a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a> = value_pos;
<a name="l01505"></a>01505   writer-&gt;<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-&gt;<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 &quot;0&quot;.">FALSE</a>;
<a name="l01507"></a>01507   writer-&gt;<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 &quot;1&quot;.">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">&quot;writer %p init remaining sig &#39;%s&#39;\n&quot;</span>, writer,
<a name="l01511"></a>01511                  writer-&gt;<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-&gt;<a class="code" href="structDBusTypeWriter.html#a95204ef3a9cf29ee31687032b142b836" title="where to write typecodes (or read type expectations)">type_str</a>, writer-&gt;<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">&quot;unknown&quot;</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-&gt;<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-&gt;<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-&gt;<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-&gt;<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-&gt;<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-&gt;<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 &quot;1&quot;.">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-&gt;<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-&gt;<a class="code" href="structDBusTypeWriter.html#aa4e4b3af31fd7a93d0e54d10882bcc07" title="where to write values">value_str</a>,
<a name="l01605"></a>01605                                       writer-&gt;<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-&gt;<a class="code" href="structDBusTypeWriter.html#a6c4baf0b7148cf3f76924b654dada148" title="byte order to write values with">byte_order</a>,
<a name="l01609"></a>01609                                       &amp;writer-&gt;<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 &quot;1&quot;.">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"> * &quot;i&quot; or &quot;aai&quot; or &quot;(ii)&quot; or &quot;a(ii)&quot;. There can&#39;t be</span>
<a name="l01618"></a>01618 <span class="comment"> * unclosed parens, or an &quot;a&quot; 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 &quot;i&quot; you can&#39;t recurse, for</span>
<a name="l01622"></a>01622 <span class="comment"> * &quot;ai&quot; you can recurse into the array, for &quot;(ii)&quot; 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 &quot;ai&quot;, then you must specify</span>
<a name="l01626"></a>01626 <span class="comment"> * &quot;i&quot; 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-&gt;<a class="code" href="structDBusTypeWriter.html#a6c4baf0b7148cf3f76924b654dada148" title="byte order to write values with">byte_order</a>,
<a name="l01642"></a>01642                           writer-&gt;<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-&gt;<a class="code" href="structDBusTypeWriter.html#a77c19debc0427372f368cfe7188951f8" title="current pos in type_str">type_pos</a>,
<a name="l01644"></a>01644                           writer-&gt;<a class="code" href="structDBusTypeWriter.html#aa4e4b3af31fd7a93d0e54d10882bcc07" title="where to write values">value_str</a>,
<a name="l01645"></a>01645                           writer-&gt;<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-&gt;<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-&gt;<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-&gt;<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-&gt;<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-&gt;<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 &quot;1&quot;.">TRUE</a>;
<a name="l01652"></a>01652   <span class="keywordflow">else</span>
<a name="l01653"></a>01653     sub-&gt;<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 &quot;0&quot;.">FALSE</a>;
<a name="l01654"></a>01654 
<a name="l01655"></a>01655   sub-&gt;<a class="code" href="structDBusTypeWriter.html#a52c8617918c108d36b947cbdfc99c6ea" title="whether to write values">enabled</a> = writer-&gt;<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-&gt;<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> &amp;&amp; writer-&gt;<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-&gt;<a class="code" href="structDBusTypeWriter.html#a95204ef3a9cf29ee31687032b142b836" title="where to write typecodes (or read type expectations)">type_str</a>, writer-&gt;<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-&gt;<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 &quot;critical&quot; warning to stderr when an assertion fails; differs from _dbus_warn primarily in t...">_dbus_warn_check_failed</a> (<span class="stringliteral">&quot;Writing an element of type %s, but the expected type here is %s\n&quot;</span>
<a name="l01668"></a>01668                                      <span class="stringliteral">&quot;The overall signature expected here was &#39;%s&#39; and we are on byte %d of that signature.\n&quot;</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-&gt;<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-&gt;<a class="code" href="structDBusTypeWriter.html#a95204ef3a9cf29ee31687032b142b836" title="where to write typecodes (or read type expectations)">type_str</a>), writer-&gt;<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 &quot;critical&quot; warning to stderr when an assertion fails; differs from _dbus_warn primarily in t...">_dbus_warn_check_failed</a> (<span class="stringliteral">&quot;Writing an element of type %s, but no value is expected here\n&quot;</span>
<a name="l01674"></a>01674                                      <span class="stringliteral">&quot;The overall signature expected here was &#39;%s&#39; and we are on byte %d of that signature.\n&quot;</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-&gt;<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-&gt;<a class="code" href="structDBusTypeWriter.html#a95204ef3a9cf29ee31687032b142b836" title="where to write typecodes (or read type expectations)">type_str</a>), writer-&gt;<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">&quot;bad array element or variant content written&quot;</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">&quot;  type writer %p recurse parent %s type_pos = %d value_pos = %d is_expectation = %d remaining sig &#39;%s&#39; enabled = %d\n&quot;</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-&gt;<a class="code" href="structDBusTypeWriter.html#ad0953035070c7c7d21b044b7b2f0f491" title="what are we inside? (e.g.">container_type</a>),
<a name="l01687"></a>01687                  writer-&gt;<a class="code" href="structDBusTypeWriter.html#a77c19debc0427372f368cfe7188951f8" title="current pos in type_str">type_pos</a>, writer-&gt;<a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a>, writer-&gt;<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-&gt;<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-&gt;<a class="code" href="structDBusTypeWriter.html#a95204ef3a9cf29ee31687032b142b836" title="where to write typecodes (or read type expectations)">type_str</a>, writer-&gt;<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">&quot;unknown&quot;</span>,
<a name="l01691"></a>01691                  writer-&gt;<a class="code" href="structDBusTypeWriter.html#a52c8617918c108d36b947cbdfc99c6ea" title="whether to write values">enabled</a>);
<a name="l01692"></a>01692   _dbus_verbose (<span class="stringliteral">&quot;  type writer %p recurse sub %s   type_pos = %d value_pos = %d is_expectation = %d enabled = %d\n&quot;</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-&gt;<a class="code" href="structDBusTypeWriter.html#ad0953035070c7c7d21b044b7b2f0f491" title="what are we inside? (e.g.">container_type</a>),
<a name="l01695"></a>01695                  sub-&gt;<a class="code" href="structDBusTypeWriter.html#a77c19debc0427372f368cfe7188951f8" title="current pos in type_str">type_pos</a>, sub-&gt;<a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a>,
<a name="l01696"></a>01696                  sub-&gt;<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-&gt;<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">&quot;  type writer %p write_or_verify start type_pos = %d remaining sig &#39;%s&#39; enabled = %d\n&quot;</span>,
<a name="l01712"></a>01712                  writer, writer-&gt;<a class="code" href="structDBusTypeWriter.html#a77c19debc0427372f368cfe7188951f8" title="current pos in type_str">type_pos</a>,
<a name="l01713"></a>01713                  writer-&gt;<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-&gt;<a class="code" href="structDBusTypeWriter.html#a95204ef3a9cf29ee31687032b142b836" title="where to write typecodes (or read type expectations)">type_str</a>, writer-&gt;<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">&quot;unknown&quot;</span>,
<a name="l01716"></a>01716                  writer-&gt;<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-&gt;<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 &quot;1&quot;.">TRUE</a>;
<a name="l01721"></a>01721 
<a name="l01722"></a>01722   <span class="keywordflow">if</span> (writer-&gt;<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-&gt;<a class="code" href="structDBusTypeWriter.html#a95204ef3a9cf29ee31687032b142b836" title="where to write typecodes (or read type expectations)">type_str</a>, writer-&gt;<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 &quot;critical&quot; warning to stderr when an assertion fails; differs from _dbus_warn primarily in t...">_dbus_warn_check_failed</a> (<span class="stringliteral">&quot;Array or variant type requires that type %s be written, but %s was written.\n&quot;</span>
<a name="l01734"></a>01734                                        <span class="stringliteral">&quot;The overall signature expected here was &#39;%s&#39; and we are on byte %d of that signature.\n&quot;</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-&gt;<a class="code" href="structDBusTypeWriter.html#a95204ef3a9cf29ee31687032b142b836" title="where to write typecodes (or read type expectations)">type_str</a>), writer-&gt;<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 &quot;critical&quot; warning to stderr when an assertion fails; differs from _dbus_warn primarily in t...">_dbus_warn_check_failed</a> (<span class="stringliteral">&quot;Array or variant type wasn&#39;t expecting any more values to be written into it, but a value %s was written.\n&quot;</span>
<a name="l01739"></a>01739                                        <span class="stringliteral">&quot;The overall signature expected here was &#39;%s&#39; and we are on byte %d of that signature.\n&quot;</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-&gt;<a class="code" href="structDBusTypeWriter.html#a95204ef3a9cf29ee31687032b142b836" title="where to write typecodes (or read type expectations)">type_str</a>), writer-&gt;<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">&quot;bad type inserted somewhere inside an array or variant&quot;</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&#39;d always be appending an element,</span>
<a name="l01748"></a>01748 <span class="comment">       * so the expected type doesn&#39;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-&gt;<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-&gt;<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-&gt;<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-&gt;<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 &quot;0&quot;.">FALSE</a>;
<a name="l01760"></a>01760 
<a name="l01761"></a>01761       writer-&gt;<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">&quot;  type writer %p write_or_verify end type_pos = %d remaining sig &#39;%s&#39;\n&quot;</span>,
<a name="l01766"></a>01766                  writer, writer-&gt;<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-&gt;<a class="code" href="structDBusTypeWriter.html#a95204ef3a9cf29ee31687032b142b836" title="where to write typecodes (or read type expectations)">type_str</a>, writer-&gt;<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 &quot;1&quot;.">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&#39;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&#39;ll be able to add alignment padding and the typecode */</span>
<a name="l01787"></a>01787   <span class="keywordflow">if</span> (writer-&gt;<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-&gt;<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 &quot;0&quot;.">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">&quot;failed to insert struct typecode after prealloc&quot;</span>);
<a name="l01795"></a>01795 
<a name="l01796"></a>01796   <span class="keywordflow">if</span> (writer-&gt;<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-&gt;<a class="code" href="structDBusTypeWriter.html#aa4e4b3af31fd7a93d0e54d10882bcc07" title="where to write values">value_str</a>,
<a name="l01799"></a>01799                                       sub-&gt;<a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a>,
<a name="l01800"></a>01800                                       _DBUS_ALIGN_VALUE (sub-&gt;<a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a>, 8) - sub-&gt;<a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a>,
<a name="l01801"></a>01801                                       <span class="charliteral">&#39;\0&#39;</span>))
<a name="l01802"></a>01802         _dbus_assert_not_reached (<span class="stringliteral">&quot;should not have failed to insert alignment padding for struct&quot;</span>);
<a name="l01803"></a>01803       sub-&gt;<a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a> = _DBUS_ALIGN_VALUE (sub-&gt;<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 &quot;1&quot;.">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-&gt;<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> &amp;&amp;
<a name="l01824"></a>01824       writer-&gt;<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-&gt;<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-&gt;<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 &quot;critical&quot; warning to stderr when an assertion fails; differs from _dbus_warn primarily in t...">_dbus_warn_check_failed</a> (<span class="stringliteral">&quot;Writing an array of &#39;%s&#39; but this is incompatible with the expected type of elements in the parent array\n&quot;</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">&quot;incompatible type for child array&quot;</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-&gt;<a class="code" href="structDBusTypeWriter.html#a52c8617918c108d36b947cbdfc99c6ea" title="whether to write values">enabled</a> &amp;&amp; !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-&gt;<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 &quot;0&quot;.">FALSE</a>;
<a name="l01848"></a>01848     }
<a name="l01849"></a>01849 
<a name="l01850"></a>01850   <span class="keywordflow">if</span> (writer-&gt;<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-&gt;<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-&gt;<a class="code" href="structDBusTypeWriter.html#afe24080d2be45fb6033833a1a38d5d1a" title="class-specific data">u</a>.array.element_type_pos = sub-&gt;<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-&gt;<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-&gt;<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 &quot;0&quot;.">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-&gt;<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-&gt;<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">&quot;failed to insert array typecode after prealloc&quot;</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-&gt;<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-&gt;<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">&quot;should not have failed to insert array element typecodes&quot;</span>);
<a name="l01876"></a>01876     }
<a name="l01877"></a>01877 
<a name="l01878"></a>01878   <span class="keywordflow">if</span> (writer-&gt;<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-&gt;<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-&gt;<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-&gt;<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&#39;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-&gt;<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-&gt;<a class="code" href="structDBusTypeWriter.html#afe24080d2be45fb6033833a1a38d5d1a" title="class-specific data">u</a>.array.len_pos = _DBUS_ALIGN_VALUE (sub-&gt;<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-&gt;<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                                                           &amp;value))
<a name="l01902"></a>01902             _dbus_assert_not_reached (<span class="stringliteral">&quot;should not have failed to insert array len&quot;</span>);
<a name="l01903"></a>01903         }
<a name="l01904"></a>01904 
<a name="l01905"></a>01905       _dbus_assert (sub-&gt;<a class="code" href="structDBusTypeWriter.html#afe24080d2be45fb6033833a1a38d5d1a" title="class-specific data">u</a>.array.len_pos == sub-&gt;<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-&gt;<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-&gt;<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-&gt;<a class="code" href="structDBusTypeWriter.html#aa4e4b3af31fd7a93d0e54d10882bcc07" title="where to write values">value_str</a>,
<a name="l01919"></a>01919                                               sub-&gt;<a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a>,
<a name="l01920"></a>01920                                               aligned - sub-&gt;<a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a>,
<a name="l01921"></a>01921                                               <span class="charliteral">&#39;\0&#39;</span>))
<a name="l01922"></a>01922                 _dbus_assert_not_reached (<span class="stringliteral">&quot;should not have failed to insert alignment padding&quot;</span>);
<a name="l01923"></a>01923             }
<a name="l01924"></a>01924 
<a name="l01925"></a>01925           sub-&gt;<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-&gt;<a class="code" href="structDBusTypeWriter.html#afe24080d2be45fb6033833a1a38d5d1a" title="class-specific data">u</a>.array.start_pos = sub-&gt;<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-&gt;<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-&gt;<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-&gt;<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-&gt;<a class="code" href="structDBusTypeWriter.html#aa4e4b3af31fd7a93d0e54d10882bcc07" title="where to write values">value_str</a>,
<a name="l01938"></a>01938                                                                       sub-&gt;<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-&gt;<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&#39;t write the len_pos; set it to -1 to so indicate */</span>
<a name="l01947"></a>01947       sub-&gt;<a class="code" href="structDBusTypeWriter.html#afe24080d2be45fb6033833a1a38d5d1a" title="class-specific data">u</a>.array.len_pos = -1;
<a name="l01948"></a>01948       sub-&gt;<a class="code" href="structDBusTypeWriter.html#afe24080d2be45fb6033833a1a38d5d1a" title="class-specific data">u</a>.array.start_pos = sub-&gt;<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-&gt;<a class="code" href="structDBusTypeWriter.html#afe24080d2be45fb6033833a1a38d5d1a" title="class-specific data">u</a>.array.len_pos &lt; sub-&gt;<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-&gt;<a class="code" href="structDBusTypeWriter.html#afe24080d2be45fb6033833a1a38d5d1a" title="class-specific data">u</a>.array.start_pos == sub-&gt;<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">&quot;  type writer %p recurse array done remaining sig &#39;%s&#39; array start_pos = %d len_pos = %d value_pos = %d\n&quot;</span>, sub,
<a name="l01956"></a>01956                      sub-&gt;<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-&gt;<a class="code" href="structDBusTypeWriter.html#a95204ef3a9cf29ee31687032b142b836" title="where to write typecodes (or read type expectations)">type_str</a>, sub-&gt;<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">&quot;unknown&quot;</span>,
<a name="l01959"></a>01959                      sub-&gt;<a class="code" href="structDBusTypeWriter.html#afe24080d2be45fb6033833a1a38d5d1a" title="class-specific data">u</a>.array.start_pos, sub-&gt;<a class="code" href="structDBusTypeWriter.html#afe24080d2be45fb6033833a1a38d5d1a" title="class-specific data">u</a>.array.len_pos, sub-&gt;<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 &quot;1&quot;.">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 &#39;i&#39; &#39;\0&#39; [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-&gt;<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-&gt;<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 &quot;0&quot;.">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&#39;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 &quot;0&quot;.">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-&gt;<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-&gt;<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-&gt;<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 &quot;1&quot;.">TRUE</a>;
<a name="l02014"></a>02014     }
<a name="l02015"></a>02015 
<a name="l02016"></a>02016   <span class="comment">/* If we&#39;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-&gt;<a class="code" href="structDBusTypeWriter.html#aa4e4b3af31fd7a93d0e54d10882bcc07" title="where to write values">value_str</a>,
<a name="l02019"></a>02019                                  sub-&gt;<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">&quot;should not have failed to insert variant type sig len&quot;</span>);
<a name="l02022"></a>02022 
<a name="l02023"></a>02023   sub-&gt;<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&#39;re about to write */</span>
<a name="l02026"></a>02026   sub-&gt;<a class="code" href="structDBusTypeWriter.html#a95204ef3a9cf29ee31687032b142b836" title="where to write typecodes (or read type expectations)">type_str</a> = sub-&gt;<a class="code" href="structDBusTypeWriter.html#aa4e4b3af31fd7a93d0e54d10882bcc07" title="where to write values">value_str</a>;
<a name="l02027"></a>02027   sub-&gt;<a class="code" href="structDBusTypeWriter.html#a77c19debc0427372f368cfe7188951f8" title="current pos in type_str">type_pos</a> = sub-&gt;<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-&gt;<a class="code" href="structDBusTypeWriter.html#aa4e4b3af31fd7a93d0e54d10882bcc07" title="where to write values">value_str</a>, sub-&gt;<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">&quot;should not have failed to insert variant type sig&quot;</span>);
<a name="l02032"></a>02032 
<a name="l02033"></a>02033   sub-&gt;<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-&gt;<a class="code" href="structDBusTypeWriter.html#aa4e4b3af31fd7a93d0e54d10882bcc07" title="where to write values">value_str</a>,
<a name="l02036"></a>02036                                  sub-&gt;<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">&quot;should not have failed to insert variant type nul termination&quot;</span>);
<a name="l02039"></a>02039 
<a name="l02040"></a>02040   sub-&gt;<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-&gt;<a class="code" href="structDBusTypeWriter.html#aa4e4b3af31fd7a93d0e54d10882bcc07" title="where to write values">value_str</a>,
<a name="l02045"></a>02045                                   sub-&gt;<a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a>,
<a name="l02046"></a>02046                                   _DBUS_ALIGN_VALUE (sub-&gt;<a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a>, contained_alignment) - sub-&gt;<a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a>,
<a name="l02047"></a>02047                                   <span class="charliteral">&#39;\0&#39;</span>))
<a name="l02048"></a>02048     _dbus_assert_not_reached (<span class="stringliteral">&quot;should not have failed to insert alignment padding for variant body&quot;</span>);
<a name="l02049"></a>02049   sub-&gt;<a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a> = _DBUS_ALIGN_VALUE (sub-&gt;<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 &quot;1&quot;.">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&#39;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">&quot;tried to recurse into type that doesn&#39;t support that&quot;</span>);
<a name="l02093"></a>02093       <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#gaa93f0eb578d23995850d61f7d61c55c1" title="Expands to &quot;0&quot;.">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 &quot;0&quot;.">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 &quot;1&quot;.">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-&gt;<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-&gt;<a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a> - writer-&gt;<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&#39;d get all hosed */</span>
<a name="l02183"></a>02183   _dbus_assert (!writer-&gt;<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-&gt;<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> &amp;&amp; sub-&gt;<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">&quot;  type writer %p unrecurse type_pos = %d value_pos = %d is_expectation = %d container_type = %s\n&quot;</span>,
<a name="l02188"></a>02188                  writer, writer-&gt;<a class="code" href="structDBusTypeWriter.html#a77c19debc0427372f368cfe7188951f8" title="current pos in type_str">type_pos</a>, writer-&gt;<a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a>, writer-&gt;<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-&gt;<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">&quot;  type writer %p unrecurse sub type_pos = %d value_pos = %d is_expectation = %d container_type = %s\n&quot;</span>,
<a name="l02191"></a>02191                  sub, sub-&gt;<a class="code" href="structDBusTypeWriter.html#a77c19debc0427372f368cfe7188951f8" title="current pos in type_str">type_pos</a>, sub-&gt;<a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a>,
<a name="l02192"></a>02192                  sub-&gt;<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-&gt;<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-&gt;<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&#39;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 &quot;0&quot;.">FALSE</a>;
<a name="l02200"></a>02200     }
<a name="l02201"></a>02201   <span class="keywordflow">else</span> <span class="keywordflow">if</span> (sub-&gt;<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 &quot;0&quot;.">FALSE</a>;
<a name="l02205"></a>02205     }
<a name="l02206"></a>02206   <span class="keywordflow">else</span> <span class="keywordflow">if</span> (sub-&gt;<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-&gt;<a class="code" href="structDBusTypeWriter.html#afe24080d2be45fb6033833a1a38d5d1a" title="class-specific data">u</a>.array.len_pos &gt;= 0) <span class="comment">/* len_pos == -1 if we weren&#39;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-&gt;<a class="code" href="structDBusTypeWriter.html#aa4e4b3af31fd7a93d0e54d10882bcc07" title="where to write values">value_str</a>,
<a name="l02215"></a>02215                                     sub-&gt;<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-&gt;<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">&quot;    filled in sub array len to %u at len_pos %d\n&quot;</span>,
<a name="l02220"></a>02220                          len, sub-&gt;<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">&quot;    not filling in sub array len because we were disabled when we passed the len\n&quot;</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-&gt;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&#39;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-&gt;type_pos = sub-&gt;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-&gt;type_pos is already correct.</span>
<a name="l02244"></a>02244 <span class="comment">   *       writer-&gt;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-&gt;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&#39;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-&gt;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-&gt;type_pos = sub-&gt;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-&gt;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-&gt;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&#39;s only one value</span>
<a name="l02270"></a>02270 <span class="comment">   *   and we just finished writing it and won&#39;t use type_pos again</span>
<a name="l02271"></a>02271 <span class="comment">   *       writer-&gt;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-&gt;<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-&gt;<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&#39;t appear in a type string...">DBUS_TYPE_STRUCT</a> ||
<a name="l02279"></a>02279            sub-&gt;<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>) &amp;&amp;
<a name="l02280"></a>02280           (writer-&gt;<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&#39;t appear in a type string...">DBUS_TYPE_STRUCT</a> ||
<a name="l02281"></a>02281            writer-&gt;<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-&gt;<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-&gt;<a class="code" href="structDBusTypeWriter.html#a77c19debc0427372f368cfe7188951f8" title="current pos in type_str">type_pos</a> = sub-&gt;<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-&gt;<a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a> = sub-&gt;<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">&quot;  type writer %p unrecursed type_pos = %d value_pos = %d remaining sig &#39;%s&#39;\n&quot;</span>,
<a name="l02293"></a>02293                  writer, writer-&gt;<a class="code" href="structDBusTypeWriter.html#a77c19debc0427372f368cfe7188951f8" title="current pos in type_str">type_pos</a>, writer-&gt;<a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a>,
<a name="l02294"></a>02294                  writer-&gt;<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-&gt;<a class="code" href="structDBusTypeWriter.html#a95204ef3a9cf29ee31687032b142b836" title="where to write typecodes (or read type expectations)">type_str</a>, writer-&gt;<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">&quot;unknown&quot;</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 &quot;1&quot;.">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-&gt;<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> &amp;&amp; writer-&gt;<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-&gt;<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 &quot;0&quot;.">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 &quot;0&quot;.">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">&quot;failed to write typecode after prealloc&quot;</span>);
<a name="l02331"></a>02331 
<a name="l02332"></a>02332   retval = <a class="code" href="group__DBusMacros.html#gaa8cecfc5c5c054d2875c03e77b7be15d" title="Expands to &quot;1&quot;.">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">&quot;  type writer %p basic type_pos = %d value_pos = %d is_expectation = %d enabled = %d\n&quot;</span>,
<a name="l02337"></a>02337                  writer, writer-&gt;<a class="code" href="structDBusTypeWriter.html#a77c19debc0427372f368cfe7188951f8" title="current pos in type_str">type_pos</a>, writer-&gt;<a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a>, writer-&gt;<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-&gt;<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-&gt;<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-&gt;<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 &gt;= 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">&quot;  type writer %p entering fixed multi type_pos = %d value_pos = %d n_elements %d\n&quot;</span>,
<a name="l02371"></a>02371                  writer, writer-&gt;<a class="code" href="structDBusTypeWriter.html#a77c19debc0427372f368cfe7188951f8" title="current pos in type_str">type_pos</a>, writer-&gt;<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">&quot;OOM should not happen if only verifying typecode&quot;</span>);
<a name="l02376"></a>02376 
<a name="l02377"></a>02377   <span class="keywordflow">if</span> (writer-&gt;<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-&gt;<a class="code" href="structDBusTypeWriter.html#aa4e4b3af31fd7a93d0e54d10882bcc07" title="where to write values">value_str</a>,
<a name="l02380"></a>02380                                             writer-&gt;<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-&gt;<a class="code" href="structDBusTypeWriter.html#a6c4baf0b7148cf3f76924b654dada148" title="byte order to write values with">byte_order</a>,
<a name="l02385"></a>02385                                             &amp;writer-&gt;<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 &quot;0&quot;.">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">&quot;  type writer %p fixed multi written new type_pos = %d new value_pos = %d n_elements %d\n&quot;</span>,
<a name="l02391"></a>02391                  writer, writer-&gt;<a class="code" href="structDBusTypeWriter.html#a77c19debc0427372f368cfe7188951f8" title="current pos in type_str">type_pos</a>, writer-&gt;<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 &quot;1&quot;.">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-&gt;<a class="code" href="structDBusTypeWriter.html#a52c8617918c108d36b947cbdfc99c6ea" title="whether to write values">enabled</a> &amp;&amp; _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 &quot;1&quot;.">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">&quot;ENABLING writer %p at %d because reader at value_pos %d is after reader at value_pos %d\n&quot;</span>,
<a name="l02409"></a>02409                          writer, writer-&gt;<a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a>, reader-&gt;<a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a>, start_after-&gt;<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-&gt;<a class="code" href="structDBusTypeWriter.html#a52c8617918c108d36b947cbdfc99c6ea" title="whether to write values">enabled</a> &amp;&amp; !_dbus_type_reader_greater_than (reader, start_after)) ||
<a name="l02414"></a>02414                     (writer-&gt;<a class="code" href="structDBusTypeWriter.html#a52c8617918c108d36b947cbdfc99c6ea" title="whether to write values">enabled</a> &amp;&amp; _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 &quot;0&quot;.">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 &quot;0&quot;.">FALSE</a>;
<a name="l02434"></a>02434     }
<a name="l02435"></a>02435 
<a name="l02436"></a>02436   _dbus_assert (f-&gt;<a class="code" href="structDBusArrayLenFixup.html#aad03f6087695c9e9b409817ac34c6e2b" title="where the length was in the original block">len_pos_in_reader</a> == fixup-&gt;<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-&gt;<a class="code" href="structDBusArrayLenFixup.html#a97cccea61d89992e6ad3a19bd569dd2f" title="the new value of the length in the written-out block">new_len</a> == fixup-&gt;<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 &quot;1&quot;.">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&#39;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 &quot;container type&quot; 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 &amp;&amp; start_after &amp;&amp;
<a name="l02477"></a>02477               reader-&gt;<a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a> == start_after-&gt;<a class="code" href="structDBusTypeReader.html#ac17280869573f060a945a43e4a5c3ca4" title="current position in values">value_pos</a> &amp;&amp;
<a name="l02478"></a>02478               reader-&gt;<a class="code" href="structDBusTypeReader.html#af52e270ededd0aabb642c6130a3e9e40" title="string containing signature of block">type_str</a> == start_after-&gt;<a class="code" href="structDBusTypeReader.html#af52e270ededd0aabb642c6130a3e9e40" title="string containing signature of block">type_str</a> &amp;&amp;
<a name="l02479"></a>02479               reader-&gt;<a class="code" href="structDBusTypeReader.html#a160a55f9869e297572c5aa5b6ce7bc71" title="current position in signature">type_pos</a> == start_after-&gt;<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 &quot;1&quot;.">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 &quot;0&quot;.">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&#39;s a child of the curr...">_dbus_type_reader_recurse</a> (reader, &amp;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> (&amp;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> (&amp;subreader, &amp;sig_str,
<a name="l02499"></a>02499                                            &amp;sig_start, &amp;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">&quot;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&quot;</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-&gt;<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-&gt;<a class="code" href="structDBusTypeWriter.html#a27c0475eedd90be65f90a799e5210947" title="next position to write">value_pos</a>,
<a name="l02507"></a>02507                          start_after ? start_after-&gt;<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-&gt;<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 &amp;&amp; !this_is_start_after)
<a name="l02513"></a>02513             enable_if_after (writer, &amp;subreader, start_after);
<a name="l02514"></a>02514           enabled_at_recurse = writer-&gt;<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                                                         &amp;subwriter, <a class="code" href="group__DBusMacros.html#gaa93f0eb578d23995850d61f7d61c55c1" title="Expands to &quot;0&quot;.">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">&quot;recursed into subwriter at %d write target len %d\n&quot;</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 (&amp;subwriter, &amp;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">&quot;about to unrecurse from %s subreader at %d writer at %d subwriter at %d  write target len %d\n&quot;</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-&gt;<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-&gt;<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 &amp;&amp; !this_is_start_after)
<a name="l02543"></a>02543             enable_if_after (writer, &amp;subreader, start_after);
<a name="l02544"></a>02544           past_start_after = writer-&gt;<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, &amp;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&#39;t enabled when we recursed, we didn&#39;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> &amp;&amp;
<a name="l02554"></a>02554               !enabled_at_recurse &amp;&amp; past_start_after &amp;&amp;
<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> &amp;&amp;
<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&#39;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 (&amp;subwriter);
<a name="l02568"></a>02568 
<a name="l02569"></a>02569               bytes_before_start_after =
<a name="l02570"></a>02570                 start_after-&gt;<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-&gt;<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-&gt;<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> &amp;&amp; !append_fixup (fixups, &amp;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">&quot;Generated fixup len_pos_in_reader = %d new_len = %d reader_array_start_pos = %d start_after-&gt;value_pos = %d bytes_before_start_after = %d start_after_new_len = %d bytes_written_after_start_after = %d\n&quot;</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-&gt;<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 &quot;basic type&quot; 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">&quot;Reading basic value %s at %d\n&quot;</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-&gt;<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, &amp;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">&quot;Writing basic value %s at %d write target len %d inside_start_after = %d\n&quot;</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-&gt;<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-&gt;<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, &amp;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">&quot;Wrote basic value %s, new value_pos %d write target len %d\n&quot;</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-&gt;<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-&gt;<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 &quot;level&quot;.">_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 &quot;1&quot;.">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 &quot;0&quot;.">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-&gt;<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-&gt;<a class="code" href="structDBusTypeWriter.html#aa4e4b3af31fd7a93d0e54d10882bcc07" title="where to write values">value_str</a>);
<a name="l02693"></a>02693   orig_enabled = writer-&gt;<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 &quot;0&quot;.">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 &quot;0&quot;.">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 &quot;1&quot;.">TRUE</a>;
<a name="l02706"></a>02706 
<a name="l02707"></a>02707  oom:
<a name="l02708"></a>02708   <span class="keywordflow">if</span> (!writer-&gt;<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-&gt;<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-&gt;<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-&gt;<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-&gt;<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 &quot;0&quot;.">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&#39;t write any values. Types will still be written unless the</span>
<a name="l02740"></a>02740 <span class="comment"> * writer is a &quot;values only&quot; 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-&gt;<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 &quot;0&quot;.">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 &#160;<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>