Sophie

Sophie

distrib > Mandriva > 2007.0 > x86_64 > media > main-release > by-pkgid > 926d2d1e3111287cee1b0a4fad4fb4f6 > files > 106

lib64dbus-1_3-devel-0.92-6mdv2007.0.x86_64.rpm

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
<title>dbus-message.c Source File</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
</head><body>
<!-- Generated by Doxygen 1.2.15 -->
<center>
<a class="qindex" href="index.html">Main Page</a> &nbsp; <a class="qindex" href="modules.html">Modules</a> &nbsp; <a class="qindex" href="annotated.html">Data Structures</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Data Fields</a> &nbsp; <a class="qindex" href="pages.html">Related Pages</a> &nbsp; </center>
<hr><h1>dbus-message.c</h1><div class="fragment"><pre>00001 <font class="comment">/* -*- mode: C; c-file-style: "gnu" -*- */</font>
00002 <font class="comment">/* dbus-message.c  DBusMessage object</font>
00003 <font class="comment"> *</font>
00004 <font class="comment"> * Copyright (C) 2002, 2003, 2004  Red Hat Inc.</font>
00005 <font class="comment"> * Copyright (C) 2002, 2003  CodeFactory AB</font>
00006 <font class="comment"> *</font>
00007 <font class="comment"> * Licensed under the Academic Free License version 2.0</font>
00008 <font class="comment"> * </font>
00009 <font class="comment"> * This program is free software; you can redistribute it and/or modify</font>
00010 <font class="comment"> * it under the terms of the GNU General Public License as published by</font>
00011 <font class="comment"> * the Free Software Foundation; either version 2 of the License, or</font>
00012 <font class="comment"> * (at your option) any later version.</font>
00013 <font class="comment"> *</font>
00014 <font class="comment"> * This program is distributed in the hope that it will be useful,</font>
00015 <font class="comment"> * but WITHOUT ANY WARRANTY; without even the implied warranty of</font>
00016 <font class="comment"> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</font>
00017 <font class="comment"> * GNU General Public License for more details.</font>
00018 <font class="comment"> * </font>
00019 <font class="comment"> * You should have received a copy of the GNU General Public License</font>
00020 <font class="comment"> * along with this program; if not, write to the Free Software</font>
00021 <font class="comment"> * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA</font>
00022 <font class="comment"> *</font>
00023 <font class="comment"> */</font>
00024 
00025 <font class="preprocessor">#include "dbus-internals.h"</font>
00026 <font class="preprocessor">#include "dbus-marshal.h"</font>
00027 <font class="preprocessor">#include "dbus-message.h"</font>
00028 <font class="preprocessor">#include "dbus-message-internal.h"</font>
00029 <font class="preprocessor">#include "dbus-memory.h"</font>
00030 <font class="preprocessor">#include "dbus-list.h"</font>
00031 <font class="preprocessor">#include "dbus-message-builder.h"</font>
00032 <font class="preprocessor">#include "dbus-dataslot.h"</font>
00033 <font class="preprocessor">#include &lt;string.h&gt;</font>
00034 
<a name="l00048"></a><a class="code" href="structHeaderField.html">00048</a> <font class="keyword">typedef</font> <font class="keyword">struct</font>
00049 <font class="keyword"></font>{
<a name="l00050"></a><a class="code" href="structHeaderField.html#m0">00050</a>   <font class="keywordtype">int</font> name_offset;  
<a name="l00051"></a><a class="code" href="structHeaderField.html#m1">00051</a>   <font class="keywordtype">int</font> value_offset; 
00052 } <a class="code" href="structHeaderField.html">HeaderField</a>;
00053 
<a name="l00055"></a><a class="code" href="group__DBusMessageInternals.html#a53">00055</a> <font class="preprocessor">#define BYTE_ORDER_OFFSET    0</font>
00056 <font class="preprocessor"></font>
<a name="l00057"></a><a class="code" href="group__DBusMessageInternals.html#a54">00057</a> <font class="preprocessor">#define TYPE_OFFSET          1</font>
00058 <font class="preprocessor"></font>
<a name="l00059"></a><a class="code" href="group__DBusMessageInternals.html#a55">00059</a> <font class="preprocessor">#define FLAGS_OFFSET         2</font>
00060 <font class="preprocessor"></font>
<a name="l00061"></a><a class="code" href="group__DBusMessageInternals.html#a56">00061</a> <font class="preprocessor">#define VERSION_OFFSET       3</font>
00062 <font class="preprocessor"></font>
<a name="l00063"></a><a class="code" href="group__DBusMessageInternals.html#a57">00063</a> <font class="preprocessor">#define HEADER_LENGTH_OFFSET 4</font>
00064 <font class="preprocessor"></font>
<a name="l00065"></a><a class="code" href="group__DBusMessageInternals.html#a58">00065</a> <font class="preprocessor">#define BODY_LENGTH_OFFSET   8</font>
00066 <font class="preprocessor"></font>
<a name="l00067"></a><a class="code" href="group__DBusMessageInternals.html#a59">00067</a> <font class="preprocessor">#define CLIENT_SERIAL_OFFSET 12</font>
00068 <font class="preprocessor"></font>
00069 
<a name="l00077"></a><a class="code" href="structDBusMessage.html">00077</a> <font class="keyword">struct </font><a class="code" href="structDBusMessage.html">DBusMessage</a>
00078 {
<a name="l00079"></a><a class="code" href="structDBusMessage.html#m0">00079</a>   <a class="code" href="structDBusAtomic.html">DBusAtomic</a> <a class="code" href="structDBusMessage.html#m0">refcount</a>; 
<a name="l00081"></a><a class="code" href="structDBusMessage.html#m1">00081</a>   <a class="code" href="structDBusString.html">DBusString</a> <a class="code" href="structDBusMessage.html#m1">header</a>; 
<a name="l00086"></a><a class="code" href="structDBusMessage.html#m2">00086</a>   <a class="code" href="structHeaderField.html">HeaderField</a> <a class="code" href="structDBusMessage.html#m2">header_fields</a>[DBUS_HEADER_FIELD_LAST + 1]; 
<a name="l00090"></a><a class="code" href="structDBusMessage.html#m3">00090</a>   dbus_uint32_t <a class="code" href="structDBusMessage.html#m3">client_serial</a>; 
<a name="l00091"></a><a class="code" href="structDBusMessage.html#m4">00091</a>   dbus_uint32_t <a class="code" href="structDBusMessage.html#m4">reply_serial</a>;  
<a name="l00093"></a><a class="code" href="structDBusMessage.html#m5">00093</a>   <font class="keywordtype">int</font> <a class="code" href="structDBusMessage.html#m5">header_padding</a>; 
<a name="l00095"></a><a class="code" href="structDBusMessage.html#m6">00095</a>   <a class="code" href="structDBusString.html">DBusString</a> <a class="code" href="structDBusMessage.html#m6">body</a>;   
<a name="l00097"></a><a class="code" href="structDBusMessage.html#m7">00097</a>   <font class="keywordtype">char</font> <a class="code" href="structDBusMessage.html#m7">byte_order</a>; 
<a name="l00099"></a><a class="code" href="structDBusMessage.html#m8">00099</a>   <a class="code" href="structDBusList.html">DBusList</a> *<a class="code" href="structDBusMessage.html#m8">size_counters</a>;   
<a name="l00100"></a><a class="code" href="structDBusMessage.html#m9">00100</a>   <font class="keywordtype">long</font> <a class="code" href="structDBusMessage.html#m9">size_counter_delta</a>;   
<a name="l00102"></a><a class="code" href="structDBusMessage.html#m10">00102</a>   dbus_uint32_t <a class="code" href="structDBusMessage.html#m10">changed_stamp</a>; 
<a name="l00104"></a><a class="code" href="structDBusMessage.html#m11">00104</a>   <font class="keywordtype">unsigned</font> <font class="keywordtype">int</font> <a class="code" href="structDBusMessage.html#m11">locked</a> : 1; 
<a name="l00106"></a><a class="code" href="structDBusMessage.html#m12">00106</a>   <a class="code" href="structDBusDataSlotList.html">DBusDataSlotList</a> <a class="code" href="structDBusMessage.html#m12">slot_list</a>;   
00107 };
00108 
00109 <font class="keyword">enum</font> {
00110   DBUS_MESSAGE_ITER_TYPE_MESSAGE,
00111   DBUS_MESSAGE_ITER_TYPE_ARRAY,
00112   DBUS_MESSAGE_ITER_TYPE_DICT
00113 };
00114 
<a name="l00116"></a><a class="code" href="group__DBusMessageInternals.html#a0">00116</a> <font class="keyword">typedef</font> <font class="keyword">struct </font><a class="code" href="structDBusMessageRealIter.html">DBusMessageRealIter</a> DBusMessageRealIter;
00117 
<a name="l00123"></a><a class="code" href="structDBusMessageRealIter.html">00123</a> <font class="keyword">struct </font>DBusMessageRealIter
00124 {
<a name="l00125"></a><a class="code" href="structDBusMessageRealIter.html#m0">00125</a>   DBusMessageRealIter *<a class="code" href="structDBusMessageRealIter.html#m0">parent_iter</a>; 
<a name="l00126"></a><a class="code" href="structDBusMessageRealIter.html#m1">00126</a>   <a class="code" href="structDBusMessage.html">DBusMessage</a> *<a class="code" href="structDBusMessageRealIter.html#m1">message</a>; 
<a name="l00127"></a><a class="code" href="structDBusMessageRealIter.html#m2">00127</a>   dbus_uint32_t <a class="code" href="structDBusMessageRealIter.html#m2">changed_stamp</a>; 
00129   <font class="comment">/* This is an int instead of an enum to get a guaranteed size for the dummy: */</font>
<a name="l00130"></a><a class="code" href="structDBusMessageRealIter.html#m3">00130</a>   <font class="keywordtype">int</font> <a class="code" href="structDBusMessageRealIter.html#m3">type</a>; 
<a name="l00132"></a><a class="code" href="structDBusMessageRealIter.html#m4">00132</a>   <font class="keywordtype">int</font> <a class="code" href="structDBusMessageRealIter.html#m4">pos</a>; 
<a name="l00133"></a><a class="code" href="structDBusMessageRealIter.html#m5">00133</a>   <font class="keywordtype">int</font> <a class="code" href="structDBusMessageRealIter.html#m5">end</a>; 
<a name="l00134"></a><a class="code" href="structDBusMessageRealIter.html#m6">00134</a>   <font class="keywordtype">int</font> <a class="code" href="structDBusMessageRealIter.html#m6">container_start</a>; 
<a name="l00135"></a><a class="code" href="structDBusMessageRealIter.html#m7">00135</a>   <font class="keywordtype">int</font> <a class="code" href="structDBusMessageRealIter.html#m7">container_length_pos</a>; 
<a name="l00137"></a><a class="code" href="structDBusMessageRealIter.html#m8">00137</a>   <font class="keywordtype">int</font> <a class="code" href="structDBusMessageRealIter.html#m8">wrote_dict_key</a>; 
<a name="l00139"></a><a class="code" href="structDBusMessageRealIter.html#m9">00139</a>   <font class="keywordtype">int</font> <a class="code" href="structDBusMessageRealIter.html#m9">array_type_pos</a>; 
<a name="l00140"></a><a class="code" href="structDBusMessageRealIter.html#m10">00140</a>   <font class="keywordtype">int</font> <a class="code" href="structDBusMessageRealIter.html#m10">array_type_done</a>; 
00141 };
00142 
00153 <font class="keywordtype">void</font>
<a name="l00154"></a><a class="code" href="group__DBusMessageInternals.html#a16">00154</a> _dbus_message_get_network_data (<a class="code" href="structDBusMessage.html">DBusMessage</a>          *message,
00155                                 <font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a>    **header,
00156                                 <font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a>    **body)
00157 {
00158   _dbus_assert (message-&gt;<a class="code" href="structDBusMessage.html#m11">locked</a>);
00159   
00160   *header = &amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>;
00161   *body = &amp;message-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>;
00162 }
00163 
00164 <font class="keyword">static</font> <font class="keywordtype">void</font>
00165 clear_header_padding (<a class="code" href="structDBusMessage.html">DBusMessage</a> *message)
00166 {
00167   _dbus_string_shorten (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>,
00168                         message-&gt;<a class="code" href="structDBusMessage.html#m5">header_padding</a>);
00169   message-&gt;<a class="code" href="structDBusMessage.html#m5">header_padding</a> = 0;
00170 }              
00171 
00172 <font class="preprocessor">#ifdef DBUS_DISABLE_CHECKS</font>
00173 <font class="preprocessor"></font><font class="preprocessor">#define is_valid_error_name(x) TRUE</font>
00174 <font class="preprocessor"></font><font class="preprocessor">#else</font>
00175 <font class="preprocessor"></font><font class="keyword">static</font> dbus_bool_t
00176 is_valid_error_name (<font class="keyword">const</font> <font class="keywordtype">char</font> *error_name)                                          
00177 {
00178   <a class="code" href="structDBusString.html">DBusString</a> the_error_name;
00179 
00180   <font class="keywordflow">if</font> (error_name == NULL)
00181     <font class="keywordflow">return</font> FALSE;
00182   
00183   _dbus_string_init_const (&amp;the_error_name, error_name);
00184   <font class="keywordflow">return</font> _dbus_string_validate_error_name (&amp;the_error_name, 0,   
00185                                            _dbus_string_get_length (&amp;the_error_name));
00186 }
00187 <font class="preprocessor">#endif</font>
00188 <font class="preprocessor"></font>
00189 <font class="keyword">static</font> dbus_bool_t
00190 append_header_padding (<a class="code" href="structDBusMessage.html">DBusMessage</a> *message)
00191 {
00192   <font class="keywordtype">int</font> old_len;
00193   old_len = _dbus_string_get_length (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>);
00194   <font class="keywordflow">if</font> (!_dbus_string_align_length (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>, 8))
00195     <font class="keywordflow">return</font> FALSE;
00196 
00197   message-&gt;<a class="code" href="structDBusMessage.html#m5">header_padding</a> = _dbus_string_get_length (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>) - old_len;
00198 
00199   <font class="keywordflow">return</font> TRUE;
00200 }
00201 
00202 <font class="preprocessor">#ifdef DBUS_BUILD_TESTS</font>
00203 <font class="preprocessor"></font><font class="comment">/* tests-only until it's actually used */</font>
00204 <font class="keyword">static</font> dbus_int32_t
00205 get_int_field (<a class="code" href="structDBusMessage.html">DBusMessage</a> *message,
00206                <font class="keywordtype">int</font>          field)
00207 {
00208   <font class="keywordtype">int</font> offset;
00209 
00210   _dbus_assert (field &lt;= DBUS_HEADER_FIELD_LAST);
00211   
00212   offset = message-&gt;<a class="code" href="structDBusMessage.html#m2">header_fields</a>[field].<a class="code" href="structHeaderField.html#m1">value_offset</a>;
00213   
00214   <font class="keywordflow">if</font> (offset &lt; 0)
00215     <font class="keywordflow">return</font> -1; <font class="comment">/* useless if -1 is a valid value of course */</font>
00216   
00217   <font class="keywordflow">return</font> _dbus_demarshal_int32 (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>,
00218                                 message-&gt;<a class="code" href="structDBusMessage.html#m7">byte_order</a>,
00219                                 offset,
00220                                 NULL);
00221 }
00222 <font class="preprocessor">#endif</font>
00223 <font class="preprocessor"></font>
00224 <font class="keyword">static</font> dbus_uint32_t
00225 get_uint_field (<a class="code" href="structDBusMessage.html">DBusMessage</a> *message,
00226                 <font class="keywordtype">int</font>          field)
00227 {
00228   <font class="keywordtype">int</font> offset;
00229   
00230   _dbus_assert (field &lt;= DBUS_HEADER_FIELD_LAST);
00231   
00232   offset = message-&gt;<a class="code" href="structDBusMessage.html#m2">header_fields</a>[field].<a class="code" href="structHeaderField.html#m1">value_offset</a>;
00233   
00234   <font class="keywordflow">if</font> (offset &lt; 0)
00235     <font class="keywordflow">return</font> 0; <font class="comment">/* useless if 0 is a valid value of course */</font>
00236   
00237   <font class="keywordflow">return</font> _dbus_demarshal_uint32 (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>,
00238                                  message-&gt;<a class="code" href="structDBusMessage.html#m7">byte_order</a>,
00239                                  offset,
00240                                  NULL);
00241 }
00242 
00243 <font class="keyword">static</font> <font class="keyword">const</font> <font class="keywordtype">char</font>*
00244 get_string_field (<a class="code" href="structDBusMessage.html">DBusMessage</a> *message,
00245                   <font class="keywordtype">int</font>          field,
00246                   <font class="keywordtype">int</font>         *len)
00247 {
00248   <font class="keywordtype">int</font> offset;
00249   <font class="keyword">const</font> <font class="keywordtype">char</font> *data;
00250 
00251   offset = message-&gt;<a class="code" href="structDBusMessage.html#m2">header_fields</a>[field].<a class="code" href="structHeaderField.html#m1">value_offset</a>;
00252 
00253   _dbus_assert (field &lt;= DBUS_HEADER_FIELD_LAST);
00254   
00255   <font class="keywordflow">if</font> (offset &lt; 0)
00256     <font class="keywordflow">return</font> NULL;
00257 
00258   <font class="comment">/* offset points to string length, string data follows it */</font>
00259   <font class="comment">/* FIXME _dbus_demarshal_const_string() that returned</font>
00260 <font class="comment">   * a reference to the string plus its len might be nice.</font>
00261 <font class="comment">   */</font>
00262   
00263   <font class="keywordflow">if</font> (len)
00264     *len = _dbus_demarshal_uint32 (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>,
00265                                    message-&gt;<a class="code" href="structDBusMessage.html#m7">byte_order</a>,
00266                                    offset,
00267                                    NULL);
00268 
00269   data = _dbus_string_get_const_data (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>);
00270   
00271   <font class="keywordflow">return</font> data + (offset + 4); 
00272 }
00273 
00274 <font class="comment">/* returns FALSE if no memory, TRUE with NULL path if no field */</font>
00275 <font class="keyword">static</font> dbus_bool_t
00276 get_path_field_decomposed (<a class="code" href="structDBusMessage.html">DBusMessage</a>  *message,
00277                            <font class="keywordtype">int</font>           field,
00278                            <font class="keywordtype">char</font>       ***path)
00279 {
00280   <font class="keywordtype">int</font> offset;
00281 
00282   offset = message-&gt;<a class="code" href="structDBusMessage.html#m2">header_fields</a>[field].<a class="code" href="structHeaderField.html#m1">value_offset</a>;
00283 
00284   _dbus_assert (field &lt;= DBUS_HEADER_FIELD_LAST);
00285   
00286   <font class="keywordflow">if</font> (offset &lt; 0)
00287     {
00288       *path = NULL;
00289       <font class="keywordflow">return</font> TRUE;
00290     }
00291 
00292   <font class="keywordflow">return</font> _dbus_demarshal_object_path (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>,
00293                                       message-&gt;<a class="code" href="structDBusMessage.html#m7">byte_order</a>,
00294                                       offset,
00295                                       NULL,
00296                                       path, NULL);
00297 }
00298 
00299 <font class="preprocessor">#ifdef DBUS_BUILD_TESTS</font>
00300 <font class="preprocessor"></font><font class="keyword">static</font> dbus_bool_t
00301 append_int_field (<a class="code" href="structDBusMessage.html">DBusMessage</a> *message,
00302                   <font class="keywordtype">int</font>          field,
00303                   <font class="keywordtype">int</font>          value)
00304 {
00305   _dbus_assert (!message-&gt;<a class="code" href="structDBusMessage.html#m11">locked</a>);
00306 
00307   clear_header_padding (message);
00308   
00309   message-&gt;<a class="code" href="structDBusMessage.html#m2">header_fields</a>[field].<a class="code" href="structHeaderField.html#m0">name_offset</a> =
00310     _dbus_string_get_length (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>);
00311   
00312   <font class="keywordflow">if</font> (!_dbus_string_append_byte (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>, field))
00313     <font class="keywordflow">goto</font> failed;
00314 
00315   <font class="keywordflow">if</font> (!_dbus_string_append_byte (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>, DBUS_TYPE_INT32))
00316     <font class="keywordflow">goto</font> failed;
00317 
00318   <font class="keywordflow">if</font> (!_dbus_string_align_length (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>, 4))
00319     <font class="keywordflow">goto</font> failed;
00320   
00321   message-&gt;<a class="code" href="structDBusMessage.html#m2">header_fields</a>[field].<a class="code" href="structHeaderField.html#m1">value_offset</a> =
00322     _dbus_string_get_length (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>);
00323   
00324   <font class="keywordflow">if</font> (!_dbus_marshal_int32 (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>, message-&gt;<a class="code" href="structDBusMessage.html#m7">byte_order</a>,
00325                             value))
00326     <font class="keywordflow">goto</font> failed;
00327 
00328   <font class="keywordflow">if</font> (!append_header_padding (message))
00329     <font class="keywordflow">goto</font> failed;
00330   
00331   <font class="keywordflow">return</font> TRUE;
00332   
00333  failed:
00334   _dbus_string_set_length (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>,
00335                            message-&gt;<a class="code" href="structDBusMessage.html#m2">header_fields</a>[field].<a class="code" href="structHeaderField.html#m0">name_offset</a>);
00336   message-&gt;<a class="code" href="structDBusMessage.html#m2">header_fields</a>[field].<a class="code" href="structHeaderField.html#m0">name_offset</a>  = -1;
00337   message-&gt;<a class="code" href="structDBusMessage.html#m2">header_fields</a>[field].<a class="code" href="structHeaderField.html#m1">value_offset</a> = -1;
00338 
00339   <font class="comment">/* this must succeed because it was allocated on function entry and</font>
00340 <font class="comment">   * DBusString doesn't ever realloc smaller</font>
00341 <font class="comment">   */</font>
00342   <font class="keywordflow">if</font> (!append_header_padding (message))
00343     _dbus_assert_not_reached (<font class="stringliteral">"failed to reappend header padding"</font>);
00344   <font class="keywordflow">return</font> FALSE;
00345 }
00346 <font class="preprocessor">#endif</font>
00347 <font class="preprocessor"></font>
00348 <font class="keyword">static</font> dbus_bool_t
00349 append_uint_field (<a class="code" href="structDBusMessage.html">DBusMessage</a> *message,
00350                    <font class="keywordtype">int</font>          field,
00351                    <font class="keywordtype">int</font>          value)
00352 {
00353   _dbus_assert (!message-&gt;<a class="code" href="structDBusMessage.html#m11">locked</a>);
00354 
00355   clear_header_padding (message);
00356   
00357   message-&gt;<a class="code" href="structDBusMessage.html#m2">header_fields</a>[field].<a class="code" href="structHeaderField.html#m0">name_offset</a> =
00358     _dbus_string_get_length (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>);
00359   
00360   <font class="keywordflow">if</font> (!_dbus_string_append_byte (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>, field))
00361     <font class="keywordflow">goto</font> failed;
00362 
00363   <font class="keywordflow">if</font> (!_dbus_string_append_byte (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>, DBUS_TYPE_UINT32))
00364     <font class="keywordflow">goto</font> failed;
00365 
00366   <font class="keywordflow">if</font> (!_dbus_string_align_length (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>, 4))
00367     <font class="keywordflow">goto</font> failed;
00368   
00369   message-&gt;<a class="code" href="structDBusMessage.html#m2">header_fields</a>[field].<a class="code" href="structHeaderField.html#m1">value_offset</a> =
00370     _dbus_string_get_length (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>);
00371   
00372   <font class="keywordflow">if</font> (!_dbus_marshal_uint32 (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>, message-&gt;<a class="code" href="structDBusMessage.html#m7">byte_order</a>,
00373                              value))
00374     <font class="keywordflow">goto</font> failed;
00375 
00376   <font class="keywordflow">if</font> (!append_header_padding (message))
00377     <font class="keywordflow">goto</font> failed;
00378   
00379   <font class="keywordflow">return</font> TRUE;
00380   
00381  failed:
00382   _dbus_string_set_length (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>,
00383                            message-&gt;<a class="code" href="structDBusMessage.html#m2">header_fields</a>[field].<a class="code" href="structHeaderField.html#m0">name_offset</a>);
00384   message-&gt;<a class="code" href="structDBusMessage.html#m2">header_fields</a>[field].<a class="code" href="structHeaderField.html#m0">name_offset</a>  = -1;
00385   message-&gt;<a class="code" href="structDBusMessage.html#m2">header_fields</a>[field].<a class="code" href="structHeaderField.html#m1">value_offset</a> = -1;
00386 
00387   <font class="comment">/* this must succeed because it was allocated on function entry and</font>
00388 <font class="comment">   * DBusString doesn't ever realloc smaller</font>
00389 <font class="comment">   */</font>
00390   <font class="keywordflow">if</font> (!append_header_padding (message))
00391     _dbus_assert_not_reached (<font class="stringliteral">"failed to reappend header padding"</font>);
00392   <font class="keywordflow">return</font> FALSE;
00393 }
00394 
<a name="l00398"></a><a class="code" href="group__DBusMessageInternals.html#a60">00398</a> <font class="preprocessor">#define MAX_BYTES_OVERHEAD_TO_APPEND_A_STRING (1 + 1 + 3 + 4 + 1 + 8)</font>
00399 <font class="preprocessor"></font>
00400 <font class="keyword">static</font> dbus_bool_t
00401 append_string_field_len (<a class="code" href="structDBusMessage.html">DBusMessage</a> *message,
00402                          <font class="keywordtype">int</font>          field,
00403                          <font class="keywordtype">int</font>          type,
00404                          <font class="keyword">const</font> <font class="keywordtype">char</font>  *value,
00405                          <font class="keywordtype">int</font>          value_len)
00406 {
00407   _dbus_assert (!message-&gt;<a class="code" href="structDBusMessage.html#m11">locked</a>);
00408 
00409   clear_header_padding (message);
00410   
00411   message-&gt;<a class="code" href="structDBusMessage.html#m2">header_fields</a>[field].<a class="code" href="structHeaderField.html#m0">name_offset</a> =
00412     _dbus_string_get_length (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>);
00413   
00414   <font class="keywordflow">if</font> (!_dbus_string_append_byte (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>, field))
00415     <font class="keywordflow">goto</font> failed;
00416   
00417   <font class="keywordflow">if</font> (!_dbus_string_append_byte (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>, type))
00418     <font class="keywordflow">goto</font> failed;
00419 
00420   <font class="keywordflow">if</font> (!_dbus_string_align_length (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>, 4))
00421     <font class="keywordflow">goto</font> failed;
00422   
00423   message-&gt;<a class="code" href="structDBusMessage.html#m2">header_fields</a>[field].<a class="code" href="structHeaderField.html#m1">value_offset</a> =
00424     _dbus_string_get_length (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>);
00425   
00426   <font class="keywordflow">if</font> (!_dbus_marshal_string_len (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>, message-&gt;<a class="code" href="structDBusMessage.html#m7">byte_order</a>,
00427                                  value, value_len))
00428     <font class="keywordflow">goto</font> failed;
00429 
00430   <font class="keywordflow">if</font> (!append_header_padding (message))
00431     <font class="keywordflow">goto</font> failed;
00432   
00433   <font class="keywordflow">return</font> TRUE;
00434   
00435  failed:
00436   _dbus_string_set_length (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>,
00437                            message-&gt;<a class="code" href="structDBusMessage.html#m2">header_fields</a>[field].<a class="code" href="structHeaderField.html#m0">name_offset</a>);
00438   message-&gt;<a class="code" href="structDBusMessage.html#m2">header_fields</a>[field].<a class="code" href="structHeaderField.html#m0">name_offset</a>  = -1;
00439   message-&gt;<a class="code" href="structDBusMessage.html#m2">header_fields</a>[field].<a class="code" href="structHeaderField.html#m1">value_offset</a> = -1;
00440 
00441   <font class="comment">/* this must succeed because it was allocated on function entry and</font>
00442 <font class="comment">   * DBusString doesn't ever realloc smaller</font>
00443 <font class="comment">   */</font>
00444   <font class="keywordflow">if</font> (!append_header_padding (message))
00445     _dbus_assert_not_reached (<font class="stringliteral">"failed to reappend header padding"</font>);
00446   
00447   <font class="keywordflow">return</font> FALSE;
00448 }
00449 
00450 <font class="keyword">static</font> dbus_bool_t
00451 append_string_field (<a class="code" href="structDBusMessage.html">DBusMessage</a> *message,
00452                      <font class="keywordtype">int</font>          field,
00453                      <font class="keywordtype">int</font>          type,
00454                      <font class="keyword">const</font> <font class="keywordtype">char</font>  *value)
00455 {
00456   <font class="keywordtype">int</font> value_len;
00457 
00458   value_len = strlen (value);
00459 
00460   <font class="keywordflow">return</font> append_string_field_len (message, field, type, value, value_len);
00461 }
00462 
00463 <font class="keyword">static</font> <font class="keywordtype">int</font>
00464 get_type_alignment (<font class="keywordtype">int</font> type)
00465 {
00466   <font class="keywordtype">int</font> alignment;
00467   
00468   <font class="keywordflow">switch</font> (type)
00469     {
00470     <font class="keywordflow">case</font> DBUS_TYPE_NIL:
00471     <font class="keywordflow">case</font> DBUS_TYPE_BYTE:
00472     <font class="keywordflow">case</font> DBUS_TYPE_BOOLEAN:
00473       alignment = 0;
00474       <font class="keywordflow">break</font>;
00475 
00476     <font class="keywordflow">case</font> DBUS_TYPE_INT32:
00477     <font class="keywordflow">case</font> DBUS_TYPE_UINT32:
00478     <font class="keywordflow">case</font> DBUS_TYPE_STRING:
00479     <font class="keywordflow">case</font> DBUS_TYPE_OBJECT_PATH:
00480       <font class="comment">/* These are aligned 4 because they have a length as the</font>
00481 <font class="comment">       * first field;</font>
00482 <font class="comment">       */</font>
00483     <font class="keywordflow">case</font> DBUS_TYPE_CUSTOM:
00484     <font class="keywordflow">case</font> DBUS_TYPE_DICT:
00485       alignment = 4;
00486       <font class="keywordflow">break</font>;
00487 
00488     <font class="keywordflow">case</font> DBUS_TYPE_INT64:
00489     <font class="keywordflow">case</font> DBUS_TYPE_UINT64:
00490     <font class="keywordflow">case</font> DBUS_TYPE_DOUBLE:
00491       alignment = 8;
00492       <font class="keywordflow">break</font>;
00493 
00494     <font class="keywordflow">case</font> DBUS_TYPE_ARRAY:
00495       _dbus_assert_not_reached (<font class="stringliteral">"passed an ARRAY type to get_type_alignment()"</font>);
00496       <font class="keywordflow">break</font>;
00497 
00498     <font class="keywordflow">case</font> DBUS_TYPE_INVALID:
00499     <font class="keywordflow">default</font>:
00500       _dbus_assert_not_reached (<font class="stringliteral">"passed an invalid or unknown type to get_type_alignment()"</font>);
00501       <font class="keywordflow">break</font>;
00502     }
00503 
00504   <font class="keywordflow">return</font> alignment;
00505 }
00506 
00507 <font class="keyword">static</font> dbus_bool_t
00508 iterate_one_field (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a> *str,
00509                    <font class="keywordtype">int</font>               byte_order,
00510                    <font class="keywordtype">int</font>               name_offset,
00511                    <font class="keywordtype">int</font>              *next_offset_p,
00512                    <font class="keywordtype">int</font>              *field_name_p,
00513                    <a class="code" href="structDBusString.html">DBusString</a>       *append_copy_to,
00514                    <font class="keywordtype">int</font>              *copy_name_offset_p,
00515                    <font class="keywordtype">int</font>              *copy_value_offset_p)
00516 {
00517   <font class="keywordtype">int</font> name, type, array_type;
00518   <font class="keywordtype">int</font> alignment;
00519   <font class="keywordtype">int</font> type_len;
00520   <font class="keywordtype">int</font> type_pos;
00521   <font class="keywordtype">int</font> value_pos;
00522   <font class="keywordtype">int</font> value_len;
00523   <font class="keywordtype">int</font> value_end;
00524   <font class="keywordtype">int</font> pos;
00525 
00526   _dbus_verbose (<font class="stringliteral">"%s: name_offset=%d, append to %p\n"</font>,
00527                  _DBUS_FUNCTION_NAME, name_offset, append_copy_to);
00528   
00529   pos = name_offset;
00530   
00531   name = _dbus_string_get_byte (str, name_offset);
00532   pos++;
00533 
00534   type_pos = pos;
00535   type = _dbus_string_get_byte (str, type_pos);
00536   pos++;
00537   type_len = 1;
00538 
00539   array_type = type;
00540   <font class="comment">/* find out the type of our array */</font>
00541   <font class="keywordflow">while</font> (array_type == DBUS_TYPE_ARRAY)
00542     {
00543       pos++;
00544       type_len++;
00545       array_type = _dbus_string_get_byte (str, pos);
00546     }
00547 
00548   _dbus_verbose (<font class="stringliteral">"%s: name %d, type '%c' %d at %d len %d, array type '%c' %d\n"</font>,
00549                  _DBUS_FUNCTION_NAME,
00550                  name, type, type, type_pos, type_len, array_type, array_type);
00551   
00552 <font class="preprocessor">#ifndef DBUS_DISABLE_ASSERT</font>
00553 <font class="preprocessor"></font>  <font class="keywordflow">if</font> (!_dbus_type_is_valid (array_type))
00554     {
00555       _dbus_warn (<font class="stringliteral">"type '%c' %d is not valid in %s\n"</font>,
00556                   array_type, array_type, _DBUS_FUNCTION_NAME);
00557       _dbus_assert_not_reached (<font class="stringliteral">"invalid type"</font>);
00558     }
00559 <font class="preprocessor">#endif</font>
00560 <font class="preprocessor"></font>      
00561   alignment = get_type_alignment (array_type);
00562       
00563   <font class="keywordflow">if</font> (alignment &gt; 0)
00564     pos = _DBUS_ALIGN_VALUE (pos, alignment);
00565 
00566   _dbus_verbose (<font class="stringliteral">"%s: alignment %d value at pos %d\n"</font>,
00567                  _DBUS_FUNCTION_NAME, alignment, pos);
00568   
00569   <font class="comment">/* pos now points to our value */</font>
00570   <font class="keywordflow">if</font> (!_dbus_marshal_get_arg_end_pos (str, byte_order,
00571                                       type, pos, &amp;value_end))
00572     _dbus_assert_not_reached (<font class="stringliteral">"failed to get the byte after this header"</font>);
00573 
00574   value_pos = pos;
00575   value_len = value_end - value_pos;
00576 
00577   _dbus_verbose (<font class="stringliteral">"%s: value_pos %d value_len %d value_end %d\n"</font>,
00578                  _DBUS_FUNCTION_NAME, value_pos, value_len, value_end);
00579   
00580   <font class="keywordflow">if</font> (next_offset_p)
00581     *next_offset_p = pos + value_len;
00582 
00583   <font class="keywordflow">if</font> (field_name_p)
00584     *field_name_p = name;
00585 
00586   <font class="keywordflow">if</font> (append_copy_to)
00587     {
00588       <font class="keywordtype">int</font> orig_len;
00589 
00590       orig_len = _dbus_string_get_length (append_copy_to);
00591 
00592       <font class="keywordflow">if</font> (copy_name_offset_p)
00593         *copy_name_offset_p = orig_len;
00594       
00595       <font class="keywordflow">if</font> (!_dbus_string_append_byte (append_copy_to, name))
00596         <font class="keywordflow">goto</font> failed_copy;
00597 
00598       <font class="keywordflow">if</font> (!_dbus_string_copy_len (str, type_pos, type_len,
00599                                   append_copy_to,
00600                                   _dbus_string_get_length (append_copy_to)))
00601         <font class="keywordflow">goto</font> failed_copy;
00602 
00603       <font class="keywordflow">if</font> (!_dbus_string_align_length (append_copy_to, alignment))
00604         <font class="keywordflow">goto</font> failed_copy;
00605 
00606       <font class="keywordflow">if</font> (copy_value_offset_p)
00607         *copy_value_offset_p = _dbus_string_get_length (append_copy_to);
00608       
00609       <font class="keywordflow">if</font> (!_dbus_string_copy_len (str, value_pos, value_len,
00610                                   append_copy_to,
00611                                   _dbus_string_get_length (append_copy_to)))
00612         <font class="keywordflow">goto</font> failed_copy;
00613       
00614       <font class="keywordflow">return</font> TRUE;
00615 
00616     failed_copy:
00617       _dbus_verbose (<font class="stringliteral">"%s: Failed copying old fields to new string\n"</font>,
00618                      _DBUS_FUNCTION_NAME);
00619       _dbus_string_set_length (append_copy_to, orig_len);
00620       <font class="keywordflow">return</font> FALSE;
00621     }
00622   <font class="keywordflow">else</font>
00623     <font class="keywordflow">return</font> TRUE;
00624 }
00625 
00626 <font class="preprocessor">#ifndef DBUS_DISABLE_ASSERT</font>
00627 <font class="preprocessor"></font><font class="keyword">static</font> <font class="keywordtype">void</font>
00628 verify_header_fields (<a class="code" href="structDBusMessage.html">DBusMessage</a> *message)
00629 {
00630   <font class="keywordtype">int</font> i;
00631   i = 0;
00632   <font class="keywordflow">while</font> (i &lt; DBUS_HEADER_FIELD_LAST)
00633     {
00634       <font class="keywordflow">if</font> (message-&gt;<a class="code" href="structDBusMessage.html#m2">header_fields</a>[i].<a class="code" href="structHeaderField.html#m0">name_offset</a> &gt;= 0)
00635         _dbus_assert (_dbus_string_get_byte (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>,
00636                                              message-&gt;<a class="code" href="structDBusMessage.html#m2">header_fields</a>[i].<a class="code" href="structHeaderField.html#m0">name_offset</a>) ==
00637                       i);
00638       ++i;
00639     }
00640 }
00641 <font class="preprocessor">#else </font><font class="comment">/* DBUS_DISABLE_ASSERT */</font>
00642 <font class="preprocessor">#define verify_header_fields(x)</font>
00643 <font class="preprocessor"></font><font class="preprocessor">#endif </font><font class="comment">/* DBUS_DISABLE_ASSERT */</font>
00644 
00645 <font class="comment">/* In this function we delete one field and re-align all the fields</font>
00646 <font class="comment"> * following it.</font>
00647 <font class="comment"> */</font>
00648 <font class="keyword">static</font> dbus_bool_t
00649 delete_one_and_re_align (<a class="code" href="structDBusMessage.html">DBusMessage</a> *message,
00650                          <font class="keywordtype">int</font>          name_offset_to_delete)
00651 {
00652   <a class="code" href="structDBusString.html">DBusString</a> copy;
00653   <font class="keywordtype">int</font> new_fields_front_padding;
00654   <font class="keywordtype">int</font> next_offset;
00655   <font class="keywordtype">int</font> field_name;
00656   dbus_bool_t retval;
00657   <a class="code" href="structHeaderField.html">HeaderField</a> new_header_fields[DBUS_HEADER_FIELD_LAST];
00658   
00659   _dbus_assert (name_offset_to_delete &lt; _dbus_string_get_length (&amp;message-&gt;header));
00660   verify_header_fields (message);
00661 
00662   _dbus_verbose (<font class="stringliteral">"%s: Deleting one field at offset %d\n"</font>,
00663                  _DBUS_FUNCTION_NAME,
00664                  name_offset_to_delete);
00665   
00666   retval = FALSE;
00667 
00668   clear_header_padding (message);
00669   
00670   <font class="keywordflow">if</font> (!_dbus_string_init_preallocated (&amp;copy,
00671                                        _dbus_string_get_length (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>) -
00672                                        name_offset_to_delete + 8))
00673     {
00674       _dbus_verbose (<font class="stringliteral">"%s: Failed to init string to hold copy of fields\n"</font>,
00675                      _DBUS_FUNCTION_NAME);
00676       <font class="keywordflow">goto</font> out_0;
00677     }
00678   
00679   <font class="comment">/* Align the name offset of the first field in the same way it's</font>
00680 <font class="comment">   * aligned in the real header</font>
00681 <font class="comment">   */</font>
00682   new_fields_front_padding = name_offset_to_delete % 8;
00683 
00684   <font class="keywordflow">if</font> (!_dbus_string_insert_bytes (&amp;copy, 0, new_fields_front_padding,
00685                                   <font class="charliteral">'\0'</font>))
00686     _dbus_assert_not_reached (<font class="stringliteral">"Should not have failed to insert bytes into preallocated string\n"</font>);
00687 
00688   memcpy (new_header_fields, message-&gt;<a class="code" href="structDBusMessage.html#m2">header_fields</a>,
00689           sizeof (new_header_fields));
00690   
00691   <font class="comment">/* Now just re-marshal each field in the header to our temporary</font>
00692 <font class="comment">   * buffer, skipping the first one. The tricky part is that the</font>
00693 <font class="comment">   * fields are padded as if for previous_name_offset, but are in fact</font>
00694 <font class="comment">   * at unaligned_name_offset</font>
00695 <font class="comment">   */</font>
00696 
00697   <font class="keywordflow">if</font> (!iterate_one_field (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>,
00698                           message-&gt;<a class="code" href="structDBusMessage.html#m7">byte_order</a>,
00699                           name_offset_to_delete,
00700                           &amp;next_offset,
00701                           &amp;field_name, NULL, NULL, NULL))
00702     _dbus_assert_not_reached (<font class="stringliteral">"shouldn't have failed to alloc memory to skip the deleted field"</font>);
00703 
00704   <font class="keywordflow">if</font> (field_name &lt; DBUS_HEADER_FIELD_LAST)
00705     {
00706       new_header_fields[field_name].<a class="code" href="structHeaderField.html#m0">name_offset</a> = -1;
00707       new_header_fields[field_name].<a class="code" href="structHeaderField.html#m1">value_offset</a> = -1;
00708     }
00709   
00710   <font class="keywordflow">while</font> (next_offset &lt; _dbus_string_get_length (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>))
00711     {
00712       <font class="keywordtype">int</font> copy_name_offset;
00713       <font class="keywordtype">int</font> copy_value_offset;
00714 
00715       <font class="keywordflow">if</font> (!iterate_one_field (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>,
00716                               message-&gt;<a class="code" href="structDBusMessage.html#m7">byte_order</a>,
00717                               next_offset,
00718                               &amp;next_offset,
00719                               &amp;field_name,
00720                               &amp;copy,
00721                               &amp;copy_name_offset,
00722                               &amp;copy_value_offset))
00723         {
00724           _dbus_verbose (<font class="stringliteral">"%s: OOM iterating one field\n"</font>,
00725                          _DBUS_FUNCTION_NAME);
00726           <font class="keywordflow">goto</font> out_1;
00727         }
00728       
00729       <font class="keywordflow">if</font> (field_name &lt; DBUS_HEADER_FIELD_LAST)
00730         {
00731           new_header_fields[field_name].<a class="code" href="structHeaderField.html#m0">name_offset</a> = copy_name_offset - new_fields_front_padding + name_offset_to_delete;
00732           new_header_fields[field_name].<a class="code" href="structHeaderField.html#m1">value_offset</a> = copy_value_offset - new_fields_front_padding + name_offset_to_delete;
00733         }
00734     }
00735 
00736   <font class="keywordflow">if</font> (!_dbus_string_replace_len (&amp;copy,
00737                                  new_fields_front_padding,
00738                                  _dbus_string_get_length (&amp;copy) - new_fields_front_padding,
00739                                  &amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>,
00740                                  name_offset_to_delete,
00741                                  _dbus_string_get_length (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>) - name_offset_to_delete))
00742     {
00743       _dbus_verbose (<font class="stringliteral">"%s: OOM moving copy back into header\n"</font>,
00744                      _DBUS_FUNCTION_NAME);
00745       <font class="keywordflow">goto</font> out_1;
00746     }
00747   
00748   memcpy (message-&gt;<a class="code" href="structDBusMessage.html#m2">header_fields</a>, new_header_fields,
00749           sizeof (new_header_fields));
00750   verify_header_fields (message);
00751   
00752   retval = TRUE;
00753   
00754  out_1:
00755   _dbus_string_free (&amp;copy);
00756   
00757  out_0:
00758   <font class="keywordflow">if</font> (!append_header_padding (message))
00759     _dbus_assert_not_reached (<font class="stringliteral">"Failed to re-append header padding in re_align_field_recurse()"</font>);
00760   
00761   <font class="keywordflow">return</font> retval;
00762 }
00763 
00764 <font class="keyword">static</font> dbus_bool_t
00765 delete_field (<a class="code" href="structDBusMessage.html">DBusMessage</a> *message,
00766               <font class="keywordtype">int</font>          field,
00767               <font class="keywordtype">int</font>          prealloc_header_space)
00768 {
00769   <font class="keywordtype">int</font> offset;
00770 
00771   _dbus_assert (!message-&gt;<a class="code" href="structDBusMessage.html#m11">locked</a>);
00772 
00773   <font class="comment">/* Prealloc */</font>
00774   <font class="keywordflow">if</font> (!_dbus_string_lengthen (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>, prealloc_header_space))
00775     {
00776       _dbus_verbose (<font class="stringliteral">"failed to prealloc %d bytes header space\n"</font>,
00777                      prealloc_header_space);
00778       <font class="keywordflow">return</font> FALSE;
00779     }
00780   _dbus_string_shorten (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>, prealloc_header_space);
00781 
00782   <font class="comment">/* Delete */</font>
00783   offset = message-&gt;<a class="code" href="structDBusMessage.html#m2">header_fields</a>[field].<a class="code" href="structHeaderField.html#m0">name_offset</a>;
00784   <font class="keywordflow">if</font> (offset &lt; 0)
00785     {
00786       _dbus_verbose (<font class="stringliteral">"header field didn't exist, no need to delete\n"</font>);
00787       <font class="keywordflow">return</font> TRUE; <font class="comment">/* field didn't exist */</font>
00788     }
00789 
00790   <font class="keywordflow">return</font> delete_one_and_re_align (message, offset);
00791 }
00792 
00793 <font class="preprocessor">#ifdef DBUS_BUILD_TESTS</font>
00794 <font class="preprocessor"></font><font class="keyword">static</font> dbus_bool_t
00795 set_int_field (<a class="code" href="structDBusMessage.html">DBusMessage</a> *message,
00796                <font class="keywordtype">int</font>          field,
00797                <font class="keywordtype">int</font>          value)
00798 {
00799   <font class="keywordtype">int</font> offset = message-&gt;<a class="code" href="structDBusMessage.html#m2">header_fields</a>[field].<a class="code" href="structHeaderField.html#m1">value_offset</a>;
00800 
00801   _dbus_assert (!message-&gt;<a class="code" href="structDBusMessage.html#m11">locked</a>);
00802   
00803   <font class="keywordflow">if</font> (offset &lt; 0)
00804     {
00805       <font class="comment">/* need to append the field */</font>
00806       <font class="keywordflow">return</font> append_int_field (message, field, value);
00807     }
00808   <font class="keywordflow">else</font>
00809     {
00810       _dbus_marshal_set_int32 (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>,
00811                                message-&gt;<a class="code" href="structDBusMessage.html#m7">byte_order</a>,
00812                                offset, value);
00813 
00814       <font class="keywordflow">return</font> TRUE;
00815     }
00816 }
00817 <font class="preprocessor">#endif</font>
00818 <font class="preprocessor"></font>
00819 <font class="keyword">static</font> dbus_bool_t
00820 set_uint_field (<a class="code" href="structDBusMessage.html">DBusMessage</a>  *message,
00821                 <font class="keywordtype">int</font>           field,
00822                 dbus_uint32_t value)
00823 {
00824   <font class="keywordtype">int</font> offset = message-&gt;<a class="code" href="structDBusMessage.html#m2">header_fields</a>[field].<a class="code" href="structHeaderField.html#m1">value_offset</a>;
00825 
00826   _dbus_assert (!message-&gt;<a class="code" href="structDBusMessage.html#m11">locked</a>);
00827   
00828   <font class="keywordflow">if</font> (offset &lt; 0)
00829     {
00830       <font class="comment">/* need to append the field */</font>
00831       <font class="keywordflow">return</font> append_uint_field (message, field, value);
00832     }
00833   <font class="keywordflow">else</font>
00834     {
00835       _dbus_marshal_set_uint32 (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>,
00836                                 message-&gt;<a class="code" href="structDBusMessage.html#m7">byte_order</a>,
00837                                 offset, value);
00838 
00839       <font class="keywordflow">return</font> TRUE;
00840     }
00841 }
00842 
00843 <font class="keyword">static</font> dbus_bool_t
00844 set_string_field (<a class="code" href="structDBusMessage.html">DBusMessage</a> *message,
00845                   <font class="keywordtype">int</font>          field,
00846                   <font class="keywordtype">int</font>          type,
00847                   <font class="keyword">const</font> <font class="keywordtype">char</font>  *value)
00848 {
00849   <font class="keywordtype">int</font> prealloc;
00850   <font class="keywordtype">int</font> value_len;
00851   
00852   _dbus_assert (!message-&gt;<a class="code" href="structDBusMessage.html#m11">locked</a>);
00853 
00854   value_len = value ? strlen (value) : 0;
00855   
00856   <font class="comment">/* the prealloc is so the append_string_field()</font>
00857 <font class="comment">   * below won't fail, leaving us in inconsistent state</font>
00858 <font class="comment">   */</font>
00859   prealloc = value_len + MAX_BYTES_OVERHEAD_TO_APPEND_A_STRING;
00860 
00861   _dbus_verbose (<font class="stringliteral">"set_string_field() field %d prealloc %d\n"</font>,
00862                  field, prealloc);
00863   
00864   <font class="keywordflow">if</font> (!delete_field (message, field, prealloc))
00865     <font class="keywordflow">return</font> FALSE;
00866 
00867   <font class="keywordflow">if</font> (value != NULL)
00868     {
00869       <font class="comment">/* need to append the field */</font>
00870       <font class="keywordflow">if</font> (!append_string_field_len (message, field, type, value, value_len))
00871         _dbus_assert_not_reached (<font class="stringliteral">"Appending string field shouldn't have failed, due to preallocation"</font>);
00872     }
00873   
00874   <font class="keywordflow">return</font> TRUE;
00875 }
00876 
00884 <font class="keywordtype">void</font>
<a name="l00885"></a><a class="code" href="group__DBusMessageInternals.html#a36">00885</a> _dbus_message_set_serial (<a class="code" href="structDBusMessage.html">DBusMessage</a>  *message,
00886                           dbus_int32_t  serial)
00887 {
00888   _dbus_assert (!message-&gt;<a class="code" href="structDBusMessage.html#m11">locked</a>);
00889   _dbus_assert (dbus_message_get_serial (message) == 0);
00890 
00891   _dbus_marshal_set_uint32 (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>,
00892                             message-&gt;<a class="code" href="structDBusMessage.html#m7">byte_order</a>,
00893                             CLIENT_SERIAL_OFFSET,
00894                             serial);
00895 
00896   message-&gt;<a class="code" href="structDBusMessage.html#m3">client_serial</a> = serial;
00897 }
00898 
00907 dbus_bool_t
<a name="l00908"></a><a class="code" href="group__DBusMessageInternals.html#a23">00908</a> dbus_message_set_reply_serial (<a class="code" href="structDBusMessage.html">DBusMessage</a>   *message,
00909                                dbus_uint32_t  reply_serial)
00910 {
00911   _dbus_assert (!message-&gt;<a class="code" href="structDBusMessage.html#m11">locked</a>);
00912 
00913   <font class="keywordflow">if</font> (set_uint_field (message,
00914                       DBUS_HEADER_FIELD_REPLY_SERIAL,
00915                       reply_serial))
00916     {
00917       message-&gt;<a class="code" href="structDBusMessage.html#m4">reply_serial</a> = reply_serial;
00918       <font class="keywordflow">return</font> TRUE;
00919     }
00920   <font class="keywordflow">else</font>
00921     <font class="keywordflow">return</font> FALSE;
00922 }
00923 
00934 dbus_uint32_t
<a name="l00935"></a><a class="code" href="group__DBusMessageInternals.html#a24">00935</a> dbus_message_get_serial (<a class="code" href="structDBusMessage.html">DBusMessage</a> *message)
00936 {
00937   <font class="keywordflow">return</font> message-&gt;<a class="code" href="structDBusMessage.html#m3">client_serial</a>;
00938 }
00939 
00946 dbus_uint32_t
<a name="l00947"></a><a class="code" href="group__DBusMessageInternals.html#a25">00947</a> dbus_message_get_reply_serial  (<a class="code" href="structDBusMessage.html">DBusMessage</a> *message)
00948 {
00949   <font class="keywordflow">return</font> message-&gt;<a class="code" href="structDBusMessage.html#m4">reply_serial</a>;
00950 }
00951 
00964 <font class="keywordtype">void</font>
<a name="l00965"></a><a class="code" href="group__DBusMessageInternals.html#a40">00965</a> _dbus_message_add_size_counter_link (<a class="code" href="structDBusMessage.html">DBusMessage</a>  *message,
00966                                      <a class="code" href="structDBusList.html">DBusList</a>     *link)
00967 {
00968   <font class="comment">/* right now we don't recompute the delta when message</font>
00969 <font class="comment">   * size changes, and that's OK for current purposes</font>
00970 <font class="comment">   * I think, but could be important to change later.</font>
00971 <font class="comment">   * Do recompute it whenever there are no outstanding counters,</font>
00972 <font class="comment">   * since it's basically free.</font>
00973 <font class="comment">   */</font>
00974   <font class="keywordflow">if</font> (message-&gt;<a class="code" href="structDBusMessage.html#m8">size_counters</a> == NULL)
00975     {
00976       message-&gt;<a class="code" href="structDBusMessage.html#m9">size_counter_delta</a> =
00977         _dbus_string_get_length (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>) +
00978         _dbus_string_get_length (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>);
00979       
00980 <font class="preprocessor">#if 0</font>
00981 <font class="preprocessor"></font>      _dbus_verbose (<font class="stringliteral">"message has size %ld\n"</font>,
00982                      message-&gt;<a class="code" href="structDBusMessage.html#m9">size_counter_delta</a>);
00983 <font class="preprocessor">#endif</font>
00984 <font class="preprocessor"></font>    }
00985   
00986   _dbus_list_append_link (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m8">size_counters</a>, link);
00987   
00988   _dbus_counter_adjust (link-&gt;<a class="code" href="structDBusList.html#m2">data</a>, message-&gt;<a class="code" href="structDBusMessage.html#m9">size_counter_delta</a>);
00989 }
00990 
01000 dbus_bool_t
<a name="l01001"></a><a class="code" href="group__DBusMessageInternals.html#a41">01001</a> _dbus_message_add_size_counter (<a class="code" href="structDBusMessage.html">DBusMessage</a> *message,
01002                                 <a class="code" href="structDBusCounter.html">DBusCounter</a> *counter)
01003 {
01004   <a class="code" href="structDBusList.html">DBusList</a> *link;
01005 
01006   link = _dbus_list_alloc_link (counter);
01007   <font class="keywordflow">if</font> (link == NULL)
01008     <font class="keywordflow">return</font> FALSE;
01009 
01010   _dbus_counter_ref (counter);
01011   _dbus_message_add_size_counter_link (message, link);
01012 
01013   <font class="keywordflow">return</font> TRUE;
01014 }
01015 
01024 <font class="keywordtype">void</font>
<a name="l01025"></a><a class="code" href="group__DBusMessageInternals.html#a42">01025</a> _dbus_message_remove_size_counter (<a class="code" href="structDBusMessage.html">DBusMessage</a>  *message,
01026                                    <a class="code" href="structDBusCounter.html">DBusCounter</a>  *counter,
01027                                    <a class="code" href="structDBusList.html">DBusList</a>    **link_return)
01028 {
01029   <a class="code" href="structDBusList.html">DBusList</a> *link;
01030 
01031   link = _dbus_list_find_last (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m8">size_counters</a>,
01032                                counter);
01033   _dbus_assert (link != NULL);
01034 
01035   _dbus_list_unlink (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m8">size_counters</a>,
01036                      link);
01037   <font class="keywordflow">if</font> (link_return)
01038     *link_return = link;
01039   <font class="keywordflow">else</font>
01040     _dbus_list_free_link (link);
01041 
01042   _dbus_counter_adjust (counter, message-&gt;<a class="code" href="structDBusMessage.html#m9">size_counter_delta</a>);
01043 
01044   _dbus_counter_unref (counter);
01045 }
01046 
01047 <font class="keyword">static</font> dbus_bool_t
01048 dbus_message_create_header (<a class="code" href="structDBusMessage.html">DBusMessage</a> *message,
01049                             <font class="keywordtype">int</font>          type,
01050                             <font class="keyword">const</font> <font class="keywordtype">char</font>  *service,
01051                             <font class="keyword">const</font> <font class="keywordtype">char</font>  *path,
01052                             <font class="keyword">const</font> <font class="keywordtype">char</font>  *interface,
01053                             <font class="keyword">const</font> <font class="keywordtype">char</font>  *member,
01054                             <font class="keyword">const</font> <font class="keywordtype">char</font>  *error_name)
01055 {
01056   <font class="keywordtype">unsigned</font> <font class="keywordtype">int</font> flags;
01057 
01058   _dbus_assert ((interface &amp;&amp; member) ||
01059                 (error_name) ||
01060                 !(interface || member || error_name));
01061   _dbus_assert (error_name == NULL || is_valid_error_name (error_name));
01062   
01063   <font class="keywordflow">if</font> (!_dbus_string_append_byte (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>, message-&gt;<a class="code" href="structDBusMessage.html#m7">byte_order</a>))
01064     <font class="keywordflow">return</font> FALSE;
01065 
01066   <font class="keywordflow">if</font> (!_dbus_string_append_byte (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>, type))
01067     <font class="keywordflow">return</font> FALSE;
01068   
01069   flags = 0;
01070   <font class="keywordflow">if</font> (!_dbus_string_append_byte (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>, flags))
01071     <font class="keywordflow">return</font> FALSE;
01072 
01073   <font class="keywordflow">if</font> (!_dbus_string_append_byte (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>, DBUS_MAJOR_PROTOCOL_VERSION))
01074     <font class="keywordflow">return</font> FALSE;
01075 
01076   <font class="comment">/* header length */</font>
01077   <font class="keywordflow">if</font> (!_dbus_marshal_uint32 (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>, message-&gt;<a class="code" href="structDBusMessage.html#m7">byte_order</a>, 0))
01078     <font class="keywordflow">return</font> FALSE;
01079 
01080   <font class="comment">/* body length */</font>
01081   <font class="keywordflow">if</font> (!_dbus_marshal_uint32 (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>, message-&gt;<a class="code" href="structDBusMessage.html#m7">byte_order</a>, 0))
01082     <font class="keywordflow">return</font> FALSE;
01083 
01084   <font class="comment">/* serial */</font>
01085   <font class="keywordflow">if</font> (!_dbus_marshal_uint32 (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>, message-&gt;<a class="code" href="structDBusMessage.html#m7">byte_order</a>, 0))
01086     <font class="keywordflow">return</font> FALSE;
01087   
01088   <font class="comment">/* Marshal all the fields (Marshall Fields?) */</font>
01089   
01090   <font class="keywordflow">if</font> (path != NULL)
01091     {
01092       <font class="keywordflow">if</font> (!append_string_field (message,
01093                                 DBUS_HEADER_FIELD_PATH,
01094                                 DBUS_TYPE_OBJECT_PATH,
01095                                 path))
01096         <font class="keywordflow">return</font> FALSE;
01097     }
01098   
01099   <font class="keywordflow">if</font> (service != NULL)
01100     {
01101       <font class="keywordflow">if</font> (!append_string_field (message,
01102                                 DBUS_HEADER_FIELD_DESTINATION,
01103                                 DBUS_TYPE_STRING,
01104                                 service))
01105         <font class="keywordflow">return</font> FALSE;
01106     }
01107 
01108   <font class="keywordflow">if</font> (interface != NULL)
01109     {
01110       <font class="keywordflow">if</font> (!append_string_field (message,
01111                                 DBUS_HEADER_FIELD_INTERFACE,
01112                                 DBUS_TYPE_STRING,
01113                                 interface))
01114         <font class="keywordflow">return</font> FALSE;
01115     }
01116 
01117   <font class="keywordflow">if</font> (member != NULL)
01118     {
01119       <font class="keywordflow">if</font> (!append_string_field (message,
01120                                 DBUS_HEADER_FIELD_MEMBER,
01121                                 DBUS_TYPE_STRING,
01122                                 member))
01123         <font class="keywordflow">return</font> FALSE;
01124     }
01125 
01126   <font class="keywordflow">if</font> (error_name != NULL)
01127     {
01128       <font class="keywordflow">if</font> (!append_string_field (message,
01129                                 DBUS_HEADER_FIELD_ERROR_NAME,
01130                                 DBUS_TYPE_STRING,
01131                                 error_name))
01132         <font class="keywordflow">return</font> FALSE;
01133     }
01134 
01135   <font class="comment">/* @todo if we make signature optional when body is empty, we don't</font>
01136 <font class="comment">   * need to do this here.</font>
01137 <font class="comment">   */</font>
01138   <font class="keywordflow">if</font> (!append_string_field (message,
01139                             DBUS_HEADER_FIELD_SIGNATURE,
01140                             DBUS_TYPE_STRING,
01141                             <font class="stringliteral">""</font>))
01142     <font class="keywordflow">return</font> FALSE;
01143   
01144   <font class="keywordflow">return</font> TRUE;
01145 }
01146 
01156 <font class="keywordtype">void</font>
<a name="l01157"></a><a class="code" href="group__DBusMessageInternals.html#a44">01157</a> _dbus_message_lock (<a class="code" href="structDBusMessage.html">DBusMessage</a>  *message)
01158 {
01159   <font class="keywordflow">if</font> (!message-&gt;<a class="code" href="structDBusMessage.html#m11">locked</a>)
01160     {
01161       <font class="comment">/* Fill in our lengths */</font>
01162       _dbus_marshal_set_uint32 (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>,
01163                                 message-&gt;<a class="code" href="structDBusMessage.html#m7">byte_order</a>,
01164                                 HEADER_LENGTH_OFFSET,
01165                                 _dbus_string_get_length (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>));
01166 
01167       _dbus_marshal_set_uint32 (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>,
01168                                 message-&gt;<a class="code" href="structDBusMessage.html#m7">byte_order</a>,
01169                                 BODY_LENGTH_OFFSET,
01170                                 _dbus_string_get_length (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>));
01171 
01172       message-&gt;<a class="code" href="structDBusMessage.html#m11">locked</a> = TRUE;
01173     }
01174 }
01175 
01207 <font class="keyword">static</font> dbus_bool_t
01208 dbus_message_set_signature (<a class="code" href="structDBusMessage.html">DBusMessage</a> *message,
01209                             <font class="keyword">const</font> <font class="keywordtype">char</font>  *signature)
01210 {
01211   _dbus_return_val_if_fail (message != NULL, FALSE);
01212   _dbus_return_val_if_fail (!message-&gt;<a class="code" href="structDBusMessage.html#m11">locked</a>, FALSE);
01213   
01214   <font class="keywordflow">return</font> set_string_field (message,
01215                            DBUS_HEADER_FIELD_SIGNATURE,
01216                            DBUS_TYPE_STRING,
01217                            signature);
01218 }
01219 
01228 <font class="keyword">static</font> dbus_bool_t
01229 dbus_message_append_to_signature (<a class="code" href="structDBusMessage.html">DBusMessage</a> *message,
01230                                   <font class="keyword">const</font> <font class="keywordtype">char</font>  *append_bytes)
01231 {
01232   <font class="keyword">const</font> <font class="keywordtype">char</font> *signature;
01233   <a class="code" href="structDBusString.html">DBusString</a> append_str;
01234   dbus_bool_t retval;
01235   
01236   _dbus_return_val_if_fail (append_bytes != NULL, FALSE);
01237   _dbus_return_val_if_fail (message != NULL, FALSE);
01238   _dbus_return_val_if_fail (!message-&gt;<a class="code" href="structDBusMessage.html#m11">locked</a>, FALSE);
01239 
01240   retval = FALSE;
01241   
01242   <font class="comment">/* FIXME Just really inefficient for the moment; later we could</font>
01243 <font class="comment">   * speed it up a lot by poking more directly at the header data</font>
01244 <font class="comment">   */</font>
01245   signature = dbus_message_get_signature (message);
01246 
01247   <font class="keywordflow">if</font> (!_dbus_string_init (&amp;append_str))
01248     <font class="keywordflow">return</font> FALSE;
01249 
01250   <font class="keywordflow">if</font> (signature &amp;&amp; !_dbus_string_append (&amp;append_str, signature))
01251     <font class="keywordflow">goto</font> out;
01252 
01253   <font class="keywordflow">if</font> (!_dbus_string_append (&amp;append_str, append_bytes))
01254     <font class="keywordflow">goto</font> out;
01255   
01256   <font class="keywordflow">if</font> (!set_string_field (message,
01257                          DBUS_HEADER_FIELD_SIGNATURE,
01258                          DBUS_TYPE_STRING,
01259                          _dbus_string_get_const_data (&amp;append_str)))
01260     <font class="keywordflow">goto</font> out;
01261 
01262   retval = TRUE;
01263   
01264  out:
01265   
01266   _dbus_string_free (&amp;append_str);
01267 
01268   <font class="keywordflow">return</font> retval;
01269 }
01270 
01279 <font class="keyword">static</font> dbus_bool_t
01280 _dbus_message_append_byte_to_signature (<a class="code" href="structDBusMessage.html">DBusMessage</a>  *message,
01281                                         <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> append_byte)
01282 {
01283   <font class="keywordtype">char</font> buf[2];
01284   
01285   _dbus_return_val_if_fail (message != NULL, FALSE);
01286   _dbus_return_val_if_fail (!message-&gt;<a class="code" href="structDBusMessage.html#m11">locked</a>, FALSE);
01287   
01288   buf[0] = append_byte;
01289   buf[1] = <font class="charliteral">'\0'</font>;
01290 
01291   <font class="keywordflow">return</font> dbus_message_append_to_signature (message, buf);
01292 }
01293 
01300 <font class="keyword">static</font> <font class="keywordtype">void</font>
01301 _dbus_message_remove_byte_from_signature (<a class="code" href="structDBusMessage.html">DBusMessage</a>  *message)
01302 {
01303   <font class="keyword">const</font> <font class="keywordtype">char</font> *signature;
01304   
01305   _dbus_return_if_fail (message != NULL);
01306   _dbus_return_if_fail (!message-&gt;<a class="code" href="structDBusMessage.html#m11">locked</a>);
01307 
01308   signature = dbus_message_get_signature (message);
01309 
01310   _dbus_return_if_fail (signature != NULL);
01311   
01312   <font class="keywordflow">if</font> (!delete_field (message,
01313                      DBUS_HEADER_FIELD_SIGNATURE,
01314                      0))
01315     _dbus_assert_not_reached (<font class="stringliteral">"failed to delete signature field"</font>);
01316 
01317   <font class="comment">/* reappend one shorter (could this be any less efficient? the code will</font>
01318 <font class="comment">   * go away later anyhow)</font>
01319 <font class="comment">   */</font>
01320   <font class="keywordflow">if</font> (!append_string_field_len (message, DBUS_HEADER_FIELD_SIGNATURE,
01321                                 DBUS_TYPE_STRING, signature,
01322                                 strlen (signature) - 1))
01323     _dbus_assert_not_reached (<font class="stringliteral">"reappending shorter signature shouldn't have failed"</font>);
01324 }
01325 
01333 <font class="keyword">static</font> <a class="code" href="structDBusMessage.html">DBusMessage</a>*
01334 dbus_message_new_empty_header (<font class="keywordtype">void</font>)
01335 {
01336   <a class="code" href="structDBusMessage.html">DBusMessage</a> *message;
01337   <font class="keywordtype">int</font> i;
01338   
01339   message = dbus_new0 (<a class="code" href="structDBusMessage.html">DBusMessage</a>, 1);
01340   <font class="keywordflow">if</font> (message == NULL)
01341     <font class="keywordflow">return</font> NULL;
01342   
01343   message-&gt;<a class="code" href="structDBusMessage.html#m0">refcount</a>.<a class="code" href="structDBusAtomic.html#m0">value</a> = 1;
01344   message-&gt;<a class="code" href="structDBusMessage.html#m7">byte_order</a> = DBUS_COMPILER_BYTE_ORDER;
01345   message-&gt;<a class="code" href="structDBusMessage.html#m3">client_serial</a> = 0;
01346   message-&gt;<a class="code" href="structDBusMessage.html#m4">reply_serial</a> = 0;
01347 
01348   _dbus_data_slot_list_init (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m12">slot_list</a>);
01349   
01350   i = 0;
01351   <font class="keywordflow">while</font> (i &lt;= DBUS_HEADER_FIELD_LAST)
01352     {
01353       message-&gt;<a class="code" href="structDBusMessage.html#m2">header_fields</a>[i].<a class="code" href="structHeaderField.html#m0">name_offset</a>  = -1;
01354       message-&gt;<a class="code" href="structDBusMessage.html#m2">header_fields</a>[i].<a class="code" href="structHeaderField.html#m1">value_offset</a> = -1;
01355       ++i;
01356     }
01357   
01358   <font class="keywordflow">if</font> (!_dbus_string_init_preallocated (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>, 64))
01359     {
01360       dbus_free (message);
01361       <font class="keywordflow">return</font> NULL;
01362     }
01363   
01364   <font class="keywordflow">if</font> (!_dbus_string_init_preallocated (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>, 64))
01365     {
01366       _dbus_string_free (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>);
01367       dbus_free (message);
01368       <font class="keywordflow">return</font> NULL;
01369     }
01370   
01371   <font class="keywordflow">return</font> message;
01372 }
01373 
01382 <a class="code" href="structDBusMessage.html">DBusMessage</a>*
<a name="l01383"></a><a class="code" href="group__DBusMessage.html#a5">01383</a> dbus_message_new (<font class="keywordtype">int</font> message_type)
01384 {
01385   <a class="code" href="structDBusMessage.html">DBusMessage</a> *message;
01386 
01387   _dbus_return_val_if_fail (message_type != DBUS_MESSAGE_TYPE_INVALID, NULL);
01388   
01389   message = dbus_message_new_empty_header ();
01390   <font class="keywordflow">if</font> (message == NULL)
01391     <font class="keywordflow">return</font> NULL;
01392   
01393   <font class="keywordflow">if</font> (!dbus_message_create_header (message,
01394                                    message_type,
01395                                    NULL, NULL, NULL, NULL, NULL))
01396     {
01397       dbus_message_unref (message);
01398       <font class="keywordflow">return</font> NULL;
01399     }
01400   
01401   <font class="keywordflow">return</font> message;
01402 }
01403 
01421 <a class="code" href="structDBusMessage.html">DBusMessage</a>*
<a name="l01422"></a><a class="code" href="group__DBusMessage.html#a6">01422</a> dbus_message_new_method_call (<font class="keyword">const</font> <font class="keywordtype">char</font> *service,
01423                               <font class="keyword">const</font> <font class="keywordtype">char</font> *path,
01424                               <font class="keyword">const</font> <font class="keywordtype">char</font> *interface,
01425                               <font class="keyword">const</font> <font class="keywordtype">char</font> *method)
01426 {
01427   <a class="code" href="structDBusMessage.html">DBusMessage</a> *message;
01428 
01429   _dbus_return_val_if_fail (path != NULL, NULL);
01430   _dbus_return_val_if_fail (method != NULL, NULL);
01431   
01432   message = dbus_message_new_empty_header ();
01433   <font class="keywordflow">if</font> (message == NULL)
01434     <font class="keywordflow">return</font> NULL;
01435   
01436   <font class="keywordflow">if</font> (!dbus_message_create_header (message,
01437                                    DBUS_MESSAGE_TYPE_METHOD_CALL,
01438                                    service, path, interface, method, NULL))
01439     {
01440       dbus_message_unref (message);
01441       <font class="keywordflow">return</font> NULL;
01442     }
01443   
01444   <font class="keywordflow">return</font> message;
01445 }
01446 
01456 <a class="code" href="structDBusMessage.html">DBusMessage</a>*
<a name="l01457"></a><a class="code" href="group__DBusMessage.html#a7">01457</a> dbus_message_new_method_return (<a class="code" href="structDBusMessage.html">DBusMessage</a> *method_call)
01458 {
01459   <a class="code" href="structDBusMessage.html">DBusMessage</a> *message;
01460   <font class="keyword">const</font> <font class="keywordtype">char</font> *sender;
01461 
01462   _dbus_return_val_if_fail (method_call != NULL, NULL);
01463   
01464   sender = get_string_field (method_call,
01465                              DBUS_HEADER_FIELD_SENDER,
01466                              NULL);
01467   
01468   <font class="comment">/* sender is allowed to be null here in peer-to-peer case */</font>
01469 
01470   message = dbus_message_new_empty_header ();
01471   <font class="keywordflow">if</font> (message == NULL)
01472     <font class="keywordflow">return</font> NULL;
01473   
01474   <font class="keywordflow">if</font> (!dbus_message_create_header (message,
01475                                    DBUS_MESSAGE_TYPE_METHOD_RETURN,
01476                                    sender, NULL, NULL, NULL, NULL))
01477     {
01478       dbus_message_unref (message);
01479       <font class="keywordflow">return</font> NULL;
01480     }
01481 
01482   dbus_message_set_no_reply (message, TRUE);
01483 
01484   <font class="keywordflow">if</font> (!dbus_message_set_reply_serial (message,
01485                                       dbus_message_get_serial (method_call)))
01486     {
01487       dbus_message_unref (message);
01488       <font class="keywordflow">return</font> NULL;
01489     }
01490 
01491   <font class="keywordflow">return</font> message;
01492 }
01493 
01506 <a class="code" href="structDBusMessage.html">DBusMessage</a>*
<a name="l01507"></a><a class="code" href="group__DBusMessage.html#a8">01507</a> dbus_message_new_signal (<font class="keyword">const</font> <font class="keywordtype">char</font> *path,
01508                          <font class="keyword">const</font> <font class="keywordtype">char</font> *interface,
01509                          <font class="keyword">const</font> <font class="keywordtype">char</font> *name)
01510 {
01511   <a class="code" href="structDBusMessage.html">DBusMessage</a> *message;
01512 
01513   _dbus_return_val_if_fail (path != NULL, NULL);
01514   _dbus_return_val_if_fail (interface != NULL, NULL);
01515   _dbus_return_val_if_fail (name != NULL, NULL);
01516   
01517   message = dbus_message_new_empty_header ();
01518   <font class="keywordflow">if</font> (message == NULL)
01519     <font class="keywordflow">return</font> NULL;
01520   
01521   <font class="keywordflow">if</font> (!dbus_message_create_header (message,
01522                                    DBUS_MESSAGE_TYPE_SIGNAL,
01523                                    NULL, path, interface, name, NULL))
01524     {
01525       dbus_message_unref (message);
01526       <font class="keywordflow">return</font> NULL;
01527     }
01528 
01529   dbus_message_set_no_reply (message, TRUE);
01530   
01531   <font class="keywordflow">return</font> message;
01532 }
01533 
01543 <a class="code" href="structDBusMessage.html">DBusMessage</a>*
<a name="l01544"></a><a class="code" href="group__DBusMessage.html#a9">01544</a> dbus_message_new_error (<a class="code" href="structDBusMessage.html">DBusMessage</a> *reply_to,
01545                         <font class="keyword">const</font> <font class="keywordtype">char</font>  *error_name,
01546                         <font class="keyword">const</font> <font class="keywordtype">char</font>  *error_message)
01547 {
01548   <a class="code" href="structDBusMessage.html">DBusMessage</a> *message;
01549   <font class="keyword">const</font> <font class="keywordtype">char</font> *sender;
01550   <a class="code" href="structDBusMessageIter.html">DBusMessageIter</a> iter;
01551 
01552   _dbus_return_val_if_fail (reply_to != NULL, NULL);
01553   _dbus_return_val_if_fail (error_name != NULL, NULL);
01554   _dbus_return_val_if_fail (is_valid_error_name (error_name), NULL);
01555   
01556   sender = get_string_field (reply_to,
01557                              DBUS_HEADER_FIELD_SENDER,
01558                              NULL);
01559 
01560   <font class="comment">/* sender may be NULL for non-message-bus case or</font>
01561 <font class="comment">   * when the message bus is dealing with an unregistered</font>
01562 <font class="comment">   * connection.</font>
01563 <font class="comment">   */</font>
01564   message = dbus_message_new_empty_header ();
01565   <font class="keywordflow">if</font> (message == NULL)
01566     <font class="keywordflow">return</font> NULL;
01567   
01568   <font class="keywordflow">if</font> (!dbus_message_create_header (message,
01569                                    DBUS_MESSAGE_TYPE_ERROR,
01570                                    sender, NULL, NULL, NULL, error_name))
01571     {
01572       dbus_message_unref (message);
01573       <font class="keywordflow">return</font> NULL;
01574     }
01575 
01576   dbus_message_set_no_reply (message, TRUE);
01577   
01578   <font class="keywordflow">if</font> (!dbus_message_set_reply_serial (message,
01579                                       dbus_message_get_serial (reply_to)))
01580     {
01581       dbus_message_unref (message);
01582       <font class="keywordflow">return</font> NULL;
01583     }
01584 
01585   <font class="keywordflow">if</font> (error_message != NULL)
01586     {
01587       dbus_message_append_iter_init (message, &amp;iter);
01588       <font class="keywordflow">if</font> (!dbus_message_iter_append_string (&amp;iter, error_message))
01589         {
01590           dbus_message_unref (message);
01591           <font class="keywordflow">return</font> NULL;
01592         }
01593     }
01594   
01595   <font class="keywordflow">return</font> message;
01596 }
01597 
01608 <a class="code" href="structDBusMessage.html">DBusMessage</a>*
<a name="l01609"></a><a class="code" href="group__DBusMessage.html#a10">01609</a> dbus_message_new_error_printf (<a class="code" href="structDBusMessage.html">DBusMessage</a> *reply_to,
01610                                <font class="keyword">const</font> <font class="keywordtype">char</font>  *error_name,
01611                                <font class="keyword">const</font> <font class="keywordtype">char</font>  *error_format,
01612                                ...)
01613 {
01614   va_list args;
01615   <a class="code" href="structDBusString.html">DBusString</a> str;
01616   <a class="code" href="structDBusMessage.html">DBusMessage</a> *message;
01617 
01618   _dbus_return_val_if_fail (reply_to != NULL, NULL);
01619   _dbus_return_val_if_fail (error_name != NULL, NULL);
01620   _dbus_return_val_if_fail (is_valid_error_name (error_name), NULL);
01621   
01622   <font class="keywordflow">if</font> (!_dbus_string_init (&amp;str))
01623     <font class="keywordflow">return</font> NULL;
01624 
01625   va_start (args, error_format);
01626 
01627   <font class="keywordflow">if</font> (_dbus_string_append_printf_valist (&amp;str, error_format, args))
01628     message = dbus_message_new_error (reply_to, error_name,
01629                                       _dbus_string_get_const_data (&amp;str));
01630   <font class="keywordflow">else</font>
01631     message = NULL;
01632   
01633   _dbus_string_free (&amp;str);
01634 
01635   va_end (args);
01636 
01637   <font class="keywordflow">return</font> message;
01638 }
01639 
01640 
01648 <a class="code" href="structDBusMessage.html">DBusMessage</a> *
<a name="l01649"></a><a class="code" href="group__DBusMessage.html#a11">01649</a> dbus_message_copy (<font class="keyword">const</font> <a class="code" href="structDBusMessage.html">DBusMessage</a> *message)
01650 {
01651   <a class="code" href="structDBusMessage.html">DBusMessage</a> *retval;
01652   <font class="keywordtype">int</font> i;
01653 
01654   _dbus_return_val_if_fail (message != NULL, NULL);
01655   
01656   retval = dbus_new0 (<a class="code" href="structDBusMessage.html">DBusMessage</a>, 1);
01657   <font class="keywordflow">if</font> (retval == NULL)
01658     <font class="keywordflow">return</font> NULL;
01659   
01660   retval-&gt;<a class="code" href="structDBusMessage.html#m0">refcount</a>.<a class="code" href="structDBusAtomic.html#m0">value</a> = 1;
01661   retval-&gt;<a class="code" href="structDBusMessage.html#m7">byte_order</a> = message-&gt;<a class="code" href="structDBusMessage.html#m7">byte_order</a>;
01662   retval-&gt;<a class="code" href="structDBusMessage.html#m3">client_serial</a> = message-&gt;<a class="code" href="structDBusMessage.html#m3">client_serial</a>;
01663   retval-&gt;<a class="code" href="structDBusMessage.html#m4">reply_serial</a> = message-&gt;<a class="code" href="structDBusMessage.html#m4">reply_serial</a>;
01664   retval-&gt;<a class="code" href="structDBusMessage.html#m5">header_padding</a> = message-&gt;<a class="code" href="structDBusMessage.html#m5">header_padding</a>;
01665   retval-&gt;<a class="code" href="structDBusMessage.html#m11">locked</a> = FALSE;
01666   
01667   <font class="keywordflow">if</font> (!_dbus_string_init_preallocated (&amp;retval-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>,
01668                                        _dbus_string_get_length (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>)))
01669     {
01670       dbus_free (retval);
01671       <font class="keywordflow">return</font> NULL;
01672     }
01673   
01674   <font class="keywordflow">if</font> (!_dbus_string_init_preallocated (&amp;retval-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>,
01675                                        _dbus_string_get_length (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>)))
01676     {
01677       _dbus_string_free (&amp;retval-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>);
01678       dbus_free (retval);
01679       <font class="keywordflow">return</font> NULL;
01680     }
01681   
01682   <font class="keywordflow">if</font> (!_dbus_string_copy (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>, 0,
01683                           &amp;retval-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>, 0))
01684     <font class="keywordflow">goto</font> failed_copy;
01685 
01686   <font class="keywordflow">if</font> (!_dbus_string_copy (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>, 0,
01687                           &amp;retval-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>, 0))
01688     <font class="keywordflow">goto</font> failed_copy;
01689   
01690   <font class="keywordflow">for</font> (i = 0; i &lt;= DBUS_HEADER_FIELD_LAST; i++)
01691     {
01692       retval-&gt;<a class="code" href="structDBusMessage.html#m2">header_fields</a>[i] = message-&gt;<a class="code" href="structDBusMessage.html#m2">header_fields</a>[i];
01693     }
01694   
01695   <font class="keywordflow">return</font> retval;
01696 
01697  failed_copy:
01698   _dbus_string_free (&amp;retval-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>);
01699   _dbus_string_free (&amp;retval-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>);
01700   dbus_free (retval);
01701   
01702   <font class="keywordflow">return</font> NULL;  
01703 }
01704 
01705 
01713 <a class="code" href="structDBusMessage.html">DBusMessage</a> *
<a name="l01714"></a><a class="code" href="group__DBusMessage.html#a12">01714</a> dbus_message_ref (<a class="code" href="structDBusMessage.html">DBusMessage</a> *message)
01715 {
01716   dbus_int32_t old_refcount;
01717 
01718   _dbus_return_val_if_fail (message != NULL, NULL);
01719   
01720   old_refcount = _dbus_atomic_inc (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m0">refcount</a>);
01721   _dbus_assert (old_refcount &gt;= 1);
01722 
01723   <font class="keywordflow">return</font> message;
01724 }
01725 
01726 <font class="keyword">static</font> <font class="keywordtype">void</font>
01727 free_size_counter (<font class="keywordtype">void</font> *element,
01728                    <font class="keywordtype">void</font> *data)
01729 {
01730   <a class="code" href="structDBusCounter.html">DBusCounter</a> *counter = element;
01731   <a class="code" href="structDBusMessage.html">DBusMessage</a> *message = data;
01732   
01733   _dbus_counter_adjust (counter, - message-&gt;<a class="code" href="structDBusMessage.html#m9">size_counter_delta</a>);
01734 
01735   _dbus_counter_unref (counter);
01736 }
01737 
01744 <font class="keywordtype">void</font>
<a name="l01745"></a><a class="code" href="group__DBusMessage.html#a14">01745</a> dbus_message_unref (<a class="code" href="structDBusMessage.html">DBusMessage</a> *message)
01746 {
01747  dbus_int32_t old_refcount;
01748 
01749   _dbus_return_if_fail (message != NULL);
01750   
01751   old_refcount = _dbus_atomic_dec (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m0">refcount</a>);
01752   
01753   _dbus_assert (old_refcount &gt;= 0);
01754 
01755   <font class="keywordflow">if</font> (old_refcount == 1)
01756     {
01757       <font class="comment">/* This calls application callbacks! */</font>
01758       _dbus_data_slot_list_free (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m12">slot_list</a>);
01759       
01760       _dbus_list_foreach (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m8">size_counters</a>,
01761                           free_size_counter, message);
01762       _dbus_list_clear (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m8">size_counters</a>);
01763       
01764       _dbus_string_free (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>);
01765       _dbus_string_free (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>);
01766       
01767       dbus_free (message);
01768     }
01769 }
01770 
01782 <font class="keywordtype">int</font>
<a name="l01783"></a><a class="code" href="group__DBusMessage.html#a15">01783</a> dbus_message_get_type (<a class="code" href="structDBusMessage.html">DBusMessage</a> *message)
01784 {
01785   <font class="keywordtype">int</font> type;
01786 
01787   type = _dbus_string_get_byte (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>, 1);
01788   _dbus_assert (type != DBUS_MESSAGE_TYPE_INVALID);
01789 
01790   <font class="keywordflow">return</font> type;
01791 }
01792 
01802 dbus_bool_t
<a name="l01803"></a><a class="code" href="group__DBusMessage.html#a16">01803</a> dbus_message_set_path (<a class="code" href="structDBusMessage.html">DBusMessage</a>   *message,
01804                        <font class="keyword">const</font> <font class="keywordtype">char</font>    *object_path)
01805 {
01806   _dbus_return_val_if_fail (message != NULL, FALSE);
01807   _dbus_return_val_if_fail (!message-&gt;<a class="code" href="structDBusMessage.html#m11">locked</a>, FALSE);
01808 
01809   <font class="keywordflow">return</font> set_string_field (message,
01810                            DBUS_HEADER_FIELD_PATH,
01811                            DBUS_TYPE_OBJECT_PATH,
01812                            object_path);
01813 }
01814 
01823 <font class="keyword">const</font> <font class="keywordtype">char</font>*
<a name="l01824"></a><a class="code" href="group__DBusMessage.html#a17">01824</a> dbus_message_get_path (<a class="code" href="structDBusMessage.html">DBusMessage</a>   *message)
01825 {
01826   _dbus_return_val_if_fail (message != NULL, NULL);
01827   
01828   <font class="keywordflow">return</font> get_string_field (message, DBUS_HEADER_FIELD_PATH, NULL);
01829 }
01830 
01846 dbus_bool_t
<a name="l01847"></a><a class="code" href="group__DBusMessage.html#a18">01847</a> dbus_message_get_path_decomposed (<a class="code" href="structDBusMessage.html">DBusMessage</a>   *message,
01848                                   <font class="keywordtype">char</font>        ***path)
01849 {
01850   _dbus_return_val_if_fail (message != NULL, FALSE);
01851   _dbus_return_val_if_fail (path != NULL, FALSE);
01852 
01853   <font class="keywordflow">return</font> get_path_field_decomposed (message,
01854                                     DBUS_HEADER_FIELD_PATH,
01855                                     path);
01856 }
01857 
01868 dbus_bool_t
<a name="l01869"></a><a class="code" href="group__DBusMessage.html#a19">01869</a> dbus_message_set_interface (<a class="code" href="structDBusMessage.html">DBusMessage</a>  *message,
01870                             <font class="keyword">const</font> <font class="keywordtype">char</font>   *interface)
01871 {
01872   _dbus_return_val_if_fail (message != NULL, FALSE);
01873   _dbus_return_val_if_fail (!message-&gt;<a class="code" href="structDBusMessage.html#m11">locked</a>, FALSE);
01874 
01875   <font class="keywordflow">return</font> set_string_field (message,
01876                            DBUS_HEADER_FIELD_INTERFACE,
01877                            DBUS_TYPE_STRING,
01878                            interface);
01879 }
01880 
01890 <font class="keyword">const</font> <font class="keywordtype">char</font>*
<a name="l01891"></a><a class="code" href="group__DBusMessage.html#a20">01891</a> dbus_message_get_interface (<a class="code" href="structDBusMessage.html">DBusMessage</a> *message)
01892 {
01893   _dbus_return_val_if_fail (message != NULL, NULL);
01894   
01895   <font class="keywordflow">return</font> get_string_field (message, DBUS_HEADER_FIELD_INTERFACE, NULL);
01896 }
01897 
01908 dbus_bool_t
<a name="l01909"></a><a class="code" href="group__DBusMessage.html#a21">01909</a> dbus_message_set_member (<a class="code" href="structDBusMessage.html">DBusMessage</a>  *message,
01910                        <font class="keyword">const</font> <font class="keywordtype">char</font>   *member)
01911 {
01912   _dbus_return_val_if_fail (message != NULL, FALSE);
01913   _dbus_return_val_if_fail (!message-&gt;<a class="code" href="structDBusMessage.html#m11">locked</a>, FALSE);
01914 
01915   <font class="keywordflow">return</font> set_string_field (message,
01916                            DBUS_HEADER_FIELD_MEMBER,
01917                            DBUS_TYPE_STRING,
01918                            member);
01919 }
01920 
01929 <font class="keyword">const</font> <font class="keywordtype">char</font>*
<a name="l01930"></a><a class="code" href="group__DBusMessage.html#a22">01930</a> dbus_message_get_member (<a class="code" href="structDBusMessage.html">DBusMessage</a> *message)
01931 {
01932   _dbus_return_val_if_fail (message != NULL, NULL);
01933   
01934   <font class="keywordflow">return</font> get_string_field (message,
01935                            DBUS_HEADER_FIELD_MEMBER,
01936                            NULL);
01937 }
01938 
01947 dbus_bool_t
<a name="l01948"></a><a class="code" href="group__DBusMessage.html#a23">01948</a> dbus_message_set_error_name (<a class="code" href="structDBusMessage.html">DBusMessage</a>  *message,
01949                              <font class="keyword">const</font> <font class="keywordtype">char</font>   *error_name)
01950 {
01951   _dbus_return_val_if_fail (message != NULL, FALSE);
01952   _dbus_return_val_if_fail (!message-&gt;<a class="code" href="structDBusMessage.html#m11">locked</a>, FALSE);
01953   _dbus_return_val_if_fail (error_name == NULL || is_valid_error_name (error_name), FALSE);
01954   
01955   <font class="keywordflow">return</font> set_string_field (message,
01956                            DBUS_HEADER_FIELD_ERROR_NAME,
01957                            DBUS_TYPE_STRING,
01958                            error_name);
01959 }
01960 
01967 <font class="keyword">const</font> <font class="keywordtype">char</font>*
<a name="l01968"></a><a class="code" href="group__DBusMessage.html#a24">01968</a> dbus_message_get_error_name (<a class="code" href="structDBusMessage.html">DBusMessage</a> *message)
01969 {
01970   _dbus_return_val_if_fail (message != NULL, NULL);
01971   
01972   <font class="keywordflow">return</font> get_string_field (message,
01973                            DBUS_HEADER_FIELD_ERROR_NAME,
01974                            NULL);
01975 }
01976 
01984 dbus_bool_t
<a name="l01985"></a><a class="code" href="group__DBusMessage.html#a25">01985</a> dbus_message_set_destination (<a class="code" href="structDBusMessage.html">DBusMessage</a>  *message,
01986                               <font class="keyword">const</font> <font class="keywordtype">char</font>   *destination)
01987 {
01988   _dbus_return_val_if_fail (message != NULL, FALSE);
01989   _dbus_return_val_if_fail (!message-&gt;<a class="code" href="structDBusMessage.html#m11">locked</a>, FALSE);
01990 
01991   <font class="keywordflow">return</font> set_string_field (message,
01992                            DBUS_HEADER_FIELD_DESTINATION,
01993                            DBUS_TYPE_STRING,
01994                            destination);
01995 }
01996 
02003 <font class="keyword">const</font> <font class="keywordtype">char</font>*
<a name="l02004"></a><a class="code" href="group__DBusMessage.html#a26">02004</a> dbus_message_get_destination (<a class="code" href="structDBusMessage.html">DBusMessage</a> *message)
02005 {
02006   _dbus_return_val_if_fail (message != NULL, NULL);
02007   
02008   <font class="keywordflow">return</font> get_string_field (message,
02009                            DBUS_HEADER_FIELD_DESTINATION,
02010                            NULL);
02011 }
02012 
02031 dbus_bool_t
<a name="l02032"></a><a class="code" href="group__DBusMessage.html#a27">02032</a> dbus_message_append_args (<a class="code" href="structDBusMessage.html">DBusMessage</a> *message,
02033                           <font class="keywordtype">int</font> first_arg_type,
02034                           ...)
02035 {
02036   dbus_bool_t retval;
02037   va_list var_args;
02038 
02039   _dbus_return_val_if_fail (message != NULL, FALSE);
02040   
02041   va_start (var_args, first_arg_type);
02042   retval = dbus_message_append_args_valist (message,
02043                                             first_arg_type,
02044                                             var_args);
02045   va_end (var_args);
02046 
02047   <font class="keywordflow">return</font> retval;
02048 }
02049 
02062 dbus_bool_t
<a name="l02063"></a><a class="code" href="group__DBusMessage.html#a28">02063</a> dbus_message_get_args (<a class="code" href="structDBusMessage.html">DBusMessage</a>     *message,
02064                        <a class="code" href="structDBusError.html">DBusError</a>       *error,
02065                        <font class="keywordtype">int</font>              first_arg_type,
02066                        ...)
02067 {
02068   dbus_bool_t retval;
02069   va_list var_args;
02070 
02071   _dbus_return_val_if_fail (message != NULL, FALSE);
02072   _dbus_return_val_if_error_is_set (error, FALSE);
02073   
02074   va_start (var_args, first_arg_type);
02075   retval = dbus_message_get_args_valist (message, error, first_arg_type, var_args);
02076   va_end (var_args);
02077 
02078   <font class="keywordflow">return</font> retval;
02079 }
02080 
02093 dbus_bool_t
<a name="l02094"></a><a class="code" href="group__DBusMessage.html#a29">02094</a> dbus_message_get_args_valist (<a class="code" href="structDBusMessage.html">DBusMessage</a>     *message,
02095                               <a class="code" href="structDBusError.html">DBusError</a>       *error,
02096                               <font class="keywordtype">int</font>              first_arg_type,
02097                               va_list          var_args)
02098 {
02099   <a class="code" href="structDBusMessageIter.html">DBusMessageIter</a> iter;
02100 
02101   _dbus_return_val_if_fail (message != NULL, FALSE);
02102   _dbus_return_val_if_error_is_set (error, FALSE);
02103   
02104   dbus_message_iter_init (message, &amp;iter);
02105   <font class="keywordflow">return</font> dbus_message_iter_get_args_valist (&amp;iter, error, first_arg_type, var_args);
02106 }
02107 
02120 dbus_bool_t
<a name="l02121"></a><a class="code" href="group__DBusMessage.html#a30">02121</a> dbus_message_iter_get_args (<a class="code" href="structDBusMessageIter.html">DBusMessageIter</a> *iter,
02122                             <a class="code" href="structDBusError.html">DBusError</a>       *error,
02123                             <font class="keywordtype">int</font>              first_arg_type,
02124                             ...)
02125 {
02126   dbus_bool_t retval;
02127   va_list var_args;
02128 
02129   _dbus_return_val_if_fail (iter != NULL, FALSE);
02130   _dbus_return_val_if_error_is_set (error, FALSE);
02131   
02132   va_start (var_args, first_arg_type);
02133   retval = dbus_message_iter_get_args_valist (iter, error, first_arg_type, var_args);
02134   va_end (var_args);
02135 
02136   <font class="keywordflow">return</font> retval;
02137 }
02138 
02147 dbus_bool_t
<a name="l02148"></a><a class="code" href="group__DBusMessage.html#a31">02148</a> dbus_message_iter_init (<a class="code" href="structDBusMessage.html">DBusMessage</a>     *message,
02149                         <a class="code" href="structDBusMessageIter.html">DBusMessageIter</a> *iter)
02150 {
02151   DBusMessageRealIter *real = (DBusMessageRealIter *)iter;
02152 
02153   _dbus_return_val_if_fail (message != NULL, FALSE);
02154   _dbus_return_val_if_fail (iter != NULL, FALSE);
02155   
02156   _dbus_assert (<font class="keyword">sizeof</font> (DBusMessageRealIter) &lt;= <font class="keyword">sizeof</font> (<a class="code" href="structDBusMessageIter.html">DBusMessageIter</a>));
02157   
02158   real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a> = message;
02159   real-&gt;<a class="code" href="structDBusMessageRealIter.html#m0">parent_iter</a> = NULL;
02160   real-&gt;<a class="code" href="structDBusMessageRealIter.html#m2">changed_stamp</a> = message-&gt;<a class="code" href="structDBusMessage.html#m10">changed_stamp</a>;
02161   
02162   real-&gt;<a class="code" href="structDBusMessageRealIter.html#m3">type</a> = DBUS_MESSAGE_ITER_TYPE_MESSAGE;
02163   real-&gt;<a class="code" href="structDBusMessageRealIter.html#m4">pos</a> = 0;
02164   real-&gt;<a class="code" href="structDBusMessageRealIter.html#m5">end</a> = _dbus_string_get_length (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>);
02165   
02166   real-&gt;<a class="code" href="structDBusMessageRealIter.html#m6">container_start</a> = 0;
02167   real-&gt;<a class="code" href="structDBusMessageRealIter.html#m7">container_length_pos</a> = 0;
02168   real-&gt;<a class="code" href="structDBusMessageRealIter.html#m8">wrote_dict_key</a> = 0;
02169   real-&gt;<a class="code" href="structDBusMessageRealIter.html#m9">array_type_pos</a> = 0;
02170 
02171   <font class="keywordflow">return</font> real-&gt;<a class="code" href="structDBusMessageRealIter.html#m5">end</a> &gt; real-&gt;<a class="code" href="structDBusMessageRealIter.html#m4">pos</a>;
02172 }
02173 
02174 <font class="preprocessor">#ifndef DBUS_DISABLE_CHECKS</font>
02175 <font class="preprocessor"></font><font class="keyword">static</font> dbus_bool_t
02176 dbus_message_iter_check (DBusMessageRealIter *iter)
02177 {
02178   <font class="keywordflow">if</font> (iter == NULL)
02179     {
02180       _dbus_warn (<font class="stringliteral">"dbus iterator check failed: iterator is NULL\n"</font>);
02181       <font class="keywordflow">return</font> FALSE;
02182     }
02183   
02184   <font class="keywordflow">if</font> (iter-&gt;<a class="code" href="structDBusMessageRealIter.html#m2">changed_stamp</a> != iter-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m10">changed_stamp</a>)
02185     {
02186       _dbus_warn (<font class="stringliteral">"dbus iterator check failed: invalid iterator, must re-initialize it after modifying the message\n"</font>);
02187       <font class="keywordflow">return</font> FALSE;
02188     }
02189   
02190   <font class="keywordflow">if</font> (iter-&gt;<a class="code" href="structDBusMessageRealIter.html#m4">pos</a> &lt; 0 || iter-&gt;<a class="code" href="structDBusMessageRealIter.html#m4">pos</a> &gt; iter-&gt;<a class="code" href="structDBusMessageRealIter.html#m5">end</a>)
02191     {
02192       _dbus_warn (<font class="stringliteral">"dbus iterator check failed: invalid position\n"</font>);
02193       <font class="keywordflow">return</font> FALSE;
02194     }
02195 
02196   <font class="keywordflow">return</font> TRUE;
02197 }
02198 <font class="preprocessor">#endif </font><font class="comment">/* DBUS_DISABLE_CHECKS */</font>
02199 
02200 <font class="keyword">static</font> <font class="keywordtype">int</font>
02201 skip_array_type (DBusMessageRealIter *iter, <font class="keywordtype">int</font> pos)
02202 {
02203   <font class="keyword">const</font> <font class="keywordtype">char</font> *data;
02204 
02205   <font class="keywordflow">do</font>
02206     {
02207       data = _dbus_string_get_const_data_len (&amp;iter-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>,
02208                                               pos++, 1);
02209     }
02210   <font class="keywordflow">while</font> (*data == DBUS_TYPE_ARRAY);
02211   
02212   <font class="keywordflow">return</font> pos;
02213 }
02214 
02215 <font class="comment">/* FIXME what are these _dbus_type_is_valid() checks for?</font>
02216 <font class="comment"> * haven't we validated the message?</font>
02217 <font class="comment"> */</font>
02218 <font class="keyword">static</font> <font class="keywordtype">int</font>
02219 dbus_message_iter_get_data_start (DBusMessageRealIter *iter, <font class="keywordtype">int</font> *type)
02220 {
02221   <font class="keyword">const</font> <font class="keywordtype">char</font> *data;
02222   <font class="keywordtype">int</font> pos, len;
02223   
02224   <font class="keywordflow">switch</font> (iter-&gt;<a class="code" href="structDBusMessageRealIter.html#m3">type</a>)
02225     {
02226     <font class="keywordflow">case</font> DBUS_MESSAGE_ITER_TYPE_MESSAGE:
02227       data = _dbus_string_get_const_data_len (&amp;iter-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>,
02228                                               iter-&gt;<a class="code" href="structDBusMessageRealIter.html#m4">pos</a>, 1);
02229       <font class="keywordflow">if</font> (_dbus_type_is_valid (*data))
02230         *type = *data;
02231       <font class="keywordflow">else</font>
02232         *type = DBUS_TYPE_INVALID;
02233       
02234       <font class="keywordflow">return</font> skip_array_type (iter, iter-&gt;<a class="code" href="structDBusMessageRealIter.html#m4">pos</a>);
02235       
02236     <font class="keywordflow">case</font> DBUS_MESSAGE_ITER_TYPE_ARRAY:
02237       data = _dbus_string_get_const_data_len (&amp;iter-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>,
02238                                               iter-&gt;<a class="code" href="structDBusMessageRealIter.html#m9">array_type_pos</a>, 1);
02239       <font class="keywordflow">if</font> (_dbus_type_is_valid (*data))
02240         *type = *data;
02241       <font class="keywordflow">else</font>
02242         *type = DBUS_TYPE_INVALID;
02243       
02244       <font class="keywordflow">return</font> iter-&gt;<a class="code" href="structDBusMessageRealIter.html#m4">pos</a>;
02245       
02246     <font class="keywordflow">case</font> DBUS_MESSAGE_ITER_TYPE_DICT:
02247       <font class="comment">/* Get the length of the string */</font>
02248       len = _dbus_demarshal_uint32 (&amp;iter-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>,
02249                                     iter-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m7">byte_order</a>,
02250                                     iter-&gt;<a class="code" href="structDBusMessageRealIter.html#m4">pos</a>, &amp;pos);
02251       pos = pos + len + 1;
02252 
02253       data = _dbus_string_get_const_data_len (&amp;iter-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>,
02254                                               pos, 1);
02255       <font class="keywordflow">if</font> (_dbus_type_is_valid (*data))
02256         *type = *data;
02257       <font class="keywordflow">else</font>
02258         *type = DBUS_TYPE_INVALID;
02259 
02260       <font class="keywordflow">return</font> skip_array_type (iter, pos);
02261       
02262     <font class="keywordflow">default</font>:
02263       _dbus_assert_not_reached (<font class="stringliteral">"Invalid iter type"</font>);
02264       <font class="keywordflow">break</font>;
02265     }
02266   *type = DBUS_TYPE_INVALID;
02267   <font class="keywordflow">return</font> iter-&gt;<a class="code" href="structDBusMessageRealIter.html#m4">pos</a>;
02268 }
02269 
02270 
02278 dbus_bool_t
<a name="l02279"></a><a class="code" href="group__DBusMessage.html#a35">02279</a> dbus_message_iter_has_next (<a class="code" href="structDBusMessageIter.html">DBusMessageIter</a> *iter)
02280 {
02281   DBusMessageRealIter *real = (DBusMessageRealIter *)iter;
02282   <font class="keywordtype">int</font> end_pos;
02283   <font class="keywordtype">int</font> type, pos;
02284 
02285   _dbus_return_val_if_fail (dbus_message_iter_check (real), FALSE);
02286 
02287   <font class="keywordflow">if</font> (real-&gt;<a class="code" href="structDBusMessageRealIter.html#m4">pos</a> &gt;= real-&gt;<a class="code" href="structDBusMessageRealIter.html#m5">end</a>)
02288     <font class="keywordflow">return</font> FALSE;
02289   
02290   pos = dbus_message_iter_get_data_start (real, &amp;type);
02291   
02292   <font class="keywordflow">if</font> (!_dbus_marshal_get_arg_end_pos (&amp;real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>,
02293                                       real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m7">byte_order</a>,
02294                                       type, pos, &amp;end_pos))
02295     <font class="keywordflow">return</font> FALSE;
02296   
02297   <font class="keywordflow">if</font> (end_pos &gt;= real-&gt;<a class="code" href="structDBusMessageRealIter.html#m5">end</a>)
02298     <font class="keywordflow">return</font> FALSE;
02299 
02300   <font class="keywordflow">return</font> TRUE;  
02301 }
02302 
02309 dbus_bool_t
<a name="l02310"></a><a class="code" href="group__DBusMessage.html#a36">02310</a> dbus_message_iter_next (<a class="code" href="structDBusMessageIter.html">DBusMessageIter</a> *iter)
02311 {
02312   DBusMessageRealIter *real = (DBusMessageRealIter *)iter;
02313   <font class="keywordtype">int</font> end_pos;
02314   <font class="keywordtype">int</font> type, pos;
02315 
02316   _dbus_return_val_if_fail (dbus_message_iter_check (real), FALSE);
02317 
02318   pos = dbus_message_iter_get_data_start (real, &amp;type);
02319   
02320   <font class="keywordflow">if</font> (!_dbus_marshal_get_arg_end_pos (&amp;real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>,
02321                                       real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m7">byte_order</a>,
02322                                       type, pos, &amp;end_pos))
02323     <font class="keywordflow">return</font> FALSE;
02324 
02325   <font class="keywordflow">if</font> (end_pos &gt;= real-&gt;<a class="code" href="structDBusMessageRealIter.html#m5">end</a>)
02326     <font class="keywordflow">return</font> FALSE;
02327 
02328   real-&gt;<a class="code" href="structDBusMessageRealIter.html#m4">pos</a> = end_pos;
02329 
02330   <font class="keywordflow">return</font> TRUE;
02331 }
02332 
02340 <font class="keywordtype">int</font>
<a name="l02341"></a><a class="code" href="group__DBusMessage.html#a37">02341</a> dbus_message_iter_get_arg_type (<a class="code" href="structDBusMessageIter.html">DBusMessageIter</a> *iter)
02342 {
02343   DBusMessageRealIter *real = (DBusMessageRealIter *)iter;
02344   <font class="keywordtype">int</font> type, pos;
02345 
02346   _dbus_return_val_if_fail (dbus_message_iter_check (real), DBUS_TYPE_INVALID);
02347 
02348   <font class="keywordflow">if</font> (real-&gt;<a class="code" href="structDBusMessageRealIter.html#m4">pos</a> &gt;= real-&gt;<a class="code" href="structDBusMessageRealIter.html#m5">end</a>)
02349     {
02350       _dbus_verbose (<font class="stringliteral">"  iterator at or beyond end of message\n"</font>);
02351       <font class="keywordflow">return</font> DBUS_TYPE_INVALID;
02352     }
02353 
02354   pos = dbus_message_iter_get_data_start (real, &amp;type);
02355   
02356   <font class="keywordflow">return</font> type;
02357 }
02358 
02359 <font class="comment">/* FIXME why do we validate the typecode in here, hasn't the message</font>
02360 <font class="comment"> * already been verified?</font>
02361 <font class="comment"> */</font>
02362 <font class="keyword">static</font> <font class="keywordtype">int</font>
02363 iter_get_array_type (DBusMessageRealIter *iter, <font class="keywordtype">int</font> *array_type_pos)
02364 {
02365   <font class="keyword">const</font> <font class="keywordtype">char</font> *data;
02366   <font class="keywordtype">int</font> _array_type_pos;
02367   <font class="keywordtype">int</font> len, pos;
02368   
02369   <font class="keywordflow">switch</font> (iter-&gt;<a class="code" href="structDBusMessageRealIter.html#m3">type</a>)
02370     {
02371     <font class="keywordflow">case</font> DBUS_MESSAGE_ITER_TYPE_MESSAGE:
02372       _array_type_pos = iter-&gt;<a class="code" href="structDBusMessageRealIter.html#m4">pos</a> + 1;
02373       <font class="keywordflow">break</font>;
02374     <font class="keywordflow">case</font> DBUS_MESSAGE_ITER_TYPE_ARRAY:
02375       _array_type_pos = iter-&gt;<a class="code" href="structDBusMessageRealIter.html#m9">array_type_pos</a> + 1;
02376       <font class="keywordflow">break</font>;
02377     <font class="keywordflow">case</font> DBUS_MESSAGE_ITER_TYPE_DICT:
02378       <font class="comment">/* Get the length of the string */</font>
02379       len = _dbus_demarshal_uint32 (&amp;iter-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>,
02380                                     iter-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m7">byte_order</a>,
02381                                     iter-&gt;<a class="code" href="structDBusMessageRealIter.html#m4">pos</a>, &amp;pos);
02382       pos = pos + len + 1;
02383       data = _dbus_string_get_const_data_len (&amp;iter-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>,
02384                                               pos + 1, 1);
02385       _array_type_pos = pos + 1;
02386       <font class="keywordflow">break</font>;
02387     <font class="keywordflow">default</font>:
02388       _dbus_assert_not_reached (<font class="stringliteral">"wrong iter type"</font>);
02389       <font class="keywordflow">return</font> DBUS_TYPE_INVALID;
02390     }
02391 
02392   <font class="keywordflow">if</font> (array_type_pos != NULL)
02393     *array_type_pos = _array_type_pos;
02394   
02395   data = _dbus_string_get_const_data_len (&amp;iter-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>,
02396                                           _array_type_pos, 1);
02397   <font class="keywordflow">if</font> (_dbus_type_is_valid (*data))
02398     <font class="keywordflow">return</font>  *data;
02399   
02400   <font class="keywordflow">return</font> DBUS_TYPE_INVALID;
02401 }
02402 
02403 
02413 <font class="keywordtype">int</font>
<a name="l02414"></a><a class="code" href="group__DBusMessage.html#a39">02414</a> dbus_message_iter_get_array_type (<a class="code" href="structDBusMessageIter.html">DBusMessageIter</a> *iter)
02415 {
02416   DBusMessageRealIter *real = (DBusMessageRealIter *)iter;
02417   <font class="keywordtype">int</font> type, pos;
02418 
02419   _dbus_return_val_if_fail (dbus_message_iter_check (real), DBUS_TYPE_INVALID);
02420 
02421   <font class="keywordflow">if</font> (real-&gt;<a class="code" href="structDBusMessageRealIter.html#m4">pos</a> &gt;= real-&gt;<a class="code" href="structDBusMessageRealIter.html#m5">end</a>)
02422     <font class="keywordflow">return</font> DBUS_TYPE_INVALID;
02423 
02424   pos = dbus_message_iter_get_data_start (real, &amp;type);
02425 
02426   _dbus_assert (type == DBUS_TYPE_ARRAY);
02427 
02428   <font class="keywordflow">return</font> iter_get_array_type (real, NULL);
02429 }
02430 
02431 
02441 <font class="keywordtype">char</font> *
<a name="l02442"></a><a class="code" href="group__DBusMessage.html#a40">02442</a> dbus_message_iter_get_string (<a class="code" href="structDBusMessageIter.html">DBusMessageIter</a> *iter)
02443 {
02444   DBusMessageRealIter *real = (DBusMessageRealIter *)iter;
02445   <font class="keywordtype">int</font> type, pos;
02446 
02447   _dbus_return_val_if_fail (dbus_message_iter_check (real), NULL);
02448   pos = dbus_message_iter_get_data_start (real, &amp;type);
02449   
02450   _dbus_assert (type == DBUS_TYPE_STRING);
02451 
02452   <font class="keywordflow">return</font> _dbus_demarshal_string (&amp;real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>, real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m7">byte_order</a>,
02453                                  pos, NULL);
02454 }
02455 
02465 <font class="keywordtype">char</font> *
<a name="l02466"></a><a class="code" href="group__DBusMessage.html#a41">02466</a> dbus_message_iter_get_object_path (<a class="code" href="structDBusMessageIter.html">DBusMessageIter</a>  *iter)
02467 {
02468   DBusMessageRealIter *real = (DBusMessageRealIter *)iter;
02469   <font class="keywordtype">int</font> type, pos;
02470 
02471   _dbus_return_val_if_fail (dbus_message_iter_check (real), NULL);
02472 
02473   pos = dbus_message_iter_get_data_start (real, &amp;type);
02474   
02475   _dbus_assert (type == DBUS_TYPE_OBJECT_PATH);
02476 
02477   <font class="keywordflow">return</font> _dbus_demarshal_string (&amp;real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>, real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m7">byte_order</a>,
02478                                  pos, NULL);
02479 }
02480 
02494 dbus_bool_t
<a name="l02495"></a><a class="code" href="group__DBusMessage.html#a42">02495</a> dbus_message_iter_get_custom (<a class="code" href="structDBusMessageIter.html">DBusMessageIter</a>   *iter,
02496                               <font class="keywordtype">char</font>             **name,
02497                               <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font>    **value,
02498                               <font class="keywordtype">int</font>               *len)
02499 {
02500   DBusMessageRealIter *real = (DBusMessageRealIter *)iter;
02501   <font class="keywordtype">int</font> type, pos;
02502   <font class="keywordtype">char</font> *_name;
02503 
02504   _dbus_return_val_if_fail (dbus_message_iter_check (real), FALSE);
02505 
02506   pos = dbus_message_iter_get_data_start (real, &amp;type);
02507   
02508   _dbus_assert (type == DBUS_TYPE_CUSTOM);
02509   
02510   _name = _dbus_demarshal_string (&amp;real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>, real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m7">byte_order</a>,
02511                                   pos, &amp;pos);
02512 
02513   <font class="keywordflow">if</font> (_name == NULL)
02514     <font class="keywordflow">return</font> FALSE;
02515   
02516   <font class="keywordflow">if</font> (!_dbus_demarshal_byte_array (&amp;real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>, real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m7">byte_order</a>,
02517                                    pos, NULL, value, len))
02518     {
02519       dbus_free (_name);
02520       <font class="keywordflow">return</font> FALSE;
02521     }
02522 
02523   *name = _name;
02524   
02525   <font class="keywordflow">return</font> TRUE;
02526 }
02527 
02528 <font class="keyword">static</font> <font class="keywordtype">void</font>
02529 _dbus_message_iter_get_basic_type (<a class="code" href="structDBusMessageIter.html">DBusMessageIter</a> *iter,
02530                                    <font class="keywordtype">char</font>             type,
02531                                    <font class="keywordtype">void</font>            *value)
02532 {
02533   DBusMessageRealIter *real = (DBusMessageRealIter *)iter;
02534   <font class="keywordtype">int</font> item_type, pos;
02535 
02536   _dbus_return_if_fail (dbus_message_iter_check (real));
02537 
02538   pos = dbus_message_iter_get_data_start (real, &amp;item_type);
02539   
02540   _dbus_assert (type == item_type);
02541   
02542   _dbus_demarshal_basic_type (&amp;real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>,
02543                               type, value,
02544                               real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m7">byte_order</a>,
02545                               &amp;pos);
02546 }
02547 
02548 
02571 dbus_bool_t
<a name="l02572"></a><a class="code" href="group__DBusMessage.html#a44">02572</a> dbus_message_iter_get_args_valist (<a class="code" href="structDBusMessageIter.html">DBusMessageIter</a> *iter,
02573                                    <a class="code" href="structDBusError.html">DBusError</a>       *error,
02574                                    <font class="keywordtype">int</font>              first_arg_type,
02575                                    va_list          var_args)
02576 {
02577   <font class="keywordtype">int</font> spec_type, msg_type, i;
02578   dbus_bool_t retval;
02579 
02580   _dbus_return_val_if_fail (iter != NULL, FALSE);
02581   _dbus_return_val_if_error_is_set (error, FALSE);
02582 
02583   retval = FALSE;
02584   
02585   spec_type = first_arg_type;
02586   i = 0;
02587   
02588   <font class="keywordflow">while</font> (spec_type != DBUS_TYPE_INVALID)
02589     {
02590       msg_type = dbus_message_iter_get_arg_type (iter);      
02591       
02592       <font class="keywordflow">if</font> (msg_type != spec_type)
02593         {
02594           dbus_set_error (error, DBUS_ERROR_INVALID_ARGS,
02595                           <font class="stringliteral">"Argument %d is specified to be of type \"%s\", but "</font>
02596                           <font class="stringliteral">"is actually of type \"%s\"\n"</font>, i,
02597                           _dbus_type_to_string (spec_type),
02598                           _dbus_type_to_string (msg_type));
02599 
02600           <font class="keywordflow">goto</font> out;
02601         }
02602 
02603       <font class="keywordflow">switch</font> (spec_type)
02604         {
02605         <font class="keywordflow">case</font> DBUS_TYPE_NIL:
02606           <font class="keywordflow">break</font>;
02607         <font class="keywordflow">case</font> DBUS_TYPE_BOOLEAN:
02608           {
02609             dbus_bool_t *ptr;
02610 
02611             ptr = va_arg (var_args, dbus_bool_t *);
02612 
02613             *ptr = dbus_message_iter_get_boolean (iter);
02614             <font class="keywordflow">break</font>;
02615           }
02616         <font class="keywordflow">case</font> DBUS_TYPE_BYTE:
02617         <font class="keywordflow">case</font> DBUS_TYPE_INT32:
02618         <font class="keywordflow">case</font> DBUS_TYPE_UINT32:
02619 <font class="preprocessor">#ifdef DBUS_HAVE_INT64</font>
02620 <font class="preprocessor"></font>        <font class="keywordflow">case</font> DBUS_TYPE_INT64:
02621         <font class="keywordflow">case</font> DBUS_TYPE_UINT64:
02622 <font class="preprocessor">#endif </font><font class="comment">/* DBUS_HAVE_INT64 */</font>
02623         <font class="keywordflow">case</font> DBUS_TYPE_DOUBLE:
02624           {
02625             <font class="keywordtype">void</font> *ptr = va_arg (var_args, <font class="keywordtype">void</font> *);
02626             _dbus_message_iter_get_basic_type (iter, spec_type, ptr);
02627             <font class="keywordflow">break</font>;
02628           }
02629 
02630         <font class="keywordflow">case</font> DBUS_TYPE_STRING:
02631           {
02632             <font class="keywordtype">char</font> **ptr;
02633 
02634             ptr = va_arg (var_args, <font class="keywordtype">char</font> **);
02635 
02636             *ptr = dbus_message_iter_get_string (iter);
02637 
02638             <font class="keywordflow">if</font> (!*ptr)
02639               {
02640                 dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
02641                 <font class="keywordflow">goto</font> out;
02642               }
02643             
02644             <font class="keywordflow">break</font>;
02645           }
02646 
02647           <font class="keywordflow">case</font> DBUS_TYPE_OBJECT_PATH:
02648           {
02649             <font class="keywordtype">char</font> **ptr;
02650 
02651             ptr = va_arg (var_args, <font class="keywordtype">char</font> **);
02652 
02653             *ptr = dbus_message_iter_get_object_path (iter);
02654 
02655             <font class="keywordflow">if</font> (!*ptr)
02656               {
02657                 dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
02658                 <font class="keywordflow">goto</font> out;
02659               }
02660 
02661             <font class="keywordflow">break</font>;
02662           }
02663 
02664         <font class="keywordflow">case</font> DBUS_TYPE_CUSTOM:
02665           {
02666             <font class="keywordtype">char</font> **name;
02667             <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> **data;
02668             <font class="keywordtype">int</font> *len;
02669  
02670             name = va_arg (var_args, <font class="keywordtype">char</font> **);
02671             data = va_arg (var_args, <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> **);
02672             len = va_arg (var_args, <font class="keywordtype">int</font> *);
02673 
02674             <font class="keywordflow">if</font> (!dbus_message_iter_get_custom (iter, name, data, len))
02675               {
02676                 dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
02677                 <font class="keywordflow">goto</font> out;
02678               }
02679           }
02680           <font class="keywordflow">break</font>;
02681         <font class="keywordflow">case</font> DBUS_TYPE_ARRAY:
02682           {
02683             <font class="keywordtype">void</font> **data;
02684             <font class="keywordtype">int</font> *len, type;
02685             dbus_bool_t err = FALSE;
02686  
02687             type = va_arg (var_args, <font class="keywordtype">int</font>);
02688             data = va_arg (var_args, <font class="keywordtype">void</font> *);
02689             len = va_arg (var_args, <font class="keywordtype">int</font> *);
02690 
02691             _dbus_return_val_if_fail (data != NULL, FALSE);
02692             _dbus_return_val_if_fail (len != NULL, FALSE);
02693             
02694             <font class="keywordflow">if</font> (dbus_message_iter_get_array_type (iter) != type)
02695               {
02696                 dbus_set_error (error, DBUS_ERROR_INVALID_ARGS,
02697                                 <font class="stringliteral">"Argument %d is specified to be of type \"array of %s\", but "</font>
02698                                 <font class="stringliteral">"is actually of type \"array of %s\"\n"</font>, i,
02699                                 _dbus_type_to_string (type),
02700                                 _dbus_type_to_string (dbus_message_iter_get_array_type (iter)));
02701                 <font class="keywordflow">goto</font> out;
02702               }
02703             
02704             <font class="keywordflow">switch</font> (type)
02705               {
02706               <font class="keywordflow">case</font> DBUS_TYPE_BYTE:
02707                 err = !dbus_message_iter_get_byte_array (iter, (<font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> **)data, len);
02708                 <font class="keywordflow">break</font>;
02709               <font class="keywordflow">case</font> DBUS_TYPE_BOOLEAN:
02710                 err = !dbus_message_iter_get_boolean_array (iter, (<font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> **)data, len);
02711                 <font class="keywordflow">break</font>;
02712               <font class="keywordflow">case</font> DBUS_TYPE_INT32:
02713                 err = !dbus_message_iter_get_int32_array (iter, (dbus_int32_t **)data, len);
02714                 <font class="keywordflow">break</font>;
02715               <font class="keywordflow">case</font> DBUS_TYPE_UINT32:
02716                 err = !dbus_message_iter_get_uint32_array (iter, (dbus_uint32_t **)data, len);
02717                 <font class="keywordflow">break</font>;
02718 <font class="preprocessor">#ifdef DBUS_HAVE_INT64</font>
02719 <font class="preprocessor"></font>              <font class="keywordflow">case</font> DBUS_TYPE_INT64:
02720                 err = !dbus_message_iter_get_int64_array (iter, (dbus_int64_t **)data, len);
02721                 <font class="keywordflow">break</font>;
02722               <font class="keywordflow">case</font> DBUS_TYPE_UINT64:
02723                 err = !dbus_message_iter_get_uint64_array (iter, (dbus_uint64_t **)data, len);
02724                 <font class="keywordflow">break</font>;
02725 <font class="preprocessor">#endif </font><font class="comment">/* DBUS_HAVE_INT64 */</font>
02726               <font class="keywordflow">case</font> DBUS_TYPE_DOUBLE:
02727                 err = !dbus_message_iter_get_double_array (iter, (<font class="keywordtype">double</font> **)data, len);
02728                 <font class="keywordflow">break</font>;
02729               <font class="keywordflow">case</font> DBUS_TYPE_STRING:
02730                 err = !dbus_message_iter_get_string_array (iter, (<font class="keywordtype">char</font> ***)data, len);
02731                 <font class="keywordflow">break</font>;
02732               <font class="keywordflow">case</font> DBUS_TYPE_OBJECT_PATH:
02733                 err = !dbus_message_iter_get_object_path_array (iter, (<font class="keywordtype">char</font> ***)data, len);
02734                 <font class="keywordflow">break</font>;
02735 
02736               <font class="keywordflow">case</font> DBUS_TYPE_NIL:
02737               <font class="keywordflow">case</font> DBUS_TYPE_ARRAY:
02738               <font class="keywordflow">case</font> DBUS_TYPE_CUSTOM:
02739               <font class="keywordflow">case</font> DBUS_TYPE_DICT:
02740                 _dbus_warn (<font class="stringliteral">"dbus_message_get_args_valist doesn't support recursive arrays\n"</font>);
02741                 dbus_set_error (error, DBUS_ERROR_NOT_SUPPORTED, NULL);
02742                 <font class="keywordflow">goto</font> out;
02743               <font class="keywordflow">default</font>:
02744                 _dbus_warn (<font class="stringliteral">"Unknown field type %d\n"</font>, type);
02745                 dbus_set_error (error, DBUS_ERROR_NOT_SUPPORTED, NULL);
02746                 <font class="keywordflow">goto</font> out;
02747               }
02748             <font class="keywordflow">if</font> (err)
02749               {
02750                 dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
02751                 <font class="keywordflow">goto</font> out;
02752               }
02753           }
02754           <font class="keywordflow">break</font>;
02755         <font class="keywordflow">case</font> DBUS_TYPE_DICT:
02756           _dbus_warn (<font class="stringliteral">"dbus_message_get_args_valist doesn't support dicts\n"</font>);
02757           dbus_set_error (error, DBUS_ERROR_NOT_SUPPORTED, NULL);
02758           <font class="keywordflow">goto</font> out;
02759         <font class="keywordflow">default</font>:          
02760           dbus_set_error (error, DBUS_ERROR_NOT_SUPPORTED, NULL);
02761           _dbus_warn (<font class="stringliteral">"Unknown field type %d\n"</font>, spec_type);
02762           <font class="keywordflow">goto</font> out;
02763         }
02764 
02765       spec_type = va_arg (var_args, <font class="keywordtype">int</font>);
02766       <font class="keywordflow">if</font> (!dbus_message_iter_next (iter) &amp;&amp; spec_type != DBUS_TYPE_INVALID)
02767         {
02768           dbus_set_error (error, DBUS_ERROR_INVALID_ARGS,
02769                           <font class="stringliteral">"Message has only %d arguments, but more were expected"</font>, i);
02770           <font class="keywordflow">goto</font> out;
02771         }
02772 
02773       i++;
02774     }
02775   
02776   retval = TRUE;
02777   
02778  out:
02779   
02780   <font class="keywordflow">return</font> retval;
02781 }
02782 
02792 <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font>
<a name="l02793"></a><a class="code" href="group__DBusMessage.html#a45">02793</a> dbus_message_iter_get_byte (<a class="code" href="structDBusMessageIter.html">DBusMessageIter</a> *iter)
02794 {
02795   <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> value = 0;
02796 
02797   _dbus_message_iter_get_basic_type (iter, DBUS_TYPE_BYTE, &amp;value);
02798 
02799   <font class="keywordflow">return</font> value;
02800 }
02801 
02811 dbus_bool_t
<a name="l02812"></a><a class="code" href="group__DBusMessage.html#a46">02812</a> dbus_message_iter_get_boolean (<a class="code" href="structDBusMessageIter.html">DBusMessageIter</a> *iter)
02813 {
02814   <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> value = 0;
02815 
02816   _dbus_message_iter_get_basic_type (iter, DBUS_TYPE_BOOLEAN, &amp;value);
02817 
02818   <font class="keywordflow">return</font> (value != FALSE);
02819 }
02820 
02830 dbus_int32_t
<a name="l02831"></a><a class="code" href="group__DBusMessage.html#a47">02831</a> dbus_message_iter_get_int32 (<a class="code" href="structDBusMessageIter.html">DBusMessageIter</a> *iter)
02832 {
02833   dbus_int32_t value = 0;
02834 
02835   _dbus_message_iter_get_basic_type (iter, DBUS_TYPE_INT32, &amp;value);
02836 
02837   <font class="keywordflow">return</font> value;
02838 }
02839 
02849 dbus_uint32_t
<a name="l02850"></a><a class="code" href="group__DBusMessage.html#a48">02850</a> dbus_message_iter_get_uint32 (<a class="code" href="structDBusMessageIter.html">DBusMessageIter</a> *iter)
02851 {
02852   dbus_int32_t value = 0;
02853 
02854   _dbus_message_iter_get_basic_type (iter, DBUS_TYPE_UINT32, &amp;value);
02855 
02856   <font class="keywordflow">return</font> value;
02857 }
02858 
02859 <font class="preprocessor">#ifdef DBUS_HAVE_INT64</font>
02860 <font class="preprocessor"></font>
02872 dbus_int64_t
<a name="l02873"></a><a class="code" href="group__DBusMessage.html#a49">02873</a> dbus_message_iter_get_int64 (<a class="code" href="structDBusMessageIter.html">DBusMessageIter</a> *iter)
02874 {
02875   dbus_int64_t value = 0;
02876 
02877   _dbus_message_iter_get_basic_type (iter, DBUS_TYPE_INT64, &amp;value);
02878 
02879   <font class="keywordflow">return</font> value;
02880 }
02881 
02893 dbus_uint64_t
<a name="l02894"></a><a class="code" href="group__DBusMessage.html#a50">02894</a> dbus_message_iter_get_uint64 (<a class="code" href="structDBusMessageIter.html">DBusMessageIter</a> *iter)
02895 {
02896   dbus_uint64_t value = 0;
02897 
02898   _dbus_message_iter_get_basic_type (iter, DBUS_TYPE_UINT64, &amp;value);
02899 
02900   <font class="keywordflow">return</font> value;
02901 }
02902 
02903 <font class="preprocessor">#endif </font><font class="comment">/* DBUS_HAVE_INT64 */</font>
02904 
02914 <font class="keywordtype">double</font>
<a name="l02915"></a><a class="code" href="group__DBusMessage.html#a51">02915</a> dbus_message_iter_get_double (<a class="code" href="structDBusMessageIter.html">DBusMessageIter</a> *iter)
02916 {
02917   <font class="keywordtype">double</font> value = 0.0;
02918 
02919   _dbus_message_iter_get_basic_type (iter, DBUS_TYPE_DOUBLE, &amp;value);
02920 
02921   <font class="keywordflow">return</font> value;
02922 }
02923 
02937 dbus_bool_t
<a name="l02938"></a><a class="code" href="group__DBusMessage.html#a52">02938</a> dbus_message_iter_init_array_iterator (<a class="code" href="structDBusMessageIter.html">DBusMessageIter</a> *iter,
02939                                        <a class="code" href="structDBusMessageIter.html">DBusMessageIter</a> *array_iter,
02940                                        <font class="keywordtype">int</font>             *array_type)
02941 {
02942   DBusMessageRealIter *real = (DBusMessageRealIter *)iter;
02943   DBusMessageRealIter *array_real = (DBusMessageRealIter *)array_iter;
02944   <font class="keywordtype">int</font> type, pos, len_pos, len, array_type_pos;
02945   <font class="keywordtype">int</font> _array_type;
02946 
02947   _dbus_return_val_if_fail (dbus_message_iter_check (real), FALSE);
02948 
02949   pos = dbus_message_iter_get_data_start (real, &amp;type);
02950   
02951   _dbus_assert (type == DBUS_TYPE_ARRAY);
02952 
02953   _array_type = iter_get_array_type (real, &amp;array_type_pos);
02954   
02955   len_pos = _DBUS_ALIGN_VALUE (pos, <font class="keyword">sizeof</font> (dbus_uint32_t));
02956   len = _dbus_demarshal_uint32 (&amp;real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>, real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m7">byte_order</a>,
02957                                 pos, &amp;pos);
02958   
02959   array_real-&gt;<a class="code" href="structDBusMessageRealIter.html#m0">parent_iter</a> = real;
02960   array_real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a> = real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>;
02961   array_real-&gt;<a class="code" href="structDBusMessageRealIter.html#m2">changed_stamp</a> = real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m10">changed_stamp</a>;
02962   
02963   array_real-&gt;<a class="code" href="structDBusMessageRealIter.html#m3">type</a> = DBUS_MESSAGE_ITER_TYPE_ARRAY;
02964   array_real-&gt;<a class="code" href="structDBusMessageRealIter.html#m4">pos</a> = pos;
02965   array_real-&gt;<a class="code" href="structDBusMessageRealIter.html#m5">end</a> = pos + len;
02966   
02967   array_real-&gt;<a class="code" href="structDBusMessageRealIter.html#m6">container_start</a> = pos;
02968   array_real-&gt;<a class="code" href="structDBusMessageRealIter.html#m7">container_length_pos</a> = len_pos;
02969   array_real-&gt;<a class="code" href="structDBusMessageRealIter.html#m8">wrote_dict_key</a> = 0;
02970   array_real-&gt;<a class="code" href="structDBusMessageRealIter.html#m9">array_type_pos</a> = array_type_pos;
02971   array_real-&gt;<a class="code" href="structDBusMessageRealIter.html#m10">array_type_done</a> = TRUE;
02972   
02973   <font class="keywordflow">if</font> (array_type != NULL)
02974     *array_type = _array_type;
02975 
02976   <font class="keywordflow">return</font> len &gt; 0;
02977 }
02978 
02979 
02989 dbus_bool_t
<a name="l02990"></a><a class="code" href="group__DBusMessage.html#a53">02990</a> dbus_message_iter_init_dict_iterator (<a class="code" href="structDBusMessageIter.html">DBusMessageIter</a> *iter,
02991                                       <a class="code" href="structDBusMessageIter.html">DBusMessageIter</a> *dict_iter)
02992 {
02993   DBusMessageRealIter *real = (DBusMessageRealIter *)iter;
02994   DBusMessageRealIter *dict_real = (DBusMessageRealIter *)dict_iter;
02995   <font class="keywordtype">int</font> type, pos, len_pos, len;
02996 
02997   _dbus_return_val_if_fail (dbus_message_iter_check (real), FALSE);
02998 
02999   pos = dbus_message_iter_get_data_start (real, &amp;type);
03000   
03001   _dbus_assert (type == DBUS_TYPE_DICT);
03002 
03003   len_pos = _DBUS_ALIGN_VALUE (pos, <font class="keyword">sizeof</font> (dbus_uint32_t));
03004   len = _dbus_demarshal_uint32 (&amp;real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>, real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m7">byte_order</a>,
03005                                 pos, &amp;pos);
03006   
03007   dict_real-&gt;<a class="code" href="structDBusMessageRealIter.html#m0">parent_iter</a> = real;
03008   dict_real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a> = real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>;
03009   dict_real-&gt;<a class="code" href="structDBusMessageRealIter.html#m2">changed_stamp</a> = real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m10">changed_stamp</a>;
03010   
03011   dict_real-&gt;<a class="code" href="structDBusMessageRealIter.html#m3">type</a> = DBUS_MESSAGE_ITER_TYPE_DICT;
03012   dict_real-&gt;<a class="code" href="structDBusMessageRealIter.html#m4">pos</a> = pos;
03013   dict_real-&gt;<a class="code" href="structDBusMessageRealIter.html#m5">end</a> = pos + len;
03014   
03015   dict_real-&gt;<a class="code" href="structDBusMessageRealIter.html#m6">container_start</a> = pos;
03016   dict_real-&gt;<a class="code" href="structDBusMessageRealIter.html#m7">container_length_pos</a> = len_pos;
03017   dict_real-&gt;<a class="code" href="structDBusMessageRealIter.html#m8">wrote_dict_key</a> = 0;
03018 
03019   <font class="keywordflow">return</font> len &gt; 0;
03020 }
03021 
03022 <font class="keyword">static</font> dbus_bool_t
03023 _dbus_message_iter_get_basic_type_array  (<a class="code" href="structDBusMessageIter.html">DBusMessageIter</a> *iter,
03024                                           <font class="keywordtype">char</font>             type,
03025                                           <font class="keywordtype">void</font>           **array,
03026                                           <font class="keywordtype">int</font>             *array_len)
03027 {
03028   DBusMessageRealIter *real = (DBusMessageRealIter *)iter;
03029   <font class="keywordtype">int</font> item_type, pos;
03030 
03031   _dbus_return_val_if_fail (dbus_message_iter_check (real), FALSE);
03032 
03033   pos = dbus_message_iter_get_data_start (real, &amp;item_type);
03034   
03035   _dbus_assert (item_type == DBUS_TYPE_ARRAY);
03036 
03037   item_type = iter_get_array_type (real, NULL);
03038   
03039   _dbus_assert (type == item_type);
03040 
03041   <font class="keywordflow">return</font> _dbus_demarshal_basic_type_array (&amp;real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>,
03042                                            item_type, array, array_len,
03043                                            real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m7">byte_order</a>, &amp;pos);
03044 }
03045 
03056 dbus_bool_t
<a name="l03057"></a><a class="code" href="group__DBusMessage.html#a55">03057</a> dbus_message_iter_get_byte_array (<a class="code" href="structDBusMessageIter.html">DBusMessageIter</a>  *iter,
03058                                   <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font>   **value,
03059                                   <font class="keywordtype">int</font>              *len)
03060 {
03061   <font class="keywordflow">return</font> _dbus_message_iter_get_basic_type_array (iter, DBUS_TYPE_BYTE,
03062                                                   (<font class="keywordtype">void</font> **) value, len);
03063 }
03064 
03075 dbus_bool_t
<a name="l03076"></a><a class="code" href="group__DBusMessage.html#a56">03076</a> dbus_message_iter_get_boolean_array (<a class="code" href="structDBusMessageIter.html">DBusMessageIter</a>   *iter,
03077                                      <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font>    **value,
03078                                      <font class="keywordtype">int</font>               *len)
03079 {
03080   <font class="keywordflow">return</font> _dbus_message_iter_get_basic_type_array (iter, DBUS_TYPE_BOOLEAN,
03081                                                   (<font class="keywordtype">void</font> **) value, len);
03082 }
03083 
03094 dbus_bool_t
<a name="l03095"></a><a class="code" href="group__DBusMessage.html#a57">03095</a> dbus_message_iter_get_int32_array  (<a class="code" href="structDBusMessageIter.html">DBusMessageIter</a> *iter,
03096                                     dbus_int32_t   **value,
03097                                     <font class="keywordtype">int</font>             *len)
03098 {
03099   <font class="keywordflow">return</font> _dbus_message_iter_get_basic_type_array (iter, DBUS_TYPE_INT32,
03100                                                   (<font class="keywordtype">void</font> **) value, len);
03101 }
03102 
03113 dbus_bool_t
<a name="l03114"></a><a class="code" href="group__DBusMessage.html#a58">03114</a> dbus_message_iter_get_uint32_array  (<a class="code" href="structDBusMessageIter.html">DBusMessageIter</a> *iter,
03115                                      dbus_uint32_t  **value,
03116                                      <font class="keywordtype">int</font>             *len)
03117 {
03118   <font class="keywordflow">return</font> _dbus_message_iter_get_basic_type_array (iter, DBUS_TYPE_UINT32,
03119                                                   (<font class="keywordtype">void</font> **) value, len);
03120 }
03121 
03122 <font class="preprocessor">#ifdef DBUS_HAVE_INT64</font>
03123 <font class="preprocessor"></font>
03136 dbus_bool_t
<a name="l03137"></a><a class="code" href="group__DBusMessage.html#a59">03137</a> dbus_message_iter_get_int64_array  (<a class="code" href="structDBusMessageIter.html">DBusMessageIter</a> *iter,
03138                                     dbus_int64_t   **value,
03139                                     <font class="keywordtype">int</font>             *len)
03140 {
03141   <font class="keywordflow">return</font> _dbus_message_iter_get_basic_type_array (iter, DBUS_TYPE_INT64,
03142                                                   (<font class="keywordtype">void</font> **) value, len);
03143 }
03144 
03157 dbus_bool_t
<a name="l03158"></a><a class="code" href="group__DBusMessage.html#a60">03158</a> dbus_message_iter_get_uint64_array  (<a class="code" href="structDBusMessageIter.html">DBusMessageIter</a> *iter,
03159                                      dbus_uint64_t  **value,
03160                                      <font class="keywordtype">int</font>             *len)
03161 {
03162   <font class="keywordflow">return</font> _dbus_message_iter_get_basic_type_array (iter, DBUS_TYPE_UINT64,
03163                                                   (<font class="keywordtype">void</font> **) value, len);
03164 }
03165 
03166 <font class="preprocessor">#endif </font><font class="comment">/* DBUS_HAVE_INT64 */</font>
03167 
03178 dbus_bool_t
<a name="l03179"></a><a class="code" href="group__DBusMessage.html#a61">03179</a> dbus_message_iter_get_double_array  (<a class="code" href="structDBusMessageIter.html">DBusMessageIter</a> *iter,
03180                                      <font class="keywordtype">double</font>         **value,
03181                                      <font class="keywordtype">int</font>             *len)
03182 {
03183   <font class="keywordflow">return</font> _dbus_message_iter_get_basic_type_array (iter, DBUS_TYPE_DOUBLE,
03184                                                   (<font class="keywordtype">void</font> **) value, len);
03185 }
03186 
03202 dbus_bool_t
<a name="l03203"></a><a class="code" href="group__DBusMessage.html#a62">03203</a> dbus_message_iter_get_string_array (<a class="code" href="structDBusMessageIter.html">DBusMessageIter</a> *iter,
03204                                     <font class="keywordtype">char</font>          ***value,
03205                                     <font class="keywordtype">int</font>             *len)
03206 {
03207   DBusMessageRealIter *real = (DBusMessageRealIter *)iter;
03208   <font class="keywordtype">int</font> type, pos;
03209 
03210   _dbus_return_val_if_fail (dbus_message_iter_check (real), FALSE);
03211 
03212   pos = dbus_message_iter_get_data_start (real, &amp;type);
03213   
03214   _dbus_assert (type == DBUS_TYPE_ARRAY);
03215 
03216   type = iter_get_array_type (real, NULL);
03217   _dbus_assert (type == DBUS_TYPE_STRING);
03218 
03219   <font class="keywordflow">if</font> (!_dbus_demarshal_string_array (&amp;real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>, real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m7">byte_order</a>,
03220                                      pos, NULL, value, len))
03221     <font class="keywordflow">return</font> FALSE;
03222   <font class="keywordflow">else</font>
03223     <font class="keywordflow">return</font> TRUE;
03224 }
03225 
03241 dbus_bool_t
<a name="l03242"></a><a class="code" href="group__DBusMessage.html#a63">03242</a> dbus_message_iter_get_object_path_array (<a class="code" href="structDBusMessageIter.html">DBusMessageIter</a> *iter,
03243                                          <font class="keywordtype">char</font>          ***value,
03244                                          <font class="keywordtype">int</font>             *len)
03245 {
03246   DBusMessageRealIter *real = (DBusMessageRealIter *)iter;
03247   <font class="keywordtype">int</font> type, pos;
03248 
03249   _dbus_return_val_if_fail (dbus_message_iter_check (real), FALSE);
03250 
03251   pos = dbus_message_iter_get_data_start (real, &amp;type);
03252   
03253   _dbus_assert (type == DBUS_TYPE_ARRAY);
03254 
03255   type = iter_get_array_type (real, NULL);
03256   _dbus_assert (type == DBUS_TYPE_OBJECT_PATH);
03257 
03258   <font class="keywordflow">if</font> (!_dbus_demarshal_string_array (&amp;real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>, real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m7">byte_order</a>,
03259                                      pos, NULL, value, len))
03260     <font class="keywordflow">return</font> FALSE;
03261   <font class="keywordflow">else</font>
03262     <font class="keywordflow">return</font> TRUE;
03263 }
03264 
03274 <font class="keywordtype">char</font> *
<a name="l03275"></a><a class="code" href="group__DBusMessage.html#a64">03275</a> dbus_message_iter_get_dict_key (<a class="code" href="structDBusMessageIter.html">DBusMessageIter</a>   *iter)
03276 {
03277   DBusMessageRealIter *real = (DBusMessageRealIter *)iter;
03278 
03279   _dbus_return_val_if_fail (dbus_message_iter_check (real), NULL);
03280 
03281   _dbus_assert (real-&gt;<a class="code" href="structDBusMessageRealIter.html#m3">type</a> == DBUS_MESSAGE_ITER_TYPE_DICT);
03282 
03283   <font class="keywordflow">return</font> _dbus_demarshal_string (&amp;real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>, real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m7">byte_order</a>,
03284                                  real-&gt;<a class="code" href="structDBusMessageRealIter.html#m4">pos</a>, NULL);
03285 }
03286 
03295 <font class="keywordtype">void</font>
<a name="l03296"></a><a class="code" href="group__DBusMessage.html#a65">03296</a> dbus_message_append_iter_init (<a class="code" href="structDBusMessage.html">DBusMessage</a>     *message,
03297                                <a class="code" href="structDBusMessageIter.html">DBusMessageIter</a> *iter)
03298 {
03299   DBusMessageRealIter *real = (DBusMessageRealIter *)iter;
03300 
03301   _dbus_return_if_fail (message != NULL);
03302   _dbus_return_if_fail (iter != NULL);
03303   
03304   real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a> = message;
03305   real-&gt;<a class="code" href="structDBusMessageRealIter.html#m0">parent_iter</a> = NULL;
03306   real-&gt;<a class="code" href="structDBusMessageRealIter.html#m2">changed_stamp</a> = message-&gt;<a class="code" href="structDBusMessage.html#m10">changed_stamp</a>;
03307   
03308   real-&gt;<a class="code" href="structDBusMessageRealIter.html#m3">type</a> = DBUS_MESSAGE_ITER_TYPE_MESSAGE;
03309   real-&gt;<a class="code" href="structDBusMessageRealIter.html#m5">end</a> = _dbus_string_get_length (&amp;real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>);
03310   real-&gt;<a class="code" href="structDBusMessageRealIter.html#m4">pos</a> = real-&gt;<a class="code" href="structDBusMessageRealIter.html#m5">end</a>;
03311   
03312   real-&gt;<a class="code" href="structDBusMessageRealIter.html#m7">container_length_pos</a> = 0;
03313   real-&gt;<a class="code" href="structDBusMessageRealIter.html#m8">wrote_dict_key</a> = 0;
03314 }
03315 
03316 <font class="preprocessor">#ifndef DBUS_DISABLE_CHECKS</font>
03317 <font class="preprocessor"></font><font class="keyword">static</font> dbus_bool_t
03318 dbus_message_iter_append_check (DBusMessageRealIter *iter)
03319 {
03320   <font class="keywordflow">if</font> (iter == NULL)
03321     {
03322       _dbus_warn (<font class="stringliteral">"dbus iterator check failed: NULL iterator\n"</font>);
03323       <font class="keywordflow">return</font> FALSE;
03324     }
03325   
03326   <font class="keywordflow">if</font> (iter-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m11">locked</a>)
03327     {
03328       _dbus_warn (<font class="stringliteral">"dbus iterator check failed: message is locked (has already been sent)\n"</font>);
03329       <font class="keywordflow">return</font> FALSE;
03330     }
03331       
03332   <font class="keywordflow">if</font> (iter-&gt;<a class="code" href="structDBusMessageRealIter.html#m2">changed_stamp</a> != iter-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m10">changed_stamp</a>)
03333     {
03334       _dbus_warn (<font class="stringliteral">"dbus iterator check failed: invalid iterator, must re-initialize it after modifying the message"</font>);
03335       <font class="keywordflow">return</font> FALSE;
03336     }
03337   
03338   <font class="keywordflow">if</font> (iter-&gt;<a class="code" href="structDBusMessageRealIter.html#m4">pos</a> != iter-&gt;<a class="code" href="structDBusMessageRealIter.html#m5">end</a>)
03339     {
03340       _dbus_warn (<font class="stringliteral">"dbus iterator check failed: can only append at end of message"</font>);
03341       <font class="keywordflow">return</font> FALSE;
03342     }
03343   
03344   <font class="keywordflow">if</font> (iter-&gt;<a class="code" href="structDBusMessageRealIter.html#m4">pos</a> != _dbus_string_get_length (&amp;iter-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>))
03345     {
03346       _dbus_warn (<font class="stringliteral">"dbus iterator check failed: append pos not at end of message string"</font>);
03347       <font class="keywordflow">return</font> FALSE;
03348     }
03349 
03350   <font class="keywordflow">return</font> TRUE;
03351 }
03352 <font class="preprocessor">#endif </font><font class="comment">/* DBUS_DISABLE_CHECKS */</font>
03353 
03354 <font class="keyword">static</font> dbus_bool_t
03355 dbus_message_iter_append_type (DBusMessageRealIter *iter,
03356                                <font class="keywordtype">int</font>                  type)
03357 {
03358   <font class="keyword">const</font> <font class="keywordtype">char</font> *data;
03359 
03360   <font class="keywordflow">switch</font> (iter-&gt;<a class="code" href="structDBusMessageRealIter.html#m3">type</a>)
03361     {
03362     <font class="keywordflow">case</font> DBUS_MESSAGE_ITER_TYPE_MESSAGE:
03363       <font class="keywordflow">if</font> (!_dbus_string_append_byte (&amp;iter-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>, type))
03364         <font class="keywordflow">return</font> FALSE;
03365 
03366       <font class="keywordflow">if</font> (!_dbus_message_append_byte_to_signature (iter-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>, type))
03367         {
03368           _dbus_string_shorten (&amp;iter-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>, 1);
03369           <font class="keywordflow">return</font> FALSE;
03370         }
03371       <font class="keywordflow">break</font>;
03372       
03373     <font class="keywordflow">case</font> DBUS_MESSAGE_ITER_TYPE_ARRAY:
03374       data = _dbus_string_get_const_data_len (&amp;iter-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>,
03375                                               iter-&gt;<a class="code" href="structDBusMessageRealIter.html#m9">array_type_pos</a>, 1);
03376       <font class="keywordflow">if</font> (type != *data)
03377         {
03378           _dbus_warn (<font class="stringliteral">"Appended element of wrong type for array\n"</font>);
03379           <font class="keywordflow">return</font> FALSE;
03380         }
03381       <font class="keywordflow">break</font>;
03382       
03383     <font class="keywordflow">case</font> DBUS_MESSAGE_ITER_TYPE_DICT:
03384       <font class="keywordflow">if</font> (!iter-&gt;<a class="code" href="structDBusMessageRealIter.html#m8">wrote_dict_key</a>)
03385         {
03386           _dbus_warn (<font class="stringliteral">"Appending dict data before key name\n"</font>);
03387           <font class="keywordflow">return</font> FALSE;
03388         }
03389       
03390       <font class="keywordflow">if</font> (!_dbus_string_append_byte (&amp;iter-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>, type))
03391         <font class="keywordflow">return</font> FALSE;
03392       
03393       <font class="keywordflow">break</font>;
03394       
03395     <font class="keywordflow">default</font>:
03396       _dbus_assert_not_reached (<font class="stringliteral">"Invalid iter type"</font>);
03397       <font class="keywordflow">break</font>;
03398     }
03399   
03400   <font class="keywordflow">return</font> TRUE;
03401 }
03402 
03403 <font class="keyword">static</font> <font class="keywordtype">void</font>
03404 dbus_message_iter_update_after_change (DBusMessageRealIter *iter)
03405 {
03406   iter-&gt;<a class="code" href="structDBusMessageRealIter.html#m2">changed_stamp</a> = iter-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m10">changed_stamp</a>;
03407   
03408   <font class="comment">/* Set new end of iter */</font>
03409   iter-&gt;<a class="code" href="structDBusMessageRealIter.html#m5">end</a> = _dbus_string_get_length (&amp;iter-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>);
03410   iter-&gt;<a class="code" href="structDBusMessageRealIter.html#m4">pos</a> = iter-&gt;<a class="code" href="structDBusMessageRealIter.html#m5">end</a>;
03411 
03412   <font class="comment">/* Set container length */</font>
03413   <font class="keywordflow">if</font> (iter-&gt;<a class="code" href="structDBusMessageRealIter.html#m3">type</a> == DBUS_MESSAGE_ITER_TYPE_DICT ||
03414       (iter-&gt;<a class="code" href="structDBusMessageRealIter.html#m3">type</a> == DBUS_MESSAGE_ITER_TYPE_ARRAY &amp;&amp; iter-&gt;<a class="code" href="structDBusMessageRealIter.html#m10">array_type_done</a>))
03415     _dbus_marshal_set_uint32 (&amp;iter-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>,
03416                               iter-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m7">byte_order</a>,
03417                               iter-&gt;<a class="code" href="structDBusMessageRealIter.html#m7">container_length_pos</a>,
03418                               iter-&gt;<a class="code" href="structDBusMessageRealIter.html#m5">end</a> - iter-&gt;<a class="code" href="structDBusMessageRealIter.html#m6">container_start</a>);
03419   
03420   <font class="keywordflow">if</font> (iter-&gt;<a class="code" href="structDBusMessageRealIter.html#m0">parent_iter</a>)
03421     dbus_message_iter_update_after_change (iter-&gt;<a class="code" href="structDBusMessageRealIter.html#m0">parent_iter</a>);
03422 }
03423 
03424 <font class="keyword">static</font> <font class="keywordtype">void</font>
03425 dbus_message_iter_append_done (DBusMessageRealIter *iter)
03426 {
03427   iter-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m10">changed_stamp</a>++;
03428   dbus_message_iter_update_after_change (iter);
03429   iter-&gt;<a class="code" href="structDBusMessageRealIter.html#m8">wrote_dict_key</a> = FALSE;
03430 }
03431 
03438 dbus_bool_t
<a name="l03439"></a><a class="code" href="group__DBusMessage.html#a70">03439</a> dbus_message_iter_append_nil (<a class="code" href="structDBusMessageIter.html">DBusMessageIter</a> *iter)
03440 {
03441   DBusMessageRealIter *real = (DBusMessageRealIter *)iter;
03442 
03443   _dbus_return_val_if_fail (dbus_message_iter_append_check (real), FALSE);
03444 
03445   <font class="keywordflow">if</font> (!dbus_message_iter_append_type (real, DBUS_TYPE_NIL))
03446     <font class="keywordflow">return</font> FALSE;
03447   
03448   dbus_message_iter_append_done (real);
03449   
03450   <font class="keywordflow">return</font> TRUE;
03451 }
03452 
03453 <font class="keyword">static</font> dbus_bool_t
03454 dbus_message_iter_append_basic (<a class="code" href="structDBusMessageIter.html">DBusMessageIter</a> *iter,
03455                                 <font class="keywordtype">char</font>             type,
03456                                 <font class="keywordtype">void</font>            *value)
03457 {
03458   DBusMessageRealIter *real = (DBusMessageRealIter *)iter;
03459 
03460   _dbus_return_val_if_fail (dbus_message_iter_append_check (real), FALSE);
03461 
03462   <font class="keywordflow">if</font> (!dbus_message_iter_append_type (real, type))
03463     <font class="keywordflow">return</font> FALSE;
03464 
03465   <font class="keywordflow">if</font> (!_dbus_marshal_basic_type (&amp;real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>,
03466                                  type, value,
03467                                  real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m7">byte_order</a>))
03468     {
03469       _dbus_string_set_length (&amp;real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>, real-&gt;<a class="code" href="structDBusMessageRealIter.html#m4">pos</a>);
03470       <font class="keywordflow">return</font> FALSE;
03471     }
03472 
03473   dbus_message_iter_append_done (real);
03474   
03475   <font class="keywordflow">return</font> TRUE;  
03476 }
03477 
03485 dbus_bool_t
<a name="l03486"></a><a class="code" href="group__DBusMessage.html#a72">03486</a> dbus_message_iter_append_boolean (<a class="code" href="structDBusMessageIter.html">DBusMessageIter</a> *iter,
03487                                   dbus_bool_t     value)
03488 {
03489   <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> val = (value != FALSE);
03490   <font class="keywordflow">return</font> dbus_message_iter_append_basic (iter, DBUS_TYPE_BOOLEAN, &amp;val);
03491 }
03492 
03500 dbus_bool_t
<a name="l03501"></a><a class="code" href="group__DBusMessage.html#a73">03501</a> dbus_message_iter_append_byte (<a class="code" href="structDBusMessageIter.html">DBusMessageIter</a> *iter,
03502                                <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font>    value)
03503 {
03504   <font class="keywordflow">return</font> dbus_message_iter_append_basic (iter, DBUS_TYPE_BYTE, &amp;value);
03505 }
03506 
03514 dbus_bool_t
<a name="l03515"></a><a class="code" href="group__DBusMessage.html#a74">03515</a> dbus_message_iter_append_int32   (<a class="code" href="structDBusMessageIter.html">DBusMessageIter</a> *iter,
03516                                   dbus_int32_t  value)
03517 {
03518   <font class="keywordflow">return</font> dbus_message_iter_append_basic (iter, DBUS_TYPE_INT32, &amp;value);
03519 }
03520 
03528 dbus_bool_t
<a name="l03529"></a><a class="code" href="group__DBusMessage.html#a75">03529</a> dbus_message_iter_append_uint32 (<a class="code" href="structDBusMessageIter.html">DBusMessageIter</a> *iter,
03530                                  dbus_uint32_t    value)
03531 {
03532   <font class="keywordflow">return</font> dbus_message_iter_append_basic (iter, DBUS_TYPE_UINT32, &amp;value);
03533 }
03534 
03535 <font class="preprocessor">#ifdef DBUS_HAVE_INT64</font>
03536 <font class="preprocessor"></font>
03546 dbus_bool_t
<a name="l03547"></a><a class="code" href="group__DBusMessage.html#a76">03547</a> dbus_message_iter_append_int64   (<a class="code" href="structDBusMessageIter.html">DBusMessageIter</a> *iter,
03548                                   dbus_int64_t  value)
03549 {
03550   <font class="keywordflow">return</font> dbus_message_iter_append_basic (iter, DBUS_TYPE_INT64, &amp;value);
03551 }
03552 
03562 dbus_bool_t
<a name="l03563"></a><a class="code" href="group__DBusMessage.html#a77">03563</a> dbus_message_iter_append_uint64 (<a class="code" href="structDBusMessageIter.html">DBusMessageIter</a> *iter,
03564                                  dbus_uint64_t    value)
03565 {
03566   <font class="keywordflow">return</font> dbus_message_iter_append_basic (iter, DBUS_TYPE_UINT64, &amp;value);
03567 }
03568 
03569 <font class="preprocessor">#endif </font><font class="comment">/* DBUS_HAVE_INT64 */</font>
03570 
03578 dbus_bool_t
<a name="l03579"></a><a class="code" href="group__DBusMessage.html#a78">03579</a> dbus_message_iter_append_double (<a class="code" href="structDBusMessageIter.html">DBusMessageIter</a> *iter,
03580                                  <font class="keywordtype">double</font>           value)
03581 {
03582   <font class="keywordflow">return</font> dbus_message_iter_append_basic (iter, DBUS_TYPE_DOUBLE, &amp;value);
03583 }
03584 
03594 dbus_bool_t
<a name="l03595"></a><a class="code" href="group__DBusMessage.html#a79">03595</a> dbus_message_iter_append_string (<a class="code" href="structDBusMessageIter.html">DBusMessageIter</a> *iter,
03596                                  <font class="keyword">const</font> <font class="keywordtype">char</font>      *value)
03597 {
03598   DBusMessageRealIter *real = (DBusMessageRealIter *)iter;
03599 
03600   _dbus_return_val_if_fail (dbus_message_iter_append_check (real), FALSE);
03601   
03602   <font class="keywordflow">if</font> (!dbus_message_iter_append_type (real, DBUS_TYPE_STRING))
03603     <font class="keywordflow">return</font> FALSE;
03604   
03605   <font class="keywordflow">if</font> (!_dbus_marshal_string (&amp;real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>, real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m7">byte_order</a>, value))
03606     {
03607       _dbus_string_set_length (&amp;real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>, real-&gt;<a class="code" href="structDBusMessageRealIter.html#m4">pos</a>);
03608       <font class="keywordflow">return</font> FALSE;
03609     }
03610 
03611   dbus_message_iter_append_done (real);
03612   
03613   <font class="keywordflow">return</font> TRUE;
03614 }
03615 
03625 dbus_bool_t
<a name="l03626"></a><a class="code" href="group__DBusMessage.html#a80">03626</a> dbus_message_iter_append_object_path (<a class="code" href="structDBusMessageIter.html">DBusMessageIter</a> *iter,
03627                                       <font class="keyword">const</font> <font class="keywordtype">char</font>      *value)
03628 {
03629   DBusMessageRealIter *real = (DBusMessageRealIter *)iter;
03630 
03631   _dbus_return_val_if_fail (dbus_message_iter_append_check (real), FALSE);
03632   
03633   <font class="keywordflow">if</font> (!dbus_message_iter_append_type (real, DBUS_TYPE_OBJECT_PATH))
03634     <font class="keywordflow">return</font> FALSE;
03635   
03636   <font class="keywordflow">if</font> (!_dbus_marshal_string (&amp;real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>, real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m7">byte_order</a>, value))
03637     {
03638       _dbus_string_set_length (&amp;real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>, real-&gt;<a class="code" href="structDBusMessageRealIter.html#m4">pos</a>);
03639       <font class="keywordflow">return</font> FALSE;
03640     }
03641 
03642   dbus_message_iter_append_done (real);
03643   
03644   <font class="keywordflow">return</font> TRUE;
03645 }
03646 
03659 dbus_bool_t
<a name="l03660"></a><a class="code" href="group__DBusMessage.html#a81">03660</a> dbus_message_iter_append_custom (<a class="code" href="structDBusMessageIter.html">DBusMessageIter</a>      *iter,
03661                                  <font class="keyword">const</font> <font class="keywordtype">char</font>           *name,
03662                                  <font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font>  *data,
03663                                  <font class="keywordtype">int</font>                   len)
03664 {
03665   DBusMessageRealIter *real = (DBusMessageRealIter *)iter;
03666 
03667   _dbus_return_val_if_fail (dbus_message_iter_append_check (real), FALSE);
03668 
03669   <font class="keywordflow">if</font> (!dbus_message_iter_append_type (real, DBUS_TYPE_CUSTOM))
03670     <font class="keywordflow">return</font> FALSE;
03671   
03672    <font class="keywordflow">if</font> (!_dbus_marshal_string (&amp;real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>, real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m7">byte_order</a>, name))
03673     {
03674       _dbus_string_set_length (&amp;real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>, real-&gt;<a class="code" href="structDBusMessageRealIter.html#m4">pos</a>);
03675       <font class="keywordflow">return</font> FALSE;
03676     }
03677    
03678   <font class="keywordflow">if</font> (!_dbus_marshal_byte_array (&amp;real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>, real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m7">byte_order</a>, data, len))
03679     {
03680       _dbus_string_set_length (&amp;real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>, real-&gt;<a class="code" href="structDBusMessageRealIter.html#m4">pos</a>);
03681       <font class="keywordflow">return</font> FALSE;
03682     }
03683 
03684   dbus_message_iter_append_done (real);
03685   
03686   <font class="keywordflow">return</font> TRUE;
03687 }
03688 
03689 
03698 dbus_bool_t
<a name="l03699"></a><a class="code" href="group__DBusMessage.html#a82">03699</a> dbus_message_iter_append_dict_key (<a class="code" href="structDBusMessageIter.html">DBusMessageIter</a> *iter,
03700                                    <font class="keyword">const</font> <font class="keywordtype">char</font>      *value)
03701 {
03702   DBusMessageRealIter *real = (DBusMessageRealIter *)iter;
03703 
03704   _dbus_return_val_if_fail (dbus_message_iter_append_check (real), FALSE);
03705   _dbus_assert (real-&gt;<a class="code" href="structDBusMessageRealIter.html#m3">type</a> == DBUS_MESSAGE_ITER_TYPE_DICT);
03706   
03707   <font class="keywordflow">if</font> (real-&gt;<a class="code" href="structDBusMessageRealIter.html#m8">wrote_dict_key</a>)
03708     {
03709       _dbus_warn (<font class="stringliteral">"Appending multiple dict key names\n"</font>);
03710       <font class="keywordflow">return</font> FALSE;
03711     }
03712   
03713   <font class="keywordflow">if</font> (!_dbus_marshal_string (&amp;real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>, real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m7">byte_order</a>, value))
03714     {
03715       <font class="keywordflow">return</font> FALSE;
03716     }
03717 
03718   dbus_message_iter_append_done (real);
03719   real-&gt;<a class="code" href="structDBusMessageRealIter.html#m8">wrote_dict_key</a> = TRUE;
03720   
03721   <font class="keywordflow">return</font> TRUE;
03722 }
03723 
03724 <font class="keyword">static</font> dbus_bool_t
03725 array_iter_type_mark_done (DBusMessageRealIter *iter)
03726 {
03727   <font class="keywordtype">int</font> len_pos;
03728   
03729   <font class="keywordflow">if</font> (iter-&gt;<a class="code" href="structDBusMessageRealIter.html#m3">type</a> == DBUS_MESSAGE_ITER_TYPE_ARRAY)
03730     array_iter_type_mark_done (iter-&gt;<a class="code" href="structDBusMessageRealIter.html#m0">parent_iter</a>);
03731   <font class="keywordflow">else</font>
03732     <font class="keywordflow">return</font> TRUE;
03733 
03734   len_pos = _DBUS_ALIGN_VALUE (_dbus_string_get_length (&amp;iter-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>),
03735                                sizeof (dbus_uint32_t));
03736 
03737   <font class="comment">/* Empty length for now, backfill later */</font>
03738   <font class="keywordflow">if</font> (!_dbus_marshal_uint32 (&amp;iter-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>, iter-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m7">byte_order</a>, 0))
03739     {
03740       _dbus_string_set_length (&amp;iter-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>, iter-&gt;<a class="code" href="structDBusMessageRealIter.html#m4">pos</a>);
03741       <font class="keywordflow">return</font> FALSE;
03742     }
03743 
03744   iter-&gt;<a class="code" href="structDBusMessageRealIter.html#m6">container_start</a> = _dbus_string_get_length (&amp;iter-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>);
03745   iter-&gt;<a class="code" href="structDBusMessageRealIter.html#m7">container_length_pos</a> = len_pos;
03746   iter-&gt;<a class="code" href="structDBusMessageRealIter.html#m10">array_type_done</a> = TRUE;
03747 
03748   <font class="keywordflow">return</font> TRUE;
03749 }
03750 
03751 <font class="keyword">static</font> dbus_bool_t
03752 append_array_type (DBusMessageRealIter *real,
03753                    <font class="keywordtype">int</font>                  element_type,
03754                    dbus_bool_t         *array_type_done,
03755                    <font class="keywordtype">int</font>                 *array_type_pos)
03756 {
03757   <font class="keywordtype">int</font> existing_element_type;
03758   
03759   <font class="keywordflow">if</font> (!dbus_message_iter_append_type (real, DBUS_TYPE_ARRAY))
03760     <font class="keywordflow">return</font> FALSE;
03761   
03762   <font class="keywordflow">if</font> (real-&gt;<a class="code" href="structDBusMessageRealIter.html#m3">type</a> == DBUS_MESSAGE_ITER_TYPE_ARRAY &amp;&amp;
03763       real-&gt;<a class="code" href="structDBusMessageRealIter.html#m10">array_type_done</a>)
03764     {
03765       existing_element_type = iter_get_array_type (real, array_type_pos);
03766       <font class="keywordflow">if</font> (existing_element_type != element_type)
03767         {
03768           _dbus_warn (<font class="stringliteral">"Appending array of %s, when expecting array of %s\n"</font>,
03769                       _dbus_type_to_string (element_type),
03770                       _dbus_type_to_string (existing_element_type));
03771           _dbus_string_set_length (&amp;real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>, real-&gt;<a class="code" href="structDBusMessageRealIter.html#m4">pos</a>);
03772           <font class="keywordflow">return</font> FALSE;
03773         }
03774       <font class="keywordflow">if</font> (array_type_done != NULL)
03775           *array_type_done = TRUE;
03776     }
03777   <font class="keywordflow">else</font>
03778     {
03779       <font class="keywordflow">if</font> (array_type_pos != NULL)
03780         *array_type_pos = _dbus_string_get_length (&amp;real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>);
03781 
03782 
03783       <font class="keywordflow">if</font> (!_dbus_message_append_byte_to_signature (real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>, element_type))
03784         {
03785           _dbus_string_set_length (&amp;real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>, real-&gt;<a class="code" href="structDBusMessageRealIter.html#m4">pos</a>);
03786           <font class="keywordflow">return</font> FALSE;
03787         }
03788       
03789       <font class="comment">/* Append element type */</font>
03790       <font class="keywordflow">if</font> (!_dbus_string_append_byte (&amp;real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>, element_type))
03791         {
03792           _dbus_message_remove_byte_from_signature (real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>);
03793           _dbus_string_set_length (&amp;real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>, real-&gt;<a class="code" href="structDBusMessageRealIter.html#m4">pos</a>);
03794           <font class="keywordflow">return</font> FALSE;
03795         }
03796 
03797       <font class="keywordflow">if</font> (array_type_done != NULL)
03798         *array_type_done = element_type != DBUS_TYPE_ARRAY;
03799       
03800       <font class="keywordflow">if</font> (element_type != DBUS_TYPE_ARRAY &amp;&amp;
03801           !array_iter_type_mark_done (real))
03802         {
03803           _dbus_message_remove_byte_from_signature (real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>);
03804           <font class="keywordflow">return</font> FALSE;
03805         }
03806     }
03807 
03808   <font class="keywordflow">return</font> TRUE;
03809 }
03810 
03820 dbus_bool_t
<a name="l03821"></a><a class="code" href="group__DBusMessage.html#a85">03821</a> dbus_message_iter_append_array (<a class="code" href="structDBusMessageIter.html">DBusMessageIter</a>      *iter,
03822                                 <a class="code" href="structDBusMessageIter.html">DBusMessageIter</a>      *array_iter,
03823                                 <font class="keywordtype">int</font>                   element_type)
03824 {
03825   DBusMessageRealIter *real = (DBusMessageRealIter *)iter;
03826   DBusMessageRealIter *array_real = (DBusMessageRealIter *)array_iter;
03827   <font class="keywordtype">int</font> len_pos;
03828   <font class="keywordtype">int</font> array_type_pos;
03829   dbus_bool_t array_type_done;
03830 
03831   <font class="keywordflow">if</font> (element_type == DBUS_TYPE_NIL)
03832     {
03833       _dbus_warn (<font class="stringliteral">"Can't create NIL arrays\n"</font>);
03834       <font class="keywordflow">return</font> FALSE;
03835     }
03836   
03837   _dbus_return_val_if_fail (dbus_message_iter_append_check (real), FALSE);
03838 
03839   <font class="keywordflow">if</font> (!append_array_type (real, element_type, &amp;array_type_done, &amp;array_type_pos))
03840     <font class="keywordflow">return</font> FALSE;
03841 
03842   len_pos = _DBUS_ALIGN_VALUE (_dbus_string_get_length (&amp;real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>), sizeof (dbus_uint32_t));
03843 
03844   <font class="keywordflow">if</font> (array_type_done)
03845     {
03846       <font class="comment">/* Empty length for now, backfill later */</font>
03847       <font class="keywordflow">if</font> (!_dbus_marshal_uint32 (&amp;real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>, real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m7">byte_order</a>, 0))
03848         {
03849           _dbus_string_set_length (&amp;real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>, real-&gt;<a class="code" href="structDBusMessageRealIter.html#m4">pos</a>);
03850           <font class="keywordflow">return</font> FALSE;
03851         }
03852     }
03853   
03854   array_real-&gt;<a class="code" href="structDBusMessageRealIter.html#m0">parent_iter</a> = real;
03855   array_real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a> = real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>;
03856   array_real-&gt;<a class="code" href="structDBusMessageRealIter.html#m2">changed_stamp</a> = real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m10">changed_stamp</a>;
03857   
03858   array_real-&gt;<a class="code" href="structDBusMessageRealIter.html#m3">type</a> = DBUS_MESSAGE_ITER_TYPE_ARRAY;
03859   array_real-&gt;<a class="code" href="structDBusMessageRealIter.html#m4">pos</a> = _dbus_string_get_length (&amp;real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>);
03860   array_real-&gt;<a class="code" href="structDBusMessageRealIter.html#m5">end</a> = array_real-&gt;<a class="code" href="structDBusMessageRealIter.html#m5">end</a>;
03861   
03862   array_real-&gt;<a class="code" href="structDBusMessageRealIter.html#m6">container_start</a> = array_real-&gt;<a class="code" href="structDBusMessageRealIter.html#m4">pos</a>;
03863   array_real-&gt;<a class="code" href="structDBusMessageRealIter.html#m7">container_length_pos</a> = len_pos;
03864   array_real-&gt;<a class="code" href="structDBusMessageRealIter.html#m8">wrote_dict_key</a> = 0;
03865   array_real-&gt;<a class="code" href="structDBusMessageRealIter.html#m10">array_type_done</a> = array_type_done;
03866   array_real-&gt;<a class="code" href="structDBusMessageRealIter.html#m9">array_type_pos</a> = array_type_pos;
03867 
03868   dbus_message_iter_append_done (array_real);
03869   
03870   <font class="keywordflow">return</font> TRUE;
03871 }
03872 
03881 dbus_bool_t
<a name="l03882"></a><a class="code" href="group__DBusMessage.html#a86">03882</a> dbus_message_iter_append_dict (<a class="code" href="structDBusMessageIter.html">DBusMessageIter</a>      *iter,
03883                                <a class="code" href="structDBusMessageIter.html">DBusMessageIter</a>      *dict_iter)
03884 {
03885   DBusMessageRealIter *real = (DBusMessageRealIter *)iter;
03886   DBusMessageRealIter *dict_real = (DBusMessageRealIter *)dict_iter;
03887   <font class="keywordtype">int</font> len_pos;
03888 
03889   _dbus_return_val_if_fail (dbus_message_iter_append_check (real), FALSE);
03890   
03891   <font class="keywordflow">if</font> (!dbus_message_iter_append_type (real, DBUS_TYPE_DICT))
03892     <font class="keywordflow">return</font> FALSE;  
03893   
03894   len_pos = _DBUS_ALIGN_VALUE (_dbus_string_get_length (&amp;real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>), sizeof (dbus_uint32_t));
03895 
03896   <font class="comment">/* Empty length for now, backfill later */</font>
03897   <font class="keywordflow">if</font> (!_dbus_marshal_uint32 (&amp;real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>, real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m7">byte_order</a>, 0))
03898     {
03899       _dbus_string_set_length (&amp;real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>, real-&gt;<a class="code" href="structDBusMessageRealIter.html#m4">pos</a>);
03900       <font class="keywordflow">return</font> FALSE;
03901     }
03902   
03903   dict_real-&gt;<a class="code" href="structDBusMessageRealIter.html#m0">parent_iter</a> = real;
03904   dict_real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a> = real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>;
03905   dict_real-&gt;<a class="code" href="structDBusMessageRealIter.html#m2">changed_stamp</a> = real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m10">changed_stamp</a>;
03906   
03907   dict_real-&gt;<a class="code" href="structDBusMessageRealIter.html#m3">type</a> = DBUS_MESSAGE_ITER_TYPE_DICT;
03908   dict_real-&gt;<a class="code" href="structDBusMessageRealIter.html#m4">pos</a> = _dbus_string_get_length (&amp;real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>);
03909   dict_real-&gt;<a class="code" href="structDBusMessageRealIter.html#m5">end</a> = dict_real-&gt;<a class="code" href="structDBusMessageRealIter.html#m5">end</a>;
03910   
03911   dict_real-&gt;<a class="code" href="structDBusMessageRealIter.html#m6">container_start</a> = dict_real-&gt;<a class="code" href="structDBusMessageRealIter.html#m4">pos</a>;
03912   dict_real-&gt;<a class="code" href="structDBusMessageRealIter.html#m7">container_length_pos</a> = len_pos;
03913   dict_real-&gt;<a class="code" href="structDBusMessageRealIter.html#m8">wrote_dict_key</a> = 0;
03914 
03915   dbus_message_iter_append_done (dict_real);
03916   
03917   real-&gt;<a class="code" href="structDBusMessageRealIter.html#m8">wrote_dict_key</a> = FALSE;
03918   
03919   <font class="keywordflow">return</font> TRUE;
03920 }
03921 
03922 <font class="keyword">static</font> dbus_bool_t
03923 _dbus_message_iter_append_basic_array (<a class="code" href="structDBusMessageIter.html">DBusMessageIter</a> *iter,
03924                                        <font class="keywordtype">char</font>             type,
03925                                        <font class="keyword">const</font> <font class="keywordtype">void</font>      *value,
03926                                        <font class="keywordtype">int</font>              len)
03927 {
03928   DBusMessageRealIter *real = (DBusMessageRealIter *)iter;
03929 
03930   _dbus_return_val_if_fail (dbus_message_iter_append_check (real), FALSE);
03931 
03932   <font class="keywordflow">if</font> (!append_array_type (real, type, NULL, NULL))
03933     <font class="keywordflow">return</font> FALSE;
03934   
03935   <font class="keywordflow">if</font> (!_dbus_marshal_basic_type_array (&amp;real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>,
03936                                        type, value, len,
03937                                        real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m7">byte_order</a>))
03938     {
03939       _dbus_string_set_length (&amp;real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>, real-&gt;<a class="code" href="structDBusMessageRealIter.html#m4">pos</a>);
03940       <font class="keywordflow">return</font> FALSE;
03941     }
03942 
03943   dbus_message_iter_append_done (real);
03944   
03945   <font class="keywordflow">return</font> TRUE;
03946 }
03947 
03948 
03962 dbus_bool_t
<a name="l03963"></a><a class="code" href="group__DBusMessage.html#a88">03963</a> dbus_message_append_args_valist (<a class="code" href="structDBusMessage.html">DBusMessage</a> *message,
03964                                  <font class="keywordtype">int</font>          first_arg_type,
03965                                  va_list      var_args)
03966 {
03967   <font class="keywordtype">int</font> type, old_len;
03968   <a class="code" href="structDBusMessageIter.html">DBusMessageIter</a> iter;
03969 
03970   _dbus_return_val_if_fail (message != NULL, FALSE);
03971   
03972   old_len = _dbus_string_get_length (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>);
03973   
03974   type = first_arg_type;
03975 
03976   dbus_message_append_iter_init (message, &amp;iter);
03977   
03978   <font class="keywordflow">while</font> (type != DBUS_TYPE_INVALID)
03979     {
03980       <font class="keywordflow">switch</font> (type)
03981         {
03982         <font class="keywordflow">case</font> DBUS_TYPE_NIL:
03983           <font class="keywordflow">if</font> (!dbus_message_iter_append_nil (&amp;iter))
03984             <font class="keywordflow">goto</font> errorout;
03985           <font class="keywordflow">break</font>;
03986         <font class="keywordflow">case</font> DBUS_TYPE_BYTE:
03987           <font class="comment">/* FIXME if you pass an unsigned char to varargs it gets promoted to int,</font>
03988 <font class="comment">           * so probably we should read an int here.</font>
03989 <font class="comment">           */</font>
03990           <font class="keywordflow">if</font> (!dbus_message_iter_append_byte (&amp;iter, va_arg (var_args, <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font>)))
03991             <font class="keywordflow">goto</font> errorout;
03992           <font class="keywordflow">break</font>;
03993         <font class="keywordflow">case</font> DBUS_TYPE_BOOLEAN:
03994           <font class="keywordflow">if</font> (!dbus_message_iter_append_boolean (&amp;iter, va_arg (var_args, dbus_bool_t)))
03995             <font class="keywordflow">goto</font> errorout;
03996           <font class="keywordflow">break</font>;
03997         <font class="keywordflow">case</font> DBUS_TYPE_INT32:
03998           <font class="comment">/* FIXME this is probably wrong, because an int passed in probably gets</font>
03999 <font class="comment">           * converted to plain "int" not necessarily 32-bit.</font>
04000 <font class="comment">           */</font>
04001           <font class="keywordflow">if</font> (!dbus_message_iter_append_int32 (&amp;iter, va_arg (var_args, dbus_int32_t)))
04002             <font class="keywordflow">goto</font> errorout;
04003           <font class="keywordflow">break</font>;
04004         <font class="keywordflow">case</font> DBUS_TYPE_UINT32:
04005           <font class="comment">/* FIXME this is probably wrong, because an int passed in probably gets</font>
04006 <font class="comment">           * converted to plain "int" not necessarily 32-bit.</font>
04007 <font class="comment">           */</font>
04008           <font class="keywordflow">if</font> (!dbus_message_iter_append_uint32 (&amp;iter, va_arg (var_args, dbus_uint32_t)))
04009             <font class="keywordflow">goto</font> errorout;          
04010           <font class="keywordflow">break</font>;
04011 <font class="preprocessor">#ifdef DBUS_HAVE_INT64</font>
04012 <font class="preprocessor"></font>        <font class="keywordflow">case</font> DBUS_TYPE_INT64:
04013           <font class="keywordflow">if</font> (!dbus_message_iter_append_int64 (&amp;iter, va_arg (var_args, dbus_int64_t)))
04014             <font class="keywordflow">goto</font> errorout;
04015           <font class="keywordflow">break</font>;
04016         <font class="keywordflow">case</font> DBUS_TYPE_UINT64:
04017           <font class="keywordflow">if</font> (!dbus_message_iter_append_uint64 (&amp;iter, va_arg (var_args, dbus_uint64_t)))
04018             <font class="keywordflow">goto</font> errorout;          
04019           <font class="keywordflow">break</font>;
04020 <font class="preprocessor">#endif </font><font class="comment">/* DBUS_HAVE_INT64 */</font>
04021         <font class="keywordflow">case</font> DBUS_TYPE_DOUBLE:
04022           <font class="keywordflow">if</font> (!dbus_message_iter_append_double (&amp;iter, va_arg (var_args, <font class="keywordtype">double</font>)))
04023             <font class="keywordflow">goto</font> errorout;
04024           <font class="keywordflow">break</font>;
04025         <font class="keywordflow">case</font> DBUS_TYPE_STRING:
04026           <font class="keywordflow">if</font> (!dbus_message_iter_append_string (&amp;iter, va_arg (var_args, <font class="keyword">const</font> <font class="keywordtype">char</font> *)))
04027             <font class="keywordflow">goto</font> errorout;
04028           <font class="keywordflow">break</font>;
04029         <font class="keywordflow">case</font> DBUS_TYPE_OBJECT_PATH:
04030           <font class="keywordflow">if</font> (!dbus_message_iter_append_object_path (&amp;iter, va_arg (var_args, <font class="keyword">const</font> <font class="keywordtype">char</font>*)))
04031             <font class="keywordflow">goto</font> errorout;
04032           <font class="keywordflow">break</font>;
04033         <font class="keywordflow">case</font> DBUS_TYPE_CUSTOM:
04034           {
04035             <font class="keyword">const</font> <font class="keywordtype">char</font> *name;
04036             <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *data;
04037             <font class="keywordtype">int</font> len;
04038  
04039             name = va_arg (var_args, <font class="keyword">const</font> <font class="keywordtype">char</font> *);
04040             data = va_arg (var_args, <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *);
04041             len = va_arg (var_args, <font class="keywordtype">int</font>);
04042 
04043             <font class="keywordflow">if</font> (!dbus_message_iter_append_custom (&amp;iter, name, data, len))
04044               <font class="keywordflow">goto</font> errorout;
04045             <font class="keywordflow">break</font>;
04046           }
04047         <font class="keywordflow">case</font> DBUS_TYPE_ARRAY:
04048           {
04049             <font class="keywordtype">void</font> *data;
04050             <font class="keywordtype">int</font> len, type;
04051  
04052             type = va_arg (var_args, <font class="keywordtype">int</font>);
04053             data = va_arg (var_args, <font class="keywordtype">void</font> *);
04054             len = va_arg (var_args, <font class="keywordtype">int</font>);
04055 
04056             <font class="keywordflow">switch</font> (type)
04057               {
04058               <font class="keywordflow">case</font> DBUS_TYPE_BYTE:
04059               <font class="keywordflow">case</font> DBUS_TYPE_BOOLEAN:
04060               <font class="keywordflow">case</font> DBUS_TYPE_INT32:
04061               <font class="keywordflow">case</font> DBUS_TYPE_UINT32:
04062 <font class="preprocessor">#ifdef DBUS_HAVE_INT64</font>
04063 <font class="preprocessor"></font>              <font class="keywordflow">case</font> DBUS_TYPE_INT64:
04064               <font class="keywordflow">case</font> DBUS_TYPE_UINT64:
04065 <font class="preprocessor">#endif </font><font class="comment">/* DBUS_HAVE_INT64 */</font>
04066               <font class="keywordflow">case</font> DBUS_TYPE_DOUBLE:
04067                 <font class="keywordflow">if</font> (!_dbus_message_iter_append_basic_array (&amp;iter, type, data, len))
04068                   <font class="keywordflow">goto</font> errorout;
04069                 <font class="keywordflow">break</font>;
04070               <font class="keywordflow">case</font> DBUS_TYPE_STRING:
04071                 <font class="keywordflow">if</font> (!dbus_message_iter_append_string_array (&amp;iter, (<font class="keyword">const</font> <font class="keywordtype">char</font> **)data, len))
04072                   <font class="keywordflow">goto</font> errorout;
04073                 <font class="keywordflow">break</font>;
04074               <font class="keywordflow">case</font> DBUS_TYPE_OBJECT_PATH:
04075                 <font class="keywordflow">if</font> (!dbus_message_iter_append_object_path_array (&amp;iter, (<font class="keyword">const</font> <font class="keywordtype">char</font> **)data, len))
04076                   <font class="keywordflow">goto</font> errorout;
04077                 <font class="keywordflow">break</font>;
04078               <font class="keywordflow">case</font> DBUS_TYPE_NIL:
04079               <font class="keywordflow">case</font> DBUS_TYPE_ARRAY:
04080               <font class="keywordflow">case</font> DBUS_TYPE_CUSTOM:
04081               <font class="keywordflow">case</font> DBUS_TYPE_DICT:
04082                 _dbus_warn (<font class="stringliteral">"dbus_message_append_args_valist doesn't support recursive arrays\n"</font>);
04083                 <font class="keywordflow">goto</font> errorout;
04084               <font class="keywordflow">default</font>:
04085                 _dbus_warn (<font class="stringliteral">"Unknown field type %d\n"</font>, type);
04086                 <font class="keywordflow">goto</font> errorout;
04087               }
04088           }
04089           <font class="keywordflow">break</font>;
04090           
04091         <font class="keywordflow">case</font> DBUS_TYPE_DICT:
04092           _dbus_warn (<font class="stringliteral">"dbus_message_append_args_valist doesn't support dicts\n"</font>);
04093           <font class="keywordflow">goto</font> errorout;
04094         <font class="keywordflow">default</font>:
04095           _dbus_warn (<font class="stringliteral">"Unknown field type %d\n"</font>, type);
04096           <font class="keywordflow">goto</font> errorout;
04097         }
04098 
04099       type = va_arg (var_args, <font class="keywordtype">int</font>);
04100     }
04101 
04102   <font class="keywordflow">return</font> TRUE;
04103 
04104  errorout:
04105   <font class="keywordflow">return</font> FALSE;
04106 }
04107 
04116 dbus_bool_t
<a name="l04117"></a><a class="code" href="group__DBusMessage.html#a89">04117</a> dbus_message_iter_append_boolean_array (<a class="code" href="structDBusMessageIter.html">DBusMessageIter</a>     *iter,
04118                                         <font class="keywordtype">unsigned</font> <font class="keyword">const</font> <font class="keywordtype">char</font> *value,
04119                                         <font class="keywordtype">int</font>                  len)
04120 {
04121   <font class="keywordflow">return</font> _dbus_message_iter_append_basic_array (iter, DBUS_TYPE_BOOLEAN,
04122                                                 value, len);
04123 }
04124 
04133 dbus_bool_t
<a name="l04134"></a><a class="code" href="group__DBusMessage.html#a90">04134</a> dbus_message_iter_append_int32_array (<a class="code" href="structDBusMessageIter.html">DBusMessageIter</a>    *iter,
04135                                       <font class="keyword">const</font> dbus_int32_t *value,
04136                                       <font class="keywordtype">int</font>                 len)
04137 {
04138   <font class="keywordflow">return</font> _dbus_message_iter_append_basic_array (iter, DBUS_TYPE_INT32,
04139                                                 value, len);
04140 }
04141 
04150 dbus_bool_t
<a name="l04151"></a><a class="code" href="group__DBusMessage.html#a91">04151</a> dbus_message_iter_append_uint32_array (<a class="code" href="structDBusMessageIter.html">DBusMessageIter</a>     *iter,
04152                                        <font class="keyword">const</font> dbus_uint32_t *value,
04153                                        <font class="keywordtype">int</font>                  len)
04154 {
04155   <font class="keywordflow">return</font> _dbus_message_iter_append_basic_array (iter, DBUS_TYPE_UINT32,
04156                                                 value, len);
04157 }
04158 
04159 <font class="preprocessor">#ifdef DBUS_HAVE_INT64</font>
04160 <font class="preprocessor"></font>
04171 dbus_bool_t
<a name="l04172"></a><a class="code" href="group__DBusMessage.html#a92">04172</a> dbus_message_iter_append_int64_array (<a class="code" href="structDBusMessageIter.html">DBusMessageIter</a>    *iter,
04173                                       <font class="keyword">const</font> dbus_int64_t *value,
04174                                       <font class="keywordtype">int</font>                 len)
04175 {
04176   <font class="keywordflow">return</font> _dbus_message_iter_append_basic_array (iter, DBUS_TYPE_INT64,
04177                                                 value, len);
04178 }
04179 
04190 dbus_bool_t
<a name="l04191"></a><a class="code" href="group__DBusMessage.html#a93">04191</a> dbus_message_iter_append_uint64_array (<a class="code" href="structDBusMessageIter.html">DBusMessageIter</a>     *iter,
04192                                        <font class="keyword">const</font> dbus_uint64_t *value,
04193                                        <font class="keywordtype">int</font>                  len)
04194 {
04195   <font class="keywordflow">return</font> _dbus_message_iter_append_basic_array (iter, DBUS_TYPE_UINT64,
04196                                                 value, len);
04197 }
04198 <font class="preprocessor">#endif </font><font class="comment">/* DBUS_HAVE_INT64 */</font>
04199 
04208 dbus_bool_t
<a name="l04209"></a><a class="code" href="group__DBusMessage.html#a94">04209</a> dbus_message_iter_append_double_array (<a class="code" href="structDBusMessageIter.html">DBusMessageIter</a> *iter,
04210                                        <font class="keyword">const</font> <font class="keywordtype">double</font>    *value,
04211                                        <font class="keywordtype">int</font>              len)
04212 {
04213   <font class="keywordflow">return</font> _dbus_message_iter_append_basic_array (iter, DBUS_TYPE_DOUBLE,
04214                                                 value, len);
04215 }
04216 
04225 dbus_bool_t
<a name="l04226"></a><a class="code" href="group__DBusMessage.html#a95">04226</a> dbus_message_iter_append_byte_array (<a class="code" href="structDBusMessageIter.html">DBusMessageIter</a>     *iter,
04227                                      <font class="keywordtype">unsigned</font> <font class="keyword">const</font> <font class="keywordtype">char</font> *value,
04228                                      <font class="keywordtype">int</font>                  len)
04229 {
04230   <font class="keywordflow">return</font> _dbus_message_iter_append_basic_array (iter, DBUS_TYPE_BYTE,
04231                                                 value, len);
04232 }
04233 
04242 dbus_bool_t
<a name="l04243"></a><a class="code" href="group__DBusMessage.html#a96">04243</a> dbus_message_iter_append_string_array (<a class="code" href="structDBusMessageIter.html">DBusMessageIter</a> *iter,
04244                                        <font class="keyword">const</font> <font class="keywordtype">char</font>     **value,
04245                                        <font class="keywordtype">int</font>              len)
04246 {
04247   DBusMessageRealIter *real = (DBusMessageRealIter *)iter;
04248 
04249   _dbus_return_val_if_fail (dbus_message_iter_append_check (real), FALSE);
04250 
04251   <font class="keywordflow">if</font> (!append_array_type (real, DBUS_TYPE_STRING, NULL, NULL))
04252     <font class="keywordflow">return</font> FALSE;
04253   
04254   <font class="keywordflow">if</font> (!_dbus_marshal_string_array (&amp;real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>, real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m7">byte_order</a>, value, len))
04255     {
04256       _dbus_string_set_length (&amp;real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>, real-&gt;<a class="code" href="structDBusMessageRealIter.html#m4">pos</a>);
04257       <font class="keywordflow">return</font> FALSE;
04258     }
04259 
04260   dbus_message_iter_append_done (real);
04261   
04262   <font class="keywordflow">return</font> TRUE;
04263 }
04264 
04273 dbus_bool_t
<a name="l04274"></a><a class="code" href="group__DBusMessage.html#a97">04274</a> dbus_message_iter_append_object_path_array (<a class="code" href="structDBusMessageIter.html">DBusMessageIter</a> *iter,
04275                                             <font class="keyword">const</font> <font class="keywordtype">char</font>     **value,
04276                                             <font class="keywordtype">int</font>              len)
04277 {
04278   DBusMessageRealIter *real = (DBusMessageRealIter *)iter;
04279 
04280   _dbus_return_val_if_fail (dbus_message_iter_append_check (real), FALSE);
04281 
04282   <font class="keywordflow">if</font> (!append_array_type (real, DBUS_TYPE_OBJECT_PATH, NULL, NULL))
04283     <font class="keywordflow">return</font> FALSE;
04284   
04285   <font class="keywordflow">if</font> (!_dbus_marshal_string_array (&amp;real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>, real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m7">byte_order</a>, value, len))
04286     {
04287       _dbus_string_set_length (&amp;real-&gt;<a class="code" href="structDBusMessageRealIter.html#m1">message</a>-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>, real-&gt;<a class="code" href="structDBusMessageRealIter.html#m4">pos</a>);
04288       <font class="keywordflow">return</font> FALSE;
04289     }
04290 
04291   dbus_message_iter_append_done (real);
04292   
04293   <font class="keywordflow">return</font> TRUE;
04294 }
04295 
04303 dbus_bool_t
<a name="l04304"></a><a class="code" href="group__DBusMessage.html#a98">04304</a> dbus_message_set_sender (<a class="code" href="structDBusMessage.html">DBusMessage</a>  *message,
04305                          <font class="keyword">const</font> <font class="keywordtype">char</font>   *sender)
04306 {
04307   _dbus_return_val_if_fail (message != NULL, FALSE);
04308   _dbus_return_val_if_fail (!message-&gt;<a class="code" href="structDBusMessage.html#m11">locked</a>, FALSE);
04309 
04310   <font class="keywordflow">return</font> set_string_field (message,
04311                            DBUS_HEADER_FIELD_SENDER,
04312                            DBUS_TYPE_STRING,
04313                            sender);
04314 }
04315 
04326 <font class="keywordtype">void</font>
<a name="l04327"></a><a class="code" href="group__DBusMessage.html#a99">04327</a> dbus_message_set_no_reply (<a class="code" href="structDBusMessage.html">DBusMessage</a> *message,
04328                            dbus_bool_t  no_reply)
04329 {
04330   <font class="keywordtype">char</font> *header;
04331 
04332   _dbus_return_if_fail (message != NULL);
04333   _dbus_return_if_fail (!message-&gt;<a class="code" href="structDBusMessage.html#m11">locked</a>);
04334   
04335   header = _dbus_string_get_data_len (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>, FLAGS_OFFSET, 1);
04336   
04337   <font class="keywordflow">if</font> (no_reply)
04338     *header |= DBUS_HEADER_FLAG_NO_REPLY_EXPECTED;
04339   <font class="keywordflow">else</font>
04340     *header &amp;= ~DBUS_HEADER_FLAG_NO_REPLY_EXPECTED;    
04341 }
04342 
04350 dbus_bool_t
<a name="l04351"></a><a class="code" href="group__DBusMessage.html#a100">04351</a> dbus_message_get_no_reply (<a class="code" href="structDBusMessage.html">DBusMessage</a> *message)
04352 {
04353   <font class="keyword">const</font> <font class="keywordtype">char</font> *header;
04354 
04355   _dbus_return_val_if_fail (message != NULL, FALSE);
04356   
04357   header = _dbus_string_get_const_data_len (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>, FLAGS_OFFSET, 1);
04358 
04359   <font class="keywordflow">return</font> (*header &amp; DBUS_HEADER_FLAG_NO_REPLY_EXPECTED) != 0;
04360 }
04361 
04362 
04372 <font class="keywordtype">void</font>
<a name="l04373"></a><a class="code" href="group__DBusMessage.html#a101">04373</a> dbus_message_set_auto_activation (<a class="code" href="structDBusMessage.html">DBusMessage</a> *message,
04374                                   dbus_bool_t  auto_activation)
04375 {
04376   <font class="keywordtype">char</font> *header;
04377 
04378   _dbus_return_if_fail (message != NULL);
04379   _dbus_return_if_fail (!message-&gt;<a class="code" href="structDBusMessage.html#m11">locked</a>);
04380   
04381   header = _dbus_string_get_data_len (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>, FLAGS_OFFSET, 1);
04382   
04383   <font class="keywordflow">if</font> (auto_activation)
04384     *header |= DBUS_HEADER_FLAG_AUTO_ACTIVATION;
04385   <font class="keywordflow">else</font>
04386     *header &amp;= ~DBUS_HEADER_FLAG_AUTO_ACTIVATION;
04387 }
04388 
04396 dbus_bool_t
<a name="l04397"></a><a class="code" href="group__DBusMessage.html#a102">04397</a> dbus_message_get_auto_activation (<a class="code" href="structDBusMessage.html">DBusMessage</a> *message)
04398 {
04399   <font class="keyword">const</font> <font class="keywordtype">char</font> *header;
04400 
04401   _dbus_return_val_if_fail (message != NULL, FALSE);
04402   
04403   header = _dbus_string_get_const_data_len (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>, FLAGS_OFFSET, 1);
04404 
04405   <font class="keywordflow">return</font> (*header &amp; DBUS_HEADER_FLAG_AUTO_ACTIVATION) != 0;
04406 }
04407 
04415 <font class="keyword">const</font> <font class="keywordtype">char</font>*
<a name="l04416"></a><a class="code" href="group__DBusMessage.html#a103">04416</a> dbus_message_get_sender (<a class="code" href="structDBusMessage.html">DBusMessage</a> *message)
04417 {
04418   _dbus_return_val_if_fail (message != NULL, NULL);
04419   
04420   <font class="keywordflow">return</font> get_string_field (message, 
04421                            DBUS_HEADER_FIELD_SENDER,
04422                            NULL);
04423 }
04424 
04440 <font class="keyword">const</font> <font class="keywordtype">char</font>*
<a name="l04441"></a><a class="code" href="group__DBusMessage.html#a104">04441</a> dbus_message_get_signature (<a class="code" href="structDBusMessage.html">DBusMessage</a> *message)
04442 {
04443   _dbus_return_val_if_fail (message != NULL, NULL);
04444 
04445   <font class="keywordflow">return</font> get_string_field (message, 
04446                            DBUS_HEADER_FIELD_SIGNATURE,
04447                            NULL);
04448 }
04449 
04450 <font class="keyword">static</font> dbus_bool_t
04451 _dbus_message_has_type_interface_member (<a class="code" href="structDBusMessage.html">DBusMessage</a> *message,
04452                                          <font class="keywordtype">int</font>          type,
04453                                          <font class="keyword">const</font> <font class="keywordtype">char</font>  *interface,
04454                                          <font class="keyword">const</font> <font class="keywordtype">char</font>  *method)
04455 {
04456   <font class="keyword">const</font> <font class="keywordtype">char</font> *n;
04457 
04458   _dbus_assert (message != NULL);
04459   _dbus_assert (interface != NULL);
04460   _dbus_assert (method != NULL);
04461 
04462   <font class="keywordflow">if</font> (dbus_message_get_type (message) != type)
04463     <font class="keywordflow">return</font> FALSE;
04464 
04465   <font class="comment">/* Optimize by checking the short method name first</font>
04466 <font class="comment">   * instead of the longer interface name</font>
04467 <font class="comment">   */</font>  
04468 
04469   n = dbus_message_get_member (message);
04470 
04471   <font class="keywordflow">if</font> (n &amp;&amp; strcmp (n, method) == 0)
04472     {
04473       n = dbus_message_get_interface (message);
04474       
04475       <font class="keywordflow">if</font> (n &amp;&amp; strcmp (n, interface) == 0)
04476         <font class="keywordflow">return</font> TRUE;
04477     }
04478 
04479   <font class="keywordflow">return</font> FALSE;
04480 }
04481 
04494 dbus_bool_t
<a name="l04495"></a><a class="code" href="group__DBusMessage.html#a106">04495</a> dbus_message_is_method_call (<a class="code" href="structDBusMessage.html">DBusMessage</a> *message,
04496                              <font class="keyword">const</font> <font class="keywordtype">char</font>  *interface,
04497                              <font class="keyword">const</font> <font class="keywordtype">char</font>  *method)
04498 {
04499   _dbus_return_val_if_fail (message != NULL, FALSE);
04500   _dbus_return_val_if_fail (interface != NULL, FALSE);
04501   _dbus_return_val_if_fail (method != NULL, FALSE);
04502 
04503   <font class="keywordflow">return</font> _dbus_message_has_type_interface_member (message,
04504                                                   DBUS_MESSAGE_TYPE_METHOD_CALL,
04505                                                   interface, method);
04506 }
04507 
04520 dbus_bool_t
<a name="l04521"></a><a class="code" href="group__DBusMessage.html#a107">04521</a> dbus_message_is_signal (<a class="code" href="structDBusMessage.html">DBusMessage</a> *message,
04522                         <font class="keyword">const</font> <font class="keywordtype">char</font>  *interface,
04523                         <font class="keyword">const</font> <font class="keywordtype">char</font>  *signal_name)
04524 {
04525   _dbus_return_val_if_fail (message != NULL, FALSE);
04526   _dbus_return_val_if_fail (interface != NULL, FALSE);
04527   _dbus_return_val_if_fail (signal_name != NULL, FALSE);
04528 
04529   <font class="keywordflow">return</font> _dbus_message_has_type_interface_member (message,
04530                                                   DBUS_MESSAGE_TYPE_SIGNAL,
04531                                                   interface, signal_name);
04532 }
04533 
04544 dbus_bool_t
<a name="l04545"></a><a class="code" href="group__DBusMessage.html#a108">04545</a> dbus_message_is_error (<a class="code" href="structDBusMessage.html">DBusMessage</a> *message,
04546                        <font class="keyword">const</font> <font class="keywordtype">char</font>  *error_name)
04547 {
04548   <font class="keyword">const</font> <font class="keywordtype">char</font> *n;
04549   
04550   _dbus_return_val_if_fail (message != NULL, FALSE);
04551   _dbus_return_val_if_fail (error_name != NULL, FALSE);
04552   _dbus_return_val_if_fail (is_valid_error_name (error_name), FALSE);
04553   
04554   <font class="keywordflow">if</font> (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_ERROR)
04555     <font class="keywordflow">return</font> FALSE;
04556 
04557   n = dbus_message_get_error_name (message);
04558 
04559   <font class="keywordflow">if</font> (n &amp;&amp; strcmp (n, error_name) == 0)
04560     <font class="keywordflow">return</font> TRUE;
04561   <font class="keywordflow">else</font>
04562     <font class="keywordflow">return</font> FALSE;
04563 }
04564 
04575 dbus_bool_t
<a name="l04576"></a><a class="code" href="group__DBusMessage.html#a109">04576</a> dbus_message_has_destination (<a class="code" href="structDBusMessage.html">DBusMessage</a>  *message,
04577                               <font class="keyword">const</font> <font class="keywordtype">char</font>   *service)
04578 {
04579   <font class="keyword">const</font> <font class="keywordtype">char</font> *s;
04580 
04581   _dbus_return_val_if_fail (message != NULL, FALSE);
04582   _dbus_return_val_if_fail (service != NULL, FALSE);
04583   
04584   s = dbus_message_get_destination (message);
04585 
04586   <font class="keywordflow">if</font> (s &amp;&amp; strcmp (s, service) == 0)
04587     <font class="keywordflow">return</font> TRUE;
04588   <font class="keywordflow">else</font>
04589     <font class="keywordflow">return</font> FALSE;
04590 }
04591 
04606 dbus_bool_t
<a name="l04607"></a><a class="code" href="group__DBusMessage.html#a110">04607</a> dbus_message_has_sender (<a class="code" href="structDBusMessage.html">DBusMessage</a>  *message,
04608                          <font class="keyword">const</font> <font class="keywordtype">char</font>   *service)
04609 {
04610   <font class="keyword">const</font> <font class="keywordtype">char</font> *s;
04611 
04612   _dbus_return_val_if_fail (message != NULL, FALSE);
04613   _dbus_return_val_if_fail (service != NULL, FALSE);
04614   
04615   s = dbus_message_get_sender (message);
04616 
04617   <font class="keywordflow">if</font> (s &amp;&amp; strcmp (s, service) == 0)
04618     <font class="keywordflow">return</font> TRUE;
04619   <font class="keywordflow">else</font>
04620     <font class="keywordflow">return</font> FALSE;
04621 }
04622 
04632 dbus_bool_t
<a name="l04633"></a><a class="code" href="group__DBusMessage.html#a111">04633</a> dbus_message_has_signature (<a class="code" href="structDBusMessage.html">DBusMessage</a>   *message,
04634                             <font class="keyword">const</font> <font class="keywordtype">char</font>    *signature)
04635 {
04636   <font class="keyword">const</font> <font class="keywordtype">char</font> *s;
04637 
04638   _dbus_return_val_if_fail (message != NULL, FALSE);
04639   _dbus_return_val_if_fail (signature != NULL, FALSE);
04640   
04641   s = dbus_message_get_signature (message);
04642 
04643   <font class="keywordflow">if</font> (s &amp;&amp; strcmp (s, signature) == 0)
04644     <font class="keywordflow">return</font> TRUE;
04645   <font class="keywordflow">else</font>
04646     <font class="keywordflow">return</font> FALSE;
04647 }
04648 
04666 dbus_bool_t
<a name="l04667"></a><a class="code" href="group__DBusMessage.html#a112">04667</a> dbus_set_error_from_message (<a class="code" href="structDBusError.html">DBusError</a>   *error,
04668                              <a class="code" href="structDBusMessage.html">DBusMessage</a> *message)
04669 {
04670   <font class="keywordtype">char</font> *str;
04671 
04672   _dbus_return_val_if_fail (message != NULL, FALSE);
04673   _dbus_return_val_if_error_is_set (error, FALSE);
04674   
04675   <font class="keywordflow">if</font> (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_ERROR)
04676     <font class="keywordflow">return</font> FALSE;
04677 
04678   str = NULL;
04679   dbus_message_get_args (message, NULL,
04680                          DBUS_TYPE_STRING, &amp;str,
04681                          DBUS_TYPE_INVALID);
04682 
04683   dbus_set_error (error, dbus_message_get_error_name (message),
04684                   str ? <font class="stringliteral">"%s"</font> : NULL, str);
04685 
04686   dbus_free (str);
04687   
04688   <font class="keywordflow">return</font> TRUE;
04689 }
04690 
04715 <font class="comment">/* we definitely use signed ints for sizes, so don't exceed</font>
04716 <font class="comment"> * _DBUS_INT_MAX; and add 16 for paranoia, since a message</font>
04717 <font class="comment"> * over 128M is pretty nuts anyhow.</font>
04718 <font class="comment"> */</font>
04719 
<a name="l04723"></a><a class="code" href="group__DBusMessageInternals.html#a61">04723</a> <font class="preprocessor">#define MAX_SANE_MESSAGE_SIZE (_DBUS_INT_MAX/16)</font>
04724 <font class="preprocessor"></font>
<a name="l04729"></a><a class="code" href="structDBusMessageLoader.html">04729</a> <font class="keyword">struct </font><a class="code" href="structDBusMessageLoader.html">DBusMessageLoader</a>
04730 {
<a name="l04731"></a><a class="code" href="structDBusMessageLoader.html#m0">04731</a>   <font class="keywordtype">int</font> <a class="code" href="structDBusMessageLoader.html#m0">refcount</a>;        
<a name="l04733"></a><a class="code" href="structDBusMessageLoader.html#m1">04733</a>   <a class="code" href="structDBusString.html">DBusString</a> <a class="code" href="structDBusMessageLoader.html#m1">data</a>;     
<a name="l04735"></a><a class="code" href="structDBusMessageLoader.html#m2">04735</a>   <a class="code" href="structDBusList.html">DBusList</a> *<a class="code" href="structDBusMessageLoader.html#m2">messages</a>;  
<a name="l04737"></a><a class="code" href="structDBusMessageLoader.html#m3">04737</a>   <font class="keywordtype">long</font> <a class="code" href="structDBusMessageLoader.html#m3">max_message_size</a>; 
<a name="l04739"></a><a class="code" href="structDBusMessageLoader.html#m4">04739</a>   <font class="keywordtype">unsigned</font> <font class="keywordtype">int</font> <a class="code" href="structDBusMessageLoader.html#m4">buffer_outstanding</a> : 1; 
<a name="l04741"></a><a class="code" href="structDBusMessageLoader.html#m5">04741</a>   <font class="keywordtype">unsigned</font> <font class="keywordtype">int</font> <a class="code" href="structDBusMessageLoader.html#m5">corrupted</a> : 1; 
04742 };
04743 
<a name="l04754"></a><a class="code" href="group__DBusMessageInternals.html#a62">04754</a> <font class="preprocessor">#define INITIAL_LOADER_DATA_LEN 32</font>
04755 <font class="preprocessor"></font>
04762 <a class="code" href="structDBusMessageLoader.html">DBusMessageLoader</a>*
<a name="l04763"></a><a class="code" href="group__DBusMessageInternals.html#a158">04763</a> _dbus_message_loader_new (<font class="keywordtype">void</font>)
04764 {
04765   <a class="code" href="structDBusMessageLoader.html">DBusMessageLoader</a> *loader;
04766 
04767   loader = dbus_new0 (<a class="code" href="structDBusMessageLoader.html">DBusMessageLoader</a>, 1);
04768   <font class="keywordflow">if</font> (loader == NULL)
04769     <font class="keywordflow">return</font> NULL;
04770   
04771   loader-&gt;<a class="code" href="structDBusMessageLoader.html#m0">refcount</a> = 1;
04772 
04773   <font class="comment">/* Try to cap message size at something that won't *totally* hose</font>
04774 <font class="comment">   * the system if we have a couple of them.</font>
04775 <font class="comment">   */</font>
04776   loader-&gt;<a class="code" href="structDBusMessageLoader.html#m3">max_message_size</a> = _DBUS_ONE_MEGABYTE * 32;
04777   
04778   <font class="keywordflow">if</font> (!_dbus_string_init (&amp;loader-&gt;<a class="code" href="structDBusMessageLoader.html#m1">data</a>))
04779     {
04780       dbus_free (loader);
04781       <font class="keywordflow">return</font> NULL;
04782     }
04783 
04784   <font class="comment">/* preallocate the buffer for speed, ignore failure */</font>
04785   _dbus_string_set_length (&amp;loader-&gt;<a class="code" href="structDBusMessageLoader.html#m1">data</a>, INITIAL_LOADER_DATA_LEN);
04786   _dbus_string_set_length (&amp;loader-&gt;<a class="code" href="structDBusMessageLoader.html#m1">data</a>, 0);
04787   
04788   <font class="keywordflow">return</font> loader;
04789 }
04790 
04797 <a class="code" href="structDBusMessageLoader.html">DBusMessageLoader</a> *
<a name="l04798"></a><a class="code" href="group__DBusMessageInternals.html#a159">04798</a> _dbus_message_loader_ref (<a class="code" href="structDBusMessageLoader.html">DBusMessageLoader</a> *loader)
04799 {
04800   loader-&gt;<a class="code" href="structDBusMessageLoader.html#m0">refcount</a> += 1;
04801 
04802   <font class="keywordflow">return</font> loader;
04803 }
04804 
04811 <font class="keywordtype">void</font>
<a name="l04812"></a><a class="code" href="group__DBusMessageInternals.html#a160">04812</a> _dbus_message_loader_unref (<a class="code" href="structDBusMessageLoader.html">DBusMessageLoader</a> *loader)
04813 {
04814   loader-&gt;<a class="code" href="structDBusMessageLoader.html#m0">refcount</a> -= 1;
04815   <font class="keywordflow">if</font> (loader-&gt;<a class="code" href="structDBusMessageLoader.html#m0">refcount</a> == 0)
04816     {
04817       _dbus_list_foreach (&amp;loader-&gt;<a class="code" href="structDBusMessageLoader.html#m2">messages</a>,
04818                           (DBusForeachFunction) dbus_message_unref,
04819                           NULL);
04820       _dbus_list_clear (&amp;loader-&gt;<a class="code" href="structDBusMessageLoader.html#m2">messages</a>);
04821       _dbus_string_free (&amp;loader-&gt;<a class="code" href="structDBusMessageLoader.html#m1">data</a>);
04822       dbus_free (loader);
04823     }
04824 }
04825 
04844 <font class="keywordtype">void</font>
<a name="l04845"></a><a class="code" href="group__DBusMessageInternals.html#a161">04845</a> _dbus_message_loader_get_buffer (<a class="code" href="structDBusMessageLoader.html">DBusMessageLoader</a>  *loader,
04846                                  <a class="code" href="structDBusString.html">DBusString</a>        **buffer)
04847 {
04848   _dbus_assert (!loader-&gt;<a class="code" href="structDBusMessageLoader.html#m4">buffer_outstanding</a>);
04849 
04850   *buffer = &amp;loader-&gt;<a class="code" href="structDBusMessageLoader.html#m1">data</a>;
04851   
04852   loader-&gt;<a class="code" href="structDBusMessageLoader.html#m4">buffer_outstanding</a> = TRUE;
04853 }
04854 
<a name="l04859"></a><a class="code" href="group__DBusMessageInternals.html#a63">04859</a> <font class="preprocessor">#define DBUS_MINIMUM_HEADER_SIZE 16</font>
04860 <font class="preprocessor"></font>
04861 <font class="keyword">static</font> dbus_bool_t
04862 decode_string_field (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a>   *data,
04863                      <font class="keywordtype">int</font>                 field,
04864                      <a class="code" href="structHeaderField.html">HeaderField</a>        *header_field,
04865                      <a class="code" href="structDBusString.html">DBusString</a>         *field_data,
04866                      <font class="keywordtype">int</font>                 pos,
04867                      <font class="keywordtype">int</font>                 type)
04868 {
04869   <font class="keywordtype">int</font> string_data_pos;
04870 
04871   _dbus_assert (header_field != NULL);
04872   _dbus_assert (field_data != NULL);
04873   
04874   <font class="keywordflow">if</font> (header_field-&gt;<a class="code" href="structHeaderField.html#m0">name_offset</a> &gt;= 0)
04875     {
04876       _dbus_verbose (<font class="stringliteral">"%s field provided twice\n"</font>,
04877                      _dbus_header_field_to_string (field));
04878       <font class="keywordflow">return</font> FALSE;
04879     }
04880 
04881   <font class="keywordflow">if</font> (type != DBUS_TYPE_STRING)
04882     {
04883       _dbus_verbose (<font class="stringliteral">"%s field has wrong type %s\n"</font>,
04884                      _dbus_header_field_to_string (field),
04885                      _dbus_type_to_string (type));
04886       <font class="keywordflow">return</font> FALSE;
04887     }
04888 
04889   <font class="comment">/* skip padding after typecode, skip string length;</font>
04890 <font class="comment">   * we assume that the string arg has already been validated</font>
04891 <font class="comment">   * for sanity and UTF-8</font>
04892 <font class="comment">   */</font>
04893   string_data_pos = _DBUS_ALIGN_VALUE (pos, 4) + 4;
04894   _dbus_assert (string_data_pos &lt; _dbus_string_get_length (data));
04895   
04896   _dbus_string_init_const (field_data,
04897                            _dbus_string_get_const_data (data) + string_data_pos);
04898 
04899   header_field-&gt;<a class="code" href="structHeaderField.html#m0">name_offset</a>  = pos - 2;
04900   header_field-&gt;<a class="code" href="structHeaderField.html#m1">value_offset</a> = _DBUS_ALIGN_VALUE (pos, 4);
04901   
04902 <font class="preprocessor">#if 0</font>
04903 <font class="preprocessor"></font>  _dbus_verbose (<font class="stringliteral">"Found field %s at offset %d\n"</font>,
04904                  _dbus_header_field_to_string (field),
04905                  header_field-&gt;<a class="code" href="structHeaderField.html#m1">value_offset</a>);
04906 <font class="preprocessor">#endif</font>
04907 <font class="preprocessor"></font>
04908   <font class="keywordflow">return</font> TRUE;
04909 }
04910 
04911 <font class="comment">/* FIXME because the service/interface/member/error names are already</font>
04912 <font class="comment"> * validated to be in the particular ASCII subset, UTF-8 validating</font>
04913 <font class="comment"> * them could be skipped as a probably-interesting optimization.</font>
04914 <font class="comment"> * The UTF-8 validation definitely shows up in profiles.</font>
04915 <font class="comment"> */</font>
04916 <font class="keyword">static</font> dbus_bool_t
04917 decode_header_data (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a>   *data,
04918                     <font class="keywordtype">int</font>                 header_len,
04919                     <font class="keywordtype">int</font>                 byte_order,
04920                     <font class="keywordtype">int</font>                 message_type,
04921                     <a class="code" href="structHeaderField.html">HeaderField</a>         fields[DBUS_HEADER_FIELD_LAST + 1],
04922                     <font class="keywordtype">int</font>                *message_padding)
04923 {
04924   <a class="code" href="structDBusString.html">DBusString</a> field_data;
04925   <font class="keywordtype">int</font> pos, new_pos;
04926   <font class="keywordtype">int</font> i;
04927   <font class="keywordtype">int</font> field;
04928   <font class="keywordtype">int</font> type;
04929   dbus_bool_t signature_required;
04930   
04931   <font class="keywordflow">if</font> (header_len &lt; 16)
04932     {
04933       _dbus_verbose (<font class="stringliteral">"Header length %d is too short\n"</font>, header_len);
04934       <font class="keywordflow">return</font> FALSE;
04935     }
04936   
04937   i = 0;
04938   <font class="keywordflow">while</font> (i &lt;= DBUS_HEADER_FIELD_LAST)
04939     {
04940       fields[i].name_offset  = -1;
04941       fields[i].value_offset = -1;
04942       ++i;
04943     }
04944   
04945   pos = 16;
04946   <font class="keywordflow">while</font> (pos &lt; header_len)
04947     {
04948       field = _dbus_string_get_byte (data, pos);
04949       <font class="keywordflow">if</font> (field == DBUS_HEADER_FIELD_INVALID)
04950         <font class="keywordflow">break</font>; <font class="comment">/* Must be padding */</font>
04951       pos++;
04952 
04953       <font class="keywordflow">if</font> (!_dbus_marshal_validate_type (data, pos, &amp;type, &amp;pos))
04954         {
04955           _dbus_verbose (<font class="stringliteral">"Failed to validate type of named header field pos = %d\n"</font>,
04956                          pos);
04957           <font class="keywordflow">return</font> FALSE;
04958         }
04959       
04960       <font class="keywordflow">if</font> (!_dbus_marshal_validate_arg (data, byte_order, 0, type, -1, pos, &amp;new_pos))
04961         {
04962           _dbus_verbose (<font class="stringliteral">"Failed to validate argument to named header field pos = %d\n"</font>,
04963                          pos);
04964           <font class="keywordflow">return</font> FALSE;
04965         }
04966 
04967       <font class="keywordflow">if</font> (new_pos &gt; header_len)
04968         {
04969           _dbus_verbose (<font class="stringliteral">"Named header field tries to extend beyond header length\n"</font>);
04970           <font class="keywordflow">return</font> FALSE;
04971         }
04972       
04973       <font class="keywordflow">switch</font> (field)
04974         {
04975         <font class="keywordflow">case</font> DBUS_HEADER_FIELD_DESTINATION:
04976           <font class="keywordflow">if</font> (!decode_string_field (data, field, &amp;fields[field],
04977                                     &amp;field_data, pos, type))
04978             <font class="keywordflow">return</font> FALSE;
04979 
04980           <font class="keywordflow">if</font> (!_dbus_string_validate_service (&amp;field_data, 0,
04981                                               _dbus_string_get_length (&amp;field_data)))
04982             {
04983               _dbus_verbose (<font class="stringliteral">"service field has invalid content \"%s\"\n"</font>,
04984                              _dbus_string_get_const_data (&amp;field_data));
04985               <font class="keywordflow">return</font> FALSE;
04986             }
04987           <font class="keywordflow">break</font>;
04988 
04989         <font class="keywordflow">case</font> DBUS_HEADER_FIELD_INTERFACE:
04990           <font class="keywordflow">if</font> (!decode_string_field (data, field, &amp;fields[field],
04991                                     &amp;field_data, pos, type))
04992             <font class="keywordflow">return</font> FALSE;
04993 
04994           <font class="keywordflow">if</font> (!_dbus_string_validate_interface (&amp;field_data, 0,
04995                                                 _dbus_string_get_length (&amp;field_data)))
04996             {
04997               _dbus_verbose (<font class="stringliteral">"interface field has invalid content \"%s\"\n"</font>,
04998                              _dbus_string_get_const_data (&amp;field_data));
04999               <font class="keywordflow">return</font> FALSE;
05000             }
05001       
05002           <font class="keywordflow">if</font> (_dbus_string_equal_c_str (&amp;field_data,
05003                                         DBUS_INTERFACE_ORG_FREEDESKTOP_LOCAL))
05004             {
05005               _dbus_verbose (<font class="stringliteral">"Message is on the local interface\n"</font>);
05006               <font class="keywordflow">return</font> FALSE;
05007             }
05008           <font class="keywordflow">break</font>;
05009 
05010         <font class="keywordflow">case</font> DBUS_HEADER_FIELD_MEMBER:
05011           <font class="keywordflow">if</font> (!decode_string_field (data, field, &amp;fields[field],
05012                                     &amp;field_data, pos, type))
05013             <font class="keywordflow">return</font> FALSE;
05014           
05015           <font class="keywordflow">if</font> (!_dbus_string_validate_member (&amp;field_data, 0,
05016                                              _dbus_string_get_length (&amp;field_data)))
05017             {
05018               _dbus_verbose (<font class="stringliteral">"member field has invalid content \"%s\"\n"</font>,
05019                              _dbus_string_get_const_data (&amp;field_data));
05020               <font class="keywordflow">return</font> FALSE;
05021             }
05022           <font class="keywordflow">break</font>;
05023 
05024         <font class="keywordflow">case</font> DBUS_HEADER_FIELD_ERROR_NAME:
05025           <font class="keywordflow">if</font> (!decode_string_field (data, field, &amp;fields[field],
05026                                     &amp;field_data, pos, type))
05027             <font class="keywordflow">return</font> FALSE;
05028           
05029           <font class="keywordflow">if</font> (!_dbus_string_validate_error_name (&amp;field_data, 0,
05030                                                  _dbus_string_get_length (&amp;field_data)))
05031             {
05032               _dbus_verbose (<font class="stringliteral">"error-name field has invalid content \"%s\"\n"</font>,
05033                              _dbus_string_get_const_data (&amp;field_data));
05034               <font class="keywordflow">return</font> FALSE;
05035             }
05036           <font class="keywordflow">break</font>;
05037           
05038         <font class="keywordflow">case</font> DBUS_HEADER_FIELD_SENDER:
05039           <font class="keywordflow">if</font> (!decode_string_field (data, field, &amp;fields[field],
05040                                     &amp;field_data, pos, type))
05041             <font class="keywordflow">return</font> FALSE;
05042           
05043           <font class="keywordflow">if</font> (!_dbus_string_validate_service (&amp;field_data, 0,
05044                                               _dbus_string_get_length (&amp;field_data)))
05045             {
05046               _dbus_verbose (<font class="stringliteral">"sender-service field has invalid content \"%s\"\n"</font>,
05047                              _dbus_string_get_const_data (&amp;field_data));
05048               <font class="keywordflow">return</font> FALSE;
05049             }
05050           <font class="keywordflow">break</font>;
05051 
05052         <font class="keywordflow">case</font> DBUS_HEADER_FIELD_PATH:
05053 
05054           <font class="comment">/* Path was already validated as part of standard</font>
05055 <font class="comment">           * type validation, since there's an OBJECT_PATH</font>
05056 <font class="comment">           * type.</font>
05057 <font class="comment">           */</font>
05058           
05059           <font class="keywordflow">if</font> (fields[field].name_offset &gt;= 0)
05060             {
05061               _dbus_verbose (<font class="stringliteral">"path field provided twice\n"</font>);
05062               <font class="keywordflow">return</font> FALSE;
05063             }
05064           <font class="keywordflow">if</font> (type != DBUS_TYPE_OBJECT_PATH)
05065             {
05066               _dbus_verbose (<font class="stringliteral">"path field has wrong type\n"</font>);
05067               <font class="keywordflow">return</font> FALSE;
05068             }
05069 
05070           fields[field].name_offset  = pos - 2;
05071           fields[field].value_offset = _DBUS_ALIGN_VALUE (pos, 4);
05072 
05073           <font class="comment">/* No forging signals from the local path */</font>
05074           {
05075             <font class="keyword">const</font> <font class="keywordtype">char</font> *s;
05076             s = _dbus_string_get_const_data_len (data,
05077                                                  fields[field].value_offset,
05078                                                  _dbus_string_get_length (data) -
05079                                                  fields[field].value_offset);
05080             <font class="keywordflow">if</font> (strcmp (s, DBUS_PATH_ORG_FREEDESKTOP_LOCAL) == 0)
05081               {
05082                 _dbus_verbose (<font class="stringliteral">"Message is on the local path\n"</font>);
05083                 <font class="keywordflow">return</font> FALSE;
05084               }
05085           }
05086           
05087           _dbus_verbose (<font class="stringliteral">"Found path at offset %d\n"</font>,
05088                          fields[field].value_offset);
05089           <font class="keywordflow">break</font>;
05090           
05091         <font class="keywordflow">case</font> DBUS_HEADER_FIELD_REPLY_SERIAL:
05092           <font class="keywordflow">if</font> (fields[field].name_offset &gt;= 0)
05093             {
05094               _dbus_verbose (<font class="stringliteral">"reply field provided twice\n"</font>);
05095               <font class="keywordflow">return</font> FALSE;
05096             }
05097 
05098           <font class="keywordflow">if</font> (type != DBUS_TYPE_UINT32)
05099             {
05100               _dbus_verbose (<font class="stringliteral">"reply field has wrong type\n"</font>);
05101               <font class="keywordflow">return</font> FALSE;
05102             }
05103           
05104           fields[field].name_offset  = pos - 2;
05105           fields[field].value_offset = _DBUS_ALIGN_VALUE (pos, 4);
05106 
05107           _dbus_verbose (<font class="stringliteral">"Found reply serial %u at offset %d\n"</font>,
05108                          _dbus_demarshal_uint32 (data,
05109                                                  byte_order,
05110                                                  fields[field].value_offset,
05111                                                  NULL),
05112                          fields[field].value_offset);
05113           <font class="keywordflow">break</font>;
05114 
05115         <font class="keywordflow">case</font> DBUS_HEADER_FIELD_SIGNATURE:
05116           <font class="keywordflow">if</font> (!decode_string_field (data, field, &amp;fields[field],
05117                                     &amp;field_data, pos, type))
05118             <font class="keywordflow">return</font> FALSE;
05119 
05120 <font class="preprocessor">#if 0</font>
05121 <font class="preprocessor"></font>          <font class="comment">/* FIXME */</font>
05122           <font class="keywordflow">if</font> (!_dbus_string_validate_signature (&amp;field_data, 0,
05123                                                 _dbus_string_get_length (&amp;field_data)))
05124             {
05125               _dbus_verbose (<font class="stringliteral">"signature field has invalid content \"%s\"\n"</font>,
05126                              _dbus_string_get_const_data (&amp;field_data));
05127               <font class="keywordflow">return</font> FALSE;
05128             }
05129 <font class="preprocessor">#endif</font>
05130 <font class="preprocessor"></font>          <font class="keywordflow">break</font>;
05131           
05132         <font class="keywordflow">default</font>:
05133           _dbus_verbose (<font class="stringliteral">"Ignoring an unknown header field: %d at offset %d\n"</font>,
05134                          field, pos);
05135         }
05136       
05137       pos = new_pos;
05138     }
05139 
05140   <font class="keywordflow">if</font> (pos &lt; header_len)
05141     {
05142       <font class="comment">/* Alignment padding, verify that it's nul */</font>
05143       <font class="keywordflow">if</font> ((header_len - pos) &gt;= 8)
05144         {
05145           _dbus_verbose (<font class="stringliteral">"too much header alignment padding\n"</font>);
05146           <font class="keywordflow">return</font> FALSE;
05147         }
05148 
05149       <font class="keywordflow">if</font> (!_dbus_string_validate_nul (data,
05150                                       pos, (header_len - pos)))
05151         {
05152           _dbus_verbose (<font class="stringliteral">"header alignment padding is not nul\n"</font>);
05153           <font class="keywordflow">return</font> FALSE;
05154         }
05155     }
05156 
05157   <font class="comment">/* Depending on message type, enforce presence of certain fields. */</font>
05158   signature_required = TRUE;
05159   
05160   <font class="keywordflow">switch</font> (message_type)
05161     {
05162     <font class="keywordflow">case</font> DBUS_MESSAGE_TYPE_SIGNAL:
05163     <font class="keywordflow">case</font> DBUS_MESSAGE_TYPE_METHOD_CALL:
05164       <font class="keywordflow">if</font> (fields[DBUS_HEADER_FIELD_PATH].value_offset &lt; 0)
05165         {
05166           _dbus_verbose (<font class="stringliteral">"No path field provided\n"</font>);
05167           <font class="keywordflow">return</font> FALSE;
05168         }
05169       <font class="comment">/* FIXME make this optional, only for method calls */</font>
05170       <font class="keywordflow">if</font> (fields[DBUS_HEADER_FIELD_INTERFACE].value_offset &lt; 0)
05171         {
05172           _dbus_verbose (<font class="stringliteral">"No interface field provided\n"</font>);
05173           <font class="keywordflow">return</font> FALSE;
05174         }
05175       <font class="keywordflow">if</font> (fields[DBUS_HEADER_FIELD_MEMBER].value_offset &lt; 0)
05176         {
05177           _dbus_verbose (<font class="stringliteral">"No member field provided\n"</font>);
05178           <font class="keywordflow">return</font> FALSE;
05179         }
05180       <font class="keywordflow">break</font>;
05181     <font class="keywordflow">case</font> DBUS_MESSAGE_TYPE_ERROR:
05182       <font class="keywordflow">if</font> (fields[DBUS_HEADER_FIELD_ERROR_NAME].value_offset &lt; 0)
05183         {
05184           _dbus_verbose (<font class="stringliteral">"No error-name field provided\n"</font>);
05185           <font class="keywordflow">return</font> FALSE;
05186         }
05187       <font class="keywordflow">if</font> (fields[DBUS_HEADER_FIELD_REPLY_SERIAL].value_offset &lt; 0)
05188         {
05189           _dbus_verbose (<font class="stringliteral">"No reply serial field provided in error\n"</font>);
05190           <font class="keywordflow">return</font> FALSE;
05191         }
05192       <font class="keywordflow">break</font>;
05193     <font class="keywordflow">case</font> DBUS_MESSAGE_TYPE_METHOD_RETURN:
05194       <font class="keywordflow">if</font> (fields[DBUS_HEADER_FIELD_REPLY_SERIAL].value_offset &lt; 0)
05195         {
05196           _dbus_verbose (<font class="stringliteral">"No reply serial field provided in method return\n"</font>);
05197           <font class="keywordflow">return</font> FALSE;
05198         }
05199       <font class="keywordflow">break</font>;
05200     <font class="keywordflow">default</font>:
05201       <font class="comment">/* An unknown type, spec requires us to ignore it */</font>
05202       signature_required = FALSE;
05203       <font class="keywordflow">break</font>;
05204     }
05205 
05206   <font class="comment">/* FIXME allow omitting signature field for a message with no arguments? */</font>
05207   <font class="keywordflow">if</font> (signature_required)
05208     {
05209       <font class="keywordflow">if</font> (fields[DBUS_HEADER_FIELD_SIGNATURE].value_offset &lt; 0)
05210         {
05211           _dbus_verbose (<font class="stringliteral">"No signature field provided\n"</font>);
05212           <font class="keywordflow">return</font> FALSE;
05213         }
05214     }
05215   
05216   <font class="keywordflow">if</font> (message_padding)
05217     *message_padding = header_len - pos;  
05218   
05219   <font class="keywordflow">return</font> TRUE;
05220 }
05221 
05232 <font class="keywordtype">void</font>
<a name="l05233"></a><a class="code" href="group__DBusMessageInternals.html#a164">05233</a> _dbus_message_loader_return_buffer (<a class="code" href="structDBusMessageLoader.html">DBusMessageLoader</a>  *loader,
05234                                     <a class="code" href="structDBusString.html">DBusString</a>         *buffer,
05235                                     <font class="keywordtype">int</font>                 bytes_read)
05236 {
05237   _dbus_assert (loader-&gt;<a class="code" href="structDBusMessageLoader.html#m4">buffer_outstanding</a>);
05238   _dbus_assert (buffer == &amp;loader-&gt;<a class="code" href="structDBusMessageLoader.html#m1">data</a>);
05239 
05240   loader-&gt;<a class="code" href="structDBusMessageLoader.html#m4">buffer_outstanding</a> = FALSE;
05241 }
05242 
05243 <font class="keyword">static</font> dbus_bool_t
05244 load_one_message (<a class="code" href="structDBusMessageLoader.html">DBusMessageLoader</a> *loader,
05245                   <font class="keywordtype">int</font>                byte_order,
05246                   <font class="keywordtype">int</font>                message_type,
05247                   <font class="keywordtype">int</font>                header_len,
05248                   <font class="keywordtype">int</font>                body_len)
05249 {
05250   <a class="code" href="structDBusMessage.html">DBusMessage</a> *message;
05251   <a class="code" href="structHeaderField.html">HeaderField</a> fields[DBUS_HEADER_FIELD_LAST + 1];
05252   <font class="keywordtype">int</font> i;
05253   <font class="keywordtype">int</font> next_arg;
05254   dbus_bool_t oom;
05255   <font class="keywordtype">int</font> header_padding;
05256   
05257   message = NULL;
05258   oom = FALSE;
05259   
05260 <font class="preprocessor">#if 0</font>
05261 <font class="preprocessor"></font>  _dbus_verbose_bytes_of_string (&amp;loader-&gt;<a class="code" href="structDBusMessageLoader.html#m1">data</a>, 0, header_len <font class="comment">/* + body_len */</font>);
05262 <font class="preprocessor">#endif    </font>
05263 <font class="preprocessor"></font>
05264   <font class="keywordflow">if</font> (!decode_header_data (&amp;loader-&gt;<a class="code" href="structDBusMessageLoader.html#m1">data</a>,
05265                            header_len, byte_order,
05266                            message_type,
05267                            fields, &amp;header_padding))
05268     {
05269       _dbus_verbose (<font class="stringliteral">"Header was invalid\n"</font>);
05270       loader-&gt;<a class="code" href="structDBusMessageLoader.html#m5">corrupted</a> = TRUE;
05271       <font class="keywordflow">goto</font> failed;
05272     }
05273           
05274   next_arg = header_len;
05275   <font class="keywordflow">while</font> (next_arg &lt; (header_len + body_len))
05276     {
05277       <font class="keywordtype">int</font> type;
05278       <font class="keywordtype">int</font> prev = next_arg;
05279 
05280       <font class="keywordflow">if</font> (!_dbus_marshal_validate_type (&amp;loader-&gt;<a class="code" href="structDBusMessageLoader.html#m1">data</a>, next_arg,
05281                                         &amp;type, &amp;next_arg))
05282         {
05283           _dbus_verbose (<font class="stringliteral">"invalid typecode at offset %d\n"</font>, prev);
05284           loader-&gt;<a class="code" href="structDBusMessageLoader.html#m5">corrupted</a> = TRUE;
05285           <font class="keywordflow">goto</font> failed;
05286         }
05287       
05288       <font class="keywordflow">if</font> (!_dbus_marshal_validate_arg (&amp;loader-&gt;<a class="code" href="structDBusMessageLoader.html#m1">data</a>,
05289                                        byte_order,
05290                                        0,
05291                                        type, -1,
05292                                        next_arg,
05293                                        &amp;next_arg))
05294         {
05295           _dbus_verbose (<font class="stringliteral">"invalid type data at %d, next_arg\n"</font>, next_arg);
05296           loader-&gt;<a class="code" href="structDBusMessageLoader.html#m5">corrupted</a> = TRUE;
05297           <font class="keywordflow">goto</font> failed;
05298         }
05299 
05300       _dbus_assert (next_arg &gt; prev);
05301     }
05302           
05303   <font class="keywordflow">if</font> (next_arg &gt; (header_len + body_len))
05304     {
05305       _dbus_verbose (<font class="stringliteral">"end of last arg at %d but message has len %d+%d=%d\n"</font>,
05306                      next_arg, header_len, body_len,
05307                      header_len + body_len);
05308       loader-&gt;<a class="code" href="structDBusMessageLoader.html#m5">corrupted</a> = TRUE;
05309       <font class="keywordflow">goto</font> failed;
05310     }
05311 
05312   message = dbus_message_new_empty_header ();
05313   <font class="keywordflow">if</font> (message == NULL)
05314     {
05315       _dbus_verbose (<font class="stringliteral">"Failed to allocate empty message\n"</font>);
05316       oom = TRUE;
05317       <font class="keywordflow">goto</font> failed;
05318     }
05319 
05320   message-&gt;<a class="code" href="structDBusMessage.html#m7">byte_order</a> = byte_order;
05321   message-&gt;<a class="code" href="structDBusMessage.html#m5">header_padding</a> = header_padding;
05322           
05323   <font class="comment">/* Copy in the offsets we found */</font>
05324   i = 0;
05325   <font class="keywordflow">while</font> (i &lt;= DBUS_HEADER_FIELD_LAST)
05326     {
05327       message-&gt;<a class="code" href="structDBusMessage.html#m2">header_fields</a>[i] = fields[i];
05328       ++i;
05329     }
05330           
05331   <font class="keywordflow">if</font> (!_dbus_list_append (&amp;loader-&gt;<a class="code" href="structDBusMessageLoader.html#m2">messages</a>, message))
05332     {
05333       _dbus_verbose (<font class="stringliteral">"Failed to append new message to loader queue\n"</font>);
05334       oom = TRUE;
05335       <font class="keywordflow">goto</font> failed;
05336     }
05337 
05338   _dbus_assert (_dbus_string_get_length (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>) == 0);
05339   _dbus_assert (_dbus_string_get_length (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>) == 0);
05340 
05341   _dbus_assert (_dbus_string_get_length (&amp;loader-&gt;<a class="code" href="structDBusMessageLoader.html#m1">data</a>) &gt;=
05342                 (header_len + body_len));
05343           
05344   <font class="keywordflow">if</font> (!_dbus_string_move_len (&amp;loader-&gt;<a class="code" href="structDBusMessageLoader.html#m1">data</a>, 0, header_len, &amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>, 0))
05345     {
05346       _dbus_verbose (<font class="stringliteral">"Failed to move header into new message\n"</font>);
05347       oom = TRUE;
05348       <font class="keywordflow">goto</font> failed;
05349     }
05350           
05351   <font class="keywordflow">if</font> (!_dbus_string_move_len (&amp;loader-&gt;<a class="code" href="structDBusMessageLoader.html#m1">data</a>, 0, body_len, &amp;message-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>, 0))
05352     {
05353       _dbus_verbose (<font class="stringliteral">"Failed to move body into new message\n"</font>);
05354       
05355       oom = TRUE;
05356       <font class="keywordflow">goto</font> failed;
05357     }
05358 
05359   _dbus_assert (_dbus_string_get_length (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>) == header_len);
05360   _dbus_assert (_dbus_string_get_length (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>) == body_len);
05361 
05362   <font class="comment">/* Fill in caches (we checked the types of these fields</font>
05363 <font class="comment">   * earlier)</font>
05364 <font class="comment">   */</font>
05365   message-&gt;<a class="code" href="structDBusMessage.html#m4">reply_serial</a> = get_uint_field (message,
05366                                           DBUS_HEADER_FIELD_REPLY_SERIAL);
05367   
05368   message-&gt;<a class="code" href="structDBusMessage.html#m3">client_serial</a> = _dbus_demarshal_uint32 (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>,
05369                                                    message-&gt;<a class="code" href="structDBusMessage.html#m7">byte_order</a>,
05370                                                    CLIENT_SERIAL_OFFSET,
05371                                                    NULL);
05372   <font class="keywordflow">if</font> (message-&gt;<a class="code" href="structDBusMessage.html#m3">client_serial</a> == 0 ||
05373       (message-&gt;<a class="code" href="structDBusMessage.html#m2">header_fields</a>[DBUS_HEADER_FIELD_REPLY_SERIAL].value_offset &gt;= 0 &amp;&amp; message-&gt;<a class="code" href="structDBusMessage.html#m4">reply_serial</a> == 0))
05374     {
05375       _dbus_verbose (<font class="stringliteral">"client_serial = %d reply_serial = %d, one of these no good\n"</font>,
05376                      message-&gt;<a class="code" href="structDBusMessage.html#m3">client_serial</a>,
05377                      message-&gt;<a class="code" href="structDBusMessage.html#m4">reply_serial</a>);
05378       
05379       loader-&gt;<a class="code" href="structDBusMessageLoader.html#m5">corrupted</a> = TRUE;
05380       <font class="keywordflow">goto</font> failed;
05381     }
05382   
05383   _dbus_verbose (<font class="stringliteral">"Loaded message %p\n"</font>, message);
05384 
05385   _dbus_assert (!oom);
05386   _dbus_assert (!loader-&gt;<a class="code" href="structDBusMessageLoader.html#m5">corrupted</a>);
05387 
05388   <font class="keywordflow">return</font> TRUE;
05389 
05390  failed:
05391   
05392   <font class="comment">/* Clean up */</font>
05393   
05394   <font class="keywordflow">if</font> (message != NULL)
05395     {
05396       <font class="comment">/* Put the data back so we can try again later if it was an OOM issue */</font>
05397       <font class="keywordflow">if</font> (_dbus_string_get_length (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>) &gt; 0)
05398         {
05399           dbus_bool_t result;
05400           
05401           result = _dbus_string_copy_len (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>, 0, body_len,
05402                                           &amp;loader-&gt;<a class="code" href="structDBusMessageLoader.html#m1">data</a>, 0);
05403           
05404           _dbus_assert (result); <font class="comment">/* because DBusString never reallocs smaller */</font>
05405         }
05406       
05407       <font class="keywordflow">if</font> (_dbus_string_get_length (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>) &gt; 0)
05408         {
05409           dbus_bool_t result;
05410           
05411           result = _dbus_string_copy_len (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>, 0, header_len,
05412                                           &amp;loader-&gt;<a class="code" href="structDBusMessageLoader.html#m1">data</a>, 0);
05413           
05414           _dbus_assert (result); <font class="comment">/* because DBusString never reallocs smaller */</font>
05415         }
05416 
05417       <font class="comment">/* does nothing if the message isn't in the list */</font>
05418       _dbus_list_remove_last (&amp;loader-&gt;<a class="code" href="structDBusMessageLoader.html#m2">messages</a>, message);
05419 
05420       dbus_message_unref (message);
05421     }
05422 
05423   
05424   <font class="keywordflow">return</font> !oom;
05425 }
05426 
05440 dbus_bool_t
<a name="l05441"></a><a class="code" href="group__DBusMessageInternals.html#a166">05441</a> _dbus_message_loader_queue_messages (<a class="code" href="structDBusMessageLoader.html">DBusMessageLoader</a> *loader)
05442 {
05443   <font class="keywordflow">while</font> (!loader-&gt;<a class="code" href="structDBusMessageLoader.html#m5">corrupted</a> &amp;&amp; _dbus_string_get_length (&amp;loader-&gt;<a class="code" href="structDBusMessageLoader.html#m1">data</a>) &gt;= 16)
05444     {
05445       <font class="keyword">const</font> <font class="keywordtype">char</font> *header_data;
05446       <font class="keywordtype">int</font> byte_order, message_type, header_len, body_len;
05447       dbus_uint32_t header_len_unsigned, body_len_unsigned;
05448       
05449       header_data = _dbus_string_get_const_data_len (&amp;loader-&gt;<a class="code" href="structDBusMessageLoader.html#m1">data</a>, 0, 16);
05450 
05451       _dbus_assert (_DBUS_ALIGN_ADDRESS (header_data, 4) == header_data);
05452 
05453       <font class="keywordflow">if</font> (header_data[VERSION_OFFSET] != DBUS_MAJOR_PROTOCOL_VERSION)
05454         {
05455           _dbus_verbose (<font class="stringliteral">"Message has protocol version %d ours is %d\n"</font>,
05456                          (<font class="keywordtype">int</font>) header_data[VERSION_OFFSET], DBUS_MAJOR_PROTOCOL_VERSION);
05457           loader-&gt;<a class="code" href="structDBusMessageLoader.html#m5">corrupted</a> = TRUE;
05458           <font class="keywordflow">return</font> TRUE;
05459         }
05460       
05461       byte_order = header_data[BYTE_ORDER_OFFSET];
05462 
05463       <font class="keywordflow">if</font> (byte_order != DBUS_LITTLE_ENDIAN &amp;&amp;
05464           byte_order != DBUS_BIG_ENDIAN)
05465         {
05466           _dbus_verbose (<font class="stringliteral">"Message with bad byte order '%c' received\n"</font>,
05467                          byte_order);
05468           loader-&gt;<a class="code" href="structDBusMessageLoader.html#m5">corrupted</a> = TRUE;
05469           <font class="keywordflow">return</font> TRUE;
05470         }
05471 
05472       <font class="comment">/* Unknown types are ignored, but INVALID is</font>
05473 <font class="comment">       * disallowed</font>
05474 <font class="comment">       */</font>
05475       message_type = header_data[TYPE_OFFSET];
05476       <font class="keywordflow">if</font> (message_type == DBUS_MESSAGE_TYPE_INVALID)
05477         {
05478           _dbus_verbose (<font class="stringliteral">"Message with bad type '%d' received\n"</font>,
05479                          message_type);
05480           loader-&gt;<a class="code" href="structDBusMessageLoader.html#m5">corrupted</a> = TRUE;
05481           <font class="keywordflow">return</font> TRUE;
05482         }      
05483       
05484       header_len_unsigned = _dbus_unpack_uint32 (byte_order, header_data + 4);
05485       body_len_unsigned = _dbus_unpack_uint32 (byte_order, header_data + 8);
05486 
05487       <font class="keywordflow">if</font> (header_len_unsigned &lt; 16)
05488         {
05489           _dbus_verbose (<font class="stringliteral">"Message had broken too-small header length %u\n"</font>,
05490                          header_len_unsigned);
05491           loader-&gt;<a class="code" href="structDBusMessageLoader.html#m5">corrupted</a> = TRUE;
05492           <font class="keywordflow">return</font> TRUE;
05493         }
05494 
05495       <font class="keywordflow">if</font> (header_len_unsigned &gt; (unsigned) MAX_SANE_MESSAGE_SIZE ||
05496           body_len_unsigned &gt; (unsigned) MAX_SANE_MESSAGE_SIZE)
05497         {
05498           _dbus_verbose (<font class="stringliteral">"Header or body length too large (%u %u)\n"</font>,
05499                          header_len_unsigned,
05500                          body_len_unsigned);
05501           loader-&gt;<a class="code" href="structDBusMessageLoader.html#m5">corrupted</a> = TRUE;
05502           <font class="keywordflow">return</font> TRUE;
05503         }
05504 
05505       <font class="comment">/* Now that we know the values are in signed range, get</font>
05506 <font class="comment">       * rid of stupid unsigned, just causes bugs</font>
05507 <font class="comment">       */</font>
05508       header_len = header_len_unsigned;
05509       body_len = body_len_unsigned;
05510 
05511       <font class="keywordflow">if</font> (_DBUS_ALIGN_VALUE (header_len, 8) != header_len_unsigned)
05512         {
05513           
05514           _dbus_verbose (<font class="stringliteral">"header length %d is not aligned to 8 bytes\n"</font>,
05515                          header_len);
05516           loader-&gt;<a class="code" href="structDBusMessageLoader.html#m5">corrupted</a> = TRUE;
05517           <font class="keywordflow">return</font> TRUE;
05518         }
05519       
05520       <font class="keywordflow">if</font> (header_len + body_len &gt; loader-&gt;<a class="code" href="structDBusMessageLoader.html#m3">max_message_size</a>)
05521         {
05522           _dbus_verbose (<font class="stringliteral">"Message claimed length header = %d body = %d exceeds max message length %ld\n"</font>,
05523                          header_len, body_len, loader-&gt;<a class="code" href="structDBusMessageLoader.html#m3">max_message_size</a>);
05524           loader-&gt;<a class="code" href="structDBusMessageLoader.html#m5">corrupted</a> = TRUE;
05525           <font class="keywordflow">return</font> TRUE;
05526         }
05527 
05528       <font class="keywordflow">if</font> (_dbus_string_get_length (&amp;loader-&gt;<a class="code" href="structDBusMessageLoader.html#m1">data</a>) &gt;= (header_len + body_len))
05529         {
05530           <font class="keywordflow">if</font> (!load_one_message (loader, byte_order, message_type,
05531                                  header_len, body_len))
05532             <font class="keywordflow">return</font> FALSE;
05533         }
05534       <font class="keywordflow">else</font>
05535         <font class="keywordflow">return</font> TRUE;
05536     }
05537 
05538   <font class="keywordflow">return</font> TRUE;
05539 }
05540 
05548 <a class="code" href="structDBusMessage.html">DBusMessage</a>*
<a name="l05549"></a><a class="code" href="group__DBusMessageInternals.html#a167">05549</a> _dbus_message_loader_peek_message (<a class="code" href="structDBusMessageLoader.html">DBusMessageLoader</a> *loader)
05550 {
05551   <font class="keywordflow">if</font> (loader-&gt;<a class="code" href="structDBusMessageLoader.html#m2">messages</a>)
05552     <font class="keywordflow">return</font> loader-&gt;<a class="code" href="structDBusMessageLoader.html#m2">messages</a>-&gt;<a class="code" href="structDBusList.html#m2">data</a>;
05553   <font class="keywordflow">else</font>
05554     <font class="keywordflow">return</font> NULL;
05555 }
05556 
05565 <a class="code" href="structDBusMessage.html">DBusMessage</a>*
<a name="l05566"></a><a class="code" href="group__DBusMessageInternals.html#a168">05566</a> _dbus_message_loader_pop_message (<a class="code" href="structDBusMessageLoader.html">DBusMessageLoader</a> *loader)
05567 {
05568   <font class="keywordflow">return</font> _dbus_list_pop_first (&amp;loader-&gt;<a class="code" href="structDBusMessageLoader.html#m2">messages</a>);
05569 }
05570 
05579 <a class="code" href="structDBusList.html">DBusList</a>*
<a name="l05580"></a><a class="code" href="group__DBusMessageInternals.html#a169">05580</a> _dbus_message_loader_pop_message_link (<a class="code" href="structDBusMessageLoader.html">DBusMessageLoader</a> *loader)
05581 {
05582   <font class="keywordflow">return</font> _dbus_list_pop_first_link (&amp;loader-&gt;<a class="code" href="structDBusMessageLoader.html#m2">messages</a>);
05583 }
05584 
05591 <font class="keywordtype">void</font>
<a name="l05592"></a><a class="code" href="group__DBusMessageInternals.html#a170">05592</a> _dbus_message_loader_putback_message_link (<a class="code" href="structDBusMessageLoader.html">DBusMessageLoader</a>  *loader,
05593                                            <a class="code" href="structDBusList.html">DBusList</a>           *link)
05594 {
05595   _dbus_list_prepend_link (&amp;loader-&gt;<a class="code" href="structDBusMessageLoader.html#m2">messages</a>, link);
05596 }
05597 
05607 dbus_bool_t
<a name="l05608"></a><a class="code" href="group__DBusMessageInternals.html#a171">05608</a> _dbus_message_loader_get_is_corrupted (<a class="code" href="structDBusMessageLoader.html">DBusMessageLoader</a> *loader)
05609 {
05610   <font class="keywordflow">return</font> loader-&gt;<a class="code" href="structDBusMessageLoader.html#m5">corrupted</a>;
05611 }
05612 
05619 <font class="keywordtype">void</font>
<a name="l05620"></a><a class="code" href="group__DBusMessageInternals.html#a172">05620</a> _dbus_message_loader_set_max_message_size (<a class="code" href="structDBusMessageLoader.html">DBusMessageLoader</a>  *loader,
05621                                            <font class="keywordtype">long</font>                size)
05622 {
05623   <font class="keywordflow">if</font> (size &gt; MAX_SANE_MESSAGE_SIZE)
05624     {
05625       _dbus_verbose (<font class="stringliteral">"clamping requested max message size %ld to %d\n"</font>,
05626                      size, MAX_SANE_MESSAGE_SIZE);
05627       size = MAX_SANE_MESSAGE_SIZE;
05628     }
05629   loader-&gt;<a class="code" href="structDBusMessageLoader.html#m3">max_message_size</a> = size;
05630 }
05631 
05638 <font class="keywordtype">long</font>
<a name="l05639"></a><a class="code" href="group__DBusMessageInternals.html#a173">05639</a> _dbus_message_loader_get_max_message_size (<a class="code" href="structDBusMessageLoader.html">DBusMessageLoader</a>  *loader)
05640 {
05641   <font class="keywordflow">return</font> loader-&gt;<a class="code" href="structDBusMessageLoader.html#m3">max_message_size</a>;
05642 }
05643 
05644 <font class="keyword">static</font> <a class="code" href="structDBusDataSlotAllocator.html">DBusDataSlotAllocator</a> slot_allocator;
05645 _DBUS_DEFINE_GLOBAL_LOCK (message_slots);
05646 
05661 dbus_bool_t
<a name="l05662"></a><a class="code" href="group__DBusMessageInternals.html#a47">05662</a> dbus_message_allocate_data_slot (dbus_int32_t *slot_p)
05663 {
05664   <font class="keywordflow">return</font> _dbus_data_slot_allocator_alloc (&amp;slot_allocator,
05665                                           _DBUS_LOCK_NAME (message_slots),
05666                                           slot_p);
05667 }
05668 
05680 <font class="keywordtype">void</font>
<a name="l05681"></a><a class="code" href="group__DBusMessageInternals.html#a48">05681</a> dbus_message_free_data_slot (dbus_int32_t *slot_p)
05682 {
05683   _dbus_return_if_fail (*slot_p &gt;= 0);
05684   
05685   _dbus_data_slot_allocator_free (&amp;slot_allocator, slot_p);
05686 }
05687 
05701 dbus_bool_t
<a name="l05702"></a><a class="code" href="group__DBusMessageInternals.html#a49">05702</a> dbus_message_set_data (<a class="code" href="structDBusMessage.html">DBusMessage</a>     *message,
05703                        dbus_int32_t     slot,
05704                        <font class="keywordtype">void</font>            *data,
05705                        DBusFreeFunction free_data_func)
05706 {
05707   DBusFreeFunction old_free_func;
05708   <font class="keywordtype">void</font> *old_data;
05709   dbus_bool_t retval;
05710 
05711   _dbus_return_val_if_fail (message != NULL, FALSE);
05712   _dbus_return_val_if_fail (slot &gt;= 0, FALSE);
05713 
05714   retval = _dbus_data_slot_list_set (&amp;slot_allocator,
05715                                      &amp;message-&gt;<a class="code" href="structDBusMessage.html#m12">slot_list</a>,
05716                                      slot, data, free_data_func,
05717                                      &amp;old_free_func, &amp;old_data);
05718 
05719   <font class="keywordflow">if</font> (retval)
05720     {
05721       <font class="comment">/* Do the actual free outside the message lock */</font>
05722       <font class="keywordflow">if</font> (old_free_func)
05723         (* old_free_func) (old_data);
05724     }
05725 
05726   <font class="keywordflow">return</font> retval;
05727 }
05728 
05737 <font class="keywordtype">void</font>*
<a name="l05738"></a><a class="code" href="group__DBusMessageInternals.html#a50">05738</a> dbus_message_get_data (<a class="code" href="structDBusMessage.html">DBusMessage</a>   *message,
05739                        dbus_int32_t   slot)
05740 {
05741   <font class="keywordtype">void</font> *res;
05742 
05743   _dbus_return_val_if_fail (message != NULL, NULL);
05744   
05745   res = _dbus_data_slot_list_get (&amp;slot_allocator,
05746                                   &amp;message-&gt;<a class="code" href="structDBusMessage.html#m12">slot_list</a>,
05747                                   slot);
05748 
05749   <font class="keywordflow">return</font> res;
05750 }
05751 
05765 <font class="keywordtype">int</font>
<a name="l05766"></a><a class="code" href="group__DBusMessageInternals.html#a51">05766</a> dbus_message_type_from_string (<font class="keyword">const</font> <font class="keywordtype">char</font> *type_str)
05767 {
05768   <font class="keywordflow">if</font> (strcmp (type_str, <font class="stringliteral">"method_call"</font>) == 0)
05769     <font class="keywordflow">return</font> DBUS_MESSAGE_TYPE_METHOD_CALL;
05770   <font class="keywordflow">if</font> (strcmp (type_str, <font class="stringliteral">"method_return"</font>) == 0)
05771     <font class="keywordflow">return</font> DBUS_MESSAGE_TYPE_METHOD_RETURN;
05772   <font class="keywordflow">else</font> <font class="keywordflow">if</font> (strcmp (type_str, <font class="stringliteral">"signal"</font>) == 0)
05773     <font class="keywordflow">return</font> DBUS_MESSAGE_TYPE_SIGNAL;
05774   <font class="keywordflow">else</font> <font class="keywordflow">if</font> (strcmp (type_str, <font class="stringliteral">"error"</font>) == 0)
05775     <font class="keywordflow">return</font> DBUS_MESSAGE_TYPE_ERROR;
05776   <font class="keywordflow">else</font>
05777     <font class="keywordflow">return</font> DBUS_MESSAGE_TYPE_INVALID;
05778 }
05779 
05781 <font class="preprocessor">#ifdef DBUS_BUILD_TESTS</font>
05782 <font class="preprocessor"></font><font class="preprocessor">#include "dbus-test.h"</font>
05783 <font class="preprocessor">#include &lt;stdio.h&gt;</font>
05784 <font class="preprocessor">#include &lt;stdlib.h&gt;</font>
05785 
05786 <font class="keyword">static</font> <font class="keywordtype">void</font>
05787 message_iter_test (<a class="code" href="structDBusMessage.html">DBusMessage</a> *message)
05788 {
05789   <a class="code" href="structDBusMessageIter.html">DBusMessageIter</a> iter, dict, dict2, array, array2;
05790   <font class="keywordtype">char</font> *str;
05791   <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *data;
05792   dbus_int32_t *our_int_array;
05793   <font class="keywordtype">int</font> len;
05794   
05795   dbus_message_iter_init (message, &amp;iter);
05796 
05797   <font class="comment">/* String tests */</font>
05798   <font class="keywordflow">if</font> (dbus_message_iter_get_arg_type (&amp;iter) != DBUS_TYPE_STRING)
05799     _dbus_assert_not_reached (<font class="stringliteral">"Argument type isn't string"</font>);
05800 
05801   str = dbus_message_iter_get_string (&amp;iter);
05802   <font class="keywordflow">if</font> (strcmp (str, <font class="stringliteral">"Test string"</font>) != 0)
05803     _dbus_assert_not_reached (<font class="stringliteral">"Strings differ"</font>);
05804   dbus_free (str);
05805 
05806   <font class="keywordflow">if</font> (!dbus_message_iter_next (&amp;iter))
05807     _dbus_assert_not_reached (<font class="stringliteral">"Reached end of arguments"</font>);
05808 
05809   <font class="comment">/* Signed integer tests */</font>
05810   <font class="keywordflow">if</font> (dbus_message_iter_get_arg_type (&amp;iter) != DBUS_TYPE_INT32)
05811     _dbus_assert_not_reached (<font class="stringliteral">"Argument type isn't int32"</font>);
05812 
05813   <font class="keywordflow">if</font> (dbus_message_iter_get_int32 (&amp;iter) != -0x12345678)
05814     _dbus_assert_not_reached (<font class="stringliteral">"Signed integers differ"</font>);
05815 
05816   <font class="keywordflow">if</font> (!dbus_message_iter_next (&amp;iter))
05817     _dbus_assert_not_reached (<font class="stringliteral">"Reached end of fields"</font>);
05818   
05819   <font class="comment">/* Unsigned integer tests */</font>
05820   <font class="keywordflow">if</font> (dbus_message_iter_get_arg_type (&amp;iter) != DBUS_TYPE_UINT32)
05821     _dbus_assert_not_reached (<font class="stringliteral">"Argument type isn't int32"</font>);
05822 
05823   <font class="keywordflow">if</font> (dbus_message_iter_get_uint32 (&amp;iter) != 0xedd1e)
05824     _dbus_assert_not_reached (<font class="stringliteral">"Unsigned integers differ"</font>);
05825 
05826   <font class="keywordflow">if</font> (!dbus_message_iter_next (&amp;iter))
05827     _dbus_assert_not_reached (<font class="stringliteral">"Reached end of arguments"</font>);
05828 
05829   <font class="comment">/* Double tests */</font>
05830   <font class="keywordflow">if</font> (dbus_message_iter_get_arg_type (&amp;iter) != DBUS_TYPE_DOUBLE)
05831     _dbus_assert_not_reached (<font class="stringliteral">"Argument type isn't double"</font>);
05832 
05833   <font class="keywordflow">if</font> (dbus_message_iter_get_double (&amp;iter) != 3.14159)
05834     _dbus_assert_not_reached (<font class="stringliteral">"Doubles differ"</font>);
05835 
05836   <font class="keywordflow">if</font> (!dbus_message_iter_next (&amp;iter))
05837     _dbus_assert_not_reached (<font class="stringliteral">"Reached end of arguments"</font>);
05838 
05839   <font class="keywordflow">if</font> (dbus_message_iter_get_arg_type (&amp;iter) != DBUS_TYPE_ARRAY)
05840     _dbus_assert_not_reached (<font class="stringliteral">"Argument type not an array"</font>);
05841 
05842   <font class="keywordflow">if</font> (dbus_message_iter_get_array_type (&amp;iter) != DBUS_TYPE_DOUBLE)
05843     _dbus_assert_not_reached (<font class="stringliteral">"Array type not double"</font>);
05844 
05845   
05846   dbus_message_iter_init_array_iterator (&amp;iter, &amp;array, NULL);
05847 
05848   <font class="keywordflow">if</font> (dbus_message_iter_get_arg_type (&amp;array) != DBUS_TYPE_DOUBLE)
05849     _dbus_assert_not_reached (<font class="stringliteral">"Argument type isn't double"</font>);
05850 
05851   <font class="keywordflow">if</font> (dbus_message_iter_get_double (&amp;array) != 1.5)
05852     _dbus_assert_not_reached (<font class="stringliteral">"Unsigned integers differ"</font>);
05853 
05854   <font class="keywordflow">if</font> (!dbus_message_iter_next (&amp;array))
05855     _dbus_assert_not_reached (<font class="stringliteral">"Reached end of arguments"</font>);
05856 
05857   <font class="keywordflow">if</font> (dbus_message_iter_get_arg_type (&amp;array) != DBUS_TYPE_DOUBLE)
05858     _dbus_assert_not_reached (<font class="stringliteral">"Argument type isn't double"</font>);
05859 
05860   <font class="keywordflow">if</font> (dbus_message_iter_get_double (&amp;array) != 2.5)
05861     _dbus_assert_not_reached (<font class="stringliteral">"Unsigned integers differ"</font>);
05862 
05863   <font class="keywordflow">if</font> (dbus_message_iter_next (&amp;array))
05864     _dbus_assert_not_reached (<font class="stringliteral">"Didn't reach end of arguments"</font>);
05865   
05866   <font class="keywordflow">if</font> (!dbus_message_iter_next (&amp;iter))
05867     _dbus_assert_not_reached (<font class="stringliteral">"Reached end of arguments"</font>);
05868   
05869 
05870   <font class="comment">/* dict */</font>
05871 
05872   <font class="keywordflow">if</font> (dbus_message_iter_get_arg_type (&amp;iter) != DBUS_TYPE_DICT)
05873     _dbus_assert_not_reached (<font class="stringliteral">"not dict type"</font>);
05874      
05875   dbus_message_iter_init_dict_iterator (&amp;iter, &amp;dict);
05876 
05877   str = dbus_message_iter_get_dict_key (&amp;dict);
05878   <font class="keywordflow">if</font> (str == NULL || strcmp (str, <font class="stringliteral">"test"</font>) != 0)
05879     _dbus_assert_not_reached (<font class="stringliteral">"wrong dict key"</font>);
05880   dbus_free (str);
05881 
05882   <font class="keywordflow">if</font> (dbus_message_iter_get_arg_type (&amp;dict) != DBUS_TYPE_UINT32)
05883     _dbus_assert_not_reached (<font class="stringliteral">"wrong dict entry type"</font>);
05884 
05885   <font class="keywordflow">if</font> (dbus_message_iter_get_uint32 (&amp;dict) != 0xDEADBEEF)
05886     _dbus_assert_not_reached (<font class="stringliteral">"wrong dict entry value"</font>);
05887 
05888   <font class="comment">/* dict (in dict) */</font>
05889 
05890   <font class="keywordflow">if</font> (!dbus_message_iter_next (&amp;dict))
05891     _dbus_assert_not_reached (<font class="stringliteral">"reached end of dict"</font>);
05892   
05893   <font class="keywordflow">if</font> (dbus_message_iter_get_arg_type (&amp;dict) != DBUS_TYPE_DICT)
05894     _dbus_assert_not_reached (<font class="stringliteral">"not dict type"</font>);
05895     
05896   dbus_message_iter_init_dict_iterator (&amp;dict, &amp;dict2);
05897   
05898   str = dbus_message_iter_get_dict_key (&amp;dict2);
05899   <font class="keywordflow">if</font> (str == NULL || strcmp (str, <font class="stringliteral">"dictkey"</font>) != 0)
05900     _dbus_assert_not_reached (<font class="stringliteral">"wrong dict key"</font>);
05901   dbus_free (str);
05902   
05903   <font class="keywordflow">if</font> (dbus_message_iter_get_arg_type (&amp;dict2) != DBUS_TYPE_STRING)
05904     _dbus_assert_not_reached (<font class="stringliteral">"wrong dict entry type"</font>);
05905   
05906   str = dbus_message_iter_get_string (&amp;dict2);
05907   <font class="keywordflow">if</font> (str == NULL || strcmp (str, <font class="stringliteral">"dictvalue"</font>) != 0)
05908     _dbus_assert_not_reached (<font class="stringliteral">"wrong dict entry value"</font>);
05909   dbus_free (str);
05910   
05911   <font class="keywordflow">if</font> (dbus_message_iter_next (&amp;dict2))
05912     _dbus_assert_not_reached (<font class="stringliteral">"didn't reach end of dict"</font>);
05913 
05914   <font class="keywordflow">if</font> (!dbus_message_iter_next (&amp;dict))
05915     _dbus_assert_not_reached (<font class="stringliteral">"reached end of dict"</font>);
05916   
05917   <font class="comment">/* array of array of int32 (in dict) */</font>
05918 
05919   str = dbus_message_iter_get_dict_key (&amp;dict);
05920   <font class="keywordflow">if</font> (str == NULL || strcmp (str, <font class="stringliteral">"array"</font>) != 0)
05921     _dbus_assert_not_reached (<font class="stringliteral">"wrong dict key"</font>);
05922   dbus_free (str);
05923   
05924   <font class="keywordflow">if</font> (dbus_message_iter_get_arg_type (&amp;dict) != DBUS_TYPE_ARRAY)
05925     _dbus_assert_not_reached (<font class="stringliteral">"Argument type not an array"</font>);
05926 
05927   <font class="keywordflow">if</font> (dbus_message_iter_get_array_type (&amp;dict) != DBUS_TYPE_ARRAY)
05928     _dbus_assert_not_reached (<font class="stringliteral">"Array type not array"</font>);
05929 
05930   dbus_message_iter_init_array_iterator (&amp;dict, &amp;array, NULL);
05931 
05932   <font class="keywordflow">if</font> (dbus_message_iter_get_arg_type (&amp;array) != DBUS_TYPE_ARRAY)
05933     _dbus_assert_not_reached (<font class="stringliteral">"Argument type isn't array"</font>);
05934   
05935   <font class="keywordflow">if</font> (dbus_message_iter_get_array_type (&amp;array) != DBUS_TYPE_INT32)
05936     _dbus_assert_not_reached (<font class="stringliteral">"Array type not int32"</font>);
05937   
05938   dbus_message_iter_init_array_iterator (&amp;array, &amp;array2, NULL);
05939 
05940   <font class="keywordflow">if</font> (dbus_message_iter_get_arg_type (&amp;array2) != DBUS_TYPE_INT32)
05941     _dbus_assert_not_reached (<font class="stringliteral">"Argument type isn't int32"</font>);
05942 
05943   <font class="keywordflow">if</font> (dbus_message_iter_get_int32 (&amp;array2) != 0x12345678)
05944     _dbus_assert_not_reached (<font class="stringliteral">"Signed integers differ"</font>);
05945 
05946   <font class="keywordflow">if</font> (!dbus_message_iter_next (&amp;array2))
05947     _dbus_assert_not_reached (<font class="stringliteral">"Reached end of arguments"</font>);
05948 
05949   <font class="keywordflow">if</font> (dbus_message_iter_get_int32 (&amp;array2) != 0x23456781)
05950     _dbus_assert_not_reached (<font class="stringliteral">"Signed integers differ"</font>);
05951 
05952   <font class="keywordflow">if</font> (dbus_message_iter_next (&amp;array2))
05953     _dbus_assert_not_reached (<font class="stringliteral">"Didn't reached end of arguments"</font>);
05954 
05955   <font class="keywordflow">if</font> (!dbus_message_iter_next (&amp;array))
05956     _dbus_assert_not_reached (<font class="stringliteral">"Reached end of arguments"</font>);
05957 
05958   <font class="keywordflow">if</font> (dbus_message_iter_get_array_type (&amp;array) != DBUS_TYPE_INT32)
05959     _dbus_assert_not_reached (<font class="stringliteral">"Array type not int32"</font>);
05960 
05961   <font class="keywordflow">if</font> (!dbus_message_iter_get_int32_array (&amp;array,
05962                                           &amp;our_int_array,
05963                                           &amp;len))
05964     _dbus_assert_not_reached (<font class="stringliteral">"couldn't get int32 array"</font>);
05965 
05966   _dbus_assert (len == 3);
05967   _dbus_assert (our_int_array[0] == 0x34567812 &amp;&amp;
05968                 our_int_array[1] == 0x45678123 &amp;&amp;
05969                 our_int_array[2] == 0x56781234);
05970   dbus_free (our_int_array);
05971   
05972   <font class="keywordflow">if</font> (dbus_message_iter_next (&amp;array))
05973     _dbus_assert_not_reached (<font class="stringliteral">"Didn't reach end of array"</font>);
05974 
05975   <font class="keywordflow">if</font> (dbus_message_iter_next (&amp;dict))
05976     _dbus_assert_not_reached (<font class="stringliteral">"Didn't reach end of dict"</font>);
05977   
05978   <font class="keywordflow">if</font> (!dbus_message_iter_next (&amp;iter))
05979     _dbus_assert_not_reached (<font class="stringliteral">"Reached end of arguments"</font>);
05980   
05981   <font class="keywordflow">if</font> (dbus_message_iter_get_arg_type (&amp;iter) != DBUS_TYPE_BYTE)
05982     {
05983       _dbus_warn (<font class="stringliteral">"type was: %d\n"</font>, dbus_message_iter_get_arg_type (&amp;iter));
05984       _dbus_assert_not_reached (<font class="stringliteral">"wrong type after dict (should be byte)"</font>);
05985     }
05986   
05987   <font class="keywordflow">if</font> (dbus_message_iter_get_byte (&amp;iter) != 0xF0)
05988     _dbus_assert_not_reached (<font class="stringliteral">"wrong value after dict"</font>);
05989 
05990 
05991   <font class="keywordflow">if</font> (!dbus_message_iter_next (&amp;iter))
05992     _dbus_assert_not_reached (<font class="stringliteral">"Reached end of arguments"</font>);
05993   
05994   <font class="keywordflow">if</font> (dbus_message_iter_get_arg_type (&amp;iter) != DBUS_TYPE_NIL)
05995     _dbus_assert_not_reached (<font class="stringliteral">"not a nil type"</font>);
05996   
05997   <font class="keywordflow">if</font> (!dbus_message_iter_next (&amp;iter))
05998     _dbus_assert_not_reached (<font class="stringliteral">"Reached end of arguments"</font>);
05999   
06000   <font class="keywordflow">if</font> (dbus_message_iter_get_arg_type (&amp;iter) != DBUS_TYPE_CUSTOM)
06001     _dbus_assert_not_reached (<font class="stringliteral">"wrong type after dict"</font>);
06002 
06003   <font class="keywordflow">if</font> (!dbus_message_iter_get_custom (&amp;iter, &amp;str, &amp;data, &amp;len))
06004     _dbus_assert_not_reached (<font class="stringliteral">"failed to get custom type"</font>);
06005 
06006   _dbus_assert (strcmp (str, <font class="stringliteral">"MyTypeName"</font>)==0);
06007   _dbus_assert (len == 5);
06008   _dbus_assert (strcmp (data, <font class="stringliteral">"data"</font>)==0);
06009   dbus_free (str);
06010   dbus_free (data);
06011   
06012   <font class="keywordflow">if</font> (!dbus_message_iter_next (&amp;iter))
06013     _dbus_assert_not_reached (<font class="stringliteral">"Reached end of arguments"</font>);
06014 
06015   <font class="keywordflow">if</font> (dbus_message_iter_get_byte (&amp;iter) != 0xF0)
06016     _dbus_assert_not_reached (<font class="stringliteral">"wrong value after custom"</font>);
06017 
06018   <font class="keywordflow">if</font> (!dbus_message_iter_next (&amp;iter))
06019     _dbus_assert_not_reached (<font class="stringliteral">"Reached end of arguments"</font>);
06020 
06021   <font class="keywordflow">if</font> (dbus_message_iter_get_arg_type (&amp;iter) != DBUS_TYPE_ARRAY)
06022     _dbus_assert_not_reached (<font class="stringliteral">"no array"</font>);
06023 
06024   <font class="keywordflow">if</font> (dbus_message_iter_get_array_type (&amp;iter) != DBUS_TYPE_INT32)
06025     _dbus_assert_not_reached (<font class="stringliteral">"Array type not int32"</font>);
06026 
06027   <font class="keywordflow">if</font> (dbus_message_iter_init_array_iterator (&amp;iter, &amp;array, NULL))
06028     _dbus_assert_not_reached (<font class="stringliteral">"non empty array"</font>);
06029   
06030   <font class="keywordflow">if</font> (!dbus_message_iter_next (&amp;iter))
06031     _dbus_assert_not_reached (<font class="stringliteral">"Reached end of arguments"</font>);
06032 
06033   <font class="keywordflow">if</font> (dbus_message_iter_get_byte (&amp;iter) != 0xF0)
06034     _dbus_assert_not_reached (<font class="stringliteral">"wrong value after empty array"</font>);
06035 
06036   <font class="keywordflow">if</font> (!dbus_message_iter_next (&amp;iter))
06037     _dbus_assert_not_reached (<font class="stringliteral">"Reached end of arguments"</font>);
06038 
06039   <font class="keywordflow">if</font> (dbus_message_iter_get_arg_type (&amp;iter) != DBUS_TYPE_DICT)
06040     _dbus_assert_not_reached (<font class="stringliteral">"non dict"</font>);
06041 
06042   <font class="keywordflow">if</font> (dbus_message_iter_init_dict_iterator (&amp;iter, &amp;dict))
06043     _dbus_assert_not_reached (<font class="stringliteral">"non empty dict"</font>);
06044 
06045   <font class="keywordflow">if</font> (!dbus_message_iter_next (&amp;iter))
06046     _dbus_assert_not_reached (<font class="stringliteral">"Reached end of arguments"</font>);
06047 
06048   <font class="keywordflow">if</font> (dbus_message_iter_get_byte (&amp;iter) != 0xF0)
06049     _dbus_assert_not_reached (<font class="stringliteral">"wrong value after empty dict"</font>);
06050 
06051   <font class="keywordflow">if</font> (dbus_message_iter_next (&amp;iter))
06052     _dbus_assert_not_reached (<font class="stringliteral">"Didn't reach end of arguments"</font>);
06053 }
06054 
06055 
06056 <font class="keyword">static</font> dbus_bool_t
06057 check_message_handling_type (<a class="code" href="structDBusMessageIter.html">DBusMessageIter</a> *iter,
06058                              <font class="keywordtype">int</font> type)
06059 {
06060   <a class="code" href="structDBusMessageIter.html">DBusMessageIter</a> child_iter;
06061   
06062   <font class="keywordflow">switch</font> (type)
06063     {
06064     <font class="keywordflow">case</font> DBUS_TYPE_NIL:
06065       <font class="keywordflow">break</font>;
06066     <font class="keywordflow">case</font> DBUS_TYPE_BYTE:
06067       dbus_message_iter_get_byte (iter);
06068       <font class="keywordflow">break</font>;
06069     <font class="keywordflow">case</font> DBUS_TYPE_BOOLEAN:
06070       dbus_message_iter_get_boolean (iter);
06071       <font class="keywordflow">break</font>;
06072     <font class="keywordflow">case</font> DBUS_TYPE_INT32:
06073       dbus_message_iter_get_int32 (iter);
06074       <font class="keywordflow">break</font>;
06075     <font class="keywordflow">case</font> DBUS_TYPE_UINT32:
06076       dbus_message_iter_get_uint32 (iter);
06077       <font class="keywordflow">break</font>;
06078     <font class="keywordflow">case</font> DBUS_TYPE_INT64:
06079 <font class="preprocessor">#ifdef DBUS_HAVE_INT64</font>
06080 <font class="preprocessor"></font>      dbus_message_iter_get_int64 (iter);
06081 <font class="preprocessor">#endif</font>
06082 <font class="preprocessor"></font>      <font class="keywordflow">break</font>;
06083     <font class="keywordflow">case</font> DBUS_TYPE_UINT64:
06084 <font class="preprocessor">#ifdef DBUS_HAVE_INT64</font>
06085 <font class="preprocessor"></font>      dbus_message_iter_get_uint64 (iter);
06086 <font class="preprocessor">#endif</font>
06087 <font class="preprocessor"></font>      <font class="keywordflow">break</font>;
06088     <font class="keywordflow">case</font> DBUS_TYPE_DOUBLE:
06089       dbus_message_iter_get_double (iter);
06090       <font class="keywordflow">break</font>;
06091     <font class="keywordflow">case</font> DBUS_TYPE_STRING:
06092       {
06093         <font class="keywordtype">char</font> *str;
06094         str = dbus_message_iter_get_string (iter);
06095         <font class="keywordflow">if</font> (str == NULL)
06096           {
06097             _dbus_warn (<font class="stringliteral">"NULL string in message\n"</font>);
06098             <font class="keywordflow">return</font> FALSE;
06099           }
06100         dbus_free (str);
06101       }
06102       <font class="keywordflow">break</font>;
06103     <font class="keywordflow">case</font> DBUS_TYPE_CUSTOM:
06104       {
06105         <font class="keywordtype">char</font> *name;
06106         <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *data;
06107         <font class="keywordtype">int</font> len;
06108         
06109         <font class="keywordflow">if</font> (!dbus_message_iter_get_custom (iter, &amp;name, &amp;data, &amp;len))
06110           {
06111             _dbus_warn (<font class="stringliteral">"error reading name from custom type\n"</font>);
06112             <font class="keywordflow">return</font> FALSE;
06113           }
06114         dbus_free (data);
06115         dbus_free (name);
06116       }
06117       <font class="keywordflow">break</font>;
06118     <font class="keywordflow">case</font> DBUS_TYPE_ARRAY:
06119       {
06120         <font class="keywordtype">int</font> array_type;
06121 
06122         dbus_message_iter_init_array_iterator (iter, &amp;child_iter, &amp;array_type);
06123 
06124         <font class="keywordflow">while</font> (dbus_message_iter_has_next (&amp;child_iter))
06125           {
06126             <font class="keywordflow">if</font> (!check_message_handling_type (&amp;child_iter, array_type))
06127               {
06128                 _dbus_warn (<font class="stringliteral">"error in array element\n"</font>);
06129                 <font class="keywordflow">return</font> FALSE;
06130               }
06131             
06132             <font class="keywordflow">if</font> (!dbus_message_iter_next (&amp;child_iter))
06133               <font class="keywordflow">break</font>;
06134           }
06135       }
06136       <font class="keywordflow">break</font>;
06137     <font class="keywordflow">case</font> DBUS_TYPE_DICT:
06138       {
06139         <font class="keywordtype">int</font> entry_type;
06140         <font class="keywordtype">char</font> *key;
06141         
06142         dbus_message_iter_init_dict_iterator (iter, &amp;child_iter);
06143 
06144         <font class="keywordflow">while</font> ((entry_type = dbus_message_iter_get_arg_type (&amp;child_iter)) != DBUS_TYPE_INVALID)
06145           {
06146             key = dbus_message_iter_get_dict_key (&amp;child_iter);
06147             <font class="keywordflow">if</font> (key == NULL)
06148               {
06149                 _dbus_warn (<font class="stringliteral">"error reading dict key\n"</font>);
06150                 <font class="keywordflow">return</font> FALSE;
06151               }
06152             dbus_free (key);
06153             
06154             <font class="keywordflow">if</font> (!check_message_handling_type (&amp;child_iter, entry_type))
06155               {
06156                 _dbus_warn (<font class="stringliteral">"error in dict value\n"</font>);
06157                 <font class="keywordflow">return</font> FALSE;
06158               }
06159             
06160             <font class="keywordflow">if</font> (!dbus_message_iter_next (&amp;child_iter))
06161               <font class="keywordflow">break</font>;
06162           }
06163       }
06164       <font class="keywordflow">break</font>;
06165       
06166     <font class="keywordflow">default</font>:
06167       _dbus_warn (<font class="stringliteral">"unknown type %d\n"</font>, type);
06168       <font class="keywordflow">return</font> FALSE;
06169       <font class="keywordflow">break</font>;
06170     }
06171   <font class="keywordflow">return</font> TRUE;
06172 }
06173   
06174   
06175 <font class="keyword">static</font> dbus_bool_t
06176 check_message_handling (<a class="code" href="structDBusMessage.html">DBusMessage</a> *message)
06177 {
06178   <a class="code" href="structDBusMessageIter.html">DBusMessageIter</a> iter;
06179   <font class="keywordtype">int</font> type;
06180   dbus_bool_t retval;
06181   dbus_uint32_t client_serial;
06182   
06183   retval = FALSE;
06184   
06185   client_serial = dbus_message_get_serial (message);
06186 
06187   <font class="comment">/* can't use set_serial due to the assertions at the start of it */</font>
06188   _dbus_marshal_set_uint32 (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>,
06189                             message-&gt;<a class="code" href="structDBusMessage.html#m7">byte_order</a>,
06190                             CLIENT_SERIAL_OFFSET,
06191                             client_serial);
06192   
06193   <font class="keywordflow">if</font> (client_serial != dbus_message_get_serial (message))
06194     {
06195       _dbus_warn (<font class="stringliteral">"get/set cycle for client_serial did not succeed\n"</font>);
06196       <font class="keywordflow">goto</font> failed;
06197     }
06198   
06199   <font class="comment">/* If we implement message_set_arg (message, n, value)</font>
06200 <font class="comment">   * then we would want to test it here</font>
06201 <font class="comment">   */</font>
06202 
06203   dbus_message_iter_init (message, &amp;iter);
06204   <font class="keywordflow">while</font> ((type = dbus_message_iter_get_arg_type (&amp;iter)) != DBUS_TYPE_INVALID)
06205     {
06206       <font class="keywordflow">if</font> (!check_message_handling_type (&amp;iter, type))
06207         <font class="keywordflow">goto</font> failed;
06208 
06209       <font class="keywordflow">if</font> (!dbus_message_iter_next (&amp;iter))
06210         <font class="keywordflow">break</font>;
06211     }
06212   
06213   retval = TRUE;
06214   
06215  failed:
06216   <font class="keywordflow">return</font> retval;
06217 }
06218 
06219 <font class="keyword">static</font> dbus_bool_t
06220 check_have_valid_message (<a class="code" href="structDBusMessageLoader.html">DBusMessageLoader</a> *loader)
06221 {
06222   <a class="code" href="structDBusMessage.html">DBusMessage</a> *message;
06223   dbus_bool_t retval;
06224 
06225   message = NULL;
06226   retval = FALSE;
06227 
06228   <font class="keywordflow">if</font> (!_dbus_message_loader_queue_messages (loader))
06229     _dbus_assert_not_reached (<font class="stringliteral">"no memory to queue messages"</font>);
06230   
06231   <font class="keywordflow">if</font> (_dbus_message_loader_get_is_corrupted (loader))
06232     {
06233       _dbus_warn (<font class="stringliteral">"loader corrupted on message that was expected to be valid\n"</font>);
06234       <font class="keywordflow">goto</font> failed;
06235     }
06236   
06237   message = _dbus_message_loader_pop_message (loader);
06238   <font class="keywordflow">if</font> (message == NULL)
06239     {
06240       _dbus_warn (<font class="stringliteral">"didn't load message that was expected to be valid (message not popped)\n"</font>);
06241       <font class="keywordflow">goto</font> failed;
06242     }
06243   
06244   <font class="keywordflow">if</font> (_dbus_string_get_length (&amp;loader-&gt;<a class="code" href="structDBusMessageLoader.html#m1">data</a>) &gt; 0)
06245     {
06246       _dbus_warn (<font class="stringliteral">"had leftover bytes from expected-to-be-valid single message\n"</font>);
06247       <font class="keywordflow">goto</font> failed;
06248     }
06249 
06250   <font class="comment">/* Verify that we're able to properly deal with the message.</font>
06251 <font class="comment">   * For example, this would detect improper handling of messages</font>
06252 <font class="comment">   * in nonstandard byte order.</font>
06253 <font class="comment">   */</font>
06254   <font class="keywordflow">if</font> (!check_message_handling (message))
06255     <font class="keywordflow">goto</font> failed;  
06256   
06257   retval = TRUE;
06258 
06259  failed:
06260   <font class="keywordflow">if</font> (message)
06261     dbus_message_unref (message);
06262 
06263   <font class="keywordflow">return</font> retval;
06264 }
06265 
06266 <font class="keyword">static</font> dbus_bool_t
06267 check_invalid_message (<a class="code" href="structDBusMessageLoader.html">DBusMessageLoader</a> *loader)
06268 {
06269   dbus_bool_t retval;
06270 
06271   retval = FALSE;
06272 
06273   <font class="keywordflow">if</font> (!_dbus_message_loader_queue_messages (loader))
06274     _dbus_assert_not_reached (<font class="stringliteral">"no memory to queue messages"</font>);
06275   
06276   <font class="keywordflow">if</font> (!_dbus_message_loader_get_is_corrupted (loader))
06277     {
06278       _dbus_warn (<font class="stringliteral">"loader not corrupted on message that was expected to be invalid\n"</font>);
06279       <font class="keywordflow">goto</font> failed;
06280     }
06281 
06282   retval = TRUE;
06283 
06284  failed:
06285   <font class="keywordflow">return</font> retval;
06286 }
06287 
06288 <font class="keyword">static</font> dbus_bool_t
06289 check_incomplete_message (<a class="code" href="structDBusMessageLoader.html">DBusMessageLoader</a> *loader)
06290 {
06291   <a class="code" href="structDBusMessage.html">DBusMessage</a> *message;
06292   dbus_bool_t retval;
06293 
06294   message = NULL;
06295   retval = FALSE;
06296 
06297   <font class="keywordflow">if</font> (!_dbus_message_loader_queue_messages (loader))
06298     _dbus_assert_not_reached (<font class="stringliteral">"no memory to queue messages"</font>);
06299   
06300   <font class="keywordflow">if</font> (_dbus_message_loader_get_is_corrupted (loader))
06301     {
06302       _dbus_warn (<font class="stringliteral">"loader corrupted on message that was expected to be valid (but incomplete)\n"</font>);
06303       <font class="keywordflow">goto</font> failed;
06304     }
06305   
06306   message = _dbus_message_loader_pop_message (loader);
06307   <font class="keywordflow">if</font> (message != NULL)
06308     {
06309       _dbus_warn (<font class="stringliteral">"loaded message that was expected to be incomplete\n"</font>);
06310       <font class="keywordflow">goto</font> failed;
06311     }
06312 
06313   retval = TRUE;
06314 
06315  failed:
06316   <font class="keywordflow">if</font> (message)
06317     dbus_message_unref (message);
06318   <font class="keywordflow">return</font> retval;
06319 }
06320 
06321 <font class="keyword">static</font> dbus_bool_t
06322 check_loader_results (<a class="code" href="structDBusMessageLoader.html">DBusMessageLoader</a>      *loader,
06323                       DBusMessageValidity     validity)
06324 {
06325   <font class="keywordflow">if</font> (!_dbus_message_loader_queue_messages (loader))
06326     _dbus_assert_not_reached (<font class="stringliteral">"no memory to queue messages"</font>);
06327   
06328   <font class="keywordflow">switch</font> (validity)
06329     {
06330     <font class="keywordflow">case</font> _DBUS_MESSAGE_VALID:
06331       <font class="keywordflow">return</font> check_have_valid_message (loader);
06332     <font class="keywordflow">case</font> _DBUS_MESSAGE_INVALID:
06333       <font class="keywordflow">return</font> check_invalid_message (loader);
06334     <font class="keywordflow">case</font> _DBUS_MESSAGE_INCOMPLETE:
06335       <font class="keywordflow">return</font> check_incomplete_message (loader);
06336     <font class="keywordflow">case</font> _DBUS_MESSAGE_UNKNOWN:
06337       <font class="keywordflow">return</font> TRUE;
06338     }
06339 
06340   _dbus_assert_not_reached (<font class="stringliteral">"bad DBusMessageValidity"</font>);
06341   <font class="keywordflow">return</font> FALSE;
06342 }
06343 
06344 
06353 dbus_bool_t
06354 dbus_internal_do_not_use_load_message_file (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a>    *filename,
06355                                             dbus_bool_t          is_raw,
06356                                             <a class="code" href="structDBusString.html">DBusString</a>          *data)
06357 {
06358   dbus_bool_t retval;
06359 
06360   retval = FALSE;  
06361 
06362   <font class="keywordflow">if</font> (is_raw)
06363     {
06364       <a class="code" href="structDBusError.html">DBusError</a> error;
06365 
06366       _dbus_verbose (<font class="stringliteral">"Loading raw %s\n"</font>, _dbus_string_get_const_data (filename));
06367       dbus_error_init (&amp;error);
06368       <font class="keywordflow">if</font> (!_dbus_file_get_contents (data, filename, &amp;error))
06369         {
06370           _dbus_warn (<font class="stringliteral">"Could not load message file %s: %s\n"</font>,
06371                       _dbus_string_get_const_data (filename),
06372                       error.<a class="code" href="structDBusError.html#m1">message</a>);
06373           dbus_error_free (&amp;error);
06374           <font class="keywordflow">goto</font> failed;
06375         }
06376     }
06377   <font class="keywordflow">else</font>
06378     {
06379       <font class="keywordflow">if</font> (!_dbus_message_data_load (data, filename))
06380         {
06381           _dbus_warn (<font class="stringliteral">"Could not load message file %s\n"</font>,
06382                       _dbus_string_get_const_data (filename));
06383           <font class="keywordflow">goto</font> failed;
06384         }
06385     }
06386 
06387   retval = TRUE;
06388   
06389  failed:
06390 
06391   <font class="keywordflow">return</font> retval;
06392 }
06393 
06403 dbus_bool_t
06404 dbus_internal_do_not_use_try_message_file (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a>    *filename,
06405                                            dbus_bool_t          is_raw,
06406                                            DBusMessageValidity  expected_validity)
06407 {
06408   <a class="code" href="structDBusString.html">DBusString</a> data;
06409   dbus_bool_t retval;
06410 
06411   retval = FALSE;
06412   
06413   <font class="keywordflow">if</font> (!_dbus_string_init (&amp;data))
06414     _dbus_assert_not_reached (<font class="stringliteral">"could not allocate string\n"</font>);
06415 
06416   <font class="keywordflow">if</font> (!dbus_internal_do_not_use_load_message_file (filename, is_raw,
06417                                                    &amp;data))
06418     <font class="keywordflow">goto</font> failed;
06419 
06420   retval = dbus_internal_do_not_use_try_message_data (&amp;data, expected_validity);
06421 
06422  failed:
06423 
06424   <font class="keywordflow">if</font> (!retval)
06425     {
06426       <font class="keywordflow">if</font> (_dbus_string_get_length (&amp;data) &gt; 0)
06427         _dbus_verbose_bytes_of_string (&amp;data, 0,
06428                                        _dbus_string_get_length (&amp;data));
06429       
06430       _dbus_warn (<font class="stringliteral">"Failed message loader test on %s\n"</font>,
06431                   _dbus_string_get_const_data (filename));
06432     }
06433   
06434   _dbus_string_free (&amp;data);
06435 
06436   <font class="keywordflow">return</font> retval;
06437 }
06438 
06447 dbus_bool_t
06448 dbus_internal_do_not_use_try_message_data (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a>    *data,
06449                                            DBusMessageValidity  expected_validity)
06450 {
06451   <a class="code" href="structDBusMessageLoader.html">DBusMessageLoader</a> *loader;
06452   dbus_bool_t retval;
06453   <font class="keywordtype">int</font> len;
06454   <font class="keywordtype">int</font> i;
06455 
06456   loader = NULL;
06457   retval = FALSE;
06458 
06459   <font class="comment">/* Write the data one byte at a time */</font>
06460   
06461   loader = _dbus_message_loader_new ();
06462 
06463   <font class="comment">/* check some trivial loader functions */</font>
06464   _dbus_message_loader_ref (loader);
06465   _dbus_message_loader_unref (loader);
06466   _dbus_message_loader_get_max_message_size (loader);
06467   
06468   len = _dbus_string_get_length (data);
06469   <font class="keywordflow">for</font> (i = 0; i &lt; len; i++)
06470     {
06471       <a class="code" href="structDBusString.html">DBusString</a> *buffer;
06472 
06473       _dbus_message_loader_get_buffer (loader, &amp;buffer);
06474       _dbus_string_append_byte (buffer,
06475                                 _dbus_string_get_byte (data, i));
06476       _dbus_message_loader_return_buffer (loader, buffer, 1);
06477     }
06478   
06479   <font class="keywordflow">if</font> (!check_loader_results (loader, expected_validity))
06480     <font class="keywordflow">goto</font> failed;
06481 
06482   _dbus_message_loader_unref (loader);
06483   loader = NULL;
06484 
06485   <font class="comment">/* Write the data all at once */</font>
06486   
06487   loader = _dbus_message_loader_new ();
06488 
06489   {
06490     <a class="code" href="structDBusString.html">DBusString</a> *buffer;
06491     
06492     _dbus_message_loader_get_buffer (loader, &amp;buffer);
06493     _dbus_string_copy (data, 0, buffer,
06494                        _dbus_string_get_length (buffer));
06495     _dbus_message_loader_return_buffer (loader, buffer, 1);
06496   }
06497   
06498   <font class="keywordflow">if</font> (!check_loader_results (loader, expected_validity))
06499     <font class="keywordflow">goto</font> failed;
06500 
06501   _dbus_message_loader_unref (loader);
06502   loader = NULL;  
06503 
06504   <font class="comment">/* Write the data 2 bytes at a time */</font>
06505   
06506   loader = _dbus_message_loader_new ();
06507 
06508   len = _dbus_string_get_length (data);
06509   <font class="keywordflow">for</font> (i = 0; i &lt; len; i += 2)
06510     {
06511       <a class="code" href="structDBusString.html">DBusString</a> *buffer;
06512 
06513       _dbus_message_loader_get_buffer (loader, &amp;buffer);
06514       _dbus_string_append_byte (buffer,
06515                                 _dbus_string_get_byte (data, i));
06516       <font class="keywordflow">if</font> ((i+1) &lt; len)
06517         _dbus_string_append_byte (buffer,
06518                                   _dbus_string_get_byte (data, i+1));
06519       _dbus_message_loader_return_buffer (loader, buffer, 1);
06520     }
06521   
06522   <font class="keywordflow">if</font> (!check_loader_results (loader, expected_validity))
06523     <font class="keywordflow">goto</font> failed;
06524 
06525   _dbus_message_loader_unref (loader);
06526   loader = NULL;
06527   
06528   retval = TRUE;
06529   
06530  failed:
06531   
06532   <font class="keywordflow">if</font> (loader)
06533     _dbus_message_loader_unref (loader);
06534   
06535   <font class="keywordflow">return</font> retval;
06536 }
06537 
06538 <font class="keyword">static</font> dbus_bool_t
06539 process_test_subdir (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a>          *test_base_dir,
06540                      <font class="keyword">const</font> <font class="keywordtype">char</font>                *subdir,
06541                      DBusMessageValidity        validity,
06542                      DBusForeachMessageFileFunc function,
06543                      <font class="keywordtype">void</font>                      *user_data)
06544 {
06545   <a class="code" href="structDBusString.html">DBusString</a> test_directory;
06546   <a class="code" href="structDBusString.html">DBusString</a> filename;
06547   <a class="code" href="structDBusDirIter.html">DBusDirIter</a> *dir;
06548   dbus_bool_t retval;
06549   <a class="code" href="structDBusError.html">DBusError</a> error;
06550 
06551   retval = FALSE;
06552   dir = NULL;
06553   
06554   <font class="keywordflow">if</font> (!_dbus_string_init (&amp;test_directory))
06555     _dbus_assert_not_reached (<font class="stringliteral">"didn't allocate test_directory\n"</font>);
06556 
06557   _dbus_string_init_const (&amp;filename, subdir);
06558   
06559   <font class="keywordflow">if</font> (!_dbus_string_copy (test_base_dir, 0,
06560                           &amp;test_directory, 0))
06561     _dbus_assert_not_reached (<font class="stringliteral">"couldn't copy test_base_dir to test_directory"</font>);
06562   
06563   <font class="keywordflow">if</font> (!_dbus_concat_dir_and_file (&amp;test_directory, &amp;filename))    
06564     _dbus_assert_not_reached (<font class="stringliteral">"couldn't allocate full path"</font>);
06565 
06566   _dbus_string_free (&amp;filename);
06567   <font class="keywordflow">if</font> (!_dbus_string_init (&amp;filename))
06568     _dbus_assert_not_reached (<font class="stringliteral">"didn't allocate filename string\n"</font>);
06569 
06570   dbus_error_init (&amp;error);
06571   dir = _dbus_directory_open (&amp;test_directory, &amp;error);
06572   <font class="keywordflow">if</font> (dir == NULL)
06573     {
06574       _dbus_warn (<font class="stringliteral">"Could not open %s: %s\n"</font>,
06575                   _dbus_string_get_const_data (&amp;test_directory),
06576                   error.<a class="code" href="structDBusError.html#m1">message</a>);
06577       dbus_error_free (&amp;error);
06578       <font class="keywordflow">goto</font> failed;
06579     }
06580 
06581   printf (<font class="stringliteral">"Testing %s:\n"</font>, subdir);
06582   
06583  next:
06584   <font class="keywordflow">while</font> (_dbus_directory_get_next_file (dir, &amp;filename, &amp;error))
06585     {
06586       <a class="code" href="structDBusString.html">DBusString</a> full_path;
06587       dbus_bool_t is_raw;
06588       
06589       <font class="keywordflow">if</font> (!_dbus_string_init (&amp;full_path))
06590         _dbus_assert_not_reached (<font class="stringliteral">"couldn't init string"</font>);
06591 
06592       <font class="keywordflow">if</font> (!_dbus_string_copy (&amp;test_directory, 0, &amp;full_path, 0))
06593         _dbus_assert_not_reached (<font class="stringliteral">"couldn't copy dir to full_path"</font>);
06594 
06595       <font class="keywordflow">if</font> (!_dbus_concat_dir_and_file (&amp;full_path, &amp;filename))
06596         _dbus_assert_not_reached (<font class="stringliteral">"couldn't concat file to dir"</font>);
06597 
06598       <font class="keywordflow">if</font> (_dbus_string_ends_with_c_str (&amp;filename, <font class="stringliteral">".message"</font>))
06599         is_raw = FALSE;
06600       <font class="keywordflow">else</font> <font class="keywordflow">if</font> (_dbus_string_ends_with_c_str (&amp;filename, <font class="stringliteral">".message-raw"</font>))
06601         is_raw = TRUE;
06602       <font class="keywordflow">else</font>
06603         {
06604           _dbus_verbose (<font class="stringliteral">"Skipping non-.message file %s\n"</font>,
06605                          _dbus_string_get_const_data (&amp;filename));
06606           _dbus_string_free (&amp;full_path);
06607           <font class="keywordflow">goto</font> next;
06608         }
06609 
06610       printf (<font class="stringliteral">"    %s\n"</font>,
06611               _dbus_string_get_const_data (&amp;filename));
06612       
06613       _dbus_verbose (<font class="stringliteral">" expecting %s for %s\n"</font>,
06614                      validity == _DBUS_MESSAGE_VALID ? <font class="stringliteral">"valid"</font> :
06615                      (validity == _DBUS_MESSAGE_INVALID ? <font class="stringliteral">"invalid"</font> :
06616                       (validity == _DBUS_MESSAGE_INCOMPLETE ? <font class="stringliteral">"incomplete"</font> : <font class="stringliteral">"unknown"</font>)),
06617                      _dbus_string_get_const_data (&amp;filename));
06618       
06619       <font class="keywordflow">if</font> (! (*function) (&amp;full_path, is_raw, validity, user_data))
06620         {
06621           _dbus_string_free (&amp;full_path);
06622           <font class="keywordflow">goto</font> failed;
06623         }
06624       <font class="keywordflow">else</font>
06625         _dbus_string_free (&amp;full_path);
06626     }
06627 
06628   <font class="keywordflow">if</font> (dbus_error_is_set (&amp;error))
06629     {
06630       _dbus_warn (<font class="stringliteral">"Could not get next file in %s: %s\n"</font>,
06631                   _dbus_string_get_const_data (&amp;test_directory),
06632                   error.<a class="code" href="structDBusError.html#m1">message</a>);
06633       dbus_error_free (&amp;error);
06634       <font class="keywordflow">goto</font> failed;
06635     }
06636     
06637   retval = TRUE;
06638   
06639  failed:
06640 
06641   <font class="keywordflow">if</font> (dir)
06642     _dbus_directory_close (dir);
06643   _dbus_string_free (&amp;test_directory);
06644   _dbus_string_free (&amp;filename);
06645 
06646   <font class="keywordflow">return</font> retval;
06647 }
06648                      
06658 dbus_bool_t
06659 dbus_internal_do_not_use_foreach_message_file (<font class="keyword">const</font> <font class="keywordtype">char</font>                *test_data_dir,
06660                                                DBusForeachMessageFileFunc func,
06661                                                <font class="keywordtype">void</font>                      *user_data)
06662 {
06663   <a class="code" href="structDBusString.html">DBusString</a> test_directory;
06664   dbus_bool_t retval;
06665 
06666   retval = FALSE;
06667   
06668   _dbus_string_init_const (&amp;test_directory, test_data_dir);
06669 
06670   <font class="keywordflow">if</font> (!process_test_subdir (&amp;test_directory, <font class="stringliteral">"valid-messages"</font>,
06671                             _DBUS_MESSAGE_VALID, func, user_data))
06672     <font class="keywordflow">goto</font> failed;
06673 
06674   <font class="keywordflow">if</font> (!process_test_subdir (&amp;test_directory, <font class="stringliteral">"invalid-messages"</font>,
06675                             _DBUS_MESSAGE_INVALID, func, user_data))
06676     <font class="keywordflow">goto</font> failed;
06677   
06678   <font class="keywordflow">if</font> (!process_test_subdir (&amp;test_directory, <font class="stringliteral">"incomplete-messages"</font>,
06679                             _DBUS_MESSAGE_INCOMPLETE, func, user_data))
06680     <font class="keywordflow">goto</font> failed;
06681 
06682   retval = TRUE;
06683   
06684  failed:
06685 
06686   _dbus_string_free (&amp;test_directory);
06687   
06688   <font class="keywordflow">return</font> retval;
06689 }
06690 
06691 <font class="keyword">static</font> <font class="keywordtype">void</font>
06692 verify_test_message (<a class="code" href="structDBusMessage.html">DBusMessage</a> *message)
06693 {
06694   <a class="code" href="structDBusMessageIter.html">DBusMessageIter</a> iter, dict;
06695   <a class="code" href="structDBusError.html">DBusError</a> error;
06696   dbus_int32_t our_int;
06697   <font class="keywordtype">char</font> *our_str;
06698   <font class="keywordtype">double</font> our_double;
06699   dbus_bool_t our_bool;
06700   dbus_uint32_t our_uint32;
06701   dbus_int32_t *our_uint32_array;
06702   <font class="keywordtype">int</font> our_uint32_array_len;
06703   dbus_int32_t *our_int32_array;
06704   <font class="keywordtype">int</font> our_int32_array_len;
06705   <font class="keywordtype">char</font> **our_string_array;
06706   <font class="keywordtype">int</font> our_string_array_len;
06707 <font class="preprocessor">#ifdef DBUS_HAVE_INT64</font>
06708 <font class="preprocessor"></font>  dbus_int64_t our_int64;
06709   dbus_uint64_t our_uint64;
06710   dbus_int64_t *our_uint64_array;
06711   <font class="keywordtype">int</font> our_uint64_array_len;
06712   dbus_int64_t *our_int64_array;
06713   <font class="keywordtype">int</font> our_int64_array_len;
06714 <font class="preprocessor">#endif</font>
06715 <font class="preprocessor"></font>  <font class="keywordtype">double</font> *our_double_array;
06716   <font class="keywordtype">int</font> our_double_array_len;
06717   <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *our_byte_array;
06718   <font class="keywordtype">int</font> our_byte_array_len;
06719   <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *our_boolean_array;
06720   <font class="keywordtype">int</font> our_boolean_array_len;
06721   
06722   dbus_message_iter_init (message, &amp;iter);
06723 
06724   dbus_error_init (&amp;error);
06725   <font class="keywordflow">if</font> (!dbus_message_iter_get_args (&amp;iter, &amp;error,
06726                                    DBUS_TYPE_INT32, &amp;our_int,
06727 #ifdef DBUS_HAVE_INT64
06728                                    DBUS_TYPE_INT64, &amp;our_int64,
06729                                    DBUS_TYPE_UINT64, &amp;our_uint64,
06730 #endif
06731                                    DBUS_TYPE_STRING, &amp;our_str,
06732                                    DBUS_TYPE_DOUBLE, &amp;our_double,
06733                                    DBUS_TYPE_BOOLEAN, &amp;our_bool,
06734                                    DBUS_TYPE_ARRAY, DBUS_TYPE_UINT32,
06735                                    &amp;our_uint32_array, &amp;our_uint32_array_len,
06736                                    DBUS_TYPE_ARRAY, DBUS_TYPE_INT32,
06737                                    &amp;our_int32_array, &amp;our_int32_array_len,
06738 #ifdef DBUS_HAVE_INT64
06739                                    DBUS_TYPE_ARRAY, DBUS_TYPE_UINT64,
06740                                    &amp;our_uint64_array, &amp;our_uint64_array_len,
06741                                    DBUS_TYPE_ARRAY, DBUS_TYPE_INT64,
06742                                    &amp;our_int64_array, &amp;our_int64_array_len,
06743 #endif
06744                                    DBUS_TYPE_ARRAY, DBUS_TYPE_STRING,
06745                                    &amp;our_string_array, &amp;our_string_array_len,
06746                                    DBUS_TYPE_ARRAY, DBUS_TYPE_DOUBLE,
06747                                    &amp;our_double_array, &amp;our_double_array_len,
06748                                    DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE,
06749                                    &amp;our_byte_array, &amp;our_byte_array_len,
06750                                    DBUS_TYPE_ARRAY, DBUS_TYPE_BOOLEAN,
06751                                    &amp;our_boolean_array, &amp;our_boolean_array_len,
06752                                    0))
06753     {
06754       _dbus_warn (<font class="stringliteral">"error: %s - %s\n"</font>, error.<a class="code" href="structDBusError.html#m0">name</a>,
06755                   (error.<a class="code" href="structDBusError.html#m1">message</a> != NULL) ? error.<a class="code" href="structDBusError.html#m1">message</a> : <font class="stringliteral">"no message"</font>);
06756       _dbus_assert_not_reached (<font class="stringliteral">"Could not get arguments"</font>);
06757     }
06758 
06759   <font class="keywordflow">if</font> (our_int != -0x12345678)
06760     _dbus_assert_not_reached (<font class="stringliteral">"integers differ!"</font>);
06761 
06762 <font class="preprocessor">#ifdef DBUS_HAVE_INT64</font>
06763 <font class="preprocessor"></font>  <font class="keywordflow">if</font> (our_int64 != DBUS_INT64_CONSTANT (-0x123456789abcd))
06764     _dbus_assert_not_reached (<font class="stringliteral">"64-bit integers differ!"</font>);
06765   <font class="keywordflow">if</font> (our_uint64 != DBUS_UINT64_CONSTANT (0x123456789abcd))
06766     _dbus_assert_not_reached (<font class="stringliteral">"64-bit unsigned integers differ!"</font>);
06767 <font class="preprocessor">#endif</font>
06768 <font class="preprocessor"></font>  
06769   <font class="keywordflow">if</font> (our_double != 3.14159)
06770     _dbus_assert_not_reached (<font class="stringliteral">"doubles differ!"</font>);
06771 
06772   <font class="keywordflow">if</font> (strcmp (our_str, <font class="stringliteral">"Test string"</font>) != 0)
06773     _dbus_assert_not_reached (<font class="stringliteral">"strings differ!"</font>);
06774   dbus_free (our_str);
06775 
06776   <font class="keywordflow">if</font> (!our_bool)
06777     _dbus_assert_not_reached (<font class="stringliteral">"booleans differ"</font>);
06778 
06779   <font class="keywordflow">if</font> (our_uint32_array_len != 4 ||
06780       our_uint32_array[0] != 0x12345678 ||
06781       our_uint32_array[1] != 0x23456781 ||
06782       our_uint32_array[2] != 0x34567812 ||
06783       our_uint32_array[3] != 0x45678123)
06784     _dbus_assert_not_reached (<font class="stringliteral">"uint array differs"</font>);
06785   dbus_free (our_uint32_array);
06786 
06787   <font class="keywordflow">if</font> (our_int32_array_len != 4 ||
06788       our_int32_array[0] != 0x12345678 ||
06789       our_int32_array[1] != -0x23456781 ||
06790       our_int32_array[2] != 0x34567812 ||
06791       our_int32_array[3] != -0x45678123)
06792     _dbus_assert_not_reached (<font class="stringliteral">"int array differs"</font>);
06793   dbus_free (our_int32_array);
06794 
06795 <font class="preprocessor">#ifdef DBUS_HAVE_INT64</font>
06796 <font class="preprocessor"></font>  <font class="keywordflow">if</font> (our_uint64_array_len != 4 ||
06797       our_uint64_array[0] != 0x12345678 ||
06798       our_uint64_array[1] != 0x23456781 ||
06799       our_uint64_array[2] != 0x34567812 ||
06800       our_uint64_array[3] != 0x45678123)
06801     _dbus_assert_not_reached (<font class="stringliteral">"uint64 array differs"</font>);
06802   dbus_free (our_uint64_array);
06803   
06804   <font class="keywordflow">if</font> (our_int64_array_len != 4 ||
06805       our_int64_array[0] != 0x12345678 ||
06806       our_int64_array[1] != -0x23456781 ||
06807       our_int64_array[2] != 0x34567812 ||
06808       our_int64_array[3] != -0x45678123)
06809     _dbus_assert_not_reached (<font class="stringliteral">"int64 array differs"</font>);
06810   dbus_free (our_int64_array);
06811 <font class="preprocessor">#endif </font><font class="comment">/* DBUS_HAVE_INT64 */</font>
06812   
06813   <font class="keywordflow">if</font> (our_string_array_len != 4)
06814     _dbus_assert_not_reached (<font class="stringliteral">"string array has wrong length"</font>);
06815 
06816   <font class="keywordflow">if</font> (strcmp (our_string_array[0], <font class="stringliteral">"Foo"</font>) != 0 ||
06817       strcmp (our_string_array[1], <font class="stringliteral">"bar"</font>) != 0 ||
06818       strcmp (our_string_array[2], <font class="stringliteral">""</font>) != 0 ||
06819       strcmp (our_string_array[3], <font class="stringliteral">"woo woo woo woo"</font>) != 0)
06820     _dbus_assert_not_reached (<font class="stringliteral">"string array differs"</font>);
06821 
06822   dbus_free_string_array (our_string_array);
06823 
06824   <font class="keywordflow">if</font> (our_double_array_len != 3)
06825     _dbus_assert_not_reached (<font class="stringliteral">"double array had wrong length"</font>);
06826 
06827   <font class="comment">/* On all IEEE machines (i.e. everything sane) exact equality</font>
06828 <font class="comment">   * should be preserved over the wire</font>
06829 <font class="comment">   */</font>
06830   <font class="keywordflow">if</font> (our_double_array[0] != 0.1234 ||
06831       our_double_array[1] != 9876.54321 ||
06832       our_double_array[2] != -300.0)
06833     _dbus_assert_not_reached (<font class="stringliteral">"double array had wrong values"</font>);
06834 
06835   dbus_free (our_double_array);
06836 
06837   <font class="keywordflow">if</font> (our_byte_array_len != 4)
06838     _dbus_assert_not_reached (<font class="stringliteral">"byte array had wrong length"</font>);
06839 
06840   <font class="keywordflow">if</font> (our_byte_array[0] != <font class="charliteral">'a'</font> ||
06841       our_byte_array[1] != <font class="charliteral">'b'</font> ||
06842       our_byte_array[2] != <font class="charliteral">'c'</font> ||
06843       our_byte_array[3] != 234)
06844     _dbus_assert_not_reached (<font class="stringliteral">"byte array had wrong values"</font>);
06845 
06846   dbus_free (our_byte_array);
06847 
06848   <font class="keywordflow">if</font> (our_boolean_array_len != 5)
06849     _dbus_assert_not_reached (<font class="stringliteral">"bool array had wrong length"</font>);
06850 
06851   <font class="keywordflow">if</font> (our_boolean_array[0] != TRUE ||
06852       our_boolean_array[1] != FALSE ||
06853       our_boolean_array[2] != TRUE ||
06854       our_boolean_array[3] != TRUE ||
06855       our_boolean_array[4] != FALSE)
06856     _dbus_assert_not_reached (<font class="stringliteral">"bool array had wrong values"</font>);
06857 
06858   dbus_free (our_boolean_array);
06859 
06860   <font class="keywordflow">if</font> (dbus_message_iter_get_arg_type (&amp;iter) != DBUS_TYPE_DICT)
06861     _dbus_assert_not_reached (<font class="stringliteral">"not dict type"</font>);
06862      
06863   dbus_message_iter_init_dict_iterator (&amp;iter, &amp;dict);
06864 
06865   our_str = dbus_message_iter_get_dict_key (&amp;dict);
06866   <font class="keywordflow">if</font> (our_str == NULL || strcmp (our_str, <font class="stringliteral">"test"</font>) != 0)
06867     _dbus_assert_not_reached (<font class="stringliteral">"wrong dict key"</font>);
06868   dbus_free (our_str);
06869 
06870   <font class="keywordflow">if</font> (dbus_message_iter_get_arg_type (&amp;dict) != DBUS_TYPE_UINT32)
06871     {
06872       _dbus_verbose (<font class="stringliteral">"dict entry type: %d\n"</font>, dbus_message_iter_get_arg_type (&amp;dict));
06873       _dbus_assert_not_reached (<font class="stringliteral">"wrong dict entry type"</font>);
06874     }
06875 
06876   <font class="keywordflow">if</font> ((our_uint32 = dbus_message_iter_get_uint32 (&amp;dict)) != 0xDEADBEEF)
06877     {
06878       _dbus_verbose (<font class="stringliteral">"dict entry val: %x\n"</font>, our_uint32);
06879       _dbus_assert_not_reached (<font class="stringliteral">"wrong dict entry value"</font>);
06880     }
06881 
06882   <font class="keywordflow">if</font> (dbus_message_iter_next (&amp;dict))
06883     _dbus_assert_not_reached (<font class="stringliteral">"Didn't reach end of dict"</font>);
06884   
06885   <font class="keywordflow">if</font> (!dbus_message_iter_next (&amp;iter))
06886     _dbus_assert_not_reached (<font class="stringliteral">"Reached end of arguments"</font>);
06887   
06888   <font class="keywordflow">if</font> (dbus_message_iter_get_arg_type (&amp;iter) != DBUS_TYPE_UINT32)
06889     _dbus_assert_not_reached (<font class="stringliteral">"wrong type after dict"</font>);
06890   
06891   <font class="keywordflow">if</font> (dbus_message_iter_get_uint32 (&amp;iter) != 0xCAFEBABE)
06892     _dbus_assert_not_reached (<font class="stringliteral">"wrong value after dict"</font>);
06893 
06894   <font class="keywordflow">if</font> (dbus_message_iter_next (&amp;iter))
06895     _dbus_assert_not_reached (<font class="stringliteral">"Didn't reach end of arguments"</font>);
06896 }
06897 
06904 dbus_bool_t
<a name="l06905"></a><a class="code" href="group__DBusMessageInternals.html#a52">06905</a> _dbus_message_test (<font class="keyword">const</font> <font class="keywordtype">char</font> *test_data_dir)
06906 {
06907   <a class="code" href="structDBusMessage.html">DBusMessage</a> *message;
06908   <a class="code" href="structDBusMessageLoader.html">DBusMessageLoader</a> *loader;
06909   <a class="code" href="structDBusMessageIter.html">DBusMessageIter</a> iter, child_iter, child_iter2, child_iter3;
06910   <font class="keywordtype">int</font> i;
06911   <font class="keyword">const</font> <font class="keywordtype">char</font> *data;
06912   <a class="code" href="structDBusMessage.html">DBusMessage</a> *copy;
06913   <font class="keyword">const</font> <font class="keywordtype">char</font> *name1;
06914   <font class="keyword">const</font> <font class="keywordtype">char</font> *name2;
06915   <font class="keyword">const</font> dbus_uint32_t our_uint32_array[] =
06916     { 0x12345678, 0x23456781, 0x34567812, 0x45678123 };
06917   <font class="keyword">const</font> dbus_uint32_t our_int32_array[] =
06918     { 0x12345678, -0x23456781, 0x34567812, -0x45678123 };
06919 <font class="preprocessor">#ifdef DBUS_HAVE_INT64</font>
06920 <font class="preprocessor"></font>  <font class="keyword">const</font> dbus_uint64_t our_uint64_array[] =
06921     { 0x12345678, 0x23456781, 0x34567812, 0x45678123 };
06922   <font class="keyword">const</font> dbus_uint64_t our_int64_array[] =
06923     { 0x12345678, -0x23456781, 0x34567812, -0x45678123 };
06924 <font class="preprocessor">#endif</font>
06925 <font class="preprocessor"></font>  <font class="keyword">const</font> <font class="keywordtype">char</font> *our_string_array[] = { <font class="stringliteral">"Foo"</font>, <font class="stringliteral">"bar"</font>, <font class="stringliteral">""</font>, <font class="stringliteral">"woo woo woo woo"</font> };
06926   <font class="keyword">const</font> <font class="keywordtype">double</font> our_double_array[] = { 0.1234, 9876.54321, -300.0 };
06927   <font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> our_byte_array[] = { <font class="charliteral">'a'</font>, <font class="charliteral">'b'</font>, <font class="charliteral">'c'</font>, 234 };
06928   <font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> our_boolean_array[] = { TRUE, FALSE, TRUE, TRUE, FALSE };
06929   <font class="keywordtype">char</font> sig[64];
06930   <font class="keyword">const</font> <font class="keywordtype">char</font> *s;
06931   <font class="keywordtype">char</font> *t;
06932   <a class="code" href="structDBusError.html">DBusError</a> error;
06933   
06934   _dbus_assert (<font class="keyword">sizeof</font> (DBusMessageRealIter) &lt;= <font class="keyword">sizeof</font> (<a class="code" href="structDBusMessageIter.html">DBusMessageIter</a>));
06935 
06936   message = dbus_message_new_method_call (<font class="stringliteral">"org.freedesktop.DBus.TestService"</font>,
06937                                           <font class="stringliteral">"/org/freedesktop/TestPath"</font>,
06938                                           <font class="stringliteral">"Foo.TestInterface"</font>,
06939                                           <font class="stringliteral">"TestMethod"</font>);
06940   _dbus_assert (dbus_message_has_destination (message, <font class="stringliteral">"org.freedesktop.DBus.TestService"</font>));
06941   _dbus_assert (dbus_message_is_method_call (message, <font class="stringliteral">"Foo.TestInterface"</font>,
06942                                              <font class="stringliteral">"TestMethod"</font>));
06943   _dbus_assert (strcmp (dbus_message_get_path (message),
06944                         <font class="stringliteral">"/org/freedesktop/TestPath"</font>) == 0);
06945   _dbus_message_set_serial (message, 1234);
06946   <font class="comment">/* string length including nul byte not a multiple of 4 */</font>
06947   <font class="keywordflow">if</font> (!dbus_message_set_sender (message, <font class="stringliteral">"org.foo.bar1"</font>))
06948     _dbus_assert_not_reached (<font class="stringliteral">"out of memory"</font>);
06949   _dbus_assert (dbus_message_has_sender (message, <font class="stringliteral">"org.foo.bar1"</font>));
06950   dbus_message_set_reply_serial (message, 5678);
06951   <font class="keywordflow">if</font> (!dbus_message_set_sender (message, NULL))
06952     _dbus_assert_not_reached (<font class="stringliteral">"out of memory"</font>);
06953   _dbus_assert (!dbus_message_has_sender (message, <font class="stringliteral">"org.foo.bar1"</font>));
06954   _dbus_assert (dbus_message_get_serial (message) == 1234);
06955   _dbus_assert (dbus_message_get_reply_serial (message) == 5678);
06956   _dbus_assert (dbus_message_has_destination (message, <font class="stringliteral">"org.freedesktop.DBus.TestService"</font>));
06957 
06958   _dbus_assert (dbus_message_get_no_reply (message) == FALSE);
06959   dbus_message_set_no_reply (message, TRUE);
06960   _dbus_assert (dbus_message_get_no_reply (message) == TRUE);
06961   dbus_message_set_no_reply (message, FALSE);
06962   _dbus_assert (dbus_message_get_no_reply (message) == FALSE);
06963 
06964   <font class="comment">/* Set/get some header fields */</font>
06965   
06966   <font class="keywordflow">if</font> (!dbus_message_set_path (message, <font class="stringliteral">"/foo"</font>))
06967     _dbus_assert_not_reached (<font class="stringliteral">"out of memory"</font>);
06968   _dbus_assert (strcmp (dbus_message_get_path (message),
06969                         <font class="stringliteral">"/foo"</font>) == 0);
06970 
06971   <font class="keywordflow">if</font> (!dbus_message_set_interface (message, <font class="stringliteral">"org.Foo"</font>))
06972     _dbus_assert_not_reached (<font class="stringliteral">"out of memory"</font>);
06973   _dbus_assert (strcmp (dbus_message_get_interface (message),
06974                         <font class="stringliteral">"org.Foo"</font>) == 0);
06975   
06976   <font class="keywordflow">if</font> (!dbus_message_set_member (message, <font class="stringliteral">"Bar"</font>))
06977     _dbus_assert_not_reached (<font class="stringliteral">"out of memory"</font>);
06978   _dbus_assert (strcmp (dbus_message_get_member (message),
06979                         <font class="stringliteral">"Bar"</font>) == 0);
06980 
06981   <font class="comment">/* Set/get them with longer values */</font>
06982   <font class="keywordflow">if</font> (!dbus_message_set_path (message, <font class="stringliteral">"/foo/bar"</font>))
06983     _dbus_assert_not_reached (<font class="stringliteral">"out of memory"</font>);
06984   _dbus_assert (strcmp (dbus_message_get_path (message),
06985                         <font class="stringliteral">"/foo/bar"</font>) == 0);
06986 
06987   <font class="keywordflow">if</font> (!dbus_message_set_interface (message, <font class="stringliteral">"org.Foo.Bar"</font>))
06988     _dbus_assert_not_reached (<font class="stringliteral">"out of memory"</font>);
06989   _dbus_assert (strcmp (dbus_message_get_interface (message),
06990                         <font class="stringliteral">"org.Foo.Bar"</font>) == 0);
06991   
06992   <font class="keywordflow">if</font> (!dbus_message_set_member (message, <font class="stringliteral">"BarFoo"</font>))
06993     _dbus_assert_not_reached (<font class="stringliteral">"out of memory"</font>);
06994   _dbus_assert (strcmp (dbus_message_get_member (message),
06995                         <font class="stringliteral">"BarFoo"</font>) == 0);
06996 
06997   <font class="comment">/* Realloc shorter again */</font>
06998   
06999   <font class="keywordflow">if</font> (!dbus_message_set_path (message, <font class="stringliteral">"/foo"</font>))
07000     _dbus_assert_not_reached (<font class="stringliteral">"out of memory"</font>);
07001   _dbus_assert (strcmp (dbus_message_get_path (message),
07002                         <font class="stringliteral">"/foo"</font>) == 0);
07003 
07004   <font class="keywordflow">if</font> (!dbus_message_set_interface (message, <font class="stringliteral">"org.Foo"</font>))
07005     _dbus_assert_not_reached (<font class="stringliteral">"out of memory"</font>);
07006   _dbus_assert (strcmp (dbus_message_get_interface (message),
07007                         <font class="stringliteral">"org.Foo"</font>) == 0);
07008   
07009   <font class="keywordflow">if</font> (!dbus_message_set_member (message, <font class="stringliteral">"Bar"</font>))
07010     _dbus_assert_not_reached (<font class="stringliteral">"out of memory"</font>);
07011   _dbus_assert (strcmp (dbus_message_get_member (message),
07012                         <font class="stringliteral">"Bar"</font>) == 0);
07013   
07014   dbus_message_unref (message);
07015   
07016   <font class="comment">/* Test the vararg functions */</font>
07017   message = dbus_message_new_method_call (<font class="stringliteral">"org.freedesktop.DBus.TestService"</font>,
07018                                           <font class="stringliteral">"/org/freedesktop/TestPath"</font>,
07019                                           <font class="stringliteral">"Foo.TestInterface"</font>,
07020                                           <font class="stringliteral">"TestMethod"</font>);
07021   _dbus_message_set_serial (message, 1);
07022   dbus_message_append_args (message,
07023                             DBUS_TYPE_INT32, -0x12345678,
07024 #ifdef DBUS_HAVE_INT64
07025                             DBUS_TYPE_INT64, DBUS_INT64_CONSTANT (-0x123456789abcd),
07026                             DBUS_TYPE_UINT64, DBUS_UINT64_CONSTANT (0x123456789abcd),
07027 #endif
07028                             DBUS_TYPE_STRING, <font class="stringliteral">"Test string"</font>,
07029                             DBUS_TYPE_DOUBLE, 3.14159,
07030                             DBUS_TYPE_BOOLEAN, TRUE,
07031                             DBUS_TYPE_ARRAY, DBUS_TYPE_UINT32, our_uint32_array,
07032                             _DBUS_N_ELEMENTS (our_uint32_array),
07033                             DBUS_TYPE_ARRAY, DBUS_TYPE_INT32, our_int32_array,
07034                             _DBUS_N_ELEMENTS (our_int32_array),
07035 #ifdef DBUS_HAVE_INT64
07036                             DBUS_TYPE_ARRAY, DBUS_TYPE_UINT64, our_uint64_array,
07037                             _DBUS_N_ELEMENTS (our_uint64_array),
07038                             DBUS_TYPE_ARRAY, DBUS_TYPE_INT64, our_int64_array,
07039                             _DBUS_N_ELEMENTS (our_int64_array),
07040 #endif
07041                             DBUS_TYPE_ARRAY, DBUS_TYPE_STRING, our_string_array,
07042                             _DBUS_N_ELEMENTS (our_string_array),
07043                             DBUS_TYPE_ARRAY, DBUS_TYPE_DOUBLE, our_double_array,
07044                             _DBUS_N_ELEMENTS (our_double_array),
07045                             DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, our_byte_array,
07046                             _DBUS_N_ELEMENTS (our_byte_array),
07047                             DBUS_TYPE_ARRAY, DBUS_TYPE_BOOLEAN, our_boolean_array,
07048                             _DBUS_N_ELEMENTS (our_boolean_array),
07049                             0);
07050   
07051   dbus_message_append_iter_init (message, &amp;iter);
07052   dbus_message_iter_append_dict (&amp;iter, &amp;child_iter);
07053   dbus_message_iter_append_dict_key (&amp;child_iter, <font class="stringliteral">"test"</font>);
07054   dbus_message_iter_append_uint32 (&amp;child_iter, 0xDEADBEEF);
07055   dbus_message_iter_append_uint32 (&amp;iter, 0xCAFEBABE);
07056 
07057   i = 0;
07058   sig[i++] = DBUS_TYPE_INT32;
07059 <font class="preprocessor">#ifdef DBUS_HAVE_INT64</font>
07060 <font class="preprocessor"></font>  sig[i++] = DBUS_TYPE_INT64;
07061   sig[i++] = DBUS_TYPE_UINT64;
07062 <font class="preprocessor">#endif</font>
07063 <font class="preprocessor"></font>  sig[i++] = DBUS_TYPE_STRING;
07064   sig[i++] = DBUS_TYPE_DOUBLE;
07065   sig[i++] = DBUS_TYPE_BOOLEAN;
07066   sig[i++] = DBUS_TYPE_ARRAY;
07067   sig[i++] = DBUS_TYPE_UINT32;
07068   sig[i++] = DBUS_TYPE_ARRAY;
07069   sig[i++] = DBUS_TYPE_INT32;
07070 <font class="preprocessor">#ifdef DBUS_HAVE_INT64</font>
07071 <font class="preprocessor"></font>  sig[i++] = DBUS_TYPE_ARRAY;
07072   sig[i++] = DBUS_TYPE_UINT64;
07073   sig[i++] = DBUS_TYPE_ARRAY;
07074   sig[i++] = DBUS_TYPE_INT64;
07075 <font class="preprocessor">#endif</font>
07076 <font class="preprocessor"></font>  sig[i++] = DBUS_TYPE_ARRAY;
07077   sig[i++] = DBUS_TYPE_STRING;
07078   sig[i++] = DBUS_TYPE_ARRAY;
07079   sig[i++] = DBUS_TYPE_DOUBLE;
07080   sig[i++] = DBUS_TYPE_ARRAY;
07081   sig[i++] = DBUS_TYPE_BYTE;
07082   sig[i++] = DBUS_TYPE_ARRAY;
07083   sig[i++] = DBUS_TYPE_BOOLEAN;
07084   sig[i++] = DBUS_TYPE_DICT;
07085   sig[i++] = DBUS_TYPE_UINT32;
07086   sig[i++] = DBUS_TYPE_INVALID;
07087 
07088   _dbus_assert (i &lt; (<font class="keywordtype">int</font>) _DBUS_N_ELEMENTS (sig));
07089   
07090   _dbus_verbose_bytes_of_string (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>, 0,
07091                                  _dbus_string_get_length (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>));
07092   _dbus_verbose_bytes_of_string (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>, 0,
07093                                  _dbus_string_get_length (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>));
07094   
07095   _dbus_verbose (<font class="stringliteral">"Signature expected \"%s\" actual \"%s\"\n"</font>,
07096                  sig, dbus_message_get_signature (message));
07097   
07098   s = dbus_message_get_signature (message);
07099   
07100   _dbus_assert (dbus_message_has_signature (message, sig));
07101   _dbus_assert (strcmp (s, sig) == 0);
07102   
07103   verify_test_message (message);
07104 
07105   copy = dbus_message_copy (message);
07106   
07107   _dbus_assert (message-&gt;<a class="code" href="structDBusMessage.html#m3">client_serial</a> == copy-&gt;<a class="code" href="structDBusMessage.html#m3">client_serial</a>);
07108   _dbus_assert (message-&gt;<a class="code" href="structDBusMessage.html#m4">reply_serial</a> == copy-&gt;<a class="code" href="structDBusMessage.html#m4">reply_serial</a>);
07109   _dbus_assert (message-&gt;<a class="code" href="structDBusMessage.html#m5">header_padding</a> == copy-&gt;<a class="code" href="structDBusMessage.html#m5">header_padding</a>);
07110   
07111   _dbus_assert (_dbus_string_get_length (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>) ==
07112                 _dbus_string_get_length (&amp;copy-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>));
07113 
07114   _dbus_assert (_dbus_string_get_length (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>) ==
07115                 _dbus_string_get_length (&amp;copy-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>));
07116   
07117   verify_test_message (copy);
07118 
07119   name1 = dbus_message_get_interface (message);
07120   name2 = dbus_message_get_interface (copy);
07121 
07122   _dbus_assert (strcmp (name1, name2) == 0);
07123 
07124   name1 = dbus_message_get_member (message);
07125   name2 = dbus_message_get_member (copy);
07126 
07127   _dbus_assert (strcmp (name1, name2) == 0);
07128   
07129   dbus_message_unref (message);  
07130   dbus_message_unref (copy);
07131 
07132   message = dbus_message_new_method_call (<font class="stringliteral">"org.freedesktop.DBus.TestService"</font>,
07133                                           <font class="stringliteral">"/org/freedesktop/TestPath"</font>,
07134                                           <font class="stringliteral">"Foo.TestInterface"</font>,
07135                                           <font class="stringliteral">"TestMethod"</font>);
07136 
07137   _dbus_message_set_serial (message, 1);
07138   dbus_message_set_reply_serial (message, 0x12345678);
07139 
07140   dbus_message_append_iter_init (message, &amp;iter);
07141   dbus_message_iter_append_string (&amp;iter, <font class="stringliteral">"Test string"</font>);
07142   dbus_message_iter_append_int32 (&amp;iter, -0x12345678);
07143   dbus_message_iter_append_uint32 (&amp;iter, 0xedd1e);
07144   dbus_message_iter_append_double (&amp;iter, 3.14159);
07145 
07146   dbus_message_iter_append_array (&amp;iter, &amp;child_iter, DBUS_TYPE_DOUBLE);
07147   dbus_message_iter_append_double (&amp;child_iter, 1.5);
07148   dbus_message_iter_append_double (&amp;child_iter, 2.5);
07149 
07150   <font class="comment">/* dict */</font>
07151   dbus_message_iter_append_dict (&amp;iter, &amp;child_iter);
07152   dbus_message_iter_append_dict_key (&amp;child_iter, <font class="stringliteral">"test"</font>);
07153   dbus_message_iter_append_uint32 (&amp;child_iter, 0xDEADBEEF);
07154 
07155   <font class="comment">/* dict (in dict) */</font>
07156   dbus_message_iter_append_dict_key (&amp;child_iter, <font class="stringliteral">"testdict"</font>);
07157   dbus_message_iter_append_dict (&amp;child_iter, &amp;child_iter2);
07158 
07159   dbus_message_iter_append_dict_key (&amp;child_iter2, <font class="stringliteral">"dictkey"</font>);
07160   dbus_message_iter_append_string (&amp;child_iter2, <font class="stringliteral">"dictvalue"</font>);
07161 
07162   <font class="comment">/* array of array of int32  (in dict) */</font>
07163   dbus_message_iter_append_dict_key (&amp;child_iter, <font class="stringliteral">"array"</font>);
07164   dbus_message_iter_append_array (&amp;child_iter, &amp;child_iter2, DBUS_TYPE_ARRAY);
07165   dbus_message_iter_append_array (&amp;child_iter2, &amp;child_iter3, DBUS_TYPE_INT32);
07166   dbus_message_iter_append_int32 (&amp;child_iter3, 0x12345678);
07167   dbus_message_iter_append_int32 (&amp;child_iter3, 0x23456781);
07168   _dbus_warn (<font class="stringliteral">"next call expected to fail with wrong array type\n"</font>);
07169   _dbus_assert (!dbus_message_iter_append_array (&amp;child_iter2, &amp;child_iter3, DBUS_TYPE_UINT32));
07170   dbus_message_iter_append_array (&amp;child_iter2, &amp;child_iter3, DBUS_TYPE_INT32);
07171   dbus_message_iter_append_int32 (&amp;child_iter3, 0x34567812);
07172   dbus_message_iter_append_int32 (&amp;child_iter3, 0x45678123);
07173   dbus_message_iter_append_int32 (&amp;child_iter3, 0x56781234);
07174   
07175   dbus_message_iter_append_byte (&amp;iter, 0xF0);
07176 
07177   dbus_message_iter_append_nil (&amp;iter);
07178 
07179   dbus_message_iter_append_custom (&amp;iter, <font class="stringliteral">"MyTypeName"</font>,
07180                                    <font class="stringliteral">"data"</font>, 5);
07181   
07182   dbus_message_iter_append_byte (&amp;iter, 0xF0);
07183 
07184   dbus_message_iter_append_array (&amp;iter, &amp;child_iter, DBUS_TYPE_INT32);
07185 
07186   dbus_message_iter_append_byte (&amp;iter, 0xF0);
07187 
07188   dbus_message_iter_append_dict (&amp;iter, &amp;child_iter);
07189 
07190   dbus_message_iter_append_byte (&amp;iter, 0xF0);
07191 
07192   message_iter_test (message);
07193   
07194   <font class="comment">/* Message loader test */</font>
07195   _dbus_message_lock (message);
07196   loader = _dbus_message_loader_new ();
07197 
07198   <font class="comment">/* check ref/unref */</font>
07199   _dbus_message_loader_ref (loader);
07200   _dbus_message_loader_unref (loader);
07201   
07202   <font class="comment">/* Write the header data one byte at a time */</font>
07203   data = _dbus_string_get_const_data (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>);
07204   <font class="keywordflow">for</font> (i = 0; i &lt; _dbus_string_get_length (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m1">header</a>); i++)
07205     {
07206       <a class="code" href="structDBusString.html">DBusString</a> *buffer;
07207 
07208       _dbus_message_loader_get_buffer (loader, &amp;buffer);
07209       _dbus_string_append_byte (buffer, data[i]);
07210       _dbus_message_loader_return_buffer (loader, buffer, 1);
07211     }
07212 
07213   <font class="comment">/* Write the body data one byte at a time */</font>
07214   data = _dbus_string_get_const_data (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>);
07215   <font class="keywordflow">for</font> (i = 0; i &lt; _dbus_string_get_length (&amp;message-&gt;<a class="code" href="structDBusMessage.html#m6">body</a>); i++)
07216     {
07217       <a class="code" href="structDBusString.html">DBusString</a> *buffer;
07218 
07219       _dbus_message_loader_get_buffer (loader, &amp;buffer);
07220       _dbus_string_append_byte (buffer, data[i]);
07221       _dbus_message_loader_return_buffer (loader, buffer, 1);
07222     }
07223 
07224   copy = dbus_message_copy (message); <font class="comment">/* save for tests below */</font>
07225   dbus_message_unref (message);
07226 
07227   <font class="comment">/* Now pop back the message */</font>
07228   <font class="keywordflow">if</font> (!_dbus_message_loader_queue_messages (loader))
07229     _dbus_assert_not_reached (<font class="stringliteral">"no memory to queue messages"</font>);
07230   
07231   <font class="keywordflow">if</font> (_dbus_message_loader_get_is_corrupted (loader))
07232     _dbus_assert_not_reached (<font class="stringliteral">"message loader corrupted"</font>);
07233   
07234   message = _dbus_message_loader_pop_message (loader);
07235   <font class="keywordflow">if</font> (!message)
07236     _dbus_assert_not_reached (<font class="stringliteral">"received a NULL message"</font>);
07237 
07238   <font class="keywordflow">if</font> (dbus_message_get_reply_serial (message) != 0x12345678)
07239     _dbus_assert_not_reached (<font class="stringliteral">"reply serial fields differ"</font>);
07240   
07241   message_iter_test (message);
07242   
07243   dbus_message_unref (message);
07244   _dbus_message_loader_unref (loader);
07245 
07246   message = dbus_message_new_method_return (copy);
07247   <font class="keywordflow">if</font> (message == NULL)
07248     _dbus_assert_not_reached (<font class="stringliteral">"out of memory\n"</font>);
07249   dbus_message_unref (copy);
07250 
07251   <font class="keywordflow">if</font> (!dbus_message_append_args (message,
07252                                  DBUS_TYPE_STRING, <font class="stringliteral">"hello"</font>,
07253                                  DBUS_TYPE_INVALID))
07254     _dbus_assert_not_reached (<font class="stringliteral">"no memory"</font>);
07255 
07256   <font class="keywordflow">if</font> (!dbus_message_has_signature (message, <font class="stringliteral">"s"</font>))
07257     _dbus_assert_not_reached (<font class="stringliteral">"method return has wrong signature"</font>);
07258 
07259   dbus_error_init (&amp;error);
07260   <font class="keywordflow">if</font> (!dbus_message_get_args (message, &amp;error, DBUS_TYPE_STRING,
07261                               &amp;t, DBUS_TYPE_INVALID))
07262     
07263     {
07264       _dbus_warn (<font class="stringliteral">"Failed to get expected string arg: %s\n"</font>, error.<a class="code" href="structDBusError.html#m1">message</a>);
07265       exit (1);
07266     }
07267   dbus_free (t);
07268   
07269   dbus_message_unref (message);
07270   
07271   <font class="comment">/* Now load every message in test_data_dir if we have one */</font>
07272   <font class="keywordflow">if</font> (test_data_dir == NULL)
07273     <font class="keywordflow">return</font> TRUE;
07274 
07275   <font class="keywordflow">return</font> dbus_internal_do_not_use_foreach_message_file (test_data_dir,
07276                                                         (DBusForeachMessageFileFunc)
07277                                                         dbus_internal_do_not_use_try_message_file,
07278                                                         NULL);
07279 }
07280 
07281 <font class="preprocessor">#endif </font><font class="comment">/* DBUS_BUILD_TESTS */</font>
</pre></div><hr><address align="right"><small>Generated on Wed Jun 9 05:01:26 2004 for D-BUS by
<a href="http://www.doxygen.org/index.html">
<img src="doxygen.png" alt="doxygen" align="middle" border=0 
width=110 height=53></a>1.2.15 </small></address>
</body>
</html>