KGRKJGETMRETU895U-589TY5MIGM5JGB5SDFESFREWTGR54TY
Server : Apache/2.2.17 (Unix) mod_ssl/2.2.17 OpenSSL/0.9.8e-fips-rhel5 DAV/2 PHP/5.2.17
System : Linux localhost 2.6.18-419.el5 #1 SMP Fri Feb 24 22:47:42 UTC 2017 x86_64
User : nobody ( 99)
PHP Version : 5.2.17
Disable Function : NONE
Directory :  /proc/21573/root/usr/share/devhelp/books/dbus/api/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : //proc/21573/root/usr/share/devhelp/books/dbus/api/dbus-marshal-recursive_8c-source.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
<title>D-Bus: dbus-marshal-recursive.c Source File</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
<!-- Generated by Doxygen 1.4.7 -->
<div class="tabs">
  <ul>
    <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
    <li><a href="modules.html"><span>Modules</span></a></li>
    <li><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
    <li id="current"><a href="files.html"><span>Files</span></a></li>
    <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
  </ul></div>
<h1>dbus-marshal-recursive.c</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */</span>
<a name="l00002"></a>00002 <span class="comment">/* dbus-marshal-recursive.c  Marshalling routines for recursive types</span>
<a name="l00003"></a>00003 <span class="comment"> *</span>
<a name="l00004"></a>00004 <span class="comment"> * Copyright (C) 2004, 2005 Red Hat, Inc.</span>
<a name="l00005"></a>00005 <span class="comment"> *</span>
<a name="l00006"></a>00006 <span class="comment"> * Licensed under the Academic Free License version 2.1</span>
<a name="l00007"></a>00007 <span class="comment"> *</span>
<a name="l00008"></a>00008 <span class="comment"> * This program is free software; you can redistribute it and/or modify</span>
<a name="l00009"></a>00009 <span class="comment"> * it under the terms of the GNU General Public License as published by</span>
<a name="l00010"></a>00010 <span class="comment"> * the Free Software Foundation; either version 2 of the License, or</span>
<a name="l00011"></a>00011 <span class="comment"> * (at your option) any later version.</span>
<a name="l00012"></a>00012 <span class="comment"> *</span>
<a name="l00013"></a>00013 <span class="comment"> * This program is distributed in the hope that it will be useful,</span>
<a name="l00014"></a>00014 <span class="comment"> * but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
<a name="l00015"></a>00015 <span class="comment"> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span>
<a name="l00016"></a>00016 <span class="comment"> * GNU General Public License for more details.</span>
<a name="l00017"></a>00017 <span class="comment"> *</span>
<a name="l00018"></a>00018 <span class="comment"> * You should have received a copy of the GNU General Public License</span>
<a name="l00019"></a>00019 <span class="comment"> * along with this program; if not, write to the Free Software</span>
<a name="l00020"></a>00020 <span class="comment"> * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  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 "dbus-marshal-recursive.h"</span>
<a name="l00025"></a>00025 <span class="preprocessor">#include "dbus-marshal-basic.h"</span>
<a name="l00026"></a>00026 <span class="preprocessor">#include "dbus-signature.h"</span>
<a name="l00027"></a>00027 <span class="preprocessor">#include "dbus-internals.h"</span>
<a name="l00028"></a>00028 
<a name="l00035"></a><a class="code" href="group__DBusMarshal.html#g2055dc20f1e0c13064cebf1fb65b8ce8">00035</a> <span class="preprocessor">#define RECURSIVE_MARSHAL_READ_TRACE  0</span>
<a name="l00036"></a>00036 <span class="preprocessor"></span>
<a name="l00038"></a><a class="code" href="group__DBusMarshal.html#g428a18f23d9a4c59560f03fd2088fe7f">00038</a> <span class="preprocessor">#define RECURSIVE_MARSHAL_WRITE_TRACE 0</span>
<a name="l00039"></a>00039 <span class="preprocessor"></span>
<a name="l00040"></a>00040 <span class="keyword">static</span> <span class="keywordtype">void</span>
<a name="l00041"></a>00041 free_fixups (<a class="code" href="structDBusList.html">DBusList</a> **fixups)
<a name="l00042"></a>00042 {
<a name="l00043"></a>00043   <a class="code" href="structDBusList.html">DBusList</a> *link;
<a name="l00044"></a>00044 
<a name="l00045"></a>00045   link = <a class="code" href="group__DBusList.html#g1e26ce4fb4acb50593bd5ed2f4eeb3ae">_dbus_list_get_first_link</a> (fixups);
<a name="l00046"></a>00046   <span class="keywordflow">while</span> (link != <a class="code" href="group__DBusMacros.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>)
<a name="l00047"></a>00047     {
<a name="l00048"></a>00048       <a class="code" href="structDBusList.html">DBusList</a> *next;
<a name="l00049"></a>00049 
<a name="l00050"></a>00050       next = <a class="code" href="group__DBusList.html#gede4ace46d5ee497d75074bfec4490a2">_dbus_list_get_next_link</a> (fixups, link);
<a name="l00051"></a>00051 
<a name="l00052"></a>00052       <a class="code" href="group__DBusMemory.html#g488c6b08cc8c1ddf0203243c4b27a13c">dbus_free</a> (link-&gt;<a class="code" href="structDBusList.html#29ab457bcf9092252bb0c4282c727055">data</a>);
<a name="l00053"></a>00053       <a class="code" href="group__DBusList.html#g6e824f717125ce40c549d5402e32610f">_dbus_list_free_link</a> (link);
<a name="l00054"></a>00054 
<a name="l00055"></a>00055       link = next;
<a name="l00056"></a>00056     }
<a name="l00057"></a>00057 
<a name="l00058"></a>00058   *fixups = <a class="code" href="group__DBusMacros.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>;
<a name="l00059"></a>00059 }
<a name="l00060"></a>00060 
<a name="l00061"></a>00061 <span class="keyword">static</span> <span class="keywordtype">void</span>
<a name="l00062"></a>00062 apply_and_free_fixups (<a class="code" href="structDBusList.html">DBusList</a>      **fixups,
<a name="l00063"></a>00063                        <a class="code" href="structDBusTypeReader.html">DBusTypeReader</a> *reader)
<a name="l00064"></a>00064 {
<a name="l00065"></a>00065   <a class="code" href="structDBusList.html">DBusList</a> *link;
<a name="l00066"></a>00066 
<a name="l00067"></a>00067 <span class="preprocessor">#if RECURSIVE_MARSHAL_WRITE_TRACE</span>
<a name="l00068"></a>00068 <span class="preprocessor"></span>  <span class="keywordflow">if</span> (*fixups)
<a name="l00069"></a>00069     _dbus_verbose (<span class="stringliteral">" %d FIXUPS to apply\n"</span>,
<a name="l00070"></a>00070                    <a class="code" href="group__DBusList.html#ga2144a5489bb35b16b2b671488ad597c">_dbus_list_get_length</a> (fixups));
<a name="l00071"></a>00071 <span class="preprocessor">#endif</span>
<a name="l00072"></a>00072 <span class="preprocessor"></span>
<a name="l00073"></a>00073   link = <a class="code" href="group__DBusList.html#g1e26ce4fb4acb50593bd5ed2f4eeb3ae">_dbus_list_get_first_link</a> (fixups);
<a name="l00074"></a>00074   <span class="keywordflow">while</span> (link != <a class="code" href="group__DBusMacros.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>)
<a name="l00075"></a>00075     {
<a name="l00076"></a>00076       <a class="code" href="structDBusList.html">DBusList</a> *next;
<a name="l00077"></a>00077 
<a name="l00078"></a>00078       next = <a class="code" href="group__DBusList.html#gede4ace46d5ee497d75074bfec4490a2">_dbus_list_get_next_link</a> (fixups, link);
<a name="l00079"></a>00079 
<a name="l00080"></a>00080       <span class="keywordflow">if</span> (reader)
<a name="l00081"></a>00081         {
<a name="l00082"></a>00082           <a class="code" href="structDBusArrayLenFixup.html">DBusArrayLenFixup</a> *f;
<a name="l00083"></a>00083 
<a name="l00084"></a>00084           f = link-&gt;<a class="code" href="structDBusList.html#29ab457bcf9092252bb0c4282c727055">data</a>;
<a name="l00085"></a>00085 
<a name="l00086"></a>00086 <span class="preprocessor">#if RECURSIVE_MARSHAL_WRITE_TRACE</span>
<a name="l00087"></a>00087 <span class="preprocessor"></span>          _dbus_verbose (<span class="stringliteral">" applying FIXUP to reader %p at pos %d new_len = %d old len %d\n"</span>,
<a name="l00088"></a>00088                          reader, f-&gt;<a class="code" href="structDBusArrayLenFixup.html#ad03f6087695c9e9b409817ac34c6e2b">len_pos_in_reader</a>, f-&gt;<a class="code" href="structDBusArrayLenFixup.html#97cccea61d89992e6ad3a19bd569dd2f">new_len</a>,
<a name="l00089"></a>00089                          <a class="code" href="group__DBusMarshal.html#g6dd82a202c19758cbf76dbed2946615d">_dbus_marshal_read_uint32</a> (reader-&gt;<a class="code" href="structDBusTypeReader.html#4065d7775758beb044ee23a71875571f">value_str</a>,
<a name="l00090"></a>00090                                                     f-&gt;<a class="code" href="structDBusArrayLenFixup.html#ad03f6087695c9e9b409817ac34c6e2b">len_pos_in_reader</a>,
<a name="l00091"></a>00091                                                     reader-&gt;<a class="code" href="structDBusTypeReader.html#eb0846d954066f420e1df98b81148702">byte_order</a>, <a class="code" href="group__DBusMacros.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>));
<a name="l00092"></a>00092 <span class="preprocessor">#endif</span>
<a name="l00093"></a>00093 <span class="preprocessor"></span>
<a name="l00094"></a>00094           <a class="code" href="group__DBusMarshal.html#g4bcfb6a664c7e46c7ffc31f96d532a02">_dbus_marshal_set_uint32</a> ((<a class="code" href="structDBusString.html">DBusString</a>*) reader-&gt;<a class="code" href="structDBusTypeReader.html#4065d7775758beb044ee23a71875571f">value_str</a>,
<a name="l00095"></a>00095                                     f-&gt;<a class="code" href="structDBusArrayLenFixup.html#ad03f6087695c9e9b409817ac34c6e2b">len_pos_in_reader</a>,
<a name="l00096"></a>00096                                     f-&gt;<a class="code" href="structDBusArrayLenFixup.html#97cccea61d89992e6ad3a19bd569dd2f">new_len</a>,
<a name="l00097"></a>00097                                     reader-&gt;<a class="code" href="structDBusTypeReader.html#eb0846d954066f420e1df98b81148702">byte_order</a>);
<a name="l00098"></a>00098         }
<a name="l00099"></a>00099 
<a name="l00100"></a>00100       <a class="code" href="group__DBusMemory.html#g488c6b08cc8c1ddf0203243c4b27a13c">dbus_free</a> (link-&gt;<a class="code" href="structDBusList.html#29ab457bcf9092252bb0c4282c727055">data</a>);
<a name="l00101"></a>00101       <a class="code" href="group__DBusList.html#g6e824f717125ce40c549d5402e32610f">_dbus_list_free_link</a> (link);
<a name="l00102"></a>00102 
<a name="l00103"></a>00103       link = next;
<a name="l00104"></a>00104     }
<a name="l00105"></a>00105 
<a name="l00106"></a>00106   *fixups = <a class="code" href="group__DBusMacros.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>;
<a name="l00107"></a>00107 }
<a name="l00108"></a>00108 
<a name="l00112"></a><a class="code" href="structDBusTypeReaderClass.html">00112</a> <span class="keyword">struct </span><a class="code" href="structDBusTypeReaderClass.html">DBusTypeReaderClass</a>
<a name="l00113"></a>00113 {
<a name="l00114"></a><a class="code" href="structDBusTypeReaderClass.html#fd813c32ff4b8b96266efe392dc25a89">00114</a>   <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="structDBusTypeReaderClass.html#fd813c32ff4b8b96266efe392dc25a89">name</a>;       
<a name="l00115"></a><a class="code" href="structDBusTypeReaderClass.html#7cd297c0e03c5204bc41bf305c7688c9">00115</a>   <span class="keywordtype">int</span>         <a class="code" href="structDBusTypeReaderClass.html#7cd297c0e03c5204bc41bf305c7688c9">id</a>;         
<a name="l00116"></a><a class="code" href="structDBusTypeReaderClass.html#d886037cd736e6f5cdbefb834b0bd5e7">00116</a>   <a class="code" href="group__DBusTypes.html#g39c9cb0f3a2a8ad6f55cc4855d035349">dbus_bool_t</a> <a class="code" href="structDBusTypeReaderClass.html#d886037cd736e6f5cdbefb834b0bd5e7">types_only</a>; 
<a name="l00117"></a>00117   void        (* <a class="code" href="structDBusTypeReaderClass.html#be8f7f4433f8c8eaf0c5f8d445101391">recurse</a>)          (<a class="code" href="structDBusTypeReader.html">DBusTypeReader</a>        *sub,
<a name="l00118"></a>00118                                     <a class="code" href="structDBusTypeReader.html">DBusTypeReader</a>        *parent); 
<a name="l00119"></a>00119   <a class="code" href="group__DBusTypes.html#g39c9cb0f3a2a8ad6f55cc4855d035349">dbus_bool_t</a> (* <a class="code" href="structDBusTypeReaderClass.html#023bc5274f7bf1f45f29822aebae96a1">check_finished</a>)   (<span class="keyword">const</span> <a class="code" href="structDBusTypeReader.html">DBusTypeReader</a>  *reader); 
<a name="l00120"></a>00120   void        (* <a class="code" href="structDBusTypeReaderClass.html#1b4a87e6f61339456f2e8d0ce873f379">next</a>)             (<a class="code" href="structDBusTypeReader.html">DBusTypeReader</a>        *reader,
<a name="l00121"></a>00121                                     <span class="keywordtype">int</span>                    current_type); 
<a name="l00122"></a>00122 };
<a name="l00123"></a>00123 
<a name="l00124"></a>00124 <span class="keyword">static</span> <span class="keywordtype">int</span>
<a name="l00125"></a>00125 element_type_get_alignment (<span class="keyword">const</span> <a class="code" href="structDBusString.html">DBusString</a> *str,
<a name="l00126"></a>00126                             <span class="keywordtype">int</span>               pos)
<a name="l00127"></a>00127 {
<a name="l00128"></a>00128   <span class="keywordflow">return</span> <a class="code" href="group__DBusMarshal.html#g2ba80f227880e442c140bc67653b0abd">_dbus_type_get_alignment</a> (<a class="code" href="group__DBusMarshal.html#g5866a0fd058aed3396402d0456144fd2">_dbus_first_type_in_signature</a> (str, pos));
<a name="l00129"></a>00129 }
<a name="l00130"></a>00130 
<a name="l00131"></a>00131 <span class="keyword">static</span> <span class="keywordtype">void</span>
<a name="l00132"></a>00132 reader_init (<a class="code" href="structDBusTypeReader.html">DBusTypeReader</a>    *reader,
<a name="l00133"></a>00133              <span class="keywordtype">int</span>                byte_order,
<a name="l00134"></a>00134              <span class="keyword">const</span> <a class="code" href="structDBusString.html">DBusString</a>  *type_str,
<a name="l00135"></a>00135              <span class="keywordtype">int</span>                type_pos,
<a name="l00136"></a>00136              <span class="keyword">const</span> <a class="code" href="structDBusString.html">DBusString</a>  *value_str,
<a name="l00137"></a>00137              <span class="keywordtype">int</span>                value_pos)
<a name="l00138"></a>00138 {
<a name="l00139"></a>00139   reader-&gt;<a class="code" href="structDBusTypeReader.html#eb0846d954066f420e1df98b81148702">byte_order</a> = byte_order;
<a name="l00140"></a>00140   reader-&gt;<a class="code" href="structDBusTypeReader.html#551e64ee83df38ebda8c3677a91afe1b">finished</a> = <a class="code" href="group__DBusMacros.html#ga93f0eb578d23995850d61f7d61c55c1">FALSE</a>;
<a name="l00141"></a>00141   reader-&gt;<a class="code" href="structDBusTypeReader.html#f52e270ededd0aabb642c6130a3e9e40">type_str</a> = type_str;
<a name="l00142"></a>00142   reader-&gt;<a class="code" href="structDBusTypeReader.html#160a55f9869e297572c5aa5b6ce7bc71">type_pos</a> = type_pos;
<a name="l00143"></a>00143   reader-&gt;<a class="code" href="structDBusTypeReader.html#4065d7775758beb044ee23a71875571f">value_str</a> = value_str;
<a name="l00144"></a>00144   reader-&gt;<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a> = value_pos;
<a name="l00145"></a>00145 }
<a name="l00146"></a>00146 
<a name="l00147"></a>00147 <span class="keyword">static</span> <span class="keywordtype">void</span>
<a name="l00148"></a>00148 base_reader_recurse (<a class="code" href="structDBusTypeReader.html">DBusTypeReader</a> *sub,
<a name="l00149"></a>00149                      <a class="code" href="structDBusTypeReader.html">DBusTypeReader</a> *parent)
<a name="l00150"></a>00150 {
<a name="l00151"></a>00151   <span class="comment">/* point subreader at the same place as parent */</span>
<a name="l00152"></a>00152   reader_init (sub,
<a name="l00153"></a>00153                parent-&gt;<a class="code" href="structDBusTypeReader.html#eb0846d954066f420e1df98b81148702">byte_order</a>,
<a name="l00154"></a>00154                parent-&gt;<a class="code" href="structDBusTypeReader.html#f52e270ededd0aabb642c6130a3e9e40">type_str</a>,
<a name="l00155"></a>00155                parent-&gt;<a class="code" href="structDBusTypeReader.html#160a55f9869e297572c5aa5b6ce7bc71">type_pos</a>,
<a name="l00156"></a>00156                parent-&gt;<a class="code" href="structDBusTypeReader.html#4065d7775758beb044ee23a71875571f">value_str</a>,
<a name="l00157"></a>00157                parent-&gt;<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a>);
<a name="l00158"></a>00158 }
<a name="l00159"></a>00159 
<a name="l00160"></a>00160 <span class="keyword">static</span> <span class="keywordtype">void</span>
<a name="l00161"></a>00161 struct_or_dict_entry_types_only_reader_recurse (<a class="code" href="structDBusTypeReader.html">DBusTypeReader</a> *sub,
<a name="l00162"></a>00162                                                 <a class="code" href="structDBusTypeReader.html">DBusTypeReader</a> *parent)
<a name="l00163"></a>00163 {
<a name="l00164"></a>00164   base_reader_recurse (sub, parent);
<a name="l00165"></a>00165   
<a name="l00166"></a>00166   <a class="code" href="group__DBusInternalsUtils.html#g129c6c03f011cdc171934d5d386cc797">_dbus_assert</a> (_dbus_string_get_byte (sub-&gt;<a class="code" href="structDBusTypeReader.html#f52e270ededd0aabb642c6130a3e9e40">type_str</a>,
<a name="l00167"></a>00167                                        sub-&gt;<a class="code" href="structDBusTypeReader.html#160a55f9869e297572c5aa5b6ce7bc71">type_pos</a>) == <a class="code" href="group__DBusProtocol.html#g725657eca93175475e0694b858f51fd6">DBUS_STRUCT_BEGIN_CHAR</a> ||
<a name="l00168"></a>00168                 _dbus_string_get_byte (sub-&gt;<a class="code" href="structDBusTypeReader.html#f52e270ededd0aabb642c6130a3e9e40">type_str</a>,
<a name="l00169"></a>00169                                        sub-&gt;<a class="code" href="structDBusTypeReader.html#160a55f9869e297572c5aa5b6ce7bc71">type_pos</a>) == <a class="code" href="group__DBusProtocol.html#gd51b5f7a2e6d927295479dd371f6b353">DBUS_DICT_ENTRY_BEGIN_CHAR</a>);
<a name="l00170"></a>00170 
<a name="l00171"></a>00171   sub-&gt;<a class="code" href="structDBusTypeReader.html#160a55f9869e297572c5aa5b6ce7bc71">type_pos</a> += 1;
<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_reader_recurse (<a class="code" href="structDBusTypeReader.html">DBusTypeReader</a> *sub,
<a name="l00176"></a>00176                                      <a class="code" href="structDBusTypeReader.html">DBusTypeReader</a> *parent)
<a name="l00177"></a>00177 {
<a name="l00178"></a>00178   struct_or_dict_entry_types_only_reader_recurse (sub, parent);
<a name="l00179"></a>00179 
<a name="l00180"></a>00180   <span class="comment">/* struct and dict entry have 8 byte alignment */</span>
<a name="l00181"></a>00181   sub-&gt;<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a> = _DBUS_ALIGN_VALUE (sub-&gt;<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a>, 8);
<a name="l00182"></a>00182 }
<a name="l00183"></a>00183 
<a name="l00184"></a>00184 <span class="keyword">static</span> <span class="keywordtype">void</span>
<a name="l00185"></a>00185 array_types_only_reader_recurse (<a class="code" href="structDBusTypeReader.html">DBusTypeReader</a> *sub,
<a name="l00186"></a>00186                                  <a class="code" href="structDBusTypeReader.html">DBusTypeReader</a> *parent)
<a name="l00187"></a>00187 {
<a name="l00188"></a>00188   base_reader_recurse (sub, parent);
<a name="l00189"></a>00189 
<a name="l00190"></a>00190   <span class="comment">/* point type_pos at the array element type */</span>
<a name="l00191"></a>00191   sub-&gt;<a class="code" href="structDBusTypeReader.html#160a55f9869e297572c5aa5b6ce7bc71">type_pos</a> += 1;
<a name="l00192"></a>00192 
<a name="l00193"></a>00193   <span class="comment">/* Init with values likely to crash things if misused */</span>
<a name="l00194"></a>00194   sub-&gt;<a class="code" href="structDBusTypeReader.html#da12bed6758840dc19b1fcb271fb01be">u</a>.<a class="code" href="structDBusTypeReader.html#26fa4f3e09e18d2da90218e3e0acf81b">array</a>.start_pos = <a class="code" href="group__DBusInternalsUtils.html#g5627db5e165848477e620846f6414db1">_DBUS_INT_MAX</a>;
<a name="l00195"></a>00195   sub-&gt;<a class="code" href="structDBusTypeReader.html#930fb8d6c82f269b0a151cfb33df86b3">array_len_offset</a> = 7;
<a name="l00196"></a>00196 }
<a name="l00197"></a>00197 
<a name="l00200"></a><a class="code" href="group__DBusMarshal.html#gcca774d24b7d7e790b169f23d3362497">00200</a> <span class="preprocessor">#define ARRAY_READER_LEN_POS(reader) \</span>
<a name="l00201"></a>00201 <span class="preprocessor">  ((reader)-&gt;u.array.start_pos - ((int)(reader)-&gt;array_len_offset) - 4)</span>
<a name="l00202"></a>00202 <span class="preprocessor"></span>
<a name="l00203"></a>00203 <span class="keyword">static</span> <span class="keywordtype">int</span>
<a name="l00204"></a>00204 array_reader_get_array_len (<span class="keyword">const</span> <a class="code" href="structDBusTypeReader.html">DBusTypeReader</a> *reader)
<a name="l00205"></a>00205 {
<a name="l00206"></a>00206   <a class="code" href="group__DBusTypes.html#gf513803b030613a669cc7ef199f90a8b">dbus_uint32_t</a> array_len;
<a name="l00207"></a>00207   <span class="keywordtype">int</span> len_pos;
<a name="l00208"></a>00208 
<a name="l00209"></a>00209   len_pos = <a class="code" href="group__DBusMarshal.html#gcca774d24b7d7e790b169f23d3362497">ARRAY_READER_LEN_POS</a> (reader);
<a name="l00210"></a>00210 
<a name="l00211"></a>00211   <a class="code" href="group__DBusInternalsUtils.html#g129c6c03f011cdc171934d5d386cc797">_dbus_assert</a> (_DBUS_ALIGN_VALUE (len_pos, 4) == (<span class="keywordtype">unsigned</span>) len_pos);
<a name="l00212"></a>00212   array_len = _dbus_unpack_uint32 (reader-&gt;<a class="code" href="structDBusTypeReader.html#eb0846d954066f420e1df98b81148702">byte_order</a>,
<a name="l00213"></a>00213                                    _dbus_string_get_const_data_len (reader-&gt;<a class="code" href="structDBusTypeReader.html#4065d7775758beb044ee23a71875571f">value_str</a>, len_pos, 4));
<a name="l00214"></a>00214 
<a name="l00215"></a>00215 <span class="preprocessor">#if RECURSIVE_MARSHAL_READ_TRACE</span>
<a name="l00216"></a>00216 <span class="preprocessor"></span>  _dbus_verbose (<span class="stringliteral">"   reader %p len_pos %d array len %u len_offset %d\n"</span>,
<a name="l00217"></a>00217                  reader, len_pos, array_len, reader-&gt;<a class="code" href="structDBusTypeReader.html#930fb8d6c82f269b0a151cfb33df86b3">array_len_offset</a>);
<a name="l00218"></a>00218 <span class="preprocessor">#endif</span>
<a name="l00219"></a>00219 <span class="preprocessor"></span>
<a name="l00220"></a>00220   <a class="code" href="group__DBusInternalsUtils.html#g129c6c03f011cdc171934d5d386cc797">_dbus_assert</a> (reader-&gt;<a class="code" href="structDBusTypeReader.html#da12bed6758840dc19b1fcb271fb01be">u</a>.<a class="code" href="structDBusTypeReader.html#26fa4f3e09e18d2da90218e3e0acf81b">array</a>.start_pos - len_pos - 4 &lt; 8);
<a name="l00221"></a>00221 
<a name="l00222"></a>00222   <span class="keywordflow">return</span> array_len;
<a name="l00223"></a>00223 }
<a name="l00224"></a>00224 
<a name="l00225"></a>00225 <span class="keyword">static</span> <span class="keywordtype">void</span>
<a name="l00226"></a>00226 array_reader_recurse (<a class="code" href="structDBusTypeReader.html">DBusTypeReader</a> *sub,
<a name="l00227"></a>00227                       <a class="code" href="structDBusTypeReader.html">DBusTypeReader</a> *parent)
<a name="l00228"></a>00228 {
<a name="l00229"></a>00229   <span class="keywordtype">int</span> alignment;
<a name="l00230"></a>00230   <span class="keywordtype">int</span> len_pos;
<a name="l00231"></a>00231 
<a name="l00232"></a>00232   array_types_only_reader_recurse (sub, parent);
<a name="l00233"></a>00233 
<a name="l00234"></a>00234   sub-&gt;<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a> = _DBUS_ALIGN_VALUE (sub-&gt;<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a>, 4);
<a name="l00235"></a>00235 
<a name="l00236"></a>00236   len_pos = sub-&gt;<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a>;
<a name="l00237"></a>00237 
<a name="l00238"></a>00238   sub-&gt;<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a> += 4; <span class="comment">/* for the length */</span>
<a name="l00239"></a>00239 
<a name="l00240"></a>00240   alignment = element_type_get_alignment (sub-&gt;<a class="code" href="structDBusTypeReader.html#f52e270ededd0aabb642c6130a3e9e40">type_str</a>,
<a name="l00241"></a>00241                                           sub-&gt;<a class="code" href="structDBusTypeReader.html#160a55f9869e297572c5aa5b6ce7bc71">type_pos</a>);
<a name="l00242"></a>00242 
<a name="l00243"></a>00243   sub-&gt;<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a> = _DBUS_ALIGN_VALUE (sub-&gt;<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a>, alignment);
<a name="l00244"></a>00244 
<a name="l00245"></a>00245   sub-&gt;<a class="code" href="structDBusTypeReader.html#da12bed6758840dc19b1fcb271fb01be">u</a>.<a class="code" href="structDBusTypeReader.html#26fa4f3e09e18d2da90218e3e0acf81b">array</a>.start_pos = sub-&gt;<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a>;
<a name="l00246"></a>00246   <a class="code" href="group__DBusInternalsUtils.html#g129c6c03f011cdc171934d5d386cc797">_dbus_assert</a> ((sub-&gt;<a class="code" href="structDBusTypeReader.html#da12bed6758840dc19b1fcb271fb01be">u</a>.<a class="code" href="structDBusTypeReader.html#26fa4f3e09e18d2da90218e3e0acf81b">array</a>.start_pos - (len_pos + 4)) &lt; 8); <span class="comment">/* only 3 bits in array_len_offset */</span>
<a name="l00247"></a>00247   sub-&gt;<a class="code" href="structDBusTypeReader.html#930fb8d6c82f269b0a151cfb33df86b3">array_len_offset</a> = sub-&gt;<a class="code" href="structDBusTypeReader.html#da12bed6758840dc19b1fcb271fb01be">u</a>.<a class="code" href="structDBusTypeReader.html#26fa4f3e09e18d2da90218e3e0acf81b">array</a>.start_pos - (len_pos + 4);
<a name="l00248"></a>00248 
<a name="l00249"></a>00249 <span class="preprocessor">#if RECURSIVE_MARSHAL_READ_TRACE</span>
<a name="l00250"></a>00250 <span class="preprocessor"></span>  _dbus_verbose (<span class="stringliteral">"    type reader %p array start = %d len_offset = %d array len = %d array element type = %s\n"</span>,
<a name="l00251"></a>00251                  sub,
<a name="l00252"></a>00252                  sub-&gt;<a class="code" href="structDBusTypeReader.html#da12bed6758840dc19b1fcb271fb01be">u</a>.<a class="code" href="structDBusTypeReader.html#26fa4f3e09e18d2da90218e3e0acf81b">array</a>.start_pos,
<a name="l00253"></a>00253                  sub-&gt;<a class="code" href="structDBusTypeReader.html#930fb8d6c82f269b0a151cfb33df86b3">array_len_offset</a>,
<a name="l00254"></a>00254                  array_reader_get_array_len (sub),
<a name="l00255"></a>00255                  <a class="code" href="group__DBusMarshal.html#g48a595c2b26dce6e9c25ce040e5247e5">_dbus_type_to_string</a> (<a class="code" href="group__DBusMarshal.html#g5866a0fd058aed3396402d0456144fd2">_dbus_first_type_in_signature</a> (sub-&gt;<a class="code" href="structDBusTypeReader.html#f52e270ededd0aabb642c6130a3e9e40">type_str</a>,
<a name="l00256"></a>00256                                                                 sub-&gt;<a class="code" href="structDBusTypeReader.html#160a55f9869e297572c5aa5b6ce7bc71">type_pos</a>)));
<a name="l00257"></a>00257 <span class="preprocessor">#endif</span>
<a name="l00258"></a>00258 <span class="preprocessor"></span>}
<a name="l00259"></a>00259 
<a name="l00260"></a>00260 <span class="keyword">static</span> <span class="keywordtype">void</span>
<a name="l00261"></a>00261 variant_reader_recurse (<a class="code" href="structDBusTypeReader.html">DBusTypeReader</a> *sub,
<a name="l00262"></a>00262                         <a class="code" href="structDBusTypeReader.html">DBusTypeReader</a> *parent)
<a name="l00263"></a>00263 {
<a name="l00264"></a>00264   <span class="keywordtype">int</span> sig_len;
<a name="l00265"></a>00265   <span class="keywordtype">int</span> contained_alignment;
<a name="l00266"></a>00266 
<a name="l00267"></a>00267   base_reader_recurse (sub, parent);
<a name="l00268"></a>00268 
<a name="l00269"></a>00269   <span class="comment">/* Variant is 1 byte sig length (without nul), signature with nul,</span>
<a name="l00270"></a>00270 <span class="comment">   * padding to 8-boundary, then values</span>
<a name="l00271"></a>00271 <span class="comment">   */</span>
<a name="l00272"></a>00272 
<a name="l00273"></a>00273   sig_len = _dbus_string_get_byte (sub-&gt;<a class="code" href="structDBusTypeReader.html#4065d7775758beb044ee23a71875571f">value_str</a>, sub-&gt;<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a>);
<a name="l00274"></a>00274 
<a name="l00275"></a>00275   sub-&gt;<a class="code" href="structDBusTypeReader.html#f52e270ededd0aabb642c6130a3e9e40">type_str</a> = sub-&gt;<a class="code" href="structDBusTypeReader.html#4065d7775758beb044ee23a71875571f">value_str</a>;
<a name="l00276"></a>00276   sub-&gt;<a class="code" href="structDBusTypeReader.html#160a55f9869e297572c5aa5b6ce7bc71">type_pos</a> = sub-&gt;<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a> + 1;
<a name="l00277"></a>00277 
<a name="l00278"></a>00278   sub-&gt;<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a> = sub-&gt;<a class="code" href="structDBusTypeReader.html#160a55f9869e297572c5aa5b6ce7bc71">type_pos</a> + sig_len + 1;
<a name="l00279"></a>00279 
<a name="l00280"></a>00280   contained_alignment = <a class="code" href="group__DBusMarshal.html#g2ba80f227880e442c140bc67653b0abd">_dbus_type_get_alignment</a> (<a class="code" href="group__DBusMarshal.html#g5866a0fd058aed3396402d0456144fd2">_dbus_first_type_in_signature</a> (sub-&gt;<a class="code" href="structDBusTypeReader.html#f52e270ededd0aabb642c6130a3e9e40">type_str</a>,
<a name="l00281"></a>00281                                                                            sub-&gt;<a class="code" href="structDBusTypeReader.html#160a55f9869e297572c5aa5b6ce7bc71">type_pos</a>));
<a name="l00282"></a>00282   
<a name="l00283"></a>00283   sub-&gt;<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a> = _DBUS_ALIGN_VALUE (sub-&gt;<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a>, contained_alignment);
<a name="l00284"></a>00284 
<a name="l00285"></a>00285 <span class="preprocessor">#if RECURSIVE_MARSHAL_READ_TRACE</span>
<a name="l00286"></a>00286 <span class="preprocessor"></span>  _dbus_verbose (<span class="stringliteral">"    type reader %p variant containing '%s'\n"</span>,
<a name="l00287"></a>00287                  sub,
<a name="l00288"></a>00288                  _dbus_string_get_const_data_len (sub-&gt;<a class="code" href="structDBusTypeReader.html#f52e270ededd0aabb642c6130a3e9e40">type_str</a>,
<a name="l00289"></a>00289                                                   sub-&gt;<a class="code" href="structDBusTypeReader.html#160a55f9869e297572c5aa5b6ce7bc71">type_pos</a>, 0));
<a name="l00290"></a>00290 <span class="preprocessor">#endif</span>
<a name="l00291"></a>00291 <span class="preprocessor"></span>}
<a name="l00292"></a>00292 
<a name="l00293"></a>00293 <span class="keyword">static</span> <a class="code" href="group__DBusTypes.html#g39c9cb0f3a2a8ad6f55cc4855d035349">dbus_bool_t</a>
<a name="l00294"></a>00294 array_reader_check_finished (<span class="keyword">const</span> <a class="code" href="structDBusTypeReader.html">DBusTypeReader</a> *reader)
<a name="l00295"></a>00295 {
<a name="l00296"></a>00296   <span class="keywordtype">int</span> end_pos;
<a name="l00297"></a>00297 
<a name="l00298"></a>00298   <span class="comment">/* return the array element type if elements remain, and</span>
<a name="l00299"></a>00299 <span class="comment">   * TYPE_INVALID otherwise</span>
<a name="l00300"></a>00300 <span class="comment">   */</span>
<a name="l00301"></a>00301 
<a name="l00302"></a>00302   end_pos = reader-&gt;<a class="code" href="structDBusTypeReader.html#da12bed6758840dc19b1fcb271fb01be">u</a>.<a class="code" href="structDBusTypeReader.html#26fa4f3e09e18d2da90218e3e0acf81b">array</a>.start_pos + array_reader_get_array_len (reader);
<a name="l00303"></a>00303 
<a name="l00304"></a>00304   <a class="code" href="group__DBusInternalsUtils.html#g129c6c03f011cdc171934d5d386cc797">_dbus_assert</a> (reader-&gt;<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a> &lt;= end_pos);
<a name="l00305"></a>00305   <a class="code" href="group__DBusInternalsUtils.html#g129c6c03f011cdc171934d5d386cc797">_dbus_assert</a> (reader-&gt;<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a> &gt;= reader-&gt;<a class="code" href="structDBusTypeReader.html#da12bed6758840dc19b1fcb271fb01be">u</a>.<a class="code" href="structDBusTypeReader.html#26fa4f3e09e18d2da90218e3e0acf81b">array</a>.start_pos);
<a name="l00306"></a>00306 
<a name="l00307"></a>00307   <span class="keywordflow">return</span> reader-&gt;<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a> == end_pos;
<a name="l00308"></a>00308 }
<a name="l00309"></a>00309 
<a name="l00310"></a>00310 <span class="keyword">static</span> <span class="keywordtype">void</span>
<a name="l00311"></a>00311 skip_one_complete_type (<span class="keyword">const</span> <a class="code" href="structDBusString.html">DBusString</a> *type_str,
<a name="l00312"></a>00312                         <span class="keywordtype">int</span>              *type_pos)
<a name="l00313"></a>00313 {
<a name="l00314"></a>00314   <a class="code" href="group__DBusMarshal.html#gf2f5b2f027fa7d24f6179c6dbdf71a83">_dbus_type_signature_next</a> (_dbus_string_get_const_data (type_str),
<a name="l00315"></a>00315                              type_pos);
<a name="l00316"></a>00316 }
<a name="l00317"></a>00317 
<a name="l00326"></a>00326 <span class="keywordtype">void</span>
<a name="l00327"></a><a class="code" href="group__DBusMarshal.html#gf2f5b2f027fa7d24f6179c6dbdf71a83">00327</a> <a class="code" href="group__DBusMarshal.html#gf2f5b2f027fa7d24f6179c6dbdf71a83">_dbus_type_signature_next</a> (<span class="keyword">const</span> <span class="keywordtype">char</span>       *type_str,
<a name="l00328"></a>00328                            <span class="keywordtype">int</span>              *type_pos)
<a name="l00329"></a>00329 {
<a name="l00330"></a>00330   <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *p;
<a name="l00331"></a>00331   <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *start;
<a name="l00332"></a>00332 
<a name="l00333"></a>00333   <a class="code" href="group__DBusInternalsUtils.html#g129c6c03f011cdc171934d5d386cc797">_dbus_assert</a> (type_str != <a class="code" href="group__DBusMacros.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>);
<a name="l00334"></a>00334   <a class="code" href="group__DBusInternalsUtils.html#g129c6c03f011cdc171934d5d386cc797">_dbus_assert</a> (type_pos != <a class="code" href="group__DBusMacros.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>);
<a name="l00335"></a>00335   
<a name="l00336"></a>00336   start = type_str;
<a name="l00337"></a>00337   p = start + *type_pos;
<a name="l00338"></a>00338 
<a name="l00339"></a>00339   <a class="code" href="group__DBusInternalsUtils.html#g129c6c03f011cdc171934d5d386cc797">_dbus_assert</a> (*p != <a class="code" href="group__DBusProtocol.html#geab5ea0def3f587a0ed548b77d5c5cea">DBUS_STRUCT_END_CHAR</a>);
<a name="l00340"></a>00340   <a class="code" href="group__DBusInternalsUtils.html#g129c6c03f011cdc171934d5d386cc797">_dbus_assert</a> (*p != <a class="code" href="group__DBusProtocol.html#g29ad22c7342ead042ae9e55ae20b49f1">DBUS_DICT_ENTRY_END_CHAR</a>);
<a name="l00341"></a>00341   
<a name="l00342"></a>00342   <span class="keywordflow">while</span> (*p == <a class="code" href="group__DBusProtocol.html#g8912f600f81a773066ca03d9163613a9">DBUS_TYPE_ARRAY</a>)
<a name="l00343"></a>00343     ++p;
<a name="l00344"></a>00344 
<a name="l00345"></a>00345   <a class="code" href="group__DBusInternalsUtils.html#g129c6c03f011cdc171934d5d386cc797">_dbus_assert</a> (*p != <a class="code" href="group__DBusProtocol.html#geab5ea0def3f587a0ed548b77d5c5cea">DBUS_STRUCT_END_CHAR</a>);
<a name="l00346"></a>00346   <a class="code" href="group__DBusInternalsUtils.html#g129c6c03f011cdc171934d5d386cc797">_dbus_assert</a> (*p != <a class="code" href="group__DBusProtocol.html#g29ad22c7342ead042ae9e55ae20b49f1">DBUS_DICT_ENTRY_END_CHAR</a>);
<a name="l00347"></a>00347   
<a name="l00348"></a>00348   <span class="keywordflow">if</span> (*p == <a class="code" href="group__DBusProtocol.html#g725657eca93175475e0694b858f51fd6">DBUS_STRUCT_BEGIN_CHAR</a>)
<a name="l00349"></a>00349     {
<a name="l00350"></a>00350       <span class="keywordtype">int</span> depth;
<a name="l00351"></a>00351 
<a name="l00352"></a>00352       depth = 1;
<a name="l00353"></a>00353 
<a name="l00354"></a>00354       <span class="keywordflow">while</span> (<a class="code" href="group__DBusMacros.html#ga8cecfc5c5c054d2875c03e77b7be15d">TRUE</a>)
<a name="l00355"></a>00355         {
<a name="l00356"></a>00356           <a class="code" href="group__DBusInternalsUtils.html#g129c6c03f011cdc171934d5d386cc797">_dbus_assert</a> (*p != <a class="code" href="group__DBusProtocol.html#ga9588da889743b2119dc6664712ae51e">DBUS_TYPE_INVALID</a>);
<a name="l00357"></a>00357 
<a name="l00358"></a>00358           ++p;
<a name="l00359"></a>00359 
<a name="l00360"></a>00360           <a class="code" href="group__DBusInternalsUtils.html#g129c6c03f011cdc171934d5d386cc797">_dbus_assert</a> (*p != <a class="code" href="group__DBusProtocol.html#ga9588da889743b2119dc6664712ae51e">DBUS_TYPE_INVALID</a>);
<a name="l00361"></a>00361 
<a name="l00362"></a>00362           <span class="keywordflow">if</span> (*p == <a class="code" href="group__DBusProtocol.html#g725657eca93175475e0694b858f51fd6">DBUS_STRUCT_BEGIN_CHAR</a>)
<a name="l00363"></a>00363             depth += 1;
<a name="l00364"></a>00364           <span class="keywordflow">else</span> <span class="keywordflow">if</span> (*p == <a class="code" href="group__DBusProtocol.html#geab5ea0def3f587a0ed548b77d5c5cea">DBUS_STRUCT_END_CHAR</a>)
<a name="l00365"></a>00365             {
<a name="l00366"></a>00366               depth -= 1;
<a name="l00367"></a>00367               <span class="keywordflow">if</span> (depth == 0)
<a name="l00368"></a>00368                 {
<a name="l00369"></a>00369                   ++p;
<a name="l00370"></a>00370                   <span class="keywordflow">break</span>;
<a name="l00371"></a>00371                 }
<a name="l00372"></a>00372             }
<a name="l00373"></a>00373         }
<a name="l00374"></a>00374     }
<a name="l00375"></a>00375   <span class="keywordflow">else</span> <span class="keywordflow">if</span> (*p == <a class="code" href="group__DBusProtocol.html#gd51b5f7a2e6d927295479dd371f6b353">DBUS_DICT_ENTRY_BEGIN_CHAR</a>)
<a name="l00376"></a>00376     {
<a name="l00377"></a>00377       <span class="keywordtype">int</span> depth;
<a name="l00378"></a>00378 
<a name="l00379"></a>00379       depth = 1;
<a name="l00380"></a>00380 
<a name="l00381"></a>00381       <span class="keywordflow">while</span> (<a class="code" href="group__DBusMacros.html#ga8cecfc5c5c054d2875c03e77b7be15d">TRUE</a>)
<a name="l00382"></a>00382         {
<a name="l00383"></a>00383           <a class="code" href="group__DBusInternalsUtils.html#g129c6c03f011cdc171934d5d386cc797">_dbus_assert</a> (*p != <a class="code" href="group__DBusProtocol.html#ga9588da889743b2119dc6664712ae51e">DBUS_TYPE_INVALID</a>);
<a name="l00384"></a>00384 
<a name="l00385"></a>00385           ++p;
<a name="l00386"></a>00386 
<a name="l00387"></a>00387           <a class="code" href="group__DBusInternalsUtils.html#g129c6c03f011cdc171934d5d386cc797">_dbus_assert</a> (*p != <a class="code" href="group__DBusProtocol.html#ga9588da889743b2119dc6664712ae51e">DBUS_TYPE_INVALID</a>);
<a name="l00388"></a>00388 
<a name="l00389"></a>00389           <span class="keywordflow">if</span> (*p == <a class="code" href="group__DBusProtocol.html#gd51b5f7a2e6d927295479dd371f6b353">DBUS_DICT_ENTRY_BEGIN_CHAR</a>)
<a name="l00390"></a>00390             depth += 1;
<a name="l00391"></a>00391           <span class="keywordflow">else</span> <span class="keywordflow">if</span> (*p == <a class="code" href="group__DBusProtocol.html#g29ad22c7342ead042ae9e55ae20b49f1">DBUS_DICT_ENTRY_END_CHAR</a>)
<a name="l00392"></a>00392             {
<a name="l00393"></a>00393               depth -= 1;
<a name="l00394"></a>00394               <span class="keywordflow">if</span> (depth == 0)
<a name="l00395"></a>00395                 {
<a name="l00396"></a>00396                   ++p;
<a name="l00397"></a>00397                   <span class="keywordflow">break</span>;
<a name="l00398"></a>00398                 }
<a name="l00399"></a>00399             }
<a name="l00400"></a>00400         }
<a name="l00401"></a>00401     }
<a name="l00402"></a>00402   <span class="keywordflow">else</span>
<a name="l00403"></a>00403     {
<a name="l00404"></a>00404       ++p;
<a name="l00405"></a>00405     }
<a name="l00406"></a>00406 
<a name="l00407"></a>00407   *type_pos = (int) (p - start);
<a name="l00408"></a>00408 }
<a name="l00409"></a>00409 
<a name="l00410"></a>00410 <span class="keyword">static</span> <span class="keywordtype">int</span>
<a name="l00411"></a>00411 find_len_of_complete_type (<span class="keyword">const</span> <a class="code" href="structDBusString.html">DBusString</a> *type_str,
<a name="l00412"></a>00412                            <span class="keywordtype">int</span>               type_pos)
<a name="l00413"></a>00413 {
<a name="l00414"></a>00414   <span class="keywordtype">int</span> end;
<a name="l00415"></a>00415 
<a name="l00416"></a>00416   end = type_pos;
<a name="l00417"></a>00417 
<a name="l00418"></a>00418   skip_one_complete_type (type_str, &amp;end);
<a name="l00419"></a>00419 
<a name="l00420"></a>00420   <span class="keywordflow">return</span> end - type_pos;
<a name="l00421"></a>00421 }
<a name="l00422"></a>00422 
<a name="l00423"></a>00423 <span class="keyword">static</span> <span class="keywordtype">void</span>
<a name="l00424"></a>00424 base_reader_next (<a class="code" href="structDBusTypeReader.html">DBusTypeReader</a> *reader,
<a name="l00425"></a>00425                   <span class="keywordtype">int</span>             current_type)
<a name="l00426"></a>00426 {
<a name="l00427"></a>00427   <span class="keywordflow">switch</span> (current_type)
<a name="l00428"></a>00428     {
<a name="l00429"></a>00429     <span class="keywordflow">case</span> <a class="code" href="group__DBusProtocol.html#gd2fc8e6c50e0ad927f4249fb9e53ca97">DBUS_TYPE_DICT_ENTRY</a>:
<a name="l00430"></a>00430     <span class="keywordflow">case</span> <a class="code" href="group__DBusProtocol.html#ge4b22a74b9edb0ec0ff6e0294794d3f9">DBUS_TYPE_STRUCT</a>:
<a name="l00431"></a>00431     <span class="keywordflow">case</span> <a class="code" href="group__DBusProtocol.html#g4aa7a463ad2bce4e9aa95e3e397ddcf1">DBUS_TYPE_VARIANT</a>:
<a name="l00432"></a>00432       <span class="comment">/* Scan forward over the entire container contents */</span>
<a name="l00433"></a>00433       {
<a name="l00434"></a>00434         <a class="code" href="structDBusTypeReader.html">DBusTypeReader</a> sub;
<a name="l00435"></a>00435 
<a name="l00436"></a>00436         <span class="keywordflow">if</span> (reader-&gt;<a class="code" href="structDBusTypeReader.html#238bd0d5a30d8f59fd9b71c95af25563">klass</a>-&gt;<a class="code" href="structDBusTypeReaderClass.html#d886037cd736e6f5cdbefb834b0bd5e7">types_only</a> &amp;&amp; current_type == <a class="code" href="group__DBusProtocol.html#g4aa7a463ad2bce4e9aa95e3e397ddcf1">DBUS_TYPE_VARIANT</a>)
<a name="l00437"></a>00437           ;
<a name="l00438"></a>00438         <span class="keywordflow">else</span>
<a name="l00439"></a>00439           {
<a name="l00440"></a>00440             <span class="comment">/* Recurse into the struct or variant */</span>
<a name="l00441"></a>00441             <a class="code" href="group__DBusMarshal.html#g082b410820c74b2a6ca816a8e0c91803">_dbus_type_reader_recurse</a> (reader, &amp;sub);
<a name="l00442"></a>00442 
<a name="l00443"></a>00443             <span class="comment">/* Skip everything in this subreader */</span>
<a name="l00444"></a>00444             <span class="keywordflow">while</span> (<a class="code" href="group__DBusMarshal.html#g746c09512d4905f2d2fac7ed4c3c63c2">_dbus_type_reader_next</a> (&amp;sub))
<a name="l00445"></a>00445               {
<a name="l00446"></a>00446                 <span class="comment">/* nothing */</span>;
<a name="l00447"></a>00447               }
<a name="l00448"></a>00448           }
<a name="l00449"></a>00449         <span class="keywordflow">if</span> (!reader-&gt;<a class="code" href="structDBusTypeReader.html#238bd0d5a30d8f59fd9b71c95af25563">klass</a>-&gt;<a class="code" href="structDBusTypeReaderClass.html#d886037cd736e6f5cdbefb834b0bd5e7">types_only</a>)
<a name="l00450"></a>00450           reader-&gt;<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a> = sub.<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a>;
<a name="l00451"></a>00451 
<a name="l00452"></a>00452         <span class="comment">/* Now we are at the end of this container; for variants, the</span>
<a name="l00453"></a>00453 <span class="comment">         * subreader's type_pos is totally inapplicable (it's in the</span>
<a name="l00454"></a>00454 <span class="comment">         * value string) but we know that we increment by one past the</span>
<a name="l00455"></a>00455 <span class="comment">         * DBUS_TYPE_VARIANT</span>
<a name="l00456"></a>00456 <span class="comment">         */</span>
<a name="l00457"></a>00457         <span class="keywordflow">if</span> (current_type == <a class="code" href="group__DBusProtocol.html#g4aa7a463ad2bce4e9aa95e3e397ddcf1">DBUS_TYPE_VARIANT</a>)
<a name="l00458"></a>00458           reader-&gt;<a class="code" href="structDBusTypeReader.html#160a55f9869e297572c5aa5b6ce7bc71">type_pos</a> += 1;
<a name="l00459"></a>00459         <span class="keywordflow">else</span>
<a name="l00460"></a>00460           reader-&gt;<a class="code" href="structDBusTypeReader.html#160a55f9869e297572c5aa5b6ce7bc71">type_pos</a> = sub.<a class="code" href="structDBusTypeReader.html#160a55f9869e297572c5aa5b6ce7bc71">type_pos</a>;
<a name="l00461"></a>00461       }
<a name="l00462"></a>00462       <span class="keywordflow">break</span>;
<a name="l00463"></a>00463 
<a name="l00464"></a>00464     <span class="keywordflow">case</span> <a class="code" href="group__DBusProtocol.html#g8912f600f81a773066ca03d9163613a9">DBUS_TYPE_ARRAY</a>:
<a name="l00465"></a>00465       {
<a name="l00466"></a>00466         <span class="keywordflow">if</span> (!reader-&gt;<a class="code" href="structDBusTypeReader.html#238bd0d5a30d8f59fd9b71c95af25563">klass</a>-&gt;<a class="code" href="structDBusTypeReaderClass.html#d886037cd736e6f5cdbefb834b0bd5e7">types_only</a>)
<a name="l00467"></a>00467           <a class="code" href="group__DBusMarshal.html#g8d9c5bcc039d9099df197a125a7259b8">_dbus_marshal_skip_array</a> (reader-&gt;<a class="code" href="structDBusTypeReader.html#4065d7775758beb044ee23a71875571f">value_str</a>,
<a name="l00468"></a>00468                                     <a class="code" href="group__DBusMarshal.html#g5866a0fd058aed3396402d0456144fd2">_dbus_first_type_in_signature</a> (reader-&gt;<a class="code" href="structDBusTypeReader.html#f52e270ededd0aabb642c6130a3e9e40">type_str</a>,
<a name="l00469"></a>00469                                                                    reader-&gt;<a class="code" href="structDBusTypeReader.html#160a55f9869e297572c5aa5b6ce7bc71">type_pos</a> + 1),
<a name="l00470"></a>00470                                     reader-&gt;<a class="code" href="structDBusTypeReader.html#eb0846d954066f420e1df98b81148702">byte_order</a>,
<a name="l00471"></a>00471                                     &amp;reader-&gt;<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a>);
<a name="l00472"></a>00472 
<a name="l00473"></a>00473         skip_one_complete_type (reader-&gt;<a class="code" href="structDBusTypeReader.html#f52e270ededd0aabb642c6130a3e9e40">type_str</a>, &amp;reader-&gt;<a class="code" href="structDBusTypeReader.html#160a55f9869e297572c5aa5b6ce7bc71">type_pos</a>);
<a name="l00474"></a>00474       }
<a name="l00475"></a>00475       <span class="keywordflow">break</span>;
<a name="l00476"></a>00476 
<a name="l00477"></a>00477     <span class="keywordflow">default</span>:
<a name="l00478"></a>00478       <span class="keywordflow">if</span> (!reader-&gt;<a class="code" href="structDBusTypeReader.html#238bd0d5a30d8f59fd9b71c95af25563">klass</a>-&gt;<a class="code" href="structDBusTypeReaderClass.html#d886037cd736e6f5cdbefb834b0bd5e7">types_only</a>)
<a name="l00479"></a>00479         <a class="code" href="group__DBusMarshal.html#gfd1ab7e9bd8e74cc41f03c76f4dce2dd">_dbus_marshal_skip_basic</a> (reader-&gt;<a class="code" href="structDBusTypeReader.html#4065d7775758beb044ee23a71875571f">value_str</a>,
<a name="l00480"></a>00480                                   current_type, reader-&gt;<a class="code" href="structDBusTypeReader.html#eb0846d954066f420e1df98b81148702">byte_order</a>,
<a name="l00481"></a>00481                                   &amp;reader-&gt;<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a>);
<a name="l00482"></a>00482 
<a name="l00483"></a>00483       reader-&gt;<a class="code" href="structDBusTypeReader.html#160a55f9869e297572c5aa5b6ce7bc71">type_pos</a> += 1;
<a name="l00484"></a>00484       <span class="keywordflow">break</span>;
<a name="l00485"></a>00485     }
<a name="l00486"></a>00486 }
<a name="l00487"></a>00487 
<a name="l00488"></a>00488 <span class="keyword">static</span> <span class="keywordtype">void</span>
<a name="l00489"></a>00489 struct_reader_next (<a class="code" href="structDBusTypeReader.html">DBusTypeReader</a> *reader,
<a name="l00490"></a>00490                     <span class="keywordtype">int</span>             current_type)
<a name="l00491"></a>00491 {
<a name="l00492"></a>00492   <span class="keywordtype">int</span> t;
<a name="l00493"></a>00493 
<a name="l00494"></a>00494   base_reader_next (reader, current_type);
<a name="l00495"></a>00495 
<a name="l00496"></a>00496   <span class="comment">/* for STRUCT containers we return FALSE at the end of the struct,</span>
<a name="l00497"></a>00497 <span class="comment">   * for INVALID we return FALSE at the end of the signature.</span>
<a name="l00498"></a>00498 <span class="comment">   * In both cases we arrange for get_current_type() to return INVALID</span>
<a name="l00499"></a>00499 <span class="comment">   * which is defined to happen iff we're at the end (no more next())</span>
<a name="l00500"></a>00500 <span class="comment">   */</span>
<a name="l00501"></a>00501   t = _dbus_string_get_byte (reader-&gt;<a class="code" href="structDBusTypeReader.html#f52e270ededd0aabb642c6130a3e9e40">type_str</a>, reader-&gt;<a class="code" href="structDBusTypeReader.html#160a55f9869e297572c5aa5b6ce7bc71">type_pos</a>);
<a name="l00502"></a>00502   <span class="keywordflow">if</span> (t == <a class="code" href="group__DBusProtocol.html#geab5ea0def3f587a0ed548b77d5c5cea">DBUS_STRUCT_END_CHAR</a>)
<a name="l00503"></a>00503     {
<a name="l00504"></a>00504       reader-&gt;<a class="code" href="structDBusTypeReader.html#160a55f9869e297572c5aa5b6ce7bc71">type_pos</a> += 1;
<a name="l00505"></a>00505       reader-&gt;<a class="code" href="structDBusTypeReader.html#551e64ee83df38ebda8c3677a91afe1b">finished</a> = <a class="code" href="group__DBusMacros.html#ga8cecfc5c5c054d2875c03e77b7be15d">TRUE</a>;
<a name="l00506"></a>00506     }
<a name="l00507"></a>00507 }
<a name="l00508"></a>00508 
<a name="l00509"></a>00509 <span class="keyword">static</span> <span class="keywordtype">void</span>
<a name="l00510"></a>00510 dict_entry_reader_next (<a class="code" href="structDBusTypeReader.html">DBusTypeReader</a> *reader,
<a name="l00511"></a>00511                         <span class="keywordtype">int</span>             current_type)
<a name="l00512"></a>00512 {
<a name="l00513"></a>00513   <span class="keywordtype">int</span> t;
<a name="l00514"></a>00514 
<a name="l00515"></a>00515   base_reader_next (reader, current_type);
<a name="l00516"></a>00516 
<a name="l00517"></a>00517   <span class="comment">/* for STRUCT containers we return FALSE at the end of the struct,</span>
<a name="l00518"></a>00518 <span class="comment">   * for INVALID we return FALSE at the end of the signature.</span>
<a name="l00519"></a>00519 <span class="comment">   * In both cases we arrange for get_current_type() to return INVALID</span>
<a name="l00520"></a>00520 <span class="comment">   * which is defined to happen iff we're at the end (no more next())</span>
<a name="l00521"></a>00521 <span class="comment">   */</span>
<a name="l00522"></a>00522   t = _dbus_string_get_byte (reader-&gt;<a class="code" href="structDBusTypeReader.html#f52e270ededd0aabb642c6130a3e9e40">type_str</a>, reader-&gt;<a class="code" href="structDBusTypeReader.html#160a55f9869e297572c5aa5b6ce7bc71">type_pos</a>);
<a name="l00523"></a>00523   <span class="keywordflow">if</span> (t == <a class="code" href="group__DBusProtocol.html#g29ad22c7342ead042ae9e55ae20b49f1">DBUS_DICT_ENTRY_END_CHAR</a>)
<a name="l00524"></a>00524     {
<a name="l00525"></a>00525       reader-&gt;<a class="code" href="structDBusTypeReader.html#160a55f9869e297572c5aa5b6ce7bc71">type_pos</a> += 1;
<a name="l00526"></a>00526       reader-&gt;<a class="code" href="structDBusTypeReader.html#551e64ee83df38ebda8c3677a91afe1b">finished</a> = <a class="code" href="group__DBusMacros.html#ga8cecfc5c5c054d2875c03e77b7be15d">TRUE</a>;
<a name="l00527"></a>00527     }
<a name="l00528"></a>00528 }
<a name="l00529"></a>00529 
<a name="l00530"></a>00530 <span class="keyword">static</span> <span class="keywordtype">void</span>
<a name="l00531"></a>00531 array_types_only_reader_next (<a class="code" href="structDBusTypeReader.html">DBusTypeReader</a> *reader,
<a name="l00532"></a>00532                               <span class="keywordtype">int</span>             current_type)
<a name="l00533"></a>00533 {
<a name="l00534"></a>00534   <span class="comment">/* We have one "element" to be iterated over</span>
<a name="l00535"></a>00535 <span class="comment">   * in each array, which is its element type.</span>
<a name="l00536"></a>00536 <span class="comment">   * So the finished flag indicates whether we've</span>
<a name="l00537"></a>00537 <span class="comment">   * iterated over it yet or not.</span>
<a name="l00538"></a>00538 <span class="comment">   */</span>
<a name="l00539"></a>00539   reader-&gt;<a class="code" href="structDBusTypeReader.html#551e64ee83df38ebda8c3677a91afe1b">finished</a> = <a class="code" href="group__DBusMacros.html#ga8cecfc5c5c054d2875c03e77b7be15d">TRUE</a>;
<a name="l00540"></a>00540 }
<a name="l00541"></a>00541 
<a name="l00542"></a>00542 <span class="keyword">static</span> <span class="keywordtype">void</span>
<a name="l00543"></a>00543 array_reader_next (<a class="code" href="structDBusTypeReader.html">DBusTypeReader</a> *reader,
<a name="l00544"></a>00544                    <span class="keywordtype">int</span>             current_type)
<a name="l00545"></a>00545 {
<a name="l00546"></a>00546   <span class="comment">/* Skip one array element */</span>
<a name="l00547"></a>00547   <span class="keywordtype">int</span> end_pos;
<a name="l00548"></a>00548 
<a name="l00549"></a>00549   end_pos = reader-&gt;<a class="code" href="structDBusTypeReader.html#da12bed6758840dc19b1fcb271fb01be">u</a>.<a class="code" href="structDBusTypeReader.html#26fa4f3e09e18d2da90218e3e0acf81b">array</a>.start_pos + array_reader_get_array_len (reader);
<a name="l00550"></a>00550 
<a name="l00551"></a>00551 <span class="preprocessor">#if RECURSIVE_MARSHAL_READ_TRACE</span>
<a name="l00552"></a>00552 <span class="preprocessor"></span>  _dbus_verbose (<span class="stringliteral">"  reader %p array next START start_pos = %d end_pos = %d value_pos = %d current_type = %s\n"</span>,
<a name="l00553"></a>00553                  reader,
<a name="l00554"></a>00554                  reader-&gt;<a class="code" href="structDBusTypeReader.html#da12bed6758840dc19b1fcb271fb01be">u</a>.<a class="code" href="structDBusTypeReader.html#26fa4f3e09e18d2da90218e3e0acf81b">array</a>.start_pos,
<a name="l00555"></a>00555                  end_pos, reader-&gt;<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a>,
<a name="l00556"></a>00556                  <a class="code" href="group__DBusMarshal.html#g48a595c2b26dce6e9c25ce040e5247e5">_dbus_type_to_string</a> (current_type));
<a name="l00557"></a>00557 <span class="preprocessor">#endif</span>
<a name="l00558"></a>00558 <span class="preprocessor"></span>
<a name="l00559"></a>00559   <a class="code" href="group__DBusInternalsUtils.html#g129c6c03f011cdc171934d5d386cc797">_dbus_assert</a> (reader-&gt;<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a> &lt; end_pos);
<a name="l00560"></a>00560   <a class="code" href="group__DBusInternalsUtils.html#g129c6c03f011cdc171934d5d386cc797">_dbus_assert</a> (reader-&gt;<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a> &gt;= reader-&gt;<a class="code" href="structDBusTypeReader.html#da12bed6758840dc19b1fcb271fb01be">u</a>.<a class="code" href="structDBusTypeReader.html#26fa4f3e09e18d2da90218e3e0acf81b">array</a>.start_pos);
<a name="l00561"></a>00561 
<a name="l00562"></a>00562   <span class="keywordflow">switch</span> (<a class="code" href="group__DBusMarshal.html#g5866a0fd058aed3396402d0456144fd2">_dbus_first_type_in_signature</a> (reader-&gt;<a class="code" href="structDBusTypeReader.html#f52e270ededd0aabb642c6130a3e9e40">type_str</a>,
<a name="l00563"></a>00563                                          reader-&gt;<a class="code" href="structDBusTypeReader.html#160a55f9869e297572c5aa5b6ce7bc71">type_pos</a>))
<a name="l00564"></a>00564     {
<a name="l00565"></a>00565     <span class="keywordflow">case</span> <a class="code" href="group__DBusProtocol.html#gd2fc8e6c50e0ad927f4249fb9e53ca97">DBUS_TYPE_DICT_ENTRY</a>:
<a name="l00566"></a>00566     <span class="keywordflow">case</span> <a class="code" href="group__DBusProtocol.html#ge4b22a74b9edb0ec0ff6e0294794d3f9">DBUS_TYPE_STRUCT</a>:
<a name="l00567"></a>00567     <span class="keywordflow">case</span> <a class="code" href="group__DBusProtocol.html#g4aa7a463ad2bce4e9aa95e3e397ddcf1">DBUS_TYPE_VARIANT</a>:
<a name="l00568"></a>00568       {
<a name="l00569"></a>00569         <a class="code" href="structDBusTypeReader.html">DBusTypeReader</a> sub;
<a name="l00570"></a>00570 
<a name="l00571"></a>00571         <span class="comment">/* Recurse into the struct or variant */</span>
<a name="l00572"></a>00572         <a class="code" href="group__DBusMarshal.html#g082b410820c74b2a6ca816a8e0c91803">_dbus_type_reader_recurse</a> (reader, &amp;sub);
<a name="l00573"></a>00573 
<a name="l00574"></a>00574         <span class="comment">/* Skip everything in this element */</span>
<a name="l00575"></a>00575         <span class="keywordflow">while</span> (<a class="code" href="group__DBusMarshal.html#g746c09512d4905f2d2fac7ed4c3c63c2">_dbus_type_reader_next</a> (&amp;sub))
<a name="l00576"></a>00576           {
<a name="l00577"></a>00577             <span class="comment">/* nothing */</span>;
<a name="l00578"></a>00578           }
<a name="l00579"></a>00579 
<a name="l00580"></a>00580         <span class="comment">/* Now we are at the end of this element */</span>
<a name="l00581"></a>00581         reader-&gt;<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a> = sub.value_pos;
<a name="l00582"></a>00582       }
<a name="l00583"></a>00583       <span class="keywordflow">break</span>;
<a name="l00584"></a>00584 
<a name="l00585"></a>00585     <span class="keywordflow">case</span> <a class="code" href="group__DBusProtocol.html#g8912f600f81a773066ca03d9163613a9">DBUS_TYPE_ARRAY</a>:
<a name="l00586"></a>00586       {
<a name="l00587"></a>00587         <a class="code" href="group__DBusMarshal.html#g8d9c5bcc039d9099df197a125a7259b8">_dbus_marshal_skip_array</a> (reader-&gt;<a class="code" href="structDBusTypeReader.html#4065d7775758beb044ee23a71875571f">value_str</a>,
<a name="l00588"></a>00588                                   <a class="code" href="group__DBusMarshal.html#g5866a0fd058aed3396402d0456144fd2">_dbus_first_type_in_signature</a> (reader-&gt;<a class="code" href="structDBusTypeReader.html#f52e270ededd0aabb642c6130a3e9e40">type_str</a>,
<a name="l00589"></a>00589                                                            reader-&gt;<a class="code" href="structDBusTypeReader.html#160a55f9869e297572c5aa5b6ce7bc71">type_pos</a> + 1),
<a name="l00590"></a>00590                                   reader-&gt;<a class="code" href="structDBusTypeReader.html#eb0846d954066f420e1df98b81148702">byte_order</a>,
<a name="l00591"></a>00591                                   &amp;reader-&gt;<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a>);
<a name="l00592"></a>00592       }
<a name="l00593"></a>00593       <span class="keywordflow">break</span>;
<a name="l00594"></a>00594 
<a name="l00595"></a>00595     <span class="keywordflow">default</span>:
<a name="l00596"></a>00596       {
<a name="l00597"></a>00597         <a class="code" href="group__DBusMarshal.html#gfd1ab7e9bd8e74cc41f03c76f4dce2dd">_dbus_marshal_skip_basic</a> (reader-&gt;<a class="code" href="structDBusTypeReader.html#4065d7775758beb044ee23a71875571f">value_str</a>,
<a name="l00598"></a>00598                                   current_type, reader-&gt;<a class="code" href="structDBusTypeReader.html#eb0846d954066f420e1df98b81148702">byte_order</a>,
<a name="l00599"></a>00599                                   &amp;reader-&gt;<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a>);
<a name="l00600"></a>00600       }
<a name="l00601"></a>00601       <span class="keywordflow">break</span>;
<a name="l00602"></a>00602     }
<a name="l00603"></a>00603 
<a name="l00604"></a>00604 <span class="preprocessor">#if RECURSIVE_MARSHAL_READ_TRACE</span>
<a name="l00605"></a>00605 <span class="preprocessor"></span>  _dbus_verbose (<span class="stringliteral">"  reader %p array next END start_pos = %d end_pos = %d value_pos = %d current_type = %s\n"</span>,
<a name="l00606"></a>00606                  reader,
<a name="l00607"></a>00607                  reader-&gt;<a class="code" href="structDBusTypeReader.html#da12bed6758840dc19b1fcb271fb01be">u</a>.<a class="code" href="structDBusTypeReader.html#26fa4f3e09e18d2da90218e3e0acf81b">array</a>.start_pos,
<a name="l00608"></a>00608                  end_pos, reader-&gt;<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a>,
<a name="l00609"></a>00609                  <a class="code" href="group__DBusMarshal.html#g48a595c2b26dce6e9c25ce040e5247e5">_dbus_type_to_string</a> (current_type));
<a name="l00610"></a>00610 <span class="preprocessor">#endif</span>
<a name="l00611"></a>00611 <span class="preprocessor"></span>
<a name="l00612"></a>00612   <a class="code" href="group__DBusInternalsUtils.html#g129c6c03f011cdc171934d5d386cc797">_dbus_assert</a> (reader-&gt;<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a> &lt;= end_pos);
<a name="l00613"></a>00613 
<a name="l00614"></a>00614   <span class="keywordflow">if</span> (reader-&gt;<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a> == end_pos)
<a name="l00615"></a>00615     {
<a name="l00616"></a>00616       skip_one_complete_type (reader-&gt;<a class="code" href="structDBusTypeReader.html#f52e270ededd0aabb642c6130a3e9e40">type_str</a>,
<a name="l00617"></a>00617                               &amp;reader-&gt;<a class="code" href="structDBusTypeReader.html#160a55f9869e297572c5aa5b6ce7bc71">type_pos</a>);
<a name="l00618"></a>00618     }
<a name="l00619"></a>00619 }
<a name="l00620"></a>00620 
<a name="l00621"></a>00621 <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="structDBusTypeReaderClass.html">DBusTypeReaderClass</a> body_reader_class = {
<a name="l00622"></a>00622   <span class="stringliteral">"body"</span>, 0,
<a name="l00623"></a>00623   <a class="code" href="group__DBusMacros.html#ga93f0eb578d23995850d61f7d61c55c1">FALSE</a>,
<a name="l00624"></a>00624   <a class="code" href="group__DBusMacros.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>, <span class="comment">/* body is always toplevel, so doesn't get recursed into */</span>
<a name="l00625"></a>00625   NULL,
<a name="l00626"></a>00626   base_reader_next
<a name="l00627"></a>00627 };
<a name="l00628"></a>00628 
<a name="l00629"></a>00629 <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="structDBusTypeReaderClass.html">DBusTypeReaderClass</a> body_types_only_reader_class = {
<a name="l00630"></a>00630   <span class="stringliteral">"body types"</span>, 1,
<a name="l00631"></a>00631   <a class="code" href="group__DBusMacros.html#ga8cecfc5c5c054d2875c03e77b7be15d">TRUE</a>,
<a name="l00632"></a>00632   <a class="code" href="group__DBusMacros.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>, <span class="comment">/* body is always toplevel, so doesn't get recursed into */</span>
<a name="l00633"></a>00633   NULL,
<a name="l00634"></a>00634   base_reader_next
<a name="l00635"></a>00635 };
<a name="l00636"></a>00636 
<a name="l00637"></a>00637 <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="structDBusTypeReaderClass.html">DBusTypeReaderClass</a> struct_reader_class = {
<a name="l00638"></a>00638   <span class="stringliteral">"struct"</span>, 2,
<a name="l00639"></a>00639   <a class="code" href="group__DBusMacros.html#ga93f0eb578d23995850d61f7d61c55c1">FALSE</a>,
<a name="l00640"></a>00640   struct_or_dict_entry_reader_recurse,
<a name="l00641"></a>00641   <a class="code" href="group__DBusMacros.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>,
<a name="l00642"></a>00642   struct_reader_next
<a name="l00643"></a>00643 };
<a name="l00644"></a>00644 
<a name="l00645"></a>00645 <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="structDBusTypeReaderClass.html">DBusTypeReaderClass</a> struct_types_only_reader_class = {
<a name="l00646"></a>00646   <span class="stringliteral">"struct types"</span>, 3,
<a name="l00647"></a>00647   <a class="code" href="group__DBusMacros.html#ga8cecfc5c5c054d2875c03e77b7be15d">TRUE</a>,
<a name="l00648"></a>00648   struct_or_dict_entry_types_only_reader_recurse,
<a name="l00649"></a>00649   <a class="code" href="group__DBusMacros.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>,
<a name="l00650"></a>00650   struct_reader_next
<a name="l00651"></a>00651 };
<a name="l00652"></a>00652 
<a name="l00653"></a>00653 <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="structDBusTypeReaderClass.html">DBusTypeReaderClass</a> dict_entry_reader_class = {
<a name="l00654"></a>00654   <span class="stringliteral">"dict_entry"</span>, 4,
<a name="l00655"></a>00655   <a class="code" href="group__DBusMacros.html#ga93f0eb578d23995850d61f7d61c55c1">FALSE</a>,
<a name="l00656"></a>00656   struct_or_dict_entry_reader_recurse,
<a name="l00657"></a>00657   <a class="code" href="group__DBusMacros.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>,
<a name="l00658"></a>00658   dict_entry_reader_next
<a name="l00659"></a>00659 };
<a name="l00660"></a>00660 
<a name="l00661"></a>00661 <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="structDBusTypeReaderClass.html">DBusTypeReaderClass</a> dict_entry_types_only_reader_class = {
<a name="l00662"></a>00662   <span class="stringliteral">"dict_entry types"</span>, 5,
<a name="l00663"></a>00663   <a class="code" href="group__DBusMacros.html#ga8cecfc5c5c054d2875c03e77b7be15d">TRUE</a>,
<a name="l00664"></a>00664   struct_or_dict_entry_types_only_reader_recurse,
<a name="l00665"></a>00665   <a class="code" href="group__DBusMacros.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>,
<a name="l00666"></a>00666   dict_entry_reader_next
<a name="l00667"></a>00667 };
<a name="l00668"></a>00668 
<a name="l00669"></a>00669 <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="structDBusTypeReaderClass.html">DBusTypeReaderClass</a> array_reader_class = {
<a name="l00670"></a>00670   <span class="stringliteral">"array"</span>, 6,
<a name="l00671"></a>00671   <a class="code" href="group__DBusMacros.html#ga93f0eb578d23995850d61f7d61c55c1">FALSE</a>,
<a name="l00672"></a>00672   array_reader_recurse,
<a name="l00673"></a>00673   array_reader_check_finished,
<a name="l00674"></a>00674   array_reader_next
<a name="l00675"></a>00675 };
<a name="l00676"></a>00676 
<a name="l00677"></a>00677 <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="structDBusTypeReaderClass.html">DBusTypeReaderClass</a> array_types_only_reader_class = {
<a name="l00678"></a>00678   <span class="stringliteral">"array types"</span>, 7,
<a name="l00679"></a>00679   <a class="code" href="group__DBusMacros.html#ga8cecfc5c5c054d2875c03e77b7be15d">TRUE</a>,
<a name="l00680"></a>00680   array_types_only_reader_recurse,
<a name="l00681"></a>00681   <a class="code" href="group__DBusMacros.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>,
<a name="l00682"></a>00682   array_types_only_reader_next
<a name="l00683"></a>00683 };
<a name="l00684"></a>00684 
<a name="l00685"></a>00685 <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="structDBusTypeReaderClass.html">DBusTypeReaderClass</a> variant_reader_class = {
<a name="l00686"></a>00686   <span class="stringliteral">"variant"</span>, 8,
<a name="l00687"></a>00687   <a class="code" href="group__DBusMacros.html#ga93f0eb578d23995850d61f7d61c55c1">FALSE</a>,
<a name="l00688"></a>00688   variant_reader_recurse,
<a name="l00689"></a>00689   <a class="code" href="group__DBusMacros.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>,
<a name="l00690"></a>00690   base_reader_next
<a name="l00691"></a>00691 };
<a name="l00692"></a>00692 
<a name="l00693"></a>00693 <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="structDBusTypeReaderClass.html">DBusTypeReaderClass</a> * <span class="keyword">const</span>
<a name="l00694"></a>00694 all_reader_classes[] = {
<a name="l00695"></a>00695   &amp;body_reader_class,
<a name="l00696"></a>00696   &amp;body_types_only_reader_class,
<a name="l00697"></a>00697   &amp;struct_reader_class,
<a name="l00698"></a>00698   &amp;struct_types_only_reader_class,
<a name="l00699"></a>00699   &amp;dict_entry_reader_class,
<a name="l00700"></a>00700   &amp;dict_entry_types_only_reader_class,
<a name="l00701"></a>00701   &amp;array_reader_class,
<a name="l00702"></a>00702   &amp;array_types_only_reader_class,
<a name="l00703"></a>00703   &amp;variant_reader_class
<a name="l00704"></a>00704 };
<a name="l00705"></a>00705 
<a name="l00716"></a>00716 <span class="keywordtype">void</span>
<a name="l00717"></a><a class="code" href="group__DBusMarshal.html#g35d70cf69b1196518367e3e68e9b2dd2">00717</a> <a class="code" href="group__DBusMarshal.html#g35d70cf69b1196518367e3e68e9b2dd2">_dbus_type_reader_init</a> (<a class="code" href="structDBusTypeReader.html">DBusTypeReader</a>    *reader,
<a name="l00718"></a>00718                         <span class="keywordtype">int</span>                byte_order,
<a name="l00719"></a>00719                         <span class="keyword">const</span> <a class="code" href="structDBusString.html">DBusString</a>  *type_str,
<a name="l00720"></a>00720                         <span class="keywordtype">int</span>                type_pos,
<a name="l00721"></a>00721                         <span class="keyword">const</span> <a class="code" href="structDBusString.html">DBusString</a>  *value_str,
<a name="l00722"></a>00722                         <span class="keywordtype">int</span>                value_pos)
<a name="l00723"></a>00723 {
<a name="l00724"></a>00724   reader-&gt;<a class="code" href="structDBusTypeReader.html#238bd0d5a30d8f59fd9b71c95af25563">klass</a> = &amp;body_reader_class;
<a name="l00725"></a>00725 
<a name="l00726"></a>00726   reader_init (reader, byte_order, type_str, type_pos,
<a name="l00727"></a>00727                value_str, value_pos);
<a name="l00728"></a>00728 
<a name="l00729"></a>00729 <span class="preprocessor">#if RECURSIVE_MARSHAL_READ_TRACE</span>
<a name="l00730"></a>00730 <span class="preprocessor"></span>  _dbus_verbose (<span class="stringliteral">"  type reader %p init type_pos = %d value_pos = %d remaining sig '%s'\n"</span>,
<a name="l00731"></a>00731                  reader, reader-&gt;<a class="code" href="structDBusTypeReader.html#160a55f9869e297572c5aa5b6ce7bc71">type_pos</a>, reader-&gt;<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a>,
<a name="l00732"></a>00732                  _dbus_string_get_const_data_len (reader-&gt;<a class="code" href="structDBusTypeReader.html#f52e270ededd0aabb642c6130a3e9e40">type_str</a>, reader-&gt;<a class="code" href="structDBusTypeReader.html#160a55f9869e297572c5aa5b6ce7bc71">type_pos</a>, 0));
<a name="l00733"></a>00733 <span class="preprocessor">#endif</span>
<a name="l00734"></a>00734 <span class="preprocessor"></span>}
<a name="l00735"></a>00735 
<a name="l00744"></a>00744 <span class="keywordtype">void</span>
<a name="l00745"></a><a class="code" href="group__DBusMarshal.html#g3a5845f555f11c33ebaa71a75abff661">00745</a> <a class="code" href="group__DBusMarshal.html#g3a5845f555f11c33ebaa71a75abff661">_dbus_type_reader_init_types_only</a> (<a class="code" href="structDBusTypeReader.html">DBusTypeReader</a>    *reader,
<a name="l00746"></a>00746                                    <span class="keyword">const</span> <a class="code" href="structDBusString.html">DBusString</a>  *type_str,
<a name="l00747"></a>00747                                    <span class="keywordtype">int</span>                type_pos)
<a name="l00748"></a>00748 {
<a name="l00749"></a>00749   reader-&gt;<a class="code" href="structDBusTypeReader.html#238bd0d5a30d8f59fd9b71c95af25563">klass</a> = &amp;body_types_only_reader_class;
<a name="l00750"></a>00750 
<a name="l00751"></a>00751   reader_init (reader, DBUS_COMPILER_BYTE_ORDER <span class="comment">/* irrelevant */</span>,
<a name="l00752"></a>00752                type_str, type_pos, <a class="code" href="group__DBusMacros.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>, <a class="code" href="group__DBusInternalsUtils.html#g5627db5e165848477e620846f6414db1">_DBUS_INT_MAX</a> <span class="comment">/* crashes if we screw up */</span>);
<a name="l00753"></a>00753 
<a name="l00754"></a>00754 <span class="preprocessor">#if RECURSIVE_MARSHAL_READ_TRACE</span>
<a name="l00755"></a>00755 <span class="preprocessor"></span>  _dbus_verbose (<span class="stringliteral">"  type reader %p init types only type_pos = %d remaining sig '%s'\n"</span>,
<a name="l00756"></a>00756                  reader, reader-&gt;<a class="code" href="structDBusTypeReader.html#160a55f9869e297572c5aa5b6ce7bc71">type_pos</a>,
<a name="l00757"></a>00757                  _dbus_string_get_const_data_len (reader-&gt;<a class="code" href="structDBusTypeReader.html#f52e270ededd0aabb642c6130a3e9e40">type_str</a>, reader-&gt;<a class="code" href="structDBusTypeReader.html#160a55f9869e297572c5aa5b6ce7bc71">type_pos</a>, 0));
<a name="l00758"></a>00758 <span class="preprocessor">#endif</span>
<a name="l00759"></a>00759 <span class="preprocessor"></span>}
<a name="l00760"></a>00760 
<a name="l00769"></a>00769 <span class="keywordtype">int</span>
<a name="l00770"></a><a class="code" href="group__DBusMarshal.html#gb8e39cb8084247d54d7f272c51622a73">00770</a> <a class="code" href="group__DBusMarshal.html#gb8e39cb8084247d54d7f272c51622a73">_dbus_type_reader_get_current_type</a> (<span class="keyword">const</span> <a class="code" href="structDBusTypeReader.html">DBusTypeReader</a> *reader)
<a name="l00771"></a>00771 {
<a name="l00772"></a>00772   <span class="keywordtype">int</span> t;
<a name="l00773"></a>00773 
<a name="l00774"></a>00774   <span class="keywordflow">if</span> (reader-&gt;<a class="code" href="structDBusTypeReader.html#551e64ee83df38ebda8c3677a91afe1b">finished</a> ||
<a name="l00775"></a>00775       (reader-&gt;<a class="code" href="structDBusTypeReader.html#238bd0d5a30d8f59fd9b71c95af25563">klass</a>-&gt;<a class="code" href="structDBusTypeReaderClass.html#023bc5274f7bf1f45f29822aebae96a1">check_finished</a> &amp;&amp;
<a name="l00776"></a>00776        (* reader-&gt;<a class="code" href="structDBusTypeReader.html#238bd0d5a30d8f59fd9b71c95af25563">klass</a>-&gt;<a class="code" href="structDBusTypeReaderClass.html#023bc5274f7bf1f45f29822aebae96a1">check_finished</a>) (reader)))
<a name="l00777"></a>00777     t = <a class="code" href="group__DBusProtocol.html#ga9588da889743b2119dc6664712ae51e">DBUS_TYPE_INVALID</a>;
<a name="l00778"></a>00778   <span class="keywordflow">else</span>
<a name="l00779"></a>00779     t = <a class="code" href="group__DBusMarshal.html#g5866a0fd058aed3396402d0456144fd2">_dbus_first_type_in_signature</a> (reader-&gt;<a class="code" href="structDBusTypeReader.html#f52e270ededd0aabb642c6130a3e9e40">type_str</a>,
<a name="l00780"></a>00780                                        reader-&gt;<a class="code" href="structDBusTypeReader.html#160a55f9869e297572c5aa5b6ce7bc71">type_pos</a>);
<a name="l00781"></a>00781 
<a name="l00782"></a>00782   <a class="code" href="group__DBusInternalsUtils.html#g129c6c03f011cdc171934d5d386cc797">_dbus_assert</a> (t != <a class="code" href="group__DBusProtocol.html#geab5ea0def3f587a0ed548b77d5c5cea">DBUS_STRUCT_END_CHAR</a>);
<a name="l00783"></a>00783   <a class="code" href="group__DBusInternalsUtils.html#g129c6c03f011cdc171934d5d386cc797">_dbus_assert</a> (t != <a class="code" href="group__DBusProtocol.html#g725657eca93175475e0694b858f51fd6">DBUS_STRUCT_BEGIN_CHAR</a>);
<a name="l00784"></a>00784   <a class="code" href="group__DBusInternalsUtils.html#g129c6c03f011cdc171934d5d386cc797">_dbus_assert</a> (t != <a class="code" href="group__DBusProtocol.html#g29ad22c7342ead042ae9e55ae20b49f1">DBUS_DICT_ENTRY_END_CHAR</a>);
<a name="l00785"></a>00785   <a class="code" href="group__DBusInternalsUtils.html#g129c6c03f011cdc171934d5d386cc797">_dbus_assert</a> (t != <a class="code" href="group__DBusProtocol.html#gd51b5f7a2e6d927295479dd371f6b353">DBUS_DICT_ENTRY_BEGIN_CHAR</a>);
<a name="l00786"></a>00786   
<a name="l00787"></a>00787 <span class="preprocessor">#if 0</span>
<a name="l00788"></a>00788 <span class="preprocessor"></span>  _dbus_verbose (<span class="stringliteral">"  type reader %p current type_pos = %d type = %s\n"</span>,
<a name="l00789"></a>00789                  reader, reader-&gt;<a class="code" href="structDBusTypeReader.html#160a55f9869e297572c5aa5b6ce7bc71">type_pos</a>,
<a name="l00790"></a>00790                  <a class="code" href="group__DBusMarshal.html#g48a595c2b26dce6e9c25ce040e5247e5">_dbus_type_to_string</a> (t));
<a name="l00791"></a>00791 <span class="preprocessor">#endif</span>
<a name="l00792"></a>00792 <span class="preprocessor"></span>
<a name="l00793"></a>00793   <span class="keywordflow">return</span> t;
<a name="l00794"></a>00794 }
<a name="l00795"></a>00795 
<a name="l00804"></a>00804 <span class="keywordtype">int</span>
<a name="l00805"></a><a class="code" href="group__DBusMarshal.html#g6e5439f7ca5ee8a1ce943ddab7611d0d">00805</a> <a class="code" href="group__DBusMarshal.html#g6e5439f7ca5ee8a1ce943ddab7611d0d">_dbus_type_reader_get_element_type</a> (<span class="keyword">const</span> <a class="code" href="structDBusTypeReader.html">DBusTypeReader</a>  *reader)
<a name="l00806"></a>00806 {
<a name="l00807"></a>00807   <span class="keywordtype">int</span> element_type;
<a name="l00808"></a>00808 
<a name="l00809"></a>00809   <a class="code" href="group__DBusInternalsUtils.html#g129c6c03f011cdc171934d5d386cc797">_dbus_assert</a> (<a class="code" href="group__DBusMarshal.html#gb8e39cb8084247d54d7f272c51622a73">_dbus_type_reader_get_current_type</a> (reader) == <a class="code" href="group__DBusProtocol.html#g8912f600f81a773066ca03d9163613a9">DBUS_TYPE_ARRAY</a>);
<a name="l00810"></a>00810 
<a name="l00811"></a>00811   element_type = <a class="code" href="group__DBusMarshal.html#g5866a0fd058aed3396402d0456144fd2">_dbus_first_type_in_signature</a> (reader-&gt;type_str,
<a name="l00812"></a>00812                                           reader-&gt;type_pos + 1);
<a name="l00813"></a>00813 
<a name="l00814"></a>00814   <span class="keywordflow">return</span> element_type;
<a name="l00815"></a>00815 }
<a name="l00816"></a>00816 
<a name="l00821"></a>00821 <span class="keywordtype">int</span>
<a name="l00822"></a><a class="code" href="group__DBusMarshal.html#g2a8ab1152821950b1fe29e000954981c">00822</a> <a class="code" href="group__DBusMarshal.html#g2a8ab1152821950b1fe29e000954981c">_dbus_type_reader_get_value_pos</a> (<span class="keyword">const</span> <a class="code" href="structDBusTypeReader.html">DBusTypeReader</a>  *reader)
<a name="l00823"></a>00823 {
<a name="l00824"></a>00824   <span class="keywordflow">return</span> reader-&gt;<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a>;
<a name="l00825"></a>00825 }
<a name="l00826"></a>00826 
<a name="l00836"></a>00836 <span class="keywordtype">void</span>
<a name="l00837"></a><a class="code" href="group__DBusMarshal.html#gc87315d74386314ec3b148ef737626d2">00837</a> <a class="code" href="group__DBusMarshal.html#gc87315d74386314ec3b148ef737626d2">_dbus_type_reader_read_raw</a> (<span class="keyword">const</span> <a class="code" href="structDBusTypeReader.html">DBusTypeReader</a>  *reader,
<a name="l00838"></a>00838                             <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>  **value_location)
<a name="l00839"></a>00839 {
<a name="l00840"></a>00840   <a class="code" href="group__DBusInternalsUtils.html#g129c6c03f011cdc171934d5d386cc797">_dbus_assert</a> (!reader-&gt;<a class="code" href="structDBusTypeReader.html#238bd0d5a30d8f59fd9b71c95af25563">klass</a>-&gt;<a class="code" href="structDBusTypeReaderClass.html#d886037cd736e6f5cdbefb834b0bd5e7">types_only</a>);
<a name="l00841"></a>00841 
<a name="l00842"></a>00842   *value_location = _dbus_string_get_const_data_len (reader-&gt;<a class="code" href="structDBusTypeReader.html#4065d7775758beb044ee23a71875571f">value_str</a>,
<a name="l00843"></a>00843                                                      reader-&gt;<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a>,
<a name="l00844"></a>00844                                                      0);
<a name="l00845"></a>00845 }
<a name="l00846"></a>00846 
<a name="l00853"></a>00853 <span class="keywordtype">void</span>
<a name="l00854"></a><a class="code" href="group__DBusMarshal.html#ga54355ee98d6721d7a29b5ae7d92eb9a">00854</a> <a class="code" href="group__DBusMarshal.html#ga54355ee98d6721d7a29b5ae7d92eb9a">_dbus_type_reader_read_basic</a> (<span class="keyword">const</span> <a class="code" href="structDBusTypeReader.html">DBusTypeReader</a>    *reader,
<a name="l00855"></a>00855                               <span class="keywordtype">void</span>                    *value)
<a name="l00856"></a>00856 {
<a name="l00857"></a>00857   <span class="keywordtype">int</span> t;
<a name="l00858"></a>00858 
<a name="l00859"></a>00859   <a class="code" href="group__DBusInternalsUtils.html#g129c6c03f011cdc171934d5d386cc797">_dbus_assert</a> (!reader-&gt;<a class="code" href="structDBusTypeReader.html#238bd0d5a30d8f59fd9b71c95af25563">klass</a>-&gt;<a class="code" href="structDBusTypeReaderClass.html#d886037cd736e6f5cdbefb834b0bd5e7">types_only</a>);
<a name="l00860"></a>00860 
<a name="l00861"></a>00861   t = <a class="code" href="group__DBusMarshal.html#gb8e39cb8084247d54d7f272c51622a73">_dbus_type_reader_get_current_type</a> (reader);
<a name="l00862"></a>00862 
<a name="l00863"></a>00863   <a class="code" href="group__DBusMarshal.html#gb331e099fa8cf3d94cf33ad7b20c81ae">_dbus_marshal_read_basic</a> (reader-&gt;<a class="code" href="structDBusTypeReader.html#4065d7775758beb044ee23a71875571f">value_str</a>,
<a name="l00864"></a>00864                             reader-&gt;<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a>,
<a name="l00865"></a>00865                             t, value,
<a name="l00866"></a>00866                             reader-&gt;<a class="code" href="structDBusTypeReader.html#eb0846d954066f420e1df98b81148702">byte_order</a>,
<a name="l00867"></a>00867                             <a class="code" href="group__DBusMacros.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>);
<a name="l00868"></a>00868 
<a name="l00869"></a>00869 
<a name="l00870"></a>00870 <span class="preprocessor">#if RECURSIVE_MARSHAL_READ_TRACE</span>
<a name="l00871"></a>00871 <span class="preprocessor"></span>  _dbus_verbose (<span class="stringliteral">"  type reader %p read basic type_pos = %d value_pos = %d remaining sig '%s'\n"</span>,
<a name="l00872"></a>00872                  reader, reader-&gt;<a class="code" href="structDBusTypeReader.html#160a55f9869e297572c5aa5b6ce7bc71">type_pos</a>, reader-&gt;<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a>,
<a name="l00873"></a>00873                  _dbus_string_get_const_data_len (reader-&gt;<a class="code" href="structDBusTypeReader.html#f52e270ededd0aabb642c6130a3e9e40">type_str</a>, reader-&gt;<a class="code" href="structDBusTypeReader.html#160a55f9869e297572c5aa5b6ce7bc71">type_pos</a>, 0));
<a name="l00874"></a>00874 <span class="preprocessor">#endif</span>
<a name="l00875"></a>00875 <span class="preprocessor"></span>}
<a name="l00876"></a>00876 
<a name="l00883"></a>00883 <span class="keywordtype">int</span>
<a name="l00884"></a><a class="code" href="group__DBusMarshal.html#g7def93d676d528c261aa274cea41c29d">00884</a> <a class="code" href="group__DBusMarshal.html#g7def93d676d528c261aa274cea41c29d">_dbus_type_reader_get_array_length</a> (<span class="keyword">const</span> <a class="code" href="structDBusTypeReader.html">DBusTypeReader</a>  *reader)
<a name="l00885"></a>00885 {
<a name="l00886"></a>00886   <a class="code" href="group__DBusInternalsUtils.html#g129c6c03f011cdc171934d5d386cc797">_dbus_assert</a> (!reader-&gt;<a class="code" href="structDBusTypeReader.html#238bd0d5a30d8f59fd9b71c95af25563">klass</a>-&gt;<a class="code" href="structDBusTypeReaderClass.html#d886037cd736e6f5cdbefb834b0bd5e7">types_only</a>);
<a name="l00887"></a>00887   <a class="code" href="group__DBusInternalsUtils.html#g129c6c03f011cdc171934d5d386cc797">_dbus_assert</a> (reader-&gt;<a class="code" href="structDBusTypeReader.html#238bd0d5a30d8f59fd9b71c95af25563">klass</a> == &amp;array_reader_class);
<a name="l00888"></a>00888 
<a name="l00889"></a>00889   <span class="keywordflow">return</span> array_reader_get_array_len (reader);
<a name="l00890"></a>00890 }
<a name="l00891"></a>00891 
<a name="l00907"></a>00907 <span class="keywordtype">void</span>
<a name="l00908"></a><a class="code" href="group__DBusMarshal.html#ge9a65c05e58ace9c83352f65af2fe745">00908</a> <a class="code" href="group__DBusMarshal.html#ge9a65c05e58ace9c83352f65af2fe745">_dbus_type_reader_read_fixed_multi</a> (<span class="keyword">const</span> <a class="code" href="structDBusTypeReader.html">DBusTypeReader</a>  *reader,
<a name="l00909"></a>00909                                     <span class="keywordtype">void</span>                  *value,
<a name="l00910"></a>00910                                     <span class="keywordtype">int</span>                   *n_elements)
<a name="l00911"></a>00911 {
<a name="l00912"></a>00912   <span class="keywordtype">int</span> element_type;
<a name="l00913"></a>00913   <span class="keywordtype">int</span> end_pos;
<a name="l00914"></a>00914   <span class="keywordtype">int</span> remaining_len;
<a name="l00915"></a>00915   <span class="keywordtype">int</span> alignment;
<a name="l00916"></a>00916   <span class="keywordtype">int</span> total_len;
<a name="l00917"></a>00917 
<a name="l00918"></a>00918   <a class="code" href="group__DBusInternalsUtils.html#g129c6c03f011cdc171934d5d386cc797">_dbus_assert</a> (!reader-&gt;<a class="code" href="structDBusTypeReader.html#238bd0d5a30d8f59fd9b71c95af25563">klass</a>-&gt;<a class="code" href="structDBusTypeReaderClass.html#d886037cd736e6f5cdbefb834b0bd5e7">types_only</a>);
<a name="l00919"></a>00919   <a class="code" href="group__DBusInternalsUtils.html#g129c6c03f011cdc171934d5d386cc797">_dbus_assert</a> (reader-&gt;<a class="code" href="structDBusTypeReader.html#238bd0d5a30d8f59fd9b71c95af25563">klass</a> == &amp;array_reader_class);
<a name="l00920"></a>00920 
<a name="l00921"></a>00921   element_type = <a class="code" href="group__DBusMarshal.html#g5866a0fd058aed3396402d0456144fd2">_dbus_first_type_in_signature</a> (reader-&gt;<a class="code" href="structDBusTypeReader.html#f52e270ededd0aabb642c6130a3e9e40">type_str</a>,
<a name="l00922"></a>00922                                                 reader-&gt;<a class="code" href="structDBusTypeReader.html#160a55f9869e297572c5aa5b6ce7bc71">type_pos</a>);
<a name="l00923"></a>00923 
<a name="l00924"></a>00924   <a class="code" href="group__DBusInternalsUtils.html#g129c6c03f011cdc171934d5d386cc797">_dbus_assert</a> (element_type != <a class="code" href="group__DBusProtocol.html#ga9588da889743b2119dc6664712ae51e">DBUS_TYPE_INVALID</a>); <span class="comment">/* why we don't use get_current_type() */</span>
<a name="l00925"></a>00925   <a class="code" href="group__DBusInternalsUtils.html#g129c6c03f011cdc171934d5d386cc797">_dbus_assert</a> (<a class="code" href="group__DBusSignature.html#g435ffc74ae015cc193175f5b864872bc">dbus_type_is_fixed</a> (element_type));
<a name="l00926"></a>00926 
<a name="l00927"></a>00927   alignment = <a class="code" href="group__DBusMarshal.html#g2ba80f227880e442c140bc67653b0abd">_dbus_type_get_alignment</a> (element_type);
<a name="l00928"></a>00928 
<a name="l00929"></a>00929   <a class="code" href="group__DBusInternalsUtils.html#g129c6c03f011cdc171934d5d386cc797">_dbus_assert</a> (reader-&gt;<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a> &gt;= reader-&gt;<a class="code" href="structDBusTypeReader.html#da12bed6758840dc19b1fcb271fb01be">u</a>.<a class="code" href="structDBusTypeReader.html#26fa4f3e09e18d2da90218e3e0acf81b">array</a>.start_pos);
<a name="l00930"></a>00930 
<a name="l00931"></a>00931   total_len = array_reader_get_array_len (reader);
<a name="l00932"></a>00932   end_pos = reader-&gt;<a class="code" href="structDBusTypeReader.html#da12bed6758840dc19b1fcb271fb01be">u</a>.<a class="code" href="structDBusTypeReader.html#26fa4f3e09e18d2da90218e3e0acf81b">array</a>.start_pos + total_len;
<a name="l00933"></a>00933   remaining_len = end_pos - reader-&gt;<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a>;
<a name="l00934"></a>00934 
<a name="l00935"></a>00935 <span class="preprocessor">#if RECURSIVE_MARSHAL_READ_TRACE</span>
<a name="l00936"></a>00936 <span class="preprocessor"></span>  _dbus_verbose (<span class="stringliteral">"end_pos %d total_len %d remaining_len %d value_pos %d\n"</span>,
<a name="l00937"></a>00937                  end_pos, total_len, remaining_len, reader-&gt;<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a>);
<a name="l00938"></a>00938 <span class="preprocessor">#endif</span>
<a name="l00939"></a>00939 <span class="preprocessor"></span>
<a name="l00940"></a>00940   <a class="code" href="group__DBusInternalsUtils.html#g129c6c03f011cdc171934d5d386cc797">_dbus_assert</a> (remaining_len &lt;= total_len);
<a name="l00941"></a>00941 
<a name="l00942"></a>00942   <span class="keywordflow">if</span> (remaining_len == 0)
<a name="l00943"></a>00943     *(<span class="keyword">const</span> <a class="code" href="unionDBusBasicValue.html">DBusBasicValue</a>**) value = <a class="code" href="group__DBusMacros.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>;
<a name="l00944"></a>00944   <span class="keywordflow">else</span>
<a name="l00945"></a>00945     *(<span class="keyword">const</span> <a class="code" href="unionDBusBasicValue.html">DBusBasicValue</a>**) value =
<a name="l00946"></a>00946       (<span class="keywordtype">void</span>*) _dbus_string_get_const_data_len (reader-&gt;<a class="code" href="structDBusTypeReader.html#4065d7775758beb044ee23a71875571f">value_str</a>,
<a name="l00947"></a>00947                                                reader-&gt;<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a>,
<a name="l00948"></a>00948                                                remaining_len);
<a name="l00949"></a>00949 
<a name="l00950"></a>00950   *n_elements = remaining_len / alignment;
<a name="l00951"></a>00951   <a class="code" href="group__DBusInternalsUtils.html#g129c6c03f011cdc171934d5d386cc797">_dbus_assert</a> ((remaining_len % alignment) == 0);
<a name="l00952"></a>00952 
<a name="l00953"></a>00953 <span class="preprocessor">#if RECURSIVE_MARSHAL_READ_TRACE</span>
<a name="l00954"></a>00954 <span class="preprocessor"></span>  _dbus_verbose (<span class="stringliteral">"  type reader %p read fixed array type_pos = %d value_pos = %d remaining sig '%s'\n"</span>,
<a name="l00955"></a>00955                  reader, reader-&gt;<a class="code" href="structDBusTypeReader.html#160a55f9869e297572c5aa5b6ce7bc71">type_pos</a>, reader-&gt;<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a>,
<a name="l00956"></a>00956                  _dbus_string_get_const_data_len (reader-&gt;<a class="code" href="structDBusTypeReader.html#f52e270ededd0aabb642c6130a3e9e40">type_str</a>, reader-&gt;<a class="code" href="structDBusTypeReader.html#160a55f9869e297572c5aa5b6ce7bc71">type_pos</a>, 0));
<a name="l00957"></a>00957 <span class="preprocessor">#endif</span>
<a name="l00958"></a>00958 <span class="preprocessor"></span>}
<a name="l00959"></a>00959 
<a name="l00972"></a>00972 <span class="keywordtype">void</span>
<a name="l00973"></a><a class="code" href="group__DBusMarshal.html#g082b410820c74b2a6ca816a8e0c91803">00973</a> <a class="code" href="group__DBusMarshal.html#g082b410820c74b2a6ca816a8e0c91803">_dbus_type_reader_recurse</a> (<a class="code" href="structDBusTypeReader.html">DBusTypeReader</a> *reader,
<a name="l00974"></a>00974                            <a class="code" href="structDBusTypeReader.html">DBusTypeReader</a> *sub)
<a name="l00975"></a>00975 {
<a name="l00976"></a>00976   <span class="keywordtype">int</span> t;
<a name="l00977"></a>00977 
<a name="l00978"></a>00978   t = <a class="code" href="group__DBusMarshal.html#g5866a0fd058aed3396402d0456144fd2">_dbus_first_type_in_signature</a> (reader-&gt;<a class="code" href="structDBusTypeReader.html#f52e270ededd0aabb642c6130a3e9e40">type_str</a>, reader-&gt;<a class="code" href="structDBusTypeReader.html#160a55f9869e297572c5aa5b6ce7bc71">type_pos</a>);
<a name="l00979"></a>00979 
<a name="l00980"></a>00980   <span class="keywordflow">switch</span> (t)
<a name="l00981"></a>00981     {
<a name="l00982"></a>00982     <span class="keywordflow">case</span> <a class="code" href="group__DBusProtocol.html#ge4b22a74b9edb0ec0ff6e0294794d3f9">DBUS_TYPE_STRUCT</a>:
<a name="l00983"></a>00983       <span class="keywordflow">if</span> (reader-&gt;<a class="code" href="structDBusTypeReader.html#238bd0d5a30d8f59fd9b71c95af25563">klass</a>-&gt;<a class="code" href="structDBusTypeReaderClass.html#d886037cd736e6f5cdbefb834b0bd5e7">types_only</a>)
<a name="l00984"></a>00984         sub-&gt;<a class="code" href="structDBusTypeReader.html#238bd0d5a30d8f59fd9b71c95af25563">klass</a> = &amp;struct_types_only_reader_class;
<a name="l00985"></a>00985       <span class="keywordflow">else</span>
<a name="l00986"></a>00986         sub-&gt;<a class="code" href="structDBusTypeReader.html#238bd0d5a30d8f59fd9b71c95af25563">klass</a> = &amp;struct_reader_class;
<a name="l00987"></a>00987       <span class="keywordflow">break</span>;
<a name="l00988"></a>00988     <span class="keywordflow">case</span> <a class="code" href="group__DBusProtocol.html#gd2fc8e6c50e0ad927f4249fb9e53ca97">DBUS_TYPE_DICT_ENTRY</a>:
<a name="l00989"></a>00989       <span class="keywordflow">if</span> (reader-&gt;<a class="code" href="structDBusTypeReader.html#238bd0d5a30d8f59fd9b71c95af25563">klass</a>-&gt;<a class="code" href="structDBusTypeReaderClass.html#d886037cd736e6f5cdbefb834b0bd5e7">types_only</a>)
<a name="l00990"></a>00990         sub-&gt;<a class="code" href="structDBusTypeReader.html#238bd0d5a30d8f59fd9b71c95af25563">klass</a> = &amp;dict_entry_types_only_reader_class;
<a name="l00991"></a>00991       <span class="keywordflow">else</span>
<a name="l00992"></a>00992         sub-&gt;<a class="code" href="structDBusTypeReader.html#238bd0d5a30d8f59fd9b71c95af25563">klass</a> = &amp;dict_entry_reader_class;
<a name="l00993"></a>00993       <span class="keywordflow">break</span>;
<a name="l00994"></a>00994     <span class="keywordflow">case</span> <a class="code" href="group__DBusProtocol.html#g8912f600f81a773066ca03d9163613a9">DBUS_TYPE_ARRAY</a>:
<a name="l00995"></a>00995       <span class="keywordflow">if</span> (reader-&gt;<a class="code" href="structDBusTypeReader.html#238bd0d5a30d8f59fd9b71c95af25563">klass</a>-&gt;<a class="code" href="structDBusTypeReaderClass.html#d886037cd736e6f5cdbefb834b0bd5e7">types_only</a>)
<a name="l00996"></a>00996         sub-&gt;<a class="code" href="structDBusTypeReader.html#238bd0d5a30d8f59fd9b71c95af25563">klass</a> = &amp;array_types_only_reader_class;
<a name="l00997"></a>00997       <span class="keywordflow">else</span>
<a name="l00998"></a>00998         sub-&gt;<a class="code" href="structDBusTypeReader.html#238bd0d5a30d8f59fd9b71c95af25563">klass</a> = &amp;array_reader_class;
<a name="l00999"></a>00999       <span class="keywordflow">break</span>;
<a name="l01000"></a>01000     <span class="keywordflow">case</span> <a class="code" href="group__DBusProtocol.html#g4aa7a463ad2bce4e9aa95e3e397ddcf1">DBUS_TYPE_VARIANT</a>:
<a name="l01001"></a>01001       <span class="keywordflow">if</span> (reader-&gt;<a class="code" href="structDBusTypeReader.html#238bd0d5a30d8f59fd9b71c95af25563">klass</a>-&gt;<a class="code" href="structDBusTypeReaderClass.html#d886037cd736e6f5cdbefb834b0bd5e7">types_only</a>)
<a name="l01002"></a>01002         <a class="code" href="group__DBusInternalsUtils.html#g0c4961ec784874f1b1f3aeccea8d3da1">_dbus_assert_not_reached</a> (<span class="stringliteral">"can't recurse into variant typecode"</span>);
<a name="l01003"></a>01003       <span class="keywordflow">else</span>
<a name="l01004"></a>01004         sub-&gt;<a class="code" href="structDBusTypeReader.html#238bd0d5a30d8f59fd9b71c95af25563">klass</a> = &amp;variant_reader_class;
<a name="l01005"></a>01005       <span class="keywordflow">break</span>;
<a name="l01006"></a>01006     <span class="keywordflow">default</span>:
<a name="l01007"></a>01007       _dbus_verbose (<span class="stringliteral">"recursing into type %s\n"</span>, <a class="code" href="group__DBusMarshal.html#g48a595c2b26dce6e9c25ce040e5247e5">_dbus_type_to_string</a> (t));
<a name="l01008"></a>01008 <span class="preprocessor">#ifndef DBUS_DISABLE_CHECKS</span>
<a name="l01009"></a>01009 <span class="preprocessor"></span>      <span class="keywordflow">if</span> (t == <a class="code" href="group__DBusProtocol.html#ga9588da889743b2119dc6664712ae51e">DBUS_TYPE_INVALID</a>)
<a name="l01010"></a>01010         <a class="code" href="group__DBusInternalsUtils.html#g63f2f8a068454b781f214ba596e313b4">_dbus_warn_check_failed</a> (<span class="stringliteral">"You can't recurse into an empty array or off the end of a message body\n"</span>);
<a name="l01011"></a>01011 <span class="preprocessor">#endif </span><span class="comment">/* DBUS_DISABLE_CHECKS */</span>
<a name="l01012"></a>01012 
<a name="l01013"></a>01013       <a class="code" href="group__DBusInternalsUtils.html#g0c4961ec784874f1b1f3aeccea8d3da1">_dbus_assert_not_reached</a> (<span class="stringliteral">"don't yet handle recursing into this type"</span>);
<a name="l01014"></a>01014     }
<a name="l01015"></a>01015 
<a name="l01016"></a>01016   <a class="code" href="group__DBusInternalsUtils.html#g129c6c03f011cdc171934d5d386cc797">_dbus_assert</a> (sub-&gt;<a class="code" href="structDBusTypeReader.html#238bd0d5a30d8f59fd9b71c95af25563">klass</a> == all_reader_classes[sub-&gt;<a class="code" href="structDBusTypeReader.html#238bd0d5a30d8f59fd9b71c95af25563">klass</a>-&gt;<a class="code" href="structDBusTypeReaderClass.html#7cd297c0e03c5204bc41bf305c7688c9">id</a>]);
<a name="l01017"></a>01017 
<a name="l01018"></a>01018   (* sub-&gt;<a class="code" href="structDBusTypeReader.html#238bd0d5a30d8f59fd9b71c95af25563">klass</a>-&gt;<a class="code" href="structDBusTypeReaderClass.html#be8f7f4433f8c8eaf0c5f8d445101391">recurse</a>) (sub, reader);
<a name="l01019"></a>01019 
<a name="l01020"></a>01020 <span class="preprocessor">#if RECURSIVE_MARSHAL_READ_TRACE</span>
<a name="l01021"></a>01021 <span class="preprocessor"></span>  _dbus_verbose (<span class="stringliteral">"  type reader %p RECURSED type_pos = %d value_pos = %d remaining sig '%s'\n"</span>,
<a name="l01022"></a>01022                  sub, sub-&gt;<a class="code" href="structDBusTypeReader.html#160a55f9869e297572c5aa5b6ce7bc71">type_pos</a>, sub-&gt;<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a>,
<a name="l01023"></a>01023                  _dbus_string_get_const_data_len (sub-&gt;<a class="code" href="structDBusTypeReader.html#f52e270ededd0aabb642c6130a3e9e40">type_str</a>, sub-&gt;<a class="code" href="structDBusTypeReader.html#160a55f9869e297572c5aa5b6ce7bc71">type_pos</a>, 0));
<a name="l01024"></a>01024 <span class="preprocessor">#endif</span>
<a name="l01025"></a>01025 <span class="preprocessor"></span>}
<a name="l01026"></a>01026 
<a name="l01035"></a>01035 <a class="code" href="group__DBusTypes.html#g39c9cb0f3a2a8ad6f55cc4855d035349">dbus_bool_t</a>
<a name="l01036"></a><a class="code" href="group__DBusMarshal.html#g746c09512d4905f2d2fac7ed4c3c63c2">01036</a> <a class="code" href="group__DBusMarshal.html#g746c09512d4905f2d2fac7ed4c3c63c2">_dbus_type_reader_next</a> (<a class="code" href="structDBusTypeReader.html">DBusTypeReader</a> *reader)
<a name="l01037"></a>01037 {
<a name="l01038"></a>01038   <span class="keywordtype">int</span> t;
<a name="l01039"></a>01039 
<a name="l01040"></a>01040   t = <a class="code" href="group__DBusMarshal.html#gb8e39cb8084247d54d7f272c51622a73">_dbus_type_reader_get_current_type</a> (reader);
<a name="l01041"></a>01041 
<a name="l01042"></a>01042 <span class="preprocessor">#if RECURSIVE_MARSHAL_READ_TRACE</span>
<a name="l01043"></a>01043 <span class="preprocessor"></span>  _dbus_verbose (<span class="stringliteral">"  type reader %p START next() { type_pos = %d value_pos = %d remaining sig '%s' current_type = %s\n"</span>,
<a name="l01044"></a>01044                  reader, reader-&gt;<a class="code" href="structDBusTypeReader.html#160a55f9869e297572c5aa5b6ce7bc71">type_pos</a>, reader-&gt;<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a>,
<a name="l01045"></a>01045                  _dbus_string_get_const_data_len (reader-&gt;<a class="code" href="structDBusTypeReader.html#f52e270ededd0aabb642c6130a3e9e40">type_str</a>, reader-&gt;<a class="code" href="structDBusTypeReader.html#160a55f9869e297572c5aa5b6ce7bc71">type_pos</a>, 0),
<a name="l01046"></a>01046                  <a class="code" href="group__DBusMarshal.html#g48a595c2b26dce6e9c25ce040e5247e5">_dbus_type_to_string</a> (t));
<a name="l01047"></a>01047 <span class="preprocessor">#endif</span>
<a name="l01048"></a>01048 <span class="preprocessor"></span>
<a name="l01049"></a>01049   <span class="keywordflow">if</span> (t == <a class="code" href="group__DBusProtocol.html#ga9588da889743b2119dc6664712ae51e">DBUS_TYPE_INVALID</a>)
<a name="l01050"></a>01050     <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#ga93f0eb578d23995850d61f7d61c55c1">FALSE</a>;
<a name="l01051"></a>01051 
<a name="l01052"></a>01052   (* reader-&gt;<a class="code" href="structDBusTypeReader.html#238bd0d5a30d8f59fd9b71c95af25563">klass</a>-&gt;<a class="code" href="structDBusTypeReaderClass.html#1b4a87e6f61339456f2e8d0ce873f379">next</a>) (reader, t);
<a name="l01053"></a>01053 
<a name="l01054"></a>01054 <span class="preprocessor">#if RECURSIVE_MARSHAL_READ_TRACE</span>
<a name="l01055"></a>01055 <span class="preprocessor"></span>  _dbus_verbose (<span class="stringliteral">"  type reader %p END next() type_pos = %d value_pos = %d remaining sig '%s' current_type = %s\n"</span>,
<a name="l01056"></a>01056                  reader, reader-&gt;<a class="code" href="structDBusTypeReader.html#160a55f9869e297572c5aa5b6ce7bc71">type_pos</a>, reader-&gt;<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a>,
<a name="l01057"></a>01057                  _dbus_string_get_const_data_len (reader-&gt;<a class="code" href="structDBusTypeReader.html#f52e270ededd0aabb642c6130a3e9e40">type_str</a>, reader-&gt;<a class="code" href="structDBusTypeReader.html#160a55f9869e297572c5aa5b6ce7bc71">type_pos</a>, 0),
<a name="l01058"></a>01058                  <a class="code" href="group__DBusMarshal.html#g48a595c2b26dce6e9c25ce040e5247e5">_dbus_type_to_string</a> (<a class="code" href="group__DBusMarshal.html#gb8e39cb8084247d54d7f272c51622a73">_dbus_type_reader_get_current_type</a> (reader)));
<a name="l01059"></a>01059 <span class="preprocessor">#endif</span>
<a name="l01060"></a>01060 <span class="preprocessor"></span>
<a name="l01061"></a>01061   <span class="keywordflow">return</span> <a class="code" href="group__DBusMarshal.html#gb8e39cb8084247d54d7f272c51622a73">_dbus_type_reader_get_current_type</a> (reader) != <a class="code" href="group__DBusProtocol.html#ga9588da889743b2119dc6664712ae51e">DBUS_TYPE_INVALID</a>;
<a name="l01062"></a>01062 }
<a name="l01063"></a>01063 
<a name="l01075"></a>01075 <a class="code" href="group__DBusTypes.html#g39c9cb0f3a2a8ad6f55cc4855d035349">dbus_bool_t</a>
<a name="l01076"></a><a class="code" href="group__DBusMarshal.html#g97a59dbd1597ef1b267457e809f095de">01076</a> <a class="code" href="group__DBusMarshal.html#g97a59dbd1597ef1b267457e809f095de">_dbus_type_reader_has_next</a> (<span class="keyword">const</span> <a class="code" href="structDBusTypeReader.html">DBusTypeReader</a> *reader)
<a name="l01077"></a>01077 {
<a name="l01078"></a>01078   <span class="comment">/* Not efficient but works for now. */</span>
<a name="l01079"></a>01079   <a class="code" href="structDBusTypeReader.html">DBusTypeReader</a> copy;
<a name="l01080"></a>01080 
<a name="l01081"></a>01081   copy = *reader;
<a name="l01082"></a>01082   <span class="keywordflow">return</span> <a class="code" href="group__DBusMarshal.html#g746c09512d4905f2d2fac7ed4c3c63c2">_dbus_type_reader_next</a> (&amp;copy);
<a name="l01083"></a>01083 }
<a name="l01084"></a>01084 
<a name="l01106"></a>01106 <span class="keywordtype">void</span>
<a name="l01107"></a><a class="code" href="group__DBusMarshal.html#g4578cc623c8b0978ca780ce0ab950fdb">01107</a> <a class="code" href="group__DBusMarshal.html#g4578cc623c8b0978ca780ce0ab950fdb">_dbus_type_reader_get_signature</a> (<span class="keyword">const</span> <a class="code" href="structDBusTypeReader.html">DBusTypeReader</a>  *reader,
<a name="l01108"></a>01108                                  <span class="keyword">const</span> <a class="code" href="structDBusString.html">DBusString</a>     **str_p,
<a name="l01109"></a>01109                                  <span class="keywordtype">int</span>                   *start_p,
<a name="l01110"></a>01110                                  <span class="keywordtype">int</span>                   *len_p)
<a name="l01111"></a>01111 {
<a name="l01112"></a>01112   *str_p = reader-&gt;<a class="code" href="structDBusTypeReader.html#f52e270ededd0aabb642c6130a3e9e40">type_str</a>;
<a name="l01113"></a>01113   *start_p = reader-&gt;<a class="code" href="structDBusTypeReader.html#160a55f9869e297572c5aa5b6ce7bc71">type_pos</a>;
<a name="l01114"></a>01114   *len_p = find_len_of_complete_type (reader-&gt;<a class="code" href="structDBusTypeReader.html#f52e270ededd0aabb642c6130a3e9e40">type_str</a>, reader-&gt;<a class="code" href="structDBusTypeReader.html#160a55f9869e297572c5aa5b6ce7bc71">type_pos</a>);
<a name="l01115"></a>01115 }
<a name="l01116"></a>01116 
<a name="l01117"></a><a class="code" href="structReplacementBlock.html">01117</a> <span class="keyword">typedef</span> <span class="keyword">struct</span>
<a name="l01118"></a>01118 <span class="keyword"></span>{
<a name="l01119"></a><a class="code" href="structReplacementBlock.html#562018cd2a0870abe3897b289bdd8488">01119</a>   <a class="code" href="structDBusString.html">DBusString</a> replacement; 
<a name="l01120"></a><a class="code" href="structReplacementBlock.html#2aa3220ac139545f4fa2ddec2c36d5de">01120</a>   <span class="keywordtype">int</span> padding;            
<a name="l01121"></a>01121 } <a class="code" href="structReplacementBlock.html">ReplacementBlock</a>;
<a name="l01122"></a>01122 
<a name="l01123"></a>01123 <span class="keyword">static</span> <a class="code" href="group__DBusTypes.html#g39c9cb0f3a2a8ad6f55cc4855d035349">dbus_bool_t</a>
<a name="l01124"></a>01124 replacement_block_init (<a class="code" href="structReplacementBlock.html">ReplacementBlock</a> *block,
<a name="l01125"></a>01125                         <a class="code" href="structDBusTypeReader.html">DBusTypeReader</a>   *reader)
<a name="l01126"></a>01126 {
<a name="l01127"></a>01127   <span class="keywordflow">if</span> (!<a class="code" href="group__DBusString.html#g348252317f7bb8ac43529972945830ae">_dbus_string_init</a> (&amp;block-&gt;<a class="code" href="structReplacementBlock.html#562018cd2a0870abe3897b289bdd8488">replacement</a>))
<a name="l01128"></a>01128     <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#ga93f0eb578d23995850d61f7d61c55c1">FALSE</a>;
<a name="l01129"></a>01129 
<a name="l01130"></a>01130   <span class="comment">/* % 8 is the padding to have the same align properties in</span>
<a name="l01131"></a>01131 <span class="comment">   * our replacement string as we do at the position being replaced</span>
<a name="l01132"></a>01132 <span class="comment">   */</span>
<a name="l01133"></a>01133   block-&gt;<a class="code" href="structReplacementBlock.html#2aa3220ac139545f4fa2ddec2c36d5de">padding</a> = reader-&gt;<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a> % 8;
<a name="l01134"></a>01134 
<a name="l01135"></a>01135   <span class="keywordflow">if</span> (!<a class="code" href="group__DBusString.html#g8f13997d90ceed2f437706e6b7804d9b">_dbus_string_lengthen</a> (&amp;block-&gt;<a class="code" href="structReplacementBlock.html#562018cd2a0870abe3897b289bdd8488">replacement</a>, block-&gt;<a class="code" href="structReplacementBlock.html#2aa3220ac139545f4fa2ddec2c36d5de">padding</a>))
<a name="l01136"></a>01136     <span class="keywordflow">goto</span> oom;
<a name="l01137"></a>01137 
<a name="l01138"></a>01138   <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#ga8cecfc5c5c054d2875c03e77b7be15d">TRUE</a>;
<a name="l01139"></a>01139 
<a name="l01140"></a>01140  oom:
<a name="l01141"></a>01141   <a class="code" href="group__DBusString.html#g781ca91acda49a834dce7d0ed0eef212">_dbus_string_free</a> (&amp;block-&gt;<a class="code" href="structReplacementBlock.html#562018cd2a0870abe3897b289bdd8488">replacement</a>);
<a name="l01142"></a>01142   <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#ga93f0eb578d23995850d61f7d61c55c1">FALSE</a>;
<a name="l01143"></a>01143 }
<a name="l01144"></a>01144 
<a name="l01145"></a>01145 <span class="keyword">static</span> <a class="code" href="group__DBusTypes.html#g39c9cb0f3a2a8ad6f55cc4855d035349">dbus_bool_t</a>
<a name="l01146"></a>01146 replacement_block_replace (<a class="code" href="structReplacementBlock.html">ReplacementBlock</a>     *block,
<a name="l01147"></a>01147                            <a class="code" href="structDBusTypeReader.html">DBusTypeReader</a>       *reader,
<a name="l01148"></a>01148                            <span class="keyword">const</span> <a class="code" href="structDBusTypeReader.html">DBusTypeReader</a> *realign_root)
<a name="l01149"></a>01149 {
<a name="l01150"></a>01150   <a class="code" href="structDBusTypeWriter.html">DBusTypeWriter</a> writer;
<a name="l01151"></a>01151   <a class="code" href="structDBusTypeReader.html">DBusTypeReader</a> realign_reader;
<a name="l01152"></a>01152   <a class="code" href="structDBusList.html">DBusList</a> *fixups;
<a name="l01153"></a>01153   <span class="keywordtype">int</span> orig_len;
<a name="l01154"></a>01154 
<a name="l01155"></a>01155   <a class="code" href="group__DBusInternalsUtils.html#g129c6c03f011cdc171934d5d386cc797">_dbus_assert</a> (realign_root != <a class="code" href="group__DBusMacros.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>);
<a name="l01156"></a>01156 
<a name="l01157"></a>01157   orig_len = _dbus_string_get_length (&amp;block-&gt;<a class="code" href="structReplacementBlock.html#562018cd2a0870abe3897b289bdd8488">replacement</a>);
<a name="l01158"></a>01158 
<a name="l01159"></a>01159   realign_reader = *realign_root;
<a name="l01160"></a>01160 
<a name="l01161"></a>01161 <span class="preprocessor">#if RECURSIVE_MARSHAL_WRITE_TRACE</span>
<a name="l01162"></a>01162 <span class="preprocessor"></span>  _dbus_verbose (<span class="stringliteral">"INITIALIZING replacement block writer %p at value_pos %d\n"</span>,
<a name="l01163"></a>01163                  &amp;writer, _dbus_string_get_length (&amp;block-&gt;<a class="code" href="structReplacementBlock.html#562018cd2a0870abe3897b289bdd8488">replacement</a>));
<a name="l01164"></a>01164 <span class="preprocessor">#endif</span>
<a name="l01165"></a>01165 <span class="preprocessor"></span>  <a class="code" href="group__DBusMarshal.html#g1f101175ce6f33221fcb59f0b46349bd">_dbus_type_writer_init_values_only</a> (&amp;writer,
<a name="l01166"></a>01166                                       realign_reader.<a class="code" href="structDBusTypeReader.html#eb0846d954066f420e1df98b81148702">byte_order</a>,
<a name="l01167"></a>01167                                       realign_reader.<a class="code" href="structDBusTypeReader.html#f52e270ededd0aabb642c6130a3e9e40">type_str</a>,
<a name="l01168"></a>01168                                       realign_reader.<a class="code" href="structDBusTypeReader.html#160a55f9869e297572c5aa5b6ce7bc71">type_pos</a>,
<a name="l01169"></a>01169                                       &amp;block-&gt;<a class="code" href="structReplacementBlock.html#562018cd2a0870abe3897b289bdd8488">replacement</a>,
<a name="l01170"></a>01170                                       _dbus_string_get_length (&amp;block-&gt;<a class="code" href="structReplacementBlock.html#562018cd2a0870abe3897b289bdd8488">replacement</a>));
<a name="l01171"></a>01171 
<a name="l01172"></a>01172   <a class="code" href="group__DBusInternalsUtils.html#g129c6c03f011cdc171934d5d386cc797">_dbus_assert</a> (realign_reader.<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a> &lt;= reader-&gt;<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a>);
<a name="l01173"></a>01173 
<a name="l01174"></a>01174 <span class="preprocessor">#if RECURSIVE_MARSHAL_WRITE_TRACE</span>
<a name="l01175"></a>01175 <span class="preprocessor"></span>  _dbus_verbose (<span class="stringliteral">"COPYING from reader at value_pos %d to writer %p starting after value_pos %d\n"</span>,
<a name="l01176"></a>01176                  realign_reader.<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a>, &amp;writer, reader-&gt;<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a>);
<a name="l01177"></a>01177 <span class="preprocessor">#endif</span>
<a name="l01178"></a>01178 <span class="preprocessor"></span>  fixups = <a class="code" href="group__DBusMacros.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>;
<a name="l01179"></a>01179   <span class="keywordflow">if</span> (!<a class="code" href="group__DBusMarshal.html#g004da084963a3a74589b28611b9d8398">_dbus_type_writer_write_reader_partial</a> (&amp;writer,
<a name="l01180"></a>01180                                                &amp;realign_reader,
<a name="l01181"></a>01181                                                reader,
<a name="l01182"></a>01182                                                block-&gt;<a class="code" href="structReplacementBlock.html#2aa3220ac139545f4fa2ddec2c36d5de">padding</a>,
<a name="l01183"></a>01183                                                _dbus_string_get_length (&amp;block-&gt;<a class="code" href="structReplacementBlock.html#562018cd2a0870abe3897b289bdd8488">replacement</a>) - block-&gt;<a class="code" href="structReplacementBlock.html#2aa3220ac139545f4fa2ddec2c36d5de">padding</a>,
<a name="l01184"></a>01184                                                &amp;fixups))
<a name="l01185"></a>01185     <span class="keywordflow">goto</span> oom;
<a name="l01186"></a>01186 
<a name="l01187"></a>01187 <span class="preprocessor">#if RECURSIVE_MARSHAL_WRITE_TRACE</span>
<a name="l01188"></a>01188 <span class="preprocessor"></span>  _dbus_verbose (<span class="stringliteral">"REPLACEMENT at padding %d len %d\n"</span>, block-&gt;<a class="code" href="structReplacementBlock.html#2aa3220ac139545f4fa2ddec2c36d5de">padding</a>,
<a name="l01189"></a>01189                  _dbus_string_get_length (&amp;block-&gt;<a class="code" href="structReplacementBlock.html#562018cd2a0870abe3897b289bdd8488">replacement</a>) - block-&gt;<a class="code" href="structReplacementBlock.html#2aa3220ac139545f4fa2ddec2c36d5de">padding</a>);
<a name="l01190"></a>01190   <a class="code" href="group__DBusMarshal.html#g3926bb35edf78d114cf0c341fe3258e0">_dbus_verbose_bytes_of_string</a> (&amp;block-&gt;<a class="code" href="structReplacementBlock.html#562018cd2a0870abe3897b289bdd8488">replacement</a>, block-&gt;<a class="code" href="structReplacementBlock.html#2aa3220ac139545f4fa2ddec2c36d5de">padding</a>,
<a name="l01191"></a>01191                                  _dbus_string_get_length (&amp;block-&gt;<a class="code" href="structReplacementBlock.html#562018cd2a0870abe3897b289bdd8488">replacement</a>) - block-&gt;<a class="code" href="structReplacementBlock.html#2aa3220ac139545f4fa2ddec2c36d5de">padding</a>);
<a name="l01192"></a>01192   _dbus_verbose (<span class="stringliteral">"TO BE REPLACED at value_pos = %d (align pad %d) len %d realign_reader.value_pos %d\n"</span>,
<a name="l01193"></a>01193                  reader-&gt;<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a>, reader-&gt;<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a> % 8,
<a name="l01194"></a>01194                  realign_reader.<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a> - reader-&gt;<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a>,
<a name="l01195"></a>01195                  realign_reader.<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a>);
<a name="l01196"></a>01196   <a class="code" href="group__DBusMarshal.html#g3926bb35edf78d114cf0c341fe3258e0">_dbus_verbose_bytes_of_string</a> (reader-&gt;<a class="code" href="structDBusTypeReader.html#4065d7775758beb044ee23a71875571f">value_str</a>,
<a name="l01197"></a>01197                                  reader-&gt;<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a>,
<a name="l01198"></a>01198                                  realign_reader.<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a> - reader-&gt;<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a>);
<a name="l01199"></a>01199 <span class="preprocessor">#endif</span>
<a name="l01200"></a>01200 <span class="preprocessor"></span>
<a name="l01201"></a>01201   <span class="comment">/* Move the replacement into position</span>
<a name="l01202"></a>01202 <span class="comment">   * (realign_reader should now be at the end of the block to be replaced)</span>
<a name="l01203"></a>01203 <span class="comment">   */</span>
<a name="l01204"></a>01204   <span class="keywordflow">if</span> (!<a class="code" href="group__DBusString.html#gfe7921a92467cdefaa0a7829d6cf260b">_dbus_string_replace_len</a> (&amp;block-&gt;<a class="code" href="structReplacementBlock.html#562018cd2a0870abe3897b289bdd8488">replacement</a>, block-&gt;<a class="code" href="structReplacementBlock.html#2aa3220ac139545f4fa2ddec2c36d5de">padding</a>,
<a name="l01205"></a>01205                                  _dbus_string_get_length (&amp;block-&gt;<a class="code" href="structReplacementBlock.html#562018cd2a0870abe3897b289bdd8488">replacement</a>) - block-&gt;<a class="code" href="structReplacementBlock.html#2aa3220ac139545f4fa2ddec2c36d5de">padding</a>,
<a name="l01206"></a>01206                                  (<a class="code" href="structDBusString.html">DBusString</a>*) reader-&gt;<a class="code" href="structDBusTypeReader.html#4065d7775758beb044ee23a71875571f">value_str</a>,
<a name="l01207"></a>01207                                  reader-&gt;<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a>,
<a name="l01208"></a>01208                                  realign_reader.<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a> - reader-&gt;<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a>))
<a name="l01209"></a>01209     <span class="keywordflow">goto</span> oom;
<a name="l01210"></a>01210 
<a name="l01211"></a>01211   <span class="comment">/* Process our fixups now that we can't have an OOM error */</span>
<a name="l01212"></a>01212   apply_and_free_fixups (&amp;fixups, reader);
<a name="l01213"></a>01213 
<a name="l01214"></a>01214   <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#ga8cecfc5c5c054d2875c03e77b7be15d">TRUE</a>;
<a name="l01215"></a>01215 
<a name="l01216"></a>01216  oom:
<a name="l01217"></a>01217   <a class="code" href="group__DBusString.html#g08c423b93c28dd746dcb93e0461ab95c">_dbus_string_set_length</a> (&amp;block-&gt;<a class="code" href="structReplacementBlock.html#562018cd2a0870abe3897b289bdd8488">replacement</a>, orig_len);
<a name="l01218"></a>01218   free_fixups (&amp;fixups);
<a name="l01219"></a>01219   <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#ga93f0eb578d23995850d61f7d61c55c1">FALSE</a>;
<a name="l01220"></a>01220 }
<a name="l01221"></a>01221 
<a name="l01222"></a>01222 <span class="keyword">static</span> <span class="keywordtype">void</span>
<a name="l01223"></a>01223 replacement_block_free (<a class="code" href="structReplacementBlock.html">ReplacementBlock</a> *block)
<a name="l01224"></a>01224 {
<a name="l01225"></a>01225   <a class="code" href="group__DBusString.html#g781ca91acda49a834dce7d0ed0eef212">_dbus_string_free</a> (&amp;block-&gt;<a class="code" href="structReplacementBlock.html#562018cd2a0870abe3897b289bdd8488">replacement</a>);
<a name="l01226"></a>01226 }
<a name="l01227"></a>01227 
<a name="l01228"></a>01228 <span class="comment">/* In the variable-length case, we have to fix alignment after we insert.</span>
<a name="l01229"></a>01229 <span class="comment"> * The strategy is as follows:</span>
<a name="l01230"></a>01230 <span class="comment"> *</span>
<a name="l01231"></a>01231 <span class="comment"> *  - pad a new string to have the same alignment as the</span>
<a name="l01232"></a>01232 <span class="comment"> *    start of the current basic value</span>
<a name="l01233"></a>01233 <span class="comment"> *  - write the new basic value</span>
<a name="l01234"></a>01234 <span class="comment"> *  - copy from the original reader to the new string,</span>
<a name="l01235"></a>01235 <span class="comment"> *    which will fix the alignment of types following</span>
<a name="l01236"></a>01236 <span class="comment"> *    the new value</span>
<a name="l01237"></a>01237 <span class="comment"> *    - this copy has to start at realign_root,</span>
<a name="l01238"></a>01238 <span class="comment"> *      but not really write anything until it</span>
<a name="l01239"></a>01239 <span class="comment"> *      passes the value being set</span>
<a name="l01240"></a>01240 <span class="comment"> *    - as an optimization, we can stop copying</span>
<a name="l01241"></a>01241 <span class="comment"> *      when the source and dest values are both</span>
<a name="l01242"></a>01242 <span class="comment"> *      on an 8-boundary, since we know all following</span>
<a name="l01243"></a>01243 <span class="comment"> *      padding and alignment will be identical</span>
<a name="l01244"></a>01244 <span class="comment"> *  - copy the new string back to the original</span>
<a name="l01245"></a>01245 <span class="comment"> *    string, replacing the relevant part of the</span>
<a name="l01246"></a>01246 <span class="comment"> *    original string</span>
<a name="l01247"></a>01247 <span class="comment"> *  - now any arrays in the original string that</span>
<a name="l01248"></a>01248 <span class="comment"> *    contained the replaced string may have the</span>
<a name="l01249"></a>01249 <span class="comment"> *    wrong length; so we have to fix that</span>
<a name="l01250"></a>01250 <span class="comment"> */</span>
<a name="l01251"></a>01251 <span class="keyword">static</span> <a class="code" href="group__DBusTypes.html#g39c9cb0f3a2a8ad6f55cc4855d035349">dbus_bool_t</a>
<a name="l01252"></a>01252 reader_set_basic_variable_length (<a class="code" href="structDBusTypeReader.html">DBusTypeReader</a>       *reader,
<a name="l01253"></a>01253                                   <span class="keywordtype">int</span>                   current_type,
<a name="l01254"></a>01254                                   <span class="keyword">const</span> <span class="keywordtype">void</span>           *value,
<a name="l01255"></a>01255                                   <span class="keyword">const</span> <a class="code" href="structDBusTypeReader.html">DBusTypeReader</a> *realign_root)
<a name="l01256"></a>01256 {
<a name="l01257"></a>01257   <a class="code" href="group__DBusTypes.html#g39c9cb0f3a2a8ad6f55cc4855d035349">dbus_bool_t</a> retval;
<a name="l01258"></a>01258   <a class="code" href="structReplacementBlock.html">ReplacementBlock</a> block;
<a name="l01259"></a>01259   <a class="code" href="structDBusTypeWriter.html">DBusTypeWriter</a> writer;
<a name="l01260"></a>01260 
<a name="l01261"></a>01261   <a class="code" href="group__DBusInternalsUtils.html#g129c6c03f011cdc171934d5d386cc797">_dbus_assert</a> (realign_root != <a class="code" href="group__DBusMacros.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>);
<a name="l01262"></a>01262 
<a name="l01263"></a>01263   retval = <a class="code" href="group__DBusMacros.html#ga93f0eb578d23995850d61f7d61c55c1">FALSE</a>;
<a name="l01264"></a>01264 
<a name="l01265"></a>01265   <span class="keywordflow">if</span> (!replacement_block_init (&amp;block, reader))
<a name="l01266"></a>01266     <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#ga93f0eb578d23995850d61f7d61c55c1">FALSE</a>;
<a name="l01267"></a>01267 
<a name="l01268"></a>01268   <span class="comment">/* Write the new basic value */</span>
<a name="l01269"></a>01269 <span class="preprocessor">#if RECURSIVE_MARSHAL_WRITE_TRACE</span>
<a name="l01270"></a>01270 <span class="preprocessor"></span>  _dbus_verbose (<span class="stringliteral">"INITIALIZING writer %p to write basic value at value_pos %d of replacement string\n"</span>,
<a name="l01271"></a>01271                  &amp;writer, _dbus_string_get_length (&amp;block.replacement));
<a name="l01272"></a>01272 <span class="preprocessor">#endif</span>
<a name="l01273"></a>01273 <span class="preprocessor"></span>  <a class="code" href="group__DBusMarshal.html#g1f101175ce6f33221fcb59f0b46349bd">_dbus_type_writer_init_values_only</a> (&amp;writer,
<a name="l01274"></a>01274                                       reader-&gt;<a class="code" href="structDBusTypeReader.html#eb0846d954066f420e1df98b81148702">byte_order</a>,
<a name="l01275"></a>01275                                       reader-&gt;<a class="code" href="structDBusTypeReader.html#f52e270ededd0aabb642c6130a3e9e40">type_str</a>,
<a name="l01276"></a>01276                                       reader-&gt;<a class="code" href="structDBusTypeReader.html#160a55f9869e297572c5aa5b6ce7bc71">type_pos</a>,
<a name="l01277"></a>01277                                       &amp;block.replacement,
<a name="l01278"></a>01278                                       _dbus_string_get_length (&amp;block.replacement));
<a name="l01279"></a>01279 <span class="preprocessor">#if RECURSIVE_MARSHAL_WRITE_TRACE</span>
<a name="l01280"></a>01280 <span class="preprocessor"></span>  _dbus_verbose (<span class="stringliteral">"WRITING basic value to writer %p (replacement string)\n"</span>, &amp;writer);
<a name="l01281"></a>01281 <span class="preprocessor">#endif</span>
<a name="l01282"></a>01282 <span class="preprocessor"></span>  <span class="keywordflow">if</span> (!<a class="code" href="group__DBusMarshal.html#g0103b0214766b0ff1ca05bcc7f1e631b">_dbus_type_writer_write_basic</a> (&amp;writer, current_type, value))
<a name="l01283"></a>01283     <span class="keywordflow">goto</span> out;
<a name="l01284"></a>01284 
<a name="l01285"></a>01285   <span class="keywordflow">if</span> (!replacement_block_replace (&amp;block,
<a name="l01286"></a>01286                                   reader,
<a name="l01287"></a>01287                                   realign_root))
<a name="l01288"></a>01288     <span class="keywordflow">goto</span> out;
<a name="l01289"></a>01289 
<a name="l01290"></a>01290   retval = <a class="code" href="group__DBusMacros.html#ga8cecfc5c5c054d2875c03e77b7be15d">TRUE</a>;
<a name="l01291"></a>01291 
<a name="l01292"></a>01292  out:
<a name="l01293"></a>01293   replacement_block_free (&amp;block);
<a name="l01294"></a>01294   <span class="keywordflow">return</span> retval;
<a name="l01295"></a>01295 }
<a name="l01296"></a>01296 
<a name="l01297"></a>01297 <span class="keyword">static</span> <span class="keywordtype">void</span>
<a name="l01298"></a>01298 reader_set_basic_fixed_length (<a class="code" href="structDBusTypeReader.html">DBusTypeReader</a> *reader,
<a name="l01299"></a>01299                                <span class="keywordtype">int</span>             current_type,
<a name="l01300"></a>01300                                <span class="keyword">const</span> <span class="keywordtype">void</span>     *value)
<a name="l01301"></a>01301 {
<a name="l01302"></a>01302   <a class="code" href="group__DBusMarshal.html#g854526bdf221a5e82b2e14581ac17d8f">_dbus_marshal_set_basic</a> ((<a class="code" href="structDBusString.html">DBusString</a>*) reader-&gt;<a class="code" href="structDBusTypeReader.html#4065d7775758beb044ee23a71875571f">value_str</a>,
<a name="l01303"></a>01303                            reader-&gt;<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a>,
<a name="l01304"></a>01304                            current_type,
<a name="l01305"></a>01305                            value,
<a name="l01306"></a>01306                            reader-&gt;<a class="code" href="structDBusTypeReader.html#eb0846d954066f420e1df98b81148702">byte_order</a>,
<a name="l01307"></a>01307                            <a class="code" href="group__DBusMacros.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>, <a class="code" href="group__DBusMacros.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>);
<a name="l01308"></a>01308 }
<a name="l01309"></a>01309 
<a name="l01344"></a>01344 <a class="code" href="group__DBusTypes.html#g39c9cb0f3a2a8ad6f55cc4855d035349">dbus_bool_t</a>
<a name="l01345"></a><a class="code" href="group__DBusMarshal.html#gaf11ca429434c2c280f5fad34ed95204">01345</a> <a class="code" href="group__DBusMarshal.html#gaf11ca429434c2c280f5fad34ed95204">_dbus_type_reader_set_basic</a> (<a class="code" href="structDBusTypeReader.html">DBusTypeReader</a>       *reader,
<a name="l01346"></a>01346                              <span class="keyword">const</span> <span class="keywordtype">void</span>           *value,
<a name="l01347"></a>01347                              <span class="keyword">const</span> <a class="code" href="structDBusTypeReader.html">DBusTypeReader</a> *realign_root)
<a name="l01348"></a>01348 {
<a name="l01349"></a>01349   <span class="keywordtype">int</span> current_type;
<a name="l01350"></a>01350 
<a name="l01351"></a>01351   <a class="code" href="group__DBusInternalsUtils.html#g129c6c03f011cdc171934d5d386cc797">_dbus_assert</a> (!reader-&gt;<a class="code" href="structDBusTypeReader.html#238bd0d5a30d8f59fd9b71c95af25563">klass</a>-&gt;<a class="code" href="structDBusTypeReaderClass.html#d886037cd736e6f5cdbefb834b0bd5e7">types_only</a>);
<a name="l01352"></a>01352   <a class="code" href="group__DBusInternalsUtils.html#g129c6c03f011cdc171934d5d386cc797">_dbus_assert</a> (reader-&gt;<a class="code" href="structDBusTypeReader.html#4065d7775758beb044ee23a71875571f">value_str</a> == realign_root-&gt;<a class="code" href="structDBusTypeReader.html#4065d7775758beb044ee23a71875571f">value_str</a>);
<a name="l01353"></a>01353   <a class="code" href="group__DBusInternalsUtils.html#g129c6c03f011cdc171934d5d386cc797">_dbus_assert</a> (reader-&gt;<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a> &gt;= realign_root-&gt;<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a>);
<a name="l01354"></a>01354 
<a name="l01355"></a>01355   current_type = <a class="code" href="group__DBusMarshal.html#gb8e39cb8084247d54d7f272c51622a73">_dbus_type_reader_get_current_type</a> (reader);
<a name="l01356"></a>01356 
<a name="l01357"></a>01357 <span class="preprocessor">#if RECURSIVE_MARSHAL_WRITE_TRACE</span>
<a name="l01358"></a>01358 <span class="preprocessor"></span>  _dbus_verbose (<span class="stringliteral">"  SET BASIC type reader %p type_pos = %d value_pos = %d remaining sig '%s' realign_root = %p with value_pos %d current_type = %s\n"</span>,
<a name="l01359"></a>01359                  reader, reader-&gt;<a class="code" href="structDBusTypeReader.html#160a55f9869e297572c5aa5b6ce7bc71">type_pos</a>, reader-&gt;<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a>,
<a name="l01360"></a>01360                  _dbus_string_get_const_data_len (reader-&gt;<a class="code" href="structDBusTypeReader.html#f52e270ededd0aabb642c6130a3e9e40">type_str</a>, reader-&gt;<a class="code" href="structDBusTypeReader.html#160a55f9869e297572c5aa5b6ce7bc71">type_pos</a>, 0),
<a name="l01361"></a>01361                  realign_root,
<a name="l01362"></a>01362                  realign_root ? realign_root-&gt;<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a> : -1,
<a name="l01363"></a>01363                  <a class="code" href="group__DBusMarshal.html#g48a595c2b26dce6e9c25ce040e5247e5">_dbus_type_to_string</a> (current_type));
<a name="l01364"></a>01364   <a class="code" href="group__DBusMarshal.html#g3926bb35edf78d114cf0c341fe3258e0">_dbus_verbose_bytes_of_string</a> (realign_root-&gt;<a class="code" href="structDBusTypeReader.html#4065d7775758beb044ee23a71875571f">value_str</a>, realign_root-&gt;<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a>,
<a name="l01365"></a>01365                                  _dbus_string_get_length (realign_root-&gt;<a class="code" href="structDBusTypeReader.html#4065d7775758beb044ee23a71875571f">value_str</a>) -
<a name="l01366"></a>01366                                  realign_root-&gt;<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a>);
<a name="l01367"></a>01367 <span class="preprocessor">#endif</span>
<a name="l01368"></a>01368 <span class="preprocessor"></span>
<a name="l01369"></a>01369   <a class="code" href="group__DBusInternalsUtils.html#g129c6c03f011cdc171934d5d386cc797">_dbus_assert</a> (<a class="code" href="group__DBusSignature.html#g2d8d39cba08f450645a17651478a0ad4">dbus_type_is_basic</a> (current_type));
<a name="l01370"></a>01370 
<a name="l01371"></a>01371   <span class="keywordflow">if</span> (<a class="code" href="group__DBusSignature.html#g435ffc74ae015cc193175f5b864872bc">dbus_type_is_fixed</a> (current_type))
<a name="l01372"></a>01372     {
<a name="l01373"></a>01373       reader_set_basic_fixed_length (reader, current_type, value);
<a name="l01374"></a>01374       <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#ga8cecfc5c5c054d2875c03e77b7be15d">TRUE</a>;
<a name="l01375"></a>01375     }
<a name="l01376"></a>01376   <span class="keywordflow">else</span>
<a name="l01377"></a>01377     {
<a name="l01378"></a>01378       <a class="code" href="group__DBusInternalsUtils.html#g129c6c03f011cdc171934d5d386cc797">_dbus_assert</a> (realign_root != <a class="code" href="group__DBusMacros.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>);
<a name="l01379"></a>01379       <span class="keywordflow">return</span> reader_set_basic_variable_length (reader, current_type,
<a name="l01380"></a>01380                                                value, realign_root);
<a name="l01381"></a>01381     }
<a name="l01382"></a>01382 }
<a name="l01383"></a>01383 
<a name="l01401"></a>01401 <a class="code" href="group__DBusTypes.html#g39c9cb0f3a2a8ad6f55cc4855d035349">dbus_bool_t</a>
<a name="l01402"></a><a class="code" href="group__DBusMarshal.html#ga4057610b3d9e81fed212c17f6599516">01402</a> <a class="code" href="group__DBusMarshal.html#ga4057610b3d9e81fed212c17f6599516">_dbus_type_reader_delete</a> (<a class="code" href="structDBusTypeReader.html">DBusTypeReader</a>        *reader,
<a name="l01403"></a>01403                           <span class="keyword">const</span> <a class="code" href="structDBusTypeReader.html">DBusTypeReader</a>  *realign_root)
<a name="l01404"></a>01404 {
<a name="l01405"></a>01405   <a class="code" href="group__DBusTypes.html#g39c9cb0f3a2a8ad6f55cc4855d035349">dbus_bool_t</a> retval;
<a name="l01406"></a>01406   <a class="code" href="structReplacementBlock.html">ReplacementBlock</a> block;
<a name="l01407"></a>01407 
<a name="l01408"></a>01408   <a class="code" href="group__DBusInternalsUtils.html#g129c6c03f011cdc171934d5d386cc797">_dbus_assert</a> (realign_root != <a class="code" href="group__DBusMacros.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>);
<a name="l01409"></a>01409   <a class="code" href="group__DBusInternalsUtils.html#g129c6c03f011cdc171934d5d386cc797">_dbus_assert</a> (reader-&gt;<a class="code" href="structDBusTypeReader.html#238bd0d5a30d8f59fd9b71c95af25563">klass</a> == &amp;array_reader_class);
<a name="l01410"></a>01410 
<a name="l01411"></a>01411   retval = <a class="code" href="group__DBusMacros.html#ga93f0eb578d23995850d61f7d61c55c1">FALSE</a>;
<a name="l01412"></a>01412 
<a name="l01413"></a>01413   <span class="keywordflow">if</span> (!replacement_block_init (&amp;block, reader))
<a name="l01414"></a>01414     <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#ga93f0eb578d23995850d61f7d61c55c1">FALSE</a>;
<a name="l01415"></a>01415 
<a name="l01416"></a>01416   <span class="keywordflow">if</span> (!replacement_block_replace (&amp;block,
<a name="l01417"></a>01417                                   reader,
<a name="l01418"></a>01418                                   realign_root))
<a name="l01419"></a>01419     <span class="keywordflow">goto</span> out;
<a name="l01420"></a>01420 
<a name="l01421"></a>01421   retval = <a class="code" href="group__DBusMacros.html#ga8cecfc5c5c054d2875c03e77b7be15d">TRUE</a>;
<a name="l01422"></a>01422 
<a name="l01423"></a>01423  out:
<a name="l01424"></a>01424   replacement_block_free (&amp;block);
<a name="l01425"></a>01425   <span class="keywordflow">return</span> retval;
<a name="l01426"></a>01426 }
<a name="l01427"></a>01427 
<a name="l01436"></a>01436 <a class="code" href="group__DBusTypes.html#g39c9cb0f3a2a8ad6f55cc4855d035349">dbus_bool_t</a>
<a name="l01437"></a><a class="code" href="group__DBusMarshal.html#g229b3858f43ec56de852f62914cf3568">01437</a> <a class="code" href="group__DBusMarshal.html#g229b3858f43ec56de852f62914cf3568">_dbus_type_reader_greater_than</a> (<span class="keyword">const</span> <a class="code" href="structDBusTypeReader.html">DBusTypeReader</a>  *lhs,
<a name="l01438"></a>01438                                 <span class="keyword">const</span> <a class="code" href="structDBusTypeReader.html">DBusTypeReader</a>  *rhs)
<a name="l01439"></a>01439 {
<a name="l01440"></a>01440   <a class="code" href="group__DBusInternalsUtils.html#g129c6c03f011cdc171934d5d386cc797">_dbus_assert</a> (lhs-&gt;<a class="code" href="structDBusTypeReader.html#4065d7775758beb044ee23a71875571f">value_str</a> == rhs-&gt;<a class="code" href="structDBusTypeReader.html#4065d7775758beb044ee23a71875571f">value_str</a>);
<a name="l01441"></a>01441 
<a name="l01442"></a>01442   <span class="keywordflow">return</span> lhs-&gt;<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a> &gt; rhs-&gt;<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a>;
<a name="l01443"></a>01443 }
<a name="l01444"></a>01444 
<a name="l01445"></a>01445 <span class="comment">/*</span>
<a name="l01446"></a>01446 <span class="comment"> *</span>
<a name="l01447"></a>01447 <span class="comment"> *</span>
<a name="l01448"></a>01448 <span class="comment"> *         DBusTypeWriter</span>
<a name="l01449"></a>01449 <span class="comment"> *</span>
<a name="l01450"></a>01450 <span class="comment"> *</span>
<a name="l01451"></a>01451 <span class="comment"> *</span>
<a name="l01452"></a>01452 <span class="comment"> */</span>
<a name="l01453"></a>01453 
<a name="l01474"></a>01474 <span class="keywordtype">void</span>
<a name="l01475"></a><a class="code" href="group__DBusMarshal.html#gdeb83962df31e074874e957d17a0d4d1">01475</a> <a class="code" href="group__DBusMarshal.html#gdeb83962df31e074874e957d17a0d4d1">_dbus_type_writer_init</a> (<a class="code" href="structDBusTypeWriter.html">DBusTypeWriter</a> *writer,
<a name="l01476"></a>01476                         <span class="keywordtype">int</span>             byte_order,
<a name="l01477"></a>01477                         <a class="code" href="structDBusString.html">DBusString</a>     *type_str,
<a name="l01478"></a>01478                         <span class="keywordtype">int</span>             type_pos,
<a name="l01479"></a>01479                         <a class="code" href="structDBusString.html">DBusString</a>     *value_str,
<a name="l01480"></a>01480                         <span class="keywordtype">int</span>             value_pos)
<a name="l01481"></a>01481 {
<a name="l01482"></a>01482   writer-&gt;<a class="code" href="structDBusTypeWriter.html#6c4baf0b7148cf3f76924b654dada148">byte_order</a> = byte_order;
<a name="l01483"></a>01483   writer-&gt;<a class="code" href="structDBusTypeWriter.html#95204ef3a9cf29ee31687032b142b836">type_str</a> = type_str;
<a name="l01484"></a>01484   writer-&gt;<a class="code" href="structDBusTypeWriter.html#77c19debc0427372f368cfe7188951f8">type_pos</a> = type_pos;
<a name="l01485"></a>01485   writer-&gt;<a class="code" href="structDBusTypeWriter.html#a4e4b3af31fd7a93d0e54d10882bcc07">value_str</a> = value_str;
<a name="l01486"></a>01486   writer-&gt;<a class="code" href="structDBusTypeWriter.html#27c0475eedd90be65f90a799e5210947">value_pos</a> = value_pos;
<a name="l01487"></a>01487   writer-&gt;<a class="code" href="structDBusTypeWriter.html#d0953035070c7c7d21b044b7b2f0f491">container_type</a> = <a class="code" href="group__DBusProtocol.html#ga9588da889743b2119dc6664712ae51e">DBUS_TYPE_INVALID</a>;
<a name="l01488"></a>01488   writer-&gt;<a class="code" href="structDBusTypeWriter.html#e6db89e9a3adcd52678dc089810cfb0b">type_pos_is_expectation</a> = <a class="code" href="group__DBusMacros.html#ga93f0eb578d23995850d61f7d61c55c1">FALSE</a>;
<a name="l01489"></a>01489   writer-&gt;<a class="code" href="structDBusTypeWriter.html#52c8617918c108d36b947cbdfc99c6ea">enabled</a> = <a class="code" href="group__DBusMacros.html#ga8cecfc5c5c054d2875c03e77b7be15d">TRUE</a>;
<a name="l01490"></a>01490 
<a name="l01491"></a>01491 <span class="preprocessor">#if RECURSIVE_MARSHAL_WRITE_TRACE</span>
<a name="l01492"></a>01492 <span class="preprocessor"></span>  _dbus_verbose (<span class="stringliteral">"writer %p init remaining sig '%s'\n"</span>, writer,
<a name="l01493"></a>01493                  writer-&gt;<a class="code" href="structDBusTypeWriter.html#95204ef3a9cf29ee31687032b142b836">type_str</a> ?
<a name="l01494"></a>01494                  _dbus_string_get_const_data_len (writer-&gt;<a class="code" href="structDBusTypeWriter.html#95204ef3a9cf29ee31687032b142b836">type_str</a>, writer-&gt;<a class="code" href="structDBusTypeWriter.html#77c19debc0427372f368cfe7188951f8">type_pos</a>, 0) :
<a name="l01495"></a>01495                  <span class="stringliteral">"unknown"</span>);
<a name="l01496"></a>01496 <span class="preprocessor">#endif</span>
<a name="l01497"></a>01497 <span class="preprocessor"></span>}
<a name="l01498"></a>01498 
<a name="l01509"></a>01509 <span class="keywordtype">void</span>
<a name="l01510"></a><a class="code" href="group__DBusMarshal.html#ga9ecf7e96d5323bc1da9cdf0c3f2c1e7">01510</a> <a class="code" href="group__DBusMarshal.html#ga9ecf7e96d5323bc1da9cdf0c3f2c1e7">_dbus_type_writer_init_types_delayed</a> (<a class="code" href="structDBusTypeWriter.html">DBusTypeWriter</a> *writer,
<a name="l01511"></a>01511                                       <span class="keywordtype">int</span>             byte_order,
<a name="l01512"></a>01512                                       <a class="code" href="structDBusString.html">DBusString</a>     *value_str,
<a name="l01513"></a>01513                                       <span class="keywordtype">int</span>             value_pos)
<a name="l01514"></a>01514 {
<a name="l01515"></a>01515   <a class="code" href="group__DBusMarshal.html#gdeb83962df31e074874e957d17a0d4d1">_dbus_type_writer_init</a> (writer, byte_order,
<a name="l01516"></a>01516                           <a class="code" href="group__DBusMacros.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>, 0, value_str, value_pos);
<a name="l01517"></a>01517 }
<a name="l01518"></a>01518 
<a name="l01527"></a>01527 <span class="keywordtype">void</span>
<a name="l01528"></a><a class="code" href="group__DBusMarshal.html#g863b2f232a21582f9e6fe1951b09da91">01528</a> <a class="code" href="group__DBusMarshal.html#g863b2f232a21582f9e6fe1951b09da91">_dbus_type_writer_add_types</a> (<a class="code" href="structDBusTypeWriter.html">DBusTypeWriter</a> *writer,
<a name="l01529"></a>01529                              <a class="code" href="structDBusString.html">DBusString</a>     *type_str,
<a name="l01530"></a>01530                              <span class="keywordtype">int</span>             type_pos)
<a name="l01531"></a>01531 {
<a name="l01532"></a>01532   <span class="keywordflow">if</span> (writer-&gt;<a class="code" href="structDBusTypeWriter.html#95204ef3a9cf29ee31687032b142b836">type_str</a> == <a class="code" href="group__DBusMacros.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>) <span class="comment">/* keeps us from using this as setter */</span>
<a name="l01533"></a>01533     {
<a name="l01534"></a>01534       writer-&gt;<a class="code" href="structDBusTypeWriter.html#95204ef3a9cf29ee31687032b142b836">type_str</a> = type_str;
<a name="l01535"></a>01535       writer-&gt;<a class="code" href="structDBusTypeWriter.html#77c19debc0427372f368cfe7188951f8">type_pos</a> = type_pos;
<a name="l01536"></a>01536     }
<a name="l01537"></a>01537 }
<a name="l01538"></a>01538 
<a name="l01544"></a>01544 <span class="keywordtype">void</span>
<a name="l01545"></a><a class="code" href="group__DBusMarshal.html#g34d675b57c7e6569707d22ba76ae010c">01545</a> <a class="code" href="group__DBusMarshal.html#g34d675b57c7e6569707d22ba76ae010c">_dbus_type_writer_remove_types</a> (<a class="code" href="structDBusTypeWriter.html">DBusTypeWriter</a> *writer)
<a name="l01546"></a>01546 {
<a name="l01547"></a>01547   writer-&gt;<a class="code" href="structDBusTypeWriter.html#95204ef3a9cf29ee31687032b142b836">type_str</a> = <a class="code" href="group__DBusMacros.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>;
<a name="l01548"></a>01548   writer-&gt;<a class="code" href="structDBusTypeWriter.html#77c19debc0427372f368cfe7188951f8">type_pos</a> = -1;
<a name="l01549"></a>01549 }
<a name="l01550"></a>01550 
<a name="l01565"></a>01565 <span class="keywordtype">void</span>
<a name="l01566"></a><a class="code" href="group__DBusMarshal.html#g1f101175ce6f33221fcb59f0b46349bd">01566</a> <a class="code" href="group__DBusMarshal.html#g1f101175ce6f33221fcb59f0b46349bd">_dbus_type_writer_init_values_only</a> (<a class="code" href="structDBusTypeWriter.html">DBusTypeWriter</a>   *writer,
<a name="l01567"></a>01567                                     <span class="keywordtype">int</span>               byte_order,
<a name="l01568"></a>01568                                     <span class="keyword">const</span> <a class="code" href="structDBusString.html">DBusString</a> *type_str,
<a name="l01569"></a>01569                                     <span class="keywordtype">int</span>               type_pos,
<a name="l01570"></a>01570                                     <a class="code" href="structDBusString.html">DBusString</a>       *value_str,
<a name="l01571"></a>01571                                     <span class="keywordtype">int</span>               value_pos)
<a name="l01572"></a>01572 {
<a name="l01573"></a>01573   <a class="code" href="group__DBusMarshal.html#gdeb83962df31e074874e957d17a0d4d1">_dbus_type_writer_init</a> (writer, byte_order,
<a name="l01574"></a>01574                           (<a class="code" href="structDBusString.html">DBusString</a>*)type_str, type_pos,
<a name="l01575"></a>01575                           value_str, value_pos);
<a name="l01576"></a>01576 
<a name="l01577"></a>01577   writer-&gt;<a class="code" href="structDBusTypeWriter.html#e6db89e9a3adcd52678dc089810cfb0b">type_pos_is_expectation</a> = <a class="code" href="group__DBusMacros.html#ga8cecfc5c5c054d2875c03e77b7be15d">TRUE</a>;
<a name="l01578"></a>01578 }
<a name="l01579"></a>01579 
<a name="l01580"></a>01580 <span class="keyword">static</span> <a class="code" href="group__DBusTypes.html#g39c9cb0f3a2a8ad6f55cc4855d035349">dbus_bool_t</a>
<a name="l01581"></a>01581 _dbus_type_writer_write_basic_no_typecode (<a class="code" href="structDBusTypeWriter.html">DBusTypeWriter</a> *writer,
<a name="l01582"></a>01582                                            <span class="keywordtype">int</span>             type,
<a name="l01583"></a>01583                                            <span class="keyword">const</span> <span class="keywordtype">void</span>     *value)
<a name="l01584"></a>01584 {
<a name="l01585"></a>01585   <span class="keywordflow">if</span> (writer-&gt;<a class="code" href="structDBusTypeWriter.html#52c8617918c108d36b947cbdfc99c6ea">enabled</a>)
<a name="l01586"></a>01586     <span class="keywordflow">return</span> <a class="code" href="group__DBusMarshal.html#g54323d48921de8c5bd04ae01548312bb">_dbus_marshal_write_basic</a> (writer-&gt;<a class="code" href="structDBusTypeWriter.html#a4e4b3af31fd7a93d0e54d10882bcc07">value_str</a>,
<a name="l01587"></a>01587                                       writer-&gt;<a class="code" href="structDBusTypeWriter.html#27c0475eedd90be65f90a799e5210947">value_pos</a>,
<a name="l01588"></a>01588                                       type,
<a name="l01589"></a>01589                                       value,
<a name="l01590"></a>01590                                       writer-&gt;<a class="code" href="structDBusTypeWriter.html#6c4baf0b7148cf3f76924b654dada148">byte_order</a>,
<a name="l01591"></a>01591                                       &amp;writer-&gt;<a class="code" href="structDBusTypeWriter.html#27c0475eedd90be65f90a799e5210947">value_pos</a>);
<a name="l01592"></a>01592   <span class="keywordflow">else</span>
<a name="l01593"></a>01593     <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#ga8cecfc5c5c054d2875c03e77b7be15d">TRUE</a>;
<a name="l01594"></a>01594 }
<a name="l01595"></a>01595 
<a name="l01596"></a>01596 <span class="comment">/* If our parent is an array, things are a little bit complicated.</span>
<a name="l01597"></a>01597 <span class="comment"> *</span>
<a name="l01598"></a>01598 <span class="comment"> * The parent must have a complete element type, such as</span>
<a name="l01599"></a>01599 <span class="comment"> * "i" or "aai" or "(ii)" or "a(ii)". There can't be</span>
<a name="l01600"></a>01600 <span class="comment"> * unclosed parens, or an "a" with no following type.</span>
<a name="l01601"></a>01601 <span class="comment"> *</span>
<a name="l01602"></a>01602 <span class="comment"> * To recurse, the only allowed operation is to recurse into the</span>
<a name="l01603"></a>01603 <span class="comment"> * first type in the element type. So for "i" you can't recurse, for</span>
<a name="l01604"></a>01604 <span class="comment"> * "ai" you can recurse into the array, for "(ii)" you can recurse</span>
<a name="l01605"></a>01605 <span class="comment"> * into the struct.</span>
<a name="l01606"></a>01606 <span class="comment"> *</span>
<a name="l01607"></a>01607 <span class="comment"> * If you recurse into the array for "ai", then you must specify</span>
<a name="l01608"></a>01608 <span class="comment"> * "i" for the element type of the array you recurse into.</span>
<a name="l01609"></a>01609 <span class="comment"> *</span>
<a name="l01610"></a>01610 <span class="comment"> * While inside an array at any level, we need to avoid writing to</span>
<a name="l01611"></a>01611 <span class="comment"> * type_str, since the type only appears once for the whole array,</span>
<a name="l01612"></a>01612 <span class="comment"> * it does not appear for each array element.</span>
<a name="l01613"></a>01613 <span class="comment"> *</span>
<a name="l01614"></a>01614 <span class="comment"> * While inside an array type_pos points to the expected next</span>
<a name="l01615"></a>01615 <span class="comment"> * typecode, rather than the next place we could write a typecode.</span>
<a name="l01616"></a>01616 <span class="comment"> */</span>
<a name="l01617"></a>01617 <span class="keyword">static</span> <span class="keywordtype">void</span>
<a name="l01618"></a>01618 writer_recurse_init_and_check (<a class="code" href="structDBusTypeWriter.html">DBusTypeWriter</a> *writer,
<a name="l01619"></a>01619                                <span class="keywordtype">int</span>             container_type,
<a name="l01620"></a>01620                                <a class="code" href="structDBusTypeWriter.html">DBusTypeWriter</a> *sub)
<a name="l01621"></a>01621 {
<a name="l01622"></a>01622   <a class="code" href="group__DBusMarshal.html#gdeb83962df31e074874e957d17a0d4d1">_dbus_type_writer_init</a> (sub,
<a name="l01623"></a>01623                           writer-&gt;<a class="code" href="structDBusTypeWriter.html#6c4baf0b7148cf3f76924b654dada148">byte_order</a>,
<a name="l01624"></a>01624                           writer-&gt;<a class="code" href="structDBusTypeWriter.html#95204ef3a9cf29ee31687032b142b836">type_str</a>,
<a name="l01625"></a>01625                           writer-&gt;<a class="code" href="structDBusTypeWriter.html#77c19debc0427372f368cfe7188951f8">type_pos</a>,
<a name="l01626"></a>01626                           writer-&gt;<a class="code" href="structDBusTypeWriter.html#a4e4b3af31fd7a93d0e54d10882bcc07">value_str</a>,
<a name="l01627"></a>01627                           writer-&gt;<a class="code" href="structDBusTypeWriter.html#27c0475eedd90be65f90a799e5210947">value_pos</a>);
<a name="l01628"></a>01628 
<a name="l01629"></a>01629   sub-&gt;<a class="code" href="structDBusTypeWriter.html#d0953035070c7c7d21b044b7b2f0f491">container_type</a> = container_type;
<a name="l01630"></a>01630 
<a name="l01631"></a>01631   <span class="keywordflow">if</span> (writer-&gt;<a class="code" href="structDBusTypeWriter.html#e6db89e9a3adcd52678dc089810cfb0b">type_pos_is_expectation</a> ||
<a name="l01632"></a>01632       (sub-&gt;<a class="code" href="structDBusTypeWriter.html#d0953035070c7c7d21b044b7b2f0f491">container_type</a> == <a class="code" href="group__DBusProtocol.html#g8912f600f81a773066ca03d9163613a9">DBUS_TYPE_ARRAY</a> || sub-&gt;<a class="code" href="structDBusTypeWriter.html#d0953035070c7c7d21b044b7b2f0f491">container_type</a> == <a class="code" href="group__DBusProtocol.html#g4aa7a463ad2bce4e9aa95e3e397ddcf1">DBUS_TYPE_VARIANT</a>))
<a name="l01633"></a>01633     sub-&gt;<a class="code" href="structDBusTypeWriter.html#e6db89e9a3adcd52678dc089810cfb0b">type_pos_is_expectation</a> = <a class="code" href="group__DBusMacros.html#ga8cecfc5c5c054d2875c03e77b7be15d">TRUE</a>;
<a name="l01634"></a>01634   <span class="keywordflow">else</span>
<a name="l01635"></a>01635     sub-&gt;<a class="code" href="structDBusTypeWriter.html#e6db89e9a3adcd52678dc089810cfb0b">type_pos_is_expectation</a> = <a class="code" href="group__DBusMacros.html#ga93f0eb578d23995850d61f7d61c55c1">FALSE</a>;
<a name="l01636"></a>01636 
<a name="l01637"></a>01637   sub-&gt;<a class="code" href="structDBusTypeWriter.html#52c8617918c108d36b947cbdfc99c6ea">enabled</a> = writer-&gt;<a class="code" href="structDBusTypeWriter.html#52c8617918c108d36b947cbdfc99c6ea">enabled</a>;
<a name="l01638"></a>01638 
<a name="l01639"></a>01639 <span class="preprocessor">#ifndef DBUS_DISABLE_CHECKS</span>
<a name="l01640"></a>01640 <span class="preprocessor"></span>  <span class="keywordflow">if</span> (writer-&gt;<a class="code" href="structDBusTypeWriter.html#e6db89e9a3adcd52678dc089810cfb0b">type_pos_is_expectation</a> &amp;&amp; writer-&gt;<a class="code" href="structDBusTypeWriter.html#95204ef3a9cf29ee31687032b142b836">type_str</a>)
<a name="l01641"></a>01641     {
<a name="l01642"></a>01642       <span class="keywordtype">int</span> expected;
<a name="l01643"></a>01643 
<a name="l01644"></a>01644       expected = <a class="code" href="group__DBusMarshal.html#g5866a0fd058aed3396402d0456144fd2">_dbus_first_type_in_signature</a> (writer-&gt;<a class="code" href="structDBusTypeWriter.html#95204ef3a9cf29ee31687032b142b836">type_str</a>, writer-&gt;<a class="code" href="structDBusTypeWriter.html#77c19debc0427372f368cfe7188951f8">type_pos</a>);
<a name="l01645"></a>01645 
<a name="l01646"></a>01646       <span class="keywordflow">if</span> (expected != sub-&gt;<a class="code" href="structDBusTypeWriter.html#d0953035070c7c7d21b044b7b2f0f491">container_type</a>)
<a name="l01647"></a>01647         {
<a name="l01648"></a>01648           <span class="keywordflow">if</span> (expected != <a class="code" href="group__DBusProtocol.html#ga9588da889743b2119dc6664712ae51e">DBUS_TYPE_INVALID</a>)
<a name="l01649"></a>01649             <a class="code" href="group__DBusInternalsUtils.html#g63f2f8a068454b781f214ba596e313b4">_dbus_warn_check_failed</a> (<span class="stringliteral">"Writing an element of type %s, but the expected type here is %s\n"</span>
<a name="l01650"></a>01650                                      <span class="stringliteral">"The overall signature expected here was '%s' and we are on byte %d of that signature.\n"</span>,
<a name="l01651"></a>01651                                      <a class="code" href="group__DBusMarshal.html#g48a595c2b26dce6e9c25ce040e5247e5">_dbus_type_to_string</a> (sub-&gt;<a class="code" href="structDBusTypeWriter.html#d0953035070c7c7d21b044b7b2f0f491">container_type</a>),
<a name="l01652"></a>01652                                      <a class="code" href="group__DBusMarshal.html#g48a595c2b26dce6e9c25ce040e5247e5">_dbus_type_to_string</a> (expected),
<a name="l01653"></a>01653                                      _dbus_string_get_const_data (writer-&gt;<a class="code" href="structDBusTypeWriter.html#95204ef3a9cf29ee31687032b142b836">type_str</a>), writer-&gt;<a class="code" href="structDBusTypeWriter.html#77c19debc0427372f368cfe7188951f8">type_pos</a>);
<a name="l01654"></a>01654           <span class="keywordflow">else</span>
<a name="l01655"></a>01655             <a class="code" href="group__DBusInternalsUtils.html#g63f2f8a068454b781f214ba596e313b4">_dbus_warn_check_failed</a> (<span class="stringliteral">"Writing an element of type %s, but no value is expected here\n"</span>,
<a name="l01656"></a>01656                                      <span class="stringliteral">"The overall signature expected here was '%s' and we are on byte %d of that signature.\n"</span>,
<a name="l01657"></a>01657                                      <a class="code" href="group__DBusMarshal.html#g48a595c2b26dce6e9c25ce040e5247e5">_dbus_type_to_string</a> (sub-&gt;<a class="code" href="structDBusTypeWriter.html#d0953035070c7c7d21b044b7b2f0f491">container_type</a>),
<a name="l01658"></a>01658                                      _dbus_string_get_const_data (writer-&gt;<a class="code" href="structDBusTypeWriter.html#95204ef3a9cf29ee31687032b142b836">type_str</a>), writer-&gt;<a class="code" href="structDBusTypeWriter.html#77c19debc0427372f368cfe7188951f8">type_pos</a>);
<a name="l01659"></a>01659           
<a name="l01660"></a>01660           <a class="code" href="group__DBusInternalsUtils.html#g0c4961ec784874f1b1f3aeccea8d3da1">_dbus_assert_not_reached</a> (<span class="stringliteral">"bad array element or variant content written"</span>);
<a name="l01661"></a>01661         }
<a name="l01662"></a>01662     }
<a name="l01663"></a>01663 <span class="preprocessor">#endif </span><span class="comment">/* DBUS_DISABLE_CHECKS */</span>
<a name="l01664"></a>01664 
<a name="l01665"></a>01665 <span class="preprocessor">#if RECURSIVE_MARSHAL_WRITE_TRACE</span>
<a name="l01666"></a>01666 <span class="preprocessor"></span>  _dbus_verbose (<span class="stringliteral">"  type writer %p recurse parent %s type_pos = %d value_pos = %d is_expectation = %d remaining sig '%s' enabled = %d\n"</span>,
<a name="l01667"></a>01667                  writer,
<a name="l01668"></a>01668                  <a class="code" href="group__DBusMarshal.html#g48a595c2b26dce6e9c25ce040e5247e5">_dbus_type_to_string</a> (writer-&gt;<a class="code" href="structDBusTypeWriter.html#d0953035070c7c7d21b044b7b2f0f491">container_type</a>),
<a name="l01669"></a>01669                  writer-&gt;<a class="code" href="structDBusTypeWriter.html#77c19debc0427372f368cfe7188951f8">type_pos</a>, writer-&gt;<a class="code" href="structDBusTypeWriter.html#27c0475eedd90be65f90a799e5210947">value_pos</a>, writer-&gt;<a class="code" href="structDBusTypeWriter.html#e6db89e9a3adcd52678dc089810cfb0b">type_pos_is_expectation</a>,
<a name="l01670"></a>01670                  writer-&gt;<a class="code" href="structDBusTypeWriter.html#95204ef3a9cf29ee31687032b142b836">type_str</a> ?
<a name="l01671"></a>01671                  _dbus_string_get_const_data_len (writer-&gt;<a class="code" href="structDBusTypeWriter.html#95204ef3a9cf29ee31687032b142b836">type_str</a>, writer-&gt;<a class="code" href="structDBusTypeWriter.html#77c19debc0427372f368cfe7188951f8">type_pos</a>, 0) :
<a name="l01672"></a>01672                  <span class="stringliteral">"unknown"</span>,
<a name="l01673"></a>01673                  writer-&gt;<a class="code" href="structDBusTypeWriter.html#52c8617918c108d36b947cbdfc99c6ea">enabled</a>);
<a name="l01674"></a>01674   _dbus_verbose (<span class="stringliteral">"  type writer %p recurse sub %s   type_pos = %d value_pos = %d is_expectation = %d enabled = %d\n"</span>,
<a name="l01675"></a>01675                  sub,
<a name="l01676"></a>01676                  <a class="code" href="group__DBusMarshal.html#g48a595c2b26dce6e9c25ce040e5247e5">_dbus_type_to_string</a> (sub-&gt;<a class="code" href="structDBusTypeWriter.html#d0953035070c7c7d21b044b7b2f0f491">container_type</a>),
<a name="l01677"></a>01677                  sub-&gt;<a class="code" href="structDBusTypeWriter.html#77c19debc0427372f368cfe7188951f8">type_pos</a>, sub-&gt;<a class="code" href="structDBusTypeWriter.html#27c0475eedd90be65f90a799e5210947">value_pos</a>,
<a name="l01678"></a>01678                  sub-&gt;<a class="code" href="structDBusTypeWriter.html#e6db89e9a3adcd52678dc089810cfb0b">type_pos_is_expectation</a>,
<a name="l01679"></a>01679                  sub-&gt;<a class="code" href="structDBusTypeWriter.html#52c8617918c108d36b947cbdfc99c6ea">enabled</a>);
<a name="l01680"></a>01680 <span class="preprocessor">#endif</span>
<a name="l01681"></a>01681 <span class="preprocessor"></span>}
<a name="l01682"></a>01682 
<a name="l01683"></a>01683 <span class="keyword">static</span> <a class="code" href="group__DBusTypes.html#g39c9cb0f3a2a8ad6f55cc4855d035349">dbus_bool_t</a>
<a name="l01684"></a>01684 write_or_verify_typecode (<a class="code" href="structDBusTypeWriter.html">DBusTypeWriter</a> *writer,
<a name="l01685"></a>01685                           <span class="keywordtype">int</span>             typecode)
<a name="l01686"></a>01686 {
<a name="l01687"></a>01687   <span class="comment">/* A subwriter inside an array or variant will have type_pos</span>
<a name="l01688"></a>01688 <span class="comment">   * pointing to the expected typecode; a writer not inside an array</span>
<a name="l01689"></a>01689 <span class="comment">   * or variant has type_pos pointing to the next place to insert a</span>
<a name="l01690"></a>01690 <span class="comment">   * typecode.</span>
<a name="l01691"></a>01691 <span class="comment">   */</span>
<a name="l01692"></a>01692 <span class="preprocessor">#if RECURSIVE_MARSHAL_WRITE_TRACE</span>
<a name="l01693"></a>01693 <span class="preprocessor"></span>  _dbus_verbose (<span class="stringliteral">"  type writer %p write_or_verify start type_pos = %d remaining sig '%s' enabled = %d\n"</span>,
<a name="l01694"></a>01694                  writer, writer-&gt;<a class="code" href="structDBusTypeWriter.html#77c19debc0427372f368cfe7188951f8">type_pos</a>,
<a name="l01695"></a>01695                  writer-&gt;<a class="code" href="structDBusTypeWriter.html#95204ef3a9cf29ee31687032b142b836">type_str</a> ?
<a name="l01696"></a>01696                  _dbus_string_get_const_data_len (writer-&gt;<a class="code" href="structDBusTypeWriter.html#95204ef3a9cf29ee31687032b142b836">type_str</a>, writer-&gt;<a class="code" href="structDBusTypeWriter.html#77c19debc0427372f368cfe7188951f8">type_pos</a>, 0) :
<a name="l01697"></a>01697                  <span class="stringliteral">"unknown"</span>,
<a name="l01698"></a>01698                  writer-&gt;<a class="code" href="structDBusTypeWriter.html#52c8617918c108d36b947cbdfc99c6ea">enabled</a>);
<a name="l01699"></a>01699 <span class="preprocessor">#endif</span>
<a name="l01700"></a>01700 <span class="preprocessor"></span>
<a name="l01701"></a>01701   <span class="keywordflow">if</span> (writer-&gt;<a class="code" href="structDBusTypeWriter.html#95204ef3a9cf29ee31687032b142b836">type_str</a> == <a class="code" href="group__DBusMacros.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>)
<a name="l01702"></a>01702     <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#ga8cecfc5c5c054d2875c03e77b7be15d">TRUE</a>;
<a name="l01703"></a>01703 
<a name="l01704"></a>01704   <span class="keywordflow">if</span> (writer-&gt;<a class="code" href="structDBusTypeWriter.html#e6db89e9a3adcd52678dc089810cfb0b">type_pos_is_expectation</a>)
<a name="l01705"></a>01705     {
<a name="l01706"></a>01706 <span class="preprocessor">#ifndef DBUS_DISABLE_CHECKS</span>
<a name="l01707"></a>01707 <span class="preprocessor"></span>      {
<a name="l01708"></a>01708         <span class="keywordtype">int</span> expected;
<a name="l01709"></a>01709 
<a name="l01710"></a>01710         expected = _dbus_string_get_byte (writer-&gt;<a class="code" href="structDBusTypeWriter.html#95204ef3a9cf29ee31687032b142b836">type_str</a>, writer-&gt;<a class="code" href="structDBusTypeWriter.html#77c19debc0427372f368cfe7188951f8">type_pos</a>);
<a name="l01711"></a>01711 
<a name="l01712"></a>01712         <span class="keywordflow">if</span> (expected != typecode)
<a name="l01713"></a>01713           {
<a name="l01714"></a>01714             <span class="keywordflow">if</span> (expected != <a class="code" href="group__DBusProtocol.html#ga9588da889743b2119dc6664712ae51e">DBUS_TYPE_INVALID</a>)
<a name="l01715"></a>01715               <a class="code" href="group__DBusInternalsUtils.html#g63f2f8a068454b781f214ba596e313b4">_dbus_warn_check_failed</a> (<span class="stringliteral">"Array or variant type requires that type %s be written, but %s was written.\n"</span>
<a name="l01716"></a>01716                                        <span class="stringliteral">"The overall signature expected here was '%s' and we are on byte %d of that signature.\n"</span>,
<a name="l01717"></a>01717                                        <a class="code" href="group__DBusMarshal.html#g48a595c2b26dce6e9c25ce040e5247e5">_dbus_type_to_string</a> (expected), <a class="code" href="group__DBusMarshal.html#g48a595c2b26dce6e9c25ce040e5247e5">_dbus_type_to_string</a> (typecode),
<a name="l01718"></a>01718                                        _dbus_string_get_const_data (writer-&gt;<a class="code" href="structDBusTypeWriter.html#95204ef3a9cf29ee31687032b142b836">type_str</a>), writer-&gt;<a class="code" href="structDBusTypeWriter.html#77c19debc0427372f368cfe7188951f8">type_pos</a>);
<a name="l01719"></a>01719             <span class="keywordflow">else</span>
<a name="l01720"></a>01720               <a class="code" href="group__DBusInternalsUtils.html#g63f2f8a068454b781f214ba596e313b4">_dbus_warn_check_failed</a> (<span class="stringliteral">"Array or variant type wasn't expecting any more values to be written into it, but a value %s was written.\n"</span>
<a name="l01721"></a>01721                                        <span class="stringliteral">"The overall signature expected here was '%s' and we are on byte %d of that signature.\n"</span>,
<a name="l01722"></a>01722                                        <a class="code" href="group__DBusMarshal.html#g48a595c2b26dce6e9c25ce040e5247e5">_dbus_type_to_string</a> (typecode),
<a name="l01723"></a>01723                                        _dbus_string_get_const_data (writer-&gt;<a class="code" href="structDBusTypeWriter.html#95204ef3a9cf29ee31687032b142b836">type_str</a>), writer-&gt;<a class="code" href="structDBusTypeWriter.html#77c19debc0427372f368cfe7188951f8">type_pos</a>);
<a name="l01724"></a>01724             <a class="code" href="group__DBusInternalsUtils.html#g0c4961ec784874f1b1f3aeccea8d3da1">_dbus_assert_not_reached</a> (<span class="stringliteral">"bad type inserted somewhere inside an array or variant"</span>);
<a name="l01725"></a>01725           }
<a name="l01726"></a>01726       }
<a name="l01727"></a>01727 <span class="preprocessor">#endif </span><span class="comment">/* DBUS_DISABLE_CHECKS */</span>
<a name="l01728"></a>01728 
<a name="l01729"></a>01729       <span class="comment">/* if immediately inside an array we'd always be appending an element,</span>
<a name="l01730"></a>01730 <span class="comment">       * so the expected type doesn't change; if inside a struct or something</span>
<a name="l01731"></a>01731 <span class="comment">       * below an array, we need to move through said struct or something.</span>
<a name="l01732"></a>01732 <span class="comment">       */</span>
<a name="l01733"></a>01733       <span class="keywordflow">if</span> (writer-&gt;<a class="code" href="structDBusTypeWriter.html#d0953035070c7c7d21b044b7b2f0f491">container_type</a> != <a class="code" href="group__DBusProtocol.html#g8912f600f81a773066ca03d9163613a9">DBUS_TYPE_ARRAY</a>)
<a name="l01734"></a>01734         writer-&gt;<a class="code" href="structDBusTypeWriter.html#77c19debc0427372f368cfe7188951f8">type_pos</a> += 1;
<a name="l01735"></a>01735     }
<a name="l01736"></a>01736   <span class="keywordflow">else</span>
<a name="l01737"></a>01737     {
<a name="l01738"></a>01738       <span class="keywordflow">if</span> (!<a class="code" href="group__DBusString.html#gb0770800dce6df97e5d246105a44e7b4">_dbus_string_insert_byte</a> (writer-&gt;<a class="code" href="structDBusTypeWriter.html#95204ef3a9cf29ee31687032b142b836">type_str</a>,
<a name="l01739"></a>01739                                      writer-&gt;<a class="code" href="structDBusTypeWriter.html#77c19debc0427372f368cfe7188951f8">type_pos</a>,
<a name="l01740"></a>01740                                      typecode))
<a name="l01741"></a>01741         <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#ga93f0eb578d23995850d61f7d61c55c1">FALSE</a>;
<a name="l01742"></a>01742 
<a name="l01743"></a>01743       writer-&gt;<a class="code" href="structDBusTypeWriter.html#77c19debc0427372f368cfe7188951f8">type_pos</a> += 1;
<a name="l01744"></a>01744     }
<a name="l01745"></a>01745 
<a name="l01746"></a>01746 <span class="preprocessor">#if RECURSIVE_MARSHAL_WRITE_TRACE</span>
<a name="l01747"></a>01747 <span class="preprocessor"></span>  _dbus_verbose (<span class="stringliteral">"  type writer %p write_or_verify end type_pos = %d remaining sig '%s'\n"</span>,
<a name="l01748"></a>01748                  writer, writer-&gt;<a class="code" href="structDBusTypeWriter.html#77c19debc0427372f368cfe7188951f8">type_pos</a>,
<a name="l01749"></a>01749                  _dbus_string_get_const_data_len (writer-&gt;<a class="code" href="structDBusTypeWriter.html#95204ef3a9cf29ee31687032b142b836">type_str</a>, writer-&gt;<a class="code" href="structDBusTypeWriter.html#77c19debc0427372f368cfe7188951f8">type_pos</a>, 0));
<a name="l01750"></a>01750 <span class="preprocessor">#endif</span>
<a name="l01751"></a>01751 <span class="preprocessor"></span>
<a name="l01752"></a>01752   <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#ga8cecfc5c5c054d2875c03e77b7be15d">TRUE</a>;
<a name="l01753"></a>01753 }
<a name="l01754"></a>01754 
<a name="l01755"></a>01755 <span class="keyword">static</span> <a class="code" href="group__DBusTypes.html#g39c9cb0f3a2a8ad6f55cc4855d035349">dbus_bool_t</a>
<a name="l01756"></a>01756 writer_recurse_struct_or_dict_entry (<a class="code" href="structDBusTypeWriter.html">DBusTypeWriter</a>   *writer,
<a name="l01757"></a>01757                                      <span class="keywordtype">int</span>               begin_char,
<a name="l01758"></a>01758                                      <span class="keyword">const</span> <a class="code" href="structDBusString.html">DBusString</a> *contained_type,
<a name="l01759"></a>01759                                      <span class="keywordtype">int</span>               contained_type_start,
<a name="l01760"></a>01760                                      <span class="keywordtype">int</span>               contained_type_len,
<a name="l01761"></a>01761                                      <a class="code" href="structDBusTypeWriter.html">DBusTypeWriter</a>   *sub)
<a name="l01762"></a>01762 {
<a name="l01763"></a>01763   <span class="comment">/* FIXME right now contained_type is ignored; we could probably</span>
<a name="l01764"></a>01764 <span class="comment">   * almost trivially fix the code so if it's present we</span>
<a name="l01765"></a>01765 <span class="comment">   * write it out and then set type_pos_is_expectation</span>
<a name="l01766"></a>01766 <span class="comment">   */</span>
<a name="l01767"></a>01767 
<a name="l01768"></a>01768   <span class="comment">/* Ensure that we'll be able to add alignment padding and the typecode */</span>
<a name="l01769"></a>01769   <span class="keywordflow">if</span> (writer-&gt;<a class="code" href="structDBusTypeWriter.html#52c8617918c108d36b947cbdfc99c6ea">enabled</a>)
<a name="l01770"></a>01770     {
<a name="l01771"></a>01771       <span class="keywordflow">if</span> (!<a class="code" href="group__DBusString.html#g4764e75c464356408fc1a12df93177c1">_dbus_string_alloc_space</a> (sub-&gt;<a class="code" href="structDBusTypeWriter.html#a4e4b3af31fd7a93d0e54d10882bcc07">value_str</a>, 8))
<a name="l01772"></a>01772         <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#ga93f0eb578d23995850d61f7d61c55c1">FALSE</a>;
<a name="l01773"></a>01773     }
<a name="l01774"></a>01774 
<a name="l01775"></a>01775   <span class="keywordflow">if</span> (!write_or_verify_typecode (sub, begin_char))
<a name="l01776"></a>01776     <a class="code" href="group__DBusInternalsUtils.html#g0c4961ec784874f1b1f3aeccea8d3da1">_dbus_assert_not_reached</a> (<span class="stringliteral">"failed to insert struct typecode after prealloc"</span>);
<a name="l01777"></a>01777 
<a name="l01778"></a>01778   <span class="keywordflow">if</span> (writer-&gt;<a class="code" href="structDBusTypeWriter.html#52c8617918c108d36b947cbdfc99c6ea">enabled</a>)
<a name="l01779"></a>01779     {
<a name="l01780"></a>01780       <span class="keywordflow">if</span> (!<a class="code" href="group__DBusString.html#ga0964d662ad17c58eb044c1b153017a6">_dbus_string_insert_bytes</a> (sub-&gt;value_str,
<a name="l01781"></a>01781                                       sub-&gt;value_pos,
<a name="l01782"></a>01782                                       _DBUS_ALIGN_VALUE (sub-&gt;value_pos, 8) - sub-&gt;value_pos,
<a name="l01783"></a>01783                                       <span class="charliteral">'\0'</span>))
<a name="l01784"></a>01784         <a class="code" href="group__DBusInternalsUtils.html#g0c4961ec784874f1b1f3aeccea8d3da1">_dbus_assert_not_reached</a> (<span class="stringliteral">"should not have failed to insert alignment padding for struct"</span>);
<a name="l01785"></a>01785       sub-&gt;value_pos = _DBUS_ALIGN_VALUE (sub-&gt;value_pos, 8);
<a name="l01786"></a>01786     }
<a name="l01787"></a>01787 
<a name="l01788"></a>01788   <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#ga8cecfc5c5c054d2875c03e77b7be15d">TRUE</a>;
<a name="l01789"></a>01789 }
<a name="l01790"></a>01790 
<a name="l01791"></a>01791 
<a name="l01792"></a>01792 <span class="keyword">static</span> <a class="code" href="group__DBusTypes.html#g39c9cb0f3a2a8ad6f55cc4855d035349">dbus_bool_t</a>
<a name="l01793"></a>01793 writer_recurse_array (<a class="code" href="structDBusTypeWriter.html">DBusTypeWriter</a>   *writer,
<a name="l01794"></a>01794                       <span class="keyword">const</span> <a class="code" href="structDBusString.html">DBusString</a> *contained_type,
<a name="l01795"></a>01795                       <span class="keywordtype">int</span>               contained_type_start,
<a name="l01796"></a>01796                       <span class="keywordtype">int</span>               contained_type_len,
<a name="l01797"></a>01797                       <a class="code" href="structDBusTypeWriter.html">DBusTypeWriter</a>   *sub,
<a name="l01798"></a>01798                       <a class="code" href="group__DBusTypes.html#g39c9cb0f3a2a8ad6f55cc4855d035349">dbus_bool_t</a>       is_array_append)
<a name="l01799"></a>01799 {
<a name="l01800"></a>01800   <a class="code" href="group__DBusTypes.html#gf513803b030613a669cc7ef199f90a8b">dbus_uint32_t</a> value = 0;
<a name="l01801"></a>01801   <span class="keywordtype">int</span> alignment;
<a name="l01802"></a>01802   <span class="keywordtype">int</span> aligned;
<a name="l01803"></a>01803 
<a name="l01804"></a>01804 <span class="preprocessor">#ifndef DBUS_DISABLE_CHECKS</span>
<a name="l01805"></a>01805 <span class="preprocessor"></span>  <span class="keywordflow">if</span> (writer-&gt;<a class="code" href="structDBusTypeWriter.html#d0953035070c7c7d21b044b7b2f0f491">container_type</a> == <a class="code" href="group__DBusProtocol.html#g8912f600f81a773066ca03d9163613a9">DBUS_TYPE_ARRAY</a> &amp;&amp;
<a name="l01806"></a>01806       writer-&gt;<a class="code" href="structDBusTypeWriter.html#95204ef3a9cf29ee31687032b142b836">type_str</a>)
<a name="l01807"></a>01807     {
<a name="l01808"></a>01808       <span class="keywordflow">if</span> (!<a class="code" href="group__DBusString.html#g2095c2a797ae245521a7588b32279110">_dbus_string_equal_substring</a> (contained_type,
<a name="l01809"></a>01809                                          contained_type_start,
<a name="l01810"></a>01810                                          contained_type_len,
<a name="l01811"></a>01811                                          writer-&gt;<a class="code" href="structDBusTypeWriter.html#95204ef3a9cf29ee31687032b142b836">type_str</a>,
<a name="l01812"></a>01812                                          writer-&gt;<a class="code" href="structDBusTypeWriter.html#fe24080d2be45fb6033833a1a38d5d1a">u</a>.<a class="code" href="structDBusTypeWriter.html#a5247dc0cb37527a7affbf28a0904423">array</a>.element_type_pos + 1))
<a name="l01813"></a>01813         {
<a name="l01814"></a>01814           <a class="code" href="group__DBusInternalsUtils.html#g63f2f8a068454b781f214ba596e313b4">_dbus_warn_check_failed</a> (<span class="stringliteral">"Writing an array of '%s' but this is incompatible with the expected type of elements in the parent array\n"</span>,
<a name="l01815"></a>01815                                    _dbus_string_get_const_data_len (contained_type,
<a name="l01816"></a>01816                                                                     contained_type_start,
<a name="l01817"></a>01817                                                                     contained_type_len));
<a name="l01818"></a>01818           <a class="code" href="group__DBusInternalsUtils.html#g0c4961ec784874f1b1f3aeccea8d3da1">_dbus_assert_not_reached</a> (<span class="stringliteral">"incompatible type for child array"</span>);
<a name="l01819"></a>01819         }
<a name="l01820"></a>01820     }
<a name="l01821"></a>01821 <span class="preprocessor">#endif </span><span class="comment">/* DBUS_DISABLE_CHECKS */</span>
<a name="l01822"></a>01822 
<a name="l01823"></a>01823   <span class="keywordflow">if</span> (writer-&gt;<a class="code" href="structDBusTypeWriter.html#52c8617918c108d36b947cbdfc99c6ea">enabled</a> &amp;&amp; !is_array_append)
<a name="l01824"></a>01824     {
<a name="l01825"></a>01825       <span class="comment">/* 3 pad + 4 bytes for the array length, and 4 bytes possible padding</span>
<a name="l01826"></a>01826 <span class="comment">       * before array values</span>
<a name="l01827"></a>01827 <span class="comment">       */</span>
<a name="l01828"></a>01828       <span class="keywordflow">if</span> (!<a class="code" href="group__DBusString.html#g4764e75c464356408fc1a12df93177c1">_dbus_string_alloc_space</a> (sub-&gt;<a class="code" href="structDBusTypeWriter.html#a4e4b3af31fd7a93d0e54d10882bcc07">value_str</a>, 3 + 4 + 4))
<a name="l01829"></a>01829         <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#ga93f0eb578d23995850d61f7d61c55c1">FALSE</a>;
<a name="l01830"></a>01830     }
<a name="l01831"></a>01831 
<a name="l01832"></a>01832   <span class="keywordflow">if</span> (writer-&gt;<a class="code" href="structDBusTypeWriter.html#95204ef3a9cf29ee31687032b142b836">type_str</a> != <a class="code" href="group__DBusMacros.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>)
<a name="l01833"></a>01833     {
<a name="l01834"></a>01834       sub-&gt;<a class="code" href="structDBusTypeWriter.html#77c19debc0427372f368cfe7188951f8">type_pos</a> += 1; <span class="comment">/* move to point to the element type, since type_pos</span>
<a name="l01835"></a>01835 <span class="comment">                           * should be the expected type for further writes</span>
<a name="l01836"></a>01836 <span class="comment">                           */</span>
<a name="l01837"></a>01837       sub-&gt;<a class="code" href="structDBusTypeWriter.html#fe24080d2be45fb6033833a1a38d5d1a">u</a>.<a class="code" href="structDBusTypeWriter.html#a5247dc0cb37527a7affbf28a0904423">array</a>.element_type_pos = sub-&gt;<a class="code" href="structDBusTypeWriter.html#77c19debc0427372f368cfe7188951f8">type_pos</a>;
<a name="l01838"></a>01838     }
<a name="l01839"></a>01839 
<a name="l01840"></a>01840   <span class="keywordflow">if</span> (!writer-&gt;<a class="code" href="structDBusTypeWriter.html#e6db89e9a3adcd52678dc089810cfb0b">type_pos_is_expectation</a>)
<a name="l01841"></a>01841     {
<a name="l01842"></a>01842       <span class="comment">/* sub is a toplevel/outermost array so we need to write the type data */</span>
<a name="l01843"></a>01843 
<a name="l01844"></a>01844       <span class="comment">/* alloc space for array typecode, element signature */</span>
<a name="l01845"></a>01845       <span class="keywordflow">if</span> (!<a class="code" href="group__DBusString.html#g4764e75c464356408fc1a12df93177c1">_dbus_string_alloc_space</a> (writer-&gt;<a class="code" href="structDBusTypeWriter.html#95204ef3a9cf29ee31687032b142b836">type_str</a>, 1 + contained_type_len))
<a name="l01846"></a>01846         <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#ga93f0eb578d23995850d61f7d61c55c1">FALSE</a>;
<a name="l01847"></a>01847 
<a name="l01848"></a>01848       <span class="keywordflow">if</span> (!<a class="code" href="group__DBusString.html#gb0770800dce6df97e5d246105a44e7b4">_dbus_string_insert_byte</a> (writer-&gt;<a class="code" href="structDBusTypeWriter.html#95204ef3a9cf29ee31687032b142b836">type_str</a>,
<a name="l01849"></a>01849                                      writer-&gt;<a class="code" href="structDBusTypeWriter.html#77c19debc0427372f368cfe7188951f8">type_pos</a>,
<a name="l01850"></a>01850                                      <a class="code" href="group__DBusProtocol.html#g8912f600f81a773066ca03d9163613a9">DBUS_TYPE_ARRAY</a>))
<a name="l01851"></a>01851         <a class="code" href="group__DBusInternalsUtils.html#g0c4961ec784874f1b1f3aeccea8d3da1">_dbus_assert_not_reached</a> (<span class="stringliteral">"failed to insert array typecode after prealloc"</span>);
<a name="l01852"></a>01852 
<a name="l01853"></a>01853       <span class="keywordflow">if</span> (!<a class="code" href="group__DBusString.html#gf5f13bc7ac7a623516930d26ae2589bf">_dbus_string_copy_len</a> (contained_type,
<a name="l01854"></a>01854                                   contained_type_start, contained_type_len,
<a name="l01855"></a>01855                                   sub-&gt;<a class="code" href="structDBusTypeWriter.html#95204ef3a9cf29ee31687032b142b836">type_str</a>,
<a name="l01856"></a>01856                                   sub-&gt;<a class="code" href="structDBusTypeWriter.html#fe24080d2be45fb6033833a1a38d5d1a">u</a>.<a class="code" href="structDBusTypeWriter.html#a5247dc0cb37527a7affbf28a0904423">array</a>.element_type_pos))
<a name="l01857"></a>01857         <a class="code" href="group__DBusInternalsUtils.html#g0c4961ec784874f1b1f3aeccea8d3da1">_dbus_assert_not_reached</a> (<span class="stringliteral">"should not have failed to insert array element typecodes"</span>);
<a name="l01858"></a>01858     }
<a name="l01859"></a>01859 
<a name="l01860"></a>01860   <span class="keywordflow">if</span> (writer-&gt;<a class="code" href="structDBusTypeWriter.html#95204ef3a9cf29ee31687032b142b836">type_str</a> != <a class="code" href="group__DBusMacros.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>)
<a name="l01861"></a>01861     {
<a name="l01862"></a>01862       <span class="comment">/* If the parent is an array, we hold type_pos pointing at the array element type;</span>
<a name="l01863"></a>01863 <span class="comment">       * otherwise advance it to reflect the array value we just recursed into</span>
<a name="l01864"></a>01864 <span class="comment">       */</span>
<a name="l01865"></a>01865       <span class="keywordflow">if</span> (writer-&gt;<a class="code" href="structDBusTypeWriter.html#d0953035070c7c7d21b044b7b2f0f491">container_type</a> != <a class="code" href="group__DBusProtocol.html#g8912f600f81a773066ca03d9163613a9">DBUS_TYPE_ARRAY</a>)
<a name="l01866"></a>01866         writer-&gt;<a class="code" href="structDBusTypeWriter.html#77c19debc0427372f368cfe7188951f8">type_pos</a> += 1 + contained_type_len;
<a name="l01867"></a>01867       <span class="keywordflow">else</span>
<a name="l01868"></a>01868         <a class="code" href="group__DBusInternalsUtils.html#g129c6c03f011cdc171934d5d386cc797">_dbus_assert</a> (writer-&gt;<a class="code" href="structDBusTypeWriter.html#e6db89e9a3adcd52678dc089810cfb0b">type_pos_is_expectation</a>); <span class="comment">/* because it's an array */</span>
<a name="l01869"></a>01869     }
<a name="l01870"></a>01870 
<a name="l01871"></a>01871   <span class="keywordflow">if</span> (writer-&gt;<a class="code" href="structDBusTypeWriter.html#52c8617918c108d36b947cbdfc99c6ea">enabled</a>)
<a name="l01872"></a>01872     {
<a name="l01873"></a>01873       <span class="comment">/* Write (or jump over, if is_array_append) the length */</span>
<a name="l01874"></a>01874       sub-&gt;<a class="code" href="structDBusTypeWriter.html#fe24080d2be45fb6033833a1a38d5d1a">u</a>.<a class="code" href="structDBusTypeWriter.html#a5247dc0cb37527a7affbf28a0904423">array</a>.len_pos = _DBUS_ALIGN_VALUE (sub-&gt;<a class="code" href="structDBusTypeWriter.html#27c0475eedd90be65f90a799e5210947">value_pos</a>, 4);
<a name="l01875"></a>01875 
<a name="l01876"></a>01876       <span class="keywordflow">if</span> (is_array_append)
<a name="l01877"></a>01877         {
<a name="l01878"></a>01878           sub-&gt;<a class="code" href="structDBusTypeWriter.html#27c0475eedd90be65f90a799e5210947">value_pos</a> += 4;
<a name="l01879"></a>01879         }
<a name="l01880"></a>01880       <span class="keywordflow">else</span>
<a name="l01881"></a>01881         {
<a name="l01882"></a>01882           <span class="keywordflow">if</span> (!_dbus_type_writer_write_basic_no_typecode (sub, <a class="code" href="group__DBusProtocol.html#gedb1740bd8a9174b98ac593eded25d49">DBUS_TYPE_UINT32</a>,
<a name="l01883"></a>01883                                                           &amp;value))
<a name="l01884"></a>01884             <a class="code" href="group__DBusInternalsUtils.html#g0c4961ec784874f1b1f3aeccea8d3da1">_dbus_assert_not_reached</a> (<span class="stringliteral">"should not have failed to insert array len"</span>);
<a name="l01885"></a>01885         }
<a name="l01886"></a>01886 
<a name="l01887"></a>01887       <a class="code" href="group__DBusInternalsUtils.html#g129c6c03f011cdc171934d5d386cc797">_dbus_assert</a> (sub-&gt;<a class="code" href="structDBusTypeWriter.html#fe24080d2be45fb6033833a1a38d5d1a">u</a>.<a class="code" href="structDBusTypeWriter.html#a5247dc0cb37527a7affbf28a0904423">array</a>.len_pos == sub-&gt;<a class="code" href="structDBusTypeWriter.html#27c0475eedd90be65f90a799e5210947">value_pos</a> - 4);
<a name="l01888"></a>01888 
<a name="l01889"></a>01889       <span class="comment">/* Write alignment padding for array elements</span>
<a name="l01890"></a>01890 <span class="comment">       * Note that we write the padding *even for empty arrays*</span>
<a name="l01891"></a>01891 <span class="comment">       * to avoid wonky special cases</span>
<a name="l01892"></a>01892 <span class="comment">       */</span>
<a name="l01893"></a>01893       alignment = element_type_get_alignment (contained_type, contained_type_start);
<a name="l01894"></a>01894 
<a name="l01895"></a>01895       aligned = _DBUS_ALIGN_VALUE (sub-&gt;<a class="code" href="structDBusTypeWriter.html#27c0475eedd90be65f90a799e5210947">value_pos</a>, alignment);
<a name="l01896"></a>01896       <span class="keywordflow">if</span> (aligned != sub-&gt;<a class="code" href="structDBusTypeWriter.html#27c0475eedd90be65f90a799e5210947">value_pos</a>)
<a name="l01897"></a>01897         {
<a name="l01898"></a>01898           <span class="keywordflow">if</span> (!is_array_append)
<a name="l01899"></a>01899             {
<a name="l01900"></a>01900               <span class="keywordflow">if</span> (!<a class="code" href="group__DBusString.html#ga0964d662ad17c58eb044c1b153017a6">_dbus_string_insert_bytes</a> (sub-&gt;<a class="code" href="structDBusTypeWriter.html#a4e4b3af31fd7a93d0e54d10882bcc07">value_str</a>,
<a name="l01901"></a>01901                                               sub-&gt;<a class="code" href="structDBusTypeWriter.html#27c0475eedd90be65f90a799e5210947">value_pos</a>,
<a name="l01902"></a>01902                                               aligned - sub-&gt;<a class="code" href="structDBusTypeWriter.html#27c0475eedd90be65f90a799e5210947">value_pos</a>,
<a name="l01903"></a>01903                                               <span class="charliteral">'\0'</span>))
<a name="l01904"></a>01904                 <a class="code" href="group__DBusInternalsUtils.html#g0c4961ec784874f1b1f3aeccea8d3da1">_dbus_assert_not_reached</a> (<span class="stringliteral">"should not have failed to insert alignment padding"</span>);
<a name="l01905"></a>01905             }
<a name="l01906"></a>01906 
<a name="l01907"></a>01907           sub-&gt;<a class="code" href="structDBusTypeWriter.html#27c0475eedd90be65f90a799e5210947">value_pos</a> = aligned;
<a name="l01908"></a>01908         }
<a name="l01909"></a>01909 
<a name="l01910"></a>01910       sub-&gt;<a class="code" href="structDBusTypeWriter.html#fe24080d2be45fb6033833a1a38d5d1a">u</a>.<a class="code" href="structDBusTypeWriter.html#a5247dc0cb37527a7affbf28a0904423">array</a>.start_pos = sub-&gt;<a class="code" href="structDBusTypeWriter.html#27c0475eedd90be65f90a799e5210947">value_pos</a>;
<a name="l01911"></a>01911 
<a name="l01912"></a>01912       <span class="keywordflow">if</span> (is_array_append)
<a name="l01913"></a>01913         {
<a name="l01914"></a>01914           <a class="code" href="group__DBusTypes.html#gf513803b030613a669cc7ef199f90a8b">dbus_uint32_t</a> len;
<a name="l01915"></a>01915 
<a name="l01916"></a>01916           <a class="code" href="group__DBusInternalsUtils.html#g129c6c03f011cdc171934d5d386cc797">_dbus_assert</a> (_DBUS_ALIGN_VALUE (sub-&gt;<a class="code" href="structDBusTypeWriter.html#fe24080d2be45fb6033833a1a38d5d1a">u</a>.<a class="code" href="structDBusTypeWriter.html#a5247dc0cb37527a7affbf28a0904423">array</a>.len_pos, 4) ==
<a name="l01917"></a>01917                         (<span class="keywordtype">unsigned</span>) sub-&gt;<a class="code" href="structDBusTypeWriter.html#fe24080d2be45fb6033833a1a38d5d1a">u</a>.<a class="code" href="structDBusTypeWriter.html#a5247dc0cb37527a7affbf28a0904423">array</a>.len_pos);
<a name="l01918"></a>01918           len = _dbus_unpack_uint32 (sub-&gt;<a class="code" href="structDBusTypeWriter.html#6c4baf0b7148cf3f76924b654dada148">byte_order</a>,
<a name="l01919"></a>01919                                      _dbus_string_get_const_data_len (sub-&gt;<a class="code" href="structDBusTypeWriter.html#a4e4b3af31fd7a93d0e54d10882bcc07">value_str</a>,
<a name="l01920"></a>01920                                                                       sub-&gt;<a class="code" href="structDBusTypeWriter.html#fe24080d2be45fb6033833a1a38d5d1a">u</a>.<a class="code" href="structDBusTypeWriter.html#a5247dc0cb37527a7affbf28a0904423">array</a>.len_pos,
<a name="l01921"></a>01921                                                                       4));
<a name="l01922"></a>01922 
<a name="l01923"></a>01923           sub-&gt;<a class="code" href="structDBusTypeWriter.html#27c0475eedd90be65f90a799e5210947">value_pos</a> += len;
<a name="l01924"></a>01924         }
<a name="l01925"></a>01925     }
<a name="l01926"></a>01926   <span class="keywordflow">else</span>
<a name="l01927"></a>01927     {
<a name="l01928"></a>01928       <span class="comment">/* not enabled, so we won't write the len_pos; set it to -1 to so indicate */</span>
<a name="l01929"></a>01929       sub-&gt;<a class="code" href="structDBusTypeWriter.html#fe24080d2be45fb6033833a1a38d5d1a">u</a>.<a class="code" href="structDBusTypeWriter.html#a5247dc0cb37527a7affbf28a0904423">array</a>.len_pos = -1;
<a name="l01930"></a>01930       sub-&gt;<a class="code" href="structDBusTypeWriter.html#fe24080d2be45fb6033833a1a38d5d1a">u</a>.<a class="code" href="structDBusTypeWriter.html#a5247dc0cb37527a7affbf28a0904423">array</a>.start_pos = sub-&gt;<a class="code" href="structDBusTypeWriter.html#27c0475eedd90be65f90a799e5210947">value_pos</a>;
<a name="l01931"></a>01931     }
<a name="l01932"></a>01932 
<a name="l01933"></a>01933   <a class="code" href="group__DBusInternalsUtils.html#g129c6c03f011cdc171934d5d386cc797">_dbus_assert</a> (sub-&gt;<a class="code" href="structDBusTypeWriter.html#fe24080d2be45fb6033833a1a38d5d1a">u</a>.<a class="code" href="structDBusTypeWriter.html#a5247dc0cb37527a7affbf28a0904423">array</a>.len_pos &lt; sub-&gt;<a class="code" href="structDBusTypeWriter.html#fe24080d2be45fb6033833a1a38d5d1a">u</a>.<a class="code" href="structDBusTypeWriter.html#a5247dc0cb37527a7affbf28a0904423">array</a>.start_pos);
<a name="l01934"></a>01934   <a class="code" href="group__DBusInternalsUtils.html#g129c6c03f011cdc171934d5d386cc797">_dbus_assert</a> (is_array_append || sub-&gt;<a class="code" href="structDBusTypeWriter.html#fe24080d2be45fb6033833a1a38d5d1a">u</a>.<a class="code" href="structDBusTypeWriter.html#a5247dc0cb37527a7affbf28a0904423">array</a>.start_pos == sub-&gt;<a class="code" href="structDBusTypeWriter.html#27c0475eedd90be65f90a799e5210947">value_pos</a>);
<a name="l01935"></a>01935 
<a name="l01936"></a>01936 <span class="preprocessor">#if RECURSIVE_MARSHAL_WRITE_TRACE</span>
<a name="l01937"></a>01937 <span class="preprocessor"></span>      _dbus_verbose (<span class="stringliteral">"  type writer %p recurse array done remaining sig '%s' array start_pos = %d len_pos = %d value_pos = %d\n"</span>, sub,
<a name="l01938"></a>01938                      sub-&gt;<a class="code" href="structDBusTypeWriter.html#95204ef3a9cf29ee31687032b142b836">type_str</a> ?
<a name="l01939"></a>01939                      _dbus_string_get_const_data_len (sub-&gt;<a class="code" href="structDBusTypeWriter.html#95204ef3a9cf29ee31687032b142b836">type_str</a>, sub-&gt;<a class="code" href="structDBusTypeWriter.html#77c19debc0427372f368cfe7188951f8">type_pos</a>, 0) :
<a name="l01940"></a>01940                      <span class="stringliteral">"unknown"</span>,
<a name="l01941"></a>01941                      sub-&gt;<a class="code" href="structDBusTypeWriter.html#fe24080d2be45fb6033833a1a38d5d1a">u</a>.<a class="code" href="structDBusTypeWriter.html#a5247dc0cb37527a7affbf28a0904423">array</a>.start_pos, sub-&gt;<a class="code" href="structDBusTypeWriter.html#fe24080d2be45fb6033833a1a38d5d1a">u</a>.<a class="code" href="structDBusTypeWriter.html#a5247dc0cb37527a7affbf28a0904423">array</a>.len_pos, sub-&gt;<a class="code" href="structDBusTypeWriter.html#27c0475eedd90be65f90a799e5210947">value_pos</a>);
<a name="l01942"></a>01942 <span class="preprocessor">#endif</span>
<a name="l01943"></a>01943 <span class="preprocessor"></span>
<a name="l01944"></a>01944   <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#ga8cecfc5c5c054d2875c03e77b7be15d">TRUE</a>;
<a name="l01945"></a>01945 }
<a name="l01946"></a>01946 
<a name="l01947"></a>01947 <span class="comment">/* Variant value will normally have:</span>
<a name="l01948"></a>01948 <span class="comment"> *   1 byte signature length not including nul</span>
<a name="l01949"></a>01949 <span class="comment"> *   signature typecodes (nul terminated)</span>
<a name="l01950"></a>01950 <span class="comment"> *   padding to alignment of contained type</span>
<a name="l01951"></a>01951 <span class="comment"> *   body according to signature</span>
<a name="l01952"></a>01952 <span class="comment"> *</span>
<a name="l01953"></a>01953 <span class="comment"> * The signature string can only have a single type</span>
<a name="l01954"></a>01954 <span class="comment"> * in it but that type may be complex/recursive.</span>
<a name="l01955"></a>01955 <span class="comment"> *</span>
<a name="l01956"></a>01956 <span class="comment"> * So a typical variant type with the integer 3 will have these</span>
<a name="l01957"></a>01957 <span class="comment"> * octets:</span>
<a name="l01958"></a>01958 <span class="comment"> *   0x1 'i' '\0' [1 byte padding to alignment boundary] 0x0 0x0 0x0 0x3</span>
<a name="l01959"></a>01959 <span class="comment"> *</span>
<a name="l01960"></a>01960 <span class="comment"> * The main world of hurt for writing out a variant is that the type</span>
<a name="l01961"></a>01961 <span class="comment"> * string is the same string as the value string. Which means</span>
<a name="l01962"></a>01962 <span class="comment"> * inserting to the type string will move the value_pos; and it means</span>
<a name="l01963"></a>01963 <span class="comment"> * that inserting to the type string could break type alignment.</span>
<a name="l01964"></a>01964 <span class="comment"> */</span>
<a name="l01965"></a>01965 <span class="keyword">static</span> <a class="code" href="group__DBusTypes.html#g39c9cb0f3a2a8ad6f55cc4855d035349">dbus_bool_t</a>
<a name="l01966"></a>01966 writer_recurse_variant (<a class="code" href="structDBusTypeWriter.html">DBusTypeWriter</a>   *writer,
<a name="l01967"></a>01967                         <span class="keyword">const</span> <a class="code" href="structDBusString.html">DBusString</a> *contained_type,
<a name="l01968"></a>01968                         <span class="keywordtype">int</span>               contained_type_start,
<a name="l01969"></a>01969                         <span class="keywordtype">int</span>               contained_type_len,
<a name="l01970"></a>01970                         <a class="code" href="structDBusTypeWriter.html">DBusTypeWriter</a>   *sub)
<a name="l01971"></a>01971 {
<a name="l01972"></a>01972   <span class="keywordtype">int</span> contained_alignment;
<a name="l01973"></a>01973   
<a name="l01974"></a>01974   <span class="keywordflow">if</span> (writer-&gt;<a class="code" href="structDBusTypeWriter.html#52c8617918c108d36b947cbdfc99c6ea">enabled</a>)
<a name="l01975"></a>01975     {
<a name="l01976"></a>01976       <span class="comment">/* Allocate space for the worst case, which is 1 byte sig</span>
<a name="l01977"></a>01977 <span class="comment">       * length, nul byte at end of sig, and 7 bytes padding to</span>
<a name="l01978"></a>01978 <span class="comment">       * 8-boundary.</span>
<a name="l01979"></a>01979 <span class="comment">       */</span>
<a name="l01980"></a>01980       <span class="keywordflow">if</span> (!<a class="code" href="group__DBusString.html#g4764e75c464356408fc1a12df93177c1">_dbus_string_alloc_space</a> (sub-&gt;<a class="code" href="structDBusTypeWriter.html#a4e4b3af31fd7a93d0e54d10882bcc07">value_str</a>, contained_type_len + 9))
<a name="l01981"></a>01981         <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#ga93f0eb578d23995850d61f7d61c55c1">FALSE</a>;
<a name="l01982"></a>01982     }
<a name="l01983"></a>01983 
<a name="l01984"></a>01984   <span class="comment">/* write VARIANT typecode to the parent's type string */</span>
<a name="l01985"></a>01985   <span class="keywordflow">if</span> (!write_or_verify_typecode (writer, <a class="code" href="group__DBusProtocol.html#g4aa7a463ad2bce4e9aa95e3e397ddcf1">DBUS_TYPE_VARIANT</a>))
<a name="l01986"></a>01986     <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#ga93f0eb578d23995850d61f7d61c55c1">FALSE</a>;
<a name="l01987"></a>01987 
<a name="l01988"></a>01988   <span class="comment">/* If not enabled, mark that we have no type_str anymore ... */</span>
<a name="l01989"></a>01989 
<a name="l01990"></a>01990   <span class="keywordflow">if</span> (!writer-&gt;enabled)
<a name="l01991"></a>01991     {
<a name="l01992"></a>01992       sub-&gt;<a class="code" href="structDBusTypeWriter.html#95204ef3a9cf29ee31687032b142b836">type_str</a> = <a class="code" href="group__DBusMacros.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>;
<a name="l01993"></a>01993       sub-&gt;<a class="code" href="structDBusTypeWriter.html#77c19debc0427372f368cfe7188951f8">type_pos</a> = -1;
<a name="l01994"></a>01994 
<a name="l01995"></a>01995       <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#ga8cecfc5c5c054d2875c03e77b7be15d">TRUE</a>;
<a name="l01996"></a>01996     }
<a name="l01997"></a>01997 
<a name="l01998"></a>01998   <span class="comment">/* If we're enabled then continue ... */</span>
<a name="l01999"></a>01999 
<a name="l02000"></a>02000   <span class="keywordflow">if</span> (!<a class="code" href="group__DBusString.html#gb0770800dce6df97e5d246105a44e7b4">_dbus_string_insert_byte</a> (sub-&gt;<a class="code" href="structDBusTypeWriter.html#a4e4b3af31fd7a93d0e54d10882bcc07">value_str</a>,
<a name="l02001"></a>02001                                  sub-&gt;<a class="code" href="structDBusTypeWriter.html#27c0475eedd90be65f90a799e5210947">value_pos</a>,
<a name="l02002"></a>02002                                  contained_type_len))
<a name="l02003"></a>02003     <a class="code" href="group__DBusInternalsUtils.html#g0c4961ec784874f1b1f3aeccea8d3da1">_dbus_assert_not_reached</a> (<span class="stringliteral">"should not have failed to insert variant type sig len"</span>);
<a name="l02004"></a>02004 
<a name="l02005"></a>02005   sub-&gt;<a class="code" href="structDBusTypeWriter.html#27c0475eedd90be65f90a799e5210947">value_pos</a> += 1;
<a name="l02006"></a>02006 
<a name="l02007"></a>02007   <span class="comment">/* Here we switch over to the expected type sig we're about to write */</span>
<a name="l02008"></a>02008   sub-&gt;<a class="code" href="structDBusTypeWriter.html#95204ef3a9cf29ee31687032b142b836">type_str</a> = sub-&gt;<a class="code" href="structDBusTypeWriter.html#a4e4b3af31fd7a93d0e54d10882bcc07">value_str</a>;
<a name="l02009"></a>02009   sub-&gt;<a class="code" href="structDBusTypeWriter.html#77c19debc0427372f368cfe7188951f8">type_pos</a> = sub-&gt;<a class="code" href="structDBusTypeWriter.html#27c0475eedd90be65f90a799e5210947">value_pos</a>;
<a name="l02010"></a>02010 
<a name="l02011"></a>02011   <span class="keywordflow">if</span> (!<a class="code" href="group__DBusString.html#gf5f13bc7ac7a623516930d26ae2589bf">_dbus_string_copy_len</a> (contained_type, contained_type_start, contained_type_len,
<a name="l02012"></a>02012                               sub-&gt;<a class="code" href="structDBusTypeWriter.html#a4e4b3af31fd7a93d0e54d10882bcc07">value_str</a>, sub-&gt;<a class="code" href="structDBusTypeWriter.html#27c0475eedd90be65f90a799e5210947">value_pos</a>))
<a name="l02013"></a>02013     <a class="code" href="group__DBusInternalsUtils.html#g0c4961ec784874f1b1f3aeccea8d3da1">_dbus_assert_not_reached</a> (<span class="stringliteral">"should not have failed to insert variant type sig"</span>);
<a name="l02014"></a>02014 
<a name="l02015"></a>02015   sub-&gt;<a class="code" href="structDBusTypeWriter.html#27c0475eedd90be65f90a799e5210947">value_pos</a> += contained_type_len;
<a name="l02016"></a>02016 
<a name="l02017"></a>02017   <span class="keywordflow">if</span> (!<a class="code" href="group__DBusString.html#gb0770800dce6df97e5d246105a44e7b4">_dbus_string_insert_byte</a> (sub-&gt;<a class="code" href="structDBusTypeWriter.html#a4e4b3af31fd7a93d0e54d10882bcc07">value_str</a>,
<a name="l02018"></a>02018                                  sub-&gt;<a class="code" href="structDBusTypeWriter.html#27c0475eedd90be65f90a799e5210947">value_pos</a>,
<a name="l02019"></a>02019                                  <a class="code" href="group__DBusProtocol.html#ga9588da889743b2119dc6664712ae51e">DBUS_TYPE_INVALID</a>))
<a name="l02020"></a>02020     <a class="code" href="group__DBusInternalsUtils.html#g0c4961ec784874f1b1f3aeccea8d3da1">_dbus_assert_not_reached</a> (<span class="stringliteral">"should not have failed to insert variant type nul termination"</span>);
<a name="l02021"></a>02021 
<a name="l02022"></a>02022   sub-&gt;<a class="code" href="structDBusTypeWriter.html#27c0475eedd90be65f90a799e5210947">value_pos</a> += 1;
<a name="l02023"></a>02023 
<a name="l02024"></a>02024   contained_alignment = <a class="code" href="group__DBusMarshal.html#g2ba80f227880e442c140bc67653b0abd">_dbus_type_get_alignment</a> (<a class="code" href="group__DBusMarshal.html#g5866a0fd058aed3396402d0456144fd2">_dbus_first_type_in_signature</a> (contained_type, contained_type_start));
<a name="l02025"></a>02025   
<a name="l02026"></a>02026   <span class="keywordflow">if</span> (!<a class="code" href="group__DBusString.html#ga0964d662ad17c58eb044c1b153017a6">_dbus_string_insert_bytes</a> (sub-&gt;<a class="code" href="structDBusTypeWriter.html#a4e4b3af31fd7a93d0e54d10882bcc07">value_str</a>,
<a name="l02027"></a>02027                                   sub-&gt;<a class="code" href="structDBusTypeWriter.html#27c0475eedd90be65f90a799e5210947">value_pos</a>,
<a name="l02028"></a>02028                                   _DBUS_ALIGN_VALUE (sub-&gt;<a class="code" href="structDBusTypeWriter.html#27c0475eedd90be65f90a799e5210947">value_pos</a>, contained_alignment) - sub-&gt;<a class="code" href="structDBusTypeWriter.html#27c0475eedd90be65f90a799e5210947">value_pos</a>,
<a name="l02029"></a>02029                                   <span class="charliteral">'\0'</span>))
<a name="l02030"></a>02030     <a class="code" href="group__DBusInternalsUtils.html#g0c4961ec784874f1b1f3aeccea8d3da1">_dbus_assert_not_reached</a> (<span class="stringliteral">"should not have failed to insert alignment padding for variant body"</span>);
<a name="l02031"></a>02031   sub-&gt;<a class="code" href="structDBusTypeWriter.html#27c0475eedd90be65f90a799e5210947">value_pos</a> = _DBUS_ALIGN_VALUE (sub-&gt;<a class="code" href="structDBusTypeWriter.html#27c0475eedd90be65f90a799e5210947">value_pos</a>, contained_alignment);
<a name="l02032"></a>02032 
<a name="l02033"></a>02033   <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#ga8cecfc5c5c054d2875c03e77b7be15d">TRUE</a>;
<a name="l02034"></a>02034 }
<a name="l02035"></a>02035 
<a name="l02036"></a>02036 <span class="keyword">static</span> <a class="code" href="group__DBusTypes.html#g39c9cb0f3a2a8ad6f55cc4855d035349">dbus_bool_t</a>
<a name="l02037"></a>02037 _dbus_type_writer_recurse_contained_len (<a class="code" href="structDBusTypeWriter.html">DBusTypeWriter</a>   *writer,
<a name="l02038"></a>02038                                          <span class="keywordtype">int</span>               container_type,
<a name="l02039"></a>02039                                          <span class="keyword">const</span> <a class="code" href="structDBusString.html">DBusString</a> *contained_type,
<a name="l02040"></a>02040                                          <span class="keywordtype">int</span>               contained_type_start,
<a name="l02041"></a>02041                                          <span class="keywordtype">int</span>               contained_type_len,
<a name="l02042"></a>02042                                          <a class="code" href="structDBusTypeWriter.html">DBusTypeWriter</a>   *sub,
<a name="l02043"></a>02043                                          <a class="code" href="group__DBusTypes.html#g39c9cb0f3a2a8ad6f55cc4855d035349">dbus_bool_t</a>       is_array_append)
<a name="l02044"></a>02044 {
<a name="l02045"></a>02045   writer_recurse_init_and_check (writer, container_type, sub);
<a name="l02046"></a>02046 
<a name="l02047"></a>02047   <span class="keywordflow">switch</span> (container_type)
<a name="l02048"></a>02048     {
<a name="l02049"></a>02049     <span class="keywordflow">case</span> <a class="code" href="group__DBusProtocol.html#ge4b22a74b9edb0ec0ff6e0294794d3f9">DBUS_TYPE_STRUCT</a>:
<a name="l02050"></a>02050       <span class="keywordflow">return</span> writer_recurse_struct_or_dict_entry (writer,
<a name="l02051"></a>02051                                                   <a class="code" href="group__DBusProtocol.html#g725657eca93175475e0694b858f51fd6">DBUS_STRUCT_BEGIN_CHAR</a>,
<a name="l02052"></a>02052                                                   contained_type,
<a name="l02053"></a>02053                                                   contained_type_start, contained_type_len,
<a name="l02054"></a>02054                                                   sub);
<a name="l02055"></a>02055       <span class="keywordflow">break</span>;
<a name="l02056"></a>02056     <span class="keywordflow">case</span> <a class="code" href="group__DBusProtocol.html#gd2fc8e6c50e0ad927f4249fb9e53ca97">DBUS_TYPE_DICT_ENTRY</a>:
<a name="l02057"></a>02057       <span class="keywordflow">return</span> writer_recurse_struct_or_dict_entry (writer,
<a name="l02058"></a>02058                                                   <a class="code" href="group__DBusProtocol.html#gd51b5f7a2e6d927295479dd371f6b353">DBUS_DICT_ENTRY_BEGIN_CHAR</a>,
<a name="l02059"></a>02059                                                   contained_type,
<a name="l02060"></a>02060                                                   contained_type_start, contained_type_len,
<a name="l02061"></a>02061                                                   sub);
<a name="l02062"></a>02062       <span class="keywordflow">break</span>;
<a name="l02063"></a>02063     <span class="keywordflow">case</span> <a class="code" href="group__DBusProtocol.html#g8912f600f81a773066ca03d9163613a9">DBUS_TYPE_ARRAY</a>:
<a name="l02064"></a>02064       <span class="keywordflow">return</span> writer_recurse_array (writer,
<a name="l02065"></a>02065                                    contained_type, contained_type_start, contained_type_len,
<a name="l02066"></a>02066                                    sub, is_array_append);
<a name="l02067"></a>02067       <span class="keywordflow">break</span>;
<a name="l02068"></a>02068     <span class="keywordflow">case</span> <a class="code" href="group__DBusProtocol.html#g4aa7a463ad2bce4e9aa95e3e397ddcf1">DBUS_TYPE_VARIANT</a>:
<a name="l02069"></a>02069       <span class="keywordflow">return</span> writer_recurse_variant (writer,
<a name="l02070"></a>02070                                      contained_type, contained_type_start, contained_type_len,
<a name="l02071"></a>02071                                      sub);
<a name="l02072"></a>02072       <span class="keywordflow">break</span>;
<a name="l02073"></a>02073     <span class="keywordflow">default</span>:
<a name="l02074"></a>02074       <a class="code" href="group__DBusInternalsUtils.html#g0c4961ec784874f1b1f3aeccea8d3da1">_dbus_assert_not_reached</a> (<span class="stringliteral">"tried to recurse into type that doesn't support that"</span>);
<a name="l02075"></a>02075       <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#ga93f0eb578d23995850d61f7d61c55c1">FALSE</a>;
<a name="l02076"></a>02076       <span class="keywordflow">break</span>;
<a name="l02077"></a>02077     }
<a name="l02078"></a>02078 }
<a name="l02079"></a>02079 
<a name="l02090"></a>02090 <a class="code" href="group__DBusTypes.html#g39c9cb0f3a2a8ad6f55cc4855d035349">dbus_bool_t</a>
<a name="l02091"></a><a class="code" href="group__DBusMarshal.html#g4c0a1036e59dac270141052d951baff2">02091</a> <a class="code" href="group__DBusMarshal.html#g4c0a1036e59dac270141052d951baff2">_dbus_type_writer_recurse</a> (<a class="code" href="structDBusTypeWriter.html">DBusTypeWriter</a>   *writer,
<a name="l02092"></a>02092                            <span class="keywordtype">int</span>               container_type,
<a name="l02093"></a>02093                            <span class="keyword">const</span> <a class="code" href="structDBusString.html">DBusString</a> *contained_type,
<a name="l02094"></a>02094                            <span class="keywordtype">int</span>               contained_type_start,
<a name="l02095"></a>02095                            <a class="code" href="structDBusTypeWriter.html">DBusTypeWriter</a>   *sub)
<a name="l02096"></a>02096 {
<a name="l02097"></a>02097   <span class="keywordtype">int</span> contained_type_len;
<a name="l02098"></a>02098 
<a name="l02099"></a>02099   <span class="keywordflow">if</span> (contained_type)
<a name="l02100"></a>02100     contained_type_len = find_len_of_complete_type (contained_type, contained_type_start);
<a name="l02101"></a>02101   <span class="keywordflow">else</span>
<a name="l02102"></a>02102     contained_type_len = 0;
<a name="l02103"></a>02103 
<a name="l02104"></a>02104   <span class="keywordflow">return</span> _dbus_type_writer_recurse_contained_len (writer, container_type,
<a name="l02105"></a>02105                                                   contained_type,
<a name="l02106"></a>02106                                                   contained_type_start,
<a name="l02107"></a>02107                                                   contained_type_len,
<a name="l02108"></a>02108                                                   sub,
<a name="l02109"></a>02109                                                   <a class="code" href="group__DBusMacros.html#ga93f0eb578d23995850d61f7d61c55c1">FALSE</a>);
<a name="l02110"></a>02110 }
<a name="l02111"></a>02111 
<a name="l02124"></a>02124 <a class="code" href="group__DBusTypes.html#g39c9cb0f3a2a8ad6f55cc4855d035349">dbus_bool_t</a>
<a name="l02125"></a><a class="code" href="group__DBusMarshal.html#gcc2b4c348f93898f6269feb0bf055617">02125</a> <a class="code" href="group__DBusMarshal.html#gcc2b4c348f93898f6269feb0bf055617">_dbus_type_writer_append_array</a> (<a class="code" href="structDBusTypeWriter.html">DBusTypeWriter</a>   *writer,
<a name="l02126"></a>02126                                 <span class="keyword">const</span> <a class="code" href="structDBusString.html">DBusString</a> *contained_type,
<a name="l02127"></a>02127                                 <span class="keywordtype">int</span>               contained_type_start,
<a name="l02128"></a>02128                                 <a class="code" href="structDBusTypeWriter.html">DBusTypeWriter</a>   *sub)
<a name="l02129"></a>02129 {
<a name="l02130"></a>02130   <span class="keywordtype">int</span> contained_type_len;
<a name="l02131"></a>02131 
<a name="l02132"></a>02132   <span class="keywordflow">if</span> (contained_type)
<a name="l02133"></a>02133     contained_type_len = find_len_of_complete_type (contained_type, contained_type_start);
<a name="l02134"></a>02134   <span class="keywordflow">else</span>
<a name="l02135"></a>02135     contained_type_len = 0;
<a name="l02136"></a>02136 
<a name="l02137"></a>02137   <span class="keywordflow">return</span> _dbus_type_writer_recurse_contained_len (writer, <a class="code" href="group__DBusProtocol.html#g8912f600f81a773066ca03d9163613a9">DBUS_TYPE_ARRAY</a>,
<a name="l02138"></a>02138                                                   contained_type,
<a name="l02139"></a>02139                                                   contained_type_start,
<a name="l02140"></a>02140                                                   contained_type_len,
<a name="l02141"></a>02141                                                   sub,
<a name="l02142"></a>02142                                                   <a class="code" href="group__DBusMacros.html#ga8cecfc5c5c054d2875c03e77b7be15d">TRUE</a>);
<a name="l02143"></a>02143 }
<a name="l02144"></a>02144 
<a name="l02145"></a>02145 <span class="keyword">static</span> <span class="keywordtype">int</span>
<a name="l02146"></a>02146 writer_get_array_len (<a class="code" href="structDBusTypeWriter.html">DBusTypeWriter</a> *writer)
<a name="l02147"></a>02147 {
<a name="l02148"></a>02148   <a class="code" href="group__DBusInternalsUtils.html#g129c6c03f011cdc171934d5d386cc797">_dbus_assert</a> (writer-&gt;<a class="code" href="structDBusTypeWriter.html#d0953035070c7c7d21b044b7b2f0f491">container_type</a> == <a class="code" href="group__DBusProtocol.html#g8912f600f81a773066ca03d9163613a9">DBUS_TYPE_ARRAY</a>);
<a name="l02149"></a>02149   <span class="keywordflow">return</span> writer-&gt;<a class="code" href="structDBusTypeWriter.html#27c0475eedd90be65f90a799e5210947">value_pos</a> - writer-&gt;<a class="code" href="structDBusTypeWriter.html#fe24080d2be45fb6033833a1a38d5d1a">u</a>.<a class="code" href="structDBusTypeWriter.html#a5247dc0cb37527a7affbf28a0904423">array</a>.start_pos;
<a name="l02150"></a>02150 }
<a name="l02151"></a>02151 
<a name="l02160"></a>02160 <a class="code" href="group__DBusTypes.html#g39c9cb0f3a2a8ad6f55cc4855d035349">dbus_bool_t</a>
<a name="l02161"></a><a class="code" href="group__DBusMarshal.html#gcbe7eddf4f9c19da91b742087fcc111a">02161</a> <a class="code" href="group__DBusMarshal.html#gcbe7eddf4f9c19da91b742087fcc111a">_dbus_type_writer_unrecurse</a> (<a class="code" href="structDBusTypeWriter.html">DBusTypeWriter</a> *writer,
<a name="l02162"></a>02162                              <a class="code" href="structDBusTypeWriter.html">DBusTypeWriter</a> *sub)
<a name="l02163"></a>02163 {
<a name="l02164"></a>02164   <span class="comment">/* type_pos_is_expectation never gets unset once set, or we'd get all hosed */</span>
<a name="l02165"></a>02165   <a class="code" href="group__DBusInternalsUtils.html#g129c6c03f011cdc171934d5d386cc797">_dbus_assert</a> (!writer-&gt;<a class="code" href="structDBusTypeWriter.html#e6db89e9a3adcd52678dc089810cfb0b">type_pos_is_expectation</a> ||
<a name="l02166"></a>02166                 (writer-&gt;<a class="code" href="structDBusTypeWriter.html#e6db89e9a3adcd52678dc089810cfb0b">type_pos_is_expectation</a> &amp;&amp; sub-&gt;<a class="code" href="structDBusTypeWriter.html#e6db89e9a3adcd52678dc089810cfb0b">type_pos_is_expectation</a>));
<a name="l02167"></a>02167 
<a name="l02168"></a>02168 <span class="preprocessor">#if RECURSIVE_MARSHAL_WRITE_TRACE</span>
<a name="l02169"></a>02169 <span class="preprocessor"></span>  _dbus_verbose (<span class="stringliteral">"  type writer %p unrecurse type_pos = %d value_pos = %d is_expectation = %d container_type = %s\n"</span>,
<a name="l02170"></a>02170                  writer, writer-&gt;<a class="code" href="structDBusTypeWriter.html#77c19debc0427372f368cfe7188951f8">type_pos</a>, writer-&gt;<a class="code" href="structDBusTypeWriter.html#27c0475eedd90be65f90a799e5210947">value_pos</a>, writer-&gt;<a class="code" href="structDBusTypeWriter.html#e6db89e9a3adcd52678dc089810cfb0b">type_pos_is_expectation</a>,
<a name="l02171"></a>02171                  <a class="code" href="group__DBusMarshal.html#g48a595c2b26dce6e9c25ce040e5247e5">_dbus_type_to_string</a> (writer-&gt;<a class="code" href="structDBusTypeWriter.html#d0953035070c7c7d21b044b7b2f0f491">container_type</a>));
<a name="l02172"></a>02172   _dbus_verbose (<span class="stringliteral">"  type writer %p unrecurse sub type_pos = %d value_pos = %d is_expectation = %d container_type = %s\n"</span>,
<a name="l02173"></a>02173                  sub, sub-&gt;<a class="code" href="structDBusTypeWriter.html#77c19debc0427372f368cfe7188951f8">type_pos</a>, sub-&gt;<a class="code" href="structDBusTypeWriter.html#27c0475eedd90be65f90a799e5210947">value_pos</a>,
<a name="l02174"></a>02174                  sub-&gt;<a class="code" href="structDBusTypeWriter.html#e6db89e9a3adcd52678dc089810cfb0b">type_pos_is_expectation</a>,
<a name="l02175"></a>02175                  <a class="code" href="group__DBusMarshal.html#g48a595c2b26dce6e9c25ce040e5247e5">_dbus_type_to_string</a> (sub-&gt;<a class="code" href="structDBusTypeWriter.html#d0953035070c7c7d21b044b7b2f0f491">container_type</a>));
<a name="l02176"></a>02176 <span class="preprocessor">#endif</span>
<a name="l02177"></a>02177 <span class="preprocessor"></span>
<a name="l02178"></a>02178   <span class="keywordflow">if</span> (sub-&gt;<a class="code" href="structDBusTypeWriter.html#d0953035070c7c7d21b044b7b2f0f491">container_type</a> == <a class="code" href="group__DBusProtocol.html#ge4b22a74b9edb0ec0ff6e0294794d3f9">DBUS_TYPE_STRUCT</a>)
<a name="l02179"></a>02179     {
<a name="l02180"></a>02180       <span class="keywordflow">if</span> (!write_or_verify_typecode (sub, <a class="code" href="group__DBusProtocol.html#geab5ea0def3f587a0ed548b77d5c5cea">DBUS_STRUCT_END_CHAR</a>))
<a name="l02181"></a>02181         <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#ga93f0eb578d23995850d61f7d61c55c1">FALSE</a>;
<a name="l02182"></a>02182     }
<a name="l02183"></a>02183   <span class="keywordflow">else</span> <span class="keywordflow">if</span> (sub-&gt;<a class="code" href="structDBusTypeWriter.html#d0953035070c7c7d21b044b7b2f0f491">container_type</a> == <a class="code" href="group__DBusProtocol.html#gd2fc8e6c50e0ad927f4249fb9e53ca97">DBUS_TYPE_DICT_ENTRY</a>)
<a name="l02184"></a>02184     {
<a name="l02185"></a>02185       <span class="keywordflow">if</span> (!write_or_verify_typecode (sub, <a class="code" href="group__DBusProtocol.html#g29ad22c7342ead042ae9e55ae20b49f1">DBUS_DICT_ENTRY_END_CHAR</a>))
<a name="l02186"></a>02186         <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#ga93f0eb578d23995850d61f7d61c55c1">FALSE</a>;
<a name="l02187"></a>02187     }
<a name="l02188"></a>02188   <span class="keywordflow">else</span> <span class="keywordflow">if</span> (sub-&gt;<a class="code" href="structDBusTypeWriter.html#d0953035070c7c7d21b044b7b2f0f491">container_type</a> == <a class="code" href="group__DBusProtocol.html#g8912f600f81a773066ca03d9163613a9">DBUS_TYPE_ARRAY</a>)
<a name="l02189"></a>02189     {
<a name="l02190"></a>02190       <span class="keywordflow">if</span> (sub-&gt;<a class="code" href="structDBusTypeWriter.html#fe24080d2be45fb6033833a1a38d5d1a">u</a>.<a class="code" href="structDBusTypeWriter.html#a5247dc0cb37527a7affbf28a0904423">array</a>.len_pos &gt;= 0) <span class="comment">/* len_pos == -1 if we weren't enabled when we passed it */</span>
<a name="l02191"></a>02191         {
<a name="l02192"></a>02192           <a class="code" href="group__DBusTypes.html#gf513803b030613a669cc7ef199f90a8b">dbus_uint32_t</a> len;
<a name="l02193"></a>02193 
<a name="l02194"></a>02194           <span class="comment">/* Set the array length */</span>
<a name="l02195"></a>02195           len = writer_get_array_len (sub);
<a name="l02196"></a>02196           <a class="code" href="group__DBusMarshal.html#g4bcfb6a664c7e46c7ffc31f96d532a02">_dbus_marshal_set_uint32</a> (sub-&gt;<a class="code" href="structDBusTypeWriter.html#a4e4b3af31fd7a93d0e54d10882bcc07">value_str</a>,
<a name="l02197"></a>02197                                     sub-&gt;<a class="code" href="structDBusTypeWriter.html#fe24080d2be45fb6033833a1a38d5d1a">u</a>.<a class="code" href="structDBusTypeWriter.html#a5247dc0cb37527a7affbf28a0904423">array</a>.len_pos,
<a name="l02198"></a>02198                                     len,
<a name="l02199"></a>02199                                     sub-&gt;<a class="code" href="structDBusTypeWriter.html#6c4baf0b7148cf3f76924b654dada148">byte_order</a>);
<a name="l02200"></a>02200 <span class="preprocessor">#if RECURSIVE_MARSHAL_WRITE_TRACE</span>
<a name="l02201"></a>02201 <span class="preprocessor"></span>          _dbus_verbose (<span class="stringliteral">"    filled in sub array len to %u at len_pos %d\n"</span>,
<a name="l02202"></a>02202                          len, sub-&gt;<a class="code" href="structDBusTypeWriter.html#fe24080d2be45fb6033833a1a38d5d1a">u</a>.<a class="code" href="structDBusTypeWriter.html#a5247dc0cb37527a7affbf28a0904423">array</a>.len_pos);
<a name="l02203"></a>02203 <span class="preprocessor">#endif</span>
<a name="l02204"></a>02204 <span class="preprocessor"></span>        }
<a name="l02205"></a>02205 <span class="preprocessor">#if RECURSIVE_MARSHAL_WRITE_TRACE</span>
<a name="l02206"></a>02206 <span class="preprocessor"></span>      <span class="keywordflow">else</span>
<a name="l02207"></a>02207         {
<a name="l02208"></a>02208           _dbus_verbose (<span class="stringliteral">"    not filling in sub array len because we were disabled when we passed the len\n"</span>);
<a name="l02209"></a>02209         }
<a name="l02210"></a>02210 <span class="preprocessor">#endif</span>
<a name="l02211"></a>02211 <span class="preprocessor"></span>    }
<a name="l02212"></a>02212 
<a name="l02213"></a>02213   <span class="comment">/* Now get type_pos right for the parent writer. Here are the cases:</span>
<a name="l02214"></a>02214 <span class="comment">   *</span>
<a name="l02215"></a>02215 <span class="comment">   * Cases !writer-&gt;type_pos_is_expectation:</span>
<a name="l02216"></a>02216 <span class="comment">   *   (in these cases we want to update to the new insertion point)</span>
<a name="l02217"></a>02217 <span class="comment">   *</span>
<a name="l02218"></a>02218 <span class="comment">   * - if we recursed into a STRUCT then we didn't know in advance</span>
<a name="l02219"></a>02219 <span class="comment">   *   what the types in the struct would be; so we have to fill in</span>
<a name="l02220"></a>02220 <span class="comment">   *   that information now.</span>
<a name="l02221"></a>02221 <span class="comment">   *       writer-&gt;type_pos = sub-&gt;type_pos</span>
<a name="l02222"></a>02222 <span class="comment">   *</span>
<a name="l02223"></a>02223 <span class="comment">   * - if we recursed into anything else, we knew the full array</span>
<a name="l02224"></a>02224 <span class="comment">   *   type, or knew the single typecode marking VARIANT, so</span>
<a name="l02225"></a>02225 <span class="comment">   *   writer-&gt;type_pos is already correct.</span>
<a name="l02226"></a>02226 <span class="comment">   *       writer-&gt;type_pos should remain as-is</span>
<a name="l02227"></a>02227 <span class="comment">   *</span>
<a name="l02228"></a>02228 <span class="comment">   * - note that the parent is never an ARRAY or VARIANT, if it were</span>
<a name="l02229"></a>02229 <span class="comment">   *   then type_pos_is_expectation would be TRUE. The parent</span>
<a name="l02230"></a>02230 <span class="comment">   *   is thus known to be a toplevel or STRUCT.</span>
<a name="l02231"></a>02231 <span class="comment">   *</span>
<a name="l02232"></a>02232 <span class="comment">   * Cases where writer-&gt;type_pos_is_expectation:</span>
<a name="l02233"></a>02233 <span class="comment">   *   (in these cases we want to update to next expected type to write)</span>
<a name="l02234"></a>02234 <span class="comment">   *</span>
<a name="l02235"></a>02235 <span class="comment">   * - we recursed from STRUCT into STRUCT and we didn't increment</span>
<a name="l02236"></a>02236 <span class="comment">   *   type_pos in the parent just to stay consistent with the</span>
<a name="l02237"></a>02237 <span class="comment">   *   !writer-&gt;type_pos_is_expectation case (though we could</span>
<a name="l02238"></a>02238 <span class="comment">   *   special-case this in recurse_struct instead if we wanted)</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">   * - we recursed from STRUCT into ARRAY or VARIANT and type_pos</span>
<a name="l02242"></a>02242 <span class="comment">   *   for parent should have been incremented already</span>
<a name="l02243"></a>02243 <span class="comment">   *       writer-&gt;type_pos should remain as-is</span>
<a name="l02244"></a>02244 <span class="comment">   *</span>
<a name="l02245"></a>02245 <span class="comment">   * - we recursed from ARRAY into a sub-element, so type_pos in the</span>
<a name="l02246"></a>02246 <span class="comment">   *   parent is the element type and should remain the element type</span>
<a name="l02247"></a>02247 <span class="comment">   *   for the benefit of the next child element</span>
<a name="l02248"></a>02248 <span class="comment">   *       writer-&gt;type_pos should remain as-is</span>
<a name="l02249"></a>02249 <span class="comment">   *</span>
<a name="l02250"></a>02250 <span class="comment">   * - we recursed from VARIANT into its value, so type_pos in the</span>
<a name="l02251"></a>02251 <span class="comment">   *   parent makes no difference since there's only one value</span>
<a name="l02252"></a>02252 <span class="comment">   *   and we just finished writing it and won't use type_pos again</span>
<a name="l02253"></a>02253 <span class="comment">   *       writer-&gt;type_pos should remain as-is</span>
<a name="l02254"></a>02254 <span class="comment">   *</span>
<a name="l02255"></a>02255 <span class="comment">   *</span>
<a name="l02256"></a>02256 <span class="comment">   * For all these, DICT_ENTRY is the same as STRUCT</span>
<a name="l02257"></a>02257 <span class="comment">   */</span>
<a name="l02258"></a>02258   <span class="keywordflow">if</span> (writer-&gt;<a class="code" href="structDBusTypeWriter.html#95204ef3a9cf29ee31687032b142b836">type_str</a> != <a class="code" href="group__DBusMacros.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>)
<a name="l02259"></a>02259     {
<a name="l02260"></a>02260       <span class="keywordflow">if</span> ((sub-&gt;<a class="code" href="structDBusTypeWriter.html#d0953035070c7c7d21b044b7b2f0f491">container_type</a> == <a class="code" href="group__DBusProtocol.html#ge4b22a74b9edb0ec0ff6e0294794d3f9">DBUS_TYPE_STRUCT</a> ||
<a name="l02261"></a>02261            sub-&gt;<a class="code" href="structDBusTypeWriter.html#d0953035070c7c7d21b044b7b2f0f491">container_type</a> == <a class="code" href="group__DBusProtocol.html#gd2fc8e6c50e0ad927f4249fb9e53ca97">DBUS_TYPE_DICT_ENTRY</a>) &amp;&amp;
<a name="l02262"></a>02262           (writer-&gt;<a class="code" href="structDBusTypeWriter.html#d0953035070c7c7d21b044b7b2f0f491">container_type</a> == <a class="code" href="group__DBusProtocol.html#ge4b22a74b9edb0ec0ff6e0294794d3f9">DBUS_TYPE_STRUCT</a> ||
<a name="l02263"></a>02263            writer-&gt;<a class="code" href="structDBusTypeWriter.html#d0953035070c7c7d21b044b7b2f0f491">container_type</a> == <a class="code" href="group__DBusProtocol.html#gd2fc8e6c50e0ad927f4249fb9e53ca97">DBUS_TYPE_DICT_ENTRY</a> ||
<a name="l02264"></a>02264            writer-&gt;<a class="code" href="structDBusTypeWriter.html#d0953035070c7c7d21b044b7b2f0f491">container_type</a> == <a class="code" href="group__DBusProtocol.html#ga9588da889743b2119dc6664712ae51e">DBUS_TYPE_INVALID</a>))
<a name="l02265"></a>02265         {
<a name="l02266"></a>02266           <span class="comment">/* Advance the parent to the next struct field */</span>
<a name="l02267"></a>02267           writer-&gt;<a class="code" href="structDBusTypeWriter.html#77c19debc0427372f368cfe7188951f8">type_pos</a> = sub-&gt;<a class="code" href="structDBusTypeWriter.html#77c19debc0427372f368cfe7188951f8">type_pos</a>;
<a name="l02268"></a>02268         }
<a name="l02269"></a>02269     }
<a name="l02270"></a>02270 
<a name="l02271"></a>02271   writer-&gt;<a class="code" href="structDBusTypeWriter.html#27c0475eedd90be65f90a799e5210947">value_pos</a> = sub-&gt;<a class="code" href="structDBusTypeWriter.html#27c0475eedd90be65f90a799e5210947">value_pos</a>;
<a name="l02272"></a>02272 
<a name="l02273"></a>02273 <span class="preprocessor">#if RECURSIVE_MARSHAL_WRITE_TRACE</span>
<a name="l02274"></a>02274 <span class="preprocessor"></span>  _dbus_verbose (<span class="stringliteral">"  type writer %p unrecursed type_pos = %d value_pos = %d remaining sig '%s'\n"</span>,
<a name="l02275"></a>02275                  writer, writer-&gt;<a class="code" href="structDBusTypeWriter.html#77c19debc0427372f368cfe7188951f8">type_pos</a>, writer-&gt;<a class="code" href="structDBusTypeWriter.html#27c0475eedd90be65f90a799e5210947">value_pos</a>,
<a name="l02276"></a>02276                  writer-&gt;<a class="code" href="structDBusTypeWriter.html#95204ef3a9cf29ee31687032b142b836">type_str</a> ?
<a name="l02277"></a>02277                  _dbus_string_get_const_data_len (writer-&gt;<a class="code" href="structDBusTypeWriter.html#95204ef3a9cf29ee31687032b142b836">type_str</a>, writer-&gt;<a class="code" href="structDBusTypeWriter.html#77c19debc0427372f368cfe7188951f8">type_pos</a>, 0) :
<a name="l02278"></a>02278                  <span class="stringliteral">"unknown"</span>);
<a name="l02279"></a>02279 <span class="preprocessor">#endif</span>
<a name="l02280"></a>02280 <span class="preprocessor"></span>
<a name="l02281"></a>02281   <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#ga8cecfc5c5c054d2875c03e77b7be15d">TRUE</a>;
<a name="l02282"></a>02282 }
<a name="l02283"></a>02283 
<a name="l02292"></a>02292 <a class="code" href="group__DBusTypes.html#g39c9cb0f3a2a8ad6f55cc4855d035349">dbus_bool_t</a>
<a name="l02293"></a><a class="code" href="group__DBusMarshal.html#g0103b0214766b0ff1ca05bcc7f1e631b">02293</a> <a class="code" href="group__DBusMarshal.html#g0103b0214766b0ff1ca05bcc7f1e631b">_dbus_type_writer_write_basic</a> (<a class="code" href="structDBusTypeWriter.html">DBusTypeWriter</a> *writer,
<a name="l02294"></a>02294                                <span class="keywordtype">int</span>             type,
<a name="l02295"></a>02295                                <span class="keyword">const</span> <span class="keywordtype">void</span>     *value)
<a name="l02296"></a>02296 {
<a name="l02297"></a>02297   <a class="code" href="group__DBusTypes.html#g39c9cb0f3a2a8ad6f55cc4855d035349">dbus_bool_t</a> retval;
<a name="l02298"></a>02298 
<a name="l02299"></a>02299   <span class="comment">/* First ensure that our type realloc will succeed */</span>
<a name="l02300"></a>02300   <span class="keywordflow">if</span> (!writer-&gt;<a class="code" href="structDBusTypeWriter.html#e6db89e9a3adcd52678dc089810cfb0b">type_pos_is_expectation</a> &amp;&amp; writer-&gt;<a class="code" href="structDBusTypeWriter.html#95204ef3a9cf29ee31687032b142b836">type_str</a> != <a class="code" href="group__DBusMacros.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>)
<a name="l02301"></a>02301     {
<a name="l02302"></a>02302       <span class="keywordflow">if</span> (!<a class="code" href="group__DBusString.html#g4764e75c464356408fc1a12df93177c1">_dbus_string_alloc_space</a> (writer-&gt;<a class="code" href="structDBusTypeWriter.html#95204ef3a9cf29ee31687032b142b836">type_str</a>, 1))
<a name="l02303"></a>02303         <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#ga93f0eb578d23995850d61f7d61c55c1">FALSE</a>;
<a name="l02304"></a>02304     }
<a name="l02305"></a>02305 
<a name="l02306"></a>02306   retval = <a class="code" href="group__DBusMacros.html#ga93f0eb578d23995850d61f7d61c55c1">FALSE</a>;
<a name="l02307"></a>02307 
<a name="l02308"></a>02308   <span class="keywordflow">if</span> (!_dbus_type_writer_write_basic_no_typecode (writer, type, value))
<a name="l02309"></a>02309     <span class="keywordflow">goto</span> out;
<a name="l02310"></a>02310 
<a name="l02311"></a>02311   <span class="keywordflow">if</span> (!write_or_verify_typecode (writer, type))
<a name="l02312"></a>02312     <a class="code" href="group__DBusInternalsUtils.html#g0c4961ec784874f1b1f3aeccea8d3da1">_dbus_assert_not_reached</a> (<span class="stringliteral">"failed to write typecode after prealloc"</span>);
<a name="l02313"></a>02313 
<a name="l02314"></a>02314   retval = <a class="code" href="group__DBusMacros.html#ga8cecfc5c5c054d2875c03e77b7be15d">TRUE</a>;
<a name="l02315"></a>02315 
<a name="l02316"></a>02316  out:
<a name="l02317"></a>02317 <span class="preprocessor">#if RECURSIVE_MARSHAL_WRITE_TRACE</span>
<a name="l02318"></a>02318 <span class="preprocessor"></span>  _dbus_verbose (<span class="stringliteral">"  type writer %p basic type_pos = %d value_pos = %d is_expectation = %d enabled = %d\n"</span>,
<a name="l02319"></a>02319                  writer, writer-&gt;type_pos, writer-&gt;value_pos, writer-&gt;type_pos_is_expectation,
<a name="l02320"></a>02320                  writer-&gt;enabled);
<a name="l02321"></a>02321 <span class="preprocessor">#endif</span>
<a name="l02322"></a>02322 <span class="preprocessor"></span>
<a name="l02323"></a>02323   <span class="keywordflow">return</span> retval;
<a name="l02324"></a>02324 }
<a name="l02325"></a>02325 
<a name="l02340"></a>02340 <a class="code" href="group__DBusTypes.html#g39c9cb0f3a2a8ad6f55cc4855d035349">dbus_bool_t</a>
<a name="l02341"></a><a class="code" href="group__DBusMarshal.html#gcf99495cbed7462992b6a231563b4528">02341</a> <a class="code" href="group__DBusMarshal.html#gcf99495cbed7462992b6a231563b4528">_dbus_type_writer_write_fixed_multi</a> (<a class="code" href="structDBusTypeWriter.html">DBusTypeWriter</a>        *writer,
<a name="l02342"></a>02342                                      <span class="keywordtype">int</span>                    element_type,
<a name="l02343"></a>02343                                      <span class="keyword">const</span> <span class="keywordtype">void</span>            *value,
<a name="l02344"></a>02344                                      <span class="keywordtype">int</span>                    n_elements)
<a name="l02345"></a>02345 {
<a name="l02346"></a>02346   <a class="code" href="group__DBusInternalsUtils.html#g129c6c03f011cdc171934d5d386cc797">_dbus_assert</a> (writer-&gt;<a class="code" href="structDBusTypeWriter.html#d0953035070c7c7d21b044b7b2f0f491">container_type</a> == <a class="code" href="group__DBusProtocol.html#g8912f600f81a773066ca03d9163613a9">DBUS_TYPE_ARRAY</a>);
<a name="l02347"></a>02347   <a class="code" href="group__DBusInternalsUtils.html#g129c6c03f011cdc171934d5d386cc797">_dbus_assert</a> (<a class="code" href="group__DBusSignature.html#g435ffc74ae015cc193175f5b864872bc">dbus_type_is_fixed</a> (element_type));
<a name="l02348"></a>02348   <a class="code" href="group__DBusInternalsUtils.html#g129c6c03f011cdc171934d5d386cc797">_dbus_assert</a> (writer-&gt;<a class="code" href="structDBusTypeWriter.html#e6db89e9a3adcd52678dc089810cfb0b">type_pos_is_expectation</a>);
<a name="l02349"></a>02349   <a class="code" href="group__DBusInternalsUtils.html#g129c6c03f011cdc171934d5d386cc797">_dbus_assert</a> (n_elements &gt;= 0);
<a name="l02350"></a>02350 
<a name="l02351"></a>02351 <span class="preprocessor">#if RECURSIVE_MARSHAL_WRITE_TRACE</span>
<a name="l02352"></a>02352 <span class="preprocessor"></span>  _dbus_verbose (<span class="stringliteral">"  type writer %p entering fixed multi type_pos = %d value_pos = %d n_elements %d\n"</span>,
<a name="l02353"></a>02353                  writer, writer-&gt;<a class="code" href="structDBusTypeWriter.html#77c19debc0427372f368cfe7188951f8">type_pos</a>, writer-&gt;<a class="code" href="structDBusTypeWriter.html#27c0475eedd90be65f90a799e5210947">value_pos</a>, n_elements);
<a name="l02354"></a>02354 <span class="preprocessor">#endif</span>
<a name="l02355"></a>02355 <span class="preprocessor"></span>
<a name="l02356"></a>02356   <span class="keywordflow">if</span> (!write_or_verify_typecode (writer, element_type))
<a name="l02357"></a>02357     <a class="code" href="group__DBusInternalsUtils.html#g0c4961ec784874f1b1f3aeccea8d3da1">_dbus_assert_not_reached</a> (<span class="stringliteral">"OOM should not happen if only verifying typecode"</span>);
<a name="l02358"></a>02358 
<a name="l02359"></a>02359   <span class="keywordflow">if</span> (writer-&gt;enabled)
<a name="l02360"></a>02360     {
<a name="l02361"></a>02361       <span class="keywordflow">if</span> (!<a class="code" href="group__DBusMarshal.html#g990da87b984d8917da26b89a6470fdf5">_dbus_marshal_write_fixed_multi</a> (writer-&gt;value_str,
<a name="l02362"></a>02362                                             writer-&gt;value_pos,
<a name="l02363"></a>02363                                             element_type,
<a name="l02364"></a>02364                                             value,
<a name="l02365"></a>02365                                             n_elements,
<a name="l02366"></a>02366                                             writer-&gt;byte_order,
<a name="l02367"></a>02367                                             &amp;writer-&gt;value_pos))
<a name="l02368"></a>02368         <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#ga93f0eb578d23995850d61f7d61c55c1">FALSE</a>;
<a name="l02369"></a>02369     }
<a name="l02370"></a>02370 
<a name="l02371"></a>02371 <span class="preprocessor">#if RECURSIVE_MARSHAL_WRITE_TRACE</span>
<a name="l02372"></a>02372 <span class="preprocessor"></span>  _dbus_verbose (<span class="stringliteral">"  type writer %p fixed multi written new type_pos = %d new value_pos = %d n_elements %d\n"</span>,
<a name="l02373"></a>02373                  writer, writer-&gt;type_pos, writer-&gt;value_pos, n_elements);
<a name="l02374"></a>02374 <span class="preprocessor">#endif</span>
<a name="l02375"></a>02375 <span class="preprocessor"></span>
<a name="l02376"></a>02376   <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#ga8cecfc5c5c054d2875c03e77b7be15d">TRUE</a>;
<a name="l02377"></a>02377 }
<a name="l02378"></a>02378 
<a name="l02379"></a>02379 <span class="keyword">static</span> <span class="keywordtype">void</span>
<a name="l02380"></a>02380 enable_if_after (<a class="code" href="structDBusTypeWriter.html">DBusTypeWriter</a>       *writer,
<a name="l02381"></a>02381                  <a class="code" href="structDBusTypeReader.html">DBusTypeReader</a>       *reader,
<a name="l02382"></a>02382                  <span class="keyword">const</span> <a class="code" href="structDBusTypeReader.html">DBusTypeReader</a> *start_after)
<a name="l02383"></a>02383 {
<a name="l02384"></a>02384   <span class="keywordflow">if</span> (start_after)
<a name="l02385"></a>02385     {
<a name="l02386"></a>02386       <span class="keywordflow">if</span> (!writer-&gt;<a class="code" href="structDBusTypeWriter.html#52c8617918c108d36b947cbdfc99c6ea">enabled</a> &amp;&amp; <a class="code" href="group__DBusMarshal.html#g229b3858f43ec56de852f62914cf3568">_dbus_type_reader_greater_than</a> (reader, start_after))
<a name="l02387"></a>02387         {
<a name="l02388"></a>02388           <a class="code" href="group__DBusMarshal.html#g44efb6d70d7f68fc7dd8523a303dfdb2">_dbus_type_writer_set_enabled</a> (writer, <a class="code" href="group__DBusMacros.html#ga8cecfc5c5c054d2875c03e77b7be15d">TRUE</a>);
<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">"ENABLING writer %p at %d because reader at value_pos %d is after reader at value_pos %d\n"</span>,
<a name="l02391"></a>02391                          writer, writer-&gt;<a class="code" href="structDBusTypeWriter.html#27c0475eedd90be65f90a799e5210947">value_pos</a>, reader-&gt;<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a>, start_after-&gt;<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a>);
<a name="l02392"></a>02392 <span class="preprocessor">#endif</span>
<a name="l02393"></a>02393 <span class="preprocessor"></span>        }
<a name="l02394"></a>02394 
<a name="l02395"></a>02395       <a class="code" href="group__DBusInternalsUtils.html#g129c6c03f011cdc171934d5d386cc797">_dbus_assert</a> ((!writer-&gt;<a class="code" href="structDBusTypeWriter.html#52c8617918c108d36b947cbdfc99c6ea">enabled</a> &amp;&amp; !<a class="code" href="group__DBusMarshal.html#g229b3858f43ec56de852f62914cf3568">_dbus_type_reader_greater_than</a> (reader, start_after)) ||
<a name="l02396"></a>02396                     (writer-&gt;<a class="code" href="structDBusTypeWriter.html#52c8617918c108d36b947cbdfc99c6ea">enabled</a> &amp;&amp; <a class="code" href="group__DBusMarshal.html#g229b3858f43ec56de852f62914cf3568">_dbus_type_reader_greater_than</a> (reader, start_after)));
<a name="l02397"></a>02397     }
<a name="l02398"></a>02398 }
<a name="l02399"></a>02399 
<a name="l02400"></a>02400 <span class="keyword">static</span> <a class="code" href="group__DBusTypes.html#g39c9cb0f3a2a8ad6f55cc4855d035349">dbus_bool_t</a>
<a name="l02401"></a>02401 append_fixup (<a class="code" href="structDBusList.html">DBusList</a>               **fixups,
<a name="l02402"></a>02402               <span class="keyword">const</span> <a class="code" href="structDBusArrayLenFixup.html">DBusArrayLenFixup</a> *fixup)
<a name="l02403"></a>02403 {
<a name="l02404"></a>02404   <a class="code" href="structDBusArrayLenFixup.html">DBusArrayLenFixup</a> *f;
<a name="l02405"></a>02405 
<a name="l02406"></a>02406   f = <a class="code" href="group__DBusMemory.html#g54ccb556e7964112a825a7f46c156ca0">dbus_new</a> (<a class="code" href="structDBusArrayLenFixup.html">DBusArrayLenFixup</a>, 1);
<a name="l02407"></a>02407   <span class="keywordflow">if</span> (f == <a class="code" href="group__DBusMacros.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>)
<a name="l02408"></a>02408     <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#ga93f0eb578d23995850d61f7d61c55c1">FALSE</a>;
<a name="l02409"></a>02409 
<a name="l02410"></a>02410   *f = *fixup;
<a name="l02411"></a>02411 
<a name="l02412"></a>02412   <span class="keywordflow">if</span> (!<a class="code" href="group__DBusList.html#gd99045e79db46159babe69718f343053">_dbus_list_append</a> (fixups, f))
<a name="l02413"></a>02413     {
<a name="l02414"></a>02414       <a class="code" href="group__DBusMemory.html#g488c6b08cc8c1ddf0203243c4b27a13c">dbus_free</a> (f);
<a name="l02415"></a>02415       <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#ga93f0eb578d23995850d61f7d61c55c1">FALSE</a>;
<a name="l02416"></a>02416     }
<a name="l02417"></a>02417 
<a name="l02418"></a>02418   <a class="code" href="group__DBusInternalsUtils.html#g129c6c03f011cdc171934d5d386cc797">_dbus_assert</a> (f-&gt;<a class="code" href="structDBusArrayLenFixup.html#ad03f6087695c9e9b409817ac34c6e2b">len_pos_in_reader</a> == fixup-&gt;<a class="code" href="structDBusArrayLenFixup.html#ad03f6087695c9e9b409817ac34c6e2b">len_pos_in_reader</a>);
<a name="l02419"></a>02419   <a class="code" href="group__DBusInternalsUtils.html#g129c6c03f011cdc171934d5d386cc797">_dbus_assert</a> (f-&gt;<a class="code" href="structDBusArrayLenFixup.html#97cccea61d89992e6ad3a19bd569dd2f">new_len</a> == fixup-&gt;<a class="code" href="structDBusArrayLenFixup.html#97cccea61d89992e6ad3a19bd569dd2f">new_len</a>);
<a name="l02420"></a>02420 
<a name="l02421"></a>02421   <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#ga8cecfc5c5c054d2875c03e77b7be15d">TRUE</a>;
<a name="l02422"></a>02422 }
<a name="l02423"></a>02423 
<a name="l02424"></a>02424 <span class="comment">/* This loop is trivial if you ignore all the start_after nonsense,</span>
<a name="l02425"></a>02425 <span class="comment"> * so if you're trying to figure it out, start by ignoring that</span>
<a name="l02426"></a>02426 <span class="comment"> */</span>
<a name="l02427"></a>02427 <span class="keyword">static</span> <a class="code" href="group__DBusTypes.html#g39c9cb0f3a2a8ad6f55cc4855d035349">dbus_bool_t</a>
<a name="l02428"></a>02428 writer_write_reader_helper (<a class="code" href="structDBusTypeWriter.html">DBusTypeWriter</a>       *writer,
<a name="l02429"></a>02429                             <a class="code" href="structDBusTypeReader.html">DBusTypeReader</a>       *reader,
<a name="l02430"></a>02430                             <span class="keyword">const</span> <a class="code" href="structDBusTypeReader.html">DBusTypeReader</a> *start_after,
<a name="l02431"></a>02431                             <span class="keywordtype">int</span>                   start_after_new_pos,
<a name="l02432"></a>02432                             <span class="keywordtype">int</span>                   start_after_new_len,
<a name="l02433"></a>02433                             <a class="code" href="structDBusList.html">DBusList</a>            **fixups,
<a name="l02434"></a>02434                             <a class="code" href="group__DBusTypes.html#g39c9cb0f3a2a8ad6f55cc4855d035349">dbus_bool_t</a>           inside_start_after)
<a name="l02435"></a>02435 {
<a name="l02436"></a>02436   <span class="keywordtype">int</span> current_type;
<a name="l02437"></a>02437 
<a name="l02438"></a>02438   <span class="keywordflow">while</span> ((current_type = <a class="code" href="group__DBusMarshal.html#gb8e39cb8084247d54d7f272c51622a73">_dbus_type_reader_get_current_type</a> (reader)) != <a class="code" href="group__DBusProtocol.html#ga9588da889743b2119dc6664712ae51e">DBUS_TYPE_INVALID</a>)
<a name="l02439"></a>02439     {
<a name="l02440"></a>02440       <span class="keywordflow">if</span> (<a class="code" href="group__DBusSignature.html#g6e71e0d4ab3d7e68d2b906f43475544b">dbus_type_is_container</a> (current_type))
<a name="l02441"></a>02441         {
<a name="l02442"></a>02442           <a class="code" href="structDBusTypeReader.html">DBusTypeReader</a> subreader;
<a name="l02443"></a>02443           <a class="code" href="structDBusTypeWriter.html">DBusTypeWriter</a> subwriter;
<a name="l02444"></a>02444           <span class="keyword">const</span> <a class="code" href="structDBusString.html">DBusString</a> *sig_str;
<a name="l02445"></a>02445           <span class="keywordtype">int</span> sig_start;
<a name="l02446"></a>02446           <span class="keywordtype">int</span> sig_len;
<a name="l02447"></a>02447           <a class="code" href="group__DBusTypes.html#g39c9cb0f3a2a8ad6f55cc4855d035349">dbus_bool_t</a> enabled_at_recurse;
<a name="l02448"></a>02448           <a class="code" href="group__DBusTypes.html#g39c9cb0f3a2a8ad6f55cc4855d035349">dbus_bool_t</a> past_start_after;
<a name="l02449"></a>02449           <span class="keywordtype">int</span> reader_array_len_pos;
<a name="l02450"></a>02450           <span class="keywordtype">int</span> reader_array_start_pos;
<a name="l02451"></a>02451           <a class="code" href="group__DBusTypes.html#g39c9cb0f3a2a8ad6f55cc4855d035349">dbus_bool_t</a> this_is_start_after;
<a name="l02452"></a>02452 
<a name="l02453"></a>02453           <span class="comment">/* type_pos is checked since e.g. in a struct the struct</span>
<a name="l02454"></a>02454 <span class="comment">           * and its first field have the same value_pos.</span>
<a name="l02455"></a>02455 <span class="comment">           * type_str will differ in reader/start_after for variants</span>
<a name="l02456"></a>02456 <span class="comment">           * where type_str is inside the value_str</span>
<a name="l02457"></a>02457 <span class="comment">           */</span>
<a name="l02458"></a>02458           <span class="keywordflow">if</span> (!inside_start_after &amp;&amp; start_after &amp;&amp;
<a name="l02459"></a>02459               reader-&gt;<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a> == start_after-&gt;<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a> &amp;&amp;
<a name="l02460"></a>02460               reader-&gt;type_str == start_after-&gt;<a class="code" href="structDBusTypeReader.html#f52e270ededd0aabb642c6130a3e9e40">type_str</a> &amp;&amp;
<a name="l02461"></a>02461               reader-&gt;type_pos == start_after-&gt;<a class="code" href="structDBusTypeReader.html#160a55f9869e297572c5aa5b6ce7bc71">type_pos</a>)
<a name="l02462"></a>02462             this_is_start_after = <a class="code" href="group__DBusMacros.html#ga8cecfc5c5c054d2875c03e77b7be15d">TRUE</a>;
<a name="l02463"></a>02463           <span class="keywordflow">else</span>
<a name="l02464"></a>02464             this_is_start_after = <a class="code" href="group__DBusMacros.html#ga93f0eb578d23995850d61f7d61c55c1">FALSE</a>;
<a name="l02465"></a>02465 
<a name="l02466"></a>02466           <a class="code" href="group__DBusMarshal.html#g082b410820c74b2a6ca816a8e0c91803">_dbus_type_reader_recurse</a> (reader, &amp;subreader);
<a name="l02467"></a>02467 
<a name="l02468"></a>02468           <span class="keywordflow">if</span> (current_type == <a class="code" href="group__DBusProtocol.html#g8912f600f81a773066ca03d9163613a9">DBUS_TYPE_ARRAY</a>)
<a name="l02469"></a>02469             {
<a name="l02470"></a>02470               reader_array_len_pos = <a class="code" href="group__DBusMarshal.html#gcca774d24b7d7e790b169f23d3362497">ARRAY_READER_LEN_POS</a> (&amp;subreader);
<a name="l02471"></a>02471               reader_array_start_pos = subreader.<a class="code" href="structDBusTypeReader.html#da12bed6758840dc19b1fcb271fb01be">u</a>.<a class="code" href="structDBusTypeReader.html#26fa4f3e09e18d2da90218e3e0acf81b">array</a>.start_pos;
<a name="l02472"></a>02472             }
<a name="l02473"></a>02473           <span class="keywordflow">else</span>
<a name="l02474"></a>02474             {
<a name="l02475"></a>02475               <span class="comment">/* quiet gcc */</span>
<a name="l02476"></a>02476               reader_array_len_pos = -1;
<a name="l02477"></a>02477               reader_array_start_pos = -1;
<a name="l02478"></a>02478             }
<a name="l02479"></a>02479 
<a name="l02480"></a>02480           <a class="code" href="group__DBusMarshal.html#g4578cc623c8b0978ca780ce0ab950fdb">_dbus_type_reader_get_signature</a> (&amp;subreader, &amp;sig_str,
<a name="l02481"></a>02481                                            &amp;sig_start, &amp;sig_len);
<a name="l02482"></a>02482 
<a name="l02483"></a>02483 <span class="preprocessor">#if RECURSIVE_MARSHAL_WRITE_TRACE</span>
<a name="l02484"></a>02484 <span class="preprocessor"></span>          _dbus_verbose (<span class="stringliteral">"about to recurse into %s reader at %d subreader at %d writer at %d start_after reader at %d write target len %d inside_start_after = %d this_is_start_after = %d\n"</span>,
<a name="l02485"></a>02485                          <a class="code" href="group__DBusMarshal.html#g48a595c2b26dce6e9c25ce040e5247e5">_dbus_type_to_string</a> (current_type),
<a name="l02486"></a>02486                          reader-&gt;value_pos,
<a name="l02487"></a>02487                          subreader.<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a>,
<a name="l02488"></a>02488                          writer-&gt;<a class="code" href="structDBusTypeWriter.html#27c0475eedd90be65f90a799e5210947">value_pos</a>,
<a name="l02489"></a>02489                          start_after ? start_after-&gt;<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a> : -1,
<a name="l02490"></a>02490                          _dbus_string_get_length (writer-&gt;<a class="code" href="structDBusTypeWriter.html#a4e4b3af31fd7a93d0e54d10882bcc07">value_str</a>),
<a name="l02491"></a>02491                          inside_start_after, this_is_start_after);
<a name="l02492"></a>02492 <span class="preprocessor">#endif</span>
<a name="l02493"></a>02493 <span class="preprocessor"></span>
<a name="l02494"></a>02494           <span class="keywordflow">if</span> (!inside_start_after &amp;&amp; !this_is_start_after)
<a name="l02495"></a>02495             enable_if_after (writer, &amp;subreader, start_after);
<a name="l02496"></a>02496           enabled_at_recurse = writer-&gt;<a class="code" href="structDBusTypeWriter.html#52c8617918c108d36b947cbdfc99c6ea">enabled</a>;
<a name="l02497"></a>02497           <span class="keywordflow">if</span> (!_dbus_type_writer_recurse_contained_len (writer, current_type,
<a name="l02498"></a>02498                                                         sig_str, sig_start, sig_len,
<a name="l02499"></a>02499                                                         &amp;subwriter, <a class="code" href="group__DBusMacros.html#ga93f0eb578d23995850d61f7d61c55c1">FALSE</a>))
<a name="l02500"></a>02500             <span class="keywordflow">goto</span> oom;
<a name="l02501"></a>02501 
<a name="l02502"></a>02502 <span class="preprocessor">#if RECURSIVE_MARSHAL_WRITE_TRACE</span>
<a name="l02503"></a>02503 <span class="preprocessor"></span>          _dbus_verbose (<span class="stringliteral">"recursed into subwriter at %d write target len %d\n"</span>,
<a name="l02504"></a>02504                          subwriter.<a class="code" href="structDBusTypeWriter.html#27c0475eedd90be65f90a799e5210947">value_pos</a>,
<a name="l02505"></a>02505                          _dbus_string_get_length (subwriter.<a class="code" href="structDBusTypeWriter.html#a4e4b3af31fd7a93d0e54d10882bcc07">value_str</a>));
<a name="l02506"></a>02506 <span class="preprocessor">#endif</span>
<a name="l02507"></a>02507 <span class="preprocessor"></span>
<a name="l02508"></a>02508           <span class="keywordflow">if</span> (!writer_write_reader_helper (&amp;subwriter, &amp;subreader, start_after,
<a name="l02509"></a>02509                                            start_after_new_pos, start_after_new_len,
<a name="l02510"></a>02510                                            fixups,
<a name="l02511"></a>02511                                            inside_start_after ||
<a name="l02512"></a>02512                                            this_is_start_after))
<a name="l02513"></a>02513             <span class="keywordflow">goto</span> oom;
<a name="l02514"></a>02514 
<a name="l02515"></a>02515 <span class="preprocessor">#if RECURSIVE_MARSHAL_WRITE_TRACE</span>
<a name="l02516"></a>02516 <span class="preprocessor"></span>          _dbus_verbose (<span class="stringliteral">"about to unrecurse from %s subreader at %d writer at %d subwriter at %d  write target len %d\n"</span>,
<a name="l02517"></a>02517                          <a class="code" href="group__DBusMarshal.html#g48a595c2b26dce6e9c25ce040e5247e5">_dbus_type_to_string</a> (current_type),
<a name="l02518"></a>02518                          subreader.<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a>,
<a name="l02519"></a>02519                          writer-&gt;value_pos,
<a name="l02520"></a>02520                          subwriter.value_pos,
<a name="l02521"></a>02521                          _dbus_string_get_length (writer-&gt;value_str));
<a name="l02522"></a>02522 <span class="preprocessor">#endif</span>
<a name="l02523"></a>02523 <span class="preprocessor"></span>
<a name="l02524"></a>02524           <span class="keywordflow">if</span> (!inside_start_after &amp;&amp; !this_is_start_after)
<a name="l02525"></a>02525             enable_if_after (writer, &amp;subreader, start_after);
<a name="l02526"></a>02526           past_start_after = writer-&gt;enabled;
<a name="l02527"></a>02527           <span class="keywordflow">if</span> (!<a class="code" href="group__DBusMarshal.html#gcbe7eddf4f9c19da91b742087fcc111a">_dbus_type_writer_unrecurse</a> (writer, &amp;subwriter))
<a name="l02528"></a>02528             <span class="keywordflow">goto</span> oom;
<a name="l02529"></a>02529 
<a name="l02530"></a>02530           <span class="comment">/* If we weren't enabled when we recursed, we didn't</span>
<a name="l02531"></a>02531 <span class="comment">           * write an array len; if we passed start_after</span>
<a name="l02532"></a>02532 <span class="comment">           * somewhere inside the array, then we need to generate</span>
<a name="l02533"></a>02533 <span class="comment">           * a fixup.</span>
<a name="l02534"></a>02534 <span class="comment">           */</span>
<a name="l02535"></a>02535           <span class="keywordflow">if</span> (start_after != <a class="code" href="group__DBusMacros.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a> &amp;&amp;
<a name="l02536"></a>02536               !enabled_at_recurse &amp;&amp; past_start_after &amp;&amp;
<a name="l02537"></a>02537               current_type == <a class="code" href="group__DBusProtocol.html#g8912f600f81a773066ca03d9163613a9">DBUS_TYPE_ARRAY</a> &amp;&amp;
<a name="l02538"></a>02538               fixups != <a class="code" href="group__DBusMacros.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>)
<a name="l02539"></a>02539             {
<a name="l02540"></a>02540               <a class="code" href="structDBusArrayLenFixup.html">DBusArrayLenFixup</a> fixup;
<a name="l02541"></a>02541               <span class="keywordtype">int</span> bytes_written_after_start_after;
<a name="l02542"></a>02542               <span class="keywordtype">int</span> bytes_before_start_after;
<a name="l02543"></a>02543               <span class="keywordtype">int</span> old_len;
<a name="l02544"></a>02544 
<a name="l02545"></a>02545               <span class="comment">/* this subwriter access is moderately unkosher since we</span>
<a name="l02546"></a>02546 <span class="comment">               * already unrecursed, but it works as long as unrecurse</span>
<a name="l02547"></a>02547 <span class="comment">               * doesn't break us on purpose</span>
<a name="l02548"></a>02548 <span class="comment">               */</span>
<a name="l02549"></a>02549               bytes_written_after_start_after = writer_get_array_len (&amp;subwriter);
<a name="l02550"></a>02550 
<a name="l02551"></a>02551               bytes_before_start_after =
<a name="l02552"></a>02552                 start_after-&gt;<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a> - reader_array_start_pos;
<a name="l02553"></a>02553 
<a name="l02554"></a>02554               fixup.<a class="code" href="structDBusArrayLenFixup.html#ad03f6087695c9e9b409817ac34c6e2b">len_pos_in_reader</a> = reader_array_len_pos;
<a name="l02555"></a>02555               fixup.<a class="code" href="structDBusArrayLenFixup.html#97cccea61d89992e6ad3a19bd569dd2f">new_len</a> =
<a name="l02556"></a>02556                 bytes_before_start_after +
<a name="l02557"></a>02557                 start_after_new_len +
<a name="l02558"></a>02558                 bytes_written_after_start_after;
<a name="l02559"></a>02559 
<a name="l02560"></a>02560               <a class="code" href="group__DBusInternalsUtils.html#g129c6c03f011cdc171934d5d386cc797">_dbus_assert</a> (_DBUS_ALIGN_VALUE (fixup.<a class="code" href="structDBusArrayLenFixup.html#ad03f6087695c9e9b409817ac34c6e2b">len_pos_in_reader</a>, 4) ==
<a name="l02561"></a>02561                             (<span class="keywordtype">unsigned</span>) fixup.<a class="code" href="structDBusArrayLenFixup.html#ad03f6087695c9e9b409817ac34c6e2b">len_pos_in_reader</a>);
<a name="l02562"></a>02562 
<a name="l02563"></a>02563               old_len = _dbus_unpack_uint32 (reader-&gt;byte_order,
<a name="l02564"></a>02564                                              _dbus_string_get_const_data_len (reader-&gt;value_str,
<a name="l02565"></a>02565                                                                               fixup.<a class="code" href="structDBusArrayLenFixup.html#ad03f6087695c9e9b409817ac34c6e2b">len_pos_in_reader</a>, 4));
<a name="l02566"></a>02566 
<a name="l02567"></a>02567               <span class="keywordflow">if</span> (old_len != fixup.<a class="code" href="structDBusArrayLenFixup.html#97cccea61d89992e6ad3a19bd569dd2f">new_len</a> &amp;&amp; !append_fixup (fixups, &amp;fixup))
<a name="l02568"></a>02568                 <span class="keywordflow">goto</span> oom;
<a name="l02569"></a>02569 
<a name="l02570"></a>02570 <span class="preprocessor">#if RECURSIVE_MARSHAL_WRITE_TRACE</span>
<a name="l02571"></a>02571 <span class="preprocessor"></span>              _dbus_verbose (<span class="stringliteral">"Generated fixup len_pos_in_reader = %d new_len = %d reader_array_start_pos = %d start_after-&gt;value_pos = %d bytes_before_start_after = %d start_after_new_len = %d bytes_written_after_start_after = %d\n"</span>,
<a name="l02572"></a>02572                              fixup.<a class="code" href="structDBusArrayLenFixup.html#ad03f6087695c9e9b409817ac34c6e2b">len_pos_in_reader</a>,
<a name="l02573"></a>02573                              fixup.<a class="code" href="structDBusArrayLenFixup.html#97cccea61d89992e6ad3a19bd569dd2f">new_len</a>,
<a name="l02574"></a>02574                              reader_array_start_pos,
<a name="l02575"></a>02575                              start_after-&gt;<a class="code" href="structDBusTypeReader.html#c17280869573f060a945a43e4a5c3ca4">value_pos</a>,
<a name="l02576"></a>02576                              bytes_before_start_after,
<a name="l02577"></a>02577                              start_after_new_len,
<a name="l02578"></a>02578                              bytes_written_after_start_after);
<a name="l02579"></a>02579 <span class="preprocessor">#endif</span>
<a name="l02580"></a>02580 <span class="preprocessor"></span>            }
<a name="l02581"></a>02581         }
<a name="l02582"></a>02582       <span class="keywordflow">else</span>
<a name="l02583"></a>02583         {
<a name="l02584"></a>02584           <a class="code" href="unionDBusBasicValue.html">DBusBasicValue</a> val;
<a name="l02585"></a>02585 
<a name="l02586"></a>02586           <a class="code" href="group__DBusInternalsUtils.html#g129c6c03f011cdc171934d5d386cc797">_dbus_assert</a> (<a class="code" href="group__DBusSignature.html#g2d8d39cba08f450645a17651478a0ad4">dbus_type_is_basic</a> (current_type));
<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">"Reading basic value %s at %d\n"</span>,
<a name="l02590"></a>02590                          <a class="code" href="group__DBusMarshal.html#g48a595c2b26dce6e9c25ce040e5247e5">_dbus_type_to_string</a> (current_type),
<a name="l02591"></a>02591                          reader-&gt;value_pos);
<a name="l02592"></a>02592 <span class="preprocessor">#endif</span>
<a name="l02593"></a>02593 <span class="preprocessor"></span>
<a name="l02594"></a>02594           <a class="code" href="group__DBusMarshal.html#ga54355ee98d6721d7a29b5ae7d92eb9a">_dbus_type_reader_read_basic</a> (reader, &amp;val);
<a name="l02595"></a>02595 
<a name="l02596"></a>02596 <span class="preprocessor">#if RECURSIVE_MARSHAL_WRITE_TRACE</span>
<a name="l02597"></a>02597 <span class="preprocessor"></span>          _dbus_verbose (<span class="stringliteral">"Writing basic value %s at %d write target len %d inside_start_after = %d\n"</span>,
<a name="l02598"></a>02598                          <a class="code" href="group__DBusMarshal.html#g48a595c2b26dce6e9c25ce040e5247e5">_dbus_type_to_string</a> (current_type),
<a name="l02599"></a>02599                          writer-&gt;value_pos,
<a name="l02600"></a>02600                          _dbus_string_get_length (writer-&gt;value_str),
<a name="l02601"></a>02601                          inside_start_after);
<a name="l02602"></a>02602 <span class="preprocessor">#endif</span>
<a name="l02603"></a>02603 <span class="preprocessor"></span>          <span class="keywordflow">if</span> (!inside_start_after)
<a name="l02604"></a>02604             enable_if_after (writer, reader, start_after);
<a name="l02605"></a>02605           <span class="keywordflow">if</span> (!<a class="code" href="group__DBusMarshal.html#g0103b0214766b0ff1ca05bcc7f1e631b">_dbus_type_writer_write_basic</a> (writer, current_type, &amp;val))
<a name="l02606"></a>02606             <span class="keywordflow">goto</span> oom;
<a name="l02607"></a>02607 <span class="preprocessor">#if RECURSIVE_MARSHAL_WRITE_TRACE</span>
<a name="l02608"></a>02608 <span class="preprocessor"></span>          _dbus_verbose (<span class="stringliteral">"Wrote basic value %s, new value_pos %d write target len %d\n"</span>,
<a name="l02609"></a>02609                          <a class="code" href="group__DBusMarshal.html#g48a595c2b26dce6e9c25ce040e5247e5">_dbus_type_to_string</a> (current_type),
<a name="l02610"></a>02610                          writer-&gt;value_pos,
<a name="l02611"></a>02611                          _dbus_string_get_length (writer-&gt;value_str));
<a name="l02612"></a>02612 <span class="preprocessor">#endif</span>
<a name="l02613"></a>02613 <span class="preprocessor"></span>        }
<a name="l02614"></a>02614 
<a name="l02615"></a>02615       <a class="code" href="group__DBusMarshal.html#g746c09512d4905f2d2fac7ed4c3c63c2">_dbus_type_reader_next</a> (reader);
<a name="l02616"></a>02616     }
<a name="l02617"></a>02617 
<a name="l02618"></a>02618   <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#ga8cecfc5c5c054d2875c03e77b7be15d">TRUE</a>;
<a name="l02619"></a>02619 
<a name="l02620"></a>02620  oom:
<a name="l02621"></a>02621   <span class="keywordflow">if</span> (fixups)
<a name="l02622"></a>02622     apply_and_free_fixups (fixups, <a class="code" href="group__DBusMacros.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>); <span class="comment">/* NULL for reader to apply to */</span>
<a name="l02623"></a>02623 
<a name="l02624"></a>02624   <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#ga93f0eb578d23995850d61f7d61c55c1">FALSE</a>;
<a name="l02625"></a>02625 }
<a name="l02626"></a>02626 
<a name="l02658"></a>02658 <a class="code" href="group__DBusTypes.html#g39c9cb0f3a2a8ad6f55cc4855d035349">dbus_bool_t</a>
<a name="l02659"></a><a class="code" href="group__DBusMarshal.html#g004da084963a3a74589b28611b9d8398">02659</a> <a class="code" href="group__DBusMarshal.html#g004da084963a3a74589b28611b9d8398">_dbus_type_writer_write_reader_partial</a> (<a class="code" href="structDBusTypeWriter.html">DBusTypeWriter</a>       *writer,
<a name="l02660"></a>02660                                         <a class="code" href="structDBusTypeReader.html">DBusTypeReader</a>       *reader,
<a name="l02661"></a>02661                                         <span class="keyword">const</span> <a class="code" href="structDBusTypeReader.html">DBusTypeReader</a> *start_after,
<a name="l02662"></a>02662                                         <span class="keywordtype">int</span>                   start_after_new_pos,
<a name="l02663"></a>02663                                         <span class="keywordtype">int</span>                   start_after_new_len,
<a name="l02664"></a>02664                                         <a class="code" href="structDBusList.html">DBusList</a>            **fixups)
<a name="l02665"></a>02665 {
<a name="l02666"></a>02666   <a class="code" href="structDBusTypeWriter.html">DBusTypeWriter</a> orig;
<a name="l02667"></a>02667   <span class="keywordtype">int</span> orig_type_len;
<a name="l02668"></a>02668   <span class="keywordtype">int</span> orig_value_len;
<a name="l02669"></a>02669   <span class="keywordtype">int</span> new_bytes;
<a name="l02670"></a>02670   <span class="keywordtype">int</span> orig_enabled;
<a name="l02671"></a>02671 
<a name="l02672"></a>02672   orig = *writer;
<a name="l02673"></a>02673   orig_type_len = _dbus_string_get_length (writer-&gt;<a class="code" href="structDBusTypeWriter.html#95204ef3a9cf29ee31687032b142b836">type_str</a>);
<a name="l02674"></a>02674   orig_value_len = _dbus_string_get_length (writer-&gt;<a class="code" href="structDBusTypeWriter.html#a4e4b3af31fd7a93d0e54d10882bcc07">value_str</a>);
<a name="l02675"></a>02675   orig_enabled = writer-&gt;<a class="code" href="structDBusTypeWriter.html#52c8617918c108d36b947cbdfc99c6ea">enabled</a>;
<a name="l02676"></a>02676 
<a name="l02677"></a>02677   <span class="keywordflow">if</span> (start_after)
<a name="l02678"></a>02678     <a class="code" href="group__DBusMarshal.html#g44efb6d70d7f68fc7dd8523a303dfdb2">_dbus_type_writer_set_enabled</a> (writer, <a class="code" href="group__DBusMacros.html#ga93f0eb578d23995850d61f7d61c55c1">FALSE</a>);
<a name="l02679"></a>02679 
<a name="l02680"></a>02680   <span class="keywordflow">if</span> (!writer_write_reader_helper (writer, reader, start_after,
<a name="l02681"></a>02681                                    start_after_new_pos,
<a name="l02682"></a>02682                                    start_after_new_len,
<a name="l02683"></a>02683                                    fixups, <a class="code" href="group__DBusMacros.html#ga93f0eb578d23995850d61f7d61c55c1">FALSE</a>))
<a name="l02684"></a>02684     <span class="keywordflow">goto</span> oom;
<a name="l02685"></a>02685 
<a name="l02686"></a>02686   <a class="code" href="group__DBusMarshal.html#g44efb6d70d7f68fc7dd8523a303dfdb2">_dbus_type_writer_set_enabled</a> (writer, orig_enabled);
<a name="l02687"></a>02687   <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#ga8cecfc5c5c054d2875c03e77b7be15d">TRUE</a>;
<a name="l02688"></a>02688 
<a name="l02689"></a>02689  oom:
<a name="l02690"></a>02690   <span class="keywordflow">if</span> (!writer-&gt;type_pos_is_expectation)
<a name="l02691"></a>02691     {
<a name="l02692"></a>02692       new_bytes = _dbus_string_get_length (writer-&gt;type_str) - orig_type_len;
<a name="l02693"></a>02693       <a class="code" href="group__DBusString.html#g7e0e164ad5bb094e5ccad9edc7ae4235">_dbus_string_delete</a> (writer-&gt;type_str, orig.<a class="code" href="structDBusTypeWriter.html#77c19debc0427372f368cfe7188951f8">type_pos</a>, new_bytes);
<a name="l02694"></a>02694     }
<a name="l02695"></a>02695   new_bytes = _dbus_string_get_length (writer-&gt;value_str) - orig_value_len;
<a name="l02696"></a>02696   <a class="code" href="group__DBusString.html#g7e0e164ad5bb094e5ccad9edc7ae4235">_dbus_string_delete</a> (writer-&gt;value_str, orig.<a class="code" href="structDBusTypeWriter.html#27c0475eedd90be65f90a799e5210947">value_pos</a>, new_bytes);
<a name="l02697"></a>02697 
<a name="l02698"></a>02698   *writer = orig;
<a name="l02699"></a>02699 
<a name="l02700"></a>02700   <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#ga93f0eb578d23995850d61f7d61c55c1">FALSE</a>;
<a name="l02701"></a>02701 }
<a name="l02702"></a>02702 
<a name="l02712"></a>02712 <a class="code" href="group__DBusTypes.html#g39c9cb0f3a2a8ad6f55cc4855d035349">dbus_bool_t</a>
<a name="l02713"></a><a class="code" href="group__DBusMarshal.html#g4905750705d220efe9dfc71f49bedc11">02713</a> <a class="code" href="group__DBusMarshal.html#g4905750705d220efe9dfc71f49bedc11">_dbus_type_writer_write_reader</a> (<a class="code" href="structDBusTypeWriter.html">DBusTypeWriter</a>       *writer,
<a name="l02714"></a>02714                                 <a class="code" href="structDBusTypeReader.html">DBusTypeReader</a>       *reader)
<a name="l02715"></a>02715 {
<a name="l02716"></a>02716   <span class="keywordflow">return</span> <a class="code" href="group__DBusMarshal.html#g004da084963a3a74589b28611b9d8398">_dbus_type_writer_write_reader_partial</a> (writer, reader, <a class="code" href="group__DBusMacros.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>, 0, 0, <a class="code" href="group__DBusMacros.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>);
<a name="l02717"></a>02717 }
<a name="l02718"></a>02718 
<a name="l02728"></a>02728 <span class="keywordtype">void</span>
<a name="l02729"></a><a class="code" href="group__DBusMarshal.html#g44efb6d70d7f68fc7dd8523a303dfdb2">02729</a> <a class="code" href="group__DBusMarshal.html#g44efb6d70d7f68fc7dd8523a303dfdb2">_dbus_type_writer_set_enabled</a> (<a class="code" href="structDBusTypeWriter.html">DBusTypeWriter</a>   *writer,
<a name="l02730"></a>02730                                <a class="code" href="group__DBusTypes.html#g39c9cb0f3a2a8ad6f55cc4855d035349">dbus_bool_t</a>       enabled)
<a name="l02731"></a>02731 {
<a name="l02732"></a>02732   writer-&gt;<a class="code" href="structDBusTypeWriter.html#52c8617918c108d36b947cbdfc99c6ea">enabled</a> = enabled != <a class="code" href="group__DBusMacros.html#ga93f0eb578d23995850d61f7d61c55c1">FALSE</a>;
<a name="l02733"></a>02733 }
<a name="l02734"></a>02734  <span class="comment">/* end of DBusMarshal group */</span>
<a name="l02736"></a>02736 
<a name="l02737"></a>02737 <span class="comment">/* tests in dbus-marshal-recursive-util.c */</span>
</pre></div><hr size="1"><address style="align: right;"><small>Generated on Mon Dec 14 22:26:11 2009 for D-Bus by&nbsp;
<a href="http://www.doxygen.org/index.html">
<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.7 </small></address>
</body>
</html>

Anon7 - 2021